Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <vcl/builder.hxx>
21 : #include <vcl/msgbox.hxx>
22 : #include <vcl/field.hxx>
23 : #include <vcl/keycodes.hxx>
24 : #include <sot/exchange.hxx>
25 : #include <svtools/transfer.hxx>
26 : #include <unotools/syslocale.hxx>
27 : #include <sfx2/objsh.hxx>
28 : #include <sfx2/viewsh.hxx>
29 : #include <unotools/charclass.hxx>
30 : #include <unotools/collatorwrapper.hxx>
31 : #include <com/sun/star/i18n/CollatorOptions.hpp>
32 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
33 : #include <comphelper/processfactory.hxx>
34 : #include <comphelper/string.hxx>
35 : #include <vcl/svapp.hxx>
36 : #include <sfx2/module.hxx>
37 : #include <sfx2/request.hxx>
38 : #include <sfx2/sfxsids.hrc>
39 : #include <svl/eitem.hxx>
40 : #include <svl/languageoptions.hxx>
41 : #include <svx/SmartTagMgr.hxx>
42 : #include <com/sun/star/smarttags/XSmartTagRecognizer.hpp>
43 : #include <com/sun/star/smarttags/XSmartTagAction.hpp>
44 : #include <rtl/strbuf.hxx>
45 :
46 : #include "autocdlg.hxx"
47 : #include "autocdlg.hrc"
48 : #include "helpid.hrc"
49 : #include <editeng/acorrcfg.hxx>
50 : #include <editeng/svxacorr.hxx>
51 : #include "cuicharmap.hxx"
52 : #include <editeng/unolingu.hxx>
53 : #include <dialmgr.hxx>
54 : #include <svx/svxids.hrc> // SID_OPEN_SMARTTAGSOPTIONS
55 :
56 : static LanguageType eLastDialogLanguage = LANGUAGE_SYSTEM;
57 :
58 : using namespace ::com::sun::star::util;
59 : using namespace ::com::sun::star;
60 : using namespace ::rtl;
61 :
62 0 : OfaAutoCorrDlg::OfaAutoCorrDlg(Window* pParent, const SfxItemSet* _pSet )
63 0 : : SfxTabDialog(pParent, "AutoCorrectDialog", "cui/ui/autocorrectdialog.ui", _pSet)
64 : {
65 0 : get(m_pLanguageBox, "langbox");
66 0 : get(m_pLanguageLB, "lang");
67 :
68 0 : sal_Bool bShowSWOptions = sal_False;
69 0 : sal_Bool bOpenSmartTagOptions = sal_False;
70 :
71 0 : if ( _pSet )
72 : {
73 0 : SFX_ITEMSET_ARG( _pSet, pItem, SfxBoolItem, SID_AUTO_CORRECT_DLG, sal_False );
74 0 : if ( pItem && pItem->GetValue() )
75 0 : bShowSWOptions = sal_True;
76 :
77 0 : SFX_ITEMSET_ARG( _pSet, pItem2, SfxBoolItem, SID_OPEN_SMARTTAGOPTIONS, sal_False );
78 0 : if ( pItem2 && pItem2->GetValue() )
79 0 : bOpenSmartTagOptions = sal_True;
80 : }
81 :
82 0 : AddTabPage("options", OfaAutocorrOptionsPage::Create, 0);
83 0 : AddTabPage("apply", OfaSwAutoFmtOptionsPage::Create, 0);
84 0 : AddTabPage("wordcompletion", OfaAutoCompleteTabPage::Create, 0);
85 0 : AddTabPage("smarttags", OfaSmartTagOptionsTabPage::Create, 0);
86 :
87 0 : if (!bShowSWOptions)
88 : {
89 0 : RemoveTabPage("apply");
90 0 : RemoveTabPage("wordcompletion");
91 0 : RemoveTabPage("smarttags");
92 : }
93 : else
94 : {
95 : // remove smart tag tab page if no extensions are installed
96 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
97 0 : SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
98 0 : if ( !pOpt || !pOpt->pSmartTagMgr || 0 == pOpt->pSmartTagMgr->NumberOfRecognizers() )
99 0 : RemoveTabPage("smarttags");
100 :
101 0 : RemoveTabPage("options");
102 : }
103 :
104 0 : m_nReplacePageId = AddTabPage("replace", OfaAutocorrReplacePage::Create, 0);
105 0 : m_nExceptionsPageId = AddTabPage("exceptions", OfaAutocorrExceptPage::Create, 0);
106 0 : AddTabPage("localized", OfaQuoteTabPage::Create, 0);
107 :
108 : // initialize languages
109 : //! LANGUAGE_NONE is displayed as '[All]' and the LanguageType
110 : //! will be set to LANGUAGE_UNDETERMINED
111 0 : sal_Int16 nLangList = LANG_LIST_WESTERN;
112 :
113 0 : if( SvtLanguageOptions().IsCTLFontEnabled() )
114 0 : nLangList |= LANG_LIST_CTL;
115 0 : m_pLanguageLB->SetLanguageList( nLangList, sal_True, sal_True );
116 0 : m_pLanguageLB->SelectLanguage( LANGUAGE_NONE );
117 0 : sal_uInt16 nPos = m_pLanguageLB->GetSelectEntryPos();
118 : DBG_ASSERT( LISTBOX_ENTRY_NOTFOUND != nPos, "listbox entry missing" );
119 0 : m_pLanguageLB->SetEntryData( nPos, (void*)(long) LANGUAGE_UNDETERMINED );
120 :
121 : // Initializing doesn't work for static on linux - therefore here
122 0 : if( LANGUAGE_SYSTEM == eLastDialogLanguage )
123 0 : eLastDialogLanguage = Application::GetSettings().GetLanguageTag().getLanguageType();
124 :
125 0 : LanguageType nSelectLang = LANGUAGE_UNDETERMINED;
126 0 : nPos = m_pLanguageLB->GetEntryPos( (void*)(sal_IntPtr) eLastDialogLanguage );
127 0 : if (LISTBOX_ENTRY_NOTFOUND != nPos)
128 0 : nSelectLang = eLastDialogLanguage;
129 0 : m_pLanguageLB->SelectLanguage( nSelectLang );
130 :
131 0 : m_pLanguageLB->SetSelectHdl(LINK(this, OfaAutoCorrDlg, SelectLanguageHdl));
132 :
133 0 : if ( bOpenSmartTagOptions )
134 0 : SetCurPageId("smarttags");
135 0 : }
136 :
137 0 : void OfaAutoCorrDlg::EnableLanguage(bool bEnable)
138 : {
139 0 : m_pLanguageBox->Enable(bEnable);
140 0 : }
141 :
142 0 : static sal_Bool lcl_FindEntry( ListBox& rLB, const String& rEntry,
143 : CollatorWrapper& rCmpClass )
144 : {
145 0 : sal_uInt16 nCount = rLB.GetEntryCount();
146 0 : sal_uInt16 nSelPos = rLB.GetSelectEntryPos();
147 : sal_uInt16 i;
148 0 : for(i = 0; i < nCount; i++)
149 : {
150 0 : if( 0 == rCmpClass.compareString(rEntry, rLB.GetEntry(i) ))
151 : {
152 0 : rLB.SelectEntryPos(i, sal_True);
153 0 : return sal_True;
154 : }
155 : }
156 0 : if(LISTBOX_ENTRY_NOTFOUND != nSelPos)
157 0 : rLB.SelectEntryPos(nSelPos, sal_False);
158 0 : return sal_False;
159 : }
160 :
161 0 : IMPL_LINK(OfaAutoCorrDlg, SelectLanguageHdl, ListBox*, pBox)
162 : {
163 0 : sal_uInt16 nPos = pBox->GetSelectEntryPos();
164 0 : void* pVoid = pBox->GetEntryData(nPos);
165 0 : LanguageType eNewLang = (LanguageType)(sal_IntPtr)pVoid;
166 : // save old settings and fill anew
167 0 : if(eNewLang != eLastDialogLanguage)
168 : {
169 0 : sal_uInt16 nPageId = GetCurPageId();
170 0 : if (m_nReplacePageId == nPageId)
171 0 : ((OfaAutocorrReplacePage*)GetTabPage( nPageId ))->SetLanguage(eNewLang);
172 0 : else if (m_nExceptionsPageId == nPageId)
173 0 : ((OfaAutocorrExceptPage*)GetTabPage( nPageId ))->SetLanguage(eNewLang);
174 : }
175 0 : return 0;
176 : }
177 :
178 0 : OfaAutocorrOptionsPage::OfaAutocorrOptionsPage( Window* pParent,
179 : const SfxItemSet& rSet ) :
180 0 : SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCORR_OPTIONS ), rSet),
181 0 : aCheckLB (this, CUI_RES(CLB_SETTINGS )),
182 :
183 0 : sInput (CUI_RES(ST_USE_REPLACE )),
184 0 : sDoubleCaps (CUI_RES(ST_CPTL_STT_WORD )),
185 0 : sStartCap (CUI_RES(ST_CPTL_STT_SENT )),
186 0 : sBoldUnderline (CUI_RES(ST_BOLD_UNDER )),
187 0 : sURL (CUI_RES(ST_DETECT_URL )),
188 0 : sNoDblSpaces (CUI_RES(STR_NO_DBL_SPACES )),
189 0 : sDash (CUI_RES(ST_DASH )),
190 0 : sAccidentalCaps (CUI_RES(ST_CORRECT_ACCIDENTAL_CAPS_LOCK))
191 : {
192 0 : FreeResource();
193 :
194 0 : aCheckLB.SetHelpId(HID_OFAPAGE_AUTOCORR_CLB);
195 0 : }
196 :
197 0 : OfaAutocorrOptionsPage::~OfaAutocorrOptionsPage()
198 : {
199 0 : }
200 :
201 0 : SfxTabPage* OfaAutocorrOptionsPage::Create( Window* pParent,
202 : const SfxItemSet& rSet)
203 : {
204 0 : return new OfaAutocorrOptionsPage(pParent, rSet);
205 : }
206 :
207 0 : sal_Bool OfaAutocorrOptionsPage::FillItemSet( SfxItemSet& )
208 : {
209 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
210 0 : long nFlags = pAutoCorrect->GetFlags();
211 :
212 0 : sal_uInt16 nPos = 0;
213 0 : pAutoCorrect->SetAutoCorrFlag(Autocorrect, aCheckLB.IsChecked(nPos++));
214 0 : pAutoCorrect->SetAutoCorrFlag(CptlSttWrd, aCheckLB.IsChecked(nPos++));
215 0 : pAutoCorrect->SetAutoCorrFlag(CptlSttSntnc, aCheckLB.IsChecked(nPos++));
216 0 : pAutoCorrect->SetAutoCorrFlag(ChgWeightUnderl, aCheckLB.IsChecked(nPos++));
217 0 : pAutoCorrect->SetAutoCorrFlag(SetINetAttr, aCheckLB.IsChecked(nPos++));
218 0 : pAutoCorrect->SetAutoCorrFlag(ChgToEnEmDash, aCheckLB.IsChecked(nPos++));
219 0 : pAutoCorrect->SetAutoCorrFlag(IgnoreDoubleSpace, aCheckLB.IsChecked(nPos++));
220 0 : pAutoCorrect->SetAutoCorrFlag(CorrectCapsLock, aCheckLB.IsChecked(nPos++));
221 :
222 0 : sal_Bool bReturn = nFlags != pAutoCorrect->GetFlags();
223 0 : if(bReturn )
224 : {
225 0 : SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
226 0 : rCfg.SetModified();
227 0 : rCfg.Commit();
228 : }
229 0 : return bReturn;
230 : }
231 :
232 0 : void OfaAutocorrOptionsPage::ActivatePage( const SfxItemSet& )
233 : {
234 0 : ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_False);
235 0 : }
236 :
237 0 : void OfaAutocorrOptionsPage::Reset( const SfxItemSet& )
238 : {
239 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
240 0 : const long nFlags = pAutoCorrect->GetFlags();
241 :
242 0 : aCheckLB.SetUpdateMode(sal_False);
243 0 : aCheckLB.Clear();
244 :
245 0 : aCheckLB.InsertEntry(sInput);
246 0 : aCheckLB.InsertEntry(sDoubleCaps);
247 0 : aCheckLB.InsertEntry(sStartCap);
248 0 : aCheckLB.InsertEntry(sBoldUnderline);
249 0 : aCheckLB.InsertEntry(sURL);
250 0 : aCheckLB.InsertEntry(sDash);
251 0 : aCheckLB.InsertEntry(sNoDblSpaces);
252 0 : aCheckLB.InsertEntry(sAccidentalCaps);
253 :
254 0 : sal_uInt16 nPos = 0;
255 0 : aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & Autocorrect) );
256 0 : aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & CptlSttWrd) );
257 0 : aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & CptlSttSntnc) );
258 0 : aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & ChgWeightUnderl) );
259 0 : aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & SetINetAttr) );
260 0 : aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & ChgToEnEmDash) );
261 0 : aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & IgnoreDoubleSpace) );
262 0 : aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & CorrectCapsLock) );
263 :
264 0 : aCheckLB.SetUpdateMode(sal_True);
265 0 : }
266 :
267 : /*********************************************************************/
268 : /* */
269 : /* helping struct for dUserData of the Checklistbox */
270 : /* */
271 : /*********************************************************************/
272 :
273 : struct ImpUserData
274 : {
275 : String *pString;
276 : Font* pFont;
277 :
278 0 : ImpUserData(String* pText, Font* pFnt)
279 0 : { pString = pText; pFont = pFnt;}
280 : };
281 :
282 :
283 : /*********************************************************************/
284 : /* */
285 : /* dialog for per cent settings */
286 : /* */
287 : /*********************************************************************/
288 :
289 0 : class OfaAutoFmtPrcntSet : public ModalDialog
290 : {
291 : OKButton aOKPB;
292 : CancelButton aCancelPB;
293 : FixedLine aPrcntFL;
294 : MetricField aPrcntMF;
295 :
296 : public:
297 0 : OfaAutoFmtPrcntSet(Window* pParent) :
298 0 : ModalDialog(pParent, CUI_RES(RID_OFADLG_PRCNT_SET)),
299 0 : aOKPB(this, CUI_RES(BT_OK)),
300 0 : aCancelPB(this, CUI_RES(BT_CANCEL)),
301 0 : aPrcntFL(this, CUI_RES(FL_PRCNT)),
302 0 : aPrcntMF(this, CUI_RES(ED_RIGHT_MARGIN))
303 : {
304 0 : FreeResource();
305 0 : }
306 0 : MetricField& GetPrcntFld(){return aPrcntMF;}
307 : };
308 :
309 :
310 : /*********************************************************************/
311 : /* */
312 : /* changed LBoxString */
313 : /* */
314 : /*********************************************************************/
315 :
316 0 : class OfaImpBrwString : public SvLBoxString
317 : {
318 : public:
319 :
320 0 : OfaImpBrwString( SvTreeListEntry* pEntry, sal_uInt16 nFlags,
321 0 : const String& rStr ) : SvLBoxString(pEntry,nFlags,rStr){}
322 :
323 : virtual void Paint(
324 : const Point& rPos, SvTreeListBox& rDev, const SvViewDataEntry* pView,
325 : const SvTreeListEntry* pEntry);
326 : };
327 :
328 0 : void OfaImpBrwString::Paint(
329 : const Point& rPos, SvTreeListBox& rDev, const SvViewDataEntry* /*pView*/,
330 : const SvTreeListEntry* pEntry)
331 : {
332 0 : rDev.DrawText( rPos, GetText() );
333 0 : if(pEntry->GetUserData())
334 : {
335 0 : ImpUserData* pUserData = (ImpUserData* )pEntry->GetUserData();
336 0 : Point aNewPos(rPos);
337 0 : aNewPos.X() += rDev.GetTextWidth(GetText());
338 0 : Font aOldFont( rDev.GetFont());
339 0 : Font aFont( aOldFont );
340 0 : if(pUserData->pFont)
341 : {
342 0 : aFont = *pUserData->pFont;
343 0 : aFont.SetColor(aOldFont.GetColor());
344 0 : aFont.SetSize(aOldFont.GetSize());
345 : }
346 0 : aFont.SetWeight( WEIGHT_BOLD );
347 :
348 0 : sal_Bool bFett = sal_True;
349 0 : sal_Int32 nPos = 0;
350 0 : do {
351 0 : String sTxt( pUserData->pString->GetToken( 0, 1, nPos ));
352 :
353 0 : if( bFett )
354 0 : rDev.SetFont( aFont );
355 :
356 0 : rDev.DrawText( aNewPos, sTxt );
357 :
358 0 : if( -1 != nPos )
359 0 : aNewPos.X() += rDev.GetTextWidth( sTxt );
360 :
361 0 : if( bFett )
362 0 : rDev.SetFont( aOldFont );
363 :
364 0 : bFett = !bFett;
365 0 : } while( -1 != nPos );
366 : }
367 0 : }
368 :
369 : /*********************************************************************/
370 : /* */
371 : /* use TabPage autoformat */
372 : /* */
373 : /*********************************************************************/
374 :
375 : #define CBCOL_FIRST 0
376 : #define CBCOL_SECOND 1
377 : #define CBCOL_BOTH 2
378 :
379 : enum OfaAutoFmtOptions
380 : {
381 : USE_REPLACE_TABLE,
382 : CORR_UPPER,
383 : BEGIN_UPPER,
384 : BOLD_UNDERLINE,
385 : DETECT_URL,
386 : REPLACE_DASHES,
387 : DEL_SPACES_AT_STT_END,
388 : DEL_SPACES_BETWEEN_LINES,
389 : IGNORE_DBLSPACE,
390 : CORRECT_CAPS_LOCK,
391 : APPLY_NUMBERING,
392 : INSERT_BORDER,
393 : CREATE_TABLE,
394 : REPLACE_STYLES,
395 : DEL_EMPTY_NODE,
396 : REPLACE_USER_COLL,
397 : REPLACE_BULLETS,
398 : MERGE_SINGLE_LINE_PARA
399 : };
400 :
401 0 : OfaSwAutoFmtOptionsPage::OfaSwAutoFmtOptionsPage( Window* pParent,
402 : const SfxItemSet& rSet ) :
403 0 : SfxTabPage(pParent, CUI_RES(RID_OFAPAGE_AUTOFMT_APPLY), rSet),
404 0 : m_aCheckLBContainer(this, CUI_RES(CLB_SETTINGS)),
405 : aCheckLB(m_aCheckLBContainer),
406 0 : aEditPB (this, CUI_RES(PB_EDIT)),
407 0 : aHeader1Expl (this, CUI_RES(FT_HEADER1_EXPLANATION)),
408 0 : aHeader2Expl (this, CUI_RES(FT_HEADER2_EXPLANATION)),
409 0 : sHeader1 (CUI_RES( STR_HEADER1 )),
410 0 : sHeader2 (CUI_RES( STR_HEADER2 )),
411 0 : sDeleteEmptyPara (CUI_RES( ST_DEL_EMPTY_PARA)),
412 0 : sUseReplaceTbl (CUI_RES( ST_USE_REPLACE )),
413 0 : sCptlSttWord (CUI_RES( ST_CPTL_STT_WORD)),
414 0 : sCptlSttSent (CUI_RES( ST_CPTL_STT_SENT)),
415 0 : sUserStyle (CUI_RES( ST_USER_STYLE )),
416 0 : sBullet (CUI_RES( ST_BULLET )),
417 0 : sBoldUnder (CUI_RES( ST_BOLD_UNDER )),
418 0 : sNoDblSpaces (CUI_RES( STR_NO_DBL_SPACES)),
419 0 : sCorrectCapsLock (CUI_RES( ST_CORRECT_ACCIDENTAL_CAPS_LOCK)),
420 0 : sDetectURL (CUI_RES( ST_DETECT_URL )),
421 0 : sDash (CUI_RES( ST_DASH )),
422 0 : sRightMargin (CUI_RES( ST_RIGHT_MARGIN )),
423 0 : sNum (CUI_RES( STR_NUM )),
424 0 : sBorder (CUI_RES( STR_BORDER )),
425 0 : sTable (CUI_RES( STR_TABLE )),
426 0 : sReplaceTemplates (CUI_RES( STR_REPLACE_TEMPLATES)),
427 0 : sDelSpaceAtSttEnd (CUI_RES( STR_DEL_SPACES_AT_STT_END)),
428 0 : sDelSpaceBetweenLines(CUI_RES(STR_DEL_SPACES_BETWEEN_LINES)),
429 :
430 : nPercent ( 50 ),
431 0 : pCheckButtonData( NULL )
432 :
433 : {
434 0 : FreeResource();
435 :
436 : // set typ. inverted commas
437 0 : SvtSysLocale aSysLcl;
438 :
439 0 : aCheckLB.SetHelpId(HID_OFAPAGE_AUTOFORMAT_CLB);
440 0 : aCheckLB.SetStyle(aCheckLB.GetStyle()|WB_HSCROLL| WB_VSCROLL);
441 :
442 0 : aCheckLB.SetSelectHdl(LINK(this, OfaSwAutoFmtOptionsPage, SelectHdl));
443 0 : aCheckLB.SetDoubleClickHdl(LINK(this, OfaSwAutoFmtOptionsPage, EditHdl));
444 :
445 : static long aStaticTabs[]=
446 : {
447 : 3, 0, 20, 40
448 : };
449 :
450 0 : aCheckLB.SvxSimpleTable::SetTabs(aStaticTabs);
451 0 : String sHeader( sHeader1 );
452 0 : sHeader += '\t';
453 0 : sHeader += sHeader2;
454 0 : sHeader += '\t';
455 : aCheckLB.InsertHeaderEntry( sHeader, HEADERBAR_APPEND,
456 0 : HIB_CENTER | HIB_VCENTER | HIB_FIXEDPOS | HIB_FIXED);
457 :
458 0 : aEditPB.SetClickHdl(LINK(this, OfaSwAutoFmtOptionsPage, EditHdl));
459 0 : }
460 :
461 0 : SvTreeListEntry* OfaSwAutoFmtOptionsPage::CreateEntry(String& rTxt, sal_uInt16 nCol)
462 : {
463 0 : SvTreeListEntry* pEntry = new SvTreeListEntry;
464 :
465 0 : if ( !pCheckButtonData )
466 : {
467 0 : pCheckButtonData = new SvLBoxButtonData( &aCheckLB );
468 0 : aCheckLB.SetCheckButtonData( pCheckButtonData );
469 : }
470 :
471 0 : pEntry->AddItem( new SvLBoxContextBmp( pEntry, 0, Image(), Image(), 0));
472 :
473 0 : String sEmpty;
474 0 : if (nCol == CBCOL_SECOND)
475 0 : pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );
476 : else
477 0 : pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );
478 :
479 0 : if (nCol == CBCOL_FIRST)
480 0 : pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );
481 : else
482 0 : pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );
483 0 : pEntry->AddItem( new OfaImpBrwString( pEntry, 0, rTxt ) );
484 :
485 0 : return pEntry;
486 : }
487 :
488 0 : OfaSwAutoFmtOptionsPage::~OfaSwAutoFmtOptionsPage()
489 : {
490 0 : delete (ImpUserData*) aCheckLB.GetUserData( REPLACE_BULLETS );
491 0 : delete (ImpUserData*) aCheckLB.GetUserData( APPLY_NUMBERING );
492 0 : delete (ImpUserData*) aCheckLB.GetUserData( MERGE_SINGLE_LINE_PARA );
493 0 : delete pCheckButtonData;
494 0 : }
495 :
496 0 : SfxTabPage* OfaSwAutoFmtOptionsPage::Create( Window* pParent,
497 : const SfxItemSet& rAttrSet)
498 : {
499 0 : return new OfaSwAutoFmtOptionsPage(pParent, rAttrSet);
500 : }
501 :
502 0 : sal_Bool OfaSwAutoFmtOptionsPage::FillItemSet( SfxItemSet& )
503 : {
504 0 : sal_Bool bModified = sal_False;
505 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
506 0 : SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
507 0 : long nFlags = pAutoCorrect->GetFlags();
508 :
509 0 : sal_Bool bCheck = aCheckLB.IsChecked(USE_REPLACE_TABLE, CBCOL_FIRST);
510 0 : bModified |= pOpt->bAutoCorrect != bCheck;
511 0 : pOpt->bAutoCorrect = bCheck;
512 : pAutoCorrect->SetAutoCorrFlag(Autocorrect,
513 0 : aCheckLB.IsChecked(USE_REPLACE_TABLE, CBCOL_SECOND));
514 :
515 0 : bCheck = aCheckLB.IsChecked(CORR_UPPER, CBCOL_FIRST);
516 0 : bModified |= pOpt->bCptlSttWrd != bCheck;
517 0 : pOpt->bCptlSttWrd = bCheck;
518 : pAutoCorrect->SetAutoCorrFlag(CptlSttWrd,
519 0 : aCheckLB.IsChecked(CORR_UPPER, CBCOL_SECOND));
520 :
521 0 : bCheck = aCheckLB.IsChecked(BEGIN_UPPER, CBCOL_FIRST);
522 0 : bModified |= pOpt->bCptlSttSntnc != bCheck;
523 0 : pOpt->bCptlSttSntnc = bCheck;
524 : pAutoCorrect->SetAutoCorrFlag(CptlSttSntnc,
525 0 : aCheckLB.IsChecked(BEGIN_UPPER, CBCOL_SECOND));
526 :
527 0 : bCheck = aCheckLB.IsChecked(BOLD_UNDERLINE, CBCOL_FIRST);
528 0 : bModified |= pOpt->bChgWeightUnderl != bCheck;
529 0 : pOpt->bChgWeightUnderl = bCheck;
530 : pAutoCorrect->SetAutoCorrFlag(ChgWeightUnderl,
531 0 : aCheckLB.IsChecked(BOLD_UNDERLINE, CBCOL_SECOND));
532 :
533 : pAutoCorrect->SetAutoCorrFlag(IgnoreDoubleSpace,
534 0 : aCheckLB.IsChecked(IGNORE_DBLSPACE, CBCOL_SECOND));
535 :
536 : pAutoCorrect->SetAutoCorrFlag(CorrectCapsLock,
537 0 : aCheckLB.IsChecked(CORRECT_CAPS_LOCK, CBCOL_SECOND));
538 :
539 0 : bCheck = aCheckLB.IsChecked(DETECT_URL, CBCOL_FIRST);
540 0 : bModified |= pOpt->bSetINetAttr != bCheck;
541 0 : pOpt->bSetINetAttr = bCheck;
542 : pAutoCorrect->SetAutoCorrFlag(SetINetAttr,
543 0 : aCheckLB.IsChecked(DETECT_URL, CBCOL_SECOND));
544 :
545 0 : bCheck = aCheckLB.IsChecked(DEL_EMPTY_NODE, CBCOL_FIRST);
546 0 : bModified |= pOpt->bDelEmptyNode != bCheck;
547 0 : pOpt->bDelEmptyNode = bCheck;
548 :
549 0 : bCheck = aCheckLB.IsChecked(REPLACE_USER_COLL, CBCOL_FIRST);
550 0 : bModified |= pOpt->bChgUserColl != bCheck;
551 0 : pOpt->bChgUserColl = bCheck;
552 :
553 0 : bCheck = aCheckLB.IsChecked(REPLACE_BULLETS, CBCOL_FIRST);
554 0 : bModified |= pOpt->bChgEnumNum != bCheck;
555 0 : pOpt->bChgEnumNum = bCheck;
556 0 : bModified |= aBulletFont != pOpt->aBulletFont;
557 0 : pOpt->aBulletFont = aBulletFont;
558 0 : bModified |= !comphelper::string::equals(sBulletChar, pOpt->cBullet);
559 0 : pOpt->cBullet = sBulletChar.GetChar(0);
560 :
561 0 : bModified |= aByInputBulletFont != pOpt->aByInputBulletFont;
562 0 : bModified |= !comphelper::string::equals(sByInputBulletChar, pOpt->cByInputBullet);
563 0 : pOpt->aByInputBulletFont = aByInputBulletFont;
564 0 : pOpt->cByInputBullet = sByInputBulletChar.GetChar(0);
565 :
566 0 : bCheck = aCheckLB.IsChecked(MERGE_SINGLE_LINE_PARA, CBCOL_FIRST);
567 0 : bModified |= pOpt->bRightMargin != bCheck;
568 0 : pOpt->bRightMargin = bCheck;
569 0 : bModified |= nPercent != pOpt->nRightMargin;
570 0 : pOpt->nRightMargin = (sal_uInt8)nPercent;
571 :
572 0 : bCheck = aCheckLB.IsChecked(APPLY_NUMBERING, CBCOL_SECOND);
573 0 : bModified |= pOpt->bSetNumRule != bCheck;
574 0 : pOpt->bSetNumRule = bCheck;
575 :
576 0 : bCheck = aCheckLB.IsChecked(INSERT_BORDER, CBCOL_SECOND);
577 0 : bModified |= pOpt->bSetBorder != bCheck;
578 0 : pOpt->bSetBorder = bCheck;
579 :
580 0 : bCheck = aCheckLB.IsChecked(CREATE_TABLE, CBCOL_SECOND);
581 0 : bModified |= pOpt->bCreateTable != bCheck;
582 0 : pOpt->bCreateTable = bCheck;
583 :
584 0 : bCheck = aCheckLB.IsChecked(REPLACE_STYLES, CBCOL_SECOND);
585 0 : bModified |= pOpt->bReplaceStyles != bCheck;
586 0 : pOpt->bReplaceStyles = bCheck;
587 :
588 0 : bCheck = aCheckLB.IsChecked(REPLACE_DASHES, CBCOL_FIRST);
589 0 : bModified |= pOpt->bChgToEnEmDash != bCheck;
590 0 : pOpt->bChgToEnEmDash = bCheck;
591 : pAutoCorrect->SetAutoCorrFlag(ChgToEnEmDash,
592 0 : aCheckLB.IsChecked(REPLACE_DASHES, CBCOL_SECOND));
593 :
594 0 : bCheck = aCheckLB.IsChecked(DEL_SPACES_AT_STT_END, CBCOL_FIRST);
595 0 : bModified |= pOpt->bAFmtDelSpacesAtSttEnd != bCheck;
596 0 : pOpt->bAFmtDelSpacesAtSttEnd = bCheck;
597 0 : bCheck = aCheckLB.IsChecked(DEL_SPACES_AT_STT_END, CBCOL_SECOND);
598 0 : bModified |= pOpt->bAFmtByInpDelSpacesAtSttEnd != bCheck;
599 0 : pOpt->bAFmtByInpDelSpacesAtSttEnd = bCheck;
600 :
601 0 : bCheck = aCheckLB.IsChecked(DEL_SPACES_BETWEEN_LINES, CBCOL_FIRST);
602 0 : bModified |= pOpt->bAFmtDelSpacesBetweenLines != bCheck;
603 0 : pOpt->bAFmtDelSpacesBetweenLines = bCheck;
604 0 : bCheck = aCheckLB.IsChecked(DEL_SPACES_BETWEEN_LINES, CBCOL_SECOND);
605 0 : bModified |= pOpt->bAFmtByInpDelSpacesBetweenLines != bCheck;
606 0 : pOpt->bAFmtByInpDelSpacesBetweenLines = bCheck;
607 :
608 0 : if(bModified || nFlags != pAutoCorrect->GetFlags())
609 : {
610 0 : SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
611 0 : rCfg.SetModified();
612 0 : rCfg.Commit();
613 : }
614 :
615 0 : return sal_True;
616 : }
617 :
618 0 : void OfaSwAutoFmtOptionsPage::ActivatePage( const SfxItemSet& )
619 : {
620 0 : ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_False);
621 0 : }
622 :
623 0 : void OfaSwAutoFmtOptionsPage::Reset( const SfxItemSet& )
624 : {
625 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
626 0 : SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
627 0 : const long nFlags = pAutoCorrect->GetFlags();
628 :
629 0 : aCheckLB.SetUpdateMode(sal_False);
630 0 : aCheckLB.Clear();
631 :
632 : // The following entries have to be inserted in the same order
633 : // as in the OfaAutoFmtOptions-enum!
634 0 : aCheckLB.GetModel()->Insert(CreateEntry(sUseReplaceTbl, CBCOL_BOTH ));
635 0 : aCheckLB.GetModel()->Insert(CreateEntry(sCptlSttWord, CBCOL_BOTH ));
636 0 : aCheckLB.GetModel()->Insert(CreateEntry(sCptlSttSent, CBCOL_BOTH ));
637 0 : aCheckLB.GetModel()->Insert(CreateEntry(sBoldUnder, CBCOL_BOTH ));
638 0 : aCheckLB.GetModel()->Insert(CreateEntry(sDetectURL, CBCOL_BOTH ));
639 0 : aCheckLB.GetModel()->Insert(CreateEntry(sDash, CBCOL_BOTH ));
640 0 : aCheckLB.GetModel()->Insert(CreateEntry(sDelSpaceAtSttEnd, CBCOL_BOTH ));
641 0 : aCheckLB.GetModel()->Insert(CreateEntry(sDelSpaceBetweenLines, CBCOL_BOTH ));
642 :
643 0 : aCheckLB.GetModel()->Insert(CreateEntry(sNoDblSpaces, CBCOL_SECOND));
644 0 : aCheckLB.GetModel()->Insert(CreateEntry(sCorrectCapsLock, CBCOL_SECOND));
645 0 : aCheckLB.GetModel()->Insert(CreateEntry(sNum, CBCOL_SECOND));
646 0 : aCheckLB.GetModel()->Insert(CreateEntry(sBorder, CBCOL_SECOND));
647 0 : aCheckLB.GetModel()->Insert(CreateEntry(sTable, CBCOL_SECOND));
648 0 : aCheckLB.GetModel()->Insert(CreateEntry(sReplaceTemplates, CBCOL_SECOND));
649 0 : aCheckLB.GetModel()->Insert(CreateEntry(sDeleteEmptyPara, CBCOL_FIRST ));
650 0 : aCheckLB.GetModel()->Insert(CreateEntry(sUserStyle, CBCOL_FIRST ));
651 0 : aCheckLB.GetModel()->Insert(CreateEntry(sBullet, CBCOL_FIRST ));
652 0 : aCheckLB.GetModel()->Insert(CreateEntry(sRightMargin, CBCOL_FIRST ));
653 :
654 0 : aCheckLB.CheckEntryPos( USE_REPLACE_TABLE, CBCOL_FIRST, pOpt->bAutoCorrect );
655 0 : aCheckLB.CheckEntryPos( USE_REPLACE_TABLE, CBCOL_SECOND, 0 != (nFlags & Autocorrect));
656 0 : aCheckLB.CheckEntryPos( CORR_UPPER, CBCOL_FIRST, pOpt->bCptlSttWrd );
657 0 : aCheckLB.CheckEntryPos( CORR_UPPER, CBCOL_SECOND, 0 != (nFlags & CptlSttWrd) );
658 0 : aCheckLB.CheckEntryPos( BEGIN_UPPER, CBCOL_FIRST, pOpt->bCptlSttSntnc );
659 0 : aCheckLB.CheckEntryPos( BEGIN_UPPER, CBCOL_SECOND, 0 != (nFlags & CptlSttSntnc) );
660 0 : aCheckLB.CheckEntryPos( BOLD_UNDERLINE, CBCOL_FIRST, pOpt->bChgWeightUnderl );
661 0 : aCheckLB.CheckEntryPos( BOLD_UNDERLINE, CBCOL_SECOND, 0 != (nFlags & ChgWeightUnderl) );
662 0 : aCheckLB.CheckEntryPos( IGNORE_DBLSPACE, CBCOL_SECOND, 0 != (nFlags & IgnoreDoubleSpace) );
663 0 : aCheckLB.CheckEntryPos( CORRECT_CAPS_LOCK, CBCOL_SECOND, 0 != (nFlags & CorrectCapsLock) );
664 0 : aCheckLB.CheckEntryPos( DETECT_URL, CBCOL_FIRST, pOpt->bSetINetAttr );
665 0 : aCheckLB.CheckEntryPos( DETECT_URL, CBCOL_SECOND, 0 != (nFlags & SetINetAttr) );
666 0 : aCheckLB.CheckEntryPos( REPLACE_DASHES, CBCOL_FIRST, pOpt->bChgToEnEmDash );
667 0 : aCheckLB.CheckEntryPos( REPLACE_DASHES, CBCOL_SECOND, 0 != (nFlags & ChgToEnEmDash) );
668 0 : aCheckLB.CheckEntryPos( DEL_SPACES_AT_STT_END, CBCOL_FIRST, pOpt->bAFmtDelSpacesAtSttEnd );
669 0 : aCheckLB.CheckEntryPos( DEL_SPACES_AT_STT_END, CBCOL_SECOND, pOpt->bAFmtByInpDelSpacesAtSttEnd );
670 0 : aCheckLB.CheckEntryPos( DEL_SPACES_BETWEEN_LINES, CBCOL_FIRST, pOpt->bAFmtDelSpacesBetweenLines );
671 0 : aCheckLB.CheckEntryPos( DEL_SPACES_BETWEEN_LINES, CBCOL_SECOND, pOpt->bAFmtByInpDelSpacesBetweenLines );
672 0 : aCheckLB.CheckEntryPos( DEL_EMPTY_NODE, CBCOL_FIRST, pOpt->bDelEmptyNode );
673 0 : aCheckLB.CheckEntryPos( REPLACE_USER_COLL, CBCOL_FIRST, pOpt->bChgUserColl );
674 0 : aCheckLB.CheckEntryPos( REPLACE_BULLETS, CBCOL_FIRST, pOpt->bChgEnumNum );
675 :
676 0 : aBulletFont = pOpt->aBulletFont;
677 0 : sBulletChar = pOpt->cBullet;
678 0 : ImpUserData* pUserData = new ImpUserData(&sBulletChar, &aBulletFont);
679 0 : aCheckLB.SetUserData( REPLACE_BULLETS, pUserData );
680 :
681 0 : nPercent = pOpt->nRightMargin;
682 0 : sMargin = " " + OUString::number( nPercent ) + "%";
683 0 : pUserData = new ImpUserData(&sMargin, 0);
684 0 : aCheckLB.SetUserData( MERGE_SINGLE_LINE_PARA, pUserData );
685 :
686 0 : aCheckLB.CheckEntryPos( APPLY_NUMBERING, CBCOL_SECOND, pOpt->bSetNumRule );
687 :
688 0 : aByInputBulletFont = pOpt->aByInputBulletFont;
689 0 : sByInputBulletChar = pOpt->cByInputBullet;
690 0 : ImpUserData* pUserData2 = new ImpUserData(&sByInputBulletChar, &aByInputBulletFont);
691 0 : aCheckLB.SetUserData( APPLY_NUMBERING , pUserData2 );
692 :
693 0 : aCheckLB.CheckEntryPos( MERGE_SINGLE_LINE_PARA, CBCOL_FIRST, pOpt->bRightMargin );
694 0 : aCheckLB.CheckEntryPos( INSERT_BORDER, CBCOL_SECOND, pOpt->bSetBorder );
695 0 : aCheckLB.CheckEntryPos( CREATE_TABLE, CBCOL_SECOND, pOpt->bCreateTable );
696 0 : aCheckLB.CheckEntryPos( REPLACE_STYLES, CBCOL_SECOND, pOpt->bReplaceStyles );
697 :
698 0 : aCheckLB.SetUpdateMode(sal_True);
699 0 : }
700 :
701 0 : IMPL_LINK(OfaSwAutoFmtOptionsPage, SelectHdl, OfaACorrCheckListBox*, pBox)
702 : {
703 0 : aEditPB.Enable(0 != pBox->FirstSelected()->GetUserData());
704 0 : return 0;
705 : }
706 :
707 0 : IMPL_LINK_NOARG(OfaSwAutoFmtOptionsPage, EditHdl)
708 : {
709 0 : sal_uLong nSelEntryPos = aCheckLB.GetSelectEntryPos();
710 0 : if( nSelEntryPos == REPLACE_BULLETS ||
711 : nSelEntryPos == APPLY_NUMBERING)
712 : {
713 0 : SvxCharacterMap *pMapDlg = new SvxCharacterMap(this);
714 0 : ImpUserData* pUserData = (ImpUserData*)aCheckLB.FirstSelected()->GetUserData();
715 0 : pMapDlg->SetCharFont(*pUserData->pFont);
716 0 : pMapDlg->SetChar( pUserData->pString->GetChar(0) );
717 0 : if(RET_OK == pMapDlg->Execute())
718 : {
719 0 : Font aFont(pMapDlg->GetCharFont());
720 0 : *pUserData->pFont = aFont;
721 0 : sal_UCS4 aChar = pMapDlg->GetChar();
722 : // using the UCS4 constructor
723 0 : OUString aOUStr( &aChar, 1 );
724 0 : *pUserData->pString = aOUStr;
725 : }
726 0 : delete pMapDlg;
727 : }
728 0 : else if( MERGE_SINGLE_LINE_PARA == nSelEntryPos )
729 : {
730 : // dialog for per cent settings
731 0 : OfaAutoFmtPrcntSet aDlg(this);
732 0 : aDlg.GetPrcntFld().SetValue(nPercent);
733 0 : if(RET_OK == aDlg.Execute())
734 : {
735 0 : nPercent = (sal_uInt16)aDlg.GetPrcntFld().GetValue();
736 0 : sMargin = " " + OUString::number( nPercent ) + "%";
737 0 : }
738 : }
739 0 : aCheckLB.Invalidate();
740 0 : return 0;
741 : }
742 :
743 0 : void OfaACorrCheckListBox::SetTabs()
744 : {
745 0 : SvxSimpleTable::SetTabs();
746 0 : sal_uInt16 nAdjust = SV_LBOXTAB_ADJUST_RIGHT|SV_LBOXTAB_ADJUST_LEFT|SV_LBOXTAB_ADJUST_CENTER|SV_LBOXTAB_ADJUST_NUMERIC|SV_LBOXTAB_FORCE;
747 :
748 0 : if( aTabs.size() > 1 )
749 : {
750 0 : SvLBoxTab* pTab = aTabs[1];
751 0 : pTab->nFlags &= ~nAdjust;
752 0 : pTab->nFlags |= SV_LBOXTAB_PUSHABLE|SV_LBOXTAB_ADJUST_CENTER|SV_LBOXTAB_FORCE;
753 : }
754 0 : if( aTabs.size() > 2 )
755 : {
756 0 : SvLBoxTab* pTab = aTabs[2];
757 0 : pTab->nFlags &= ~nAdjust;
758 0 : pTab->nFlags |= SV_LBOXTAB_PUSHABLE|SV_LBOXTAB_ADJUST_CENTER|SV_LBOXTAB_FORCE;
759 : }
760 0 : }
761 :
762 0 : void OfaACorrCheckListBox::CheckEntryPos(sal_uLong nPos, sal_uInt16 nCol, sal_Bool bChecked)
763 : {
764 0 : if ( nPos < GetEntryCount() )
765 : SetCheckButtonState(
766 : GetEntry(nPos),
767 : nCol,
768 : bChecked ? SvButtonState( SV_BUTTON_CHECKED ) :
769 0 : SvButtonState( SV_BUTTON_UNCHECKED ) );
770 0 : }
771 :
772 0 : sal_Bool OfaACorrCheckListBox::IsChecked(sal_uLong nPos, sal_uInt16 nCol)
773 : {
774 0 : return GetCheckButtonState( GetEntry(nPos), nCol ) == SV_BUTTON_CHECKED;
775 : }
776 :
777 0 : void OfaACorrCheckListBox::SetCheckButtonState( SvTreeListEntry* pEntry, sal_uInt16 nCol, SvButtonState eState)
778 : {
779 0 : SvLBoxButton* pItem = (SvLBoxButton*)(pEntry->GetItem(nCol + 1));
780 :
781 : DBG_ASSERT(pItem,"SetCheckButton:Item not found");
782 0 : if (pItem->GetType() == SV_ITEM_ID_LBOXBUTTON)
783 : {
784 0 : switch( eState )
785 : {
786 : case SV_BUTTON_CHECKED:
787 0 : pItem->SetStateChecked();
788 0 : break;
789 :
790 : case SV_BUTTON_UNCHECKED:
791 0 : pItem->SetStateUnchecked();
792 0 : break;
793 :
794 : case SV_BUTTON_TRISTATE:
795 0 : pItem->SetStateTristate();
796 0 : break;
797 : }
798 0 : InvalidateEntry( pEntry );
799 : }
800 0 : }
801 :
802 0 : SvButtonState OfaACorrCheckListBox::GetCheckButtonState( SvTreeListEntry* pEntry, sal_uInt16 nCol ) const
803 : {
804 0 : SvButtonState eState = SV_BUTTON_UNCHECKED;
805 0 : SvLBoxButton* pItem = (SvLBoxButton*)(pEntry->GetItem(nCol + 1));
806 : DBG_ASSERT(pItem,"GetChButnState:Item not found");
807 :
808 0 : if (pItem->GetType() == SV_ITEM_ID_LBOXBUTTON)
809 : {
810 0 : sal_uInt16 nButtonFlags = pItem->GetButtonFlags();
811 0 : eState = pCheckButtonData->ConvertToButtonState( nButtonFlags );
812 : }
813 :
814 0 : return eState;
815 : }
816 :
817 0 : void OfaACorrCheckListBox::HBarClick()
818 : {
819 : // sorting is stopped by this overload
820 0 : }
821 :
822 0 : void OfaACorrCheckListBox::KeyInput( const KeyEvent& rKEvt )
823 : {
824 0 : if(!rKEvt.GetKeyCode().GetModifier() &&
825 0 : KEY_SPACE == rKEvt.GetKeyCode().GetCode())
826 : {
827 0 : sal_uLong nSelPos = GetSelectEntryPos();
828 0 : sal_uInt16 nCol = GetCurrentTabPos() - 1;
829 0 : if ( nCol < 2 )
830 : {
831 0 : CheckEntryPos( nSelPos, nCol, !IsChecked( nSelPos, nCol ) );
832 0 : CallImplEventListeners( VCLEVENT_CHECKBOX_TOGGLE, (void*)GetEntry( nSelPos ) );
833 : }
834 : else
835 : {
836 0 : sal_uInt16 nCheck = IsChecked(nSelPos, 1) ? 1 : 0;
837 0 : if(IsChecked(nSelPos, 0))
838 0 : nCheck += 2;
839 0 : nCheck--;
840 0 : nCheck &= 3;
841 0 : CheckEntryPos(nSelPos, 1, 0 != (nCheck & 1));
842 0 : CheckEntryPos(nSelPos, 0, 0 != (nCheck & 2));
843 : }
844 : }
845 : else
846 0 : SvxSimpleTable::KeyInput(rKEvt);
847 0 : }
848 :
849 0 : OfaAutocorrReplacePage::OfaAutocorrReplacePage( Window* pParent,
850 : const SfxItemSet& rSet )
851 : : SfxTabPage(pParent, "AcorReplacePage", "cui/ui/acorreplacepage.ui", rSet)
852 : , eLang(eLastDialogLanguage)
853 : , bHasSelectionText(false)
854 : , bFirstSelect(true)
855 : , bReplaceEditChanged(false)
856 0 : , bSWriter(true)
857 : {
858 0 : get(m_pTextOnlyCB, "textonly");
859 0 : get(m_pDeleteReplacePB, "delete");
860 0 : get(m_pNewReplacePB, "new");
861 0 : sNew = m_pNewReplacePB->GetText();
862 0 : sModify = get<PushButton>("replace")->GetText();
863 0 : get(m_pShortED, "origtext");
864 0 : get(m_pReplaceED, "newtext");
865 0 : get(m_pReplaceTLB, "tabview");
866 0 : m_pReplaceTLB->set_height_request(16 * GetTextHeight());
867 :
868 0 : SfxModule *pMod = *(SfxModule**)GetAppData(SHL_WRITER);
869 0 : bSWriter = pMod == SfxModule::GetActiveModule();
870 :
871 0 : LanguageTag aLanguageTag( eLastDialogLanguage );
872 0 : pCompareClass = new CollatorWrapper( comphelper::getProcessComponentContext() );
873 0 : pCompareClass->loadDefaultCollator( aLanguageTag.getLocale(), 0 );
874 0 : pCharClass = new CharClass( aLanguageTag );
875 :
876 : static long aTabs[] = { 2 /* Tab-Count */, 1, 61 };
877 0 : m_pReplaceTLB->SetTabs( &aTabs[0], MAP_APPFONT );
878 :
879 0 : m_pReplaceTLB->SetStyle( m_pReplaceTLB->GetStyle()|WB_HSCROLL|WB_CLIPCHILDREN );
880 0 : m_pReplaceTLB->SetSelectHdl( LINK(this, OfaAutocorrReplacePage, SelectHdl) );
881 0 : m_pNewReplacePB->SetClickHdl( LINK(this, OfaAutocorrReplacePage, NewDelHdl) );
882 0 : m_pDeleteReplacePB->SetClickHdl( LINK(this, OfaAutocorrReplacePage, NewDelHdl) );
883 0 : m_pShortED->SetModifyHdl( LINK(this, OfaAutocorrReplacePage, ModifyHdl) );
884 0 : m_pReplaceED->SetModifyHdl( LINK(this, OfaAutocorrReplacePage, ModifyHdl) );
885 0 : m_pShortED->SetActionHdl( LINK(this, OfaAutocorrReplacePage, NewDelHdl) );
886 0 : m_pReplaceED->SetActionHdl( LINK(this, OfaAutocorrReplacePage, NewDelHdl) );
887 :
888 0 : m_pReplaceED->SetSpaces(true);
889 0 : m_pShortED->SetSpaces(true);
890 0 : }
891 :
892 0 : void OfaAutocorrReplacePage::Resize()
893 : {
894 0 : SfxTabPage::Resize();
895 0 : m_pReplaceTLB->SetTab(0, m_pShortED->GetPosPixel().X(), MAP_PIXEL);
896 0 : m_pReplaceTLB->SetTab(1, m_pReplaceED->GetPosPixel().X(), MAP_PIXEL);
897 0 : }
898 :
899 0 : OfaAutocorrReplacePage::~OfaAutocorrReplacePage()
900 : {
901 0 : aDoubleStringTable.clear();
902 0 : aChangesTable.clear();
903 :
904 0 : delete pCompareClass;
905 0 : delete pCharClass;
906 0 : }
907 :
908 0 : SfxTabPage* OfaAutocorrReplacePage::Create( Window* pParent, const SfxItemSet& rSet)
909 : {
910 0 : return new OfaAutocorrReplacePage(pParent, rSet);
911 : }
912 :
913 0 : void OfaAutocorrReplacePage::ActivatePage( const SfxItemSet& )
914 : {
915 0 : if(eLang != eLastDialogLanguage)
916 0 : SetLanguage(eLastDialogLanguage);
917 0 : ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_True);
918 0 : }
919 :
920 0 : int OfaAutocorrReplacePage::DeactivatePage( SfxItemSet* )
921 : {
922 0 : return LEAVE_PAGE;
923 : }
924 :
925 0 : sal_Bool OfaAutocorrReplacePage::FillItemSet( SfxItemSet& )
926 : {
927 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
928 :
929 0 : for (StringChangeTable::reverse_iterator it = aChangesTable.rbegin(); it != aChangesTable.rend(); ++it)
930 : {
931 0 : LanguageType eCurrentLang = it->first;
932 0 : StringChangeList& rStringChangeList = it->second;
933 0 : std::vector<SvxAutocorrWord> aDeleteWords;
934 0 : std::vector<SvxAutocorrWord> aNewWords;
935 :
936 0 : for (sal_uInt32 i = 0; i < rStringChangeList.aDeletedEntries.size(); i++)
937 : {
938 0 : DoubleString& deleteEntry = rStringChangeList.aDeletedEntries[i];
939 0 : SvxAutocorrWord aDeleteWord( deleteEntry.sShort, deleteEntry.sLong );
940 0 : aDeleteWords.push_back( aDeleteWord );
941 0 : }
942 :
943 0 : for (sal_uInt32 i = 0; i < rStringChangeList.aNewEntries.size(); i++)
944 : {
945 0 : DoubleString& newEntry = rStringChangeList.aNewEntries[i];
946 0 : SvxAutocorrWord aNewWord( newEntry.sShort, newEntry.sLong );
947 0 : aNewWords.push_back( aNewWord );
948 0 : }
949 0 : pAutoCorrect->MakeCombinedChanges( aNewWords, aDeleteWords, eCurrentLang );
950 0 : }
951 0 : aChangesTable.clear();
952 0 : return sal_False;
953 : }
954 :
955 0 : void OfaAutocorrReplacePage::RefillReplaceBox(sal_Bool bFromReset,
956 : LanguageType eOldLanguage,
957 : LanguageType eNewLanguage)
958 : {
959 0 : eLang = eNewLanguage;
960 0 : if(bFromReset)
961 : {
962 0 : aDoubleStringTable.clear();
963 0 : aChangesTable.clear();
964 : }
965 : else
966 : {
967 : DoubleStringArray* pArray;
968 0 : if(aDoubleStringTable.find(eOldLanguage) != aDoubleStringTable.end())
969 : {
970 0 : pArray = &aDoubleStringTable[eOldLanguage];
971 0 : pArray->clear();
972 : }
973 : else
974 : {
975 0 : pArray = &aDoubleStringTable[eOldLanguage]; // create new array
976 : }
977 :
978 0 : sal_uInt32 nListBoxCount = (sal_uInt32) m_pReplaceTLB->GetEntryCount();
979 : sal_uInt32 i;
980 0 : for(i = 0; i < nListBoxCount; i++)
981 : {
982 0 : pArray->push_back(DoubleString());
983 0 : DoubleString& rDouble = (*pArray)[pArray->size() - 1];
984 0 : SvTreeListEntry* pEntry = m_pReplaceTLB->GetEntry( i );
985 0 : rDouble.sShort = m_pReplaceTLB->GetEntryText(pEntry, 0);
986 0 : rDouble.sLong = m_pReplaceTLB->GetEntryText(pEntry, 1);
987 0 : rDouble.pUserData = pEntry->GetUserData();
988 : }
989 : }
990 :
991 0 : m_pReplaceTLB->Clear();
992 0 : if( !bSWriter )
993 0 : aFormatText.clear();
994 :
995 0 : if( aDoubleStringTable.find(eLang) != aDoubleStringTable.end() )
996 : {
997 0 : DoubleStringArray& rArray = aDoubleStringTable[eNewLanguage];
998 0 : for( sal_uInt32 i = 0; i < rArray.size(); i++ )
999 : {
1000 0 : DoubleString& rDouble = rArray[i];
1001 0 : sal_Bool bTextOnly = 0 == rDouble.pUserData;
1002 : // formatted text is only in Writer
1003 0 : if(bSWriter || bTextOnly)
1004 : {
1005 0 : String sEntry(rDouble.sShort);
1006 0 : sEntry += '\t';
1007 0 : sEntry += rDouble.sLong;
1008 0 : SvTreeListEntry* pEntry = m_pReplaceTLB->InsertEntry(sEntry);
1009 0 : m_pTextOnlyCB->Check(bTextOnly);
1010 0 : if(!bTextOnly)
1011 0 : pEntry->SetUserData(rDouble.pUserData); // that means: with format info or even with selection text
1012 : }
1013 : else
1014 : {
1015 0 : aFormatText.insert(rDouble.sShort);
1016 : }
1017 : }
1018 : }
1019 : else
1020 : {
1021 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
1022 0 : SvxAutocorrWordList* pWordList = pAutoCorrect->LoadAutocorrWordList(eLang);
1023 0 : m_pReplaceTLB->SetUpdateMode(sal_False);
1024 0 : SvxAutocorrWordList::Content aContent = pWordList->getSortedContent();
1025 0 : for( SvxAutocorrWordList::Content::const_iterator it = aContent.begin();
1026 0 : it != aContent.end(); ++it )
1027 : {
1028 0 : SvxAutocorrWord* pWordPtr = *it;
1029 0 : sal_Bool bTextOnly = pWordPtr->IsTextOnly();
1030 : // formatted text is only in Writer
1031 0 : if(bSWriter || bTextOnly)
1032 : {
1033 0 : String sEntry(pWordPtr->GetShort());
1034 0 : sEntry += '\t';
1035 0 : sEntry += pWordPtr->GetLong();
1036 0 : SvTreeListEntry* pEntry = m_pReplaceTLB->InsertEntry(sEntry);
1037 0 : m_pTextOnlyCB->Check(pWordPtr->IsTextOnly());
1038 0 : if(!bTextOnly)
1039 0 : pEntry->SetUserData(m_pTextOnlyCB); // that means: with format info
1040 : }
1041 : else
1042 : {
1043 0 : aFormatText.insert(pWordPtr->GetShort());
1044 : }
1045 : }
1046 0 : m_pNewReplacePB->Enable(sal_False);
1047 0 : m_pDeleteReplacePB->Enable(sal_False);
1048 0 : m_pReplaceTLB->SetUpdateMode(sal_True);
1049 : }
1050 :
1051 0 : SfxViewShell* pViewShell = SfxViewShell::Current();
1052 0 : if( pViewShell && pViewShell->HasSelection( sal_True ) )
1053 : {
1054 0 : bHasSelectionText = sal_True;
1055 0 : const String sSelection( pViewShell->GetSelectionText() );
1056 0 : m_pReplaceED->SetText( sSelection );
1057 0 : m_pTextOnlyCB->Check( !bSWriter );
1058 0 : m_pTextOnlyCB->Enable( bSWriter && sSelection.Len() );
1059 : }
1060 : else
1061 : {
1062 0 : m_pTextOnlyCB->Enable( sal_False );
1063 : }
1064 0 : }
1065 :
1066 0 : void OfaAutocorrReplacePage::Reset( const SfxItemSet& )
1067 : {
1068 0 : RefillReplaceBox(sal_True, eLang, eLang);
1069 0 : m_pShortED->GrabFocus();
1070 0 : }
1071 :
1072 0 : void OfaAutocorrReplacePage::SetLanguage(LanguageType eSet)
1073 : {
1074 : //save old settings an refill
1075 0 : if(eSet != eLang)
1076 : {
1077 0 : RefillReplaceBox(sal_False, eLang, eSet);
1078 0 : eLastDialogLanguage = eSet;
1079 0 : delete pCompareClass;
1080 0 : delete pCharClass;
1081 :
1082 0 : LanguageTag aLanguageTag( eLastDialogLanguage );
1083 0 : pCompareClass = new CollatorWrapper( comphelper::getProcessComponentContext() );
1084 0 : pCompareClass->loadDefaultCollator( aLanguageTag.getLocale(), 0 );
1085 0 : pCharClass = new CharClass( aLanguageTag );
1086 0 : ModifyHdl(m_pShortED);
1087 : }
1088 0 : }
1089 :
1090 0 : IMPL_LINK(OfaAutocorrReplacePage, SelectHdl, SvTabListBox*, pBox)
1091 : {
1092 0 : if(!bFirstSelect || !bHasSelectionText)
1093 : {
1094 0 : SvTreeListEntry* pEntry = pBox->FirstSelected();
1095 0 : OUString sTmpShort(pBox->GetEntryText(pEntry, 0));
1096 : // if the text is set via ModifyHdl, the cursor is always at the beginning
1097 : // of a word, although you're editing here
1098 0 : sal_Bool bSameContent = 0 == pCompareClass->compareString( sTmpShort, m_pShortED->GetText() );
1099 0 : Selection aSel = m_pShortED->GetSelection();
1100 0 : if(m_pShortED->GetText() != sTmpShort)
1101 : {
1102 0 : m_pShortED->SetText(sTmpShort);
1103 : // if it was only a different notation, the selection has to be set again
1104 0 : if(bSameContent)
1105 : {
1106 0 : m_pShortED->SetSelection(aSel);
1107 : }
1108 : }
1109 0 : m_pReplaceED->SetText( pBox->GetEntryText(pEntry, 1) );
1110 : // with UserData there is a Formatinfo
1111 0 : m_pTextOnlyCB->Check( pEntry->GetUserData() == 0);
1112 : }
1113 : else
1114 : {
1115 0 : bFirstSelect = sal_False;
1116 : }
1117 :
1118 0 : m_pNewReplacePB->Enable(sal_False);
1119 0 : m_pDeleteReplacePB->Enable();
1120 0 : return 0;
1121 : };
1122 :
1123 0 : void OfaAutocorrReplacePage::NewEntry(String sShort, String sLong)
1124 : {
1125 0 : DoubleStringArray& rNewArray = aChangesTable[eLang].aNewEntries;
1126 0 : for (sal_uInt32 i = 0; i < rNewArray.size(); i++)
1127 : {
1128 0 : if (rNewArray[i].sShort == sShort)
1129 : {
1130 0 : rNewArray.erase(rNewArray.begin() + i);
1131 0 : break;
1132 : }
1133 : }
1134 :
1135 0 : DoubleStringArray& rDeletedArray = aChangesTable[eLang].aDeletedEntries;
1136 0 : for (sal_uInt32 i = 0; i < rDeletedArray.size(); i++)
1137 : {
1138 0 : if (rDeletedArray[i].sShort == sShort)
1139 : {
1140 0 : rDeletedArray.erase(rDeletedArray.begin() + i);
1141 0 : break;
1142 : }
1143 : }
1144 :
1145 0 : DoubleString aNewString = DoubleString();
1146 0 : aNewString.sShort = sShort;
1147 0 : aNewString.sLong = sLong;
1148 0 : rNewArray.push_back(aNewString);
1149 0 : }
1150 :
1151 0 : void OfaAutocorrReplacePage::DeleteEntry(String sShort, String sLong)
1152 : {
1153 0 : DoubleStringArray& rNewArray = aChangesTable[eLang].aNewEntries;
1154 0 : for (sal_uInt32 i = 0; i < rNewArray.size(); i++)
1155 : {
1156 0 : if (rNewArray[i].sShort == sShort)
1157 : {
1158 0 : rNewArray.erase(rNewArray.begin() + i);
1159 0 : break;
1160 : }
1161 : }
1162 :
1163 0 : DoubleStringArray& rDeletedArray = aChangesTable[eLang].aDeletedEntries;
1164 0 : for (sal_uInt32 i = 0; i < rDeletedArray.size(); i++)
1165 : {
1166 0 : if (rDeletedArray[i].sShort == sShort)
1167 : {
1168 0 : rDeletedArray.erase(rDeletedArray.begin() + i);
1169 0 : break;
1170 : }
1171 : }
1172 :
1173 0 : DoubleString aDeletedString = DoubleString();
1174 0 : aDeletedString.sShort = sShort;
1175 0 : aDeletedString.sLong = sLong;
1176 0 : rDeletedArray.push_back(aDeletedString);
1177 0 : }
1178 :
1179 0 : IMPL_LINK(OfaAutocorrReplacePage, NewDelHdl, PushButton*, pBtn)
1180 : {
1181 0 : SvTreeListEntry* pEntry = m_pReplaceTLB->FirstSelected();
1182 0 : if( pBtn == m_pDeleteReplacePB )
1183 : {
1184 : DBG_ASSERT( pEntry, "no entry selected" );
1185 0 : if( pEntry )
1186 : {
1187 0 : DeleteEntry(m_pReplaceTLB->GetEntryText(pEntry, 0), m_pReplaceTLB->GetEntryText(pEntry, 1));
1188 0 : m_pReplaceTLB->GetModel()->Remove(pEntry);
1189 0 : ModifyHdl(m_pShortED);
1190 0 : return 0;
1191 : }
1192 : }
1193 0 : if(pBtn == m_pNewReplacePB || m_pNewReplacePB->IsEnabled())
1194 : {
1195 0 : SvTreeListEntry* _pNewEntry = m_pReplaceTLB->FirstSelected();
1196 0 : String sEntry(m_pShortED->GetText());
1197 0 : if(sEntry.Len() && ( !m_pReplaceED->GetText().isEmpty() ||
1198 0 : ( bHasSelectionText && bSWriter ) ))
1199 : {
1200 0 : NewEntry(m_pShortED->GetText(), m_pReplaceED->GetText());
1201 0 : m_pReplaceTLB->SetUpdateMode(sal_False);
1202 0 : sal_uInt32 nPos = UINT_MAX;
1203 0 : sEntry += '\t';
1204 0 : sEntry += m_pReplaceED->GetText();
1205 0 : if(_pNewEntry)
1206 : {
1207 0 : nPos = (sal_uInt32) m_pReplaceTLB->GetModel()->GetAbsPos(_pNewEntry);
1208 0 : m_pReplaceTLB->GetModel()->Remove(_pNewEntry);
1209 : }
1210 : else
1211 : {
1212 : sal_uInt32 j;
1213 0 : for( j = 0; j < m_pReplaceTLB->GetEntryCount(); j++ )
1214 : {
1215 0 : SvTreeListEntry* pReplaceEntry = m_pReplaceTLB->GetEntry(j);
1216 0 : if( 0 >= pCompareClass->compareString(sEntry, m_pReplaceTLB->GetEntryText(pReplaceEntry, 0) ) )
1217 0 : break;
1218 : }
1219 0 : nPos = j;
1220 : }
1221 : SvTreeListEntry* pInsEntry = m_pReplaceTLB->InsertEntry(
1222 : sEntry, static_cast< SvTreeListEntry * >(NULL), false,
1223 0 : nPos == UINT_MAX ? LIST_APPEND : nPos);
1224 0 : if( !bReplaceEditChanged && !m_pTextOnlyCB->IsChecked())
1225 : {
1226 0 : pInsEntry->SetUserData(&bHasSelectionText); // new formatted text
1227 : }
1228 :
1229 0 : m_pReplaceTLB->MakeVisible( pInsEntry );
1230 0 : m_pReplaceTLB->SetUpdateMode( sal_True );
1231 : // if the request came from the ReplaceEdit, give focus to the ShortEdit
1232 0 : if(m_pReplaceED->HasFocus())
1233 : {
1234 0 : m_pShortED->GrabFocus();
1235 : }
1236 0 : }
1237 : }
1238 : else
1239 : {
1240 : // this can only be an enter in one of the two edit fields
1241 : // which means EndDialog() - has to be evaluated in KeyInput
1242 0 : return 0;
1243 : }
1244 0 : ModifyHdl(m_pShortED);
1245 0 : return 1;
1246 : }
1247 :
1248 0 : IMPL_LINK(OfaAutocorrReplacePage, ModifyHdl, Edit*, pEdt)
1249 : {
1250 0 : SvTreeListEntry* pFirstSel = m_pReplaceTLB->FirstSelected();
1251 0 : sal_Bool bShort = pEdt == m_pShortED;
1252 0 : const String rEntry = pEdt->GetText();
1253 0 : const String rRepString = m_pReplaceED->GetText();
1254 0 : String aWordStr( pCharClass->lowercase( rEntry ));
1255 :
1256 0 : if(bShort)
1257 : {
1258 0 : if(rEntry.Len())
1259 : {
1260 0 : sal_Bool bFound = sal_False;
1261 0 : sal_Bool bTmpSelEntry=sal_False;
1262 :
1263 0 : for(sal_uInt32 i = 0; i < m_pReplaceTLB->GetEntryCount(); i++)
1264 : {
1265 0 : SvTreeListEntry* pEntry = m_pReplaceTLB->GetEntry( i );
1266 0 : String aTestStr=m_pReplaceTLB->GetEntryText(pEntry, 0);
1267 0 : if( pCompareClass->compareString(rEntry, aTestStr ) == 0 )
1268 : {
1269 0 : if( rRepString.Len() )
1270 : {
1271 0 : bFirstSelect = sal_True;
1272 : }
1273 0 : m_pReplaceTLB->SetCurEntry(pEntry);
1274 0 : pFirstSel = pEntry;
1275 0 : m_pNewReplacePB->SetText(sModify);
1276 0 : bFound = sal_True;
1277 0 : break;
1278 : }
1279 : else
1280 : {
1281 0 : aTestStr = pCharClass->lowercase( aTestStr );
1282 0 : if( aTestStr.Search(aWordStr) == 0 && !bTmpSelEntry )
1283 : {
1284 0 : m_pReplaceTLB->MakeVisible( pEntry );
1285 0 : bTmpSelEntry = sal_True;
1286 : }
1287 : }
1288 0 : }
1289 0 : if( !bFound )
1290 : {
1291 0 : m_pReplaceTLB->SelectAll( sal_False );
1292 0 : pFirstSel = 0;
1293 0 : m_pNewReplacePB->SetText( sNew );
1294 0 : if( bReplaceEditChanged )
1295 0 : m_pTextOnlyCB->Enable(sal_False);
1296 : }
1297 0 : m_pDeleteReplacePB->Enable( bFound );
1298 : }
1299 0 : else if( m_pReplaceTLB->GetEntryCount() > 0 )
1300 : {
1301 0 : SvTreeListEntry* pEntry = m_pReplaceTLB->GetEntry( 0 );
1302 0 : m_pReplaceTLB->MakeVisible( pEntry );
1303 : }
1304 :
1305 : }
1306 0 : else if( !bShort )
1307 : {
1308 0 : bReplaceEditChanged = sal_True;
1309 0 : if( pFirstSel )
1310 : {
1311 0 : m_pNewReplacePB->SetText( sModify );
1312 : }
1313 : }
1314 :
1315 0 : const String& rShortTxt = m_pShortED->GetText();
1316 0 : sal_Bool bEnableNew = rShortTxt.Len() &&
1317 0 : ( rRepString.Len() ||
1318 0 : ( bHasSelectionText && bSWriter )) &&
1319 0 : ( !pFirstSel || rRepString !=
1320 0 : m_pReplaceTLB->GetEntryText( pFirstSel, 1 ) );
1321 0 : if( bEnableNew )
1322 : {
1323 0 : for(std::set<OUString>::iterator i = aFormatText.begin(); i != aFormatText.end(); ++i)
1324 : {
1325 0 : if((*i).equals(rShortTxt))
1326 : {
1327 0 : bEnableNew = sal_False;
1328 0 : break;
1329 : }
1330 : }
1331 : }
1332 0 : m_pNewReplacePB->Enable( bEnableNew );
1333 :
1334 0 : return 0;
1335 : }
1336 :
1337 0 : static sal_Bool lcl_FindInArray(std::vector<OUString>& rStrings, const String& rString)
1338 : {
1339 0 : for(std::vector<OUString>::iterator i = rStrings.begin(); i != rStrings.end(); ++i)
1340 : {
1341 0 : if((*i).equals(rString))
1342 : {
1343 0 : return sal_True;
1344 : }
1345 : }
1346 0 : return sal_False;
1347 : }
1348 :
1349 0 : OfaAutocorrExceptPage::OfaAutocorrExceptPage(Window* pParent, const SfxItemSet& rSet)
1350 : : SfxTabPage(pParent, "AcorExceptPage", "cui/ui/acorexceptpage.ui", rSet)
1351 0 : , eLang(eLastDialogLanguage)
1352 : {
1353 0 : get(m_pAbbrevED, "abbrev");
1354 0 : get(m_pAbbrevLB, "abbrevlist");
1355 0 : m_pAbbrevLB->SetStyle(m_pAbbrevLB->GetStyle() | WB_SORT);
1356 0 : m_pAbbrevLB->SetDropDownLineCount(7);
1357 0 : get(m_pNewAbbrevPB, "newabbrev");
1358 0 : get(m_pDelAbbrevPB, "delabbrev");
1359 0 : get(m_pAutoAbbrevCB, "autoabbrev");
1360 :
1361 0 : get(m_pDoubleCapsED, "double");
1362 0 : get(m_pDoubleCapsLB, "doublelist");
1363 0 : m_pDoubleCapsLB->SetStyle(m_pDoubleCapsLB->GetStyle() | WB_SORT);
1364 0 : m_pDoubleCapsLB->SetDropDownLineCount(7);
1365 0 : get(m_pNewDoublePB, "newdouble");
1366 0 : get(m_pDelDoublePB, "deldouble");
1367 0 : get(m_pAutoCapsCB, "autodouble");
1368 :
1369 0 : ::com::sun::star::lang::Locale aLcl( LanguageTag(eLastDialogLanguage ).getLocale());
1370 0 : pCompareClass = new CollatorWrapper( comphelper::getProcessComponentContext() );
1371 0 : pCompareClass->loadDefaultCollator( aLcl, 0 );
1372 :
1373 0 : m_pNewAbbrevPB->SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1374 0 : m_pDelAbbrevPB->SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1375 0 : m_pNewDoublePB->SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1376 0 : m_pDelDoublePB->SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1377 :
1378 0 : m_pAbbrevLB->SetSelectHdl(LINK(this, OfaAutocorrExceptPage, SelectHdl));
1379 0 : m_pDoubleCapsLB->SetSelectHdl(LINK(this, OfaAutocorrExceptPage, SelectHdl));
1380 0 : m_pAbbrevED->SetModifyHdl(LINK(this, OfaAutocorrExceptPage, ModifyHdl));
1381 0 : m_pDoubleCapsED->SetModifyHdl(LINK(this, OfaAutocorrExceptPage, ModifyHdl));
1382 :
1383 0 : m_pAbbrevED->SetActionHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1384 0 : m_pDoubleCapsED->SetActionHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1385 0 : }
1386 :
1387 0 : OfaAutocorrExceptPage::~OfaAutocorrExceptPage()
1388 : {
1389 0 : aStringsTable.clear();
1390 0 : delete pCompareClass;
1391 0 : }
1392 :
1393 0 : SfxTabPage* OfaAutocorrExceptPage::Create( Window* pParent,
1394 : const SfxItemSet& rSet)
1395 : {
1396 0 : return new OfaAutocorrExceptPage(pParent, rSet);
1397 : }
1398 :
1399 0 : void OfaAutocorrExceptPage::ActivatePage( const SfxItemSet& )
1400 : {
1401 0 : if(eLang != eLastDialogLanguage)
1402 0 : SetLanguage(eLastDialogLanguage);
1403 0 : ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_True);
1404 0 : }
1405 :
1406 0 : int OfaAutocorrExceptPage::DeactivatePage( SfxItemSet* )
1407 : {
1408 0 : return LEAVE_PAGE;
1409 : }
1410 :
1411 0 : sal_Bool OfaAutocorrExceptPage::FillItemSet( SfxItemSet& )
1412 : {
1413 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
1414 0 : for(StringsTable::reverse_iterator it1 = aStringsTable.rbegin(); it1 != aStringsTable.rend(); ++it1)
1415 : {
1416 0 : LanguageType eCurLang = it1->first;
1417 0 : StringsArrays& rArrays = it1->second;
1418 0 : if(eCurLang != eLang) // current language is treated later
1419 : {
1420 0 : SvStringsISortDtor* pWrdList = pAutoCorrect->LoadWrdSttExceptList(eCurLang);
1421 :
1422 0 : if(pWrdList)
1423 : {
1424 0 : sal_uInt16 nCount = pWrdList->size();
1425 : sal_uInt16 i;
1426 0 : for( i = nCount; i; )
1427 : {
1428 0 : String* pString = (*pWrdList)[ --i ];
1429 :
1430 0 : if( !lcl_FindInArray(rArrays.aDoubleCapsStrings, *pString))
1431 : {
1432 0 : delete (*pWrdList)[ i ];
1433 0 : pWrdList->erase(i);
1434 : }
1435 : }
1436 :
1437 0 : for(std::vector<OUString>::iterator it = rArrays.aDoubleCapsStrings.begin(); it != rArrays.aDoubleCapsStrings.end(); ++it)
1438 : {
1439 0 : String* s = new String(*it);
1440 0 : if(!pWrdList->insert(s).second)
1441 0 : delete s;
1442 : }
1443 0 : pAutoCorrect->SaveWrdSttExceptList(eCurLang);
1444 : }
1445 :
1446 0 : SvStringsISortDtor* pCplList = pAutoCorrect->LoadCplSttExceptList(eCurLang);
1447 :
1448 0 : if(pCplList)
1449 : {
1450 0 : sal_uInt16 nCount = pCplList->size();
1451 : sal_uInt16 i;
1452 0 : for( i = nCount; i; )
1453 : {
1454 0 : String* pString = (*pCplList)[ --i ];
1455 0 : if( !lcl_FindInArray(rArrays.aAbbrevStrings, *pString))
1456 : {
1457 0 : delete (*pCplList)[ i ];
1458 0 : pCplList->erase(i);
1459 : }
1460 : }
1461 :
1462 0 : for(std::vector<OUString>::iterator it = rArrays.aAbbrevStrings.begin(); it != rArrays.aAbbrevStrings.end(); ++it)
1463 : {
1464 0 : String* s = new String(*it);
1465 0 : if(!pCplList->insert(s).second)
1466 0 : delete s;
1467 : }
1468 :
1469 0 : pAutoCorrect->SaveCplSttExceptList(eCurLang);
1470 : }
1471 : }
1472 : }
1473 0 : aStringsTable.clear();
1474 :
1475 0 : SvStringsISortDtor* pWrdList = pAutoCorrect->LoadWrdSttExceptList(eLang);
1476 :
1477 0 : if(pWrdList)
1478 : {
1479 0 : sal_uInt16 nCount = pWrdList->size();
1480 : sal_uInt16 i;
1481 0 : for( i = nCount; i; )
1482 : {
1483 0 : String* pString = (*pWrdList)[ --i ];
1484 0 : if( USHRT_MAX == m_pDoubleCapsLB->GetEntryPos(*pString) )
1485 : {
1486 0 : delete (*pWrdList)[ i ];
1487 0 : pWrdList->erase(i);
1488 : }
1489 : }
1490 0 : nCount = m_pDoubleCapsLB->GetEntryCount();
1491 0 : for( i = 0; i < nCount; ++i )
1492 : {
1493 0 : String* pEntry = new String( m_pDoubleCapsLB->GetEntry( i ) );
1494 0 : if( !pWrdList->insert( pEntry ).second)
1495 0 : delete pEntry;
1496 : }
1497 0 : pAutoCorrect->SaveWrdSttExceptList(eLang);
1498 : }
1499 :
1500 0 : SvStringsISortDtor* pCplList = pAutoCorrect->LoadCplSttExceptList(eLang);
1501 :
1502 0 : if(pCplList)
1503 : {
1504 0 : sal_uInt16 nCount = pCplList->size();
1505 : sal_uInt16 i;
1506 0 : for( i = nCount; i; )
1507 : {
1508 0 : String* pString = (*pCplList)[ --i ];
1509 0 : if( USHRT_MAX == m_pAbbrevLB->GetEntryPos(*pString) )
1510 : {
1511 0 : delete (*pCplList)[ i ];
1512 0 : pCplList->erase(i);
1513 : }
1514 : }
1515 0 : nCount = m_pAbbrevLB->GetEntryCount();
1516 0 : for( i = 0; i < nCount; ++i )
1517 : {
1518 0 : String* pEntry = new String( m_pAbbrevLB->GetEntry( i ) );
1519 0 : if( !pCplList->insert( pEntry ).second)
1520 0 : delete pEntry;
1521 : }
1522 0 : pAutoCorrect->SaveCplSttExceptList(eLang);
1523 : }
1524 0 : if(m_pAutoAbbrevCB->IsChecked() != m_pAutoAbbrevCB->GetSavedValue())
1525 0 : pAutoCorrect->SetAutoCorrFlag( SaveWordCplSttLst, m_pAutoAbbrevCB->IsChecked());
1526 0 : if(m_pAutoCapsCB->IsChecked() != m_pAutoCapsCB->GetSavedValue())
1527 0 : pAutoCorrect->SetAutoCorrFlag( SaveWordWrdSttLst, m_pAutoCapsCB->IsChecked());
1528 0 : return sal_False;
1529 : }
1530 :
1531 0 : void OfaAutocorrExceptPage::SetLanguage(LanguageType eSet)
1532 : {
1533 0 : if(eLang != eSet)
1534 : {
1535 : // save old settings and fill anew
1536 0 : RefillReplaceBoxes(sal_False, eLang, eSet);
1537 0 : eLastDialogLanguage = eSet;
1538 0 : delete pCompareClass;
1539 0 : pCompareClass = new CollatorWrapper( comphelper::getProcessComponentContext() );
1540 0 : pCompareClass->loadDefaultCollator( LanguageTag( eLastDialogLanguage ).getLocale(), 0 );
1541 0 : ModifyHdl(m_pAbbrevED);
1542 0 : ModifyHdl(m_pDoubleCapsED);
1543 : }
1544 0 : }
1545 :
1546 0 : void OfaAutocorrExceptPage::RefillReplaceBoxes(sal_Bool bFromReset,
1547 : LanguageType eOldLanguage,
1548 : LanguageType eNewLanguage)
1549 : {
1550 0 : eLang = eNewLanguage;
1551 0 : if(bFromReset)
1552 : {
1553 0 : aStringsTable.clear();
1554 : }
1555 : else
1556 : {
1557 : StringsArrays* pArrays;
1558 0 : if(aStringsTable.find(eOldLanguage) != aStringsTable.end())
1559 : {
1560 0 : pArrays = &aStringsTable[eOldLanguage];
1561 0 : pArrays->aAbbrevStrings.clear();
1562 0 : pArrays->aDoubleCapsStrings.clear();
1563 : }
1564 : else
1565 : {
1566 0 : pArrays = &aStringsTable[eOldLanguage]; // create new array
1567 : }
1568 :
1569 : sal_uInt16 i;
1570 0 : for(i = 0; i < m_pAbbrevLB->GetEntryCount(); i++)
1571 0 : pArrays->aAbbrevStrings.push_back(OUString(m_pAbbrevLB->GetEntry(i)));
1572 :
1573 0 : for(i = 0; i < m_pDoubleCapsLB->GetEntryCount(); i++)
1574 0 : pArrays->aDoubleCapsStrings.push_back(OUString(m_pDoubleCapsLB->GetEntry(i)));
1575 : }
1576 0 : m_pDoubleCapsLB->Clear();
1577 0 : m_pAbbrevLB->Clear();
1578 0 : String sTemp;
1579 0 : m_pAbbrevED->SetText(sTemp);
1580 0 : m_pDoubleCapsED->SetText(sTemp);
1581 :
1582 0 : if(aStringsTable.find(eLang) != aStringsTable.end())
1583 : {
1584 0 : StringsArrays& rArrays = aStringsTable[eLang];
1585 0 : for(std::vector<OUString>::iterator i = rArrays.aAbbrevStrings.begin(); i != rArrays.aAbbrevStrings.end(); ++i)
1586 0 : m_pAbbrevLB->InsertEntry(*i);
1587 :
1588 0 : for(std::vector<OUString>::iterator i = rArrays.aDoubleCapsStrings.begin(); i != rArrays.aDoubleCapsStrings.end(); ++i)
1589 0 : m_pDoubleCapsLB->InsertEntry(*i);
1590 : }
1591 : else
1592 : {
1593 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
1594 0 : const SvStringsISortDtor* pCplList = pAutoCorrect->GetCplSttExceptList(eLang);
1595 0 : const SvStringsISortDtor* pWrdList = pAutoCorrect->GetWrdSttExceptList(eLang);
1596 : sal_uInt16 i;
1597 0 : for( i = 0; i < pCplList->size(); i++ )
1598 : {
1599 0 : m_pAbbrevLB->InsertEntry(*(*pCplList)[i]);
1600 : }
1601 0 : for( i = 0; i < pWrdList->size(); i++ )
1602 : {
1603 0 : m_pDoubleCapsLB->InsertEntry(*(*pWrdList)[i]);
1604 : }
1605 0 : }
1606 0 : }
1607 :
1608 0 : void OfaAutocorrExceptPage::Reset( const SfxItemSet& )
1609 : {
1610 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
1611 0 : RefillReplaceBoxes(sal_True, eLang, eLang);
1612 0 : m_pAutoAbbrevCB-> Check( pAutoCorrect->IsAutoCorrFlag( SaveWordCplSttLst ));
1613 0 : m_pAutoCapsCB-> Check( pAutoCorrect->IsAutoCorrFlag( SaveWordWrdSttLst ));
1614 0 : m_pAutoAbbrevCB->SaveValue();
1615 0 : m_pAutoCapsCB->SaveValue();
1616 0 : }
1617 :
1618 0 : IMPL_LINK(OfaAutocorrExceptPage, NewDelHdl, PushButton*, pBtn)
1619 : {
1620 0 : if((pBtn == m_pNewAbbrevPB || pBtn == (PushButton*)m_pAbbrevED )
1621 0 : && !m_pAbbrevED->GetText().isEmpty())
1622 : {
1623 0 : m_pAbbrevLB->InsertEntry(m_pAbbrevED->GetText());
1624 0 : ModifyHdl(m_pAbbrevED);
1625 : }
1626 0 : else if(pBtn == m_pDelAbbrevPB)
1627 : {
1628 0 : m_pAbbrevLB->RemoveEntry(m_pAbbrevED->GetText());
1629 0 : ModifyHdl(m_pAbbrevED);
1630 : }
1631 0 : else if((pBtn == m_pNewDoublePB || pBtn == (PushButton*)m_pDoubleCapsED )
1632 0 : && !m_pDoubleCapsED->GetText().isEmpty())
1633 : {
1634 0 : m_pDoubleCapsLB->InsertEntry(m_pDoubleCapsED->GetText());
1635 0 : ModifyHdl(m_pDoubleCapsED);
1636 : }
1637 0 : else if(pBtn == m_pDelDoublePB)
1638 : {
1639 0 : m_pDoubleCapsLB->RemoveEntry(m_pDoubleCapsED->GetText());
1640 0 : ModifyHdl(m_pDoubleCapsED);
1641 : }
1642 0 : return 0;
1643 : }
1644 :
1645 0 : IMPL_LINK(OfaAutocorrExceptPage, SelectHdl, ListBox*, pBox)
1646 : {
1647 0 : if (pBox == m_pAbbrevLB)
1648 : {
1649 0 : m_pAbbrevED->SetText(pBox->GetSelectEntry());
1650 0 : m_pNewAbbrevPB->Enable(sal_False);
1651 0 : m_pDelAbbrevPB->Enable();
1652 : }
1653 : else
1654 : {
1655 0 : m_pDoubleCapsED->SetText(pBox->GetSelectEntry());
1656 0 : m_pNewDoublePB->Enable(sal_False);
1657 0 : m_pDelDoublePB->Enable();
1658 : }
1659 0 : return 0;
1660 : }
1661 :
1662 0 : IMPL_LINK(OfaAutocorrExceptPage, ModifyHdl, Edit*, pEdt)
1663 : {
1664 : // sal_Bool bSame = pEdt->GetText() == ->GetSelectEntry();
1665 0 : const String& sEntry = pEdt->GetText();
1666 0 : sal_Bool bEntryLen = 0!= sEntry.Len();
1667 0 : if(pEdt == m_pAbbrevED)
1668 : {
1669 0 : sal_Bool bSame = lcl_FindEntry(*m_pAbbrevLB, sEntry, *pCompareClass);
1670 0 : if(bSame && sEntry != m_pAbbrevLB->GetSelectEntry())
1671 0 : pEdt->SetText(m_pAbbrevLB->GetSelectEntry());
1672 0 : m_pNewAbbrevPB->Enable(!bSame && bEntryLen);
1673 0 : m_pDelAbbrevPB->Enable(bSame && bEntryLen);
1674 : }
1675 : else
1676 : {
1677 0 : sal_Bool bSame = lcl_FindEntry(*m_pDoubleCapsLB, sEntry, *pCompareClass);
1678 0 : if(bSame && sEntry != m_pDoubleCapsLB->GetSelectEntry())
1679 0 : pEdt->SetText(m_pDoubleCapsLB->GetSelectEntry());
1680 0 : m_pNewDoublePB->Enable(!bSame && bEntryLen);
1681 0 : m_pDelDoublePB->Enable(bSame && bEntryLen);
1682 : }
1683 0 : return 0;
1684 : }
1685 :
1686 0 : extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeAutoCorrEdit(Window *pParent,
1687 : VclBuilder::stringmap &)
1688 : {
1689 0 : return new AutoCorrEdit(pParent);
1690 : }
1691 :
1692 0 : void AutoCorrEdit::KeyInput( const KeyEvent& rKEvt )
1693 : {
1694 0 : const KeyCode aKeyCode = rKEvt.GetKeyCode();
1695 0 : const sal_uInt16 nModifier = aKeyCode.GetModifier();
1696 0 : if( aKeyCode.GetCode() == KEY_RETURN )
1697 : {
1698 : // if there's nothing done on enter, call the
1699 : // base class after all to close the dialog
1700 0 : if(!nModifier && !aActionLink.Call(this))
1701 0 : Edit::KeyInput(rKEvt);
1702 : }
1703 0 : else if(bSpaces || aKeyCode.GetCode() != KEY_SPACE)
1704 0 : Edit::KeyInput(rKEvt);
1705 0 : }
1706 :
1707 : enum OfaQuoteOptions
1708 : {
1709 : ADD_NONBRK_SPACE,
1710 : REPLACE_1ST
1711 : };
1712 :
1713 0 : SvTreeListEntry* OfaQuoteTabPage::CreateEntry(String& rTxt, sal_uInt16 nCol)
1714 : {
1715 0 : SvTreeListEntry* pEntry = new SvTreeListEntry;
1716 :
1717 0 : if ( !pCheckButtonData )
1718 : {
1719 0 : pCheckButtonData = new SvLBoxButtonData( &aSwCheckLB );
1720 0 : aSwCheckLB.SetCheckButtonData( pCheckButtonData );
1721 : }
1722 :
1723 0 : pEntry->AddItem( new SvLBoxContextBmp( pEntry, 0, Image(), Image(), 0));
1724 :
1725 0 : String sEmpty;
1726 0 : if (nCol == CBCOL_SECOND)
1727 0 : pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );
1728 : else
1729 0 : pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );
1730 :
1731 0 : if (nCol == CBCOL_FIRST)
1732 0 : pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );
1733 : else
1734 0 : pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );
1735 :
1736 0 : pEntry->AddItem( new OfaImpBrwString( pEntry, 0, rTxt ) );
1737 :
1738 0 : return pEntry;
1739 : }
1740 :
1741 0 : OfaQuoteTabPage::OfaQuoteTabPage( Window* pParent, const SfxItemSet& rSet ) :
1742 0 : SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCORR_QUOTE ), rSet),
1743 0 : aCheckLB (this, CUI_RES(CLB_SETTINGS )),
1744 0 : m_aSwCheckLBContainer(this, CUI_RES(CLB_SETTINGS)),
1745 : aSwCheckLB(m_aSwCheckLBContainer),
1746 0 : sHeader1 (CUI_RES( STR_HEADER1 )),
1747 0 : sHeader2 (CUI_RES( STR_HEADER2 )),
1748 0 : sNonBrkSpace (CUI_RES( ST_NON_BREAK_SPACE )),
1749 0 : sOrdinal (CUI_RES( ST_ORDINAL )),
1750 : pCheckButtonData ( NULL ),
1751 :
1752 0 : aSingleFL (this, CUI_RES(FL_SINGLE )),
1753 0 : aSingleTypoCB (this, CUI_RES(CB_SGL_TYPO )),
1754 0 : aSglStartQuoteFT (this, CUI_RES(FT_SGL_STARTQUOTE )),
1755 0 : aSglStartQuotePB (this, CUI_RES(PB_SGL_STARTQUOTE )),
1756 0 : aSglStartExFT (this, CUI_RES(FT_SGSTEX )),
1757 0 : aSglEndQuoteFT (this, CUI_RES(FT_SGL_ENDQUOTE )),
1758 0 : aSglEndQuotePB (this, CUI_RES(PB_SGL_ENDQUOTE )),
1759 0 : aSglEndExFT (this, CUI_RES(FT_SGENEX )),
1760 0 : aSglStandardPB (this, CUI_RES(PB_SGL_STD )),
1761 :
1762 0 : aDoubleFL (this, CUI_RES(FL_DOUBLE )),
1763 0 : aTypoCB (this, CUI_RES(CB_TYPO )),
1764 0 : aStartQuoteFT (this, CUI_RES(FT_STARTQUOTE )),
1765 0 : aStartQuotePB (this, CUI_RES(PB_STARTQUOTE )),
1766 0 : aDblStartExFT (this, CUI_RES(FT_DBSTEX )),
1767 0 : aEndQuoteFT (this, CUI_RES(FT_ENDQUOTE )),
1768 0 : aEndQuotePB (this, CUI_RES(PB_ENDQUOTE )),
1769 0 : aDblEndExFT (this, CUI_RES(FT_DBECEX )),
1770 0 : aDblStandardPB (this, CUI_RES(PB_DBL_STD )),
1771 :
1772 0 : sStartQuoteDlg (CUI_RES(STR_CHANGE_START)),
1773 0 : sEndQuoteDlg (CUI_RES(STR_CHANGE_END)),
1774 :
1775 0 : sStandard(CUI_RES(ST_STANDARD))
1776 : {
1777 0 : aSglStandardPB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_STD) ) );
1778 0 : aDblStandardPB.SetAccessibleName(String(CUI_RES(STR_PB_DBL_STD) ) );
1779 0 : aStartQuotePB.SetAccessibleName( String(CUI_RES(STR_PB_DBL_START) ));
1780 0 : aEndQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_DBL_END) ));
1781 0 : aSglStartQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_START) ));
1782 0 : aSglEndQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_END) ) );
1783 :
1784 0 : FreeResource();
1785 :
1786 0 : sal_Bool bShowSWOptions = sal_False;
1787 :
1788 0 : aCheckLB.SetHelpId( HID_OFAPAGE_QUOTE_CLB );
1789 0 : aSwCheckLB.SetHelpId( HID_OFAPAGE_QUOTE_SW_CLB );
1790 :
1791 0 : SFX_ITEMSET_ARG( &rSet, pItem, SfxBoolItem, SID_AUTO_CORRECT_DLG, sal_False );
1792 0 : if ( pItem && pItem->GetValue() )
1793 0 : bShowSWOptions = sal_True;
1794 :
1795 0 : if ( bShowSWOptions )
1796 : {
1797 : static long aStaticTabs[]=
1798 : {
1799 : 3, 0, 20, 40
1800 : };
1801 :
1802 0 : aSwCheckLB.SetStyle(aSwCheckLB.GetStyle() | WB_HSCROLL| WB_VSCROLL);
1803 :
1804 0 : aSwCheckLB.SvxSimpleTable::SetTabs(aStaticTabs);
1805 0 : String sHeader( sHeader1 );
1806 0 : sHeader += '\t';
1807 0 : sHeader += sHeader2;
1808 0 : sHeader += '\t';
1809 : aSwCheckLB.InsertHeaderEntry( sHeader, HEADERBAR_APPEND,
1810 0 : HIB_CENTER | HIB_VCENTER | HIB_FIXEDPOS | HIB_FIXED);
1811 0 : aCheckLB.Hide( sal_True );
1812 : }
1813 : else
1814 : {
1815 0 : aSwCheckLB.HideTable( );
1816 : }
1817 :
1818 0 : aStartQuotePB.SetClickHdl(LINK(this, OfaQuoteTabPage, QuoteHdl));
1819 0 : aEndQuotePB.SetClickHdl(LINK(this, OfaQuoteTabPage, QuoteHdl));
1820 0 : aSglStartQuotePB.SetClickHdl(LINK(this, OfaQuoteTabPage, QuoteHdl));
1821 0 : aSglEndQuotePB.SetClickHdl(LINK(this, OfaQuoteTabPage, QuoteHdl));
1822 0 : aDblStandardPB.SetClickHdl(LINK(this, OfaQuoteTabPage, StdQuoteHdl));
1823 0 : aSglStandardPB.SetClickHdl(LINK(this, OfaQuoteTabPage, StdQuoteHdl));
1824 :
1825 0 : aSglStartQuotePB.SetAccessibleRelationLabeledBy( &aSglStartQuoteFT );
1826 0 : aSglEndQuotePB.SetAccessibleRelationLabeledBy( &aSglEndQuoteFT );
1827 0 : aSglStartQuotePB.SetAccessibleRelationMemberOf( &aSingleFL );
1828 0 : aSglEndQuotePB.SetAccessibleRelationMemberOf( &aSingleFL );
1829 0 : aStartQuotePB.SetAccessibleRelationLabeledBy( &aStartQuoteFT );
1830 0 : aEndQuotePB.SetAccessibleRelationLabeledBy( &aEndQuoteFT );
1831 0 : aStartQuotePB.SetAccessibleRelationMemberOf( &aDoubleFL );
1832 0 : aEndQuotePB.SetAccessibleRelationMemberOf( &aDoubleFL );
1833 0 : aSglStandardPB.SetAccessibleRelationMemberOf(&aSingleFL);
1834 0 : aDblStandardPB.SetAccessibleRelationMemberOf(&aDoubleFL);
1835 0 : }
1836 :
1837 0 : OfaQuoteTabPage::~OfaQuoteTabPage()
1838 : {
1839 0 : delete( pCheckButtonData );
1840 0 : }
1841 :
1842 0 : SfxTabPage* OfaQuoteTabPage::Create( Window* pParent,
1843 : const SfxItemSet& rAttrSet)
1844 : {
1845 0 : return new OfaQuoteTabPage(pParent, rAttrSet);
1846 : }
1847 :
1848 0 : sal_Bool OfaQuoteTabPage::FillItemSet( SfxItemSet& )
1849 : {
1850 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
1851 :
1852 0 : long nFlags = pAutoCorrect->GetFlags();
1853 :
1854 0 : if ( aCheckLB.IsVisible( ) )
1855 : {
1856 0 : sal_uInt16 nPos = 0;
1857 0 : pAutoCorrect->SetAutoCorrFlag(AddNonBrkSpace, aCheckLB.IsChecked(nPos++));
1858 0 : pAutoCorrect->SetAutoCorrFlag(ChgOrdinalNumber, aCheckLB.IsChecked(nPos++));
1859 : }
1860 :
1861 0 : sal_Bool bModified = sal_False;
1862 0 : if ( aSwCheckLB.IsVisible( ) )
1863 : {
1864 0 : SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
1865 :
1866 0 : sal_Bool bCheck = aSwCheckLB.IsChecked(ADD_NONBRK_SPACE, CBCOL_FIRST);
1867 0 : bModified |= pOpt->bAddNonBrkSpace != bCheck;
1868 0 : pOpt->bAddNonBrkSpace = bCheck;
1869 : pAutoCorrect->SetAutoCorrFlag(AddNonBrkSpace,
1870 0 : aSwCheckLB.IsChecked(ADD_NONBRK_SPACE, CBCOL_SECOND));
1871 :
1872 0 : bCheck = aSwCheckLB.IsChecked(REPLACE_1ST, CBCOL_FIRST);
1873 0 : bModified |= pOpt->bChgOrdinalNumber != bCheck;
1874 0 : pOpt->bChgOrdinalNumber = bCheck;
1875 : pAutoCorrect->SetAutoCorrFlag(ChgOrdinalNumber,
1876 0 : aSwCheckLB.IsChecked(REPLACE_1ST, CBCOL_SECOND));
1877 : }
1878 :
1879 0 : pAutoCorrect->SetAutoCorrFlag(ChgQuotes, aTypoCB.IsChecked());
1880 0 : pAutoCorrect->SetAutoCorrFlag(ChgSglQuotes, aSingleTypoCB.IsChecked());
1881 0 : sal_Bool bReturn = nFlags != pAutoCorrect->GetFlags();
1882 0 : if(cStartQuote != pAutoCorrect->GetStartDoubleQuote())
1883 : {
1884 0 : bReturn = sal_True;
1885 0 : sal_Unicode cUCS2 = static_cast<sal_Unicode>(cStartQuote); //TODO
1886 0 : pAutoCorrect->SetStartDoubleQuote(cUCS2);
1887 : }
1888 0 : if(cEndQuote != pAutoCorrect->GetEndDoubleQuote())
1889 : {
1890 0 : bReturn = sal_True;
1891 0 : sal_Unicode cUCS2 = static_cast<sal_Unicode>(cEndQuote); //TODO
1892 0 : pAutoCorrect->SetEndDoubleQuote(cUCS2);
1893 : }
1894 0 : if(cSglStartQuote != pAutoCorrect->GetStartSingleQuote())
1895 : {
1896 0 : bReturn = sal_True;
1897 0 : sal_Unicode cUCS2 = static_cast<sal_Unicode>(cSglStartQuote); //TODO
1898 0 : pAutoCorrect->SetStartSingleQuote(cUCS2);
1899 : }
1900 0 : if(cSglEndQuote != pAutoCorrect->GetEndSingleQuote())
1901 : {
1902 0 : bReturn = sal_True;
1903 0 : sal_Unicode cUCS2 = static_cast<sal_Unicode>(cSglEndQuote); //TODO
1904 0 : pAutoCorrect->SetEndSingleQuote(cUCS2);
1905 : }
1906 :
1907 0 : if( bModified || bReturn )
1908 : {
1909 0 : SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
1910 0 : rCfg.SetModified();
1911 0 : rCfg.Commit();
1912 : }
1913 0 : return bReturn;
1914 : }
1915 :
1916 0 : void OfaQuoteTabPage::ActivatePage( const SfxItemSet& )
1917 : {
1918 0 : ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_False);
1919 0 : }
1920 :
1921 0 : void OfaQuoteTabPage::Reset( const SfxItemSet& )
1922 : {
1923 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
1924 0 : const long nFlags = pAutoCorrect->GetFlags();
1925 :
1926 : // Initialize the Sw options
1927 0 : if ( aSwCheckLB.IsVisible( ) )
1928 : {
1929 0 : SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
1930 :
1931 0 : aSwCheckLB.SetUpdateMode( sal_False );
1932 0 : aSwCheckLB.Clear();
1933 :
1934 0 : aSwCheckLB.GetModel()->Insert(CreateEntry(sNonBrkSpace, CBCOL_BOTH ));
1935 0 : aSwCheckLB.GetModel()->Insert(CreateEntry(sOrdinal, CBCOL_BOTH ));
1936 :
1937 0 : aSwCheckLB.CheckEntryPos( ADD_NONBRK_SPACE, CBCOL_FIRST, pOpt->bAddNonBrkSpace );
1938 0 : aSwCheckLB.CheckEntryPos( ADD_NONBRK_SPACE, CBCOL_SECOND, 0 != (nFlags & AddNonBrkSpace) );
1939 0 : aSwCheckLB.CheckEntryPos( REPLACE_1ST, CBCOL_FIRST, pOpt->bChgOrdinalNumber );
1940 0 : aSwCheckLB.CheckEntryPos( REPLACE_1ST, CBCOL_SECOND, 0 != (nFlags & ChgOrdinalNumber) );
1941 :
1942 0 : aSwCheckLB.SetUpdateMode( sal_True );
1943 : }
1944 :
1945 : // Initialize the non Sw options
1946 0 : if ( aCheckLB.IsVisible( ) )
1947 : {
1948 0 : aCheckLB.SetUpdateMode( sal_False );
1949 0 : aCheckLB.Clear( );
1950 :
1951 0 : aCheckLB.InsertEntry( sNonBrkSpace );
1952 0 : aCheckLB.InsertEntry( sOrdinal );
1953 :
1954 0 : sal_uInt16 nPos = 0;
1955 0 : aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & AddNonBrkSpace) );
1956 0 : aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & ChgOrdinalNumber) );
1957 :
1958 0 : aCheckLB.SetUpdateMode( sal_True );
1959 : }
1960 :
1961 : // Initialize the quote stuffs
1962 0 : aTypoCB .Check(0 != (nFlags & ChgQuotes));
1963 0 : aSingleTypoCB .Check(0 != (nFlags & ChgSglQuotes));
1964 0 : aTypoCB .SaveValue();
1965 0 : aSingleTypoCB .SaveValue();
1966 :
1967 0 : cStartQuote = pAutoCorrect->GetStartDoubleQuote();
1968 0 : cEndQuote = pAutoCorrect->GetEndDoubleQuote();
1969 0 : cSglStartQuote = pAutoCorrect->GetStartSingleQuote();
1970 0 : cSglEndQuote = pAutoCorrect->GetEndSingleQuote();
1971 :
1972 0 : aSglStartExFT .SetText(ChangeStringExt_Impl(cSglStartQuote));
1973 0 : aSglEndExFT .SetText(ChangeStringExt_Impl(cSglEndQuote));
1974 0 : aDblStartExFT .SetText(ChangeStringExt_Impl(cStartQuote));
1975 0 : aDblEndExFT .SetText(ChangeStringExt_Impl(cEndQuote));
1976 0 : }
1977 :
1978 : #define SGL_START 0
1979 : #define DBL_START 1
1980 : #define SGL_END 2
1981 : #define DBL_END 3
1982 :
1983 :
1984 0 : IMPL_LINK( OfaQuoteTabPage, QuoteHdl, PushButton*, pBtn )
1985 : {
1986 0 : sal_uInt16 nMode = SGL_START;
1987 0 : if(pBtn == &aSglEndQuotePB)
1988 0 : nMode = SGL_END;
1989 0 : else if(pBtn == &aStartQuotePB)
1990 0 : nMode = DBL_START;
1991 0 : else if(pBtn == &aEndQuotePB)
1992 0 : nMode = DBL_END;
1993 : // start character selection dialog
1994 0 : SvxCharacterMap* pMap = new SvxCharacterMap( this, sal_True );
1995 : pMap->SetCharFont( OutputDevice::GetDefaultFont(DEFAULTFONT_LATIN_TEXT,
1996 0 : LANGUAGE_ENGLISH_US, DEFAULTFONT_FLAGS_ONLYONE, 0 ));
1997 0 : pMap->SetText(nMode < SGL_END ? sStartQuoteDlg : sEndQuoteDlg );
1998 : sal_UCS4 cDlg;
1999 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
2000 0 : LanguageType eLang = Application::GetSettings().GetLanguageTag().getLanguageType();
2001 0 : switch( nMode )
2002 : {
2003 : case SGL_START:
2004 0 : cDlg = cSglStartQuote;
2005 0 : if(cDlg == 0)
2006 0 : cDlg = pAutoCorrect->GetQuote('\'', sal_True, eLang);
2007 0 : break;
2008 : case SGL_END:
2009 0 : cDlg = cSglEndQuote;
2010 0 : if(cDlg == 0)
2011 0 : cDlg = pAutoCorrect->GetQuote('\'', sal_False, eLang);
2012 0 : break;
2013 : case DBL_START:
2014 0 : cDlg = cStartQuote;
2015 0 : if(cDlg == 0)
2016 0 : cDlg = pAutoCorrect->GetQuote('\"', sal_True, eLang);
2017 0 : break;
2018 : case DBL_END:
2019 0 : cDlg = cEndQuote;
2020 0 : if(cDlg == 0)
2021 0 : cDlg = pAutoCorrect->GetQuote('\"', sal_False, eLang);
2022 0 : break;
2023 : default:
2024 : OSL_FAIL("svx::OfaQuoteTabPage::QuoteHdl(), how to initialize cDlg?" );
2025 0 : cDlg = 0;
2026 0 : break;
2027 :
2028 : }
2029 0 : pMap->SetChar( cDlg );
2030 0 : pMap->DisableFontSelection();
2031 0 : if(pMap->Execute() == RET_OK)
2032 : {
2033 0 : sal_UCS4 cNewChar = pMap->GetChar();
2034 0 : switch( nMode )
2035 : {
2036 : case SGL_START:
2037 0 : cSglStartQuote = cNewChar;
2038 0 : aSglStartExFT.SetText(ChangeStringExt_Impl(cNewChar));
2039 0 : break;
2040 : case SGL_END:
2041 0 : cSglEndQuote = cNewChar;
2042 0 : aSglEndExFT.SetText(ChangeStringExt_Impl(cNewChar));
2043 0 : break;
2044 : case DBL_START:
2045 0 : cStartQuote = cNewChar;
2046 0 : aDblStartExFT.SetText(ChangeStringExt_Impl(cNewChar));
2047 0 : break;
2048 : case DBL_END:
2049 0 : cEndQuote = cNewChar;
2050 0 : aDblEndExFT.SetText(ChangeStringExt_Impl(cNewChar));
2051 0 : break;
2052 : }
2053 : }
2054 0 : delete pMap;
2055 :
2056 0 : return 0;
2057 : }
2058 :
2059 0 : IMPL_LINK( OfaQuoteTabPage, StdQuoteHdl, PushButton*, pBtn )
2060 : {
2061 0 : if(pBtn == &aDblStandardPB)
2062 : {
2063 0 : cStartQuote = 0;
2064 0 : aDblStartExFT.SetText(ChangeStringExt_Impl(0));
2065 0 : cEndQuote = 0;
2066 0 : aDblEndExFT.SetText(ChangeStringExt_Impl(0));
2067 :
2068 : }
2069 : else
2070 : {
2071 0 : cSglStartQuote = 0;
2072 0 : aSglStartExFT.SetText(ChangeStringExt_Impl(0));
2073 0 : cSglEndQuote = 0;
2074 0 : aSglEndExFT.SetText(ChangeStringExt_Impl(0));
2075 : }
2076 0 : return 0;
2077 : }
2078 :
2079 : // --------------------------------------------------
2080 :
2081 0 : String OfaQuoteTabPage::ChangeStringExt_Impl( sal_UCS4 cChar )
2082 : {
2083 0 : if( !cChar )
2084 0 : return sStandard;
2085 :
2086 : // convert codepoint value to unicode-hex string
2087 0 : sal_UCS4 aStrCodes[32] = { 0, ' ', '(', 'U', '+', '0' };
2088 0 : aStrCodes[0] = cChar;
2089 0 : int nFullLen = 5;
2090 0 : int nHexLen = 4;
2091 0 : while( (cChar >> (4*nHexLen)) != 0 )
2092 0 : ++nHexLen;
2093 0 : for( int i = nHexLen; --i >= 0;)
2094 : {
2095 0 : sal_UCS4 cHexDigit = ((cChar >> (4*i)) & 0x0f) + '0';
2096 0 : if( cHexDigit > '9' )
2097 0 : cHexDigit += 'A' - ('9' + 1);
2098 0 : aStrCodes[ nFullLen++ ] = cHexDigit;
2099 : }
2100 0 : aStrCodes[ nFullLen++ ] = ')';
2101 : // using the new UCS4 constructor
2102 0 : OUString aOUStr( aStrCodes, nFullLen );
2103 0 : return aOUStr;
2104 : }
2105 :
2106 0 : OfaAutoCompleteTabPage::OfaAutoCompleteTabPage( Window* pParent,
2107 : const SfxItemSet& rSet )
2108 0 : : SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCOMPLETE_OPTIONS ), rSet),
2109 0 : aCBActiv (this, CUI_RES(CB_ACTIV)),
2110 0 : aCBAppendSpace (this, CUI_RES(CB_APPEND_SPACE)),
2111 0 : aCBAsTip (this, CUI_RES(CB_AS_TIP)),
2112 0 : aCBCollect (this, CUI_RES(CB_COLLECT)),
2113 0 : aCBRemoveList (this, CUI_RES(CB_REMOVE_LIST)),
2114 0 : aFTExpandKey (this, CUI_RES(FT_EXPAND_KEY)),
2115 0 : aDCBExpandKey (this, CUI_RES(DCB_EXPAND_KEY)),
2116 0 : aFTMinWordlen (this, CUI_RES(FT_MIN_WORDLEN)),
2117 0 : aNFMinWordlen (this, CUI_RES(NF_MIN_WORDLEN)),
2118 0 : aFTMaxEntries (this, CUI_RES(FT_MAX_ENTRIES)),
2119 0 : aNFMaxEntries (this, CUI_RES(NF_MAX_ENTRIES)),
2120 0 : aLBEntries (*this, CUI_RES(LB_ENTRIES)),
2121 0 : aPBEntries (this, CUI_RES(PB_ENTRIES)),
2122 : m_pAutoCompleteList( 0 ),
2123 0 : nAutoCmpltListCnt( 0 )
2124 : {
2125 0 : FreeResource();
2126 :
2127 : // the defined KEYs
2128 : static const sal_uInt16 aKeyCodes[] = {
2129 : KEY_END,
2130 : KEY_RETURN,
2131 : KEY_SPACE,
2132 : KEY_RIGHT,
2133 : KEY_TAB,
2134 : 0
2135 : };
2136 :
2137 0 : for( const sal_uInt16* pKeys = aKeyCodes; *pKeys; ++pKeys )
2138 : {
2139 0 : KeyCode aKCode( *pKeys );
2140 0 : sal_uInt16 nPos = aDCBExpandKey.InsertEntry( aKCode.GetName() );
2141 0 : aDCBExpandKey.SetEntryData( nPos, (void*)(sal_uLong)*pKeys );
2142 0 : if( KEY_RETURN == *pKeys ) // default to RETURN
2143 0 : aDCBExpandKey.SelectEntryPos( nPos );
2144 : }
2145 :
2146 0 : aPBEntries.SetClickHdl(LINK(this, OfaAutoCompleteTabPage, DeleteHdl));
2147 0 : aCBActiv.SetToggleHdl(LINK(this, OfaAutoCompleteTabPage, CheckHdl));
2148 0 : aCBCollect.SetToggleHdl(LINK(this, OfaAutoCompleteTabPage, CheckHdl));
2149 0 : aLBEntries.SetAccessibleRelationLabeledBy(&aLBEntries);
2150 0 : }
2151 :
2152 0 : OfaAutoCompleteTabPage::~OfaAutoCompleteTabPage()
2153 : {
2154 0 : }
2155 :
2156 0 : SfxTabPage* OfaAutoCompleteTabPage::Create( Window* pParent,
2157 : const SfxItemSet& rSet)
2158 : {
2159 0 : return new OfaAutoCompleteTabPage( pParent, rSet );
2160 : }
2161 :
2162 0 : sal_Bool OfaAutoCompleteTabPage::FillItemSet( SfxItemSet& )
2163 : {
2164 0 : sal_Bool bModified = sal_False, bCheck;
2165 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
2166 0 : SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
2167 : sal_uInt16 nVal;
2168 :
2169 0 : bCheck = aCBActiv.IsChecked();
2170 0 : bModified |= pOpt->bAutoCompleteWords != bCheck;
2171 0 : pOpt->bAutoCompleteWords = bCheck;
2172 0 : bCheck = aCBCollect.IsChecked();
2173 0 : bModified |= pOpt->bAutoCmpltCollectWords != bCheck;
2174 0 : pOpt->bAutoCmpltCollectWords = bCheck;
2175 0 : bCheck = !aCBRemoveList.IsChecked(); // inverted value!
2176 0 : bModified |= pOpt->bAutoCmpltKeepList != bCheck;
2177 0 : pOpt->bAutoCmpltKeepList = bCheck;
2178 0 : bCheck = aCBAppendSpace.IsChecked();
2179 0 : bModified |= pOpt->bAutoCmpltAppendBlanc != bCheck;
2180 0 : pOpt->bAutoCmpltAppendBlanc = bCheck;
2181 0 : bCheck = aCBAsTip.IsChecked();
2182 0 : bModified |= pOpt->bAutoCmpltShowAsTip != bCheck;
2183 0 : pOpt->bAutoCmpltShowAsTip = bCheck;
2184 :
2185 0 : nVal = (sal_uInt16)aNFMinWordlen.GetValue();
2186 0 : bModified |= nVal != pOpt->nAutoCmpltWordLen;
2187 0 : pOpt->nAutoCmpltWordLen = nVal;
2188 :
2189 0 : nVal = (sal_uInt16)aNFMaxEntries.GetValue();
2190 0 : bModified |= nVal != pOpt->nAutoCmpltListLen;
2191 0 : pOpt->nAutoCmpltListLen = nVal;
2192 :
2193 0 : nVal = aDCBExpandKey.GetSelectEntryPos();
2194 0 : if( nVal < aDCBExpandKey.GetEntryCount() )
2195 : {
2196 0 : sal_uLong nKey = (sal_uLong)aDCBExpandKey.GetEntryData( nVal );
2197 0 : bModified |= nKey != pOpt->nAutoCmpltExpandKey;
2198 0 : pOpt->nAutoCmpltExpandKey = (sal_uInt16)nKey;
2199 : }
2200 :
2201 0 : if (m_pAutoCompleteList && nAutoCmpltListCnt != aLBEntries.GetEntryCount())
2202 : {
2203 0 : bModified = sal_True;
2204 0 : pOpt->m_pAutoCompleteList = m_pAutoCompleteList;
2205 : }
2206 0 : if( bModified )
2207 : {
2208 0 : SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
2209 0 : rCfg.SetModified();
2210 0 : rCfg.Commit();
2211 : }
2212 0 : return sal_True;
2213 : }
2214 :
2215 0 : void OfaAutoCompleteTabPage::Reset( const SfxItemSet& )
2216 : {
2217 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
2218 0 : SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
2219 :
2220 0 : aCBActiv.Check( 0 != pOpt->bAutoCompleteWords );
2221 0 : aCBCollect.Check( 0 != pOpt->bAutoCmpltCollectWords );
2222 0 : aCBRemoveList.Check( !pOpt->bAutoCmpltKeepList ); //inverted value!
2223 0 : aCBAppendSpace.Check( 0 != pOpt->bAutoCmpltAppendBlanc );
2224 0 : aCBAsTip.Check( 0 != pOpt->bAutoCmpltShowAsTip );
2225 :
2226 0 : aNFMinWordlen.SetValue( pOpt->nAutoCmpltWordLen );
2227 0 : aNFMaxEntries.SetValue( pOpt->nAutoCmpltListLen );
2228 :
2229 : // select the specific KeyCode:
2230 : {
2231 0 : sal_uLong nKey = pOpt->nAutoCmpltExpandKey;
2232 0 : for( sal_uInt16 n = 0, nCnt = aDCBExpandKey.GetEntryCount(); n < nCnt; ++n )
2233 0 : if( nKey == (sal_uLong)aDCBExpandKey.GetEntryData( n ))
2234 : {
2235 0 : aDCBExpandKey.SelectEntryPos( n );
2236 0 : break;
2237 : }
2238 : }
2239 :
2240 0 : if (pOpt->m_pAutoCompleteList && pOpt->m_pAutoCompleteList->size())
2241 : {
2242 : m_pAutoCompleteList = const_cast<editeng::SortedAutoCompleteStrings*>(
2243 0 : pOpt->m_pAutoCompleteList);
2244 0 : pOpt->m_pAutoCompleteList = 0;
2245 0 : nAutoCmpltListCnt = m_pAutoCompleteList->size();
2246 0 : for (size_t n = 0; n < nAutoCmpltListCnt; ++n)
2247 : {
2248 : const String* pStr =
2249 0 : &(*m_pAutoCompleteList)[n]->GetAutoCompleteString();
2250 0 : sal_uInt16 nPos = aLBEntries.InsertEntry( *pStr );
2251 0 : aLBEntries.SetEntryData( nPos, (void*)pStr );
2252 : }
2253 : }
2254 : else
2255 : {
2256 0 : aLBEntries.Disable();
2257 0 : aPBEntries.Disable();
2258 : }
2259 :
2260 0 : CheckHdl( &aCBActiv );
2261 0 : CheckHdl( &aCBCollect );
2262 0 : }
2263 :
2264 0 : void OfaAutoCompleteTabPage::ActivatePage( const SfxItemSet& )
2265 : {
2266 0 : ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage( sal_False );
2267 0 : }
2268 :
2269 0 : IMPL_LINK_NOARG(OfaAutoCompleteTabPage, DeleteHdl)
2270 : {
2271 : sal_uInt16 nSelCnt =
2272 0 : (m_pAutoCompleteList) ? aLBEntries.GetSelectEntryCount() : 0;
2273 0 : while( nSelCnt )
2274 : {
2275 0 : sal_uInt16 nPos = aLBEntries.GetSelectEntryPos( --nSelCnt );
2276 0 : String* pStr = static_cast<String*>(aLBEntries.GetEntryData(nPos));
2277 0 : aLBEntries.RemoveEntry( nPos );
2278 0 : editeng::IAutoCompleteString hack(*pStr); // UGLY
2279 0 : m_pAutoCompleteList->erase(&hack);
2280 0 : }
2281 0 : return 0;
2282 : }
2283 :
2284 0 : IMPL_LINK( OfaAutoCompleteTabPage, CheckHdl, CheckBox*, pBox )
2285 : {
2286 0 : sal_Bool bEnable = pBox->IsChecked();
2287 0 : if( pBox == &aCBActiv )
2288 : {
2289 0 : aCBAppendSpace.Enable( bEnable );
2290 0 : aCBAppendSpace.Enable( bEnable );
2291 0 : aCBAsTip.Enable( bEnable );
2292 0 : aDCBExpandKey.Enable( bEnable );
2293 : }
2294 0 : else if(&aCBCollect == pBox)
2295 0 : aCBRemoveList.Enable( bEnable );
2296 0 : return 0;
2297 : }
2298 :
2299 0 : void OfaAutoCompleteTabPage::CopyToClipboard() const
2300 : {
2301 0 : sal_uInt16 nSelCnt = aLBEntries.GetSelectEntryCount();
2302 0 : if (m_pAutoCompleteList && nSelCnt)
2303 : {
2304 0 : TransferDataContainer* pCntnr = new TransferDataContainer;
2305 : ::com::sun::star::uno::Reference<
2306 0 : ::com::sun::star::datatransfer::XTransferable > xRef( pCntnr );
2307 :
2308 0 : OStringBuffer sData;
2309 : const sal_Char aLineEnd[] =
2310 : #if defined(WNT)
2311 : "\015\012";
2312 : #else
2313 0 : "\012";
2314 : #endif
2315 :
2316 0 : rtl_TextEncoding nEncode = osl_getThreadTextEncoding();
2317 :
2318 0 : for( sal_uInt16 n = 0; n < nSelCnt; ++n )
2319 : {
2320 0 : sData.append(OUStringToOString(aLBEntries.GetSelectEntry(n),
2321 0 : nEncode));
2322 0 : sData.append(RTL_CONSTASCII_STRINGPARAM(aLineEnd));
2323 : }
2324 0 : pCntnr->CopyByteString( SOT_FORMAT_STRING, sData.makeStringAndClear() );
2325 0 : pCntnr->CopyToClipboard( (Window*)this );
2326 : }
2327 0 : }
2328 :
2329 0 : long OfaAutoCompleteTabPage::AutoCompleteMultiListBox::PreNotify(
2330 : NotifyEvent& rNEvt )
2331 : {
2332 0 : long nHandled = MultiListBox::PreNotify( rNEvt );
2333 :
2334 0 : if( !nHandled && EVENT_KEYUP == rNEvt.GetType() )
2335 : {
2336 0 : const KeyCode& rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
2337 0 : switch( rKeyCode.GetModifier() | rKeyCode.GetCode() )
2338 : {
2339 : case KEY_DELETE:
2340 0 : rPage.DeleteHdl( 0 );
2341 0 : nHandled = 1;
2342 0 : break;
2343 :
2344 : default:
2345 0 : if( KEYFUNC_COPY == rKeyCode.GetFunction() )
2346 : {
2347 0 : rPage.CopyToClipboard();
2348 0 : nHandled = 1;
2349 : }
2350 0 : break;
2351 : }
2352 : }
2353 0 : return nHandled;
2354 : }
2355 :
2356 : // class OfaSmartTagOptionsTabPage ---------------------------------------------
2357 :
2358 0 : OfaSmartTagOptionsTabPage::OfaSmartTagOptionsTabPage( Window* pParent,
2359 : const SfxItemSet& rSet )
2360 0 : : SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_SMARTTAG_OPTIONS ), rSet),
2361 0 : m_aMainCB( this, CUI_RES(CB_SMARTTAGS) ),
2362 0 : m_aSmartTagTypesLB( this, CUI_RES(LB_SMARTTAGS) ),
2363 0 : m_aPropertiesPB( this, CUI_RES(PB_SMARTTAGS) ),
2364 0 : m_aTitleFT( this, CUI_RES(FT_SMARTTAGS) )
2365 : {
2366 0 : FreeResource();
2367 :
2368 : // some options for the list box:
2369 0 : m_aSmartTagTypesLB.SetStyle( m_aSmartTagTypesLB.GetStyle() | WB_HSCROLL | WB_HIDESELECTION );
2370 0 : m_aSmartTagTypesLB.SetHighlightRange();
2371 :
2372 : // set the handlers:
2373 0 : m_aMainCB.SetToggleHdl(LINK(this, OfaSmartTagOptionsTabPage, CheckHdl));
2374 0 : m_aPropertiesPB.SetClickHdl(LINK(this, OfaSmartTagOptionsTabPage, ClickHdl));
2375 0 : m_aSmartTagTypesLB.SetSelectHdl(LINK(this, OfaSmartTagOptionsTabPage, SelectHdl));
2376 0 : }
2377 :
2378 0 : OfaSmartTagOptionsTabPage::~OfaSmartTagOptionsTabPage()
2379 : {
2380 :
2381 0 : }
2382 :
2383 0 : SfxTabPage* OfaSmartTagOptionsTabPage::Create( Window* pParent, const SfxItemSet& rSet)
2384 : {
2385 0 : return new OfaSmartTagOptionsTabPage( pParent, rSet );
2386 : }
2387 :
2388 : /** This struct is used to associate list box entries with smart tag data
2389 : */
2390 0 : struct ImplSmartTagLBUserData
2391 : {
2392 : OUString maSmartTagType;
2393 : uno::Reference< smarttags::XSmartTagRecognizer > mxRec;
2394 : sal_Int32 mnSmartTagIdx;
2395 :
2396 0 : ImplSmartTagLBUserData( const OUString& rSmartTagType,
2397 : uno::Reference< smarttags::XSmartTagRecognizer > xRec,
2398 : sal_Int32 nSmartTagIdx ) :
2399 : maSmartTagType( rSmartTagType ),
2400 : mxRec( xRec ),
2401 0 : mnSmartTagIdx( nSmartTagIdx ) {}
2402 : };
2403 :
2404 : /** Clears m_aSmartTagTypesLB
2405 : */
2406 0 : void OfaSmartTagOptionsTabPage::ClearListBox()
2407 : {
2408 0 : const sal_uLong nCount = m_aSmartTagTypesLB.GetEntryCount();
2409 0 : for ( sal_uInt16 i = 0; i < nCount; ++i )
2410 : {
2411 0 : const SvTreeListEntry* pEntry = m_aSmartTagTypesLB.GetEntry(i);
2412 0 : const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
2413 0 : delete pUserData;
2414 : }
2415 :
2416 0 : m_aSmartTagTypesLB.Clear();
2417 0 : }
2418 :
2419 : /** Inserts items into m_aSmartTagTypesLB
2420 : */
2421 0 : void OfaSmartTagOptionsTabPage::FillListBox( const SmartTagMgr& rSmartTagMgr )
2422 : {
2423 : // first we have to clear the list box:
2424 0 : ClearListBox();
2425 :
2426 : // fill list box:
2427 0 : const sal_uInt32 nNumberOfRecognizers = rSmartTagMgr.NumberOfRecognizers();
2428 0 : const lang::Locale aLocale( LanguageTag( eLastDialogLanguage ).getLocale() );
2429 :
2430 0 : for ( sal_uInt32 i = 0; i < nNumberOfRecognizers; ++i )
2431 : {
2432 0 : uno::Reference< smarttags::XSmartTagRecognizer > xRec = rSmartTagMgr.GetRecognizer(i);
2433 :
2434 0 : const OUString aName = xRec->getName( aLocale );
2435 0 : const sal_Int32 nNumberOfSupportedSmartTags = xRec->getSmartTagCount();
2436 :
2437 0 : for ( sal_Int32 j = 0; j < nNumberOfSupportedSmartTags; ++j )
2438 : {
2439 0 : const OUString aSmartTagType = xRec->getSmartTagName(j);
2440 0 : OUString aSmartTagCaption = rSmartTagMgr.GetSmartTagCaption( aSmartTagType, aLocale );
2441 :
2442 0 : if ( aSmartTagCaption.isEmpty() )
2443 0 : aSmartTagCaption = aSmartTagType;
2444 :
2445 0 : const OUString aLBEntry = aSmartTagCaption +
2446 0 : OUString(" (") +
2447 0 : aName +
2448 0 : OUString(")");
2449 :
2450 0 : SvTreeListEntry* pEntry = m_aSmartTagTypesLB.SvTreeListBox::InsertEntry( aLBEntry );
2451 0 : if ( pEntry )
2452 : {
2453 0 : const bool bCheck = rSmartTagMgr.IsSmartTagTypeEnabled( aSmartTagType );
2454 0 : m_aSmartTagTypesLB.SetCheckButtonState( pEntry, bCheck ? SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED );
2455 0 : pEntry->SetUserData(static_cast<void*>(new ImplSmartTagLBUserData( aSmartTagType, xRec, j ) ) );
2456 : }
2457 0 : }
2458 0 : }
2459 0 : }
2460 :
2461 : /** Handler for the push button
2462 : */
2463 0 : IMPL_LINK_NOARG(OfaSmartTagOptionsTabPage, ClickHdl)
2464 : {
2465 0 : const sal_uInt16 nPos = m_aSmartTagTypesLB.GetSelectEntryPos();
2466 0 : const SvTreeListEntry* pEntry = m_aSmartTagTypesLB.GetEntry(nPos);
2467 0 : const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
2468 0 : uno::Reference< smarttags::XSmartTagRecognizer > xRec = pUserData->mxRec;
2469 0 : const sal_Int32 nSmartTagIdx = pUserData->mnSmartTagIdx;
2470 :
2471 0 : const lang::Locale aLocale( LanguageTag( eLastDialogLanguage ).getLocale() );
2472 0 : if ( xRec->hasPropertyPage( nSmartTagIdx, aLocale ) )
2473 0 : xRec->displayPropertyPage( nSmartTagIdx, aLocale );
2474 :
2475 0 : return 0;
2476 : }
2477 :
2478 : /** Handler for the check box
2479 : */
2480 0 : IMPL_LINK_NOARG(OfaSmartTagOptionsTabPage, CheckHdl)
2481 : {
2482 0 : const sal_Bool bEnable = m_aMainCB.IsChecked();
2483 0 : m_aSmartTagTypesLB.Enable( bEnable );
2484 0 : m_aSmartTagTypesLB.Invalidate();
2485 0 : m_aPropertiesPB.Enable( false );
2486 :
2487 : // if the controls are currently enabled, we still have to check
2488 : // if the properties button should be disabled because the currently
2489 : // seleted smart tag type does not have a properties dialog.
2490 : // We do this by calling SelectHdl:
2491 0 : if ( bEnable )
2492 0 : SelectHdl( &m_aSmartTagTypesLB );
2493 :
2494 0 : return 0;
2495 : }
2496 :
2497 : /** Handler for the list box
2498 : */
2499 0 : IMPL_LINK_NOARG(OfaSmartTagOptionsTabPage, SelectHdl)
2500 : {
2501 0 : if ( m_aSmartTagTypesLB.GetEntryCount() < 1 )
2502 0 : return 0;
2503 :
2504 0 : const sal_uInt16 nPos = m_aSmartTagTypesLB.GetSelectEntryPos();
2505 0 : const SvTreeListEntry* pEntry = m_aSmartTagTypesLB.GetEntry(nPos);
2506 0 : const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
2507 0 : uno::Reference< smarttags::XSmartTagRecognizer > xRec = pUserData->mxRec;
2508 0 : const sal_Int32 nSmartTagIdx = pUserData->mnSmartTagIdx;
2509 :
2510 0 : const lang::Locale aLocale( LanguageTag( eLastDialogLanguage ).getLocale() );
2511 0 : if ( xRec->hasPropertyPage( nSmartTagIdx, aLocale ) )
2512 0 : m_aPropertiesPB.Enable( sal_True );
2513 : else
2514 0 : m_aPropertiesPB.Enable( sal_False );
2515 :
2516 0 : return 0;
2517 : }
2518 :
2519 : /** Propagates the current settings to the smart tag manager.
2520 : */
2521 0 : sal_Bool OfaSmartTagOptionsTabPage::FillItemSet( SfxItemSet& )
2522 : {
2523 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
2524 0 : SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
2525 0 : SmartTagMgr* pSmartTagMgr = pOpt->pSmartTagMgr;
2526 :
2527 : // robust!
2528 0 : if ( !pSmartTagMgr )
2529 0 : return sal_False;
2530 :
2531 0 : sal_Bool bModifiedSmartTagTypes = sal_False;
2532 0 : std::vector< OUString > aDisabledSmartTagTypes;
2533 :
2534 0 : const sal_uLong nCount = m_aSmartTagTypesLB.GetEntryCount();
2535 :
2536 0 : for ( sal_uInt16 i = 0; i < nCount; ++i )
2537 : {
2538 0 : const SvTreeListEntry* pEntry = m_aSmartTagTypesLB.GetEntry(i);
2539 0 : const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
2540 0 : const sal_Bool bChecked = m_aSmartTagTypesLB.IsChecked(i);
2541 0 : const sal_Bool bIsCurrentlyEnabled = pSmartTagMgr->IsSmartTagTypeEnabled( pUserData->maSmartTagType );
2542 :
2543 0 : bModifiedSmartTagTypes = bModifiedSmartTagTypes || ( !bChecked != !bIsCurrentlyEnabled );
2544 :
2545 0 : if ( !bChecked )
2546 0 : aDisabledSmartTagTypes.push_back( pUserData->maSmartTagType );
2547 :
2548 0 : delete pUserData;
2549 : }
2550 :
2551 0 : const sal_Bool bModifiedRecognize = ( !m_aMainCB.IsChecked() != !pSmartTagMgr->IsLabelTextWithSmartTags() );
2552 0 : if ( bModifiedSmartTagTypes || bModifiedRecognize )
2553 : {
2554 0 : bool bLabelTextWithSmartTags = m_aMainCB.IsChecked() ? true : false;
2555 : pSmartTagMgr->WriteConfiguration( bModifiedRecognize ? &bLabelTextWithSmartTags : 0,
2556 0 : bModifiedSmartTagTypes ? &aDisabledSmartTagTypes : 0 );
2557 : }
2558 :
2559 0 : return sal_True;
2560 : }
2561 :
2562 : /** Sets the controls based on the current settings at SmartTagMgr.
2563 : */
2564 0 : void OfaSmartTagOptionsTabPage::Reset( const SfxItemSet& )
2565 : {
2566 0 : SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
2567 0 : SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
2568 0 : const SmartTagMgr* pSmartTagMgr = pOpt->pSmartTagMgr;
2569 :
2570 : // robust, should not happen!
2571 0 : if ( !pSmartTagMgr )
2572 0 : return;
2573 :
2574 0 : FillListBox( *pSmartTagMgr );
2575 0 : m_aSmartTagTypesLB.SelectEntryPos( 0 );
2576 0 : m_aMainCB.Check( pSmartTagMgr->IsLabelTextWithSmartTags() );
2577 0 : CheckHdl( &m_aMainCB );
2578 : }
2579 :
2580 0 : void OfaSmartTagOptionsTabPage::ActivatePage( const SfxItemSet& )
2581 : {
2582 0 : ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage( sal_False );
2583 0 : }
2584 :
2585 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|