|  | /************************************************************** | 
|  | * | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements.  See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership.  The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License.  You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied.  See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | // MARKER(update_precomp.py): autogen include statement, do not remove | 
|  | #include "precompiled_cui.hxx" | 
|  |  | 
|  | // include --------------------------------------------------------------- | 
|  | #include <tools/shl.hxx> | 
|  | #include <editeng/unolingu.hxx> | 
|  | #include <svx/dlgutil.hxx> | 
|  | #include <sfx2/sfxuno.hxx> | 
|  | #include <svl/eitem.hxx> | 
|  | #include <com/sun/star/frame/XStorable.hpp> | 
|  | #include <comphelper/processfactory.hxx> | 
|  | #include <unotools/intlwrapper.hxx> | 
|  | #include <vcl/svapp.hxx> | 
|  | #include <vcl/msgbox.hxx> | 
|  | #include <svx/dialogs.hrc> | 
|  |  | 
|  | #define _SVX_OPTDICT_CXX | 
|  |  | 
|  | #include <linguistic/misc.hxx> | 
|  | #include <cuires.hrc> | 
|  | #include "optdict.hrc" | 
|  | #include "optdict.hxx" | 
|  | #include <dialmgr.hxx> | 
|  | #include <svx/svxerr.hxx> | 
|  |  | 
|  | using namespace ::com::sun::star; | 
|  | using namespace ::com::sun::star::uno; | 
|  | using namespace ::com::sun::star::linguistic2; | 
|  |  | 
|  | // static ---------------------------------------------------------------- | 
|  |  | 
|  | static const sal_uInt16 nNameLen    = 8; | 
|  | static const short  NOACTDICT   = -1; | 
|  |  | 
|  | static long nStaticTabs[]= | 
|  | { | 
|  | 2,10,71,120 | 
|  | }; | 
|  |  | 
|  | // static function ------------------------------------------------------- | 
|  |  | 
|  | static String getNormDicEntry_Impl( const String &rText ) | 
|  | { | 
|  | String aTmp( rText ); | 
|  | aTmp.EraseTrailingChars( '.' ); | 
|  | aTmp.EraseAllChars( '=' ); | 
|  | return aTmp; | 
|  | } | 
|  |  | 
|  |  | 
|  | // Compare Dictionary Entry  result | 
|  | enum CDE_RESULT { CDE_EQUAL, CDE_SIMILAR, CDE_DIFFERENT }; | 
|  |  | 
|  | static CDE_RESULT cmpDicEntry_Impl( const String &rText1, const String &rText2 ) | 
|  | { | 
|  | CDE_RESULT eRes = CDE_DIFFERENT; | 
|  |  | 
|  | if (rText1 == rText2) | 
|  | eRes = CDE_EQUAL; | 
|  | else | 
|  | {	// similar = equal up to trailing '.' and hyphenation positions | 
|  | // marked with '=' | 
|  | if (getNormDicEntry_Impl( rText1 ) == getNormDicEntry_Impl( rText2 )) | 
|  | eRes = CDE_SIMILAR; | 
|  | } | 
|  |  | 
|  | return eRes; | 
|  | } | 
|  |  | 
|  | // class SvxNewDictionaryDialog ------------------------------------------- | 
|  |  | 
|  | SvxNewDictionaryDialog::SvxNewDictionaryDialog( Window* pParent, | 
|  | Reference< XSpellChecker1 >  &xSpl ) : | 
|  |  | 
|  | ModalDialog( pParent, CUI_RES( RID_SFXDLG_NEWDICT ) ), | 
|  |  | 
|  | aNewDictBox		( this, CUI_RES( GB_NEWDICT ) ), | 
|  | aNameText		( this, CUI_RES( FT_DICTNAME ) ), | 
|  | aNameEdit		( this, CUI_RES( ED_DICTNAME ) ), | 
|  | aLanguageText	( this, CUI_RES( FT_DICTLANG ) ), | 
|  | aLanguageLB		( this, CUI_RES( LB_DICTLANG ) ), | 
|  | aExceptBtn		( this, CUI_RES( BTN_EXCEPT ) ), | 
|  | aOKBtn			( this, CUI_RES( BTN_NEWDICT_OK ) ), | 
|  | aCancelBtn		( this, CUI_RES( BTN_NEWDICT_ESC ) ), | 
|  | aHelpBtn		( this, CUI_RES( BTN_NEWDICT_HLP ) ), | 
|  | xSpell( xSpl ) | 
|  | { | 
|  | // Handler installieren | 
|  | aNameEdit.SetModifyHdl( | 
|  | LINK( this, SvxNewDictionaryDialog, ModifyHdl_Impl ) ); | 
|  | aOKBtn.SetClickHdl( LINK( this, SvxNewDictionaryDialog, OKHdl_Impl ) ); | 
|  |  | 
|  | // Sprachen anzeigen | 
|  | aLanguageLB.SetLanguageList( LANG_LIST_ALL, sal_True, sal_True ); | 
|  | aLanguageLB.SelectEntryPos(0); | 
|  |  | 
|  | aNameText.SetAccessibleRelationMemberOf( &aNewDictBox ); | 
|  | aNameEdit.SetAccessibleRelationMemberOf( &aNewDictBox ); | 
|  | aLanguageText.SetAccessibleRelationMemberOf( &aNewDictBox ); | 
|  | aLanguageLB.SetAccessibleRelationMemberOf( &aNewDictBox ); | 
|  |  | 
|  | FreeResource(); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | IMPL_LINK( SvxNewDictionaryDialog, OKHdl_Impl, Button *, EMPTYARG ) | 
|  | { | 
|  | String sDict = aNameEdit.GetText(); | 
|  | sDict.EraseTrailingChars(); | 
|  | // add extension for personal dictionaries | 
|  | sDict.AppendAscii(".dic"); | 
|  |  | 
|  | Reference< XDictionaryList >  xDicList( SvxGetDictionaryList() ); | 
|  |  | 
|  | Sequence< Reference< XDictionary >  > aDics; | 
|  | if (xDicList.is()) | 
|  | aDics = xDicList->getDictionaries(); | 
|  | const Reference< XDictionary >  *pDic = aDics.getConstArray(); | 
|  | sal_Int32 nCount = (sal_uInt16) aDics.getLength(); | 
|  |  | 
|  | sal_Bool bFound = sal_False; | 
|  | sal_uInt16 i; | 
|  | for (i = 0; !bFound && i < nCount; ++i ) | 
|  | if ( sDict.EqualsIgnoreCaseAscii( String(pDic[i]->getName()) )) | 
|  | bFound = sal_True; | 
|  |  | 
|  | if ( bFound ) | 
|  | { | 
|  | // Doppelte Namen? | 
|  | InfoBox( this, CUI_RESSTR( RID_SVXSTR_OPT_DOUBLE_DICTS ) ).Execute(); | 
|  | aNameEdit.GrabFocus(); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | // Erzeugen und hinzufuegen | 
|  | sal_uInt16 nLang = aLanguageLB.GetSelectLanguage(); | 
|  | try | 
|  | { | 
|  | // create new dictionary | 
|  | DictionaryType eType = aExceptBtn.IsChecked() ? | 
|  | DictionaryType_NEGATIVE : DictionaryType_POSITIVE; | 
|  | if (xDicList.is()) | 
|  | { | 
|  | lang::Locale aLocale( SvxCreateLocale(nLang) ); | 
|  | String aURL( linguistic::GetWritableDictionaryURL( sDict ) ); | 
|  | xNewDic = Reference< XDictionary > ( | 
|  | xDicList->createDictionary( sDict, aLocale, eType, aURL ) , UNO_QUERY ); | 
|  | xNewDic->setActive( sal_True ); | 
|  | } | 
|  | DBG_ASSERT(xNewDic.is(), "NULL pointer"); | 
|  | } | 
|  | catch(...) | 
|  | { | 
|  | xNewDic = NULL; | 
|  |  | 
|  | // Fehler: konnte neues W"orterbuch nicht anlegen | 
|  | SfxErrorContext aContext( ERRCTX_SVX_LINGU_DICTIONARY, String(), | 
|  | this, RID_SVXERRCTX, &CUI_MGR() ); | 
|  | ErrorHandler::HandleError( *new StringErrorInfo( | 
|  | ERRCODE_SVX_LINGU_DICT_NOTWRITEABLE, sDict ) ); | 
|  |  | 
|  | EndDialog( RET_CANCEL ); | 
|  | } | 
|  |  | 
|  | if (xDicList.is() && xNewDic.is()) | 
|  | { | 
|  | xDicList->addDictionary( Reference< XDictionary > ( xNewDic, UNO_QUERY ) ); | 
|  |  | 
|  | // refresh list of dictionaries | 
|  | //! dictionaries may have been added/removed elsewhere too. | 
|  | aDics = xDicList->getDictionaries(); | 
|  | } | 
|  | pDic = aDics.getConstArray(); | 
|  | nCount = (sal_uInt16) aDics.getLength(); | 
|  |  | 
|  |  | 
|  | EndDialog( RET_OK ); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | IMPL_LINK_INLINE_START( SvxNewDictionaryDialog, ModifyHdl_Impl, Edit *, EMPTYARG ) | 
|  | { | 
|  | if ( aNameEdit.GetText().Len() ) | 
|  | aOKBtn.Enable(); | 
|  | else | 
|  | aOKBtn.Disable(); | 
|  | return 0; | 
|  | } | 
|  | IMPL_LINK_INLINE_END( SvxNewDictionaryDialog, ModifyHdl_Impl, Edit *, EMPTYARG ) | 
|  |  | 
|  | //========================================================================== | 
|  | // | 
|  | // class SvxEditDictionaryDialog ------------------------------------------- | 
|  | // | 
|  | //========================================================================== | 
|  |  | 
|  | SvxEditDictionaryDialog::SvxEditDictionaryDialog( | 
|  | Window* pParent, | 
|  | const String& rName, | 
|  | Reference< XSpellChecker1 >  &xSpl ) : | 
|  |  | 
|  | ModalDialog( pParent, CUI_RES( RID_SFXDLG_EDITDICT ) ), | 
|  |  | 
|  | aBookFT			( this, CUI_RES( FT_BOOK ) ), | 
|  | aAllDictsLB		( this, CUI_RES( LB_ALLDICTS ) ), | 
|  | aLangFT			( this, CUI_RES( FT_DICTLANG ) ), | 
|  | aLangLB			( this, CUI_RES( LB_DICTLANG ) ), | 
|  |  | 
|  | aWordFT			( this, CUI_RES( FT_WORD ) ), | 
|  | aWordED			( this, CUI_RES( ED_WORD ) ), | 
|  | aReplaceFT		( this, CUI_RES( FT_REPLACE ) ), | 
|  | aReplaceED		( this, CUI_RES( ED_REPLACE ) ), | 
|  | aWordsLB		( this, CUI_RES( TLB_REPLACE ) ), | 
|  | aNewReplacePB	( this, CUI_RES( PB_NEW_REPLACE ) ), | 
|  | aDeletePB		( this, CUI_RES( PB_DELETE_REPLACE ) ), | 
|  | aEditDictsBox	( this, CUI_RES( GB_EDITDICTS ) ), | 
|  | aHelpBtn		( this, CUI_RES( BTN_EDITHELP ) ), | 
|  | aCloseBtn		( this, CUI_RES( BTN_EDITCLOSE ) ), | 
|  | sModify			(CUI_RES(STR_MODIFY)), | 
|  | sNew			(aNewReplacePB.GetText()), | 
|  | aDecoView		( this), | 
|  | xSpell          ( xSpl ), | 
|  | nOld            ( NOACTDICT ), | 
|  | bFirstSelect    (sal_True), | 
|  | bDoNothing      (sal_False) | 
|  |  | 
|  | { | 
|  | if (SvxGetDictionaryList().is()) | 
|  | aDics = SvxGetDictionaryList()->getDictionaries(); | 
|  |  | 
|  | aWordsLB.SetSelectHdl(LINK(this, SvxEditDictionaryDialog, SelectHdl)); | 
|  | aWordsLB.SetTabs(nStaticTabs); | 
|  |  | 
|  | //! we use an algorithm of our own to insert elements sorted | 
|  | aWordsLB.SetStyle(aWordsLB.GetStyle()|/*WB_SORT|*/WB_HSCROLL|WB_CLIPCHILDREN); | 
|  |  | 
|  |  | 
|  | nWidth=aWordED.GetSizePixel().Width(); | 
|  | // Handler installieren | 
|  | aNewReplacePB.SetClickHdl( | 
|  | LINK( this, SvxEditDictionaryDialog, NewDelHdl)); | 
|  | aDeletePB.SetClickHdl( | 
|  | LINK( this, SvxEditDictionaryDialog, NewDelHdl)); | 
|  |  | 
|  | aLangLB.SetSelectHdl( | 
|  | LINK( this, SvxEditDictionaryDialog, SelectLangHdl_Impl ) ); | 
|  | aAllDictsLB.SetSelectHdl( | 
|  | LINK( this, SvxEditDictionaryDialog, SelectBookHdl_Impl ) ); | 
|  |  | 
|  | aWordED.SetModifyHdl(LINK(this, SvxEditDictionaryDialog, ModifyHdl)); | 
|  | aReplaceED.SetModifyHdl(LINK(this, SvxEditDictionaryDialog, ModifyHdl)); | 
|  | aWordED.SetActionHdl(LINK(this, SvxEditDictionaryDialog, NewDelHdl)); | 
|  | aReplaceED.SetActionHdl(LINK(this, SvxEditDictionaryDialog, NewDelHdl)); | 
|  |  | 
|  | // Listbox mit allen verfuegbaren WB's fuellen | 
|  | const Reference< XDictionary >  *pDic = aDics.getConstArray(); | 
|  | sal_Int32 nCount = aDics.getLength(); | 
|  |  | 
|  | String aLookUpEntry; | 
|  | for ( sal_Int32 i = 0; i < nCount; ++i ) | 
|  | { | 
|  | Reference< XDictionary >  xDic( pDic[i], UNO_QUERY ); | 
|  | if (xDic.is()) | 
|  | { | 
|  | sal_Bool bNegative = xDic->getDictionaryType() == DictionaryType_NEGATIVE ? | 
|  | sal_True : sal_False; | 
|  | String aDicName( xDic->getName() ); | 
|  | const String aTxt( ::GetDicInfoStr( aDicName, SvxLocaleToLanguage( xDic->getLocale() ), | 
|  | bNegative ) ); | 
|  | aAllDictsLB.InsertEntry( aTxt ); | 
|  |  | 
|  | if (rName == aDicName) | 
|  | aLookUpEntry = aTxt; | 
|  | } | 
|  | } | 
|  |  | 
|  | aLangLB.SetLanguageList( LANG_LIST_ALL, sal_True, sal_True ); | 
|  |  | 
|  | aReplaceED.SetSpaces(sal_True); | 
|  | aWordED.SetSpaces(sal_True); | 
|  |  | 
|  | if ( nCount > 0 ) | 
|  | { | 
|  | aAllDictsLB.SelectEntry( aLookUpEntry ); | 
|  | sal_uInt16 nPos = aAllDictsLB.GetSelectEntryPos(); | 
|  |  | 
|  | if ( nPos == LISTBOX_ENTRY_NOTFOUND ) | 
|  | { | 
|  | nPos = 0; | 
|  | aAllDictsLB.SelectEntryPos( nPos ); | 
|  | } | 
|  | Reference< XDictionary >  xDic; | 
|  | if (nPos != LISTBOX_ENTRY_NOTFOUND) | 
|  | xDic = Reference< XDictionary > ( aDics.getConstArray()[ nPos ], UNO_QUERY ); | 
|  | if (xDic.is()) | 
|  | SetLanguage_Impl( SvxLocaleToLanguage( xDic->getLocale() ) ); | 
|  |  | 
|  | // check if dictionary is read-only | 
|  | SetDicReadonly_Impl(xDic); | 
|  | sal_Bool bEnable = !IsDicReadonly_Impl(); | 
|  | aNewReplacePB   .Enable( sal_False ); | 
|  | aDeletePB		.Enable( sal_False ); | 
|  | aLangFT.Enable( bEnable ); | 
|  | aLangLB.Enable( bEnable ); | 
|  | ShowWords_Impl( nPos ); | 
|  |  | 
|  | } | 
|  | else | 
|  | { | 
|  | aNewReplacePB.Disable(); | 
|  | aDeletePB	 .Disable(); | 
|  | } | 
|  | FreeResource(); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | SvxEditDictionaryDialog::~SvxEditDictionaryDialog() | 
|  | { | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void SvxEditDictionaryDialog::Paint( const Rectangle& rRect ) | 
|  | { | 
|  | ModalDialog::Paint(rRect ); | 
|  |  | 
|  | Rectangle aRect(aEditDictsBox.GetPosPixel(),aEditDictsBox.GetSizePixel()); | 
|  |  | 
|  | sal_uInt16 nStyle=BUTTON_DRAW_NOFILL; | 
|  | aDecoView.DrawButton( aRect, nStyle); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void SvxEditDictionaryDialog::SetDicReadonly_Impl( | 
|  | Reference< XDictionary >  &xDic ) | 
|  | { | 
|  | // enable or disable new and delete button according to file attributes | 
|  | bDicIsReadonly = sal_True; | 
|  | if (xDic.is()) | 
|  | { | 
|  | Reference< frame::XStorable >  xStor( xDic, UNO_QUERY ); | 
|  | if (   !xStor.is() 				// non persistent dictionary | 
|  | || !xStor->hasLocation()	// not yet persistent | 
|  | || !xStor->isReadonly() ) | 
|  | { | 
|  | bDicIsReadonly = sal_False; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void SvxEditDictionaryDialog::SetLanguage_Impl( util::Language nLanguage ) | 
|  | { | 
|  | // select language | 
|  | aLangLB.SelectLanguage( nLanguage ); | 
|  | } | 
|  |  | 
|  | sal_uInt16 SvxEditDictionaryDialog::GetLBInsertPos(const String &rDicWord) | 
|  | { | 
|  | sal_uInt16 nPos = USHRT_MAX; | 
|  |  | 
|  | IntlWrapper aIntlWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() ); | 
|  | const CollatorWrapper* pCollator = aIntlWrapper.getCollator(); | 
|  | sal_uInt16 j; | 
|  | for( j = 0; j < aWordsLB.GetEntryCount(); j++ ) | 
|  | { | 
|  | SvLBoxEntry* pEntry = aWordsLB.GetEntry(j); | 
|  | DBG_ASSERT( pEntry, "NULL pointer"); | 
|  | String aNormEntry( getNormDicEntry_Impl( rDicWord ) ); | 
|  | StringCompare eCmpRes = (StringCompare)pCollator-> | 
|  | compareString( aNormEntry, getNormDicEntry_Impl( aWordsLB.GetEntryText(pEntry, 0) ) ); | 
|  | if( COMPARE_LESS == eCmpRes ) | 
|  | break; | 
|  | } | 
|  | if (j < aWordsLB.GetEntryCount())	// entry found? | 
|  | nPos = j; | 
|  |  | 
|  | return nPos; | 
|  | } | 
|  |  | 
|  | void SvxEditDictionaryDialog::RemoveDictEntry(SvLBoxEntry* pEntry) | 
|  | { | 
|  | sal_uInt16 nLBPos = aAllDictsLB.GetSelectEntryPos(); | 
|  |  | 
|  | if ( pEntry != NULL && nLBPos != LISTBOX_ENTRY_NOTFOUND ) | 
|  | { | 
|  | String sTmpShort(aWordsLB.GetEntryText(pEntry, 0)); | 
|  |  | 
|  | Reference< XDictionary >  xDic = aDics.getConstArray()[ nLBPos ]; | 
|  | if (xDic->remove( sTmpShort ))	// sal_True on success | 
|  | { | 
|  | aWordsLB.GetModel()->Remove(pEntry); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | IMPL_LINK( SvxEditDictionaryDialog, SelectBookHdl_Impl, ListBox *, EMPTYARG ) | 
|  | { | 
|  | sal_uInt16 nPos = aAllDictsLB.GetSelectEntryPos(); | 
|  |  | 
|  | if ( nPos != LISTBOX_ENTRY_NOTFOUND ) | 
|  | { | 
|  | aNewReplacePB.Enable( sal_False ); | 
|  | aDeletePB	 .Enable( sal_False ); | 
|  | // Dictionary anzeigen | 
|  | ShowWords_Impl( nPos ); | 
|  | // enable or disable new and delete button according to file attributes | 
|  | Reference< XDictionary >  xDic( aDics.getConstArray()[ nPos ], UNO_QUERY ); | 
|  | if (xDic.is()) | 
|  | SetLanguage_Impl( SvxLocaleToLanguage( xDic->getLocale() ) ); | 
|  |  | 
|  | SetDicReadonly_Impl(xDic); | 
|  | sal_Bool bEnable = !IsDicReadonly_Impl(); | 
|  | aLangFT.Enable( bEnable ); | 
|  | aLangLB.Enable( bEnable ); | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | IMPL_LINK( SvxEditDictionaryDialog, SelectLangHdl_Impl, ListBox *, EMPTYARG ) | 
|  | { | 
|  | sal_uInt16 nDicPos = aAllDictsLB.GetSelectEntryPos(); | 
|  | sal_uInt16 nLang = aLangLB.GetSelectLanguage(); | 
|  | Reference< XDictionary >  xDic( aDics.getConstArray()[ nDicPos ], UNO_QUERY ); | 
|  | sal_Int16 nOldLang = SvxLocaleToLanguage( xDic->getLocale() ); | 
|  |  | 
|  | if ( nLang != nOldLang ) | 
|  | { | 
|  | QueryBox aBox( this, CUI_RES( RID_SFXQB_SET_LANGUAGE ) ); | 
|  | String sTxt( aBox.GetMessText() ); | 
|  | sTxt.SearchAndReplaceAscii( "%1", aAllDictsLB.GetSelectEntry() ); | 
|  | aBox.SetMessText( sTxt ); | 
|  |  | 
|  | if ( aBox.Execute() == RET_YES ) | 
|  | { | 
|  | xDic->setLocale( SvxCreateLocale( nLang ) ); | 
|  | sal_Bool bNegativ = xDic->getDictionaryType() == DictionaryType_NEGATIVE; | 
|  |  | 
|  | const String sName( | 
|  | ::GetDicInfoStr( xDic->getName(), | 
|  | SvxLocaleToLanguage( xDic->getLocale() ), | 
|  | bNegativ ) ); | 
|  | aAllDictsLB.RemoveEntry( nDicPos ); | 
|  | aAllDictsLB.InsertEntry( sName, nDicPos ); | 
|  | aAllDictsLB.SelectEntryPos( nDicPos ); | 
|  | } | 
|  | else | 
|  | SetLanguage_Impl( nOldLang ); | 
|  | } | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void SvxEditDictionaryDialog::ShowWords_Impl( sal_uInt16 nId ) | 
|  | { | 
|  | Reference< XDictionary >  xDic = aDics.getConstArray()[ nId ]; | 
|  |  | 
|  | nOld = nId; | 
|  | EnterWait(); | 
|  |  | 
|  | String aStr; | 
|  |  | 
|  | aWordED.SetText(aStr); | 
|  | aReplaceED.SetText(aStr); | 
|  |  | 
|  | if(xDic->getDictionaryType() != DictionaryType_POSITIVE) | 
|  | { | 
|  | nStaticTabs[0]=2; | 
|  |  | 
|  | // make controls for replacement text active | 
|  | if(!aReplaceFT.IsVisible()) | 
|  | { | 
|  | Size aSize=aWordED.GetSizePixel(); | 
|  | aSize.Width()=nWidth; | 
|  | aWordED.SetSizePixel(aSize); | 
|  | aReplaceFT.Show(); | 
|  | aReplaceED.Show(); | 
|  | } | 
|  | } | 
|  | else | 
|  | { | 
|  | nStaticTabs[0]=1; | 
|  |  | 
|  | // deactivate controls for replacement text | 
|  | if(aReplaceFT.IsVisible()) | 
|  | { | 
|  | Size aSize=aWordED.GetSizePixel(); | 
|  | aSize.Width()=aWordsLB.GetSizePixel().Width(); | 
|  | aWordED.SetSizePixel(aSize); | 
|  | aReplaceFT.Hide(); | 
|  | aReplaceED.Hide(); | 
|  | } | 
|  |  | 
|  | } | 
|  |  | 
|  | aWordsLB.SetTabs(nStaticTabs); | 
|  | aWordsLB.Clear(); | 
|  |  | 
|  | Sequence< Reference< XDictionaryEntry >  > aEntries( xDic->getEntries() ); | 
|  | const Reference< XDictionaryEntry >  *pEntry = aEntries.getConstArray(); | 
|  | sal_Int32 nCount = aEntries.getLength(); | 
|  |  | 
|  | for (sal_Int32 i = 0;  i < nCount;  i++) | 
|  | { | 
|  | aStr = String(pEntry[i]->getDictionaryWord()); | 
|  | sal_uInt16 nPos = GetLBInsertPos( aStr ); | 
|  | if(pEntry[i]->isNegative()) | 
|  | { | 
|  | aStr += '\t'; | 
|  | aStr += String(pEntry[i]->getReplacementText()); | 
|  | } | 
|  | aWordsLB.InsertEntry(aStr, 0, sal_False, nPos == USHRT_MAX ?  LIST_APPEND : nPos); | 
|  | } | 
|  |  | 
|  | if (aWordsLB.GetEntryCount()) | 
|  | { | 
|  | aWordED	  .SetText( aWordsLB.GetEntryText(0LU, 0) ); | 
|  | aReplaceED.SetText( aWordsLB.GetEntryText(0LU, 1) ); | 
|  | } | 
|  |  | 
|  | LeaveWait(); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | IMPL_LINK(SvxEditDictionaryDialog, SelectHdl, SvTabListBox*, pBox) | 
|  | { | 
|  | if(!bDoNothing) | 
|  | { | 
|  | if(!bFirstSelect) | 
|  | { | 
|  | SvLBoxEntry* pEntry = pBox->FirstSelected(); | 
|  | String sTmpShort(pBox->GetEntryText(pEntry, 0)); | 
|  | // wird der Text ueber den ModifyHdl gesetzt, dann steht der Cursor | 
|  | //sonst immer am Wortanfang, obwohl man gerade hier editiert | 
|  | if(aWordED.GetText() != sTmpShort) | 
|  | aWordED.SetText(sTmpShort); | 
|  | aReplaceED.SetText(pBox->GetEntryText(pEntry, 1)); | 
|  | } | 
|  | else | 
|  | bFirstSelect = sal_False; | 
|  |  | 
|  | // entries in the list box should exactly correspond to those from the | 
|  | // dictionary. Thus: | 
|  | aNewReplacePB.Enable(sal_False); | 
|  | aDeletePB	 .Enable( sal_True && !IsDicReadonly_Impl() ); | 
|  | } | 
|  | return 0; | 
|  | }; | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | IMPL_LINK(SvxEditDictionaryDialog, NewDelHdl, PushButton*, pBtn) | 
|  | { | 
|  | SvLBoxEntry* pEntry = aWordsLB.FirstSelected(); | 
|  |  | 
|  | if(pBtn == &aDeletePB) | 
|  | { | 
|  | DBG_ASSERT(pEntry, "keine Eintrag selektiert"); | 
|  | String aStr; | 
|  |  | 
|  | aWordED.SetText(aStr); | 
|  | aReplaceED.SetText(aStr); | 
|  | aDeletePB.Disable(); | 
|  |  | 
|  | RemoveDictEntry(pEntry);	// remove entry from dic and list-box | 
|  | } | 
|  | if(pBtn == &aNewReplacePB || aNewReplacePB.IsEnabled()) | 
|  | { | 
|  | SvLBoxEntry* _pEntry = aWordsLB.FirstSelected(); | 
|  | XubString aNewWord(aWordED.GetText()); | 
|  | String sEntry(aNewWord); | 
|  | XubString aReplaceStr(aReplaceED.GetText()); | 
|  |  | 
|  | sal_Int16 nAddRes = DIC_ERR_UNKNOWN; | 
|  | sal_uInt16 nPos = aAllDictsLB.GetSelectEntryPos(); | 
|  | if ( nPos != LISTBOX_ENTRY_NOTFOUND && aNewWord.Len() > 0) | 
|  | { | 
|  | DBG_ASSERT(nPos < aDics.getLength(), "invalid dictionary index"); | 
|  | Reference< XDictionary >  xDic( aDics.getConstArray()[ nPos ], UNO_QUERY ); | 
|  | if (xDic.is()) | 
|  | { | 
|  | // make changes in dic | 
|  |  | 
|  | //! ...IsVisible should reflect wether the dictionary is a negativ | 
|  | //! or not (hopefully...) | 
|  | sal_Bool bIsNegEntry = aReplaceFT.IsVisible(); | 
|  | ::rtl::OUString aRplcText; | 
|  | if(bIsNegEntry) | 
|  | aRplcText = aReplaceStr; | 
|  |  | 
|  | if (_pEntry) // entry selected in aWordsLB ie action = modify entry | 
|  | xDic->remove( aWordsLB.GetEntryText( _pEntry, 0 ) ); | 
|  | // if remove has failed the following add should fail too | 
|  | // and thus a warning message should be triggered... | 
|  |  | 
|  | Reference<XDictionary> aXDictionary(xDic, UNO_QUERY); | 
|  | nAddRes = linguistic::AddEntryToDic( aXDictionary, | 
|  | aNewWord, bIsNegEntry, | 
|  | aRplcText, SvxLocaleToLanguage( xDic->getLocale() ), sal_False ); | 
|  | } | 
|  | } | 
|  | if (DIC_ERR_NONE != nAddRes) | 
|  | SvxDicError( this, nAddRes ); | 
|  |  | 
|  | if(DIC_ERR_NONE == nAddRes && sEntry.Len()) | 
|  | { | 
|  | // insert new entry in list-box etc... | 
|  |  | 
|  | aWordsLB.SetUpdateMode(sal_False); | 
|  | sal_uInt16 _nPos = USHRT_MAX; | 
|  |  | 
|  | if(aReplaceFT.IsVisible()) | 
|  | { | 
|  | sEntry += '\t'; | 
|  | sEntry += aReplaceStr; | 
|  | } | 
|  |  | 
|  | SvLBoxEntry* pNewEntry = NULL; | 
|  | if(_pEntry) // entry selected in aWordsLB ie action = modify entry | 
|  | { | 
|  | aWordsLB.SetEntryText( sEntry, _pEntry ); | 
|  | pNewEntry = _pEntry; | 
|  | } | 
|  | else | 
|  | { | 
|  | _nPos = GetLBInsertPos( aNewWord ); | 
|  | SvLBoxEntry* pInsEntry = aWordsLB.InsertEntry(sEntry, 0, sal_False, | 
|  | _nPos == USHRT_MAX ? LIST_APPEND : (sal_uInt32)_nPos); | 
|  | pNewEntry = pInsEntry; | 
|  | } | 
|  |  | 
|  | aWordsLB.MakeVisible( pNewEntry ); | 
|  | aWordsLB.SetUpdateMode(sal_True); | 
|  | // falls der Request aus dem ReplaceEdit kam, dann Focus in das ShortEdit setzen | 
|  | if(aReplaceED.HasFocus()) | 
|  | aWordED.GrabFocus(); | 
|  | } | 
|  | } | 
|  | else | 
|  | { | 
|  | // das kann nur ein Enter in einem der beiden Edit-Felder sein und das | 
|  | // bedeutet EndDialog() - muss im KeyInput ausgewertet werden | 
|  | return 0; | 
|  | } | 
|  | ModifyHdl(&aWordED); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | IMPL_LINK(SvxEditDictionaryDialog, ModifyHdl, Edit*, pEdt) | 
|  | { | 
|  | SvLBoxEntry* pFirstSel = aWordsLB.FirstSelected(); | 
|  | String rEntry = pEdt->GetText(); | 
|  |  | 
|  | xub_StrLen nWordLen=rEntry.Len(); | 
|  | const String& rRepString = aReplaceED.GetText(); | 
|  |  | 
|  | sal_Bool bEnableNewReplace	= sal_False; | 
|  | sal_Bool bEnableDelete		= sal_False; | 
|  | String aNewReplaceText	= sNew; | 
|  |  | 
|  | if(pEdt == &aWordED) | 
|  | { | 
|  | if(nWordLen>0) | 
|  | { | 
|  | sal_Bool bFound = sal_False; | 
|  | sal_Bool bTmpSelEntry=sal_False; | 
|  | CDE_RESULT eCmpRes = CDE_DIFFERENT; | 
|  |  | 
|  | for(sal_uInt16 i = 0; i < aWordsLB.GetEntryCount(); i++) | 
|  | { | 
|  | SvLBoxEntry*  pEntry = aWordsLB.GetEntry( i ); | 
|  | String aTestStr( aWordsLB.GetEntryText(pEntry, 0) ); | 
|  | eCmpRes = cmpDicEntry_Impl( rEntry, aTestStr ); | 
|  | if(CDE_DIFFERENT != eCmpRes) | 
|  | { | 
|  | if(rRepString.Len()) | 
|  | bFirstSelect = sal_True; | 
|  | bDoNothing=sal_True; | 
|  | aWordsLB.SetCurEntry(pEntry); | 
|  | bDoNothing=sal_False; | 
|  | pFirstSel = pEntry; | 
|  | aReplaceED.SetText(aWordsLB.GetEntryText(pEntry, 1)); | 
|  |  | 
|  | if (CDE_SIMILAR == eCmpRes) | 
|  | { | 
|  | aNewReplaceText = sModify; | 
|  | bEnableNewReplace = sal_True; | 
|  | } | 
|  | bFound= sal_True; | 
|  | break; | 
|  | } | 
|  | else if(getNormDicEntry_Impl(aTestStr).Search( | 
|  | getNormDicEntry_Impl( rEntry ) ) == 0 | 
|  | && !bTmpSelEntry) | 
|  | { | 
|  | bDoNothing=sal_True; | 
|  | aWordsLB.MakeVisible(pEntry); | 
|  | bDoNothing=sal_False; | 
|  | bTmpSelEntry=sal_True; | 
|  |  | 
|  | aNewReplaceText = sNew; | 
|  | bEnableNewReplace = sal_True; | 
|  | } | 
|  | } | 
|  |  | 
|  | if(!bFound) | 
|  | { | 
|  | aWordsLB.SelectAll(sal_False); | 
|  | pFirstSel = 0; | 
|  |  | 
|  | aNewReplaceText = sNew; | 
|  | bEnableNewReplace = sal_True; | 
|  | } | 
|  | bEnableDelete = CDE_DIFFERENT != eCmpRes; | 
|  | } | 
|  | else if(aWordsLB.GetEntryCount()>0) | 
|  | { | 
|  | SvLBoxEntry*  pEntry = aWordsLB.GetEntry( 0 ); | 
|  | bDoNothing=sal_True; | 
|  | aWordsLB.MakeVisible(pEntry); | 
|  | bDoNothing=sal_False; | 
|  | } | 
|  | } | 
|  | else if(pEdt == &aReplaceED) | 
|  | { | 
|  | String aReplaceText; | 
|  | String aWordText; | 
|  | if (pFirstSel)	// a aWordsLB entry is selected | 
|  | { | 
|  | aWordText	 = aWordsLB.GetEntryText( pFirstSel, 0 ); | 
|  | aReplaceText = aWordsLB.GetEntryText( pFirstSel, 1 ); | 
|  |  | 
|  | aNewReplaceText = sModify; | 
|  | bEnableDelete = sal_True; | 
|  | } | 
|  | sal_Bool bIsChange = | 
|  | CDE_EQUAL != cmpDicEntry_Impl(aWordED.GetText(), aWordText) | 
|  | || CDE_EQUAL != cmpDicEntry_Impl(aReplaceED.GetText(), aReplaceText); | 
|  | if (aWordED.GetText().Len()  &&  bIsChange) | 
|  | bEnableNewReplace = sal_True; | 
|  | } | 
|  |  | 
|  | aNewReplacePB.SetText( aNewReplaceText ); | 
|  | aNewReplacePB.Enable( bEnableNewReplace && !IsDicReadonly_Impl() ); | 
|  | aDeletePB	 .Enable( bEnableDelete     && !IsDicReadonly_Impl() ); | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | //========================================================= | 
|  | //SvxDictEdit | 
|  | //========================================================= | 
|  | void SvxDictEdit::KeyInput( const KeyEvent& rKEvt ) | 
|  | { | 
|  | const KeyCode aKeyCode = rKEvt.GetKeyCode(); | 
|  | const sal_uInt16 nModifier = aKeyCode.GetModifier(); | 
|  | if( aKeyCode.GetCode() == KEY_RETURN ) | 
|  | { | 
|  | //wird bei Enter nichts getan, dann doch die Basisklasse rufen | 
|  | // um den Dialog zu schliessen | 
|  | if(!nModifier && !aActionLink.Call(this)) | 
|  | Edit::KeyInput(rKEvt); | 
|  | } | 
|  | else if(bSpaces || aKeyCode.GetCode() != KEY_SPACE) | 
|  | Edit::KeyInput(rKEvt); | 
|  | } | 
|  |  | 
|  |  |