xref: /AOO41X/main/cui/source/options/optdict.cxx (revision 79aad27f7f29270c03e208e3d687e8e3850af11d)
1*2ee96f1cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*2ee96f1cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*2ee96f1cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*2ee96f1cSAndrew Rist  * distributed with this work for additional information
6*2ee96f1cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*2ee96f1cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*2ee96f1cSAndrew Rist  * "License"); you may not use this file except in compliance
9*2ee96f1cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*2ee96f1cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*2ee96f1cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*2ee96f1cSAndrew Rist  * software distributed under the License is distributed on an
15*2ee96f1cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2ee96f1cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*2ee96f1cSAndrew Rist  * specific language governing permissions and limitations
18*2ee96f1cSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*2ee96f1cSAndrew Rist  *************************************************************/
21*2ee96f1cSAndrew Rist 
22*2ee96f1cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_cui.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir // include ---------------------------------------------------------------
28cdf0e10cSrcweir #include <tools/shl.hxx>
29cdf0e10cSrcweir #include <editeng/unolingu.hxx>
30cdf0e10cSrcweir #include <svx/dlgutil.hxx>
31cdf0e10cSrcweir #include <sfx2/sfxuno.hxx>
32cdf0e10cSrcweir #include <svl/eitem.hxx>
33cdf0e10cSrcweir #include <com/sun/star/frame/XStorable.hpp>
34cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
35cdf0e10cSrcweir #include <unotools/intlwrapper.hxx>
36cdf0e10cSrcweir #include <vcl/svapp.hxx>
37cdf0e10cSrcweir #include <vcl/msgbox.hxx>
38cdf0e10cSrcweir #include <svx/dialogs.hrc>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #define _SVX_OPTDICT_CXX
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #include <linguistic/misc.hxx>
43cdf0e10cSrcweir #include <cuires.hrc>
44cdf0e10cSrcweir #include "optdict.hrc"
45cdf0e10cSrcweir #include "optdict.hxx"
46cdf0e10cSrcweir #include <dialmgr.hxx>
47cdf0e10cSrcweir #include <svx/svxerr.hxx>
48cdf0e10cSrcweir 
49cdf0e10cSrcweir using namespace ::com::sun::star;
50cdf0e10cSrcweir using namespace ::com::sun::star::uno;
51cdf0e10cSrcweir using namespace ::com::sun::star::linguistic2;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir // static ----------------------------------------------------------------
54cdf0e10cSrcweir 
55cdf0e10cSrcweir static const sal_uInt16 nNameLen    = 8;
56cdf0e10cSrcweir static const short  NOACTDICT   = -1;
57cdf0e10cSrcweir 
58cdf0e10cSrcweir static long nStaticTabs[]=
59cdf0e10cSrcweir {
60cdf0e10cSrcweir     2,10,71,120
61cdf0e10cSrcweir };
62cdf0e10cSrcweir 
63cdf0e10cSrcweir // static function -------------------------------------------------------
64cdf0e10cSrcweir 
getNormDicEntry_Impl(const String & rText)65cdf0e10cSrcweir static String getNormDicEntry_Impl( const String &rText )
66cdf0e10cSrcweir {
67cdf0e10cSrcweir     String aTmp( rText );
68cdf0e10cSrcweir     aTmp.EraseTrailingChars( '.' );
69cdf0e10cSrcweir     aTmp.EraseAllChars( '=' );
70cdf0e10cSrcweir     return aTmp;
71cdf0e10cSrcweir }
72cdf0e10cSrcweir 
73cdf0e10cSrcweir 
74cdf0e10cSrcweir // Compare Dictionary Entry  result
75cdf0e10cSrcweir enum CDE_RESULT { CDE_EQUAL, CDE_SIMILAR, CDE_DIFFERENT };
76cdf0e10cSrcweir 
cmpDicEntry_Impl(const String & rText1,const String & rText2)77cdf0e10cSrcweir static CDE_RESULT cmpDicEntry_Impl( const String &rText1, const String &rText2 )
78cdf0e10cSrcweir {
79cdf0e10cSrcweir     CDE_RESULT eRes = CDE_DIFFERENT;
80cdf0e10cSrcweir 
81cdf0e10cSrcweir     if (rText1 == rText2)
82cdf0e10cSrcweir         eRes = CDE_EQUAL;
83cdf0e10cSrcweir     else
84cdf0e10cSrcweir     {   // similar = equal up to trailing '.' and hyphenation positions
85cdf0e10cSrcweir         // marked with '='
86cdf0e10cSrcweir         if (getNormDicEntry_Impl( rText1 ) == getNormDicEntry_Impl( rText2 ))
87cdf0e10cSrcweir             eRes = CDE_SIMILAR;
88cdf0e10cSrcweir     }
89cdf0e10cSrcweir 
90cdf0e10cSrcweir     return eRes;
91cdf0e10cSrcweir }
92cdf0e10cSrcweir 
93cdf0e10cSrcweir // class SvxNewDictionaryDialog -------------------------------------------
94cdf0e10cSrcweir 
SvxNewDictionaryDialog(Window * pParent,Reference<XSpellChecker1> & xSpl)95cdf0e10cSrcweir SvxNewDictionaryDialog::SvxNewDictionaryDialog( Window* pParent,
96cdf0e10cSrcweir         Reference< XSpellChecker1 >  &xSpl ) :
97cdf0e10cSrcweir 
98cdf0e10cSrcweir     ModalDialog( pParent, CUI_RES( RID_SFXDLG_NEWDICT ) ),
99cdf0e10cSrcweir 
100cdf0e10cSrcweir     aNewDictBox     ( this, CUI_RES( GB_NEWDICT ) ),
101cdf0e10cSrcweir     aNameText       ( this, CUI_RES( FT_DICTNAME ) ),
102cdf0e10cSrcweir     aNameEdit       ( this, CUI_RES( ED_DICTNAME ) ),
103cdf0e10cSrcweir     aLanguageText   ( this, CUI_RES( FT_DICTLANG ) ),
104cdf0e10cSrcweir     aLanguageLB     ( this, CUI_RES( LB_DICTLANG ) ),
105cdf0e10cSrcweir     aExceptBtn      ( this, CUI_RES( BTN_EXCEPT ) ),
106cdf0e10cSrcweir     aOKBtn          ( this, CUI_RES( BTN_NEWDICT_OK ) ),
107cdf0e10cSrcweir     aCancelBtn      ( this, CUI_RES( BTN_NEWDICT_ESC ) ),
108cdf0e10cSrcweir     aHelpBtn        ( this, CUI_RES( BTN_NEWDICT_HLP ) ),
109cdf0e10cSrcweir     xSpell( xSpl )
110cdf0e10cSrcweir {
111cdf0e10cSrcweir     // Handler installieren
112cdf0e10cSrcweir     aNameEdit.SetModifyHdl(
113cdf0e10cSrcweir         LINK( this, SvxNewDictionaryDialog, ModifyHdl_Impl ) );
114cdf0e10cSrcweir     aOKBtn.SetClickHdl( LINK( this, SvxNewDictionaryDialog, OKHdl_Impl ) );
115cdf0e10cSrcweir 
116cdf0e10cSrcweir     // Sprachen anzeigen
117cdf0e10cSrcweir     aLanguageLB.SetLanguageList( LANG_LIST_ALL, sal_True, sal_True );
118cdf0e10cSrcweir     aLanguageLB.SelectEntryPos(0);
119cdf0e10cSrcweir 
120cdf0e10cSrcweir     aNameText.SetAccessibleRelationMemberOf( &aNewDictBox );
121cdf0e10cSrcweir     aNameEdit.SetAccessibleRelationMemberOf( &aNewDictBox );
122cdf0e10cSrcweir     aLanguageText.SetAccessibleRelationMemberOf( &aNewDictBox );
123cdf0e10cSrcweir     aLanguageLB.SetAccessibleRelationMemberOf( &aNewDictBox );
124cdf0e10cSrcweir 
125cdf0e10cSrcweir     FreeResource();
126cdf0e10cSrcweir }
127cdf0e10cSrcweir 
128cdf0e10cSrcweir // -----------------------------------------------------------------------
129cdf0e10cSrcweir 
IMPL_LINK(SvxNewDictionaryDialog,OKHdl_Impl,Button *,EMPTYARG)130cdf0e10cSrcweir IMPL_LINK( SvxNewDictionaryDialog, OKHdl_Impl, Button *, EMPTYARG )
131cdf0e10cSrcweir {
132cdf0e10cSrcweir     String sDict = aNameEdit.GetText();
133cdf0e10cSrcweir     sDict.EraseTrailingChars();
134cdf0e10cSrcweir     // add extension for personal dictionaries
135cdf0e10cSrcweir     sDict.AppendAscii(".dic");
136cdf0e10cSrcweir 
137cdf0e10cSrcweir     Reference< XDictionaryList >  xDicList( SvxGetDictionaryList() );
138cdf0e10cSrcweir 
139cdf0e10cSrcweir     Sequence< Reference< XDictionary >  > aDics;
140cdf0e10cSrcweir     if (xDicList.is())
141cdf0e10cSrcweir         aDics = xDicList->getDictionaries();
142cdf0e10cSrcweir     const Reference< XDictionary >  *pDic = aDics.getConstArray();
143cdf0e10cSrcweir     sal_Int32 nCount = (sal_uInt16) aDics.getLength();
144cdf0e10cSrcweir 
145cdf0e10cSrcweir     sal_Bool bFound = sal_False;
146cdf0e10cSrcweir     sal_uInt16 i;
147cdf0e10cSrcweir     for (i = 0; !bFound && i < nCount; ++i )
148cdf0e10cSrcweir         if ( sDict.EqualsIgnoreCaseAscii( String(pDic[i]->getName()) ))
149cdf0e10cSrcweir             bFound = sal_True;
150cdf0e10cSrcweir 
151cdf0e10cSrcweir     if ( bFound )
152cdf0e10cSrcweir     {
153cdf0e10cSrcweir         // Doppelte Namen?
154cdf0e10cSrcweir         InfoBox( this, CUI_RESSTR( RID_SVXSTR_OPT_DOUBLE_DICTS ) ).Execute();
155cdf0e10cSrcweir         aNameEdit.GrabFocus();
156cdf0e10cSrcweir         return 0;
157cdf0e10cSrcweir     }
158cdf0e10cSrcweir 
159cdf0e10cSrcweir     // Erzeugen und hinzufuegen
160cdf0e10cSrcweir     sal_uInt16 nLang = aLanguageLB.GetSelectLanguage();
161cdf0e10cSrcweir     try
162cdf0e10cSrcweir     {
163cdf0e10cSrcweir         // create new dictionary
164cdf0e10cSrcweir         DictionaryType eType = aExceptBtn.IsChecked() ?
165cdf0e10cSrcweir                 DictionaryType_NEGATIVE : DictionaryType_POSITIVE;
166cdf0e10cSrcweir         if (xDicList.is())
167cdf0e10cSrcweir         {
168cdf0e10cSrcweir             lang::Locale aLocale( SvxCreateLocale(nLang) );
169cdf0e10cSrcweir             String aURL( linguistic::GetWritableDictionaryURL( sDict ) );
170cdf0e10cSrcweir             xNewDic = Reference< XDictionary > (
171cdf0e10cSrcweir                     xDicList->createDictionary( sDict, aLocale, eType, aURL ) , UNO_QUERY );
172cdf0e10cSrcweir             xNewDic->setActive( sal_True );
173cdf0e10cSrcweir         }
174cdf0e10cSrcweir         DBG_ASSERT(xNewDic.is(), "NULL pointer");
175cdf0e10cSrcweir     }
176cdf0e10cSrcweir     catch(...)
177cdf0e10cSrcweir     {
178cdf0e10cSrcweir         xNewDic = NULL;
179cdf0e10cSrcweir 
180cdf0e10cSrcweir         // Fehler: konnte neues W"orterbuch nicht anlegen
181cdf0e10cSrcweir         SfxErrorContext aContext( ERRCTX_SVX_LINGU_DICTIONARY, String(),
182cdf0e10cSrcweir             this, RID_SVXERRCTX, &CUI_MGR() );
183cdf0e10cSrcweir         ErrorHandler::HandleError( *new StringErrorInfo(
184cdf0e10cSrcweir                 ERRCODE_SVX_LINGU_DICT_NOTWRITEABLE, sDict ) );
185cdf0e10cSrcweir 
186cdf0e10cSrcweir         EndDialog( RET_CANCEL );
187cdf0e10cSrcweir     }
188cdf0e10cSrcweir 
189cdf0e10cSrcweir     if (xDicList.is() && xNewDic.is())
190cdf0e10cSrcweir     {
191cdf0e10cSrcweir         xDicList->addDictionary( Reference< XDictionary > ( xNewDic, UNO_QUERY ) );
192cdf0e10cSrcweir 
193cdf0e10cSrcweir         // refresh list of dictionaries
194cdf0e10cSrcweir         //! dictionaries may have been added/removed elsewhere too.
195cdf0e10cSrcweir         aDics = xDicList->getDictionaries();
196cdf0e10cSrcweir     }
197cdf0e10cSrcweir     pDic = aDics.getConstArray();
198cdf0e10cSrcweir     nCount = (sal_uInt16) aDics.getLength();
199cdf0e10cSrcweir 
200cdf0e10cSrcweir 
201cdf0e10cSrcweir     EndDialog( RET_OK );
202cdf0e10cSrcweir     return 0;
203cdf0e10cSrcweir }
204cdf0e10cSrcweir 
205cdf0e10cSrcweir // -----------------------------------------------------------------------
206cdf0e10cSrcweir 
IMPL_LINK_INLINE_START(SvxNewDictionaryDialog,ModifyHdl_Impl,Edit *,EMPTYARG)207cdf0e10cSrcweir IMPL_LINK_INLINE_START( SvxNewDictionaryDialog, ModifyHdl_Impl, Edit *, EMPTYARG )
208cdf0e10cSrcweir {
209cdf0e10cSrcweir     if ( aNameEdit.GetText().Len() )
210cdf0e10cSrcweir         aOKBtn.Enable();
211cdf0e10cSrcweir     else
212cdf0e10cSrcweir         aOKBtn.Disable();
213cdf0e10cSrcweir     return 0;
214cdf0e10cSrcweir }
IMPL_LINK_INLINE_END(SvxNewDictionaryDialog,ModifyHdl_Impl,Edit *,EMPTYARG)215cdf0e10cSrcweir IMPL_LINK_INLINE_END( SvxNewDictionaryDialog, ModifyHdl_Impl, Edit *, EMPTYARG )
216cdf0e10cSrcweir 
217cdf0e10cSrcweir //==========================================================================
218cdf0e10cSrcweir //
219cdf0e10cSrcweir // class SvxEditDictionaryDialog -------------------------------------------
220cdf0e10cSrcweir //
221cdf0e10cSrcweir //==========================================================================
222cdf0e10cSrcweir 
223cdf0e10cSrcweir SvxEditDictionaryDialog::SvxEditDictionaryDialog(
224cdf0e10cSrcweir             Window* pParent,
225cdf0e10cSrcweir             const String& rName,
226cdf0e10cSrcweir             Reference< XSpellChecker1 >  &xSpl ) :
227cdf0e10cSrcweir 
228cdf0e10cSrcweir     ModalDialog( pParent, CUI_RES( RID_SFXDLG_EDITDICT ) ),
229cdf0e10cSrcweir 
230cdf0e10cSrcweir     aBookFT         ( this, CUI_RES( FT_BOOK ) ),
231cdf0e10cSrcweir     aAllDictsLB     ( this, CUI_RES( LB_ALLDICTS ) ),
232cdf0e10cSrcweir     aLangFT         ( this, CUI_RES( FT_DICTLANG ) ),
233cdf0e10cSrcweir     aLangLB         ( this, CUI_RES( LB_DICTLANG ) ),
234cdf0e10cSrcweir 
235cdf0e10cSrcweir     aWordFT         ( this, CUI_RES( FT_WORD ) ),
236cdf0e10cSrcweir     aWordED         ( this, CUI_RES( ED_WORD ) ),
237cdf0e10cSrcweir     aReplaceFT      ( this, CUI_RES( FT_REPLACE ) ),
238cdf0e10cSrcweir     aReplaceED      ( this, CUI_RES( ED_REPLACE ) ),
239cdf0e10cSrcweir     aWordsLB        ( this, CUI_RES( TLB_REPLACE ) ),
240cdf0e10cSrcweir     aNewReplacePB   ( this, CUI_RES( PB_NEW_REPLACE ) ),
241cdf0e10cSrcweir     aDeletePB       ( this, CUI_RES( PB_DELETE_REPLACE ) ),
242cdf0e10cSrcweir     aEditDictsBox   ( this, CUI_RES( GB_EDITDICTS ) ),
243cdf0e10cSrcweir     aHelpBtn        ( this, CUI_RES( BTN_EDITHELP ) ),
244cdf0e10cSrcweir     aCloseBtn       ( this, CUI_RES( BTN_EDITCLOSE ) ),
245cdf0e10cSrcweir     sModify         (CUI_RES(STR_MODIFY)),
246cdf0e10cSrcweir     sNew            (aNewReplacePB.GetText()),
247cdf0e10cSrcweir     aDecoView       ( this),
248cdf0e10cSrcweir     xSpell          ( xSpl ),
249cdf0e10cSrcweir     nOld            ( NOACTDICT ),
250cdf0e10cSrcweir     bFirstSelect    (sal_True),
251cdf0e10cSrcweir     bDoNothing      (sal_False)
252cdf0e10cSrcweir 
253cdf0e10cSrcweir {
254cdf0e10cSrcweir     if (SvxGetDictionaryList().is())
255cdf0e10cSrcweir         aDics = SvxGetDictionaryList()->getDictionaries();
256cdf0e10cSrcweir 
257cdf0e10cSrcweir     aWordsLB.SetSelectHdl(LINK(this, SvxEditDictionaryDialog, SelectHdl));
258cdf0e10cSrcweir     aWordsLB.SetTabs(nStaticTabs);
259cdf0e10cSrcweir 
260cdf0e10cSrcweir     //! we use an algorithm of our own to insert elements sorted
261cdf0e10cSrcweir     aWordsLB.SetStyle(aWordsLB.GetStyle()|/*WB_SORT|*/WB_HSCROLL|WB_CLIPCHILDREN);
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 
264cdf0e10cSrcweir     nWidth=aWordED.GetSizePixel().Width();
265cdf0e10cSrcweir     // Handler installieren
266cdf0e10cSrcweir     aNewReplacePB.SetClickHdl(
267cdf0e10cSrcweir         LINK( this, SvxEditDictionaryDialog, NewDelHdl));
268cdf0e10cSrcweir     aDeletePB.SetClickHdl(
269cdf0e10cSrcweir         LINK( this, SvxEditDictionaryDialog, NewDelHdl));
270cdf0e10cSrcweir 
271cdf0e10cSrcweir     aLangLB.SetSelectHdl(
272cdf0e10cSrcweir         LINK( this, SvxEditDictionaryDialog, SelectLangHdl_Impl ) );
273cdf0e10cSrcweir     aAllDictsLB.SetSelectHdl(
274cdf0e10cSrcweir         LINK( this, SvxEditDictionaryDialog, SelectBookHdl_Impl ) );
275cdf0e10cSrcweir 
276cdf0e10cSrcweir     aWordED.SetModifyHdl(LINK(this, SvxEditDictionaryDialog, ModifyHdl));
277cdf0e10cSrcweir     aReplaceED.SetModifyHdl(LINK(this, SvxEditDictionaryDialog, ModifyHdl));
278cdf0e10cSrcweir     aWordED.SetActionHdl(LINK(this, SvxEditDictionaryDialog, NewDelHdl));
279cdf0e10cSrcweir     aReplaceED.SetActionHdl(LINK(this, SvxEditDictionaryDialog, NewDelHdl));
280cdf0e10cSrcweir 
281cdf0e10cSrcweir     // Listbox mit allen verfuegbaren WB's fuellen
282cdf0e10cSrcweir     const Reference< XDictionary >  *pDic = aDics.getConstArray();
283cdf0e10cSrcweir     sal_Int32 nCount = aDics.getLength();
284cdf0e10cSrcweir 
285cdf0e10cSrcweir     String aLookUpEntry;
286cdf0e10cSrcweir     for ( sal_Int32 i = 0; i < nCount; ++i )
287cdf0e10cSrcweir     {
288cdf0e10cSrcweir         Reference< XDictionary >  xDic( pDic[i], UNO_QUERY );
289cdf0e10cSrcweir         if (xDic.is())
290cdf0e10cSrcweir         {
291cdf0e10cSrcweir             sal_Bool bNegative = xDic->getDictionaryType() == DictionaryType_NEGATIVE ?
292cdf0e10cSrcweir                                 sal_True : sal_False;
293cdf0e10cSrcweir             String aDicName( xDic->getName() );
294cdf0e10cSrcweir             const String aTxt( ::GetDicInfoStr( aDicName, SvxLocaleToLanguage( xDic->getLocale() ),
295cdf0e10cSrcweir                                                  bNegative ) );
296cdf0e10cSrcweir             aAllDictsLB.InsertEntry( aTxt );
297cdf0e10cSrcweir 
298cdf0e10cSrcweir             if (rName == aDicName)
299cdf0e10cSrcweir                 aLookUpEntry = aTxt;
300cdf0e10cSrcweir         }
301cdf0e10cSrcweir     }
302cdf0e10cSrcweir 
303cdf0e10cSrcweir     aLangLB.SetLanguageList( LANG_LIST_ALL, sal_True, sal_True );
304cdf0e10cSrcweir 
305cdf0e10cSrcweir     aReplaceED.SetSpaces(sal_True);
306cdf0e10cSrcweir     aWordED.SetSpaces(sal_True);
307cdf0e10cSrcweir 
308cdf0e10cSrcweir     if ( nCount > 0 )
309cdf0e10cSrcweir     {
310cdf0e10cSrcweir         aAllDictsLB.SelectEntry( aLookUpEntry );
311cdf0e10cSrcweir         sal_uInt16 nPos = aAllDictsLB.GetSelectEntryPos();
312cdf0e10cSrcweir 
313cdf0e10cSrcweir         if ( nPos == LISTBOX_ENTRY_NOTFOUND )
314cdf0e10cSrcweir         {
315cdf0e10cSrcweir             nPos = 0;
316cdf0e10cSrcweir             aAllDictsLB.SelectEntryPos( nPos );
317cdf0e10cSrcweir         }
318cdf0e10cSrcweir         Reference< XDictionary >  xDic;
319cdf0e10cSrcweir         if (nPos != LISTBOX_ENTRY_NOTFOUND)
320cdf0e10cSrcweir             xDic = Reference< XDictionary > ( aDics.getConstArray()[ nPos ], UNO_QUERY );
321cdf0e10cSrcweir         if (xDic.is())
322cdf0e10cSrcweir             SetLanguage_Impl( SvxLocaleToLanguage( xDic->getLocale() ) );
323cdf0e10cSrcweir 
324cdf0e10cSrcweir         // check if dictionary is read-only
325cdf0e10cSrcweir         SetDicReadonly_Impl(xDic);
326cdf0e10cSrcweir         sal_Bool bEnable = !IsDicReadonly_Impl();
327cdf0e10cSrcweir         aNewReplacePB   .Enable( sal_False );
328cdf0e10cSrcweir         aDeletePB       .Enable( sal_False );
329cdf0e10cSrcweir         aLangFT.Enable( bEnable );
330cdf0e10cSrcweir         aLangLB.Enable( bEnable );
331cdf0e10cSrcweir         ShowWords_Impl( nPos );
332cdf0e10cSrcweir 
333cdf0e10cSrcweir     }
334cdf0e10cSrcweir     else
335cdf0e10cSrcweir     {
336cdf0e10cSrcweir         aNewReplacePB.Disable();
337cdf0e10cSrcweir         aDeletePB    .Disable();
338cdf0e10cSrcweir     }
339cdf0e10cSrcweir     FreeResource();
340cdf0e10cSrcweir }
341cdf0e10cSrcweir 
342cdf0e10cSrcweir // -----------------------------------------------------------------------
343cdf0e10cSrcweir 
~SvxEditDictionaryDialog()344cdf0e10cSrcweir SvxEditDictionaryDialog::~SvxEditDictionaryDialog()
345cdf0e10cSrcweir {
346cdf0e10cSrcweir }
347cdf0e10cSrcweir 
348cdf0e10cSrcweir // -----------------------------------------------------------------------
349cdf0e10cSrcweir 
Paint(const Rectangle & rRect)350cdf0e10cSrcweir void SvxEditDictionaryDialog::Paint( const Rectangle& rRect )
351cdf0e10cSrcweir {
352cdf0e10cSrcweir     ModalDialog::Paint(rRect );
353cdf0e10cSrcweir 
354cdf0e10cSrcweir     Rectangle aRect(aEditDictsBox.GetPosPixel(),aEditDictsBox.GetSizePixel());
355cdf0e10cSrcweir 
356cdf0e10cSrcweir     sal_uInt16 nStyle=BUTTON_DRAW_NOFILL;
357cdf0e10cSrcweir     aDecoView.DrawButton( aRect, nStyle);
358cdf0e10cSrcweir }
359cdf0e10cSrcweir 
360cdf0e10cSrcweir // -----------------------------------------------------------------------
361cdf0e10cSrcweir 
SetDicReadonly_Impl(Reference<XDictionary> & xDic)362cdf0e10cSrcweir void SvxEditDictionaryDialog::SetDicReadonly_Impl(
363cdf0e10cSrcweir             Reference< XDictionary >  &xDic )
364cdf0e10cSrcweir {
365cdf0e10cSrcweir     // enable or disable new and delete button according to file attributes
366cdf0e10cSrcweir     bDicIsReadonly = sal_True;
367cdf0e10cSrcweir     if (xDic.is())
368cdf0e10cSrcweir     {
369cdf0e10cSrcweir         Reference< frame::XStorable >  xStor( xDic, UNO_QUERY );
370cdf0e10cSrcweir         if (   !xStor.is()              // non persistent dictionary
371cdf0e10cSrcweir             || !xStor->hasLocation()    // not yet persistent
372cdf0e10cSrcweir             || !xStor->isReadonly() )
373cdf0e10cSrcweir         {
374cdf0e10cSrcweir             bDicIsReadonly = sal_False;
375cdf0e10cSrcweir         }
376cdf0e10cSrcweir     }
377cdf0e10cSrcweir }
378cdf0e10cSrcweir 
379cdf0e10cSrcweir // -----------------------------------------------------------------------
380cdf0e10cSrcweir 
SetLanguage_Impl(util::Language nLanguage)381cdf0e10cSrcweir void SvxEditDictionaryDialog::SetLanguage_Impl( util::Language nLanguage )
382cdf0e10cSrcweir {
383cdf0e10cSrcweir     // select language
384cdf0e10cSrcweir     aLangLB.SelectLanguage( nLanguage );
385cdf0e10cSrcweir }
386cdf0e10cSrcweir 
GetLBInsertPos(const String & rDicWord)387cdf0e10cSrcweir sal_uInt16 SvxEditDictionaryDialog::GetLBInsertPos(const String &rDicWord)
388cdf0e10cSrcweir {
389cdf0e10cSrcweir     sal_uInt16 nPos = USHRT_MAX;
390cdf0e10cSrcweir 
391cdf0e10cSrcweir     IntlWrapper aIntlWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() );
392cdf0e10cSrcweir     const CollatorWrapper* pCollator = aIntlWrapper.getCollator();
393cdf0e10cSrcweir     sal_uInt16 j;
394cdf0e10cSrcweir     for( j = 0; j < aWordsLB.GetEntryCount(); j++ )
395cdf0e10cSrcweir     {
396cdf0e10cSrcweir         SvLBoxEntry* pEntry = aWordsLB.GetEntry(j);
397cdf0e10cSrcweir         DBG_ASSERT( pEntry, "NULL pointer");
398cdf0e10cSrcweir         String aNormEntry( getNormDicEntry_Impl( rDicWord ) );
399cdf0e10cSrcweir         StringCompare eCmpRes = (StringCompare)pCollator->
400cdf0e10cSrcweir             compareString( aNormEntry, getNormDicEntry_Impl( aWordsLB.GetEntryText(pEntry, 0) ) );
401cdf0e10cSrcweir         if( COMPARE_LESS == eCmpRes )
402cdf0e10cSrcweir             break;
403cdf0e10cSrcweir     }
404cdf0e10cSrcweir     if (j < aWordsLB.GetEntryCount())   // entry found?
405cdf0e10cSrcweir         nPos = j;
406cdf0e10cSrcweir 
407cdf0e10cSrcweir     return nPos;
408cdf0e10cSrcweir }
409cdf0e10cSrcweir 
RemoveDictEntry(SvLBoxEntry * pEntry)410cdf0e10cSrcweir void SvxEditDictionaryDialog::RemoveDictEntry(SvLBoxEntry* pEntry)
411cdf0e10cSrcweir {
412cdf0e10cSrcweir     sal_uInt16 nLBPos = aAllDictsLB.GetSelectEntryPos();
413cdf0e10cSrcweir 
414cdf0e10cSrcweir     if ( pEntry != NULL && nLBPos != LISTBOX_ENTRY_NOTFOUND )
415cdf0e10cSrcweir     {
416cdf0e10cSrcweir         String sTmpShort(aWordsLB.GetEntryText(pEntry, 0));
417cdf0e10cSrcweir 
418cdf0e10cSrcweir         Reference< XDictionary >  xDic = aDics.getConstArray()[ nLBPos ];
419cdf0e10cSrcweir         if (xDic->remove( sTmpShort ))  // sal_True on success
420cdf0e10cSrcweir         {
421cdf0e10cSrcweir             aWordsLB.GetModel()->Remove(pEntry);
422cdf0e10cSrcweir         }
423cdf0e10cSrcweir     }
424cdf0e10cSrcweir }
425cdf0e10cSrcweir 
426cdf0e10cSrcweir // -----------------------------------------------------------------------
427cdf0e10cSrcweir 
IMPL_LINK(SvxEditDictionaryDialog,SelectBookHdl_Impl,ListBox *,EMPTYARG)428cdf0e10cSrcweir IMPL_LINK( SvxEditDictionaryDialog, SelectBookHdl_Impl, ListBox *, EMPTYARG )
429cdf0e10cSrcweir {
430cdf0e10cSrcweir     sal_uInt16 nPos = aAllDictsLB.GetSelectEntryPos();
431cdf0e10cSrcweir 
432cdf0e10cSrcweir     if ( nPos != LISTBOX_ENTRY_NOTFOUND )
433cdf0e10cSrcweir     {
434cdf0e10cSrcweir         aNewReplacePB.Enable( sal_False );
435cdf0e10cSrcweir         aDeletePB    .Enable( sal_False );
436cdf0e10cSrcweir         // Dictionary anzeigen
437cdf0e10cSrcweir         ShowWords_Impl( nPos );
438cdf0e10cSrcweir         // enable or disable new and delete button according to file attributes
439cdf0e10cSrcweir         Reference< XDictionary >  xDic( aDics.getConstArray()[ nPos ], UNO_QUERY );
440cdf0e10cSrcweir         if (xDic.is())
441cdf0e10cSrcweir             SetLanguage_Impl( SvxLocaleToLanguage( xDic->getLocale() ) );
442cdf0e10cSrcweir 
443cdf0e10cSrcweir         SetDicReadonly_Impl(xDic);
444cdf0e10cSrcweir         sal_Bool bEnable = !IsDicReadonly_Impl();
445cdf0e10cSrcweir         aLangFT.Enable( bEnable );
446cdf0e10cSrcweir         aLangLB.Enable( bEnable );
447cdf0e10cSrcweir     }
448cdf0e10cSrcweir     return 0;
449cdf0e10cSrcweir }
450cdf0e10cSrcweir 
451cdf0e10cSrcweir // -----------------------------------------------------------------------
452cdf0e10cSrcweir 
IMPL_LINK(SvxEditDictionaryDialog,SelectLangHdl_Impl,ListBox *,EMPTYARG)453cdf0e10cSrcweir IMPL_LINK( SvxEditDictionaryDialog, SelectLangHdl_Impl, ListBox *, EMPTYARG )
454cdf0e10cSrcweir {
455cdf0e10cSrcweir     sal_uInt16 nDicPos = aAllDictsLB.GetSelectEntryPos();
456cdf0e10cSrcweir     sal_uInt16 nLang = aLangLB.GetSelectLanguage();
457cdf0e10cSrcweir     Reference< XDictionary >  xDic( aDics.getConstArray()[ nDicPos ], UNO_QUERY );
458cdf0e10cSrcweir     sal_Int16 nOldLang = SvxLocaleToLanguage( xDic->getLocale() );
459cdf0e10cSrcweir 
460cdf0e10cSrcweir     if ( nLang != nOldLang )
461cdf0e10cSrcweir     {
462cdf0e10cSrcweir         QueryBox aBox( this, CUI_RES( RID_SFXQB_SET_LANGUAGE ) );
463cdf0e10cSrcweir         String sTxt( aBox.GetMessText() );
464cdf0e10cSrcweir         sTxt.SearchAndReplaceAscii( "%1", aAllDictsLB.GetSelectEntry() );
465cdf0e10cSrcweir         aBox.SetMessText( sTxt );
466cdf0e10cSrcweir 
467cdf0e10cSrcweir         if ( aBox.Execute() == RET_YES )
468cdf0e10cSrcweir         {
469cdf0e10cSrcweir             xDic->setLocale( SvxCreateLocale( nLang ) );
470cdf0e10cSrcweir             sal_Bool bNegativ = xDic->getDictionaryType() == DictionaryType_NEGATIVE;
471cdf0e10cSrcweir 
472cdf0e10cSrcweir             const String sName(
473cdf0e10cSrcweir                 ::GetDicInfoStr( xDic->getName(),
474cdf0e10cSrcweir                                  SvxLocaleToLanguage( xDic->getLocale() ),
475cdf0e10cSrcweir                                  bNegativ ) );
476cdf0e10cSrcweir             aAllDictsLB.RemoveEntry( nDicPos );
477cdf0e10cSrcweir             aAllDictsLB.InsertEntry( sName, nDicPos );
478cdf0e10cSrcweir             aAllDictsLB.SelectEntryPos( nDicPos );
479cdf0e10cSrcweir         }
480cdf0e10cSrcweir         else
481cdf0e10cSrcweir             SetLanguage_Impl( nOldLang );
482cdf0e10cSrcweir     }
483cdf0e10cSrcweir     return 1;
484cdf0e10cSrcweir }
485cdf0e10cSrcweir 
486cdf0e10cSrcweir // -----------------------------------------------------------------------
487cdf0e10cSrcweir 
ShowWords_Impl(sal_uInt16 nId)488cdf0e10cSrcweir void SvxEditDictionaryDialog::ShowWords_Impl( sal_uInt16 nId )
489cdf0e10cSrcweir {
490cdf0e10cSrcweir     Reference< XDictionary >  xDic = aDics.getConstArray()[ nId ];
491cdf0e10cSrcweir 
492cdf0e10cSrcweir     nOld = nId;
493cdf0e10cSrcweir     EnterWait();
494cdf0e10cSrcweir 
495cdf0e10cSrcweir     String aStr;
496cdf0e10cSrcweir 
497cdf0e10cSrcweir     aWordED.SetText(aStr);
498cdf0e10cSrcweir     aReplaceED.SetText(aStr);
499cdf0e10cSrcweir 
500cdf0e10cSrcweir     if(xDic->getDictionaryType() != DictionaryType_POSITIVE)
501cdf0e10cSrcweir     {
502cdf0e10cSrcweir         nStaticTabs[0]=2;
503cdf0e10cSrcweir 
504cdf0e10cSrcweir         // make controls for replacement text active
505cdf0e10cSrcweir         if(!aReplaceFT.IsVisible())
506cdf0e10cSrcweir         {
507cdf0e10cSrcweir             Size aSize=aWordED.GetSizePixel();
508cdf0e10cSrcweir             aSize.Width()=nWidth;
509cdf0e10cSrcweir             aWordED.SetSizePixel(aSize);
510cdf0e10cSrcweir             aReplaceFT.Show();
511cdf0e10cSrcweir             aReplaceED.Show();
512cdf0e10cSrcweir         }
513cdf0e10cSrcweir     }
514cdf0e10cSrcweir     else
515cdf0e10cSrcweir     {
516cdf0e10cSrcweir         nStaticTabs[0]=1;
517cdf0e10cSrcweir 
518cdf0e10cSrcweir         // deactivate controls for replacement text
519cdf0e10cSrcweir         if(aReplaceFT.IsVisible())
520cdf0e10cSrcweir         {
521cdf0e10cSrcweir             Size aSize=aWordED.GetSizePixel();
522cdf0e10cSrcweir             aSize.Width()=aWordsLB.GetSizePixel().Width();
523cdf0e10cSrcweir             aWordED.SetSizePixel(aSize);
524cdf0e10cSrcweir             aReplaceFT.Hide();
525cdf0e10cSrcweir             aReplaceED.Hide();
526cdf0e10cSrcweir         }
527cdf0e10cSrcweir 
528cdf0e10cSrcweir     }
529cdf0e10cSrcweir 
530cdf0e10cSrcweir     aWordsLB.SetTabs(nStaticTabs);
531cdf0e10cSrcweir     aWordsLB.Clear();
532cdf0e10cSrcweir 
533cdf0e10cSrcweir     Sequence< Reference< XDictionaryEntry >  > aEntries( xDic->getEntries() );
534cdf0e10cSrcweir     const Reference< XDictionaryEntry >  *pEntry = aEntries.getConstArray();
535cdf0e10cSrcweir     sal_Int32 nCount = aEntries.getLength();
536cdf0e10cSrcweir 
537cdf0e10cSrcweir     for (sal_Int32 i = 0;  i < nCount;  i++)
538cdf0e10cSrcweir     {
539cdf0e10cSrcweir         aStr = String(pEntry[i]->getDictionaryWord());
540cdf0e10cSrcweir         sal_uInt16 nPos = GetLBInsertPos( aStr );
541cdf0e10cSrcweir         if(pEntry[i]->isNegative())
542cdf0e10cSrcweir         {
543cdf0e10cSrcweir             aStr += '\t';
544cdf0e10cSrcweir             aStr += String(pEntry[i]->getReplacementText());
545cdf0e10cSrcweir         }
546cdf0e10cSrcweir         aWordsLB.InsertEntry(aStr, 0, sal_False, nPos == USHRT_MAX ?  LIST_APPEND : nPos);
547cdf0e10cSrcweir     }
548cdf0e10cSrcweir 
549cdf0e10cSrcweir     if (aWordsLB.GetEntryCount())
550cdf0e10cSrcweir     {
551cdf0e10cSrcweir         aWordED   .SetText( aWordsLB.GetEntryText(0LU, 0) );
552cdf0e10cSrcweir         aReplaceED.SetText( aWordsLB.GetEntryText(0LU, 1) );
553cdf0e10cSrcweir     }
554cdf0e10cSrcweir 
555cdf0e10cSrcweir     LeaveWait();
556cdf0e10cSrcweir }
557cdf0e10cSrcweir 
558cdf0e10cSrcweir // -----------------------------------------------------------------------
559cdf0e10cSrcweir 
IMPL_LINK(SvxEditDictionaryDialog,SelectHdl,SvTabListBox *,pBox)560cdf0e10cSrcweir IMPL_LINK(SvxEditDictionaryDialog, SelectHdl, SvTabListBox*, pBox)
561cdf0e10cSrcweir {
562cdf0e10cSrcweir     if(!bDoNothing)
563cdf0e10cSrcweir     {
564cdf0e10cSrcweir         if(!bFirstSelect)
565cdf0e10cSrcweir         {
566cdf0e10cSrcweir             SvLBoxEntry* pEntry = pBox->FirstSelected();
567cdf0e10cSrcweir             String sTmpShort(pBox->GetEntryText(pEntry, 0));
568cdf0e10cSrcweir             // wird der Text ueber den ModifyHdl gesetzt, dann steht der Cursor
569cdf0e10cSrcweir             //sonst immer am Wortanfang, obwohl man gerade hier editiert
570cdf0e10cSrcweir             if(aWordED.GetText() != sTmpShort)
571cdf0e10cSrcweir                 aWordED.SetText(sTmpShort);
572cdf0e10cSrcweir             aReplaceED.SetText(pBox->GetEntryText(pEntry, 1));
573cdf0e10cSrcweir         }
574cdf0e10cSrcweir         else
575cdf0e10cSrcweir             bFirstSelect = sal_False;
576cdf0e10cSrcweir 
577cdf0e10cSrcweir         // entries in the list box should exactly correspond to those from the
578cdf0e10cSrcweir         // dictionary. Thus:
579cdf0e10cSrcweir         aNewReplacePB.Enable(sal_False);
580cdf0e10cSrcweir         aDeletePB    .Enable( sal_True && !IsDicReadonly_Impl() );
581cdf0e10cSrcweir     }
582cdf0e10cSrcweir     return 0;
583cdf0e10cSrcweir };
584cdf0e10cSrcweir 
585cdf0e10cSrcweir // -----------------------------------------------------------------------
586cdf0e10cSrcweir 
IMPL_LINK(SvxEditDictionaryDialog,NewDelHdl,PushButton *,pBtn)587cdf0e10cSrcweir IMPL_LINK(SvxEditDictionaryDialog, NewDelHdl, PushButton*, pBtn)
588cdf0e10cSrcweir {
589cdf0e10cSrcweir     SvLBoxEntry* pEntry = aWordsLB.FirstSelected();
590cdf0e10cSrcweir 
591cdf0e10cSrcweir     if(pBtn == &aDeletePB)
592cdf0e10cSrcweir     {
593cdf0e10cSrcweir         DBG_ASSERT(pEntry, "keine Eintrag selektiert");
594cdf0e10cSrcweir         String aStr;
595cdf0e10cSrcweir 
596cdf0e10cSrcweir         aWordED.SetText(aStr);
597cdf0e10cSrcweir         aReplaceED.SetText(aStr);
598cdf0e10cSrcweir         aDeletePB.Disable();
599cdf0e10cSrcweir 
600cdf0e10cSrcweir         RemoveDictEntry(pEntry);    // remove entry from dic and list-box
601cdf0e10cSrcweir     }
602cdf0e10cSrcweir     if(pBtn == &aNewReplacePB || aNewReplacePB.IsEnabled())
603cdf0e10cSrcweir     {
604cdf0e10cSrcweir         SvLBoxEntry* _pEntry = aWordsLB.FirstSelected();
605cdf0e10cSrcweir         XubString aNewWord(aWordED.GetText());
606cdf0e10cSrcweir         String sEntry(aNewWord);
607cdf0e10cSrcweir         XubString aReplaceStr(aReplaceED.GetText());
608cdf0e10cSrcweir 
609cdf0e10cSrcweir         sal_Int16 nAddRes = DIC_ERR_UNKNOWN;
610cdf0e10cSrcweir         sal_uInt16 nPos = aAllDictsLB.GetSelectEntryPos();
611cdf0e10cSrcweir         if ( nPos != LISTBOX_ENTRY_NOTFOUND && aNewWord.Len() > 0)
612cdf0e10cSrcweir         {
613cdf0e10cSrcweir             DBG_ASSERT(nPos < aDics.getLength(), "invalid dictionary index");
614cdf0e10cSrcweir             Reference< XDictionary >  xDic( aDics.getConstArray()[ nPos ], UNO_QUERY );
615cdf0e10cSrcweir             if (xDic.is())
616cdf0e10cSrcweir             {
617cdf0e10cSrcweir                 // make changes in dic
618cdf0e10cSrcweir 
619cdf0e10cSrcweir                 //! ...IsVisible should reflect wether the dictionary is a negativ
620cdf0e10cSrcweir                 //! or not (hopefully...)
621cdf0e10cSrcweir                 sal_Bool bIsNegEntry = aReplaceFT.IsVisible();
622cdf0e10cSrcweir                 ::rtl::OUString aRplcText;
623cdf0e10cSrcweir                 if(bIsNegEntry)
624cdf0e10cSrcweir                     aRplcText = aReplaceStr;
625cdf0e10cSrcweir 
626cdf0e10cSrcweir                 if (_pEntry) // entry selected in aWordsLB ie action = modify entry
627cdf0e10cSrcweir                     xDic->remove( aWordsLB.GetEntryText( _pEntry, 0 ) );
628cdf0e10cSrcweir                 // if remove has failed the following add should fail too
629cdf0e10cSrcweir                 // and thus a warning message should be triggered...
630cdf0e10cSrcweir 
631cdf0e10cSrcweir                 Reference<XDictionary> aXDictionary(xDic, UNO_QUERY);
632cdf0e10cSrcweir                 nAddRes = linguistic::AddEntryToDic( aXDictionary,
633cdf0e10cSrcweir                             aNewWord, bIsNegEntry,
634cdf0e10cSrcweir                             aRplcText, SvxLocaleToLanguage( xDic->getLocale() ), sal_False );
635cdf0e10cSrcweir             }
636cdf0e10cSrcweir         }
637cdf0e10cSrcweir         if (DIC_ERR_NONE != nAddRes)
638cdf0e10cSrcweir             SvxDicError( this, nAddRes );
639cdf0e10cSrcweir 
640cdf0e10cSrcweir         if(DIC_ERR_NONE == nAddRes && sEntry.Len())
641cdf0e10cSrcweir         {
642cdf0e10cSrcweir             // insert new entry in list-box etc...
643cdf0e10cSrcweir 
644cdf0e10cSrcweir             aWordsLB.SetUpdateMode(sal_False);
645cdf0e10cSrcweir             sal_uInt16 _nPos = USHRT_MAX;
646cdf0e10cSrcweir 
647cdf0e10cSrcweir             if(aReplaceFT.IsVisible())
648cdf0e10cSrcweir             {
649cdf0e10cSrcweir                 sEntry += '\t';
650cdf0e10cSrcweir                 sEntry += aReplaceStr;
651cdf0e10cSrcweir             }
652cdf0e10cSrcweir 
653cdf0e10cSrcweir             SvLBoxEntry* pNewEntry = NULL;
654cdf0e10cSrcweir             if(_pEntry) // entry selected in aWordsLB ie action = modify entry
655cdf0e10cSrcweir             {
656cdf0e10cSrcweir                 aWordsLB.SetEntryText( sEntry, _pEntry );
657cdf0e10cSrcweir                 pNewEntry = _pEntry;
658cdf0e10cSrcweir             }
659cdf0e10cSrcweir             else
660cdf0e10cSrcweir             {
661cdf0e10cSrcweir                 _nPos = GetLBInsertPos( aNewWord );
662cdf0e10cSrcweir                 SvLBoxEntry* pInsEntry = aWordsLB.InsertEntry(sEntry, 0, sal_False,
663cdf0e10cSrcweir                             _nPos == USHRT_MAX ? LIST_APPEND : (sal_uInt32)_nPos);
664cdf0e10cSrcweir                 pNewEntry = pInsEntry;
665cdf0e10cSrcweir             }
666cdf0e10cSrcweir 
667cdf0e10cSrcweir             aWordsLB.MakeVisible( pNewEntry );
668cdf0e10cSrcweir             aWordsLB.SetUpdateMode(sal_True);
669cdf0e10cSrcweir             // falls der Request aus dem ReplaceEdit kam, dann Focus in das ShortEdit setzen
670cdf0e10cSrcweir             if(aReplaceED.HasFocus())
671cdf0e10cSrcweir                 aWordED.GrabFocus();
672cdf0e10cSrcweir         }
673cdf0e10cSrcweir     }
674cdf0e10cSrcweir     else
675cdf0e10cSrcweir     {
676cdf0e10cSrcweir         // das kann nur ein Enter in einem der beiden Edit-Felder sein und das
677cdf0e10cSrcweir         // bedeutet EndDialog() - muss im KeyInput ausgewertet werden
678cdf0e10cSrcweir         return 0;
679cdf0e10cSrcweir     }
680cdf0e10cSrcweir     ModifyHdl(&aWordED);
681cdf0e10cSrcweir     return 1;
682cdf0e10cSrcweir }
683cdf0e10cSrcweir 
684cdf0e10cSrcweir // -----------------------------------------------------------------------
685cdf0e10cSrcweir 
IMPL_LINK(SvxEditDictionaryDialog,ModifyHdl,Edit *,pEdt)686cdf0e10cSrcweir IMPL_LINK(SvxEditDictionaryDialog, ModifyHdl, Edit*, pEdt)
687cdf0e10cSrcweir {
688cdf0e10cSrcweir     SvLBoxEntry* pFirstSel = aWordsLB.FirstSelected();
689cdf0e10cSrcweir     String rEntry = pEdt->GetText();
690cdf0e10cSrcweir 
691cdf0e10cSrcweir     xub_StrLen nWordLen=rEntry.Len();
692cdf0e10cSrcweir     const String& rRepString = aReplaceED.GetText();
693cdf0e10cSrcweir 
694cdf0e10cSrcweir     sal_Bool bEnableNewReplace  = sal_False;
695cdf0e10cSrcweir     sal_Bool bEnableDelete      = sal_False;
696cdf0e10cSrcweir     String aNewReplaceText  = sNew;
697cdf0e10cSrcweir 
698cdf0e10cSrcweir     if(pEdt == &aWordED)
699cdf0e10cSrcweir     {
700cdf0e10cSrcweir         if(nWordLen>0)
701cdf0e10cSrcweir         {
702cdf0e10cSrcweir             sal_Bool bFound = sal_False;
703cdf0e10cSrcweir             sal_Bool bTmpSelEntry=sal_False;
704cdf0e10cSrcweir             CDE_RESULT eCmpRes = CDE_DIFFERENT;
705cdf0e10cSrcweir 
706cdf0e10cSrcweir             for(sal_uInt16 i = 0; i < aWordsLB.GetEntryCount(); i++)
707cdf0e10cSrcweir             {
708cdf0e10cSrcweir                 SvLBoxEntry*  pEntry = aWordsLB.GetEntry( i );
709cdf0e10cSrcweir                 String aTestStr( aWordsLB.GetEntryText(pEntry, 0) );
710cdf0e10cSrcweir                 eCmpRes = cmpDicEntry_Impl( rEntry, aTestStr );
711cdf0e10cSrcweir                 if(CDE_DIFFERENT != eCmpRes)
712cdf0e10cSrcweir                 {
713cdf0e10cSrcweir                     if(rRepString.Len())
714cdf0e10cSrcweir                         bFirstSelect = sal_True;
715cdf0e10cSrcweir                     bDoNothing=sal_True;
716cdf0e10cSrcweir                     aWordsLB.SetCurEntry(pEntry);
717cdf0e10cSrcweir                     bDoNothing=sal_False;
718cdf0e10cSrcweir                     pFirstSel = pEntry;
719cdf0e10cSrcweir                     aReplaceED.SetText(aWordsLB.GetEntryText(pEntry, 1));
720cdf0e10cSrcweir 
721cdf0e10cSrcweir                     if (CDE_SIMILAR == eCmpRes)
722cdf0e10cSrcweir                     {
723cdf0e10cSrcweir                         aNewReplaceText = sModify;
724cdf0e10cSrcweir                         bEnableNewReplace = sal_True;
725cdf0e10cSrcweir                     }
726cdf0e10cSrcweir                     bFound= sal_True;
727cdf0e10cSrcweir                     break;
728cdf0e10cSrcweir                 }
729cdf0e10cSrcweir                 else if(getNormDicEntry_Impl(aTestStr).Search(
730cdf0e10cSrcweir                             getNormDicEntry_Impl( rEntry ) ) == 0
731cdf0e10cSrcweir                         && !bTmpSelEntry)
732cdf0e10cSrcweir                 {
733cdf0e10cSrcweir                     bDoNothing=sal_True;
734cdf0e10cSrcweir                     aWordsLB.MakeVisible(pEntry);
735cdf0e10cSrcweir                     bDoNothing=sal_False;
736cdf0e10cSrcweir                     bTmpSelEntry=sal_True;
737cdf0e10cSrcweir 
738cdf0e10cSrcweir                     aNewReplaceText = sNew;
739cdf0e10cSrcweir                     bEnableNewReplace = sal_True;
740cdf0e10cSrcweir                 }
741cdf0e10cSrcweir             }
742cdf0e10cSrcweir 
743cdf0e10cSrcweir             if(!bFound)
744cdf0e10cSrcweir             {
745cdf0e10cSrcweir                 aWordsLB.SelectAll(sal_False);
746cdf0e10cSrcweir                 pFirstSel = 0;
747cdf0e10cSrcweir 
748cdf0e10cSrcweir                 aNewReplaceText = sNew;
749cdf0e10cSrcweir                 bEnableNewReplace = sal_True;
750cdf0e10cSrcweir             }
751cdf0e10cSrcweir             bEnableDelete = CDE_DIFFERENT != eCmpRes;
752cdf0e10cSrcweir         }
753cdf0e10cSrcweir         else if(aWordsLB.GetEntryCount()>0)
754cdf0e10cSrcweir         {
755cdf0e10cSrcweir             SvLBoxEntry*  pEntry = aWordsLB.GetEntry( 0 );
756cdf0e10cSrcweir             bDoNothing=sal_True;
757cdf0e10cSrcweir             aWordsLB.MakeVisible(pEntry);
758cdf0e10cSrcweir             bDoNothing=sal_False;
759cdf0e10cSrcweir         }
760cdf0e10cSrcweir     }
761cdf0e10cSrcweir     else if(pEdt == &aReplaceED)
762cdf0e10cSrcweir     {
763cdf0e10cSrcweir         String aReplaceText;
764cdf0e10cSrcweir         String aWordText;
765cdf0e10cSrcweir         if (pFirstSel)  // a aWordsLB entry is selected
766cdf0e10cSrcweir         {
767cdf0e10cSrcweir             aWordText    = aWordsLB.GetEntryText( pFirstSel, 0 );
768cdf0e10cSrcweir             aReplaceText = aWordsLB.GetEntryText( pFirstSel, 1 );
769cdf0e10cSrcweir 
770cdf0e10cSrcweir             aNewReplaceText = sModify;
771cdf0e10cSrcweir             bEnableDelete = sal_True;
772cdf0e10cSrcweir         }
773cdf0e10cSrcweir         sal_Bool bIsChange =
774cdf0e10cSrcweir                 CDE_EQUAL != cmpDicEntry_Impl(aWordED.GetText(), aWordText)
775cdf0e10cSrcweir              || CDE_EQUAL != cmpDicEntry_Impl(aReplaceED.GetText(), aReplaceText);
776cdf0e10cSrcweir         if (aWordED.GetText().Len()  &&  bIsChange)
777cdf0e10cSrcweir             bEnableNewReplace = sal_True;
778cdf0e10cSrcweir     }
779cdf0e10cSrcweir 
780cdf0e10cSrcweir     aNewReplacePB.SetText( aNewReplaceText );
781cdf0e10cSrcweir     aNewReplacePB.Enable( bEnableNewReplace && !IsDicReadonly_Impl() );
782cdf0e10cSrcweir     aDeletePB    .Enable( bEnableDelete     && !IsDicReadonly_Impl() );
783cdf0e10cSrcweir 
784cdf0e10cSrcweir     return 0;
785cdf0e10cSrcweir }
786cdf0e10cSrcweir 
787cdf0e10cSrcweir //=========================================================
788cdf0e10cSrcweir //SvxDictEdit
789cdf0e10cSrcweir //=========================================================
KeyInput(const KeyEvent & rKEvt)790cdf0e10cSrcweir void SvxDictEdit::KeyInput( const KeyEvent& rKEvt )
791cdf0e10cSrcweir {
792cdf0e10cSrcweir     const KeyCode aKeyCode = rKEvt.GetKeyCode();
793cdf0e10cSrcweir     const sal_uInt16 nModifier = aKeyCode.GetModifier();
794cdf0e10cSrcweir     if( aKeyCode.GetCode() == KEY_RETURN )
795cdf0e10cSrcweir     {
796cdf0e10cSrcweir         //wird bei Enter nichts getan, dann doch die Basisklasse rufen
797cdf0e10cSrcweir         // um den Dialog zu schliessen
798cdf0e10cSrcweir         if(!nModifier && !aActionLink.Call(this))
799cdf0e10cSrcweir                  Edit::KeyInput(rKEvt);
800cdf0e10cSrcweir     }
801cdf0e10cSrcweir     else if(bSpaces || aKeyCode.GetCode() != KEY_SPACE)
802cdf0e10cSrcweir         Edit::KeyInput(rKEvt);
803cdf0e10cSrcweir }
804cdf0e10cSrcweir 
805cdf0e10cSrcweir 
806