bump product version to 4.1.6.2
[LibreOffice.git] / cui / source / tabpages / autocdlg.cxx
blobdf874d79a5833485a71c1fe89f2708c181e8c9c7
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
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>
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
56 static LanguageType eLastDialogLanguage = LANGUAGE_SYSTEM;
58 using namespace ::com::sun::star::util;
59 using namespace ::com::sun::star;
60 using namespace ::rtl;
62 OfaAutoCorrDlg::OfaAutoCorrDlg(Window* pParent, const SfxItemSet* _pSet )
63 : SfxTabDialog(pParent, "AutoCorrectDialog", "cui/ui/autocorrectdialog.ui", _pSet)
65 get(m_pLanguageBox, "langbox");
66 get(m_pLanguageLB, "lang");
68 sal_Bool bShowSWOptions = sal_False;
69 sal_Bool bOpenSmartTagOptions = sal_False;
71 if ( _pSet )
73 SFX_ITEMSET_ARG( _pSet, pItem, SfxBoolItem, SID_AUTO_CORRECT_DLG, sal_False );
74 if ( pItem && pItem->GetValue() )
75 bShowSWOptions = sal_True;
77 SFX_ITEMSET_ARG( _pSet, pItem2, SfxBoolItem, SID_OPEN_SMARTTAGOPTIONS, sal_False );
78 if ( pItem2 && pItem2->GetValue() )
79 bOpenSmartTagOptions = sal_True;
82 AddTabPage("options", OfaAutocorrOptionsPage::Create, 0);
83 AddTabPage("apply", OfaSwAutoFmtOptionsPage::Create, 0);
84 AddTabPage("wordcompletion", OfaAutoCompleteTabPage::Create, 0);
85 AddTabPage("smarttags", OfaSmartTagOptionsTabPage::Create, 0);
87 if (!bShowSWOptions)
89 RemoveTabPage("apply");
90 RemoveTabPage("wordcompletion");
91 RemoveTabPage("smarttags");
93 else
95 // remove smart tag tab page if no extensions are installed
96 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
97 SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
98 if ( !pOpt || !pOpt->pSmartTagMgr || 0 == pOpt->pSmartTagMgr->NumberOfRecognizers() )
99 RemoveTabPage("smarttags");
101 RemoveTabPage("options");
104 m_nReplacePageId = AddTabPage("replace", OfaAutocorrReplacePage::Create, 0);
105 m_nExceptionsPageId = AddTabPage("exceptions", OfaAutocorrExceptPage::Create, 0);
106 AddTabPage("localized", OfaQuoteTabPage::Create, 0);
108 // initialize languages
109 //! LANGUAGE_NONE is displayed as '[All]' and the LanguageType
110 //! will be set to LANGUAGE_UNDETERMINED
111 sal_Int16 nLangList = LANG_LIST_WESTERN;
113 if( SvtLanguageOptions().IsCTLFontEnabled() )
114 nLangList |= LANG_LIST_CTL;
115 m_pLanguageLB->SetLanguageList( nLangList, sal_True, sal_True );
116 m_pLanguageLB->SelectLanguage( LANGUAGE_NONE );
117 sal_uInt16 nPos = m_pLanguageLB->GetSelectEntryPos();
118 DBG_ASSERT( LISTBOX_ENTRY_NOTFOUND != nPos, "listbox entry missing" );
119 m_pLanguageLB->SetEntryData( nPos, (void*)(long) LANGUAGE_UNDETERMINED );
121 // Initializing doesn't work for static on linux - therefore here
122 if( LANGUAGE_SYSTEM == eLastDialogLanguage )
123 eLastDialogLanguage = Application::GetSettings().GetLanguageTag().getLanguageType();
125 LanguageType nSelectLang = LANGUAGE_UNDETERMINED;
126 nPos = m_pLanguageLB->GetEntryPos( (void*)(long) eLastDialogLanguage );
127 if (LISTBOX_ENTRY_NOTFOUND != nPos)
128 nSelectLang = eLastDialogLanguage;
129 m_pLanguageLB->SelectLanguage( nSelectLang );
131 m_pLanguageLB->SetSelectHdl(LINK(this, OfaAutoCorrDlg, SelectLanguageHdl));
133 if ( bOpenSmartTagOptions )
134 SetCurPageId("smarttags");
137 void OfaAutoCorrDlg::EnableLanguage(bool bEnable)
139 m_pLanguageBox->Enable(bEnable);
142 static sal_Bool lcl_FindEntry( ListBox& rLB, const String& rEntry,
143 CollatorWrapper& rCmpClass )
145 sal_uInt16 nCount = rLB.GetEntryCount();
146 sal_uInt16 nSelPos = rLB.GetSelectEntryPos();
147 sal_uInt16 i;
148 for(i = 0; i < nCount; i++)
150 if( 0 == rCmpClass.compareString(rEntry, rLB.GetEntry(i) ))
152 rLB.SelectEntryPos(i, sal_True);
153 return sal_True;
156 if(LISTBOX_ENTRY_NOTFOUND != nSelPos)
157 rLB.SelectEntryPos(nSelPos, sal_False);
158 return sal_False;
161 IMPL_LINK(OfaAutoCorrDlg, SelectLanguageHdl, ListBox*, pBox)
163 sal_uInt16 nPos = pBox->GetSelectEntryPos();
164 void* pVoid = pBox->GetEntryData(nPos);
165 LanguageType eNewLang = (LanguageType)(long)pVoid;
166 // save old settings and fill anew
167 if(eNewLang != eLastDialogLanguage)
169 sal_uInt16 nPageId = GetCurPageId();
170 if (m_nReplacePageId == nPageId)
171 ((OfaAutocorrReplacePage*)GetTabPage( nPageId ))->SetLanguage(eNewLang);
172 else if (m_nExceptionsPageId == nPageId)
173 ((OfaAutocorrExceptPage*)GetTabPage( nPageId ))->SetLanguage(eNewLang);
175 return 0;
178 OfaAutocorrOptionsPage::OfaAutocorrOptionsPage( Window* pParent,
179 const SfxItemSet& rSet ) :
180 SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCORR_OPTIONS ), rSet),
181 aCheckLB (this, CUI_RES(CLB_SETTINGS )),
183 sInput (CUI_RES(ST_USE_REPLACE )),
184 sDoubleCaps (CUI_RES(ST_CPTL_STT_WORD )),
185 sStartCap (CUI_RES(ST_CPTL_STT_SENT )),
186 sBoldUnderline (CUI_RES(ST_BOLD_UNDER )),
187 sURL (CUI_RES(ST_DETECT_URL )),
188 sNoDblSpaces (CUI_RES(STR_NO_DBL_SPACES )),
189 sDash (CUI_RES(ST_DASH )),
190 sAccidentalCaps (CUI_RES(ST_CORRECT_ACCIDENTAL_CAPS_LOCK))
192 FreeResource();
194 aCheckLB.SetHelpId(HID_OFAPAGE_AUTOCORR_CLB);
197 OfaAutocorrOptionsPage::~OfaAutocorrOptionsPage()
201 SfxTabPage* OfaAutocorrOptionsPage::Create( Window* pParent,
202 const SfxItemSet& rSet)
204 return new OfaAutocorrOptionsPage(pParent, rSet);
207 sal_Bool OfaAutocorrOptionsPage::FillItemSet( SfxItemSet& )
209 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
210 long nFlags = pAutoCorrect->GetFlags();
212 sal_uInt16 nPos = 0;
213 pAutoCorrect->SetAutoCorrFlag(Autocorrect, aCheckLB.IsChecked(nPos++));
214 pAutoCorrect->SetAutoCorrFlag(CptlSttWrd, aCheckLB.IsChecked(nPos++));
215 pAutoCorrect->SetAutoCorrFlag(CptlSttSntnc, aCheckLB.IsChecked(nPos++));
216 pAutoCorrect->SetAutoCorrFlag(ChgWeightUnderl, aCheckLB.IsChecked(nPos++));
217 pAutoCorrect->SetAutoCorrFlag(SetINetAttr, aCheckLB.IsChecked(nPos++));
218 pAutoCorrect->SetAutoCorrFlag(ChgToEnEmDash, aCheckLB.IsChecked(nPos++));
219 pAutoCorrect->SetAutoCorrFlag(IgnoreDoubleSpace, aCheckLB.IsChecked(nPos++));
220 pAutoCorrect->SetAutoCorrFlag(CorrectCapsLock, aCheckLB.IsChecked(nPos++));
222 sal_Bool bReturn = nFlags != pAutoCorrect->GetFlags();
223 if(bReturn )
225 SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
226 rCfg.SetModified();
227 rCfg.Commit();
229 return bReturn;
232 void OfaAutocorrOptionsPage::ActivatePage( const SfxItemSet& )
234 ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_False);
237 void OfaAutocorrOptionsPage::Reset( const SfxItemSet& )
239 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
240 const long nFlags = pAutoCorrect->GetFlags();
242 aCheckLB.SetUpdateMode(sal_False);
243 aCheckLB.Clear();
245 aCheckLB.InsertEntry(sInput);
246 aCheckLB.InsertEntry(sDoubleCaps);
247 aCheckLB.InsertEntry(sStartCap);
248 aCheckLB.InsertEntry(sBoldUnderline);
249 aCheckLB.InsertEntry(sURL);
250 aCheckLB.InsertEntry(sDash);
251 aCheckLB.InsertEntry(sNoDblSpaces);
252 aCheckLB.InsertEntry(sAccidentalCaps);
254 sal_uInt16 nPos = 0;
255 aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & Autocorrect) );
256 aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & CptlSttWrd) );
257 aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & CptlSttSntnc) );
258 aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & ChgWeightUnderl) );
259 aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & SetINetAttr) );
260 aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & ChgToEnEmDash) );
261 aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & IgnoreDoubleSpace) );
262 aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & CorrectCapsLock) );
264 aCheckLB.SetUpdateMode(sal_True);
267 /*********************************************************************/
268 /* */
269 /* helping struct for dUserData of the Checklistbox */
270 /* */
271 /*********************************************************************/
273 struct ImpUserData
275 String *pString;
276 Font* pFont;
278 ImpUserData(String* pText, Font* pFnt)
279 { pString = pText; pFont = pFnt;}
283 /*********************************************************************/
284 /* */
285 /* dialog for per cent settings */
286 /* */
287 /*********************************************************************/
289 class OfaAutoFmtPrcntSet : public ModalDialog
291 OKButton aOKPB;
292 CancelButton aCancelPB;
293 FixedLine aPrcntFL;
294 MetricField aPrcntMF;
296 public:
297 OfaAutoFmtPrcntSet(Window* pParent) :
298 ModalDialog(pParent, CUI_RES(RID_OFADLG_PRCNT_SET)),
299 aOKPB(this, CUI_RES(BT_OK)),
300 aCancelPB(this, CUI_RES(BT_CANCEL)),
301 aPrcntFL(this, CUI_RES(FL_PRCNT)),
302 aPrcntMF(this, CUI_RES(ED_RIGHT_MARGIN))
304 FreeResource();
306 MetricField& GetPrcntFld(){return aPrcntMF;}
310 /*********************************************************************/
311 /* */
312 /* changed LBoxString */
313 /* */
314 /*********************************************************************/
316 class OfaImpBrwString : public SvLBoxString
318 public:
320 OfaImpBrwString( SvTreeListEntry* pEntry, sal_uInt16 nFlags,
321 const String& rStr ) : SvLBoxString(pEntry,nFlags,rStr){}
323 virtual void Paint(
324 const Point& rPos, SvTreeListBox& rDev, const SvViewDataEntry* pView,
325 const SvTreeListEntry* pEntry);
328 void OfaImpBrwString::Paint(
329 const Point& rPos, SvTreeListBox& rDev, const SvViewDataEntry* /*pView*/,
330 const SvTreeListEntry* pEntry)
332 rDev.DrawText( rPos, GetText() );
333 if(pEntry->GetUserData())
335 ImpUserData* pUserData = (ImpUserData* )pEntry->GetUserData();
336 Point aNewPos(rPos);
337 aNewPos.X() += rDev.GetTextWidth(GetText());
338 Font aOldFont( rDev.GetFont());
339 Font aFont( aOldFont );
340 if(pUserData->pFont)
342 aFont = *pUserData->pFont;
343 aFont.SetColor(aOldFont.GetColor());
344 aFont.SetSize(aOldFont.GetSize());
346 aFont.SetWeight( WEIGHT_BOLD );
348 sal_Bool bFett = sal_True;
349 sal_Int32 nPos = 0;
350 do {
351 String sTxt( pUserData->pString->GetToken( 0, 1, nPos ));
353 if( bFett )
354 rDev.SetFont( aFont );
356 rDev.DrawText( aNewPos, sTxt );
358 if( -1 != nPos )
359 aNewPos.X() += rDev.GetTextWidth( sTxt );
361 if( bFett )
362 rDev.SetFont( aOldFont );
364 bFett = !bFett;
365 } while( -1 != nPos );
369 /*********************************************************************/
370 /* */
371 /* use TabPage autoformat */
372 /* */
373 /*********************************************************************/
375 #define CBCOL_FIRST 0
376 #define CBCOL_SECOND 1
377 #define CBCOL_BOTH 2
379 enum OfaAutoFmtOptions
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
401 OfaSwAutoFmtOptionsPage::OfaSwAutoFmtOptionsPage( Window* pParent,
402 const SfxItemSet& rSet ) :
403 SfxTabPage(pParent, CUI_RES(RID_OFAPAGE_AUTOFMT_APPLY), rSet),
404 m_aCheckLBContainer(this, CUI_RES(CLB_SETTINGS)),
405 aCheckLB(m_aCheckLBContainer),
406 aEditPB (this, CUI_RES(PB_EDIT)),
407 aHeader1Expl (this, CUI_RES(FT_HEADER1_EXPLANATION)),
408 aHeader2Expl (this, CUI_RES(FT_HEADER2_EXPLANATION)),
409 sHeader1 (CUI_RES( STR_HEADER1 )),
410 sHeader2 (CUI_RES( STR_HEADER2 )),
411 sDeleteEmptyPara (CUI_RES( ST_DEL_EMPTY_PARA)),
412 sUseReplaceTbl (CUI_RES( ST_USE_REPLACE )),
413 sCptlSttWord (CUI_RES( ST_CPTL_STT_WORD)),
414 sCptlSttSent (CUI_RES( ST_CPTL_STT_SENT)),
415 sUserStyle (CUI_RES( ST_USER_STYLE )),
416 sBullet (CUI_RES( ST_BULLET )),
417 sBoldUnder (CUI_RES( ST_BOLD_UNDER )),
418 sNoDblSpaces (CUI_RES( STR_NO_DBL_SPACES)),
419 sCorrectCapsLock (CUI_RES( ST_CORRECT_ACCIDENTAL_CAPS_LOCK)),
420 sDetectURL (CUI_RES( ST_DETECT_URL )),
421 sDash (CUI_RES( ST_DASH )),
422 sRightMargin (CUI_RES( ST_RIGHT_MARGIN )),
423 sNum (CUI_RES( STR_NUM )),
424 sBorder (CUI_RES( STR_BORDER )),
425 sTable (CUI_RES( STR_TABLE )),
426 sReplaceTemplates (CUI_RES( STR_REPLACE_TEMPLATES)),
427 sDelSpaceAtSttEnd (CUI_RES( STR_DEL_SPACES_AT_STT_END)),
428 sDelSpaceBetweenLines(CUI_RES(STR_DEL_SPACES_BETWEEN_LINES)),
430 nPercent ( 50 ),
431 pCheckButtonData( NULL )
434 FreeResource();
436 // set typ. inverted commas
437 SvtSysLocale aSysLcl;
439 aCheckLB.SetHelpId(HID_OFAPAGE_AUTOFORMAT_CLB);
440 aCheckLB.SetStyle(aCheckLB.GetStyle()|WB_HSCROLL| WB_VSCROLL);
442 aCheckLB.SetSelectHdl(LINK(this, OfaSwAutoFmtOptionsPage, SelectHdl));
443 aCheckLB.SetDoubleClickHdl(LINK(this, OfaSwAutoFmtOptionsPage, EditHdl));
445 static long aStaticTabs[]=
447 3, 0, 20, 40
450 aCheckLB.SvxSimpleTable::SetTabs(aStaticTabs);
451 String sHeader( sHeader1 );
452 sHeader += '\t';
453 sHeader += sHeader2;
454 sHeader += '\t';
455 aCheckLB.InsertHeaderEntry( sHeader, HEADERBAR_APPEND,
456 HIB_CENTER | HIB_VCENTER | HIB_FIXEDPOS | HIB_FIXED);
458 aEditPB.SetClickHdl(LINK(this, OfaSwAutoFmtOptionsPage, EditHdl));
461 SvTreeListEntry* OfaSwAutoFmtOptionsPage::CreateEntry(String& rTxt, sal_uInt16 nCol)
463 SvTreeListEntry* pEntry = new SvTreeListEntry;
465 if ( !pCheckButtonData )
467 pCheckButtonData = new SvLBoxButtonData( &aCheckLB );
468 aCheckLB.SetCheckButtonData( pCheckButtonData );
471 pEntry->AddItem( new SvLBoxContextBmp( pEntry, 0, Image(), Image(), 0));
473 String sEmpty;
474 if (nCol == CBCOL_SECOND)
475 pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );
476 else
477 pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );
479 if (nCol == CBCOL_FIRST)
480 pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );
481 else
482 pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );
483 pEntry->AddItem( new OfaImpBrwString( pEntry, 0, rTxt ) );
485 return pEntry;
488 OfaSwAutoFmtOptionsPage::~OfaSwAutoFmtOptionsPage()
490 delete (ImpUserData*) aCheckLB.GetUserData( REPLACE_BULLETS );
491 delete (ImpUserData*) aCheckLB.GetUserData( APPLY_NUMBERING );
492 delete (ImpUserData*) aCheckLB.GetUserData( MERGE_SINGLE_LINE_PARA );
493 delete pCheckButtonData;
496 SfxTabPage* OfaSwAutoFmtOptionsPage::Create( Window* pParent,
497 const SfxItemSet& rAttrSet)
499 return new OfaSwAutoFmtOptionsPage(pParent, rAttrSet);
502 sal_Bool OfaSwAutoFmtOptionsPage::FillItemSet( SfxItemSet& )
504 sal_Bool bModified = sal_False;
505 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
506 SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
507 long nFlags = pAutoCorrect->GetFlags();
509 sal_Bool bCheck = aCheckLB.IsChecked(USE_REPLACE_TABLE, CBCOL_FIRST);
510 bModified |= pOpt->bAutoCorrect != bCheck;
511 pOpt->bAutoCorrect = bCheck;
512 pAutoCorrect->SetAutoCorrFlag(Autocorrect,
513 aCheckLB.IsChecked(USE_REPLACE_TABLE, CBCOL_SECOND));
515 bCheck = aCheckLB.IsChecked(CORR_UPPER, CBCOL_FIRST);
516 bModified |= pOpt->bCptlSttWrd != bCheck;
517 pOpt->bCptlSttWrd = bCheck;
518 pAutoCorrect->SetAutoCorrFlag(CptlSttWrd,
519 aCheckLB.IsChecked(CORR_UPPER, CBCOL_SECOND));
521 bCheck = aCheckLB.IsChecked(BEGIN_UPPER, CBCOL_FIRST);
522 bModified |= pOpt->bCptlSttSntnc != bCheck;
523 pOpt->bCptlSttSntnc = bCheck;
524 pAutoCorrect->SetAutoCorrFlag(CptlSttSntnc,
525 aCheckLB.IsChecked(BEGIN_UPPER, CBCOL_SECOND));
527 bCheck = aCheckLB.IsChecked(BOLD_UNDERLINE, CBCOL_FIRST);
528 bModified |= pOpt->bChgWeightUnderl != bCheck;
529 pOpt->bChgWeightUnderl = bCheck;
530 pAutoCorrect->SetAutoCorrFlag(ChgWeightUnderl,
531 aCheckLB.IsChecked(BOLD_UNDERLINE, CBCOL_SECOND));
533 pAutoCorrect->SetAutoCorrFlag(IgnoreDoubleSpace,
534 aCheckLB.IsChecked(IGNORE_DBLSPACE, CBCOL_SECOND));
536 pAutoCorrect->SetAutoCorrFlag(CorrectCapsLock,
537 aCheckLB.IsChecked(CORRECT_CAPS_LOCK, CBCOL_SECOND));
539 bCheck = aCheckLB.IsChecked(DETECT_URL, CBCOL_FIRST);
540 bModified |= pOpt->bSetINetAttr != bCheck;
541 pOpt->bSetINetAttr = bCheck;
542 pAutoCorrect->SetAutoCorrFlag(SetINetAttr,
543 aCheckLB.IsChecked(DETECT_URL, CBCOL_SECOND));
545 bCheck = aCheckLB.IsChecked(DEL_EMPTY_NODE, CBCOL_FIRST);
546 bModified |= pOpt->bDelEmptyNode != bCheck;
547 pOpt->bDelEmptyNode = bCheck;
549 bCheck = aCheckLB.IsChecked(REPLACE_USER_COLL, CBCOL_FIRST);
550 bModified |= pOpt->bChgUserColl != bCheck;
551 pOpt->bChgUserColl = bCheck;
553 bCheck = aCheckLB.IsChecked(REPLACE_BULLETS, CBCOL_FIRST);
554 bModified |= pOpt->bChgEnumNum != bCheck;
555 pOpt->bChgEnumNum = bCheck;
556 bModified |= aBulletFont != pOpt->aBulletFont;
557 pOpt->aBulletFont = aBulletFont;
558 bModified |= !comphelper::string::equals(sBulletChar, pOpt->cBullet);
559 pOpt->cBullet = sBulletChar.GetChar(0);
561 bModified |= aByInputBulletFont != pOpt->aByInputBulletFont;
562 bModified |= !comphelper::string::equals(sByInputBulletChar, pOpt->cByInputBullet);
563 pOpt->aByInputBulletFont = aByInputBulletFont;
564 pOpt->cByInputBullet = sByInputBulletChar.GetChar(0);
566 bCheck = aCheckLB.IsChecked(MERGE_SINGLE_LINE_PARA, CBCOL_FIRST);
567 bModified |= pOpt->bRightMargin != bCheck;
568 pOpt->bRightMargin = bCheck;
569 bModified |= nPercent != pOpt->nRightMargin;
570 pOpt->nRightMargin = (sal_uInt8)nPercent;
572 bCheck = aCheckLB.IsChecked(APPLY_NUMBERING, CBCOL_SECOND);
573 bModified |= pOpt->bSetNumRule != bCheck;
574 pOpt->bSetNumRule = bCheck;
576 bCheck = aCheckLB.IsChecked(INSERT_BORDER, CBCOL_SECOND);
577 bModified |= pOpt->bSetBorder != bCheck;
578 pOpt->bSetBorder = bCheck;
580 bCheck = aCheckLB.IsChecked(CREATE_TABLE, CBCOL_SECOND);
581 bModified |= pOpt->bCreateTable != bCheck;
582 pOpt->bCreateTable = bCheck;
584 bCheck = aCheckLB.IsChecked(REPLACE_STYLES, CBCOL_SECOND);
585 bModified |= pOpt->bReplaceStyles != bCheck;
586 pOpt->bReplaceStyles = bCheck;
588 bCheck = aCheckLB.IsChecked(REPLACE_DASHES, CBCOL_FIRST);
589 bModified |= pOpt->bChgToEnEmDash != bCheck;
590 pOpt->bChgToEnEmDash = bCheck;
591 pAutoCorrect->SetAutoCorrFlag(ChgToEnEmDash,
592 aCheckLB.IsChecked(REPLACE_DASHES, CBCOL_SECOND));
594 bCheck = aCheckLB.IsChecked(DEL_SPACES_AT_STT_END, CBCOL_FIRST);
595 bModified |= pOpt->bAFmtDelSpacesAtSttEnd != bCheck;
596 pOpt->bAFmtDelSpacesAtSttEnd = bCheck;
597 bCheck = aCheckLB.IsChecked(DEL_SPACES_AT_STT_END, CBCOL_SECOND);
598 bModified |= pOpt->bAFmtByInpDelSpacesAtSttEnd != bCheck;
599 pOpt->bAFmtByInpDelSpacesAtSttEnd = bCheck;
601 bCheck = aCheckLB.IsChecked(DEL_SPACES_BETWEEN_LINES, CBCOL_FIRST);
602 bModified |= pOpt->bAFmtDelSpacesBetweenLines != bCheck;
603 pOpt->bAFmtDelSpacesBetweenLines = bCheck;
604 bCheck = aCheckLB.IsChecked(DEL_SPACES_BETWEEN_LINES, CBCOL_SECOND);
605 bModified |= pOpt->bAFmtByInpDelSpacesBetweenLines != bCheck;
606 pOpt->bAFmtByInpDelSpacesBetweenLines = bCheck;
608 if(bModified || nFlags != pAutoCorrect->GetFlags())
610 SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
611 rCfg.SetModified();
612 rCfg.Commit();
615 return sal_True;
618 void OfaSwAutoFmtOptionsPage::ActivatePage( const SfxItemSet& )
620 ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_False);
623 void OfaSwAutoFmtOptionsPage::Reset( const SfxItemSet& )
625 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
626 SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
627 const long nFlags = pAutoCorrect->GetFlags();
629 aCheckLB.SetUpdateMode(sal_False);
630 aCheckLB.Clear();
632 // The following entries have to be inserted in the same order
633 // as in the OfaAutoFmtOptions-enum!
634 aCheckLB.GetModel()->Insert(CreateEntry(sUseReplaceTbl, CBCOL_BOTH ));
635 aCheckLB.GetModel()->Insert(CreateEntry(sCptlSttWord, CBCOL_BOTH ));
636 aCheckLB.GetModel()->Insert(CreateEntry(sCptlSttSent, CBCOL_BOTH ));
637 aCheckLB.GetModel()->Insert(CreateEntry(sBoldUnder, CBCOL_BOTH ));
638 aCheckLB.GetModel()->Insert(CreateEntry(sDetectURL, CBCOL_BOTH ));
639 aCheckLB.GetModel()->Insert(CreateEntry(sDash, CBCOL_BOTH ));
640 aCheckLB.GetModel()->Insert(CreateEntry(sDelSpaceAtSttEnd, CBCOL_BOTH ));
641 aCheckLB.GetModel()->Insert(CreateEntry(sDelSpaceBetweenLines, CBCOL_BOTH ));
643 aCheckLB.GetModel()->Insert(CreateEntry(sNoDblSpaces, CBCOL_SECOND));
644 aCheckLB.GetModel()->Insert(CreateEntry(sCorrectCapsLock, CBCOL_SECOND));
645 aCheckLB.GetModel()->Insert(CreateEntry(sNum, CBCOL_SECOND));
646 aCheckLB.GetModel()->Insert(CreateEntry(sBorder, CBCOL_SECOND));
647 aCheckLB.GetModel()->Insert(CreateEntry(sTable, CBCOL_SECOND));
648 aCheckLB.GetModel()->Insert(CreateEntry(sReplaceTemplates, CBCOL_SECOND));
649 aCheckLB.GetModel()->Insert(CreateEntry(sDeleteEmptyPara, CBCOL_FIRST ));
650 aCheckLB.GetModel()->Insert(CreateEntry(sUserStyle, CBCOL_FIRST ));
651 aCheckLB.GetModel()->Insert(CreateEntry(sBullet, CBCOL_FIRST ));
652 aCheckLB.GetModel()->Insert(CreateEntry(sRightMargin, CBCOL_FIRST ));
654 aCheckLB.CheckEntryPos( USE_REPLACE_TABLE, CBCOL_FIRST, pOpt->bAutoCorrect );
655 aCheckLB.CheckEntryPos( USE_REPLACE_TABLE, CBCOL_SECOND, 0 != (nFlags & Autocorrect));
656 aCheckLB.CheckEntryPos( CORR_UPPER, CBCOL_FIRST, pOpt->bCptlSttWrd );
657 aCheckLB.CheckEntryPos( CORR_UPPER, CBCOL_SECOND, 0 != (nFlags & CptlSttWrd) );
658 aCheckLB.CheckEntryPos( BEGIN_UPPER, CBCOL_FIRST, pOpt->bCptlSttSntnc );
659 aCheckLB.CheckEntryPos( BEGIN_UPPER, CBCOL_SECOND, 0 != (nFlags & CptlSttSntnc) );
660 aCheckLB.CheckEntryPos( BOLD_UNDERLINE, CBCOL_FIRST, pOpt->bChgWeightUnderl );
661 aCheckLB.CheckEntryPos( BOLD_UNDERLINE, CBCOL_SECOND, 0 != (nFlags & ChgWeightUnderl) );
662 aCheckLB.CheckEntryPos( IGNORE_DBLSPACE, CBCOL_SECOND, 0 != (nFlags & IgnoreDoubleSpace) );
663 aCheckLB.CheckEntryPos( CORRECT_CAPS_LOCK, CBCOL_SECOND, 0 != (nFlags & CorrectCapsLock) );
664 aCheckLB.CheckEntryPos( DETECT_URL, CBCOL_FIRST, pOpt->bSetINetAttr );
665 aCheckLB.CheckEntryPos( DETECT_URL, CBCOL_SECOND, 0 != (nFlags & SetINetAttr) );
666 aCheckLB.CheckEntryPos( REPLACE_DASHES, CBCOL_FIRST, pOpt->bChgToEnEmDash );
667 aCheckLB.CheckEntryPos( REPLACE_DASHES, CBCOL_SECOND, 0 != (nFlags & ChgToEnEmDash) );
668 aCheckLB.CheckEntryPos( DEL_SPACES_AT_STT_END, CBCOL_FIRST, pOpt->bAFmtDelSpacesAtSttEnd );
669 aCheckLB.CheckEntryPos( DEL_SPACES_AT_STT_END, CBCOL_SECOND, pOpt->bAFmtByInpDelSpacesAtSttEnd );
670 aCheckLB.CheckEntryPos( DEL_SPACES_BETWEEN_LINES, CBCOL_FIRST, pOpt->bAFmtDelSpacesBetweenLines );
671 aCheckLB.CheckEntryPos( DEL_SPACES_BETWEEN_LINES, CBCOL_SECOND, pOpt->bAFmtByInpDelSpacesBetweenLines );
672 aCheckLB.CheckEntryPos( DEL_EMPTY_NODE, CBCOL_FIRST, pOpt->bDelEmptyNode );
673 aCheckLB.CheckEntryPos( REPLACE_USER_COLL, CBCOL_FIRST, pOpt->bChgUserColl );
674 aCheckLB.CheckEntryPos( REPLACE_BULLETS, CBCOL_FIRST, pOpt->bChgEnumNum );
676 aBulletFont = pOpt->aBulletFont;
677 sBulletChar = pOpt->cBullet;
678 ImpUserData* pUserData = new ImpUserData(&sBulletChar, &aBulletFont);
679 aCheckLB.SetUserData( REPLACE_BULLETS, pUserData );
681 nPercent = pOpt->nRightMargin;
682 sMargin = " " + OUString::number( nPercent ) + "%";
683 pUserData = new ImpUserData(&sMargin, 0);
684 aCheckLB.SetUserData( MERGE_SINGLE_LINE_PARA, pUserData );
686 aCheckLB.CheckEntryPos( APPLY_NUMBERING, CBCOL_SECOND, pOpt->bSetNumRule );
688 aByInputBulletFont = pOpt->aByInputBulletFont;
689 sByInputBulletChar = pOpt->cByInputBullet;
690 ImpUserData* pUserData2 = new ImpUserData(&sByInputBulletChar, &aByInputBulletFont);
691 aCheckLB.SetUserData( APPLY_NUMBERING , pUserData2 );
693 aCheckLB.CheckEntryPos( MERGE_SINGLE_LINE_PARA, CBCOL_FIRST, pOpt->bRightMargin );
694 aCheckLB.CheckEntryPos( INSERT_BORDER, CBCOL_SECOND, pOpt->bSetBorder );
695 aCheckLB.CheckEntryPos( CREATE_TABLE, CBCOL_SECOND, pOpt->bCreateTable );
696 aCheckLB.CheckEntryPos( REPLACE_STYLES, CBCOL_SECOND, pOpt->bReplaceStyles );
698 aCheckLB.SetUpdateMode(sal_True);
701 IMPL_LINK(OfaSwAutoFmtOptionsPage, SelectHdl, OfaACorrCheckListBox*, pBox)
703 aEditPB.Enable(0 != pBox->FirstSelected()->GetUserData());
704 return 0;
707 IMPL_LINK_NOARG(OfaSwAutoFmtOptionsPage, EditHdl)
709 sal_uLong nSelEntryPos = aCheckLB.GetSelectEntryPos();
710 if( nSelEntryPos == REPLACE_BULLETS ||
711 nSelEntryPos == APPLY_NUMBERING)
713 SvxCharacterMap *pMapDlg = new SvxCharacterMap(this);
714 ImpUserData* pUserData = (ImpUserData*)aCheckLB.FirstSelected()->GetUserData();
715 pMapDlg->SetCharFont(*pUserData->pFont);
716 pMapDlg->SetChar( pUserData->pString->GetChar(0) );
717 if(RET_OK == pMapDlg->Execute())
719 Font aFont(pMapDlg->GetCharFont());
720 *pUserData->pFont = aFont;
721 sal_UCS4 aChar = pMapDlg->GetChar();
722 // using the UCS4 constructor
723 OUString aOUStr( &aChar, 1 );
724 *pUserData->pString = aOUStr;
726 delete pMapDlg;
728 else if( MERGE_SINGLE_LINE_PARA == nSelEntryPos )
730 // dialog for per cent settings
731 OfaAutoFmtPrcntSet aDlg(this);
732 aDlg.GetPrcntFld().SetValue(nPercent);
733 if(RET_OK == aDlg.Execute())
735 nPercent = (sal_uInt16)aDlg.GetPrcntFld().GetValue();
736 sMargin = " " + OUString::number( nPercent ) + "%";
739 aCheckLB.Invalidate();
740 return 0;
743 void OfaACorrCheckListBox::SetTabs()
745 SvxSimpleTable::SetTabs();
746 sal_uInt16 nAdjust = SV_LBOXTAB_ADJUST_RIGHT|SV_LBOXTAB_ADJUST_LEFT|SV_LBOXTAB_ADJUST_CENTER|SV_LBOXTAB_ADJUST_NUMERIC|SV_LBOXTAB_FORCE;
748 if( aTabs.size() > 1 )
750 SvLBoxTab* pTab = aTabs[1];
751 pTab->nFlags &= ~nAdjust;
752 pTab->nFlags |= SV_LBOXTAB_PUSHABLE|SV_LBOXTAB_ADJUST_CENTER|SV_LBOXTAB_FORCE;
754 if( aTabs.size() > 2 )
756 SvLBoxTab* pTab = aTabs[2];
757 pTab->nFlags &= ~nAdjust;
758 pTab->nFlags |= SV_LBOXTAB_PUSHABLE|SV_LBOXTAB_ADJUST_CENTER|SV_LBOXTAB_FORCE;
762 void OfaACorrCheckListBox::CheckEntryPos(sal_uLong nPos, sal_uInt16 nCol, sal_Bool bChecked)
764 if ( nPos < GetEntryCount() )
765 SetCheckButtonState(
766 GetEntry(nPos),
767 nCol,
768 bChecked ? SvButtonState( SV_BUTTON_CHECKED ) :
769 SvButtonState( SV_BUTTON_UNCHECKED ) );
772 sal_Bool OfaACorrCheckListBox::IsChecked(sal_uLong nPos, sal_uInt16 nCol)
774 return GetCheckButtonState( GetEntry(nPos), nCol ) == SV_BUTTON_CHECKED;
777 void OfaACorrCheckListBox::SetCheckButtonState( SvTreeListEntry* pEntry, sal_uInt16 nCol, SvButtonState eState)
779 SvLBoxButton* pItem = (SvLBoxButton*)(pEntry->GetItem(nCol + 1));
781 DBG_ASSERT(pItem,"SetCheckButton:Item not found");
782 if (pItem->GetType() == SV_ITEM_ID_LBOXBUTTON)
784 switch( eState )
786 case SV_BUTTON_CHECKED:
787 pItem->SetStateChecked();
788 break;
790 case SV_BUTTON_UNCHECKED:
791 pItem->SetStateUnchecked();
792 break;
794 case SV_BUTTON_TRISTATE:
795 pItem->SetStateTristate();
796 break;
798 InvalidateEntry( pEntry );
802 SvButtonState OfaACorrCheckListBox::GetCheckButtonState( SvTreeListEntry* pEntry, sal_uInt16 nCol ) const
804 SvButtonState eState = SV_BUTTON_UNCHECKED;
805 SvLBoxButton* pItem = (SvLBoxButton*)(pEntry->GetItem(nCol + 1));
806 DBG_ASSERT(pItem,"GetChButnState:Item not found");
808 if (pItem->GetType() == SV_ITEM_ID_LBOXBUTTON)
810 sal_uInt16 nButtonFlags = pItem->GetButtonFlags();
811 eState = pCheckButtonData->ConvertToButtonState( nButtonFlags );
814 return eState;
817 void OfaACorrCheckListBox::HBarClick()
819 // sorting is stopped by this overload
822 void OfaACorrCheckListBox::KeyInput( const KeyEvent& rKEvt )
824 if(!rKEvt.GetKeyCode().GetModifier() &&
825 KEY_SPACE == rKEvt.GetKeyCode().GetCode())
827 sal_uLong nSelPos = GetSelectEntryPos();
828 sal_uInt16 nCol = GetCurrentTabPos() - 1;
829 if ( nCol < 2 )
831 CheckEntryPos( nSelPos, nCol, !IsChecked( nSelPos, nCol ) );
832 CallImplEventListeners( VCLEVENT_CHECKBOX_TOGGLE, (void*)GetEntry( nSelPos ) );
834 else
836 sal_uInt16 nCheck = IsChecked(nSelPos, 1) ? 1 : 0;
837 if(IsChecked(nSelPos, 0))
838 nCheck += 2;
839 nCheck--;
840 nCheck &= 3;
841 CheckEntryPos(nSelPos, 1, 0 != (nCheck & 1));
842 CheckEntryPos(nSelPos, 0, 0 != (nCheck & 2));
845 else
846 SvxSimpleTable::KeyInput(rKEvt);
849 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 , bSWriter(true)
858 get(m_pTextOnlyCB, "textonly");
859 get(m_pDeleteReplacePB, "delete");
860 get(m_pNewReplacePB, "new");
861 sNew = m_pNewReplacePB->GetText();
862 sModify = get<PushButton>("replace")->GetText();
863 get(m_pShortED, "origtext");
864 get(m_pReplaceED, "newtext");
865 get(m_pReplaceTLB, "tabview");
866 m_pReplaceTLB->set_height_request(16 * GetTextHeight());
868 SfxModule *pMod = *(SfxModule**)GetAppData(SHL_WRITER);
869 bSWriter = pMod == SfxModule::GetActiveModule();
871 LanguageTag aLanguageTag( eLastDialogLanguage );
872 pCompareClass = new CollatorWrapper( comphelper::getProcessComponentContext() );
873 pCompareClass->loadDefaultCollator( aLanguageTag.getLocale(), 0 );
874 pCharClass = new CharClass( aLanguageTag );
876 static long aTabs[] = { 2 /* Tab-Count */, 1, 61 };
877 m_pReplaceTLB->SetTabs( &aTabs[0], MAP_APPFONT );
879 m_pReplaceTLB->SetStyle( m_pReplaceTLB->GetStyle()|WB_HSCROLL|WB_CLIPCHILDREN );
880 m_pReplaceTLB->SetSelectHdl( LINK(this, OfaAutocorrReplacePage, SelectHdl) );
881 m_pNewReplacePB->SetClickHdl( LINK(this, OfaAutocorrReplacePage, NewDelHdl) );
882 m_pDeleteReplacePB->SetClickHdl( LINK(this, OfaAutocorrReplacePage, NewDelHdl) );
883 m_pShortED->SetModifyHdl( LINK(this, OfaAutocorrReplacePage, ModifyHdl) );
884 m_pReplaceED->SetModifyHdl( LINK(this, OfaAutocorrReplacePage, ModifyHdl) );
885 m_pShortED->SetActionHdl( LINK(this, OfaAutocorrReplacePage, NewDelHdl) );
886 m_pReplaceED->SetActionHdl( LINK(this, OfaAutocorrReplacePage, NewDelHdl) );
888 m_pReplaceED->SetSpaces(true);
889 m_pShortED->SetSpaces(true);
892 void OfaAutocorrReplacePage::Resize()
894 SfxTabPage::Resize();
895 m_pReplaceTLB->SetTab(0, m_pShortED->GetPosPixel().X(), MAP_PIXEL);
896 m_pReplaceTLB->SetTab(1, m_pReplaceED->GetPosPixel().X(), MAP_PIXEL);
899 OfaAutocorrReplacePage::~OfaAutocorrReplacePage()
901 aDoubleStringTable.clear();
902 aChangesTable.clear();
904 delete pCompareClass;
905 delete pCharClass;
908 SfxTabPage* OfaAutocorrReplacePage::Create( Window* pParent, const SfxItemSet& rSet)
910 return new OfaAutocorrReplacePage(pParent, rSet);
913 void OfaAutocorrReplacePage::ActivatePage( const SfxItemSet& )
915 if(eLang != eLastDialogLanguage)
916 SetLanguage(eLastDialogLanguage);
917 ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_True);
920 int OfaAutocorrReplacePage::DeactivatePage( SfxItemSet* )
922 return LEAVE_PAGE;
925 sal_Bool OfaAutocorrReplacePage::FillItemSet( SfxItemSet& )
927 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
929 for (StringChangeTable::reverse_iterator it = aChangesTable.rbegin(); it != aChangesTable.rend(); ++it)
931 LanguageType eCurrentLang = it->first;
932 StringChangeList& rStringChangeList = it->second;
933 std::vector<SvxAutocorrWord> aDeleteWords;
934 std::vector<SvxAutocorrWord> aNewWords;
936 for (sal_uInt32 i = 0; i < rStringChangeList.aDeletedEntries.size(); i++)
938 DoubleString& deleteEntry = rStringChangeList.aDeletedEntries[i];
939 SvxAutocorrWord aDeleteWord( deleteEntry.sShort, deleteEntry.sLong );
940 aDeleteWords.push_back( aDeleteWord );
943 for (sal_uInt32 i = 0; i < rStringChangeList.aNewEntries.size(); i++)
945 DoubleString& newEntry = rStringChangeList.aNewEntries[i];
947 //fdo#67697 if the user data is set then we want to retain the
948 //source formatting of the entry, so don't use the optimized
949 //text-only MakeCombinedChanges for this entry
950 bool bKeepSourceFormatting = newEntry.pUserData == &bHasSelectionText;
951 if (bKeepSourceFormatting)
953 pAutoCorrect->PutText(newEntry.sShort, *SfxObjectShell::Current(), eCurrentLang);
954 continue;
957 SvxAutocorrWord aNewWord( newEntry.sShort, newEntry.sLong );
958 aNewWords.push_back( aNewWord );
960 pAutoCorrect->MakeCombinedChanges( aNewWords, aDeleteWords, eCurrentLang );
962 aChangesTable.clear();
963 return sal_False;
966 void OfaAutocorrReplacePage::RefillReplaceBox(sal_Bool bFromReset,
967 LanguageType eOldLanguage,
968 LanguageType eNewLanguage)
970 eLang = eNewLanguage;
971 if(bFromReset)
973 aDoubleStringTable.clear();
974 aChangesTable.clear();
976 else
978 DoubleStringArray* pArray;
979 if(aDoubleStringTable.find(eOldLanguage) != aDoubleStringTable.end())
981 pArray = &aDoubleStringTable[eOldLanguage];
982 pArray->clear();
984 else
986 pArray = &aDoubleStringTable[eOldLanguage]; // create new array
989 sal_uInt32 nListBoxCount = (sal_uInt32) m_pReplaceTLB->GetEntryCount();
990 sal_uInt32 i;
991 for(i = 0; i < nListBoxCount; i++)
993 pArray->push_back(DoubleString());
994 DoubleString& rDouble = (*pArray)[pArray->size() - 1];
995 SvTreeListEntry* pEntry = m_pReplaceTLB->GetEntry( i );
996 rDouble.sShort = m_pReplaceTLB->GetEntryText(pEntry, 0);
997 rDouble.sLong = m_pReplaceTLB->GetEntryText(pEntry, 1);
998 rDouble.pUserData = pEntry->GetUserData();
1002 m_pReplaceTLB->Clear();
1003 if( !bSWriter )
1004 aFormatText.clear();
1006 if( aDoubleStringTable.find(eLang) != aDoubleStringTable.end() )
1008 DoubleStringArray& rArray = aDoubleStringTable[eNewLanguage];
1009 for( sal_uInt32 i = 0; i < rArray.size(); i++ )
1011 DoubleString& rDouble = rArray[i];
1012 sal_Bool bTextOnly = 0 == rDouble.pUserData;
1013 // formatted text is only in Writer
1014 if(bSWriter || bTextOnly)
1016 String sEntry(rDouble.sShort);
1017 sEntry += '\t';
1018 sEntry += rDouble.sLong;
1019 SvTreeListEntry* pEntry = m_pReplaceTLB->InsertEntry(sEntry);
1020 m_pTextOnlyCB->Check(bTextOnly);
1021 if(!bTextOnly)
1022 pEntry->SetUserData(rDouble.pUserData); // that means: with format info or even with selection text
1024 else
1026 aFormatText.insert(rDouble.sShort);
1030 else
1032 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
1033 SvxAutocorrWordList* pWordList = pAutoCorrect->LoadAutocorrWordList(eLang);
1034 m_pReplaceTLB->SetUpdateMode(sal_False);
1035 SvxAutocorrWordList::Content aContent = pWordList->getSortedContent();
1036 for( SvxAutocorrWordList::Content::const_iterator it = aContent.begin();
1037 it != aContent.end(); ++it )
1039 SvxAutocorrWord* pWordPtr = *it;
1040 sal_Bool bTextOnly = pWordPtr->IsTextOnly();
1041 // formatted text is only in Writer
1042 if(bSWriter || bTextOnly)
1044 String sEntry(pWordPtr->GetShort());
1045 sEntry += '\t';
1046 sEntry += pWordPtr->GetLong();
1047 SvTreeListEntry* pEntry = m_pReplaceTLB->InsertEntry(sEntry);
1048 m_pTextOnlyCB->Check(pWordPtr->IsTextOnly());
1049 if(!bTextOnly)
1050 pEntry->SetUserData(m_pTextOnlyCB); // that means: with format info
1052 else
1054 aFormatText.insert(pWordPtr->GetShort());
1057 m_pNewReplacePB->Enable(sal_False);
1058 m_pDeleteReplacePB->Enable(sal_False);
1059 m_pReplaceTLB->SetUpdateMode(sal_True);
1062 SfxViewShell* pViewShell = SfxViewShell::Current();
1063 if( pViewShell && pViewShell->HasSelection( sal_True ) )
1065 bHasSelectionText = sal_True;
1066 const String sSelection( pViewShell->GetSelectionText() );
1067 m_pReplaceED->SetText( sSelection );
1068 m_pTextOnlyCB->Check( !bSWriter );
1069 m_pTextOnlyCB->Enable( bSWriter && sSelection.Len() );
1071 else
1073 m_pTextOnlyCB->Enable( sal_False );
1077 void OfaAutocorrReplacePage::Reset( const SfxItemSet& )
1079 RefillReplaceBox(sal_True, eLang, eLang);
1080 m_pShortED->GrabFocus();
1083 void OfaAutocorrReplacePage::SetLanguage(LanguageType eSet)
1085 //save old settings an refill
1086 if(eSet != eLang)
1088 RefillReplaceBox(sal_False, eLang, eSet);
1089 eLastDialogLanguage = eSet;
1090 delete pCompareClass;
1091 delete pCharClass;
1093 LanguageTag aLanguageTag( eLastDialogLanguage );
1094 pCompareClass = new CollatorWrapper( comphelper::getProcessComponentContext() );
1095 pCompareClass->loadDefaultCollator( aLanguageTag.getLocale(), 0 );
1096 pCharClass = new CharClass( aLanguageTag );
1097 ModifyHdl(m_pShortED);
1101 IMPL_LINK(OfaAutocorrReplacePage, SelectHdl, SvTabListBox*, pBox)
1103 if(!bFirstSelect || !bHasSelectionText)
1105 SvTreeListEntry* pEntry = pBox->FirstSelected();
1106 OUString sTmpShort(pBox->GetEntryText(pEntry, 0));
1107 // if the text is set via ModifyHdl, the cursor is always at the beginning
1108 // of a word, although you're editing here
1109 sal_Bool bSameContent = 0 == pCompareClass->compareString( sTmpShort, m_pShortED->GetText() );
1110 Selection aSel = m_pShortED->GetSelection();
1111 if(m_pShortED->GetText() != sTmpShort)
1113 m_pShortED->SetText(sTmpShort);
1114 // if it was only a different notation, the selection has to be set again
1115 if(bSameContent)
1117 m_pShortED->SetSelection(aSel);
1120 m_pReplaceED->SetText( pBox->GetEntryText(pEntry, 1) );
1121 // with UserData there is a Formatinfo
1122 m_pTextOnlyCB->Check( pEntry->GetUserData() == 0);
1124 else
1126 bFirstSelect = sal_False;
1129 m_pNewReplacePB->Enable(sal_False);
1130 m_pDeleteReplacePB->Enable();
1131 return 0;
1134 void OfaAutocorrReplacePage::NewEntry(String sShort, String sLong, bool bKeepSourceFormatting)
1136 DoubleStringArray& rNewArray = aChangesTable[eLang].aNewEntries;
1137 for (sal_uInt32 i = 0; i < rNewArray.size(); i++)
1139 if (rNewArray[i].sShort == sShort)
1141 rNewArray.erase(rNewArray.begin() + i);
1142 break;
1146 DoubleStringArray& rDeletedArray = aChangesTable[eLang].aDeletedEntries;
1147 for (sal_uInt32 i = 0; i < rDeletedArray.size(); i++)
1149 if (rDeletedArray[i].sShort == sShort)
1151 rDeletedArray.erase(rDeletedArray.begin() + i);
1152 break;
1156 DoubleString aNewString = DoubleString();
1157 aNewString.sShort = sShort;
1158 aNewString.sLong = sLong;
1159 rNewArray.push_back(aNewString);
1160 if (bKeepSourceFormatting)
1161 rNewArray.back().pUserData = &bHasSelectionText;
1164 void OfaAutocorrReplacePage::DeleteEntry(String sShort, String sLong)
1166 DoubleStringArray& rNewArray = aChangesTable[eLang].aNewEntries;
1167 for (sal_uInt32 i = 0; i < rNewArray.size(); i++)
1169 if (rNewArray[i].sShort == sShort)
1171 rNewArray.erase(rNewArray.begin() + i);
1172 break;
1176 DoubleStringArray& rDeletedArray = aChangesTable[eLang].aDeletedEntries;
1177 for (sal_uInt32 i = 0; i < rDeletedArray.size(); i++)
1179 if (rDeletedArray[i].sShort == sShort)
1181 rDeletedArray.erase(rDeletedArray.begin() + i);
1182 break;
1186 DoubleString aDeletedString = DoubleString();
1187 aDeletedString.sShort = sShort;
1188 aDeletedString.sLong = sLong;
1189 rDeletedArray.push_back(aDeletedString);
1192 IMPL_LINK(OfaAutocorrReplacePage, NewDelHdl, PushButton*, pBtn)
1194 SvTreeListEntry* pEntry = m_pReplaceTLB->FirstSelected();
1195 if( pBtn == m_pDeleteReplacePB )
1197 DBG_ASSERT( pEntry, "no entry selected" );
1198 if( pEntry )
1200 DeleteEntry(m_pReplaceTLB->GetEntryText(pEntry, 0), m_pReplaceTLB->GetEntryText(pEntry, 1));
1201 m_pReplaceTLB->GetModel()->Remove(pEntry);
1202 ModifyHdl(m_pShortED);
1203 return 0;
1206 if(pBtn == m_pNewReplacePB || m_pNewReplacePB->IsEnabled())
1208 SvTreeListEntry* _pNewEntry = m_pReplaceTLB->FirstSelected();
1209 String sEntry(m_pShortED->GetText());
1210 if(sEntry.Len() && ( !m_pReplaceED->GetText().isEmpty() ||
1211 ( bHasSelectionText && bSWriter ) ))
1213 bool bKeepSourceFormatting = !bReplaceEditChanged && !m_pTextOnlyCB->IsChecked();
1215 NewEntry(m_pShortED->GetText(), m_pReplaceED->GetText(), bKeepSourceFormatting);
1216 m_pReplaceTLB->SetUpdateMode(sal_False);
1217 sal_uInt32 nPos = UINT_MAX;
1218 sEntry += '\t';
1219 sEntry += m_pReplaceED->GetText();
1220 if(_pNewEntry)
1222 nPos = (sal_uInt32) m_pReplaceTLB->GetModel()->GetAbsPos(_pNewEntry);
1223 m_pReplaceTLB->GetModel()->Remove(_pNewEntry);
1225 else
1227 sal_uInt32 j;
1228 for( j = 0; j < m_pReplaceTLB->GetEntryCount(); j++ )
1230 SvTreeListEntry* pReplaceEntry = m_pReplaceTLB->GetEntry(j);
1231 if( 0 >= pCompareClass->compareString(sEntry, m_pReplaceTLB->GetEntryText(pReplaceEntry, 0) ) )
1232 break;
1234 nPos = j;
1236 SvTreeListEntry* pInsEntry = m_pReplaceTLB->InsertEntry(
1237 sEntry, static_cast< SvTreeListEntry * >(NULL), false,
1238 nPos == UINT_MAX ? LIST_APPEND : nPos);
1239 if (bKeepSourceFormatting)
1241 pInsEntry->SetUserData(&bHasSelectionText); // new formatted text
1244 m_pReplaceTLB->MakeVisible( pInsEntry );
1245 m_pReplaceTLB->SetUpdateMode( sal_True );
1246 // if the request came from the ReplaceEdit, give focus to the ShortEdit
1247 if(m_pReplaceED->HasFocus())
1249 m_pShortED->GrabFocus();
1253 else
1255 // this can only be an enter in one of the two edit fields
1256 // which means EndDialog() - has to be evaluated in KeyInput
1257 return 0;
1259 ModifyHdl(m_pShortED);
1260 return 1;
1263 IMPL_LINK(OfaAutocorrReplacePage, ModifyHdl, Edit*, pEdt)
1265 SvTreeListEntry* pFirstSel = m_pReplaceTLB->FirstSelected();
1266 sal_Bool bShort = pEdt == m_pShortED;
1267 const String rEntry = pEdt->GetText();
1268 const String rRepString = m_pReplaceED->GetText();
1269 String aWordStr( pCharClass->lowercase( rEntry ));
1271 if(bShort)
1273 if(rEntry.Len())
1275 sal_Bool bFound = sal_False;
1276 sal_Bool bTmpSelEntry=sal_False;
1278 for(sal_uInt32 i = 0; i < m_pReplaceTLB->GetEntryCount(); i++)
1280 SvTreeListEntry* pEntry = m_pReplaceTLB->GetEntry( i );
1281 String aTestStr=m_pReplaceTLB->GetEntryText(pEntry, 0);
1282 if( pCompareClass->compareString(rEntry, aTestStr ) == 0 )
1284 if( rRepString.Len() )
1286 bFirstSelect = sal_True;
1288 m_pReplaceTLB->SetCurEntry(pEntry);
1289 pFirstSel = pEntry;
1290 m_pNewReplacePB->SetText(sModify);
1291 bFound = sal_True;
1292 break;
1294 else
1296 aTestStr = pCharClass->lowercase( aTestStr );
1297 if( aTestStr.Search(aWordStr) == 0 && !bTmpSelEntry )
1299 m_pReplaceTLB->MakeVisible( pEntry );
1300 bTmpSelEntry = sal_True;
1304 if( !bFound )
1306 m_pReplaceTLB->SelectAll( sal_False );
1307 pFirstSel = 0;
1308 m_pNewReplacePB->SetText( sNew );
1309 if( bReplaceEditChanged )
1310 m_pTextOnlyCB->Enable(sal_False);
1312 m_pDeleteReplacePB->Enable( bFound );
1314 else if( m_pReplaceTLB->GetEntryCount() > 0 )
1316 SvTreeListEntry* pEntry = m_pReplaceTLB->GetEntry( 0 );
1317 m_pReplaceTLB->MakeVisible( pEntry );
1321 else if( !bShort )
1323 bReplaceEditChanged = sal_True;
1324 if( pFirstSel )
1326 m_pNewReplacePB->SetText( sModify );
1330 const String& rShortTxt = m_pShortED->GetText();
1331 sal_Bool bEnableNew = rShortTxt.Len() &&
1332 ( rRepString.Len() ||
1333 ( bHasSelectionText && bSWriter )) &&
1334 ( !pFirstSel || rRepString !=
1335 m_pReplaceTLB->GetEntryText( pFirstSel, 1 ) );
1336 if( bEnableNew )
1338 for(std::set<OUString>::iterator i = aFormatText.begin(); i != aFormatText.end(); ++i)
1340 if((*i).equals(rShortTxt))
1342 bEnableNew = sal_False;
1343 break;
1347 m_pNewReplacePB->Enable( bEnableNew );
1349 return 0;
1352 static sal_Bool lcl_FindInArray(std::vector<OUString>& rStrings, const String& rString)
1354 for(std::vector<OUString>::iterator i = rStrings.begin(); i != rStrings.end(); ++i)
1356 if((*i).equals(rString))
1358 return sal_True;
1361 return sal_False;
1364 OfaAutocorrExceptPage::OfaAutocorrExceptPage(Window* pParent, const SfxItemSet& rSet)
1365 : SfxTabPage(pParent, "AcorExceptPage", "cui/ui/acorexceptpage.ui", rSet)
1366 , eLang(eLastDialogLanguage)
1368 get(m_pAbbrevED, "abbrev");
1369 get(m_pAbbrevLB, "abbrevlist");
1370 m_pAbbrevLB->SetStyle(m_pAbbrevLB->GetStyle() | WB_SORT);
1371 m_pAbbrevLB->SetDropDownLineCount(7);
1372 get(m_pNewAbbrevPB, "newabbrev");
1373 get(m_pDelAbbrevPB, "delabbrev");
1374 get(m_pAutoAbbrevCB, "autoabbrev");
1376 get(m_pDoubleCapsED, "double");
1377 get(m_pDoubleCapsLB, "doublelist");
1378 m_pDoubleCapsLB->SetStyle(m_pDoubleCapsLB->GetStyle() | WB_SORT);
1379 m_pDoubleCapsLB->SetDropDownLineCount(7);
1380 get(m_pNewDoublePB, "newdouble");
1381 get(m_pDelDoublePB, "deldouble");
1382 get(m_pAutoCapsCB, "autodouble");
1384 ::com::sun::star::lang::Locale aLcl( LanguageTag(eLastDialogLanguage ).getLocale());
1385 pCompareClass = new CollatorWrapper( comphelper::getProcessComponentContext() );
1386 pCompareClass->loadDefaultCollator( aLcl, 0 );
1388 m_pNewAbbrevPB->SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1389 m_pDelAbbrevPB->SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1390 m_pNewDoublePB->SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1391 m_pDelDoublePB->SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1393 m_pAbbrevLB->SetSelectHdl(LINK(this, OfaAutocorrExceptPage, SelectHdl));
1394 m_pDoubleCapsLB->SetSelectHdl(LINK(this, OfaAutocorrExceptPage, SelectHdl));
1395 m_pAbbrevED->SetModifyHdl(LINK(this, OfaAutocorrExceptPage, ModifyHdl));
1396 m_pDoubleCapsED->SetModifyHdl(LINK(this, OfaAutocorrExceptPage, ModifyHdl));
1398 m_pAbbrevED->SetActionHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1399 m_pDoubleCapsED->SetActionHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1402 OfaAutocorrExceptPage::~OfaAutocorrExceptPage()
1404 aStringsTable.clear();
1405 delete pCompareClass;
1408 SfxTabPage* OfaAutocorrExceptPage::Create( Window* pParent,
1409 const SfxItemSet& rSet)
1411 return new OfaAutocorrExceptPage(pParent, rSet);
1414 void OfaAutocorrExceptPage::ActivatePage( const SfxItemSet& )
1416 if(eLang != eLastDialogLanguage)
1417 SetLanguage(eLastDialogLanguage);
1418 ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_True);
1421 int OfaAutocorrExceptPage::DeactivatePage( SfxItemSet* )
1423 return LEAVE_PAGE;
1426 sal_Bool OfaAutocorrExceptPage::FillItemSet( SfxItemSet& )
1428 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
1429 for(StringsTable::reverse_iterator it1 = aStringsTable.rbegin(); it1 != aStringsTable.rend(); ++it1)
1431 LanguageType eCurLang = it1->first;
1432 StringsArrays& rArrays = it1->second;
1433 if(eCurLang != eLang) // current language is treated later
1435 SvStringsISortDtor* pWrdList = pAutoCorrect->LoadWrdSttExceptList(eCurLang);
1437 if(pWrdList)
1439 sal_uInt16 nCount = pWrdList->size();
1440 sal_uInt16 i;
1441 for( i = nCount; i; )
1443 String* pString = (*pWrdList)[ --i ];
1445 if( !lcl_FindInArray(rArrays.aDoubleCapsStrings, *pString))
1447 delete (*pWrdList)[ i ];
1448 pWrdList->erase(i);
1452 for(std::vector<OUString>::iterator it = rArrays.aDoubleCapsStrings.begin(); it != rArrays.aDoubleCapsStrings.end(); ++it)
1454 String* s = new String(*it);
1455 if(!pWrdList->insert(s).second)
1456 delete s;
1458 pAutoCorrect->SaveWrdSttExceptList(eCurLang);
1461 SvStringsISortDtor* pCplList = pAutoCorrect->LoadCplSttExceptList(eCurLang);
1463 if(pCplList)
1465 sal_uInt16 nCount = pCplList->size();
1466 sal_uInt16 i;
1467 for( i = nCount; i; )
1469 String* pString = (*pCplList)[ --i ];
1470 if( !lcl_FindInArray(rArrays.aAbbrevStrings, *pString))
1472 delete (*pCplList)[ i ];
1473 pCplList->erase(i);
1477 for(std::vector<OUString>::iterator it = rArrays.aAbbrevStrings.begin(); it != rArrays.aAbbrevStrings.end(); ++it)
1479 String* s = new String(*it);
1480 if(!pCplList->insert(s).second)
1481 delete s;
1484 pAutoCorrect->SaveCplSttExceptList(eCurLang);
1488 aStringsTable.clear();
1490 SvStringsISortDtor* pWrdList = pAutoCorrect->LoadWrdSttExceptList(eLang);
1492 if(pWrdList)
1494 sal_uInt16 nCount = pWrdList->size();
1495 sal_uInt16 i;
1496 for( i = nCount; i; )
1498 String* pString = (*pWrdList)[ --i ];
1499 if( USHRT_MAX == m_pDoubleCapsLB->GetEntryPos(*pString) )
1501 delete (*pWrdList)[ i ];
1502 pWrdList->erase(i);
1505 nCount = m_pDoubleCapsLB->GetEntryCount();
1506 for( i = 0; i < nCount; ++i )
1508 String* pEntry = new String( m_pDoubleCapsLB->GetEntry( i ) );
1509 if( !pWrdList->insert( pEntry ).second)
1510 delete pEntry;
1512 pAutoCorrect->SaveWrdSttExceptList(eLang);
1515 SvStringsISortDtor* pCplList = pAutoCorrect->LoadCplSttExceptList(eLang);
1517 if(pCplList)
1519 sal_uInt16 nCount = pCplList->size();
1520 sal_uInt16 i;
1521 for( i = nCount; i; )
1523 String* pString = (*pCplList)[ --i ];
1524 if( USHRT_MAX == m_pAbbrevLB->GetEntryPos(*pString) )
1526 delete (*pCplList)[ i ];
1527 pCplList->erase(i);
1530 nCount = m_pAbbrevLB->GetEntryCount();
1531 for( i = 0; i < nCount; ++i )
1533 String* pEntry = new String( m_pAbbrevLB->GetEntry( i ) );
1534 if( !pCplList->insert( pEntry ).second)
1535 delete pEntry;
1537 pAutoCorrect->SaveCplSttExceptList(eLang);
1539 if(m_pAutoAbbrevCB->IsChecked() != m_pAutoAbbrevCB->GetSavedValue())
1540 pAutoCorrect->SetAutoCorrFlag( SaveWordCplSttLst, m_pAutoAbbrevCB->IsChecked());
1541 if(m_pAutoCapsCB->IsChecked() != m_pAutoCapsCB->GetSavedValue())
1542 pAutoCorrect->SetAutoCorrFlag( SaveWordWrdSttLst, m_pAutoCapsCB->IsChecked());
1543 return sal_False;
1546 void OfaAutocorrExceptPage::SetLanguage(LanguageType eSet)
1548 if(eLang != eSet)
1550 // save old settings and fill anew
1551 RefillReplaceBoxes(sal_False, eLang, eSet);
1552 eLastDialogLanguage = eSet;
1553 delete pCompareClass;
1554 pCompareClass = new CollatorWrapper( comphelper::getProcessComponentContext() );
1555 pCompareClass->loadDefaultCollator( LanguageTag( eLastDialogLanguage ).getLocale(), 0 );
1556 ModifyHdl(m_pAbbrevED);
1557 ModifyHdl(m_pDoubleCapsED);
1561 void OfaAutocorrExceptPage::RefillReplaceBoxes(sal_Bool bFromReset,
1562 LanguageType eOldLanguage,
1563 LanguageType eNewLanguage)
1565 eLang = eNewLanguage;
1566 if(bFromReset)
1568 aStringsTable.clear();
1570 else
1572 StringsArrays* pArrays;
1573 if(aStringsTable.find(eOldLanguage) != aStringsTable.end())
1575 pArrays = &aStringsTable[eOldLanguage];
1576 pArrays->aAbbrevStrings.clear();
1577 pArrays->aDoubleCapsStrings.clear();
1579 else
1581 pArrays = &aStringsTable[eOldLanguage]; // create new array
1584 sal_uInt16 i;
1585 for(i = 0; i < m_pAbbrevLB->GetEntryCount(); i++)
1586 pArrays->aAbbrevStrings.push_back(OUString(m_pAbbrevLB->GetEntry(i)));
1588 for(i = 0; i < m_pDoubleCapsLB->GetEntryCount(); i++)
1589 pArrays->aDoubleCapsStrings.push_back(OUString(m_pDoubleCapsLB->GetEntry(i)));
1591 m_pDoubleCapsLB->Clear();
1592 m_pAbbrevLB->Clear();
1593 String sTemp;
1594 m_pAbbrevED->SetText(sTemp);
1595 m_pDoubleCapsED->SetText(sTemp);
1597 if(aStringsTable.find(eLang) != aStringsTable.end())
1599 StringsArrays& rArrays = aStringsTable[eLang];
1600 for(std::vector<OUString>::iterator i = rArrays.aAbbrevStrings.begin(); i != rArrays.aAbbrevStrings.end(); ++i)
1601 m_pAbbrevLB->InsertEntry(*i);
1603 for(std::vector<OUString>::iterator i = rArrays.aDoubleCapsStrings.begin(); i != rArrays.aDoubleCapsStrings.end(); ++i)
1604 m_pDoubleCapsLB->InsertEntry(*i);
1606 else
1608 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
1609 const SvStringsISortDtor* pCplList = pAutoCorrect->GetCplSttExceptList(eLang);
1610 const SvStringsISortDtor* pWrdList = pAutoCorrect->GetWrdSttExceptList(eLang);
1611 sal_uInt16 i;
1612 for( i = 0; i < pCplList->size(); i++ )
1614 m_pAbbrevLB->InsertEntry(*(*pCplList)[i]);
1616 for( i = 0; i < pWrdList->size(); i++ )
1618 m_pDoubleCapsLB->InsertEntry(*(*pWrdList)[i]);
1623 void OfaAutocorrExceptPage::Reset( const SfxItemSet& )
1625 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
1626 RefillReplaceBoxes(sal_True, eLang, eLang);
1627 m_pAutoAbbrevCB-> Check( pAutoCorrect->IsAutoCorrFlag( SaveWordCplSttLst ));
1628 m_pAutoCapsCB-> Check( pAutoCorrect->IsAutoCorrFlag( SaveWordWrdSttLst ));
1629 m_pAutoAbbrevCB->SaveValue();
1630 m_pAutoCapsCB->SaveValue();
1633 IMPL_LINK(OfaAutocorrExceptPage, NewDelHdl, PushButton*, pBtn)
1635 if((pBtn == m_pNewAbbrevPB || pBtn == (PushButton*)m_pAbbrevED )
1636 && !m_pAbbrevED->GetText().isEmpty())
1638 m_pAbbrevLB->InsertEntry(m_pAbbrevED->GetText());
1639 ModifyHdl(m_pAbbrevED);
1641 else if(pBtn == m_pDelAbbrevPB)
1643 m_pAbbrevLB->RemoveEntry(m_pAbbrevED->GetText());
1644 ModifyHdl(m_pAbbrevED);
1646 else if((pBtn == m_pNewDoublePB || pBtn == (PushButton*)m_pDoubleCapsED )
1647 && !m_pDoubleCapsED->GetText().isEmpty())
1649 m_pDoubleCapsLB->InsertEntry(m_pDoubleCapsED->GetText());
1650 ModifyHdl(m_pDoubleCapsED);
1652 else if(pBtn == m_pDelDoublePB)
1654 m_pDoubleCapsLB->RemoveEntry(m_pDoubleCapsED->GetText());
1655 ModifyHdl(m_pDoubleCapsED);
1657 return 0;
1660 IMPL_LINK(OfaAutocorrExceptPage, SelectHdl, ListBox*, pBox)
1662 if (pBox == m_pAbbrevLB)
1664 m_pAbbrevED->SetText(pBox->GetSelectEntry());
1665 m_pNewAbbrevPB->Enable(sal_False);
1666 m_pDelAbbrevPB->Enable();
1668 else
1670 m_pDoubleCapsED->SetText(pBox->GetSelectEntry());
1671 m_pNewDoublePB->Enable(sal_False);
1672 m_pDelDoublePB->Enable();
1674 return 0;
1677 IMPL_LINK(OfaAutocorrExceptPage, ModifyHdl, Edit*, pEdt)
1679 // sal_Bool bSame = pEdt->GetText() == ->GetSelectEntry();
1680 const String& sEntry = pEdt->GetText();
1681 sal_Bool bEntryLen = 0!= sEntry.Len();
1682 if(pEdt == m_pAbbrevED)
1684 sal_Bool bSame = lcl_FindEntry(*m_pAbbrevLB, sEntry, *pCompareClass);
1685 if(bSame && sEntry != m_pAbbrevLB->GetSelectEntry())
1686 pEdt->SetText(m_pAbbrevLB->GetSelectEntry());
1687 m_pNewAbbrevPB->Enable(!bSame && bEntryLen);
1688 m_pDelAbbrevPB->Enable(bSame && bEntryLen);
1690 else
1692 sal_Bool bSame = lcl_FindEntry(*m_pDoubleCapsLB, sEntry, *pCompareClass);
1693 if(bSame && sEntry != m_pDoubleCapsLB->GetSelectEntry())
1694 pEdt->SetText(m_pDoubleCapsLB->GetSelectEntry());
1695 m_pNewDoublePB->Enable(!bSame && bEntryLen);
1696 m_pDelDoublePB->Enable(bSame && bEntryLen);
1698 return 0;
1701 extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeAutoCorrEdit(Window *pParent,
1702 VclBuilder::stringmap &)
1704 return new AutoCorrEdit(pParent);
1707 void AutoCorrEdit::KeyInput( const KeyEvent& rKEvt )
1709 const KeyCode aKeyCode = rKEvt.GetKeyCode();
1710 const sal_uInt16 nModifier = aKeyCode.GetModifier();
1711 if( aKeyCode.GetCode() == KEY_RETURN )
1713 // if there's nothing done on enter, call the
1714 // base class after all to close the dialog
1715 if(!nModifier && !aActionLink.Call(this))
1716 Edit::KeyInput(rKEvt);
1718 else if(bSpaces || aKeyCode.GetCode() != KEY_SPACE)
1719 Edit::KeyInput(rKEvt);
1722 enum OfaQuoteOptions
1724 ADD_NONBRK_SPACE,
1725 REPLACE_1ST
1728 SvTreeListEntry* OfaQuoteTabPage::CreateEntry(String& rTxt, sal_uInt16 nCol)
1730 SvTreeListEntry* pEntry = new SvTreeListEntry;
1732 if ( !pCheckButtonData )
1734 pCheckButtonData = new SvLBoxButtonData( &aSwCheckLB );
1735 aSwCheckLB.SetCheckButtonData( pCheckButtonData );
1738 pEntry->AddItem( new SvLBoxContextBmp( pEntry, 0, Image(), Image(), 0));
1740 String sEmpty;
1741 if (nCol == CBCOL_SECOND)
1742 pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );
1743 else
1744 pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );
1746 if (nCol == CBCOL_FIRST)
1747 pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );
1748 else
1749 pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );
1751 pEntry->AddItem( new OfaImpBrwString( pEntry, 0, rTxt ) );
1753 return pEntry;
1756 OfaQuoteTabPage::OfaQuoteTabPage( Window* pParent, const SfxItemSet& rSet ) :
1757 SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCORR_QUOTE ), rSet),
1758 aCheckLB (this, CUI_RES(CLB_SETTINGS )),
1759 m_aSwCheckLBContainer(this, CUI_RES(CLB_SETTINGS)),
1760 aSwCheckLB(m_aSwCheckLBContainer),
1761 sHeader1 (CUI_RES( STR_HEADER1 )),
1762 sHeader2 (CUI_RES( STR_HEADER2 )),
1763 sNonBrkSpace (CUI_RES( ST_NON_BREAK_SPACE )),
1764 sOrdinal (CUI_RES( ST_ORDINAL )),
1765 pCheckButtonData ( NULL ),
1767 aSingleFL (this, CUI_RES(FL_SINGLE )),
1768 aSingleTypoCB (this, CUI_RES(CB_SGL_TYPO )),
1769 aSglStartQuoteFT (this, CUI_RES(FT_SGL_STARTQUOTE )),
1770 aSglStartQuotePB (this, CUI_RES(PB_SGL_STARTQUOTE )),
1771 aSglStartExFT (this, CUI_RES(FT_SGSTEX )),
1772 aSglEndQuoteFT (this, CUI_RES(FT_SGL_ENDQUOTE )),
1773 aSglEndQuotePB (this, CUI_RES(PB_SGL_ENDQUOTE )),
1774 aSglEndExFT (this, CUI_RES(FT_SGENEX )),
1775 aSglStandardPB (this, CUI_RES(PB_SGL_STD )),
1777 aDoubleFL (this, CUI_RES(FL_DOUBLE )),
1778 aTypoCB (this, CUI_RES(CB_TYPO )),
1779 aStartQuoteFT (this, CUI_RES(FT_STARTQUOTE )),
1780 aStartQuotePB (this, CUI_RES(PB_STARTQUOTE )),
1781 aDblStartExFT (this, CUI_RES(FT_DBSTEX )),
1782 aEndQuoteFT (this, CUI_RES(FT_ENDQUOTE )),
1783 aEndQuotePB (this, CUI_RES(PB_ENDQUOTE )),
1784 aDblEndExFT (this, CUI_RES(FT_DBECEX )),
1785 aDblStandardPB (this, CUI_RES(PB_DBL_STD )),
1787 sStartQuoteDlg (CUI_RES(STR_CHANGE_START)),
1788 sEndQuoteDlg (CUI_RES(STR_CHANGE_END)),
1790 sStandard(CUI_RES(ST_STANDARD))
1792 aSglStandardPB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_STD) ) );
1793 aDblStandardPB.SetAccessibleName(String(CUI_RES(STR_PB_DBL_STD) ) );
1794 aStartQuotePB.SetAccessibleName( String(CUI_RES(STR_PB_DBL_START) ));
1795 aEndQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_DBL_END) ));
1796 aSglStartQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_START) ));
1797 aSglEndQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_END) ) );
1799 FreeResource();
1801 sal_Bool bShowSWOptions = sal_False;
1803 aCheckLB.SetHelpId( HID_OFAPAGE_QUOTE_CLB );
1804 aSwCheckLB.SetHelpId( HID_OFAPAGE_QUOTE_SW_CLB );
1806 SFX_ITEMSET_ARG( &rSet, pItem, SfxBoolItem, SID_AUTO_CORRECT_DLG, sal_False );
1807 if ( pItem && pItem->GetValue() )
1808 bShowSWOptions = sal_True;
1810 if ( bShowSWOptions )
1812 static long aStaticTabs[]=
1814 3, 0, 20, 40
1817 aSwCheckLB.SetStyle(aSwCheckLB.GetStyle() | WB_HSCROLL| WB_VSCROLL);
1819 aSwCheckLB.SvxSimpleTable::SetTabs(aStaticTabs);
1820 String sHeader( sHeader1 );
1821 sHeader += '\t';
1822 sHeader += sHeader2;
1823 sHeader += '\t';
1824 aSwCheckLB.InsertHeaderEntry( sHeader, HEADERBAR_APPEND,
1825 HIB_CENTER | HIB_VCENTER | HIB_FIXEDPOS | HIB_FIXED);
1826 aCheckLB.Hide( sal_True );
1828 else
1830 aSwCheckLB.HideTable( );
1833 aStartQuotePB.SetClickHdl(LINK(this, OfaQuoteTabPage, QuoteHdl));
1834 aEndQuotePB.SetClickHdl(LINK(this, OfaQuoteTabPage, QuoteHdl));
1835 aSglStartQuotePB.SetClickHdl(LINK(this, OfaQuoteTabPage, QuoteHdl));
1836 aSglEndQuotePB.SetClickHdl(LINK(this, OfaQuoteTabPage, QuoteHdl));
1837 aDblStandardPB.SetClickHdl(LINK(this, OfaQuoteTabPage, StdQuoteHdl));
1838 aSglStandardPB.SetClickHdl(LINK(this, OfaQuoteTabPage, StdQuoteHdl));
1840 aSglStartQuotePB.SetAccessibleRelationLabeledBy( &aSglStartQuoteFT );
1841 aSglEndQuotePB.SetAccessibleRelationLabeledBy( &aSglEndQuoteFT );
1842 aSglStartQuotePB.SetAccessibleRelationMemberOf( &aSingleFL );
1843 aSglEndQuotePB.SetAccessibleRelationMemberOf( &aSingleFL );
1844 aStartQuotePB.SetAccessibleRelationLabeledBy( &aStartQuoteFT );
1845 aEndQuotePB.SetAccessibleRelationLabeledBy( &aEndQuoteFT );
1846 aStartQuotePB.SetAccessibleRelationMemberOf( &aDoubleFL );
1847 aEndQuotePB.SetAccessibleRelationMemberOf( &aDoubleFL );
1848 aSglStandardPB.SetAccessibleRelationMemberOf(&aSingleFL);
1849 aDblStandardPB.SetAccessibleRelationMemberOf(&aDoubleFL);
1852 OfaQuoteTabPage::~OfaQuoteTabPage()
1854 delete( pCheckButtonData );
1857 SfxTabPage* OfaQuoteTabPage::Create( Window* pParent,
1858 const SfxItemSet& rAttrSet)
1860 return new OfaQuoteTabPage(pParent, rAttrSet);
1863 sal_Bool OfaQuoteTabPage::FillItemSet( SfxItemSet& )
1865 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
1867 long nFlags = pAutoCorrect->GetFlags();
1869 if ( aCheckLB.IsVisible( ) )
1871 sal_uInt16 nPos = 0;
1872 pAutoCorrect->SetAutoCorrFlag(AddNonBrkSpace, aCheckLB.IsChecked(nPos++));
1873 pAutoCorrect->SetAutoCorrFlag(ChgOrdinalNumber, aCheckLB.IsChecked(nPos++));
1876 sal_Bool bModified = sal_False;
1877 if ( aSwCheckLB.IsVisible( ) )
1879 SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
1881 sal_Bool bCheck = aSwCheckLB.IsChecked(ADD_NONBRK_SPACE, CBCOL_FIRST);
1882 bModified |= pOpt->bAddNonBrkSpace != bCheck;
1883 pOpt->bAddNonBrkSpace = bCheck;
1884 pAutoCorrect->SetAutoCorrFlag(AddNonBrkSpace,
1885 aSwCheckLB.IsChecked(ADD_NONBRK_SPACE, CBCOL_SECOND));
1887 bCheck = aSwCheckLB.IsChecked(REPLACE_1ST, CBCOL_FIRST);
1888 bModified |= pOpt->bChgOrdinalNumber != bCheck;
1889 pOpt->bChgOrdinalNumber = bCheck;
1890 pAutoCorrect->SetAutoCorrFlag(ChgOrdinalNumber,
1891 aSwCheckLB.IsChecked(REPLACE_1ST, CBCOL_SECOND));
1894 pAutoCorrect->SetAutoCorrFlag(ChgQuotes, aTypoCB.IsChecked());
1895 pAutoCorrect->SetAutoCorrFlag(ChgSglQuotes, aSingleTypoCB.IsChecked());
1896 sal_Bool bReturn = nFlags != pAutoCorrect->GetFlags();
1897 if(cStartQuote != pAutoCorrect->GetStartDoubleQuote())
1899 bReturn = sal_True;
1900 sal_Unicode cUCS2 = static_cast<sal_Unicode>(cStartQuote); //TODO
1901 pAutoCorrect->SetStartDoubleQuote(cUCS2);
1903 if(cEndQuote != pAutoCorrect->GetEndDoubleQuote())
1905 bReturn = sal_True;
1906 sal_Unicode cUCS2 = static_cast<sal_Unicode>(cEndQuote); //TODO
1907 pAutoCorrect->SetEndDoubleQuote(cUCS2);
1909 if(cSglStartQuote != pAutoCorrect->GetStartSingleQuote())
1911 bReturn = sal_True;
1912 sal_Unicode cUCS2 = static_cast<sal_Unicode>(cSglStartQuote); //TODO
1913 pAutoCorrect->SetStartSingleQuote(cUCS2);
1915 if(cSglEndQuote != pAutoCorrect->GetEndSingleQuote())
1917 bReturn = sal_True;
1918 sal_Unicode cUCS2 = static_cast<sal_Unicode>(cSglEndQuote); //TODO
1919 pAutoCorrect->SetEndSingleQuote(cUCS2);
1922 if( bModified || bReturn )
1924 SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
1925 rCfg.SetModified();
1926 rCfg.Commit();
1928 return bReturn;
1931 void OfaQuoteTabPage::ActivatePage( const SfxItemSet& )
1933 ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_False);
1936 void OfaQuoteTabPage::Reset( const SfxItemSet& )
1938 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
1939 const long nFlags = pAutoCorrect->GetFlags();
1941 // Initialize the Sw options
1942 if ( aSwCheckLB.IsVisible( ) )
1944 SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
1946 aSwCheckLB.SetUpdateMode( sal_False );
1947 aSwCheckLB.Clear();
1949 aSwCheckLB.GetModel()->Insert(CreateEntry(sNonBrkSpace, CBCOL_BOTH ));
1950 aSwCheckLB.GetModel()->Insert(CreateEntry(sOrdinal, CBCOL_BOTH ));
1952 aSwCheckLB.CheckEntryPos( ADD_NONBRK_SPACE, CBCOL_FIRST, pOpt->bAddNonBrkSpace );
1953 aSwCheckLB.CheckEntryPos( ADD_NONBRK_SPACE, CBCOL_SECOND, 0 != (nFlags & AddNonBrkSpace) );
1954 aSwCheckLB.CheckEntryPos( REPLACE_1ST, CBCOL_FIRST, pOpt->bChgOrdinalNumber );
1955 aSwCheckLB.CheckEntryPos( REPLACE_1ST, CBCOL_SECOND, 0 != (nFlags & ChgOrdinalNumber) );
1957 aSwCheckLB.SetUpdateMode( sal_True );
1960 // Initialize the non Sw options
1961 if ( aCheckLB.IsVisible( ) )
1963 aCheckLB.SetUpdateMode( sal_False );
1964 aCheckLB.Clear( );
1966 aCheckLB.InsertEntry( sNonBrkSpace );
1967 aCheckLB.InsertEntry( sOrdinal );
1969 sal_uInt16 nPos = 0;
1970 aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & AddNonBrkSpace) );
1971 aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & ChgOrdinalNumber) );
1973 aCheckLB.SetUpdateMode( sal_True );
1976 // Initialize the quote stuffs
1977 aTypoCB .Check(0 != (nFlags & ChgQuotes));
1978 aSingleTypoCB .Check(0 != (nFlags & ChgSglQuotes));
1979 aTypoCB .SaveValue();
1980 aSingleTypoCB .SaveValue();
1982 cStartQuote = pAutoCorrect->GetStartDoubleQuote();
1983 cEndQuote = pAutoCorrect->GetEndDoubleQuote();
1984 cSglStartQuote = pAutoCorrect->GetStartSingleQuote();
1985 cSglEndQuote = pAutoCorrect->GetEndSingleQuote();
1987 aSglStartExFT .SetText(ChangeStringExt_Impl(cSglStartQuote));
1988 aSglEndExFT .SetText(ChangeStringExt_Impl(cSglEndQuote));
1989 aDblStartExFT .SetText(ChangeStringExt_Impl(cStartQuote));
1990 aDblEndExFT .SetText(ChangeStringExt_Impl(cEndQuote));
1993 #define SGL_START 0
1994 #define DBL_START 1
1995 #define SGL_END 2
1996 #define DBL_END 3
1999 IMPL_LINK( OfaQuoteTabPage, QuoteHdl, PushButton*, pBtn )
2001 sal_uInt16 nMode = SGL_START;
2002 if(pBtn == &aSglEndQuotePB)
2003 nMode = SGL_END;
2004 else if(pBtn == &aStartQuotePB)
2005 nMode = DBL_START;
2006 else if(pBtn == &aEndQuotePB)
2007 nMode = DBL_END;
2008 // start character selection dialog
2009 SvxCharacterMap* pMap = new SvxCharacterMap( this, sal_True );
2010 pMap->SetCharFont( OutputDevice::GetDefaultFont(DEFAULTFONT_LATIN_TEXT,
2011 LANGUAGE_ENGLISH_US, DEFAULTFONT_FLAGS_ONLYONE, 0 ));
2012 pMap->SetText(nMode < SGL_END ? sStartQuoteDlg : sEndQuoteDlg );
2013 sal_UCS4 cDlg;
2014 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
2015 LanguageType eLang = Application::GetSettings().GetLanguageTag().getLanguageType();
2016 switch( nMode )
2018 case SGL_START:
2019 cDlg = cSglStartQuote;
2020 if(cDlg == 0)
2021 cDlg = pAutoCorrect->GetQuote('\'', sal_True, eLang);
2022 break;
2023 case SGL_END:
2024 cDlg = cSglEndQuote;
2025 if(cDlg == 0)
2026 cDlg = pAutoCorrect->GetQuote('\'', sal_False, eLang);
2027 break;
2028 case DBL_START:
2029 cDlg = cStartQuote;
2030 if(cDlg == 0)
2031 cDlg = pAutoCorrect->GetQuote('\"', sal_True, eLang);
2032 break;
2033 case DBL_END:
2034 cDlg = cEndQuote;
2035 if(cDlg == 0)
2036 cDlg = pAutoCorrect->GetQuote('\"', sal_False, eLang);
2037 break;
2038 default:
2039 OSL_FAIL("svx::OfaQuoteTabPage::QuoteHdl(), how to initialize cDlg?" );
2040 cDlg = 0;
2041 break;
2044 pMap->SetChar( cDlg );
2045 pMap->DisableFontSelection();
2046 if(pMap->Execute() == RET_OK)
2048 sal_UCS4 cNewChar = pMap->GetChar();
2049 switch( nMode )
2051 case SGL_START:
2052 cSglStartQuote = cNewChar;
2053 aSglStartExFT.SetText(ChangeStringExt_Impl(cNewChar));
2054 break;
2055 case SGL_END:
2056 cSglEndQuote = cNewChar;
2057 aSglEndExFT.SetText(ChangeStringExt_Impl(cNewChar));
2058 break;
2059 case DBL_START:
2060 cStartQuote = cNewChar;
2061 aDblStartExFT.SetText(ChangeStringExt_Impl(cNewChar));
2062 break;
2063 case DBL_END:
2064 cEndQuote = cNewChar;
2065 aDblEndExFT.SetText(ChangeStringExt_Impl(cNewChar));
2066 break;
2069 delete pMap;
2071 return 0;
2074 IMPL_LINK( OfaQuoteTabPage, StdQuoteHdl, PushButton*, pBtn )
2076 if(pBtn == &aDblStandardPB)
2078 cStartQuote = 0;
2079 aDblStartExFT.SetText(ChangeStringExt_Impl(0));
2080 cEndQuote = 0;
2081 aDblEndExFT.SetText(ChangeStringExt_Impl(0));
2084 else
2086 cSglStartQuote = 0;
2087 aSglStartExFT.SetText(ChangeStringExt_Impl(0));
2088 cSglEndQuote = 0;
2089 aSglEndExFT.SetText(ChangeStringExt_Impl(0));
2091 return 0;
2094 // --------------------------------------------------
2096 String OfaQuoteTabPage::ChangeStringExt_Impl( sal_UCS4 cChar )
2098 if( !cChar )
2099 return sStandard;
2101 // convert codepoint value to unicode-hex string
2102 sal_UCS4 aStrCodes[32] = { 0, ' ', '(', 'U', '+', '0' };
2103 aStrCodes[0] = cChar;
2104 int nFullLen = 5;
2105 int nHexLen = 4;
2106 while( (cChar >> (4*nHexLen)) != 0 )
2107 ++nHexLen;
2108 for( int i = nHexLen; --i >= 0;)
2110 sal_UCS4 cHexDigit = ((cChar >> (4*i)) & 0x0f) + '0';
2111 if( cHexDigit > '9' )
2112 cHexDigit += 'A' - ('9' + 1);
2113 aStrCodes[ nFullLen++ ] = cHexDigit;
2115 aStrCodes[ nFullLen++ ] = ')';
2116 // using the new UCS4 constructor
2117 OUString aOUStr( aStrCodes, nFullLen );
2118 return aOUStr;
2121 OfaAutoCompleteTabPage::OfaAutoCompleteTabPage( Window* pParent,
2122 const SfxItemSet& rSet )
2123 : SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCOMPLETE_OPTIONS ), rSet),
2124 aCBActiv (this, CUI_RES(CB_ACTIV)),
2125 aCBAppendSpace (this, CUI_RES(CB_APPEND_SPACE)),
2126 aCBAsTip (this, CUI_RES(CB_AS_TIP)),
2127 aCBCollect (this, CUI_RES(CB_COLLECT)),
2128 aCBRemoveList (this, CUI_RES(CB_REMOVE_LIST)),
2129 aFTExpandKey (this, CUI_RES(FT_EXPAND_KEY)),
2130 aDCBExpandKey (this, CUI_RES(DCB_EXPAND_KEY)),
2131 aFTMinWordlen (this, CUI_RES(FT_MIN_WORDLEN)),
2132 aNFMinWordlen (this, CUI_RES(NF_MIN_WORDLEN)),
2133 aFTMaxEntries (this, CUI_RES(FT_MAX_ENTRIES)),
2134 aNFMaxEntries (this, CUI_RES(NF_MAX_ENTRIES)),
2135 aLBEntries (*this, CUI_RES(LB_ENTRIES)),
2136 aPBEntries (this, CUI_RES(PB_ENTRIES)),
2137 m_pAutoCompleteList( 0 ),
2138 nAutoCmpltListCnt( 0 )
2140 FreeResource();
2142 // the defined KEYs
2143 static const sal_uInt16 aKeyCodes[] = {
2144 KEY_END,
2145 KEY_RETURN,
2146 KEY_SPACE,
2147 KEY_RIGHT,
2148 KEY_TAB,
2152 for( const sal_uInt16* pKeys = aKeyCodes; *pKeys; ++pKeys )
2154 KeyCode aKCode( *pKeys );
2155 sal_uInt16 nPos = aDCBExpandKey.InsertEntry( aKCode.GetName() );
2156 aDCBExpandKey.SetEntryData( nPos, (void*)(sal_uLong)*pKeys );
2157 if( KEY_RETURN == *pKeys ) // default to RETURN
2158 aDCBExpandKey.SelectEntryPos( nPos );
2161 aPBEntries.SetClickHdl(LINK(this, OfaAutoCompleteTabPage, DeleteHdl));
2162 aCBActiv.SetToggleHdl(LINK(this, OfaAutoCompleteTabPage, CheckHdl));
2163 aCBCollect.SetToggleHdl(LINK(this, OfaAutoCompleteTabPage, CheckHdl));
2164 aLBEntries.SetAccessibleRelationLabeledBy(&aLBEntries);
2167 OfaAutoCompleteTabPage::~OfaAutoCompleteTabPage()
2171 SfxTabPage* OfaAutoCompleteTabPage::Create( Window* pParent,
2172 const SfxItemSet& rSet)
2174 return new OfaAutoCompleteTabPage( pParent, rSet );
2177 sal_Bool OfaAutoCompleteTabPage::FillItemSet( SfxItemSet& )
2179 sal_Bool bModified = sal_False, bCheck;
2180 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
2181 SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
2182 sal_uInt16 nVal;
2184 bCheck = aCBActiv.IsChecked();
2185 bModified |= pOpt->bAutoCompleteWords != bCheck;
2186 pOpt->bAutoCompleteWords = bCheck;
2187 bCheck = aCBCollect.IsChecked();
2188 bModified |= pOpt->bAutoCmpltCollectWords != bCheck;
2189 pOpt->bAutoCmpltCollectWords = bCheck;
2190 bCheck = !aCBRemoveList.IsChecked(); // inverted value!
2191 bModified |= pOpt->bAutoCmpltKeepList != bCheck;
2192 pOpt->bAutoCmpltKeepList = bCheck;
2193 bCheck = aCBAppendSpace.IsChecked();
2194 bModified |= pOpt->bAutoCmpltAppendBlanc != bCheck;
2195 pOpt->bAutoCmpltAppendBlanc = bCheck;
2196 bCheck = aCBAsTip.IsChecked();
2197 bModified |= pOpt->bAutoCmpltShowAsTip != bCheck;
2198 pOpt->bAutoCmpltShowAsTip = bCheck;
2200 nVal = (sal_uInt16)aNFMinWordlen.GetValue();
2201 bModified |= nVal != pOpt->nAutoCmpltWordLen;
2202 pOpt->nAutoCmpltWordLen = nVal;
2204 nVal = (sal_uInt16)aNFMaxEntries.GetValue();
2205 bModified |= nVal != pOpt->nAutoCmpltListLen;
2206 pOpt->nAutoCmpltListLen = nVal;
2208 nVal = aDCBExpandKey.GetSelectEntryPos();
2209 if( nVal < aDCBExpandKey.GetEntryCount() )
2211 sal_uLong nKey = (sal_uLong)aDCBExpandKey.GetEntryData( nVal );
2212 bModified |= nKey != pOpt->nAutoCmpltExpandKey;
2213 pOpt->nAutoCmpltExpandKey = (sal_uInt16)nKey;
2216 if (m_pAutoCompleteList && nAutoCmpltListCnt != aLBEntries.GetEntryCount())
2218 bModified = sal_True;
2219 pOpt->m_pAutoCompleteList = m_pAutoCompleteList;
2221 if( bModified )
2223 SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
2224 rCfg.SetModified();
2225 rCfg.Commit();
2227 return sal_True;
2230 void OfaAutoCompleteTabPage::Reset( const SfxItemSet& )
2232 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
2233 SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
2235 aCBActiv.Check( 0 != pOpt->bAutoCompleteWords );
2236 aCBCollect.Check( 0 != pOpt->bAutoCmpltCollectWords );
2237 aCBRemoveList.Check( !pOpt->bAutoCmpltKeepList ); //inverted value!
2238 aCBAppendSpace.Check( 0 != pOpt->bAutoCmpltAppendBlanc );
2239 aCBAsTip.Check( 0 != pOpt->bAutoCmpltShowAsTip );
2241 aNFMinWordlen.SetValue( pOpt->nAutoCmpltWordLen );
2242 aNFMaxEntries.SetValue( pOpt->nAutoCmpltListLen );
2244 // select the specific KeyCode:
2246 sal_uLong nKey = pOpt->nAutoCmpltExpandKey;
2247 for( sal_uInt16 n = 0, nCnt = aDCBExpandKey.GetEntryCount(); n < nCnt; ++n )
2248 if( nKey == (sal_uLong)aDCBExpandKey.GetEntryData( n ))
2250 aDCBExpandKey.SelectEntryPos( n );
2251 break;
2255 if (pOpt->m_pAutoCompleteList && pOpt->m_pAutoCompleteList->size())
2257 m_pAutoCompleteList = const_cast<editeng::SortedAutoCompleteStrings*>(
2258 pOpt->m_pAutoCompleteList);
2259 pOpt->m_pAutoCompleteList = 0;
2260 nAutoCmpltListCnt = m_pAutoCompleteList->size();
2261 for (size_t n = 0; n < nAutoCmpltListCnt; ++n)
2263 const String* pStr =
2264 &(*m_pAutoCompleteList)[n]->GetAutoCompleteString();
2265 sal_uInt16 nPos = aLBEntries.InsertEntry( *pStr );
2266 aLBEntries.SetEntryData( nPos, (void*)pStr );
2269 else
2271 aLBEntries.Disable();
2272 aPBEntries.Disable();
2275 CheckHdl( &aCBActiv );
2276 CheckHdl( &aCBCollect );
2279 void OfaAutoCompleteTabPage::ActivatePage( const SfxItemSet& )
2281 ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage( sal_False );
2284 IMPL_LINK_NOARG(OfaAutoCompleteTabPage, DeleteHdl)
2286 sal_uInt16 nSelCnt =
2287 (m_pAutoCompleteList) ? aLBEntries.GetSelectEntryCount() : 0;
2288 while( nSelCnt )
2290 sal_uInt16 nPos = aLBEntries.GetSelectEntryPos( --nSelCnt );
2291 String* pStr = static_cast<String*>(aLBEntries.GetEntryData(nPos));
2292 aLBEntries.RemoveEntry( nPos );
2293 editeng::IAutoCompleteString hack(*pStr); // UGLY
2294 m_pAutoCompleteList->erase(&hack);
2296 return 0;
2299 IMPL_LINK( OfaAutoCompleteTabPage, CheckHdl, CheckBox*, pBox )
2301 sal_Bool bEnable = pBox->IsChecked();
2302 if( pBox == &aCBActiv )
2304 aCBAppendSpace.Enable( bEnable );
2305 aCBAppendSpace.Enable( bEnable );
2306 aCBAsTip.Enable( bEnable );
2307 aDCBExpandKey.Enable( bEnable );
2309 else if(&aCBCollect == pBox)
2310 aCBRemoveList.Enable( bEnable );
2311 return 0;
2314 void OfaAutoCompleteTabPage::CopyToClipboard() const
2316 sal_uInt16 nSelCnt = aLBEntries.GetSelectEntryCount();
2317 if (m_pAutoCompleteList && nSelCnt)
2319 TransferDataContainer* pCntnr = new TransferDataContainer;
2320 ::com::sun::star::uno::Reference<
2321 ::com::sun::star::datatransfer::XTransferable > xRef( pCntnr );
2323 OStringBuffer sData;
2324 const sal_Char aLineEnd[] =
2325 #if defined(WNT)
2326 "\015\012";
2327 #else
2328 "\012";
2329 #endif
2331 rtl_TextEncoding nEncode = osl_getThreadTextEncoding();
2333 for( sal_uInt16 n = 0; n < nSelCnt; ++n )
2335 sData.append(OUStringToOString(aLBEntries.GetSelectEntry(n),
2336 nEncode));
2337 sData.append(RTL_CONSTASCII_STRINGPARAM(aLineEnd));
2339 pCntnr->CopyByteString( SOT_FORMAT_STRING, sData.makeStringAndClear() );
2340 pCntnr->CopyToClipboard( (Window*)this );
2344 long OfaAutoCompleteTabPage::AutoCompleteMultiListBox::PreNotify(
2345 NotifyEvent& rNEvt )
2347 long nHandled = MultiListBox::PreNotify( rNEvt );
2349 if( !nHandled && EVENT_KEYUP == rNEvt.GetType() )
2351 const KeyCode& rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
2352 switch( rKeyCode.GetModifier() | rKeyCode.GetCode() )
2354 case KEY_DELETE:
2355 rPage.DeleteHdl( 0 );
2356 nHandled = 1;
2357 break;
2359 default:
2360 if( KEYFUNC_COPY == rKeyCode.GetFunction() )
2362 rPage.CopyToClipboard();
2363 nHandled = 1;
2365 break;
2368 return nHandled;
2371 // class OfaSmartTagOptionsTabPage ---------------------------------------------
2373 OfaSmartTagOptionsTabPage::OfaSmartTagOptionsTabPage( Window* pParent,
2374 const SfxItemSet& rSet )
2375 : SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_SMARTTAG_OPTIONS ), rSet),
2376 m_aMainCB( this, CUI_RES(CB_SMARTTAGS) ),
2377 m_aSmartTagTypesLB( this, CUI_RES(LB_SMARTTAGS) ),
2378 m_aPropertiesPB( this, CUI_RES(PB_SMARTTAGS) ),
2379 m_aTitleFT( this, CUI_RES(FT_SMARTTAGS) )
2381 FreeResource();
2383 // some options for the list box:
2384 m_aSmartTagTypesLB.SetStyle( m_aSmartTagTypesLB.GetStyle() | WB_HSCROLL | WB_HIDESELECTION );
2385 m_aSmartTagTypesLB.SetHighlightRange();
2387 // set the handlers:
2388 m_aMainCB.SetToggleHdl(LINK(this, OfaSmartTagOptionsTabPage, CheckHdl));
2389 m_aPropertiesPB.SetClickHdl(LINK(this, OfaSmartTagOptionsTabPage, ClickHdl));
2390 m_aSmartTagTypesLB.SetSelectHdl(LINK(this, OfaSmartTagOptionsTabPage, SelectHdl));
2393 OfaSmartTagOptionsTabPage::~OfaSmartTagOptionsTabPage()
2398 SfxTabPage* OfaSmartTagOptionsTabPage::Create( Window* pParent, const SfxItemSet& rSet)
2400 return new OfaSmartTagOptionsTabPage( pParent, rSet );
2403 /** This struct is used to associate list box entries with smart tag data
2405 struct ImplSmartTagLBUserData
2407 OUString maSmartTagType;
2408 uno::Reference< smarttags::XSmartTagRecognizer > mxRec;
2409 sal_Int32 mnSmartTagIdx;
2411 ImplSmartTagLBUserData( const OUString& rSmartTagType,
2412 uno::Reference< smarttags::XSmartTagRecognizer > xRec,
2413 sal_Int32 nSmartTagIdx ) :
2414 maSmartTagType( rSmartTagType ),
2415 mxRec( xRec ),
2416 mnSmartTagIdx( nSmartTagIdx ) {}
2419 /** Clears m_aSmartTagTypesLB
2421 void OfaSmartTagOptionsTabPage::ClearListBox()
2423 const sal_uLong nCount = m_aSmartTagTypesLB.GetEntryCount();
2424 for ( sal_uInt16 i = 0; i < nCount; ++i )
2426 const SvTreeListEntry* pEntry = m_aSmartTagTypesLB.GetEntry(i);
2427 const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
2428 delete pUserData;
2431 m_aSmartTagTypesLB.Clear();
2434 /** Inserts items into m_aSmartTagTypesLB
2436 void OfaSmartTagOptionsTabPage::FillListBox( const SmartTagMgr& rSmartTagMgr )
2438 // first we have to clear the list box:
2439 ClearListBox();
2441 // fill list box:
2442 const sal_uInt32 nNumberOfRecognizers = rSmartTagMgr.NumberOfRecognizers();
2443 const lang::Locale aLocale( LanguageTag( eLastDialogLanguage ).getLocale() );
2445 for ( sal_uInt32 i = 0; i < nNumberOfRecognizers; ++i )
2447 uno::Reference< smarttags::XSmartTagRecognizer > xRec = rSmartTagMgr.GetRecognizer(i);
2449 const OUString aName = xRec->getName( aLocale );
2450 const sal_Int32 nNumberOfSupportedSmartTags = xRec->getSmartTagCount();
2452 for ( sal_Int32 j = 0; j < nNumberOfSupportedSmartTags; ++j )
2454 const OUString aSmartTagType = xRec->getSmartTagName(j);
2455 OUString aSmartTagCaption = rSmartTagMgr.GetSmartTagCaption( aSmartTagType, aLocale );
2457 if ( aSmartTagCaption.isEmpty() )
2458 aSmartTagCaption = aSmartTagType;
2460 const OUString aLBEntry = aSmartTagCaption +
2461 OUString(" (") +
2462 aName +
2463 OUString(")");
2465 SvTreeListEntry* pEntry = m_aSmartTagTypesLB.SvTreeListBox::InsertEntry( aLBEntry );
2466 if ( pEntry )
2468 const bool bCheck = rSmartTagMgr.IsSmartTagTypeEnabled( aSmartTagType );
2469 m_aSmartTagTypesLB.SetCheckButtonState( pEntry, bCheck ? SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED );
2470 pEntry->SetUserData(static_cast<void*>(new ImplSmartTagLBUserData( aSmartTagType, xRec, j ) ) );
2476 /** Handler for the push button
2478 IMPL_LINK_NOARG(OfaSmartTagOptionsTabPage, ClickHdl)
2480 const sal_uInt16 nPos = m_aSmartTagTypesLB.GetSelectEntryPos();
2481 const SvTreeListEntry* pEntry = m_aSmartTagTypesLB.GetEntry(nPos);
2482 const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
2483 uno::Reference< smarttags::XSmartTagRecognizer > xRec = pUserData->mxRec;
2484 const sal_Int32 nSmartTagIdx = pUserData->mnSmartTagIdx;
2486 const lang::Locale aLocale( LanguageTag( eLastDialogLanguage ).getLocale() );
2487 if ( xRec->hasPropertyPage( nSmartTagIdx, aLocale ) )
2488 xRec->displayPropertyPage( nSmartTagIdx, aLocale );
2490 return 0;
2493 /** Handler for the check box
2495 IMPL_LINK_NOARG(OfaSmartTagOptionsTabPage, CheckHdl)
2497 const sal_Bool bEnable = m_aMainCB.IsChecked();
2498 m_aSmartTagTypesLB.Enable( bEnable );
2499 m_aSmartTagTypesLB.Invalidate();
2500 m_aPropertiesPB.Enable( false );
2502 // if the controls are currently enabled, we still have to check
2503 // if the properties button should be disabled because the currently
2504 // seleted smart tag type does not have a properties dialog.
2505 // We do this by calling SelectHdl:
2506 if ( bEnable )
2507 SelectHdl( &m_aSmartTagTypesLB );
2509 return 0;
2512 /** Handler for the list box
2514 IMPL_LINK_NOARG(OfaSmartTagOptionsTabPage, SelectHdl)
2516 if ( m_aSmartTagTypesLB.GetEntryCount() < 1 )
2517 return 0;
2519 const sal_uInt16 nPos = m_aSmartTagTypesLB.GetSelectEntryPos();
2520 const SvTreeListEntry* pEntry = m_aSmartTagTypesLB.GetEntry(nPos);
2521 const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
2522 uno::Reference< smarttags::XSmartTagRecognizer > xRec = pUserData->mxRec;
2523 const sal_Int32 nSmartTagIdx = pUserData->mnSmartTagIdx;
2525 const lang::Locale aLocale( LanguageTag( eLastDialogLanguage ).getLocale() );
2526 if ( xRec->hasPropertyPage( nSmartTagIdx, aLocale ) )
2527 m_aPropertiesPB.Enable( sal_True );
2528 else
2529 m_aPropertiesPB.Enable( sal_False );
2531 return 0;
2534 /** Propagates the current settings to the smart tag manager.
2536 sal_Bool OfaSmartTagOptionsTabPage::FillItemSet( SfxItemSet& )
2538 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
2539 SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
2540 SmartTagMgr* pSmartTagMgr = pOpt->pSmartTagMgr;
2542 // robust!
2543 if ( !pSmartTagMgr )
2544 return sal_False;
2546 sal_Bool bModifiedSmartTagTypes = sal_False;
2547 std::vector< OUString > aDisabledSmartTagTypes;
2549 const sal_uLong nCount = m_aSmartTagTypesLB.GetEntryCount();
2551 for ( sal_uInt16 i = 0; i < nCount; ++i )
2553 const SvTreeListEntry* pEntry = m_aSmartTagTypesLB.GetEntry(i);
2554 const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
2555 const sal_Bool bChecked = m_aSmartTagTypesLB.IsChecked(i);
2556 const sal_Bool bIsCurrentlyEnabled = pSmartTagMgr->IsSmartTagTypeEnabled( pUserData->maSmartTagType );
2558 bModifiedSmartTagTypes = bModifiedSmartTagTypes || ( !bChecked != !bIsCurrentlyEnabled );
2560 if ( !bChecked )
2561 aDisabledSmartTagTypes.push_back( pUserData->maSmartTagType );
2563 delete pUserData;
2566 const sal_Bool bModifiedRecognize = ( !m_aMainCB.IsChecked() != !pSmartTagMgr->IsLabelTextWithSmartTags() );
2567 if ( bModifiedSmartTagTypes || bModifiedRecognize )
2569 bool bLabelTextWithSmartTags = m_aMainCB.IsChecked() ? true : false;
2570 pSmartTagMgr->WriteConfiguration( bModifiedRecognize ? &bLabelTextWithSmartTags : 0,
2571 bModifiedSmartTagTypes ? &aDisabledSmartTagTypes : 0 );
2574 return sal_True;
2577 /** Sets the controls based on the current settings at SmartTagMgr.
2579 void OfaSmartTagOptionsTabPage::Reset( const SfxItemSet& )
2581 SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect();
2582 SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
2583 const SmartTagMgr* pSmartTagMgr = pOpt->pSmartTagMgr;
2585 // robust, should not happen!
2586 if ( !pSmartTagMgr )
2587 return;
2589 FillListBox( *pSmartTagMgr );
2590 m_aSmartTagTypesLB.SelectEntryPos( 0 );
2591 m_aMainCB.Check( pSmartTagMgr->IsLabelTextWithSmartTags() );
2592 CheckHdl( &m_aMainCB );
2595 void OfaSmartTagOptionsTabPage::ActivatePage( const SfxItemSet& )
2597 ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage( sal_False );
2600 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */