| /************************************************************** |
| * |
| * 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); |
| } |
| |
| |