xref: /trunk/main/cui/source/tabpages/autocdlg.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_cui.hxx"
30 
31 #define _SVSTDARR_STRINGSISORTDTOR
32 #define _SVSTDARR_STRINGSDTOR
33 #include <svl/svstdarr.hxx>
34 #include <vcl/msgbox.hxx>
35 #include <vcl/field.hxx>
36 #include <vcl/keycodes.hxx>
37 #include <sot/exchange.hxx>
38 #include <svtools/transfer.hxx>
39 #include <unotools/syslocale.hxx>
40 #include <sfx2/objsh.hxx>
41 #include <sfx2/viewsh.hxx>
42 #include <unotools/charclass.hxx>
43 #include <unotools/collatorwrapper.hxx>
44 #include <com/sun/star/i18n/CollatorOptions.hpp>
45 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
46 #include <comphelper/processfactory.hxx>
47 #include <vcl/svapp.hxx>
48 #include <sfx2/module.hxx>
49 #include <sfx2/request.hxx>
50 #include <sfx2/sfxsids.hrc>
51 #include <svl/eitem.hxx>
52 #include <svl/languageoptions.hxx>
53 #include <svx/SmartTagMgr.hxx>
54 #include <com/sun/star/smarttags/XSmartTagRecognizer.hpp>
55 #include <com/sun/star/smarttags/XSmartTagAction.hpp>
56 
57 #define _OFA_AUTOCDLG_CXX
58 #include "autocdlg.hxx"
59 #include "autocdlg.hrc"
60 #include "helpid.hrc"
61 #include <editeng/acorrcfg.hxx>
62 #include <editeng/svxacorr.hxx>
63 #include "cuicharmap.hxx"
64 #include <editeng/unolingu.hxx>
65 #include <dialmgr.hxx>
66 #include <svx/svxids.hrc> // SID_OPEN_SMARTTAGSOPTIONS
67 
68 static LanguageType eLastDialogLanguage = LANGUAGE_SYSTEM;
69 
70 using namespace ::com::sun::star::util;
71 using namespace ::com::sun::star;
72 using namespace ::rtl;
73 
74 static ::com::sun::star::uno::Reference<
75         ::com::sun::star::lang::XMultiServiceFactory >& GetProcessFact()
76 {
77     static ::com::sun::star::uno::Reference<
78             ::com::sun::star::lang::XMultiServiceFactory > xMSF =
79                                     ::comphelper::getProcessServiceFactory();
80     return xMSF;
81 }
82 
83 /*-----------------14.10.96 15.47-------------------
84 
85 --------------------------------------------------*/
86 
87 OfaAutoCorrDlg::OfaAutoCorrDlg(Window* pParent, const SfxItemSet* _pSet ) :
88     SfxTabDialog(pParent, CUI_RES( RID_OFA_AUTOCORR_DLG ), _pSet),
89     aLanguageFT(    this, CUI_RES(FT_LANG         )),
90     aLanguageLB(    this, CUI_RES(LB_LANG             ))
91 {
92     sal_Bool bShowSWOptions = sal_False;
93     sal_Bool bOpenSmartTagOptions = sal_False;
94 
95     if ( _pSet )
96     {
97         SFX_ITEMSET_ARG( _pSet, pItem, SfxBoolItem, SID_AUTO_CORRECT_DLG, sal_False );
98         if ( pItem && pItem->GetValue() )
99             bShowSWOptions = sal_True;
100 
101         SFX_ITEMSET_ARG( _pSet, pItem2, SfxBoolItem, SID_OPEN_SMARTTAGOPTIONS, sal_False );
102         if ( pItem2 && pItem2->GetValue() )
103             bOpenSmartTagOptions = sal_True;
104     }
105 
106     aLanguageFT.SetZOrder(0, WINDOW_ZORDER_FIRST);
107     aLanguageLB.SetZOrder(&aLanguageFT, WINDOW_ZORDER_BEHIND);
108     aLanguageLB.SetHelpId(HID_AUTOCORR_LANGUAGE);
109     FreeResource();
110 
111     AddTabPage(RID_OFAPAGE_AUTOCORR_OPTIONS, OfaAutocorrOptionsPage::Create, 0);
112     AddTabPage(RID_OFAPAGE_AUTOFMT_APPLY, OfaSwAutoFmtOptionsPage::Create, 0);
113     AddTabPage(RID_OFAPAGE_AUTOCOMPLETE_OPTIONS, OfaAutoCompleteTabPage::Create, 0);
114     AddTabPage(RID_OFAPAGE_SMARTTAG_OPTIONS, OfaSmartTagOptionsTabPage::Create, 0);
115 
116     if (!bShowSWOptions)
117     {
118         RemoveTabPage(RID_OFAPAGE_AUTOFMT_APPLY);
119         RemoveTabPage(RID_OFAPAGE_AUTOCOMPLETE_OPTIONS);
120         RemoveTabPage(RID_OFAPAGE_SMARTTAG_OPTIONS);
121     }
122     else
123     {
124         // remove smart tag tab page if no extensions are installed
125         SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
126         SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
127         if ( !pOpt || !pOpt->pSmartTagMgr || 0 == pOpt->pSmartTagMgr->NumberOfRecognizers() )
128             RemoveTabPage(RID_OFAPAGE_SMARTTAG_OPTIONS);
129 
130         RemoveTabPage(RID_OFAPAGE_AUTOCORR_OPTIONS);
131     }
132 
133     AddTabPage(RID_OFAPAGE_AUTOCORR_REPLACE, OfaAutocorrReplacePage::Create, 0);
134     AddTabPage(RID_OFAPAGE_AUTOCORR_EXCEPT,  OfaAutocorrExceptPage::Create, 0);
135     AddTabPage(RID_OFAPAGE_AUTOCORR_QUOTE,   OfaQuoteTabPage::Create, 0);
136 
137     // initialize languages
138     //! LANGUAGE_NONE is displayed as '[All]' and the LanguageType
139     //! will be set to LANGUAGE_DONTKNOW
140     sal_Int16 nLangList = LANG_LIST_WESTERN;
141 
142     if( SvtLanguageOptions().IsCTLFontEnabled() )
143         nLangList |= LANG_LIST_CTL;
144     aLanguageLB.SetLanguageList( nLangList, sal_True, sal_True );
145     aLanguageLB.SelectLanguage( LANGUAGE_NONE );
146     sal_uInt16 nPos = aLanguageLB.GetSelectEntryPos();
147     DBG_ASSERT( LISTBOX_ENTRY_NOTFOUND != nPos, "listbox entry missing" );
148     aLanguageLB.SetEntryData( nPos, (void*)(long) LANGUAGE_DONTKNOW );
149 
150     // Initialisierung funktionier fuer static nicht unter Linux - deswegen hier
151     if( LANGUAGE_SYSTEM == eLastDialogLanguage )
152         eLastDialogLanguage = Application::GetSettings().GetLanguage();
153 
154     LanguageType nSelectLang = LANGUAGE_DONTKNOW;
155     nPos = aLanguageLB.GetEntryPos( (void*)(long) eLastDialogLanguage );
156     if (LISTBOX_ENTRY_NOTFOUND != nPos)
157         nSelectLang = eLastDialogLanguage;
158     aLanguageLB.SelectLanguage( nSelectLang );
159 
160     aLanguageLB.SetSelectHdl(LINK(this, OfaAutoCorrDlg, SelectLanguageHdl));
161 
162     Size aMinSize(aLanguageFT.CalcMinimumSize());
163     //reserve some extra space for CJK accelerators that are possible inserted
164     //later (like '(A)')
165     aLanguageFT.SetPosSizePixel( 0, 0, aMinSize.Width() + 20, 0, WINDOW_POSSIZE_WIDTH );
166 
167     if ( bOpenSmartTagOptions )
168         SetCurPageId( RID_OFAPAGE_SMARTTAG_OPTIONS );
169 }
170 /*-----------------16.10.96 14.06-------------------
171 
172 --------------------------------------------------*/
173 
174 sal_Bool lcl_FindEntry( ListBox& rLB, const String& rEntry,
175                     CollatorWrapper& rCmpClass )
176 {
177     sal_uInt16 nCount = rLB.GetEntryCount();
178     sal_uInt16 nSelPos = rLB.GetSelectEntryPos();
179     sal_uInt16 i;
180     for(i = 0; i < nCount; i++)
181     {
182         if( 0 == rCmpClass.compareString(rEntry, rLB.GetEntry(i) ))
183         {
184             rLB.SelectEntryPos(i, sal_True);
185             return sal_True;
186         }
187     }
188     if(LISTBOX_ENTRY_NOTFOUND != nSelPos)
189         rLB.SelectEntryPos(nSelPos, sal_False);
190     return sal_False;
191 }
192 
193 /* -----------------23.11.98 10:46-------------------
194  *
195  * --------------------------------------------------*/
196 IMPL_LINK(OfaAutoCorrDlg, SelectLanguageHdl, ListBox*, pBox)
197 {
198     sal_uInt16 nPos = pBox->GetSelectEntryPos();
199     void* pVoid = pBox->GetEntryData(nPos);
200     LanguageType eNewLang = (LanguageType)(long)pVoid;
201     //alte Einstellungen speichern und neu fuellen
202     if(eNewLang != eLastDialogLanguage)
203     {
204         sal_uInt16  nPageId = GetCurPageId();
205         if(RID_OFAPAGE_AUTOCORR_REPLACE == nPageId)
206             ((OfaAutocorrReplacePage*)GetTabPage( nPageId ))->SetLanguage(eNewLang);
207         else if(RID_OFAPAGE_AUTOCORR_EXCEPT == nPageId)
208             ((OfaAutocorrExceptPage*)GetTabPage( nPageId ))->SetLanguage(eNewLang);
209     }
210     return 0;
211 }
212 /*-----------------14.10.96 15.57-------------------
213 
214 --------------------------------------------------*/
215 
216 OfaAutocorrOptionsPage::OfaAutocorrOptionsPage( Window* pParent,
217                                                 const SfxItemSet& rSet ) :
218     SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCORR_OPTIONS ), rSet),
219     aCheckLB            (this, CUI_RES(CLB_SETTINGS )),
220 
221     sInput              (CUI_RES(ST_USE_REPLACE     )),
222     sDoubleCaps         (CUI_RES(ST_CPTL_STT_WORD     )),
223     sStartCap           (CUI_RES(ST_CPTL_STT_SENT     )),
224     sBoldUnderline      (CUI_RES(ST_BOLD_UNDER        )),
225     sURL                (CUI_RES(ST_DETECT_URL        )),
226     sNoDblSpaces        (CUI_RES(STR_NO_DBL_SPACES    )),
227     sDash               (CUI_RES(ST_DASH                ))
228 {
229     FreeResource();
230 
231     aCheckLB.SetHelpId(HID_OFAPAGE_AUTOCORR_CLB);
232 }
233 
234 /*-----------------14.10.96 15.58-------------------
235 
236 --------------------------------------------------*/
237 
238 
239 OfaAutocorrOptionsPage::~OfaAutocorrOptionsPage()
240 {
241 }
242 
243 /*-----------------14.10.96 15.58-------------------
244 
245 --------------------------------------------------*/
246 
247 
248 SfxTabPage* OfaAutocorrOptionsPage::Create( Window* pParent,
249                                 const SfxItemSet& rSet)
250 {
251     return new OfaAutocorrOptionsPage(pParent, rSet);
252 }
253 /*-----------------14.10.96 15.58-------------------
254 
255 --------------------------------------------------*/
256 
257 
258 sal_Bool OfaAutocorrOptionsPage::FillItemSet( SfxItemSet& )
259 {
260     SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
261     long nFlags = pAutoCorrect->GetFlags();
262 
263     sal_uInt16 nPos = 0;
264     pAutoCorrect->SetAutoCorrFlag(Autocorrect,          aCheckLB.IsChecked(nPos++));
265     pAutoCorrect->SetAutoCorrFlag(CptlSttWrd,           aCheckLB.IsChecked(nPos++));
266     pAutoCorrect->SetAutoCorrFlag(CptlSttSntnc,         aCheckLB.IsChecked(nPos++));
267     pAutoCorrect->SetAutoCorrFlag(ChgWeightUnderl,      aCheckLB.IsChecked(nPos++));
268     pAutoCorrect->SetAutoCorrFlag(SetINetAttr,          aCheckLB.IsChecked(nPos++));
269     pAutoCorrect->SetAutoCorrFlag(ChgToEnEmDash,        aCheckLB.IsChecked(nPos++));
270     pAutoCorrect->SetAutoCorrFlag(IgnoreDoubleSpace,    aCheckLB.IsChecked(nPos++));
271 
272     sal_Bool bReturn = nFlags != pAutoCorrect->GetFlags();
273     if(bReturn )
274     {
275         SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
276         pCfg->SetModified();
277         pCfg->Commit();
278     }
279     return bReturn;
280 }
281 
282 /* -----------------23.11.98 16:15-------------------
283  *
284  * --------------------------------------------------*/
285 void    OfaAutocorrOptionsPage::ActivatePage( const SfxItemSet& )
286 {
287     ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_False);
288 }
289 
290 /*-----------------14.10.96 15.58-------------------
291 
292 --------------------------------------------------*/
293 
294 
295 void OfaAutocorrOptionsPage::Reset( const SfxItemSet& )
296 {
297     SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
298     const long nFlags = pAutoCorrect->GetFlags();
299 
300     aCheckLB.SetUpdateMode(sal_False);
301     aCheckLB.Clear();
302 
303     aCheckLB.InsertEntry(sInput);
304     aCheckLB.InsertEntry(sDoubleCaps);
305     aCheckLB.InsertEntry(sStartCap);
306     aCheckLB.InsertEntry(sBoldUnderline);
307     aCheckLB.InsertEntry(sURL);
308     aCheckLB.InsertEntry(sDash);
309     aCheckLB.InsertEntry(sNoDblSpaces);
310 
311     sal_uInt16 nPos = 0;
312     aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & Autocorrect) );
313     aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & CptlSttWrd) );
314     aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & CptlSttSntnc) );
315     aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & ChgWeightUnderl) );
316     aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & SetINetAttr) );
317     aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & ChgToEnEmDash) );
318     aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & IgnoreDoubleSpace) );
319 
320     aCheckLB.SetUpdateMode(sal_True);
321 }
322 
323 /*********************************************************************/
324 /*                                                                   */
325 /*  Hilfs-struct fuer dUserDaten der Checklistbox                    */
326 /*                                                                   */
327 /*********************************************************************/
328 
329 struct ImpUserData
330 {
331     String  *pString;
332     Font*   pFont;
333 
334     ImpUserData(String* pText, Font* pFnt)
335         { pString = pText; pFont = pFnt;}
336 };
337 
338 
339 /*********************************************************************/
340 /*                                                                   */
341 /*  Dialog fuer Prozenteinstellung                                   */
342 /*                                                                   */
343 /*********************************************************************/
344 
345 class OfaAutoFmtPrcntSet : public ModalDialog
346 {
347     OKButton        aOKPB;
348     CancelButton    aCancelPB;
349     FixedLine       aPrcntFL;
350     MetricField     aPrcntMF;
351 
352     public:
353         OfaAutoFmtPrcntSet(Window* pParent) :
354             ModalDialog(pParent, CUI_RES(RID_OFADLG_PRCNT_SET)),
355                 aOKPB(this,         CUI_RES(BT_OK)),
356                 aCancelPB(this,     CUI_RES(BT_CANCEL)),
357                 aPrcntFL(this,      CUI_RES(FL_PRCNT)),
358                 aPrcntMF(this,  CUI_RES(ED_RIGHT_MARGIN))
359             {
360                 FreeResource();
361             }
362     MetricField&    GetPrcntFld(){return aPrcntMF;}
363 };
364 
365 
366 /*********************************************************************/
367 /*                                                                   */
368 /*  veraenderter LBoxString                                          */
369 /*                                                                   */
370 /*********************************************************************/
371 
372 class OfaImpBrwString : public SvLBoxString
373 {
374 public:
375 
376     OfaImpBrwString( SvLBoxEntry* pEntry, sal_uInt16 nFlags,
377         const String& rStr ) : SvLBoxString(pEntry,nFlags,rStr){}
378 
379     virtual void Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 nFlags,
380                                             SvLBoxEntry* pEntry);
381 };
382 
383 /*********************************************************************/
384 /*                                                                   */
385 /*********************************************************************/
386 
387 
388 void __EXPORT OfaImpBrwString::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 /*nFlags*/,
389     SvLBoxEntry* pEntry )
390 {
391     rDev.DrawText( rPos, GetText() );
392     if(pEntry->GetUserData())
393     {
394         ImpUserData* pUserData = (ImpUserData* )pEntry->GetUserData();
395         Point aNewPos(rPos);
396         aNewPos.X() += rDev.GetTextWidth(GetText());
397         Font aOldFont( rDev.GetFont());
398         Font aFont( aOldFont );
399         if(pUserData->pFont)
400         {
401             aFont = *pUserData->pFont;
402             aFont.SetColor(aOldFont.GetColor());
403             aFont.SetSize(aOldFont.GetSize());
404         }
405         aFont.SetWeight( WEIGHT_BOLD );
406 
407         sal_Bool bFett = sal_True;
408         sal_uInt16 nPos = 0;
409         do {
410             String sTxt( pUserData->pString->GetToken( 0, 1, nPos ));
411 
412             if( bFett )
413                 rDev.SetFont( aFont );
414 
415             rDev.DrawText( aNewPos, sTxt );
416 
417             if( STRING_NOTFOUND != nPos )
418                 aNewPos.X() += rDev.GetTextWidth( sTxt );
419 
420             if( bFett )
421                 rDev.SetFont( aOldFont );
422 
423             bFett = !bFett;
424         } while( STRING_NOTFOUND != nPos );
425     }
426 }
427 
428 /*********************************************************************/
429 /*                                                                   */
430 /*  TabPage Autoformat anwenden                                      */
431 /*                                                                   */
432 /*********************************************************************/
433 
434 #define CBCOL_FIRST     0
435 #define CBCOL_SECOND    1
436 #define CBCOL_BOTH      2
437 
438 enum OfaAutoFmtOptions
439 {
440     USE_REPLACE_TABLE,
441     CORR_UPPER,
442     BEGIN_UPPER,
443     BOLD_UNDERLINE,
444     DETECT_URL,
445     REPLACE_DASHES,
446     DEL_SPACES_AT_STT_END,
447     DEL_SPACES_BETWEEN_LINES,
448     IGNORE_DBLSPACE,
449     APPLY_NUMBERING,
450     INSERT_BORDER,
451     CREATE_TABLE,
452     REPLACE_STYLES,
453     DEL_EMPTY_NODE,
454     REPLACE_USER_COLL,
455     REPLACE_BULLETS,
456     MERGE_SINGLE_LINE_PARA
457 };
458 
459 OfaSwAutoFmtOptionsPage::OfaSwAutoFmtOptionsPage( Window* pParent,
460                                 const SfxItemSet& rSet ) :
461     SfxTabPage(pParent, CUI_RES(RID_OFAPAGE_AUTOFMT_APPLY), rSet),
462     aCheckLB            (this,  CUI_RES(CLB_SETTINGS)),
463     aEditPB             (this,  CUI_RES(PB_EDIT)),
464     aHeader1Expl        (this,  CUI_RES(FT_HEADER1_EXPLANATION)),
465     aHeader2Expl        (this,  CUI_RES(FT_HEADER2_EXPLANATION)),
466     sHeader1            (CUI_RES( STR_HEADER1       )),
467     sHeader2            (CUI_RES( STR_HEADER2       )),
468     sDeleteEmptyPara    (CUI_RES( ST_DEL_EMPTY_PARA)),
469     sUseReplaceTbl      (CUI_RES(   ST_USE_REPLACE  )),
470     sCptlSttWord        (CUI_RES(   ST_CPTL_STT_WORD)),
471     sCptlSttSent        (CUI_RES(   ST_CPTL_STT_SENT)),
472     sUserStyle          (CUI_RES(   ST_USER_STYLE   )),
473     sBullet             (CUI_RES(   ST_BULLET       )),
474     sBoldUnder          (CUI_RES(   ST_BOLD_UNDER   )),
475     sNoDblSpaces        (CUI_RES(   STR_NO_DBL_SPACES)),
476     sDetectURL          (CUI_RES(   ST_DETECT_URL   )),
477     sDash               (CUI_RES(   ST_DASH         )),
478     sRightMargin        (CUI_RES(   ST_RIGHT_MARGIN )),
479     sNum                (CUI_RES(   STR_NUM         )),
480     sBorder             (CUI_RES(   STR_BORDER      )),
481     sTable              (CUI_RES(   STR_TABLE       )),
482     sReplaceTemplates   (CUI_RES(   STR_REPLACE_TEMPLATES)),
483     sDelSpaceAtSttEnd   (CUI_RES(   STR_DEL_SPACES_AT_STT_END)),
484     sDelSpaceBetweenLines(CUI_RES(STR_DEL_SPACES_BETWEEN_LINES)),
485 
486     nPercent        ( 50 ),
487     pCheckButtonData( NULL )
488 
489 {
490     FreeResource();
491 
492     //typ. Anfuehrungszeichen einsetzen
493     SvtSysLocale aSysLcl;
494 
495     aCheckLB.SetHelpId(HID_OFAPAGE_AUTOFORMAT_CLB);
496     aCheckLB.SetStyle(aCheckLB.GetStyle()|WB_HSCROLL| WB_VSCROLL);
497 
498     aCheckLB.SetSelectHdl(LINK(this, OfaSwAutoFmtOptionsPage, SelectHdl));
499     aCheckLB.SetDoubleClickHdl(LINK(this, OfaSwAutoFmtOptionsPage, EditHdl));
500 
501     static long aStaticTabs[]=
502     {
503         3, 0, 20, 40
504     };
505 
506     aCheckLB.SvxSimpleTable::SetTabs(aStaticTabs);
507     String sHeader( sHeader1 );
508     sHeader += '\t';
509     sHeader += sHeader2;
510     sHeader += '\t';
511     aCheckLB.InsertHeaderEntry( sHeader, HEADERBAR_APPEND,
512                         HIB_CENTER | HIB_VCENTER | HIB_FIXEDPOS | HIB_FIXED);
513 
514     aEditPB.SetClickHdl(LINK(this, OfaSwAutoFmtOptionsPage, EditHdl));
515 }
516 
517 /*********************************************************************/
518 /*                                                                   */
519 /*********************************************************************/
520 
521 SvLBoxEntry* OfaSwAutoFmtOptionsPage::CreateEntry(String& rTxt, sal_uInt16 nCol)
522 {
523     SvLBoxEntry* pEntry = new SvLBoxEntry;
524 
525     if ( !pCheckButtonData )
526     {
527         pCheckButtonData = new SvLBoxButtonData( &aCheckLB );
528         aCheckLB.SetCheckButtonData( pCheckButtonData );
529     }
530 
531     pEntry->AddItem( new SvLBoxContextBmp( pEntry, 0, Image(), Image(), 0));    // Sonst Puff!
532 
533     String sEmpty;
534     if (nCol == CBCOL_SECOND)
535         pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );    // Leerspalte
536     else
537         pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );
538 
539     if (nCol == CBCOL_FIRST)
540         pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );    // Leerspalte
541     else
542         pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );
543     pEntry->AddItem( new OfaImpBrwString( pEntry, 0, rTxt ) );
544 
545     return pEntry;
546 }
547 
548 /*********************************************************************/
549 /*                                                                   */
550 /*********************************************************************/
551 
552 
553 __EXPORT OfaSwAutoFmtOptionsPage::~OfaSwAutoFmtOptionsPage()
554 {
555     delete (ImpUserData*) aCheckLB.GetUserData( REPLACE_BULLETS );
556     delete (ImpUserData*) aCheckLB.GetUserData( APPLY_NUMBERING );
557     delete (ImpUserData*) aCheckLB.GetUserData( MERGE_SINGLE_LINE_PARA );
558     delete pCheckButtonData;
559 }
560 
561 /*********************************************************************/
562 /*                                                                   */
563 /*********************************************************************/
564 
565 SfxTabPage* __EXPORT OfaSwAutoFmtOptionsPage::Create( Window* pParent,
566                                 const SfxItemSet& rAttrSet)
567 {
568     return new OfaSwAutoFmtOptionsPage(pParent, rAttrSet);
569 }
570 
571 /*********************************************************************/
572 /*                                                                   */
573 /*********************************************************************/
574 
575 sal_Bool OfaSwAutoFmtOptionsPage::FillItemSet( SfxItemSet&  )
576 {
577     sal_Bool bModified = sal_False;
578     SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
579     SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
580     long nFlags = pAutoCorrect->GetFlags();
581 
582     sal_Bool bCheck = aCheckLB.IsChecked(USE_REPLACE_TABLE, CBCOL_FIRST);
583     bModified |= pOpt->bAutoCorrect != bCheck;
584     pOpt->bAutoCorrect = bCheck;
585     pAutoCorrect->SetAutoCorrFlag(Autocorrect,
586                         aCheckLB.IsChecked(USE_REPLACE_TABLE, CBCOL_SECOND));
587 
588     bCheck = aCheckLB.IsChecked(CORR_UPPER, CBCOL_FIRST);
589     bModified |= pOpt->bCptlSttWrd != bCheck;
590     pOpt->bCptlSttWrd = bCheck;
591     pAutoCorrect->SetAutoCorrFlag(CptlSttWrd,
592                         aCheckLB.IsChecked(CORR_UPPER, CBCOL_SECOND));
593 
594     bCheck = aCheckLB.IsChecked(BEGIN_UPPER, CBCOL_FIRST);
595     bModified |= pOpt->bCptlSttSntnc != bCheck;
596     pOpt->bCptlSttSntnc = bCheck;
597     pAutoCorrect->SetAutoCorrFlag(CptlSttSntnc,
598                         aCheckLB.IsChecked(BEGIN_UPPER, CBCOL_SECOND));
599 
600     bCheck = aCheckLB.IsChecked(BOLD_UNDERLINE, CBCOL_FIRST);
601     bModified |= pOpt->bChgWeightUnderl != bCheck;
602     pOpt->bChgWeightUnderl = bCheck;
603     pAutoCorrect->SetAutoCorrFlag(ChgWeightUnderl,
604                         aCheckLB.IsChecked(BOLD_UNDERLINE, CBCOL_SECOND));
605 
606     pAutoCorrect->SetAutoCorrFlag(IgnoreDoubleSpace,
607                         aCheckLB.IsChecked(IGNORE_DBLSPACE, CBCOL_SECOND));
608 
609     bCheck = aCheckLB.IsChecked(DETECT_URL, CBCOL_FIRST);
610     bModified |= pOpt->bSetINetAttr != bCheck;
611     pOpt->bSetINetAttr = bCheck;
612     pAutoCorrect->SetAutoCorrFlag(SetINetAttr,
613                         aCheckLB.IsChecked(DETECT_URL, CBCOL_SECOND));
614 
615     bCheck = aCheckLB.IsChecked(DEL_EMPTY_NODE, CBCOL_FIRST);
616     bModified |= pOpt->bDelEmptyNode != bCheck;
617     pOpt->bDelEmptyNode = bCheck;
618 
619     bCheck = aCheckLB.IsChecked(REPLACE_USER_COLL, CBCOL_FIRST);
620     bModified |= pOpt->bChgUserColl != bCheck;
621     pOpt->bChgUserColl = bCheck;
622 
623     bCheck = aCheckLB.IsChecked(REPLACE_BULLETS, CBCOL_FIRST);
624     bModified |= pOpt->bChgEnumNum != bCheck;
625     pOpt->bChgEnumNum = bCheck;
626     bModified |= aBulletFont != pOpt->aBulletFont;
627     pOpt->aBulletFont = aBulletFont;
628     bModified |= String(pOpt->cBullet) != sBulletChar;
629     pOpt->cBullet = sBulletChar.GetChar(0);
630 
631     bModified |= aByInputBulletFont != pOpt->aByInputBulletFont;
632     bModified |= String(pOpt->cByInputBullet) != sByInputBulletChar;
633     pOpt->aByInputBulletFont = aByInputBulletFont;
634     pOpt->cByInputBullet = sByInputBulletChar.GetChar(0);
635 
636     bCheck = aCheckLB.IsChecked(MERGE_SINGLE_LINE_PARA, CBCOL_FIRST);
637     bModified |= pOpt->bRightMargin != bCheck;
638     pOpt->bRightMargin = bCheck;
639     bModified |= nPercent != pOpt->nRightMargin;
640     pOpt->nRightMargin = (sal_uInt8)nPercent;
641 
642     bCheck = aCheckLB.IsChecked(APPLY_NUMBERING, CBCOL_SECOND);
643     bModified |= pOpt->bSetNumRule != bCheck;
644     pOpt->bSetNumRule = bCheck;
645 
646     bCheck = aCheckLB.IsChecked(INSERT_BORDER, CBCOL_SECOND);
647     bModified |= pOpt->bSetBorder != bCheck;
648     pOpt->bSetBorder = bCheck;
649 
650     bCheck = aCheckLB.IsChecked(CREATE_TABLE, CBCOL_SECOND);
651     bModified |= pOpt->bCreateTable != bCheck;
652     pOpt->bCreateTable = bCheck;
653 
654     bCheck = aCheckLB.IsChecked(REPLACE_STYLES, CBCOL_SECOND);
655     bModified |= pOpt->bReplaceStyles != bCheck;
656     pOpt->bReplaceStyles = bCheck;
657 
658     bCheck = aCheckLB.IsChecked(REPLACE_DASHES, CBCOL_FIRST);
659     bModified |= pOpt->bChgToEnEmDash != bCheck;
660     pOpt->bChgToEnEmDash = bCheck;
661     pAutoCorrect->SetAutoCorrFlag(ChgToEnEmDash,
662                         aCheckLB.IsChecked(REPLACE_DASHES, CBCOL_SECOND));
663 
664     bCheck = aCheckLB.IsChecked(DEL_SPACES_AT_STT_END, CBCOL_FIRST);
665     bModified |= pOpt->bAFmtDelSpacesAtSttEnd != bCheck;
666     pOpt->bAFmtDelSpacesAtSttEnd = bCheck;
667     bCheck = aCheckLB.IsChecked(DEL_SPACES_AT_STT_END, CBCOL_SECOND);
668     bModified |= pOpt->bAFmtByInpDelSpacesAtSttEnd != bCheck;
669     pOpt->bAFmtByInpDelSpacesAtSttEnd = bCheck;
670 
671     bCheck = aCheckLB.IsChecked(DEL_SPACES_BETWEEN_LINES, CBCOL_FIRST);
672     bModified |= pOpt->bAFmtDelSpacesBetweenLines != bCheck;
673     pOpt->bAFmtDelSpacesBetweenLines = bCheck;
674     bCheck = aCheckLB.IsChecked(DEL_SPACES_BETWEEN_LINES, CBCOL_SECOND);
675     bModified |= pOpt->bAFmtByInpDelSpacesBetweenLines != bCheck;
676     pOpt->bAFmtByInpDelSpacesBetweenLines = bCheck;
677 
678     if(bModified || nFlags != pAutoCorrect->GetFlags())
679     {
680         SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
681         pCfg->SetModified();
682         pCfg->Commit();
683     }
684 
685     return sal_True;
686 }
687 
688 /* -----------------23.11.98 16:15-------------------
689  *
690  * --------------------------------------------------*/
691 void    OfaSwAutoFmtOptionsPage::ActivatePage( const SfxItemSet& )
692 {
693     ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_False);
694 }
695 
696 /*********************************************************************/
697 /*                                                                   */
698 /*********************************************************************/
699 
700 
701 void OfaSwAutoFmtOptionsPage::Reset( const SfxItemSet& )
702 {
703     SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
704     SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
705     const long nFlags = pAutoCorrect->GetFlags();
706 
707     aCheckLB.SetUpdateMode(sal_False);
708     aCheckLB.Clear();
709 
710     // Die folgenden Eintraege muessen in der selben Reihenfolge, wie im
711     // OfaAutoFmtOptions-enum eingefuegt werden!
712     aCheckLB.GetModel()->Insert(CreateEntry(sUseReplaceTbl,     CBCOL_BOTH  ));
713     aCheckLB.GetModel()->Insert(CreateEntry(sCptlSttWord,       CBCOL_BOTH  ));
714     aCheckLB.GetModel()->Insert(CreateEntry(sCptlSttSent,       CBCOL_BOTH  ));
715     aCheckLB.GetModel()->Insert(CreateEntry(sBoldUnder,         CBCOL_BOTH  ));
716     aCheckLB.GetModel()->Insert(CreateEntry(sDetectURL,         CBCOL_BOTH  ));
717     aCheckLB.GetModel()->Insert(CreateEntry(sDash,              CBCOL_BOTH  ));
718     aCheckLB.GetModel()->Insert(CreateEntry(sDelSpaceAtSttEnd,  CBCOL_BOTH  ));
719     aCheckLB.GetModel()->Insert(CreateEntry(sDelSpaceBetweenLines, CBCOL_BOTH  ));
720 
721     aCheckLB.GetModel()->Insert(CreateEntry(sNoDblSpaces,       CBCOL_SECOND));
722     aCheckLB.GetModel()->Insert(CreateEntry(sNum,               CBCOL_SECOND));
723     aCheckLB.GetModel()->Insert(CreateEntry(sBorder,            CBCOL_SECOND));
724     aCheckLB.GetModel()->Insert(CreateEntry(sTable,             CBCOL_SECOND));
725     aCheckLB.GetModel()->Insert(CreateEntry(sReplaceTemplates,  CBCOL_SECOND));
726     aCheckLB.GetModel()->Insert(CreateEntry(sDeleteEmptyPara,   CBCOL_FIRST ));
727     aCheckLB.GetModel()->Insert(CreateEntry(sUserStyle,         CBCOL_FIRST ));
728     aCheckLB.GetModel()->Insert(CreateEntry(sBullet,            CBCOL_FIRST ));
729     aCheckLB.GetModel()->Insert(CreateEntry(sRightMargin,       CBCOL_FIRST ));
730 
731     aCheckLB.CheckEntryPos( USE_REPLACE_TABLE,  CBCOL_FIRST,    pOpt->bAutoCorrect );
732     aCheckLB.CheckEntryPos( USE_REPLACE_TABLE,  CBCOL_SECOND,   0 != (nFlags & Autocorrect));
733     aCheckLB.CheckEntryPos( CORR_UPPER,         CBCOL_FIRST,    pOpt->bCptlSttWrd );
734     aCheckLB.CheckEntryPos( CORR_UPPER,         CBCOL_SECOND,   0 != (nFlags & CptlSttWrd) );
735     aCheckLB.CheckEntryPos( BEGIN_UPPER,        CBCOL_FIRST,    pOpt->bCptlSttSntnc );
736     aCheckLB.CheckEntryPos( BEGIN_UPPER,        CBCOL_SECOND,   0 != (nFlags & CptlSttSntnc) );
737     aCheckLB.CheckEntryPos( BOLD_UNDERLINE,     CBCOL_FIRST,    pOpt->bChgWeightUnderl );
738     aCheckLB.CheckEntryPos( BOLD_UNDERLINE,     CBCOL_SECOND,   0 != (nFlags & ChgWeightUnderl) );
739     aCheckLB.CheckEntryPos( IGNORE_DBLSPACE,    CBCOL_SECOND,   0 != (nFlags & IgnoreDoubleSpace) );
740     aCheckLB.CheckEntryPos( DETECT_URL,         CBCOL_FIRST,    pOpt->bSetINetAttr );
741     aCheckLB.CheckEntryPos( DETECT_URL,         CBCOL_SECOND,   0 != (nFlags & SetINetAttr) );
742     aCheckLB.CheckEntryPos( REPLACE_DASHES,     CBCOL_FIRST,    pOpt->bChgToEnEmDash );
743     aCheckLB.CheckEntryPos( REPLACE_DASHES,     CBCOL_SECOND,   0 != (nFlags & ChgToEnEmDash) );
744     aCheckLB.CheckEntryPos( DEL_SPACES_AT_STT_END,      CBCOL_FIRST,    pOpt->bAFmtDelSpacesAtSttEnd );
745     aCheckLB.CheckEntryPos( DEL_SPACES_AT_STT_END,      CBCOL_SECOND,   pOpt->bAFmtByInpDelSpacesAtSttEnd );
746     aCheckLB.CheckEntryPos( DEL_SPACES_BETWEEN_LINES,   CBCOL_FIRST,    pOpt->bAFmtDelSpacesBetweenLines );
747     aCheckLB.CheckEntryPos( DEL_SPACES_BETWEEN_LINES,   CBCOL_SECOND,   pOpt->bAFmtByInpDelSpacesBetweenLines );
748     aCheckLB.CheckEntryPos( DEL_EMPTY_NODE,     CBCOL_FIRST,    pOpt->bDelEmptyNode );
749     aCheckLB.CheckEntryPos( REPLACE_USER_COLL,  CBCOL_FIRST,    pOpt->bChgUserColl );
750     aCheckLB.CheckEntryPos( REPLACE_BULLETS,    CBCOL_FIRST,    pOpt->bChgEnumNum );
751 
752     aBulletFont = pOpt->aBulletFont;
753     sBulletChar = pOpt->cBullet;
754     ImpUserData* pUserData = new ImpUserData(&sBulletChar, &aBulletFont);
755     aCheckLB.SetUserData(  REPLACE_BULLETS, pUserData );
756 
757     nPercent = pOpt->nRightMargin;
758     sMargin = ' ';
759     sMargin += String::CreateFromInt32( nPercent );
760     sMargin += '%';
761     pUserData = new ImpUserData(&sMargin, 0);
762     aCheckLB.SetUserData( MERGE_SINGLE_LINE_PARA, pUserData );
763 
764     aCheckLB.CheckEntryPos( APPLY_NUMBERING,    CBCOL_SECOND,   pOpt->bSetNumRule );
765 
766     aByInputBulletFont = pOpt->aByInputBulletFont;
767     sByInputBulletChar = pOpt->cByInputBullet;
768     ImpUserData* pUserData2 = new ImpUserData(&sByInputBulletChar, &aByInputBulletFont);
769     aCheckLB.SetUserData( APPLY_NUMBERING , pUserData2 );
770 
771     aCheckLB.CheckEntryPos( MERGE_SINGLE_LINE_PARA, CBCOL_FIRST, pOpt->bRightMargin );
772     aCheckLB.CheckEntryPos( INSERT_BORDER,      CBCOL_SECOND,   pOpt->bSetBorder );
773     aCheckLB.CheckEntryPos( CREATE_TABLE,       CBCOL_SECOND,   pOpt->bCreateTable );
774     aCheckLB.CheckEntryPos( REPLACE_STYLES,     CBCOL_SECOND,   pOpt->bReplaceStyles );
775 
776     aCheckLB.SetUpdateMode(sal_True);
777 }
778 
779 /*********************************************************************/
780 /*                                                                   */
781 /*********************************************************************/
782 
783 IMPL_LINK(OfaSwAutoFmtOptionsPage, SelectHdl, OfaACorrCheckListBox*, pBox)
784 {
785     aEditPB.Enable(0 != pBox->FirstSelected()->GetUserData());
786     return 0;
787 }
788 
789 /*********************************************************************/
790 /*                                                                   */
791 /*********************************************************************/
792 
793 IMPL_LINK(OfaSwAutoFmtOptionsPage, EditHdl, PushButton*, EMPTYARG)
794 {
795     sal_uLong nSelEntryPos = aCheckLB.GetSelectEntryPos();
796     if( nSelEntryPos == REPLACE_BULLETS ||
797         nSelEntryPos == APPLY_NUMBERING)
798     {
799         SvxCharacterMap *pMapDlg = new SvxCharacterMap(this);
800         ImpUserData* pUserData = (ImpUserData*)aCheckLB.FirstSelected()->GetUserData();
801         pMapDlg->SetCharFont(*pUserData->pFont);
802         pMapDlg->SetChar( pUserData->pString->GetChar(0) );
803         if(RET_OK == pMapDlg->Execute())
804         {
805             Font aFont(pMapDlg->GetCharFont());
806             *pUserData->pFont = aFont;
807             sal_UCS4 aChar = pMapDlg->GetChar();
808             // using the UCS4 constructor
809             rtl::OUString aOUStr( &aChar, 1 );
810             *pUserData->pString = aOUStr;
811         }
812         delete pMapDlg;
813     }
814     else if( MERGE_SINGLE_LINE_PARA == nSelEntryPos )
815     {
816         // Dialog fuer Prozenteinstellung
817         OfaAutoFmtPrcntSet aDlg(this);
818         aDlg.GetPrcntFld().SetValue(nPercent);
819         if(RET_OK == aDlg.Execute())
820         {
821             nPercent = (sal_uInt16)aDlg.GetPrcntFld().GetValue();
822             sMargin = ' ';
823             sMargin += String::CreateFromInt32( nPercent );
824             sMargin += '%';
825         }
826     }
827     aCheckLB.Invalidate();
828     return 0;
829 }
830 
831 /*********************************************************************/
832 /*                                                                   */
833 /*********************************************************************/
834 
835 void OfaACorrCheckListBox::SetTabs()
836 {
837     SvxSimpleTable::SetTabs();
838     sal_uInt16 nAdjust = SV_LBOXTAB_ADJUST_RIGHT|SV_LBOXTAB_ADJUST_LEFT|SV_LBOXTAB_ADJUST_CENTER|SV_LBOXTAB_ADJUST_NUMERIC|SV_LBOXTAB_FORCE;
839 
840     if( aTabs.Count() > 1 )
841     {
842         SvLBoxTab* pTab = (SvLBoxTab*)aTabs.GetObject(1);
843         pTab->nFlags &= ~nAdjust;
844         pTab->nFlags |= SV_LBOXTAB_PUSHABLE|SV_LBOXTAB_ADJUST_CENTER|SV_LBOXTAB_FORCE;
845     }
846     if( aTabs.Count() > 2 )
847     {
848         SvLBoxTab* pTab = (SvLBoxTab*)aTabs.GetObject(2);
849         pTab->nFlags &= ~nAdjust;
850         pTab->nFlags |= SV_LBOXTAB_PUSHABLE|SV_LBOXTAB_ADJUST_CENTER|SV_LBOXTAB_FORCE;
851     }
852 }
853 
854 /*********************************************************************/
855 /*                                                                   */
856 /*********************************************************************/
857 
858 void OfaACorrCheckListBox::CheckEntryPos(sal_uLong nPos, sal_uInt16 nCol, sal_Bool bChecked)
859 {
860     if ( nPos < GetEntryCount() )
861         SetCheckButtonState(
862             GetEntry(nPos),
863             nCol,
864             bChecked ? SvButtonState( SV_BUTTON_CHECKED ) :
865                                        SvButtonState( SV_BUTTON_UNCHECKED ) );
866 }
867 
868 /*********************************************************************/
869 /*                                                                   */
870 /*********************************************************************/
871 
872 sal_Bool OfaACorrCheckListBox::IsChecked(sal_uLong nPos, sal_uInt16 nCol)
873 {
874     return GetCheckButtonState( GetEntry(nPos), nCol ) == SV_BUTTON_CHECKED;
875 }
876 
877 /*********************************************************************/
878 /*                                                                   */
879 /*********************************************************************/
880 
881 void OfaACorrCheckListBox::SetCheckButtonState( SvLBoxEntry* pEntry, sal_uInt16 nCol, SvButtonState eState)
882 {
883     SvLBoxButton* pItem = (SvLBoxButton*)(pEntry->GetItem(nCol + 1));
884 
885     DBG_ASSERT(pItem,"SetCheckButton:Item not found");
886     if (((SvLBoxItem*)pItem)->IsA() == SV_ITEM_ID_LBOXBUTTON)
887     {
888         switch( eState )
889         {
890             case SV_BUTTON_CHECKED:
891                 pItem->SetStateChecked();
892                 break;
893 
894             case SV_BUTTON_UNCHECKED:
895                 pItem->SetStateUnchecked();
896                 break;
897 
898             case SV_BUTTON_TRISTATE:
899                 pItem->SetStateTristate();
900                 break;
901         }
902         InvalidateEntry( pEntry );
903     }
904 }
905 
906 /*********************************************************************/
907 /*                                                                   */
908 /*********************************************************************/
909 
910 SvButtonState OfaACorrCheckListBox::GetCheckButtonState( SvLBoxEntry* pEntry, sal_uInt16 nCol ) const
911 {
912     SvButtonState eState = SV_BUTTON_UNCHECKED;
913     SvLBoxButton* pItem = (SvLBoxButton*)(pEntry->GetItem(nCol + 1));
914     DBG_ASSERT(pItem,"GetChButnState:Item not found");
915 
916     if (((SvLBoxItem*)pItem)->IsA() == SV_ITEM_ID_LBOXBUTTON)
917     {
918         sal_uInt16 nButtonFlags = pItem->GetButtonFlags();
919         eState = pCheckButtonData->ConvertToButtonState( nButtonFlags );
920     }
921 
922     return eState;
923 }
924 
925 void OfaACorrCheckListBox::HBarClick()
926 {
927     // Sortierung durch diese Ueberladung abgeklemmt
928 }
929 /* -----------------------------22.05.2002 11:06------------------------------
930 
931  ---------------------------------------------------------------------------*/
932 void    OfaACorrCheckListBox::KeyInput( const KeyEvent& rKEvt )
933 {
934     if(!rKEvt.GetKeyCode().GetModifier() &&
935         KEY_SPACE == rKEvt.GetKeyCode().GetCode())
936     {
937         sal_uLong nSelPos = GetSelectEntryPos();
938         sal_uInt16 nCol = GetCurrentTabPos() - 1;
939         if ( nCol < 2 )
940         {
941             CheckEntryPos( nSelPos, nCol, !IsChecked( nSelPos, nCol ) );
942             CallImplEventListeners( VCLEVENT_CHECKBOX_TOGGLE, (void*)GetEntry( nSelPos ) );
943         }
944         else
945         {
946             sal_uInt16 nCheck = IsChecked(nSelPos, 1) ? 1 : 0;
947             if(IsChecked(nSelPos, 0))
948                 nCheck += 2;
949             nCheck--;
950             nCheck &= 3;
951             CheckEntryPos(nSelPos, 1, 0 != (nCheck & 1));
952             CheckEntryPos(nSelPos, 0, 0 != (nCheck & 2));
953         }
954     }
955     else
956         SvxSimpleTable::KeyInput(rKEvt);
957 }
958 /* -----------------19.11.98 15:57-------------------
959  *
960  * --------------------------------------------------*/
961 struct DoubleString
962 {
963     String  sShort;
964     String  sLong;
965     void*   pUserData; // CheckBox -> form. Text Bool -> Selektionstext
966 };
967 typedef DoubleString* DoubleStringPtr;
968 SV_DECL_PTRARR_DEL(DoubleStringArray, DoubleStringPtr, 4, 4)
969 SV_IMPL_PTRARR(DoubleStringArray, DoubleStringPtr);
970 
971 /* -----------------19.11.98 16:07-------------------
972  *
973  * --------------------------------------------------*/
974 void lcl_ClearTable(DoubleStringTable& rTable)
975 {
976     DoubleStringArrayPtr pArray = rTable.Last();
977     while(pArray)
978     {
979         pArray->DeleteAndDestroy(0, pArray->Count());
980         delete pArray;
981         pArray = rTable.Prev();
982     }
983     rTable.Clear();
984 }
985 
986 /*-----------------14.10.96 15.57-------------------
987 
988 --------------------------------------------------*/
989 
990 OfaAutocorrReplacePage::OfaAutocorrReplacePage( Window* pParent,
991                                                 const SfxItemSet& rSet ) :
992     SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCORR_REPLACE ), rSet),
993     aTextOnlyCB(    this, CUI_RES(CB_TEXT_ONLY      )),
994     aShortFT  (     this, CUI_RES(FT_SHORT          )),
995     aShortED  (     this, CUI_RES(ED_SHORT          )),
996     aReplaceFT(     this, CUI_RES(FT_REPLACE        )),
997     aReplaceED(     this, CUI_RES(ED_REPLACE        )),
998     aReplaceTLB(    this, CUI_RES(TLB_REPLACE       )),
999     aNewReplacePB(  this, CUI_RES(PB_NEW_REPLACE    )),
1000     aDeleteReplacePB(this,CUI_RES(PB_DELETE_REPLACE )),
1001     sModify(CUI_RES(STR_MODIFY)),
1002     sNew(aNewReplacePB.GetText()),
1003     pFormatText(0),
1004     eLang(eLastDialogLanguage),
1005     bHasSelectionText(sal_False),
1006     bFirstSelect(sal_True),
1007     bReplaceEditChanged(sal_False),
1008     bSWriter(sal_True)
1009 {
1010     FreeResource();
1011     SfxModule *pMod = *(SfxModule**)GetAppData(SHL_WRITER);
1012     bSWriter = pMod == SfxModule::GetActiveModule();
1013 
1014     ::com::sun::star::lang::Locale aLcl( SvxCreateLocale(eLastDialogLanguage ));
1015     pCompareClass = new CollatorWrapper( GetProcessFact() );
1016     pCompareCaseClass = new CollatorWrapper( GetProcessFact() );
1017     pCompareClass->loadDefaultCollator( aLcl, ::com::sun::star::i18n::
1018                             CollatorOptions::CollatorOptions_IGNORE_CASE );
1019     pCompareCaseClass->loadDefaultCollator( aLcl, 0 );
1020     pCharClass = new CharClass( aLcl );
1021 
1022     static long nTabs[] = { 2 /* Tab-Count */, 1, 61 };
1023     aReplaceTLB.SetTabs( &nTabs[0], MAP_APPFONT );
1024 
1025     aReplaceTLB.SetStyle(aReplaceTLB.GetStyle()|WB_HSCROLL|WB_CLIPCHILDREN);
1026     aReplaceTLB.SetSelectHdl(LINK(this, OfaAutocorrReplacePage, SelectHdl));
1027     aNewReplacePB.SetClickHdl( LINK(this, OfaAutocorrReplacePage, NewDelHdl));
1028     aDeleteReplacePB.SetClickHdl(LINK(this, OfaAutocorrReplacePage, NewDelHdl));
1029     aShortED.SetModifyHdl(LINK(this, OfaAutocorrReplacePage, ModifyHdl));
1030     aReplaceED.SetModifyHdl(LINK(this, OfaAutocorrReplacePage, ModifyHdl));
1031     aShortED.SetActionHdl(LINK(this, OfaAutocorrReplacePage, NewDelHdl));
1032     aReplaceED.SetActionHdl(LINK(this, OfaAutocorrReplacePage, NewDelHdl));
1033 
1034     aReplaceED.SetSpaces(sal_True);
1035     aShortED.SetSpaces(sal_True);
1036     aShortED.SetMaxTextLen(30);
1037 }
1038 
1039 /*-----------------14.10.96 15.58-------------------
1040 
1041 --------------------------------------------------*/
1042 
1043 
1044 OfaAutocorrReplacePage::~OfaAutocorrReplacePage()
1045 {
1046     delete pFormatText;
1047     lcl_ClearTable(aDoubleStringTable);
1048     delete pCompareClass;
1049     delete pCompareCaseClass;
1050     delete pCharClass;
1051 }
1052 /*-----------------14.10.96 15.58-------------------
1053 
1054 --------------------------------------------------*/
1055 
1056 SfxTabPage* OfaAutocorrReplacePage::Create( Window* pParent,
1057                                 const SfxItemSet& rSet)
1058 {
1059     return new OfaAutocorrReplacePage(pParent, rSet);
1060 }
1061 /* -----------------20.11.98 13:26-------------------
1062  *
1063  * --------------------------------------------------*/
1064 void    OfaAutocorrReplacePage::ActivatePage( const SfxItemSet& )
1065 {
1066     if(eLang != eLastDialogLanguage)
1067         SetLanguage(eLastDialogLanguage);
1068     ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_True);
1069 }
1070 /* -----------------20.11.98 13:26-------------------
1071  *
1072  * --------------------------------------------------*/
1073 int OfaAutocorrReplacePage::DeactivatePage( SfxItemSet*  )
1074 {
1075     return LEAVE_PAGE;
1076 }
1077 /*-----------------14.10.96 15.58-------------------
1078 
1079 --------------------------------------------------*/
1080 
1081 sal_Bool OfaAutocorrReplacePage::FillItemSet( SfxItemSet& )
1082 {
1083     SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
1084     DoubleStringArrayPtr pDoubleStringArray = aDoubleStringTable.Last();
1085     while(pDoubleStringArray)
1086     {
1087         LanguageType eCurLang = (LanguageType)aDoubleStringTable.GetCurKey();
1088         if(eCurLang != eLang) // die aktuelle Sprache wird weiter hinten behandelt
1089         {
1090             SvxAutocorrWordList* pWordList = pAutoCorrect->LoadAutocorrWordList(eCurLang);
1091             sal_uInt16 nWordListCount = pWordList->Count();
1092             sal_uInt16 nDoubleStringArrayCount = pDoubleStringArray->Count();
1093             sal_uInt16 nPos = nDoubleStringArrayCount;
1094             sal_uInt16 nLastPos = nPos;
1095             // 1. Durchlauf: Eintraege loeschen oder veraendern:
1096 
1097 
1098             for( sal_uInt16 nWordListPos = nWordListCount; nWordListPos; nWordListPos-- )
1099             {
1100                 SvxAutocorrWordPtr pWordPtr = pWordList->GetObject(nWordListPos - 1);
1101                 String sEntry(pWordPtr->GetShort());
1102                 // formatierter Text steht nur im Writer
1103                 sal_Bool bFound = !bSWriter && !pWordPtr->IsTextOnly();
1104                 while(!bFound && nPos)
1105                 {
1106                     DoubleString* pDouble = pDoubleStringArray->GetObject( nPos - 1);
1107 
1108                     if( 0 == pCompareClass->compareString(
1109                                                     sEntry, pDouble->sShort ))
1110                     {
1111                         nLastPos = nPos - 1;
1112                         bFound = sal_True;
1113                         if( !(pWordPtr->IsTextOnly() == (0 == pDouble->pUserData)
1114                             && 0 == pCompareCaseClass->compareString(
1115                                 pWordPtr->GetLong(), pDouble->sLong ) ) )
1116                         {
1117                             pAutoCorrect->PutText(sEntry, pDouble->sLong, eCurLang);
1118                         }
1119                         pDoubleStringArray->DeleteAndDestroy(nPos - 1, 1);
1120                         break;
1121                     }
1122                     nPos--;
1123                 }
1124                 nPos = nLastPos;
1125                 if(!bFound)
1126                 {
1127                     pAutoCorrect->DeleteText(sEntry, eCurLang);
1128                 }
1129             }
1130             nDoubleStringArrayCount = pDoubleStringArray->Count();
1131             for(sal_uInt16 nDoubleStringArrayPos = 0; nDoubleStringArrayPos < nDoubleStringArrayCount; nDoubleStringArrayPos++ )
1132             {
1133                 //jetzt sollte es nur noch neue Eintraege geben
1134                 DoubleString* pDouble = pDoubleStringArray->GetObject( nDoubleStringArrayPos );
1135                 if(pDouble->pUserData == &bHasSelectionText)
1136                     pAutoCorrect->PutText( pDouble->sShort,
1137                                 *SfxObjectShell::Current(), eCurLang );
1138                 else
1139                 {
1140                     pAutoCorrect->PutText( pDouble->sShort, pDouble->sLong,
1141                                                             eCurLang);
1142                 }
1143             }
1144         }
1145         pDoubleStringArray->DeleteAndDestroy(0, pDoubleStringArray->Count());
1146         delete pDoubleStringArray;
1147         pDoubleStringArray = aDoubleStringTable.Prev();
1148     }
1149     aDoubleStringTable.Clear();
1150     // jetzt noch die aktuelle Selektion
1151     SvxAutocorrWordList* pWordList = pAutoCorrect->LoadAutocorrWordList(eLang);
1152     sal_uInt16 nWordListCount = pWordList->Count();
1153     sal_uInt16 nListBoxCount = (sal_uInt16)aReplaceTLB.GetEntryCount();
1154 
1155     aReplaceTLB.SetUpdateMode(sal_False);
1156     sal_uInt16 nListBoxPos = nListBoxCount;
1157     sal_uInt16 nLastListBoxPos = nListBoxPos;
1158     // 1. Durchlauf: Eintraege loeschen oder veraendern:
1159 
1160     sal_uInt16 i;
1161     for( i = nWordListCount; i; i-- )
1162     {
1163         SvxAutocorrWordPtr pWordPtr = pWordList->GetObject(i- 1);
1164         String sEntry(pWordPtr->GetShort());
1165         // formatierter Text steht nur im Writer
1166         sal_Bool bFound = !bSWriter && !pWordPtr->IsTextOnly();
1167         while(!bFound && nListBoxPos)
1168         {
1169             SvLBoxEntry*  pEntry = aReplaceTLB.GetEntry( nListBoxPos - 1);
1170             if( 0 == pCompareClass->compareString( sEntry,
1171                         aReplaceTLB.GetEntryText(pEntry, 0)))
1172             {
1173                 nLastListBoxPos = nListBoxPos - 1;
1174                 bFound = sal_True;
1175                 String sLong = aReplaceTLB.GetEntryText(pEntry, 1);
1176                 if( !(pWordPtr->IsTextOnly() == (0 == pEntry->GetUserData())
1177                     && 0 == pCompareCaseClass->compareString(
1178                         pWordPtr->GetLong(), sLong )))
1179                 {
1180                     pAutoCorrect->PutText(sEntry, sLong, eLang);
1181                 }
1182                 aReplaceTLB.GetModel()->Remove(pEntry);
1183                 break;
1184 
1185             }
1186             nListBoxPos --;
1187         }
1188         nListBoxPos = nLastListBoxPos;
1189         if(!bFound)
1190         {
1191             pAutoCorrect->DeleteText(sEntry, eLang);
1192         }
1193 
1194     }
1195     nListBoxCount = (sal_uInt16)aReplaceTLB.GetEntryCount();
1196     for(i = 0; i < nListBoxCount; i++ )
1197     {
1198         //jetzt sollte es nur noch neue Eintraege geben
1199         SvLBoxEntry*  pEntry = aReplaceTLB.GetEntry( i );
1200         String sShort = aReplaceTLB.GetEntryText(pEntry, 0);
1201         if(pEntry->GetUserData() == &bHasSelectionText)
1202             pAutoCorrect->PutText(sShort, *SfxObjectShell::Current(), eLang);
1203         else
1204         {
1205             String sLong = aReplaceTLB.GetEntryText(pEntry, 1);
1206             pAutoCorrect->PutText(sShort, sLong, eLang);
1207         }
1208     }
1209 
1210     return sal_False;
1211 }
1212 
1213 /* -----------------19.11.98 13:16-------------------
1214  *
1215  * --------------------------------------------------*/
1216 void OfaAutocorrReplacePage::RefillReplaceBox(sal_Bool bFromReset,
1217                                         LanguageType eOldLanguage,
1218                                         LanguageType eNewLanguage)
1219 {
1220     eLang = eNewLanguage;
1221     if(bFromReset)
1222         lcl_ClearTable(aDoubleStringTable);
1223     else
1224     {
1225         DoubleStringArray* pArray = 0;
1226         if(aDoubleStringTable.IsKeyValid(eOldLanguage))
1227         {
1228             pArray = aDoubleStringTable.Seek(sal_uLong(eOldLanguage));
1229             pArray->DeleteAndDestroy(0, pArray->Count());
1230         }
1231         else
1232         {
1233             pArray = new DoubleStringArray;
1234             aDoubleStringTable.Insert(sal_uLong(eOldLanguage), pArray);
1235         }
1236 
1237         sal_uInt16 nListBoxCount = (sal_uInt16)aReplaceTLB.GetEntryCount();
1238         sal_uInt16 i;
1239         for(i = 0; i < nListBoxCount; i++)
1240         {
1241             DoubleString* pDouble = new DoubleString();
1242             SvLBoxEntry*  pEntry = aReplaceTLB.GetEntry( i );
1243             pDouble->sShort = aReplaceTLB.GetEntryText(pEntry, 0);
1244             pDouble->sLong = aReplaceTLB.GetEntryText(pEntry, 1);
1245             pDouble->pUserData = pEntry->GetUserData();
1246             pArray->Insert(pDouble, i);
1247         }
1248     }
1249 
1250     aReplaceTLB.Clear();
1251     if(!bSWriter)
1252     {
1253         if(pFormatText)
1254             pFormatText->DeleteAndDestroy(0, pFormatText->Count());
1255         else
1256             pFormatText = new SvStringsISortDtor();
1257     }
1258 
1259     if(aDoubleStringTable.IsKeyValid(eLang))
1260     {
1261         DoubleStringArray* pArray = aDoubleStringTable.Seek(sal_uLong(eNewLanguage));
1262         for(sal_uInt16 i = 0; i < pArray->Count(); i++)
1263         {
1264             DoubleString* pDouble = pArray->GetObject(i);
1265             sal_Bool bTextOnly = 0 == pDouble->pUserData;
1266             // formatierter Text wird nur im Writer angeboten
1267             if(bSWriter || bTextOnly)
1268             {
1269                 String sEntry(pDouble->sShort);
1270                 sEntry += '\t';
1271                 sEntry += pDouble->sLong;
1272                 SvLBoxEntry* pEntry = aReplaceTLB.InsertEntry(sEntry);
1273                 aTextOnlyCB.Check(bTextOnly);
1274                 if(!bTextOnly)
1275                     pEntry->SetUserData(pDouble->pUserData); // Das heisst: mit Formatinfo oder sogar mit Selektionstext
1276             }
1277             else
1278             {
1279                 pFormatText->Insert(new String(pDouble->sShort));
1280             }
1281         }
1282     }
1283     else
1284     {
1285         SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
1286         SvxAutocorrWordList* pWordList = pAutoCorrect->LoadAutocorrWordList(eLang);
1287 
1288         for(sal_uInt16 i = 0; i < pWordList->Count(); i++)
1289         {
1290             SvxAutocorrWordPtr pWordPtr = pWordList->GetObject(i);
1291             sal_Bool bTextOnly = pWordPtr->IsTextOnly();
1292             // formatierter Text wird nur im Writer angeboten
1293             if(bSWriter || bTextOnly)
1294             {
1295                 String sEntry(pWordPtr->GetShort());
1296                 sEntry += '\t';
1297                 sEntry += pWordPtr->GetLong();
1298                 SvLBoxEntry* pEntry = aReplaceTLB.InsertEntry(sEntry);
1299                 aTextOnlyCB.Check(pWordPtr->IsTextOnly());
1300                 if(!bTextOnly)
1301                     pEntry->SetUserData(&aTextOnlyCB); // Das heisst: mit Formatinfo
1302             }
1303             else
1304             {
1305                 pFormatText->Insert(new String(pWordPtr->GetShort()));
1306             }
1307         }
1308         aNewReplacePB.Enable(sal_False);
1309         aDeleteReplacePB.Enable(sal_False);
1310 
1311     }
1312 
1313     SfxViewShell* pViewShell = SfxViewShell::Current();
1314     if( pViewShell && pViewShell->HasSelection( sal_True ) )
1315     {
1316         bHasSelectionText = sal_True;
1317         const String sSelection( pViewShell->GetSelectionText() );
1318         aReplaceED.SetText( sSelection );
1319         aTextOnlyCB.Check( !bSWriter );
1320         aTextOnlyCB.Enable( bSWriter && sSelection.Len() );
1321     }
1322     else
1323         aTextOnlyCB.Enable( sal_False );
1324 }
1325 /*-----------------14.10.96 15.58-------------------
1326 
1327 --------------------------------------------------*/
1328 
1329 void OfaAutocorrReplacePage::Reset( const SfxItemSet& )
1330 {
1331     RefillReplaceBox(sal_True, eLang, eLang);
1332     aShortED.GrabFocus();
1333 }
1334 
1335 /* -----------------23.11.98 10:33-------------------
1336  *
1337  * --------------------------------------------------*/
1338 void OfaAutocorrReplacePage::SetLanguage(LanguageType eSet)
1339 {
1340     //save old settings an refill
1341     if(eSet != eLang)
1342     {
1343         RefillReplaceBox(sal_False, eLang, eSet);
1344         eLastDialogLanguage = eSet;
1345         delete pCompareClass;
1346         delete pCompareCaseClass;
1347         delete pCharClass;
1348 
1349         ::com::sun::star::lang::Locale aLcl( SvxCreateLocale(eLastDialogLanguage ));
1350         pCompareClass = new CollatorWrapper( GetProcessFact() );
1351         pCompareCaseClass = new CollatorWrapper( GetProcessFact() );
1352         pCompareClass->loadDefaultCollator( aLcl, ::com::sun::star::i18n::
1353                                 CollatorOptions::CollatorOptions_IGNORE_CASE );
1354         pCompareCaseClass->loadDefaultCollator( aLcl, 0 );
1355         pCharClass = new CharClass( aLcl );
1356         ModifyHdl(&aShortED);
1357     }
1358 }
1359 /*-----------------14.10.96 15.58-------------------
1360 
1361 --------------------------------------------------*/
1362 
1363 
1364 IMPL_LINK(OfaAutocorrReplacePage, SelectHdl, SvTabListBox*, pBox)
1365 {
1366     if(!bFirstSelect || !bHasSelectionText)
1367     {
1368         SvLBoxEntry* pEntry = pBox->FirstSelected();
1369         String sTmpShort(pBox->GetEntryText(pEntry, 0));
1370         // wird der Text ueber den ModifyHdl gesetzt, dann steht der Cursor sonst immer am Wortanfang,
1371         // obwohl man gerade hier editiert
1372         sal_Bool bSameContent = 0 == pCompareClass->compareString(
1373                 sTmpShort, aShortED.GetText() );
1374         Selection aSel = aShortED.GetSelection();
1375         if(aShortED.GetText() != sTmpShort)
1376         {
1377             aShortED.SetText(sTmpShort);
1378             //war es nur eine andere Schreibweise, dann muss die Selektion auch wieder gesetzt werden
1379             if(bSameContent)
1380                 aShortED.SetSelection(aSel);
1381         }
1382         aReplaceED.SetText(pBox->GetEntryText(pEntry, 1));
1383         // mit UserData gibt es eine Formatinfo
1384         aTextOnlyCB.Check(0 == pEntry->GetUserData());
1385     }
1386     else
1387         bFirstSelect = sal_False;
1388 
1389     aNewReplacePB.Enable(sal_False);
1390     aDeleteReplacePB.Enable();
1391     return 0;
1392 };
1393 
1394 /*-----------------14.10.96 15.58-------------------
1395 
1396 --------------------------------------------------*/
1397 
1398 
1399 IMPL_LINK(OfaAutocorrReplacePage, NewDelHdl, PushButton*, pBtn)
1400 {
1401     SvLBoxEntry* _pEntry = aReplaceTLB.FirstSelected();
1402     if(pBtn == &aDeleteReplacePB)
1403     {
1404         DBG_ASSERT(_pEntry, "keine Eintrag selektiert");
1405         if(_pEntry)
1406         {
1407             aReplaceTLB.GetModel()->Remove(_pEntry);
1408             ModifyHdl(&aShortED);
1409             return 0;
1410         }
1411     }
1412     if(pBtn == &aNewReplacePB || aNewReplacePB.IsEnabled())
1413     {
1414         SvLBoxEntry* _pNewEntry = aReplaceTLB.FirstSelected();
1415         String sEntry(aShortED.GetText());
1416         if(sEntry.Len() && ( aReplaceED.GetText().Len() ||
1417                 ( bHasSelectionText && bSWriter ) ))
1418         {
1419             aReplaceTLB.SetUpdateMode(sal_False);
1420             sal_uInt16 nPos = USHRT_MAX;
1421             sEntry += '\t';
1422             sEntry += aReplaceED.GetText();
1423             if(_pNewEntry)
1424             {
1425                 nPos = (sal_uInt16)aReplaceTLB.GetModel()->GetAbsPos(_pNewEntry);
1426                 aReplaceTLB.GetModel()->Remove(_pNewEntry);
1427             }
1428             else
1429             {
1430                 sal_uInt16 j;
1431                 for( j = 0; j < aReplaceTLB.GetEntryCount(); j++ )
1432                 {
1433                     SvLBoxEntry* pReplaceEntry = aReplaceTLB.GetEntry(j);
1434                     if( 0 >=  pCompareClass->compareString(sEntry,
1435                                     aReplaceTLB.GetEntryText(pReplaceEntry, 0) ) )
1436                         break;
1437                 }
1438                 nPos = j;
1439             }
1440             SvLBoxEntry* pInsEntry =
1441                 aReplaceTLB.InsertEntry(
1442                     sEntry, static_cast< SvLBoxEntry * >(NULL), false,
1443                     nPos == USHRT_MAX ? LIST_APPEND : nPos);
1444             if( !bReplaceEditChanged && !aTextOnlyCB.IsChecked())
1445                 pInsEntry->SetUserData(&bHasSelectionText); // neuer formatierter Text
1446 
1447             aReplaceTLB.MakeVisible( pInsEntry );
1448             aReplaceTLB.SetUpdateMode(sal_True);
1449             // falls der Request aus dem ReplaceEdit kam, dann Focus in das ShortEdit setzen
1450             if(aReplaceED.HasFocus())
1451                 aShortED.GrabFocus();
1452 
1453         }
1454     }
1455     else
1456     {
1457         // das kann nur ein Enter in einem der beiden Edit-Felder sein und das
1458         // bedeutet EndDialog() - muss im KeyInput ausgewertet werden
1459         return 0;
1460     }
1461     ModifyHdl(&aShortED);
1462     return 1;
1463 }
1464 
1465 /*-----------------17.10.96 07.49-------------------
1466 
1467 --------------------------------------------------*/
1468 IMPL_LINK(OfaAutocorrReplacePage, ModifyHdl, Edit*, pEdt)
1469 {
1470     SvLBoxEntry* pFirstSel = aReplaceTLB.FirstSelected();
1471     sal_Bool bShort = pEdt == &aShortED;
1472     const String rEntry = pEdt->GetText();
1473     const String rRepString = aReplaceED.GetText();
1474     String aWordStr( pCharClass->lower( rEntry ));
1475 
1476     if(bShort)
1477     {
1478         if(rEntry.Len())
1479         {
1480             sal_Bool bFound = sal_False;
1481             sal_Bool bTmpSelEntry=sal_False;
1482 
1483             for(sal_uInt16 i = 0; i < aReplaceTLB.GetEntryCount(); i++)
1484             {
1485                 SvLBoxEntry*  pEntry = aReplaceTLB.GetEntry( i );
1486                 String aTestStr=aReplaceTLB.GetEntryText(pEntry, 0);
1487                 if( 0 == pCompareClass->compareString(rEntry, aTestStr ))
1488                 {
1489                     if(rRepString.Len())
1490                         bFirstSelect = sal_True;
1491                     aReplaceTLB.SetCurEntry(pEntry);
1492                     pFirstSel = pEntry;
1493                     aNewReplacePB.SetText(sModify);
1494                     bFound= sal_True;
1495                     break;
1496                 }
1497                 else
1498                 {
1499                     pCharClass->toLower( aTestStr );
1500                     if(aTestStr.Search(aWordStr)==0 && !bTmpSelEntry)
1501                     {
1502                         aReplaceTLB.MakeVisible(pEntry);
1503                         bTmpSelEntry=sal_True;
1504                     }
1505                 }
1506             }
1507             if(!bFound)
1508             {
1509                 aReplaceTLB.SelectAll(sal_False);
1510                 pFirstSel = 0;
1511                 aNewReplacePB.SetText(sNew);
1512                 if(bReplaceEditChanged)
1513                     aTextOnlyCB.Enable(sal_False);
1514             }
1515             aDeleteReplacePB.Enable(bFound);
1516         }
1517         else if(aReplaceTLB.GetEntryCount()>0)
1518         {
1519             SvLBoxEntry*  pEntry = aReplaceTLB.GetEntry( 0 );
1520             aReplaceTLB.MakeVisible(pEntry);
1521         }
1522 
1523     }
1524     else if(!bShort)
1525     {
1526         bReplaceEditChanged = sal_True;
1527         if(pFirstSel)
1528         {
1529             aNewReplacePB.SetText(sModify);
1530         }
1531     }
1532 
1533     const String& rShortTxt = aShortED.GetText();
1534     sal_Bool bEnableNew = rShortTxt.Len() &&
1535                         ( rRepString.Len() ||
1536                                 ( bHasSelectionText && bSWriter )) &&
1537                         ( !pFirstSel || rRepString !=
1538                                 aReplaceTLB.GetEntryText( pFirstSel, 1 ) );
1539     if(bEnableNew && pFormatText)
1540     {
1541         for(sal_uInt16 i = 0; i < pFormatText->Count(); i++)
1542             if(*pFormatText->GetObject(i) == rShortTxt)
1543             {
1544                 bEnableNew = sal_False;
1545                 break;
1546             }
1547     }
1548     aNewReplacePB.Enable(bEnableNew);
1549 
1550     return 0;
1551 }
1552 
1553 /* -----------------20.11.98 13:48-------------------
1554  *
1555  * --------------------------------------------------*/
1556 
1557 struct StringsArrays
1558 {
1559 
1560     SvStringsDtor aAbbrevStrings;
1561     SvStringsDtor aDoubleCapsStrings;
1562 
1563     StringsArrays() :
1564         aAbbrevStrings(5,5), aDoubleCapsStrings(5,5) {}
1565 };
1566 typedef StringsArrays* StringsArraysPtr;
1567 /* -----------------19.11.98 16:07-------------------
1568  *
1569  * --------------------------------------------------*/
1570 sal_Bool lcl_FindInArray(SvStringsDtor& rStrings, const String& rString)
1571 {
1572     for(sal_uInt16 i = 0; i < rStrings.Count(); i++)
1573         if(rString == *rStrings.GetObject(i))
1574             return sal_True;
1575     return sal_False;
1576 }
1577 
1578 void lcl_ClearTable(StringsTable& rTable)
1579 {
1580     StringsArraysPtr pArrays = rTable.Last();
1581     while(pArrays)
1582     {
1583         delete pArrays;
1584         pArrays = rTable.Prev();
1585     }
1586     rTable.Clear();
1587 }
1588 
1589 /*-----------------14.10.96 15.57-------------------
1590 
1591 --------------------------------------------------*/
1592 
1593 OfaAutocorrExceptPage::OfaAutocorrExceptPage( Window* pParent,
1594                                                 const SfxItemSet& rSet ) :
1595     SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCORR_EXCEPT ), rSet),
1596     aAbbrevFL       (this, CUI_RES(FL_ABBREV         )),
1597     aAbbrevED       (this, CUI_RES(ED_ABBREV         )),
1598     aAbbrevLB       (this, CUI_RES(LB_ABBREV         )),
1599     aNewAbbrevPB    (this, CUI_RES(PB_NEWABBREV  )),
1600     aDelAbbrevPB    (this, CUI_RES(PB_DELABBREV  )),
1601     aAutoAbbrevCB   (this, CUI_RES(CB_AUTOABBREV     )),
1602     aDoubleCapsFL   (this, CUI_RES(FL_DOUBLECAPS     )),
1603     aDoubleCapsED   (this, CUI_RES(ED_DOUBLE_CAPS    )),
1604     aDoubleCapsLB   (this, CUI_RES(LB_DOUBLE_CAPS    )),
1605     aNewDoublePB    (this, CUI_RES(PB_NEWDOUBLECAPS)),
1606     aDelDoublePB    (this, CUI_RES(PB_DELDOUBLECAPS)),
1607     aAutoCapsCB     (this, CUI_RES(CB_AUTOCAPS   )),
1608     eLang(eLastDialogLanguage)
1609 {
1610     aNewAbbrevPB.SetAccessibleName(String(CUI_RES(STR_PB_NEWABBREV) ) );
1611     aDelAbbrevPB.SetAccessibleName(String(CUI_RES(STR_PB_DELABBREV) ) );
1612     aNewDoublePB.SetAccessibleName(String(CUI_RES(STR_PB_NEWDOUBLECAPS) ) );
1613     aDelDoublePB.SetAccessibleName(String(CUI_RES(STR_PB_DELDOUBLECAPS) ) );
1614 
1615     FreeResource();
1616 
1617     ::com::sun::star::lang::Locale aLcl( SvxCreateLocale(eLastDialogLanguage ));
1618     pCompareClass = new CollatorWrapper( GetProcessFact() );
1619     pCompareClass->loadDefaultCollator( aLcl, ::com::sun::star::i18n::
1620                             CollatorOptions::CollatorOptions_IGNORE_CASE );
1621 
1622     aNewAbbrevPB.SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1623     aDelAbbrevPB.SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1624     aNewDoublePB.SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1625     aDelDoublePB.SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1626 
1627     aAbbrevLB.SetSelectHdl(LINK(this, OfaAutocorrExceptPage, SelectHdl));
1628     aDoubleCapsLB.SetSelectHdl(LINK(this, OfaAutocorrExceptPage, SelectHdl));
1629     aAbbrevED.SetModifyHdl(LINK(this, OfaAutocorrExceptPage, ModifyHdl));
1630     aDoubleCapsED.SetModifyHdl(LINK(this, OfaAutocorrExceptPage, ModifyHdl));
1631 
1632     aAbbrevED.SetActionHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1633     aDoubleCapsED.SetActionHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
1634 
1635     aNewAbbrevPB.SetAccessibleRelationMemberOf(&aAbbrevFL);
1636     aDelAbbrevPB.SetAccessibleRelationMemberOf(&aAbbrevFL);
1637     aNewDoublePB.SetAccessibleRelationMemberOf(&aDoubleCapsFL);
1638     aDelDoublePB.SetAccessibleRelationMemberOf(&aDoubleCapsFL);
1639 }
1640 
1641 /*-----------------14.10.96 15.58-------------------
1642 
1643 --------------------------------------------------*/
1644 
1645 OfaAutocorrExceptPage::~OfaAutocorrExceptPage()
1646 {
1647     lcl_ClearTable(aStringsTable);
1648     delete pCompareClass;
1649 }
1650 
1651 /*-----------------14.10.96 15.58-------------------
1652 
1653 --------------------------------------------------*/
1654 
1655 SfxTabPage* OfaAutocorrExceptPage::Create( Window* pParent,
1656                                 const SfxItemSet& rSet)
1657 {
1658     return new OfaAutocorrExceptPage(pParent, rSet);
1659 }
1660 /* -----------------20.11.98 13:26-------------------
1661  *
1662  * --------------------------------------------------*/
1663 void    OfaAutocorrExceptPage::ActivatePage( const SfxItemSet& )
1664 {
1665     if(eLang != eLastDialogLanguage)
1666         SetLanguage(eLastDialogLanguage);
1667     ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_True);
1668 }
1669 /* -----------------20.11.98 13:26-------------------
1670  *
1671  * --------------------------------------------------*/
1672 int     OfaAutocorrExceptPage::DeactivatePage( SfxItemSet* )
1673 {
1674     return LEAVE_PAGE;
1675 }
1676 /*-----------------14.10.96 15.58-------------------
1677 
1678 --------------------------------------------------*/
1679 
1680 sal_Bool OfaAutocorrExceptPage::FillItemSet( SfxItemSet&  )
1681 {
1682     SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
1683     StringsArraysPtr pArrays = aStringsTable.Last();
1684     while(pArrays)
1685     {
1686         LanguageType eCurLang = (LanguageType)aStringsTable.GetCurKey();
1687         if(eCurLang != eLang) // die aktuelle Sprache wird weiter hinten behandelt
1688         {
1689             SvStringsISortDtor* pWrdList = pAutoCorrect->LoadWrdSttExceptList(eCurLang);
1690 
1691             if(pWrdList)
1692             {
1693                 sal_uInt16 nCount = pWrdList->Count();
1694                 sal_uInt16 i;
1695                 for( i = nCount; i; )
1696                 {
1697                     String* pString = pWrdList->GetObject( --i );
1698                     //Eintrag finden u. gfs entfernen
1699                     if( !lcl_FindInArray(pArrays->aDoubleCapsStrings, *pString))
1700                       pWrdList->DeleteAndDestroy( i );
1701                 }
1702                 nCount = pArrays->aDoubleCapsStrings.Count();
1703                 for( i = 0; i < nCount; ++i )
1704                 {
1705                     String* pEntry = new String( *pArrays->aDoubleCapsStrings.GetObject( i ) );
1706                     if( !pWrdList->Insert( pEntry ))
1707                         delete pEntry;
1708                 }
1709                 pAutoCorrect->SaveWrdSttExceptList(eCurLang);
1710             }
1711 
1712             SvStringsISortDtor* pCplList = pAutoCorrect->LoadCplSttExceptList(eCurLang);
1713 
1714             if(pCplList)
1715             {
1716                 sal_uInt16 nCount = pCplList->Count();
1717                 sal_uInt16 i;
1718                 for( i = nCount; i; )
1719                 {
1720                     String* pString = pCplList->GetObject( --i );
1721                     if( !lcl_FindInArray(pArrays->aAbbrevStrings, *pString))
1722                         pCplList->DeleteAndDestroy( i );
1723                 }
1724                 nCount = pArrays->aAbbrevStrings.Count();
1725                 for( i = 0; i < nCount; ++i )
1726                 {
1727                     String* pEntry = new String( *pArrays->aAbbrevStrings.GetObject(i) );
1728                     if( !pCplList->Insert( pEntry ))
1729                         delete pEntry;
1730                 }
1731                 pAutoCorrect->SaveCplSttExceptList(eCurLang);
1732             }
1733         }
1734         pArrays = aStringsTable.Prev();
1735     }
1736     aStringsTable.Clear();
1737 
1738     SvStringsISortDtor* pWrdList = pAutoCorrect->LoadWrdSttExceptList(eLang);
1739 
1740     if(pWrdList)
1741     {
1742         sal_uInt16 nCount = pWrdList->Count();
1743         sal_uInt16 i;
1744         for( i = nCount; i; )
1745         {
1746             String* pString = pWrdList->GetObject( --i );
1747             if( USHRT_MAX == aDoubleCapsLB.GetEntryPos(*pString) )
1748                 pWrdList->DeleteAndDestroy( i );
1749         }
1750         nCount = aDoubleCapsLB.GetEntryCount();
1751         for( i = 0; i < nCount; ++i )
1752         {
1753             String* pEntry = new String( aDoubleCapsLB.GetEntry( i ) );
1754             if( !pWrdList->Insert( pEntry ))
1755                 delete pEntry;
1756         }
1757         pAutoCorrect->SaveWrdSttExceptList(eLang);
1758     }
1759 
1760     SvStringsISortDtor* pCplList = pAutoCorrect->LoadCplSttExceptList(eLang);
1761 
1762     if(pCplList)
1763     {
1764         sal_uInt16 nCount = pCplList->Count();
1765         sal_uInt16 i;
1766         for( i = nCount; i; )
1767         {
1768             String* pString = pCplList->GetObject( --i );
1769             if( USHRT_MAX == aAbbrevLB.GetEntryPos(*pString) )
1770                 pCplList->DeleteAndDestroy( i );
1771         }
1772         nCount = aAbbrevLB.GetEntryCount();
1773         for( i = 0; i < nCount; ++i )
1774         {
1775             String* pEntry = new String( aAbbrevLB.GetEntry( i ) );
1776             if( !pCplList->Insert( pEntry ))
1777                 delete pEntry;
1778         }
1779         pAutoCorrect->SaveCplSttExceptList(eLang);
1780     }
1781     if(aAutoAbbrevCB.IsChecked() != aAutoAbbrevCB.GetSavedValue())
1782         pAutoCorrect->SetAutoCorrFlag( SaveWordCplSttLst, aAutoAbbrevCB.IsChecked());
1783     if(aAutoCapsCB.IsChecked() != aAutoCapsCB.GetSavedValue())
1784         pAutoCorrect->SetAutoCorrFlag( SaveWordWrdSttLst, aAutoCapsCB.IsChecked());
1785     return sal_False;
1786 }
1787 
1788 /* -----------------23.11.98 10:33-------------------
1789  *
1790  * --------------------------------------------------*/
1791 void OfaAutocorrExceptPage::SetLanguage(LanguageType eSet)
1792 {
1793     if(eLang != eSet)
1794     {
1795         //alte Einstellungen speichern und neu fuellen
1796         RefillReplaceBoxes(sal_False, eLang, eSet);
1797         eLastDialogLanguage = eSet;
1798         delete pCompareClass;
1799         pCompareClass = new CollatorWrapper( GetProcessFact() );
1800         pCompareClass->loadDefaultCollator( SvxCreateLocale( eLastDialogLanguage ),
1801                         ::com::sun::star::i18n::
1802                             CollatorOptions::CollatorOptions_IGNORE_CASE );
1803         ModifyHdl(&aAbbrevED);
1804         ModifyHdl(&aDoubleCapsED);
1805     }
1806 }
1807 /* -----------------20.11.98 14:06-------------------
1808  *
1809  * --------------------------------------------------*/
1810 void OfaAutocorrExceptPage::RefillReplaceBoxes(sal_Bool bFromReset,
1811                                         LanguageType eOldLanguage,
1812                                         LanguageType eNewLanguage)
1813 {
1814     eLang = eNewLanguage;
1815     if(bFromReset)
1816         lcl_ClearTable(aStringsTable);
1817     else
1818     {
1819         StringsArraysPtr pArrays = 0;
1820         if(aStringsTable.IsKeyValid(eOldLanguage))
1821         {
1822             pArrays = aStringsTable.Seek(sal_uLong(eOldLanguage));
1823             pArrays->aAbbrevStrings.DeleteAndDestroy(
1824                                     0, pArrays->aAbbrevStrings.Count());
1825             pArrays->aDoubleCapsStrings.DeleteAndDestroy(
1826                                     0, pArrays->aDoubleCapsStrings.Count());
1827         }
1828         else
1829         {
1830             pArrays = new StringsArrays;
1831             aStringsTable.Insert(sal_uLong(eOldLanguage), pArrays);
1832         }
1833 
1834         sal_uInt16 i;
1835         for(i = 0; i < aAbbrevLB.GetEntryCount(); i++)
1836         {
1837             pArrays->aAbbrevStrings.Insert(
1838                 new String(aAbbrevLB.GetEntry(i)), i);
1839 
1840         }
1841         for(i = 0; i < aDoubleCapsLB.GetEntryCount(); i++)
1842         {
1843             pArrays->aDoubleCapsStrings.Insert(
1844                 new String(aDoubleCapsLB.GetEntry(i)), i);
1845         }
1846     }
1847     aDoubleCapsLB.Clear();
1848     aAbbrevLB.Clear();
1849     String sTemp;
1850     aAbbrevED.SetText(sTemp);
1851     aDoubleCapsED.SetText(sTemp);
1852 
1853     if(aStringsTable.IsKeyValid(eLang))
1854     {
1855         StringsArraysPtr pArrays = aStringsTable.Seek(sal_uLong(eLang));
1856         sal_uInt16 i;
1857         for(i = 0; i < pArrays->aAbbrevStrings.Count(); i++ )
1858         {
1859             aAbbrevLB.InsertEntry(*pArrays->aAbbrevStrings.GetObject(i));
1860         }
1861         for( i = 0; i < pArrays->aDoubleCapsStrings.Count(); i++ )
1862         {
1863             aDoubleCapsLB.InsertEntry(*pArrays->aDoubleCapsStrings.GetObject(i));
1864         }
1865     }
1866     else
1867     {
1868         SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
1869         const SvStringsISortDtor* pCplList = pAutoCorrect->GetCplSttExceptList(eLang);
1870         const SvStringsISortDtor* pWrdList = pAutoCorrect->GetWrdSttExceptList(eLang);
1871         sal_uInt16 i;
1872         for( i = 0; i < pCplList->Count(); i++ )
1873         {
1874             aAbbrevLB.InsertEntry(*pCplList->GetObject(i));
1875         }
1876         for( i = 0; i < pWrdList->Count(); i++ )
1877         {
1878             aDoubleCapsLB.InsertEntry(*pWrdList->GetObject(i));
1879         }
1880     }
1881 }
1882 
1883 /*-----------------14.10.96 15.58-------------------
1884 
1885 --------------------------------------------------*/
1886 
1887 void OfaAutocorrExceptPage::Reset( const SfxItemSet& )
1888 {
1889     SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
1890     RefillReplaceBoxes(sal_True, eLang, eLang);
1891     aAutoAbbrevCB.  Check(  pAutoCorrect->IsAutoCorrFlag( SaveWordCplSttLst ));
1892     aAutoCapsCB.    Check(  pAutoCorrect->IsAutoCorrFlag( SaveWordWrdSttLst ));
1893     aAutoAbbrevCB.SaveValue();
1894     aAutoCapsCB.SaveValue();
1895 }
1896 
1897 /*-----------------16.10.96 12.27-------------------
1898 
1899 --------------------------------------------------*/
1900 
1901 
1902 IMPL_LINK(OfaAutocorrExceptPage, NewDelHdl, PushButton*, pBtn)
1903 {
1904     if((pBtn == &aNewAbbrevPB || pBtn == (PushButton*)&aAbbrevED )
1905         && aAbbrevED.GetText().Len())
1906     {
1907         aAbbrevLB.InsertEntry(aAbbrevED.GetText());
1908         ModifyHdl(&aAbbrevED);
1909     }
1910     else if(pBtn == &aDelAbbrevPB)
1911     {
1912         aAbbrevLB.RemoveEntry(aAbbrevED.GetText());
1913         ModifyHdl(&aAbbrevED);
1914     }
1915     else if((pBtn == &aNewDoublePB || pBtn == (PushButton*)&aDoubleCapsED )
1916             && aDoubleCapsED.GetText().Len())
1917     {
1918         aDoubleCapsLB.InsertEntry(aDoubleCapsED.GetText());
1919         ModifyHdl(&aDoubleCapsED);
1920     }
1921     else if(pBtn == &aDelDoublePB)
1922     {
1923         aDoubleCapsLB.RemoveEntry(aDoubleCapsED.GetText());
1924         ModifyHdl(&aDoubleCapsED);
1925     }
1926     return 0;
1927 }
1928 
1929 /*-----------------16.10.96 12.57-------------------
1930 
1931 --------------------------------------------------*/
1932 
1933 IMPL_LINK(OfaAutocorrExceptPage, SelectHdl, ListBox*, pBox)
1934 {
1935     if(pBox == &aAbbrevLB)
1936     {
1937         aAbbrevED.SetText(pBox->GetSelectEntry());
1938         aNewAbbrevPB.Enable(sal_False);
1939         aDelAbbrevPB.Enable();
1940     }
1941     else
1942     {
1943         aDoubleCapsED.SetText(pBox->GetSelectEntry());
1944         aNewDoublePB.Enable(sal_False);
1945         aDelDoublePB.Enable();
1946     }
1947     return 0;
1948 }
1949 
1950 /*-----------------16.10.96 13.02-------------------
1951 
1952 --------------------------------------------------*/
1953 
1954 IMPL_LINK(OfaAutocorrExceptPage, ModifyHdl, Edit*, pEdt)
1955 {
1956 //  sal_Bool bSame = pEdt->GetText() == ->GetSelectEntry();
1957     const String& sEntry = pEdt->GetText();
1958     sal_Bool bEntryLen = 0!= sEntry.Len();
1959     if(pEdt == &aAbbrevED)
1960     {
1961         sal_Bool bSame = lcl_FindEntry(aAbbrevLB, sEntry, *pCompareClass);
1962         if(bSame && sEntry != aAbbrevLB.GetSelectEntry())
1963             pEdt->SetText(aAbbrevLB.GetSelectEntry());
1964         aNewAbbrevPB.Enable(!bSame && bEntryLen);
1965         aDelAbbrevPB.Enable(bSame && bEntryLen);
1966     }
1967     else
1968     {
1969         sal_Bool bSame = lcl_FindEntry(aDoubleCapsLB, sEntry, *pCompareClass);
1970         if(bSame && sEntry != aDoubleCapsLB.GetSelectEntry())
1971             pEdt->SetText(aDoubleCapsLB.GetSelectEntry());
1972         aNewDoublePB.Enable(!bSame && bEntryLen);
1973         aDelDoublePB.Enable(bSame && bEntryLen);
1974     }
1975     return 0;
1976 }
1977 
1978 /*-----------------16.10.96 15.03-------------------
1979 
1980 --------------------------------------------------*/
1981 
1982 void AutoCorrEdit::KeyInput( const KeyEvent& rKEvt )
1983 {
1984     const KeyCode aKeyCode = rKEvt.GetKeyCode();
1985     const sal_uInt16 nModifier = aKeyCode.GetModifier();
1986     if( aKeyCode.GetCode() == KEY_RETURN )
1987     {
1988         //wird bei Enter nichts getan, dann doch die Basisklasse rufen
1989         // um den Dialog zu schliessen
1990         if(!nModifier && !aActionLink.Call(this))
1991                  Edit::KeyInput(rKEvt);
1992     }
1993     else if(bSpaces || aKeyCode.GetCode() != KEY_SPACE)
1994         Edit::KeyInput(rKEvt);
1995 }
1996 
1997 /*-----------------03.07.97 13:17-------------------
1998 
1999 --------------------------------------------------*/
2000 
2001 enum OfaQuoteOptions
2002 {
2003     ADD_NONBRK_SPACE,
2004     REPLACE_1ST
2005 };
2006 
2007 SvLBoxEntry* OfaQuoteTabPage::CreateEntry(String& rTxt, sal_uInt16 nCol)
2008 {
2009     SvLBoxEntry* pEntry = new SvLBoxEntry;
2010 
2011     if ( !pCheckButtonData )
2012     {
2013         pCheckButtonData = new SvLBoxButtonData( &aSwCheckLB );
2014         aSwCheckLB.SetCheckButtonData( pCheckButtonData );
2015     }
2016 
2017     pEntry->AddItem( new SvLBoxContextBmp( pEntry, 0, Image(), Image(), 0));    // Sonst Puff!
2018 
2019     String sEmpty;
2020     if (nCol == CBCOL_SECOND)
2021         pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );    // Leerspalte
2022     else
2023         pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );
2024 
2025     if (nCol == CBCOL_FIRST)
2026         pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );    // Leerspalte
2027     else
2028         pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );
2029 
2030     pEntry->AddItem( new OfaImpBrwString( pEntry, 0, rTxt ) );
2031 
2032     return pEntry;
2033 }
2034 
2035 OfaQuoteTabPage::OfaQuoteTabPage( Window* pParent, const SfxItemSet& rSet ) :
2036     SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCORR_QUOTE ), rSet),
2037     aCheckLB            (this, CUI_RES(CLB_SETTINGS     )),
2038     aSwCheckLB          (this, CUI_RES(CLB_SETTINGS     )),
2039     sHeader1            (CUI_RES( STR_HEADER1           )),
2040     sHeader2            (CUI_RES( STR_HEADER2           )),
2041     sNonBrkSpace        (CUI_RES( ST_NON_BREAK_SPACE    )),
2042     sOrdinal            (CUI_RES( ST_ORDINAL            )),
2043     pCheckButtonData    ( NULL ),
2044 
2045     aSingleFL           (this, CUI_RES(FL_SINGLE         )),
2046     aSingleTypoCB       (this, CUI_RES(CB_SGL_TYPO     )),
2047     aSglStartQuoteFT    (this, CUI_RES(FT_SGL_STARTQUOTE )),
2048     aSglStartQuotePB    (this, CUI_RES(PB_SGL_STARTQUOTE )),
2049     aSglStartExFT       (this, CUI_RES(FT_SGSTEX       )),
2050     aSglEndQuoteFT      (this, CUI_RES(FT_SGL_ENDQUOTE   )),
2051     aSglEndQuotePB      (this, CUI_RES(PB_SGL_ENDQUOTE   )),
2052     aSglEndExFT         (this, CUI_RES(FT_SGENEX       )),
2053     aSglStandardPB      (this, CUI_RES(PB_SGL_STD      )),
2054 
2055     aDoubleFL           (this, CUI_RES(FL_DOUBLE       )),
2056     aTypoCB             (this, CUI_RES(CB_TYPO         )),
2057     aStartQuoteFT       (this, CUI_RES(FT_STARTQUOTE   )),
2058     aStartQuotePB       (this, CUI_RES(PB_STARTQUOTE   )),
2059     aDblStartExFT       (this, CUI_RES(FT_DBSTEX       )),
2060     aEndQuoteFT         (this, CUI_RES(FT_ENDQUOTE     )),
2061     aEndQuotePB         (this, CUI_RES(PB_ENDQUOTE     )),
2062     aDblEndExFT         (this, CUI_RES(FT_DBECEX       )),
2063     aDblStandardPB      (this, CUI_RES(PB_DBL_STD      )),
2064 
2065     sStartQuoteDlg  (CUI_RES(STR_CHANGE_START)),
2066     sEndQuoteDlg    (CUI_RES(STR_CHANGE_END)),
2067 
2068     sStandard(CUI_RES(ST_STANDARD))
2069 {
2070     aSglStandardPB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_STD) ) );
2071     aDblStandardPB.SetAccessibleName(String(CUI_RES(STR_PB_DBL_STD) ) );
2072     aStartQuotePB.SetAccessibleName( String(CUI_RES(STR_PB_DBL_START) ));
2073     aEndQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_DBL_END) ));
2074     aSglStartQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_START) ));
2075     aSglEndQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_END) ) );
2076 
2077     FreeResource();
2078 
2079     sal_Bool bShowSWOptions = sal_False;
2080 
2081     aCheckLB.SetHelpId( HID_OFAPAGE_QUOTE_CLB );
2082     aSwCheckLB.SetHelpId( HID_OFAPAGE_QUOTE_SW_CLB );
2083 
2084     SFX_ITEMSET_ARG( &rSet, pItem, SfxBoolItem, SID_AUTO_CORRECT_DLG, sal_False );
2085     if ( pItem && pItem->GetValue() )
2086         bShowSWOptions = sal_True;
2087 
2088     if ( bShowSWOptions )
2089     {
2090         static long aStaticTabs[]=
2091         {
2092             3, 0, 20, 40
2093         };
2094 
2095         aSwCheckLB.SetStyle(aSwCheckLB.GetStyle() | WB_HSCROLL| WB_VSCROLL);
2096 
2097         aSwCheckLB.SvxSimpleTable::SetTabs(aStaticTabs);
2098         String sHeader( sHeader1 );
2099         sHeader += '\t';
2100         sHeader += sHeader2;
2101         sHeader += '\t';
2102         aSwCheckLB.InsertHeaderEntry( sHeader, HEADERBAR_APPEND,
2103                         HIB_CENTER | HIB_VCENTER | HIB_FIXEDPOS | HIB_FIXED);
2104         aCheckLB.Hide( sal_True );
2105     }
2106     else
2107     {
2108         aSwCheckLB.HideTable( );
2109     }
2110 
2111     aStartQuotePB.SetClickHdl(LINK(this,    OfaQuoteTabPage, QuoteHdl));
2112     aEndQuotePB.SetClickHdl(LINK(this,      OfaQuoteTabPage, QuoteHdl));
2113     aSglStartQuotePB.SetClickHdl(LINK(this, OfaQuoteTabPage, QuoteHdl));
2114     aSglEndQuotePB.SetClickHdl(LINK(this,   OfaQuoteTabPage, QuoteHdl));
2115     aDblStandardPB.SetClickHdl(LINK(this,   OfaQuoteTabPage, StdQuoteHdl));
2116     aSglStandardPB.SetClickHdl(LINK(this,   OfaQuoteTabPage, StdQuoteHdl));
2117 
2118     aSglStartQuotePB.SetAccessibleRelationLabeledBy( &aSglStartQuoteFT );
2119     aSglEndQuotePB.SetAccessibleRelationLabeledBy( &aSglEndQuoteFT );
2120     aSglStartQuotePB.SetAccessibleRelationMemberOf( &aSingleFL );
2121     aSglEndQuotePB.SetAccessibleRelationMemberOf( &aSingleFL );
2122     aStartQuotePB.SetAccessibleRelationLabeledBy( &aStartQuoteFT );
2123     aEndQuotePB.SetAccessibleRelationLabeledBy( &aEndQuoteFT );
2124     aStartQuotePB.SetAccessibleRelationMemberOf( &aDoubleFL );
2125     aEndQuotePB.SetAccessibleRelationMemberOf( &aDoubleFL );
2126     aSglStandardPB.SetAccessibleRelationMemberOf(&aSingleFL);
2127     aDblStandardPB.SetAccessibleRelationMemberOf(&aDoubleFL);
2128 }
2129 /*-----------------03.07.97 13:17-------------------
2130 
2131 --------------------------------------------------*/
2132 OfaQuoteTabPage::~OfaQuoteTabPage()
2133 {
2134     delete( pCheckButtonData );
2135 }
2136 /*-----------------03.07.97 13:17-------------------
2137 
2138 --------------------------------------------------*/
2139 SfxTabPage* OfaQuoteTabPage::Create( Window* pParent,
2140                                 const SfxItemSet& rAttrSet)
2141 {
2142     return new OfaQuoteTabPage(pParent, rAttrSet);
2143 }
2144 /*-----------------03.07.97 13:18-------------------
2145 
2146 --------------------------------------------------*/
2147 sal_Bool OfaQuoteTabPage::FillItemSet( SfxItemSet&  )
2148 {
2149     SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
2150 
2151     long nFlags = pAutoCorrect->GetFlags();
2152 
2153     if ( aCheckLB.IsVisible( ) )
2154     {
2155         sal_uInt16 nPos = 0;
2156         pAutoCorrect->SetAutoCorrFlag(AddNonBrkSpace,       aCheckLB.IsChecked(nPos++));
2157         pAutoCorrect->SetAutoCorrFlag(ChgOrdinalNumber,     aCheckLB.IsChecked(nPos++));
2158     }
2159 
2160     sal_Bool bModified = sal_False;
2161     if ( aSwCheckLB.IsVisible( ) )
2162     {
2163         SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
2164 
2165         sal_Bool bCheck = aSwCheckLB.IsChecked(ADD_NONBRK_SPACE, CBCOL_FIRST);
2166         bModified |= pOpt->bAddNonBrkSpace != bCheck;
2167         pOpt->bAddNonBrkSpace = bCheck;
2168         pAutoCorrect->SetAutoCorrFlag(AddNonBrkSpace,
2169                             aSwCheckLB.IsChecked(ADD_NONBRK_SPACE, CBCOL_SECOND));
2170 
2171         bCheck = aSwCheckLB.IsChecked(REPLACE_1ST, CBCOL_FIRST);
2172         bModified |= pOpt->bChgOrdinalNumber != bCheck;
2173         pOpt->bChgOrdinalNumber = bCheck;
2174         pAutoCorrect->SetAutoCorrFlag(ChgOrdinalNumber,
2175                         aSwCheckLB.IsChecked(REPLACE_1ST, CBCOL_SECOND));
2176     }
2177 
2178     pAutoCorrect->SetAutoCorrFlag(ChgQuotes,        aTypoCB.IsChecked());
2179     pAutoCorrect->SetAutoCorrFlag(ChgSglQuotes,     aSingleTypoCB.IsChecked());
2180     sal_Bool bReturn = nFlags != pAutoCorrect->GetFlags();
2181     if(cStartQuote != pAutoCorrect->GetStartDoubleQuote())
2182     {
2183         bReturn = sal_True;
2184         sal_Unicode cUCS2 = static_cast<sal_Unicode>(cStartQuote); //TODO
2185         pAutoCorrect->SetStartDoubleQuote(cUCS2);
2186     }
2187     if(cEndQuote != pAutoCorrect->GetEndDoubleQuote())
2188     {
2189         bReturn = sal_True;
2190         sal_Unicode cUCS2 = static_cast<sal_Unicode>(cEndQuote); //TODO
2191         pAutoCorrect->SetEndDoubleQuote(cUCS2);
2192     }
2193     if(cSglStartQuote != pAutoCorrect->GetStartSingleQuote())
2194     {
2195         bReturn = sal_True;
2196         sal_Unicode cUCS2 = static_cast<sal_Unicode>(cSglStartQuote); //TODO
2197         pAutoCorrect->SetStartSingleQuote(cUCS2);
2198     }
2199     if(cSglEndQuote != pAutoCorrect->GetEndSingleQuote())
2200     {
2201         bReturn = sal_True;
2202         sal_Unicode cUCS2 = static_cast<sal_Unicode>(cSglEndQuote); //TODO
2203         pAutoCorrect->SetEndSingleQuote(cUCS2);
2204     }
2205 
2206     if( bModified || bReturn )
2207     {
2208         SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
2209         pCfg->SetModified();
2210         pCfg->Commit();
2211     }
2212     return bReturn;
2213 }
2214 /* -----------------23.11.98 16:15-------------------
2215  *
2216  * --------------------------------------------------*/
2217 void OfaQuoteTabPage::ActivatePage( const SfxItemSet& )
2218 {
2219     ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_False);
2220 }
2221 /*-----------------03.07.97 13:18-------------------
2222 
2223 --------------------------------------------------*/
2224 void OfaQuoteTabPage::Reset( const SfxItemSet& )
2225 {
2226     SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
2227     const long nFlags = pAutoCorrect->GetFlags();
2228 
2229     // Initialize the Sw options
2230     if ( aSwCheckLB.IsVisible( ) )
2231     {
2232         SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
2233 
2234         aSwCheckLB.SetUpdateMode( sal_False );
2235         aSwCheckLB.Clear();
2236 
2237         aSwCheckLB.GetModel()->Insert(CreateEntry(sNonBrkSpace,       CBCOL_BOTH ));
2238         aSwCheckLB.GetModel()->Insert(CreateEntry(sOrdinal,           CBCOL_BOTH ));
2239 
2240         aSwCheckLB.CheckEntryPos( ADD_NONBRK_SPACE, CBCOL_FIRST,    pOpt->bAddNonBrkSpace );
2241         aSwCheckLB.CheckEntryPos( ADD_NONBRK_SPACE, CBCOL_SECOND,   0 != (nFlags & AddNonBrkSpace) );
2242         aSwCheckLB.CheckEntryPos( REPLACE_1ST,      CBCOL_FIRST,    pOpt->bChgOrdinalNumber );
2243         aSwCheckLB.CheckEntryPos( REPLACE_1ST,      CBCOL_SECOND,   0 != (nFlags & ChgOrdinalNumber) );
2244 
2245         aSwCheckLB.SetUpdateMode( sal_True );
2246     }
2247 
2248     // Initialize the non Sw options
2249     if ( aCheckLB.IsVisible( ) )
2250     {
2251         aCheckLB.SetUpdateMode( sal_False );
2252         aCheckLB.Clear( );
2253 
2254         aCheckLB.InsertEntry( sNonBrkSpace );
2255         aCheckLB.InsertEntry( sOrdinal );
2256 
2257         sal_uInt16 nPos = 0;
2258         aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & AddNonBrkSpace) );
2259         aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & ChgOrdinalNumber) );
2260 
2261         aCheckLB.SetUpdateMode( sal_True );
2262     }
2263 
2264     // Initialize the quote stuffs
2265     aTypoCB             .Check(0 != (nFlags & ChgQuotes));
2266     aSingleTypoCB       .Check(0 != (nFlags & ChgSglQuotes));
2267     aTypoCB             .SaveValue();
2268     aSingleTypoCB       .SaveValue();
2269 
2270     cStartQuote = pAutoCorrect->GetStartDoubleQuote();
2271     cEndQuote = pAutoCorrect->GetEndDoubleQuote();
2272     cSglStartQuote = pAutoCorrect->GetStartSingleQuote();
2273     cSglEndQuote = pAutoCorrect->GetEndSingleQuote();
2274 
2275     aSglStartExFT .SetText(ChangeStringExt_Impl(cSglStartQuote));
2276     aSglEndExFT   .SetText(ChangeStringExt_Impl(cSglEndQuote));
2277     aDblStartExFT .SetText(ChangeStringExt_Impl(cStartQuote));
2278     aDblEndExFT   .SetText(ChangeStringExt_Impl(cEndQuote));
2279 }
2280 
2281 
2282 /*-----------------15.10.96 16.42-------------------
2283 
2284 --------------------------------------------------*/
2285 #define SGL_START       0
2286 #define DBL_START       1
2287 #define SGL_END         2
2288 #define DBL_END         3
2289 
2290 
2291 IMPL_LINK( OfaQuoteTabPage, QuoteHdl, PushButton*, pBtn )
2292 {
2293     sal_uInt16 nMode = SGL_START;
2294     if(pBtn == &aSglEndQuotePB)
2295         nMode = SGL_END;
2296     else if(pBtn == &aStartQuotePB)
2297         nMode = DBL_START;
2298     else if(pBtn == &aEndQuotePB)
2299         nMode = DBL_END;
2300     // Zeichenauswahl-Dialog starten
2301     SvxCharacterMap* pMap = new SvxCharacterMap( this, sal_True );
2302     pMap->SetCharFont( OutputDevice::GetDefaultFont(DEFAULTFONT_LATIN_TEXT,
2303                         LANGUAGE_ENGLISH_US, DEFAULTFONT_FLAGS_ONLYONE, 0 ));
2304     pMap->SetText(nMode < SGL_END ? sStartQuoteDlg  :  sEndQuoteDlg );
2305     sal_UCS4 cDlg;
2306     //The two lines below are added by BerryJia for Bug95846 Time:2002-8-13 15:50
2307     SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
2308     LanguageType eLang = Application::GetSettings().GetLanguage();
2309     switch( nMode )
2310     {
2311         case SGL_START:
2312             cDlg = cSglStartQuote;
2313             if(cDlg == 0)
2314                 cDlg = pAutoCorrect->GetQuote('\'',sal_True,eLang);   //add by BerryJia for Bug95846 Time:2002-8-13 15:50
2315         break;
2316         case SGL_END:
2317             cDlg = cSglEndQuote;
2318             if(cDlg == 0)
2319                 cDlg = pAutoCorrect->GetQuote('\'',sal_False,eLang);  //add by BerryJia for Bug95846 Time:2002-8-13 15:50
2320         break;
2321         case DBL_START:
2322             cDlg = cStartQuote;
2323             if(cDlg == 0)
2324                 cDlg = pAutoCorrect->GetQuote('\"',sal_True,eLang);   //add by BerryJia for Bug95846 Time:2002-8-13 15:50
2325         break;
2326         case DBL_END:
2327             cDlg = cEndQuote;
2328             if(cDlg == 0)
2329                 cDlg = pAutoCorrect->GetQuote('\"',sal_False,eLang);  //add by BerryJia for Bug95846 Time:2002-8-13 15:50
2330         break;
2331         default:
2332             DBG_ERROR("svx::OfaQuoteTabPage::QuoteHdl(), how to initialize cDlg?" );
2333             cDlg = 0;
2334             break;
2335 
2336     }
2337     pMap->SetChar(  cDlg );
2338     pMap->DisableFontSelection();
2339     if(pMap->Execute() == RET_OK)
2340     {
2341         sal_UCS4 cNewChar = pMap->GetChar();
2342         switch( nMode )
2343         {
2344             case SGL_START:
2345                 cSglStartQuote = cNewChar;
2346                 aSglStartExFT.SetText(ChangeStringExt_Impl(cNewChar));
2347             break;
2348             case SGL_END:
2349                 cSglEndQuote = cNewChar;
2350                 aSglEndExFT.SetText(ChangeStringExt_Impl(cNewChar));
2351             break;
2352             case DBL_START:
2353                 cStartQuote = cNewChar;
2354                 aDblStartExFT.SetText(ChangeStringExt_Impl(cNewChar));
2355             break;
2356             case DBL_END:
2357                 cEndQuote = cNewChar;
2358                 aDblEndExFT.SetText(ChangeStringExt_Impl(cNewChar));
2359             break;
2360         }
2361     }
2362     delete pMap;
2363 
2364     return 0;
2365 }
2366 
2367 /*-----------------27.06.97 09.55-------------------
2368 
2369 --------------------------------------------------*/
2370 IMPL_LINK( OfaQuoteTabPage, StdQuoteHdl, PushButton*, pBtn )
2371 {
2372     if(pBtn == &aDblStandardPB)
2373     {
2374         cStartQuote = 0;
2375         aDblStartExFT.SetText(ChangeStringExt_Impl(0));
2376         cEndQuote = 0;
2377         aDblEndExFT.SetText(ChangeStringExt_Impl(0));
2378 
2379     }
2380     else
2381     {
2382         cSglStartQuote = 0;
2383         aSglStartExFT.SetText(ChangeStringExt_Impl(0));
2384         cSglEndQuote = 0;
2385         aSglEndExFT.SetText(ChangeStringExt_Impl(0));
2386     }
2387     return 0;
2388 }
2389 
2390 // --------------------------------------------------
2391 
2392 String OfaQuoteTabPage::ChangeStringExt_Impl( sal_UCS4 cChar )
2393 {
2394     if( !cChar )
2395         return sStandard;
2396 
2397     // convert codepoint value to unicode-hex string
2398     sal_UCS4 aStrCodes[32] = { 0, ' ', '(', 'U', '+', '0' };
2399     aStrCodes[0] = cChar;
2400     int nFullLen = 5;
2401     int nHexLen = 4;
2402     while( (cChar >> (4*nHexLen)) != 0 )
2403         ++nHexLen;
2404     for( int i = nHexLen; --i >= 0;)
2405     {
2406         sal_UCS4 cHexDigit = ((cChar >> (4*i)) & 0x0f) + '0';
2407         if( cHexDigit > '9' )
2408             cHexDigit += 'A' - ('9' + 1);
2409         aStrCodes[ nFullLen++ ] = cHexDigit;
2410     }
2411     aStrCodes[ nFullLen++ ] = ')';
2412     // using the new UCS4 constructor
2413     rtl::OUString aOUStr( aStrCodes, nFullLen );
2414     return aOUStr;
2415 }
2416 
2417 OfaAutoCompleteTabPage::OfaAutoCompleteTabPage( Window* pParent,
2418                                                 const SfxItemSet& rSet )
2419     : SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCOMPLETE_OPTIONS ), rSet),
2420     aCBActiv        (this, CUI_RES(CB_ACTIV)),
2421     aCBAppendSpace  (this, CUI_RES(CB_APPEND_SPACE)),
2422     aCBAsTip        (this, CUI_RES(CB_AS_TIP)),
2423     aCBCollect      (this, CUI_RES(CB_COLLECT)),
2424     aCBRemoveList   (this, CUI_RES(CB_REMOVE_LIST)),
2425     aFTExpandKey    (this, CUI_RES(FT_EXPAND_KEY)),
2426     aDCBExpandKey   (this, CUI_RES(DCB_EXPAND_KEY)),
2427     aFTMinWordlen   (this, CUI_RES(FT_MIN_WORDLEN)),
2428     aNFMinWordlen   (this, CUI_RES(NF_MIN_WORDLEN)),
2429     aFTMaxEntries   (this, CUI_RES(FT_MAX_ENTRIES)),
2430     aNFMaxEntries   (this, CUI_RES(NF_MAX_ENTRIES)),
2431     aLBEntries      (*this, CUI_RES(LB_ENTRIES)),
2432     aPBEntries      (this, CUI_RES(PB_ENTRIES)),
2433     pAutoCmpltList( 0 ),
2434     nAutoCmpltListCnt( 0 )
2435 {
2436     FreeResource();
2437 
2438     // the defined KEYs
2439     static const sal_uInt16 aKeyCodes[] = {
2440         KEY_END,
2441         KEY_RETURN,
2442         KEY_SPACE,
2443         KEY_RIGHT,
2444         KEY_TAB,
2445         0
2446     };
2447 
2448     for( const sal_uInt16* pKeys = aKeyCodes; *pKeys; ++pKeys )
2449     {
2450         KeyCode aKCode( *pKeys );
2451         sal_uInt16 nPos = aDCBExpandKey.InsertEntry( aKCode.GetName() );
2452         aDCBExpandKey.SetEntryData( nPos, (void*)(sal_uLong)*pKeys );
2453         if( KEY_RETURN == *pKeys )      // default to RETURN
2454             aDCBExpandKey.SelectEntryPos( nPos );
2455     }
2456 
2457     aPBEntries.SetClickHdl(LINK(this, OfaAutoCompleteTabPage, DeleteHdl));
2458     aCBActiv.SetToggleHdl(LINK(this, OfaAutoCompleteTabPage, CheckHdl));
2459     aCBCollect.SetToggleHdl(LINK(this, OfaAutoCompleteTabPage, CheckHdl));
2460     aLBEntries.SetAccessibleRelationLabeledBy(&aLBEntries);
2461 }
2462 
2463 OfaAutoCompleteTabPage::~OfaAutoCompleteTabPage()
2464 {
2465 }
2466 
2467 SfxTabPage* OfaAutoCompleteTabPage::Create( Window* pParent,
2468                                             const SfxItemSet& rSet)
2469 {
2470     return new OfaAutoCompleteTabPage( pParent, rSet );
2471 }
2472 
2473 sal_Bool OfaAutoCompleteTabPage::FillItemSet( SfxItemSet& )
2474 {
2475     sal_Bool bModified = sal_False, bCheck;
2476     SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
2477     SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
2478     sal_uInt16 nVal;
2479 
2480     bCheck = aCBActiv.IsChecked();
2481     bModified |= pOpt->bAutoCompleteWords != bCheck;
2482     pOpt->bAutoCompleteWords = bCheck;
2483     bCheck = aCBCollect.IsChecked();
2484     bModified |= pOpt->bAutoCmpltCollectWords != bCheck;
2485     pOpt->bAutoCmpltCollectWords = bCheck;
2486     bCheck = !aCBRemoveList.IsChecked(); // inverted value!
2487     bModified |= pOpt->bAutoCmpltKeepList != bCheck;
2488     pOpt->bAutoCmpltKeepList = bCheck;
2489     bCheck = aCBAppendSpace.IsChecked();
2490     bModified |= pOpt->bAutoCmpltAppendBlanc != bCheck;
2491     pOpt->bAutoCmpltAppendBlanc = bCheck;
2492     bCheck = aCBAsTip.IsChecked();
2493     bModified |= pOpt->bAutoCmpltShowAsTip != bCheck;
2494     pOpt->bAutoCmpltShowAsTip = bCheck;
2495 
2496     nVal = (sal_uInt16)aNFMinWordlen.GetValue();
2497     bModified |= nVal != pOpt->nAutoCmpltWordLen;
2498     pOpt->nAutoCmpltWordLen = nVal;
2499 
2500     nVal = (sal_uInt16)aNFMaxEntries.GetValue();
2501     bModified |= nVal != pOpt->nAutoCmpltListLen;
2502     pOpt->nAutoCmpltListLen = nVal;
2503 
2504     nVal = aDCBExpandKey.GetSelectEntryPos();
2505     if( nVal < aDCBExpandKey.GetEntryCount() )
2506     {
2507         sal_uLong nKey = (sal_uLong)aDCBExpandKey.GetEntryData( nVal );
2508         bModified |= nKey != pOpt->nAutoCmpltExpandKey;
2509         pOpt->nAutoCmpltExpandKey = (sal_uInt16)nKey;
2510    }
2511 
2512     if( pAutoCmpltList && nAutoCmpltListCnt != aLBEntries.GetEntryCount() )
2513     {
2514         bModified = sal_True;
2515         pOpt->pAutoCmpltList = pAutoCmpltList;
2516     }
2517     if( bModified )
2518     {
2519         SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
2520         pCfg->SetModified();
2521         pCfg->Commit();
2522     }
2523     return sal_True;
2524 }
2525 
2526 void OfaAutoCompleteTabPage::Reset( const SfxItemSet&  )
2527 {
2528     SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
2529     SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
2530 
2531     aCBActiv.Check( 0 != pOpt->bAutoCompleteWords );
2532     aCBCollect.Check( 0 != pOpt->bAutoCmpltCollectWords );
2533     aCBRemoveList.Check( !pOpt->bAutoCmpltKeepList ); //inverted value!
2534     aCBAppendSpace.Check( 0 != pOpt->bAutoCmpltAppendBlanc );
2535     aCBAsTip.Check( 0 != pOpt->bAutoCmpltShowAsTip );
2536 
2537     aNFMinWordlen.SetValue( pOpt->nAutoCmpltWordLen );
2538     aNFMaxEntries.SetValue( pOpt->nAutoCmpltListLen );
2539 
2540     // select the specific KeyCode:
2541     {
2542         sal_uLong nKey = pOpt->nAutoCmpltExpandKey;
2543         for( sal_uInt16 n = 0, nCnt = aDCBExpandKey.GetEntryCount(); n < nCnt; ++n )
2544             if( nKey == (sal_uLong)aDCBExpandKey.GetEntryData( n ))
2545             {
2546                 aDCBExpandKey.SelectEntryPos( n );
2547                 break;
2548             }
2549     }
2550 
2551     if( pOpt->pAutoCmpltList && pOpt->pAutoCmpltList->Count() )
2552     {
2553         pAutoCmpltList = (SvStringsISortDtor*)pOpt->pAutoCmpltList;
2554         pOpt->pAutoCmpltList = 0;
2555         nAutoCmpltListCnt = pAutoCmpltList->Count();
2556         for( sal_uInt16 n = 0; n < nAutoCmpltListCnt; ++n )
2557         {
2558             const StringPtr pStr = pAutoCmpltList->GetObject( n );
2559             sal_uInt16 nPos = aLBEntries.InsertEntry( *pStr );
2560             aLBEntries.SetEntryData( nPos, (void*)pStr );
2561         }
2562     }
2563     else
2564     {
2565         aLBEntries.Disable();
2566         aPBEntries.Disable();
2567     }
2568 
2569     CheckHdl( &aCBActiv );
2570     CheckHdl( &aCBCollect );
2571 }
2572 
2573 void OfaAutoCompleteTabPage::ActivatePage( const SfxItemSet& )
2574 {
2575     ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage( sal_False );
2576 }
2577 
2578 IMPL_LINK( OfaAutoCompleteTabPage, DeleteHdl, PushButton*, EMPTYARG )
2579 {
2580     sal_uInt16 nSelCnt = pAutoCmpltList ? aLBEntries.GetSelectEntryCount() : 0;
2581     while( nSelCnt )
2582     {
2583         sal_uInt16 nPos = aLBEntries.GetSelectEntryPos( --nSelCnt );
2584         const StringPtr pStr = (StringPtr)aLBEntries.GetEntryData( nPos );
2585         aLBEntries.RemoveEntry( nPos );
2586         nPos = pAutoCmpltList->GetPos( pStr );
2587         if( USHRT_MAX != nPos )
2588             pAutoCmpltList->Remove( nPos );
2589     }
2590     return 0;
2591 }
2592 
2593 IMPL_LINK( OfaAutoCompleteTabPage, CheckHdl, CheckBox*, pBox )
2594 {
2595     sal_Bool bEnable = pBox->IsChecked();
2596     if( pBox == &aCBActiv )
2597     {
2598         aCBAppendSpace.Enable( bEnable );
2599         aCBAppendSpace.Enable( bEnable );
2600         aCBAsTip.Enable( bEnable );
2601         aDCBExpandKey.Enable( bEnable );
2602     }
2603     else if(&aCBCollect == pBox)
2604         aCBRemoveList.Enable( bEnable );
2605     return 0;
2606 }
2607 
2608 void OfaAutoCompleteTabPage::CopyToClipboard() const
2609 {
2610     sal_uInt16 nSelCnt = aLBEntries.GetSelectEntryCount();
2611     if( pAutoCmpltList && nSelCnt )
2612     {
2613         TransferDataContainer* pCntnr = new TransferDataContainer;
2614         ::com::sun::star::uno::Reference<
2615             ::com::sun::star::datatransfer::XTransferable > xRef( pCntnr );
2616 
2617         ByteString sData;
2618         const sal_Char* pLineEnd =
2619 #if defined(UNX)
2620                 "\012";
2621 #else
2622                 "\015\012";
2623 #endif
2624 
2625         rtl_TextEncoding nEncode = gsl_getSystemTextEncoding();
2626 
2627         for( sal_uInt16 n = 0; n < nSelCnt; ++n )
2628         {
2629             sData += ByteString( aLBEntries.GetSelectEntry( n ), nEncode );
2630             sData += pLineEnd;
2631         }
2632         pCntnr->CopyByteString( SOT_FORMAT_STRING, sData );
2633         pCntnr->CopyToClipboard( (Window*)this );
2634     }
2635 }
2636 
2637 long OfaAutoCompleteTabPage::AutoCompleteMultiListBox::PreNotify(
2638             NotifyEvent& rNEvt )
2639 {
2640     long nHandled = MultiListBox::PreNotify( rNEvt );
2641 
2642     if( !nHandled && EVENT_KEYUP == rNEvt.GetType() )
2643     {
2644         const KeyCode& rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
2645         switch( rKeyCode.GetModifier() | rKeyCode.GetCode() )
2646         {
2647         case KEY_DELETE:
2648             rPage.DeleteHdl( 0 );
2649             nHandled = 1;
2650             break;
2651 
2652         default:
2653             if( KEYFUNC_COPY == rKeyCode.GetFunction() )
2654             {
2655                 rPage.CopyToClipboard();
2656                 nHandled = 1;
2657             }
2658             break;
2659         }
2660     }
2661     return nHandled;
2662 }
2663 
2664 // class OfaSmartTagOptionsTabPage ---------------------------------------------
2665 
2666 OfaSmartTagOptionsTabPage::OfaSmartTagOptionsTabPage( Window* pParent,
2667                                                       const SfxItemSet& rSet )
2668     : SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_SMARTTAG_OPTIONS ), rSet),
2669     m_aMainCB( this, CUI_RES(CB_SMARTTAGS) ),
2670     m_aSmartTagTypesLB( this, CUI_RES(LB_SMARTTAGS) ),
2671     m_aPropertiesPB( this, CUI_RES(PB_SMARTTAGS) ),
2672     m_aTitleFT( this, CUI_RES(FT_SMARTTAGS) )
2673 {
2674     FreeResource();
2675 
2676     // some options for the list box:
2677     m_aSmartTagTypesLB.SetStyle( m_aSmartTagTypesLB.GetStyle() | WB_HSCROLL | WB_HIDESELECTION );
2678     m_aSmartTagTypesLB.SetHighlightRange();
2679 
2680     // set the handlers:
2681     m_aMainCB.SetToggleHdl(LINK(this, OfaSmartTagOptionsTabPage, CheckHdl));
2682     m_aPropertiesPB.SetClickHdl(LINK(this, OfaSmartTagOptionsTabPage, ClickHdl));
2683     m_aSmartTagTypesLB.SetSelectHdl(LINK(this, OfaSmartTagOptionsTabPage, SelectHdl));
2684 }
2685 
2686 OfaSmartTagOptionsTabPage::~OfaSmartTagOptionsTabPage()
2687 {
2688 
2689 }
2690 
2691 SfxTabPage* OfaSmartTagOptionsTabPage::Create( Window* pParent, const SfxItemSet& rSet)
2692 {
2693     return new OfaSmartTagOptionsTabPage( pParent, rSet );
2694 }
2695 
2696 /** This struct is used to associate list box entries with smart tag data
2697 */
2698 struct ImplSmartTagLBUserData
2699 {
2700     rtl::OUString maSmartTagType;
2701     uno::Reference< smarttags::XSmartTagRecognizer > mxRec;
2702     sal_Int32 mnSmartTagIdx;
2703 
2704     ImplSmartTagLBUserData( const rtl::OUString& rSmartTagType,
2705                             uno::Reference< smarttags::XSmartTagRecognizer > xRec,
2706                             sal_Int32 nSmartTagIdx ) :
2707         maSmartTagType( rSmartTagType ),
2708         mxRec( xRec ),
2709         mnSmartTagIdx( nSmartTagIdx ) {}
2710 };
2711 
2712 /** Clears m_aSmartTagTypesLB
2713 */
2714 void OfaSmartTagOptionsTabPage::ClearListBox()
2715 {
2716     const sal_uLong nCount = m_aSmartTagTypesLB.GetEntryCount();
2717     for ( sal_uInt16 i = 0; i < nCount; ++i )
2718     {
2719         const SvLBoxEntry* pEntry = m_aSmartTagTypesLB.GetEntry(i);
2720         const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
2721         delete pUserData;
2722     }
2723 
2724     m_aSmartTagTypesLB.Clear();
2725 }
2726 
2727 /** Inserts items into m_aSmartTagTypesLB
2728 */
2729 void OfaSmartTagOptionsTabPage::FillListBox( const SmartTagMgr& rSmartTagMgr )
2730 {
2731     // first we have to clear the list box:
2732     ClearListBox();
2733 
2734     // fill list box:
2735     const sal_uInt32 nNumberOfRecognizers = rSmartTagMgr.NumberOfRecognizers();
2736     const lang::Locale aLocale( SvxCreateLocale( eLastDialogLanguage ) );
2737     std::vector< ActionReference > aActionReferences;
2738 
2739     for ( sal_uInt32 i = 0; i < nNumberOfRecognizers; ++i )
2740     {
2741         uno::Reference< smarttags::XSmartTagRecognizer > xRec = rSmartTagMgr.GetRecognizer(i);
2742 
2743         const rtl::OUString aName = xRec->getName( aLocale );
2744         const rtl::OUString aDesc = xRec->getDescription( aLocale );
2745         const sal_Int32 nNumberOfSupportedSmartTags = xRec->getSmartTagCount();
2746 
2747         for ( sal_Int32 j = 0; j < nNumberOfSupportedSmartTags; ++j )
2748         {
2749             const rtl::OUString aSmartTagType = xRec->getSmartTagName(j);
2750             rtl::OUString aSmartTagCaption = rSmartTagMgr.GetSmartTagCaption( aSmartTagType, aLocale );
2751 
2752             if ( !aSmartTagCaption.getLength() )
2753                 aSmartTagCaption = aSmartTagType;
2754 
2755             const rtl::OUString aLBEntry = aSmartTagCaption +
2756                                            OUString::createFromAscii(" (") +
2757                                            aName +
2758                                            OUString::createFromAscii(")");
2759 
2760             SvLBoxEntry* pEntry = m_aSmartTagTypesLB.SvTreeListBox::InsertEntry( aLBEntry );
2761             if ( pEntry )
2762             {
2763                 const bool bCheck = rSmartTagMgr.IsSmartTagTypeEnabled( aSmartTagType );
2764                 m_aSmartTagTypesLB.SetCheckButtonState( pEntry, bCheck ? SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED );
2765                 pEntry->SetUserData(static_cast<void*>(new ImplSmartTagLBUserData( aSmartTagType, xRec, j ) ) );
2766             }
2767         }
2768     }
2769 }
2770 
2771 /** Handler for the push button
2772 */
2773 IMPL_LINK( OfaSmartTagOptionsTabPage, ClickHdl, PushButton*, EMPTYARG )
2774 {
2775     const sal_uInt16 nPos = m_aSmartTagTypesLB.GetSelectEntryPos();
2776     const SvLBoxEntry* pEntry = m_aSmartTagTypesLB.GetEntry(nPos);
2777     const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
2778     uno::Reference< smarttags::XSmartTagRecognizer > xRec = pUserData->mxRec;
2779     const sal_Int32 nSmartTagIdx = pUserData->mnSmartTagIdx;
2780 
2781     const lang::Locale aLocale( SvxCreateLocale( eLastDialogLanguage ) );
2782     if ( xRec->hasPropertyPage( nSmartTagIdx, aLocale ) )
2783         xRec->displayPropertyPage( nSmartTagIdx, aLocale );
2784 
2785     return 0;
2786 }
2787 
2788 /** Handler for the check box
2789 */
2790 IMPL_LINK( OfaSmartTagOptionsTabPage, CheckHdl, CheckBox*, EMPTYARG )
2791 {
2792     const sal_Bool bEnable = m_aMainCB.IsChecked();
2793     m_aSmartTagTypesLB.Enable( bEnable );
2794     m_aSmartTagTypesLB.Invalidate();
2795     m_aPropertiesPB.Enable( false );
2796 
2797     // if the controls are currently enabled, we still have to check
2798     // if the properties button should be disabled because the currently
2799     // seleted smart tag type does not have a properties dialog.
2800     // We do this by calling SelectHdl:
2801     if ( bEnable )
2802         SelectHdl( &m_aSmartTagTypesLB );
2803 
2804     return 0;
2805 }
2806 
2807 /** Handler for the list box
2808 */
2809 IMPL_LINK(OfaSmartTagOptionsTabPage, SelectHdl, SvxCheckListBox*, EMPTYARG)
2810 {
2811     if ( m_aSmartTagTypesLB.GetEntryCount() < 1 )
2812         return 0;
2813 
2814     const sal_uInt16 nPos = m_aSmartTagTypesLB.GetSelectEntryPos();
2815     const SvLBoxEntry* pEntry = m_aSmartTagTypesLB.GetEntry(nPos);
2816     const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
2817     uno::Reference< smarttags::XSmartTagRecognizer > xRec = pUserData->mxRec;
2818     const sal_Int32 nSmartTagIdx = pUserData->mnSmartTagIdx;
2819 
2820     const lang::Locale aLocale( SvxCreateLocale( eLastDialogLanguage ) );
2821     if ( xRec->hasPropertyPage( nSmartTagIdx, aLocale ) )
2822         m_aPropertiesPB.Enable( sal_True );
2823     else
2824         m_aPropertiesPB.Enable( sal_False );
2825 
2826     return 0;
2827 }
2828 
2829 /** Propagates the current settings to the smart tag manager.
2830 */
2831 sal_Bool OfaSmartTagOptionsTabPage::FillItemSet( SfxItemSet& )
2832 {
2833     SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
2834     SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
2835     SmartTagMgr* pSmartTagMgr = pOpt->pSmartTagMgr;
2836 
2837     // robust!
2838     if ( !pSmartTagMgr )
2839         return sal_False;
2840 
2841     sal_Bool bModifiedSmartTagTypes = sal_False;
2842     std::vector< rtl::OUString > aDisabledSmartTagTypes;
2843 
2844     const sal_uLong nCount = m_aSmartTagTypesLB.GetEntryCount();
2845 
2846     for ( sal_uInt16 i = 0; i < nCount; ++i )
2847     {
2848         const SvLBoxEntry* pEntry = m_aSmartTagTypesLB.GetEntry(i);
2849         const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
2850         const sal_Bool bChecked = m_aSmartTagTypesLB.IsChecked(i);
2851         const sal_Bool bIsCurrentlyEnabled = pSmartTagMgr->IsSmartTagTypeEnabled( pUserData->maSmartTagType );
2852 
2853         bModifiedSmartTagTypes = bModifiedSmartTagTypes || ( !bChecked != !bIsCurrentlyEnabled );
2854 
2855         if ( !bChecked )
2856             aDisabledSmartTagTypes.push_back( pUserData->maSmartTagType );
2857 
2858         delete pUserData;
2859     }
2860 
2861     const sal_Bool bModifiedRecognize = ( !m_aMainCB.IsChecked() != !pSmartTagMgr->IsLabelTextWithSmartTags() );
2862     if ( bModifiedSmartTagTypes || bModifiedRecognize )
2863     {
2864         bool bLabelTextWithSmartTags = m_aMainCB.IsChecked() ? true : false;
2865         pSmartTagMgr->WriteConfiguration( bModifiedRecognize     ? &bLabelTextWithSmartTags : 0,
2866                                           bModifiedSmartTagTypes ? &aDisabledSmartTagTypes : 0 );
2867     }
2868 
2869     return sal_True;
2870 }
2871 
2872 /** Sets the controls based on the current settings at SmartTagMgr.
2873 */
2874 void OfaSmartTagOptionsTabPage::Reset( const SfxItemSet&  )
2875 {
2876     SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
2877     SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
2878     const SmartTagMgr* pSmartTagMgr = pOpt->pSmartTagMgr;
2879 
2880     // robust, should not happen!
2881     if ( !pSmartTagMgr )
2882         return;
2883 
2884     FillListBox( *pSmartTagMgr );
2885     m_aSmartTagTypesLB.SelectEntryPos( 0 );
2886     m_aMainCB.Check( pSmartTagMgr->IsLabelTextWithSmartTags() );
2887     CheckHdl( &m_aMainCB );
2888 }
2889 
2890 void OfaSmartTagOptionsTabPage::ActivatePage( const SfxItemSet& )
2891 {
2892     ((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage( sal_False );
2893 }
2894 
2895