1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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"
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
;
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);
89 RemoveTabPage("apply");
90 RemoveTabPage("wordcompletion");
91 RemoveTabPage("smarttags");
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();
148 for(i
= 0; i
< nCount
; i
++)
150 if( 0 == rCmpClass
.compareString(rEntry
, rLB
.GetEntry(i
) ))
152 rLB
.SelectEntryPos(i
, sal_True
);
156 if(LISTBOX_ENTRY_NOTFOUND
!= nSelPos
)
157 rLB
.SelectEntryPos(nSelPos
, 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
);
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
))
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();
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();
225 SvxAutoCorrCfg
& rCfg
= SvxAutoCorrCfg::Get();
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
);
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
);
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 /*********************************************************************/
269 /* helping struct for dUserData of the Checklistbox */
271 /*********************************************************************/
278 ImpUserData(String
* pText
, Font
* pFnt
)
279 { pString
= pText
; pFont
= pFnt
;}
283 /*********************************************************************/
285 /* dialog for per cent settings */
287 /*********************************************************************/
289 class OfaAutoFmtPrcntSet
: public ModalDialog
292 CancelButton aCancelPB
;
294 MetricField aPrcntMF
;
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
))
306 MetricField
& GetPrcntFld(){return aPrcntMF
;}
310 /*********************************************************************/
312 /* changed LBoxString */
314 /*********************************************************************/
316 class OfaImpBrwString
: public SvLBoxString
320 OfaImpBrwString( SvTreeListEntry
* pEntry
, sal_uInt16 nFlags
,
321 const String
& rStr
) : SvLBoxString(pEntry
,nFlags
,rStr
){}
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();
337 aNewPos
.X() += rDev
.GetTextWidth(GetText());
338 Font
aOldFont( rDev
.GetFont());
339 Font
aFont( aOldFont
);
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
;
351 String
sTxt( pUserData
->pString
->GetToken( 0, 1, nPos
));
354 rDev
.SetFont( aFont
);
356 rDev
.DrawText( aNewPos
, sTxt
);
359 aNewPos
.X() += rDev
.GetTextWidth( sTxt
);
362 rDev
.SetFont( aOldFont
);
365 } while( -1 != nPos
);
369 /*********************************************************************/
371 /* use TabPage autoformat */
373 /*********************************************************************/
375 #define CBCOL_FIRST 0
376 #define CBCOL_SECOND 1
379 enum OfaAutoFmtOptions
387 DEL_SPACES_AT_STT_END
,
388 DEL_SPACES_BETWEEN_LINES
,
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
)),
431 pCheckButtonData( NULL
)
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
[]=
450 aCheckLB
.SvxSimpleTable::SetTabs(aStaticTabs
);
451 String
sHeader( sHeader1
);
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));
474 if (nCol
== CBCOL_SECOND
)
475 pEntry
->AddItem( new SvLBoxString( pEntry
, 0, sEmpty
) );
477 pEntry
->AddItem( new SvLBoxButton( pEntry
, SvLBoxButtonKind_enabledCheckbox
, 0, pCheckButtonData
) );
479 if (nCol
== CBCOL_FIRST
)
480 pEntry
->AddItem( new SvLBoxString( pEntry
, 0, sEmpty
) );
482 pEntry
->AddItem( new SvLBoxButton( pEntry
, SvLBoxButtonKind_enabledCheckbox
, 0, pCheckButtonData
) );
483 pEntry
->AddItem( new OfaImpBrwString( pEntry
, 0, rTxt
) );
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();
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
);
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());
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
;
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();
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() )
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
)
786 case SV_BUTTON_CHECKED
:
787 pItem
->SetStateChecked();
790 case SV_BUTTON_UNCHECKED
:
791 pItem
->SetStateUnchecked();
794 case SV_BUTTON_TRISTATE
:
795 pItem
->SetStateTristate();
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
);
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;
831 CheckEntryPos( nSelPos
, nCol
, !IsChecked( nSelPos
, nCol
) );
832 CallImplEventListeners( VCLEVENT_CHECKBOX_TOGGLE
, (void*)GetEntry( nSelPos
) );
836 sal_uInt16 nCheck
= IsChecked(nSelPos
, 1) ? 1 : 0;
837 if(IsChecked(nSelPos
, 0))
841 CheckEntryPos(nSelPos
, 1, 0 != (nCheck
& 1));
842 CheckEntryPos(nSelPos
, 0, 0 != (nCheck
& 2));
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)
855 , bReplaceEditChanged(false)
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
;
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
* )
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
);
957 SvxAutocorrWord
aNewWord( newEntry
.sShort
, newEntry
.sLong
);
958 aNewWords
.push_back( aNewWord
);
960 pAutoCorrect
->MakeCombinedChanges( aNewWords
, aDeleteWords
, eCurrentLang
);
962 aChangesTable
.clear();
966 void OfaAutocorrReplacePage::RefillReplaceBox(sal_Bool bFromReset
,
967 LanguageType eOldLanguage
,
968 LanguageType eNewLanguage
)
970 eLang
= eNewLanguage
;
973 aDoubleStringTable
.clear();
974 aChangesTable
.clear();
978 DoubleStringArray
* pArray
;
979 if(aDoubleStringTable
.find(eOldLanguage
) != aDoubleStringTable
.end())
981 pArray
= &aDoubleStringTable
[eOldLanguage
];
986 pArray
= &aDoubleStringTable
[eOldLanguage
]; // create new array
989 sal_uInt32 nListBoxCount
= (sal_uInt32
) m_pReplaceTLB
->GetEntryCount();
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();
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
);
1018 sEntry
+= rDouble
.sLong
;
1019 SvTreeListEntry
* pEntry
= m_pReplaceTLB
->InsertEntry(sEntry
);
1020 m_pTextOnlyCB
->Check(bTextOnly
);
1022 pEntry
->SetUserData(rDouble
.pUserData
); // that means: with format info or even with selection text
1026 aFormatText
.insert(rDouble
.sShort
);
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());
1046 sEntry
+= pWordPtr
->GetLong();
1047 SvTreeListEntry
* pEntry
= m_pReplaceTLB
->InsertEntry(sEntry
);
1048 m_pTextOnlyCB
->Check(pWordPtr
->IsTextOnly());
1050 pEntry
->SetUserData(m_pTextOnlyCB
); // that means: with format info
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() );
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
1088 RefillReplaceBox(sal_False
, eLang
, eSet
);
1089 eLastDialogLanguage
= eSet
;
1090 delete pCompareClass
;
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
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);
1126 bFirstSelect
= sal_False
;
1129 m_pNewReplacePB
->Enable(sal_False
);
1130 m_pDeleteReplacePB
->Enable();
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
);
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
);
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
);
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
);
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" );
1200 DeleteEntry(m_pReplaceTLB
->GetEntryText(pEntry
, 0), m_pReplaceTLB
->GetEntryText(pEntry
, 1));
1201 m_pReplaceTLB
->GetModel()->Remove(pEntry
);
1202 ModifyHdl(m_pShortED
);
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
;
1219 sEntry
+= m_pReplaceED
->GetText();
1222 nPos
= (sal_uInt32
) m_pReplaceTLB
->GetModel()->GetAbsPos(_pNewEntry
);
1223 m_pReplaceTLB
->GetModel()->Remove(_pNewEntry
);
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) ) )
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();
1255 // this can only be an enter in one of the two edit fields
1256 // which means EndDialog() - has to be evaluated in KeyInput
1259 ModifyHdl(m_pShortED
);
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
));
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
);
1290 m_pNewReplacePB
->SetText(sModify
);
1296 aTestStr
= pCharClass
->lowercase( aTestStr
);
1297 if( aTestStr
.Search(aWordStr
) == 0 && !bTmpSelEntry
)
1299 m_pReplaceTLB
->MakeVisible( pEntry
);
1300 bTmpSelEntry
= sal_True
;
1306 m_pReplaceTLB
->SelectAll( sal_False
);
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
);
1323 bReplaceEditChanged
= sal_True
;
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 ) );
1338 for(std::set
<OUString
>::iterator i
= aFormatText
.begin(); i
!= aFormatText
.end(); ++i
)
1340 if((*i
).equals(rShortTxt
))
1342 bEnableNew
= sal_False
;
1347 m_pNewReplacePB
->Enable( bEnableNew
);
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
))
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
* )
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
);
1439 sal_uInt16 nCount
= pWrdList
->size();
1441 for( i
= nCount
; i
; )
1443 String
* pString
= (*pWrdList
)[ --i
];
1445 if( !lcl_FindInArray(rArrays
.aDoubleCapsStrings
, *pString
))
1447 delete (*pWrdList
)[ 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
)
1458 pAutoCorrect
->SaveWrdSttExceptList(eCurLang
);
1461 SvStringsISortDtor
* pCplList
= pAutoCorrect
->LoadCplSttExceptList(eCurLang
);
1465 sal_uInt16 nCount
= pCplList
->size();
1467 for( i
= nCount
; i
; )
1469 String
* pString
= (*pCplList
)[ --i
];
1470 if( !lcl_FindInArray(rArrays
.aAbbrevStrings
, *pString
))
1472 delete (*pCplList
)[ 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
)
1484 pAutoCorrect
->SaveCplSttExceptList(eCurLang
);
1488 aStringsTable
.clear();
1490 SvStringsISortDtor
* pWrdList
= pAutoCorrect
->LoadWrdSttExceptList(eLang
);
1494 sal_uInt16 nCount
= pWrdList
->size();
1496 for( i
= nCount
; i
; )
1498 String
* pString
= (*pWrdList
)[ --i
];
1499 if( USHRT_MAX
== m_pDoubleCapsLB
->GetEntryPos(*pString
) )
1501 delete (*pWrdList
)[ 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
)
1512 pAutoCorrect
->SaveWrdSttExceptList(eLang
);
1515 SvStringsISortDtor
* pCplList
= pAutoCorrect
->LoadCplSttExceptList(eLang
);
1519 sal_uInt16 nCount
= pCplList
->size();
1521 for( i
= nCount
; i
; )
1523 String
* pString
= (*pCplList
)[ --i
];
1524 if( USHRT_MAX
== m_pAbbrevLB
->GetEntryPos(*pString
) )
1526 delete (*pCplList
)[ 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
)
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());
1546 void OfaAutocorrExceptPage::SetLanguage(LanguageType 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
;
1568 aStringsTable
.clear();
1572 StringsArrays
* pArrays
;
1573 if(aStringsTable
.find(eOldLanguage
) != aStringsTable
.end())
1575 pArrays
= &aStringsTable
[eOldLanguage
];
1576 pArrays
->aAbbrevStrings
.clear();
1577 pArrays
->aDoubleCapsStrings
.clear();
1581 pArrays
= &aStringsTable
[eOldLanguage
]; // create new array
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();
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
);
1608 SvxAutoCorrect
* pAutoCorrect
= SvxAutoCorrCfg::Get().GetAutoCorrect();
1609 const SvStringsISortDtor
* pCplList
= pAutoCorrect
->GetCplSttExceptList(eLang
);
1610 const SvStringsISortDtor
* pWrdList
= pAutoCorrect
->GetWrdSttExceptList(eLang
);
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
);
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();
1670 m_pDoubleCapsED
->SetText(pBox
->GetSelectEntry());
1671 m_pNewDoublePB
->Enable(sal_False
);
1672 m_pDelDoublePB
->Enable();
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
);
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
);
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
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));
1741 if (nCol
== CBCOL_SECOND
)
1742 pEntry
->AddItem( new SvLBoxString( pEntry
, 0, sEmpty
) );
1744 pEntry
->AddItem( new SvLBoxButton( pEntry
, SvLBoxButtonKind_enabledCheckbox
, 0, pCheckButtonData
) );
1746 if (nCol
== CBCOL_FIRST
)
1747 pEntry
->AddItem( new SvLBoxString( pEntry
, 0, sEmpty
) );
1749 pEntry
->AddItem( new SvLBoxButton( pEntry
, SvLBoxButtonKind_enabledCheckbox
, 0, pCheckButtonData
) );
1751 pEntry
->AddItem( new OfaImpBrwString( pEntry
, 0, rTxt
) );
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
) ) );
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
[]=
1817 aSwCheckLB
.SetStyle(aSwCheckLB
.GetStyle() | WB_HSCROLL
| WB_VSCROLL
);
1819 aSwCheckLB
.SvxSimpleTable::SetTabs(aStaticTabs
);
1820 String
sHeader( sHeader1
);
1822 sHeader
+= sHeader2
;
1824 aSwCheckLB
.InsertHeaderEntry( sHeader
, HEADERBAR_APPEND
,
1825 HIB_CENTER
| HIB_VCENTER
| HIB_FIXEDPOS
| HIB_FIXED
);
1826 aCheckLB
.Hide( sal_True
);
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())
1900 sal_Unicode cUCS2
= static_cast<sal_Unicode
>(cStartQuote
); //TODO
1901 pAutoCorrect
->SetStartDoubleQuote(cUCS2
);
1903 if(cEndQuote
!= pAutoCorrect
->GetEndDoubleQuote())
1906 sal_Unicode cUCS2
= static_cast<sal_Unicode
>(cEndQuote
); //TODO
1907 pAutoCorrect
->SetEndDoubleQuote(cUCS2
);
1909 if(cSglStartQuote
!= pAutoCorrect
->GetStartSingleQuote())
1912 sal_Unicode cUCS2
= static_cast<sal_Unicode
>(cSglStartQuote
); //TODO
1913 pAutoCorrect
->SetStartSingleQuote(cUCS2
);
1915 if(cSglEndQuote
!= pAutoCorrect
->GetEndSingleQuote())
1918 sal_Unicode cUCS2
= static_cast<sal_Unicode
>(cSglEndQuote
); //TODO
1919 pAutoCorrect
->SetEndSingleQuote(cUCS2
);
1922 if( bModified
|| bReturn
)
1924 SvxAutoCorrCfg
& rCfg
= SvxAutoCorrCfg::Get();
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
);
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
);
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
));
1999 IMPL_LINK( OfaQuoteTabPage
, QuoteHdl
, PushButton
*, pBtn
)
2001 sal_uInt16 nMode
= SGL_START
;
2002 if(pBtn
== &aSglEndQuotePB
)
2004 else if(pBtn
== &aStartQuotePB
)
2006 else if(pBtn
== &aEndQuotePB
)
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
);
2014 SvxAutoCorrect
* pAutoCorrect
= SvxAutoCorrCfg::Get().GetAutoCorrect();
2015 LanguageType eLang
= Application::GetSettings().GetLanguageTag().getLanguageType();
2019 cDlg
= cSglStartQuote
;
2021 cDlg
= pAutoCorrect
->GetQuote('\'', sal_True
, eLang
);
2024 cDlg
= cSglEndQuote
;
2026 cDlg
= pAutoCorrect
->GetQuote('\'', sal_False
, eLang
);
2031 cDlg
= pAutoCorrect
->GetQuote('\"', sal_True
, eLang
);
2036 cDlg
= pAutoCorrect
->GetQuote('\"', sal_False
, eLang
);
2039 OSL_FAIL("svx::OfaQuoteTabPage::QuoteHdl(), how to initialize cDlg?" );
2044 pMap
->SetChar( cDlg
);
2045 pMap
->DisableFontSelection();
2046 if(pMap
->Execute() == RET_OK
)
2048 sal_UCS4 cNewChar
= pMap
->GetChar();
2052 cSglStartQuote
= cNewChar
;
2053 aSglStartExFT
.SetText(ChangeStringExt_Impl(cNewChar
));
2056 cSglEndQuote
= cNewChar
;
2057 aSglEndExFT
.SetText(ChangeStringExt_Impl(cNewChar
));
2060 cStartQuote
= cNewChar
;
2061 aDblStartExFT
.SetText(ChangeStringExt_Impl(cNewChar
));
2064 cEndQuote
= cNewChar
;
2065 aDblEndExFT
.SetText(ChangeStringExt_Impl(cNewChar
));
2074 IMPL_LINK( OfaQuoteTabPage
, StdQuoteHdl
, PushButton
*, pBtn
)
2076 if(pBtn
== &aDblStandardPB
)
2079 aDblStartExFT
.SetText(ChangeStringExt_Impl(0));
2081 aDblEndExFT
.SetText(ChangeStringExt_Impl(0));
2087 aSglStartExFT
.SetText(ChangeStringExt_Impl(0));
2089 aSglEndExFT
.SetText(ChangeStringExt_Impl(0));
2094 // --------------------------------------------------
2096 String
OfaQuoteTabPage::ChangeStringExt_Impl( sal_UCS4 cChar
)
2101 // convert codepoint value to unicode-hex string
2102 sal_UCS4 aStrCodes
[32] = { 0, ' ', '(', 'U', '+', '0' };
2103 aStrCodes
[0] = cChar
;
2106 while( (cChar
>> (4*nHexLen
)) != 0 )
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
);
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 )
2143 static const sal_uInt16 aKeyCodes
[] = {
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();
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
;
2223 SvxAutoCorrCfg
& rCfg
= SvxAutoCorrCfg::Get();
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
);
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
);
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;
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
);
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
);
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
[] =
2331 rtl_TextEncoding nEncode
= osl_getThreadTextEncoding();
2333 for( sal_uInt16 n
= 0; n
< nSelCnt
; ++n
)
2335 sData
.append(OUStringToOString(aLBEntries
.GetSelectEntry(n
),
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() )
2355 rPage
.DeleteHdl( 0 );
2360 if( KEYFUNC_COPY
== rKeyCode
.GetFunction() )
2362 rPage
.CopyToClipboard();
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
) )
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
),
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());
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:
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
+
2465 SvTreeListEntry
* pEntry
= m_aSmartTagTypesLB
.SvTreeListBox::InsertEntry( aLBEntry
);
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
);
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:
2507 SelectHdl( &m_aSmartTagTypesLB
);
2512 /** Handler for the list box
2514 IMPL_LINK_NOARG(OfaSmartTagOptionsTabPage
, SelectHdl
)
2516 if ( m_aSmartTagTypesLB
.GetEntryCount() < 1 )
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
);
2529 m_aPropertiesPB
.Enable( sal_False
);
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
;
2543 if ( !pSmartTagMgr
)
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
);
2561 aDisabledSmartTagTypes
.push_back( pUserData
->maSmartTagType
);
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 );
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
)
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: */