12ee96f1cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
32ee96f1cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
42ee96f1cSAndrew Rist * or more contributor license agreements. See the NOTICE file
52ee96f1cSAndrew Rist * distributed with this work for additional information
62ee96f1cSAndrew Rist * regarding copyright ownership. The ASF licenses this file
72ee96f1cSAndrew Rist * to you under the Apache License, Version 2.0 (the
82ee96f1cSAndrew Rist * "License"); you may not use this file except in compliance
92ee96f1cSAndrew Rist * with the License. You may obtain a copy of the License at
102ee96f1cSAndrew Rist *
112ee96f1cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
122ee96f1cSAndrew Rist *
132ee96f1cSAndrew Rist * Unless required by applicable law or agreed to in writing,
142ee96f1cSAndrew Rist * software distributed under the License is distributed on an
152ee96f1cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
162ee96f1cSAndrew Rist * KIND, either express or implied. See the License for the
172ee96f1cSAndrew Rist * specific language governing permissions and limitations
182ee96f1cSAndrew Rist * under the License.
192ee96f1cSAndrew Rist *
202ee96f1cSAndrew Rist *************************************************************/
212ee96f1cSAndrew Rist
222ee96f1cSAndrew 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
619*940681c7SMatthias Seidel //! ...IsVisible should reflect whether 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