diff options
Diffstat (limited to 'cui/source/options/optlingu.cxx')
-rw-r--r-- | cui/source/options/optlingu.cxx | 2499 |
1 files changed, 0 insertions, 2499 deletions
diff --git a/cui/source/options/optlingu.cxx b/cui/source/options/optlingu.cxx deleted file mode 100644 index 66c2aee01..000000000 --- a/cui/source/options/optlingu.cxx +++ /dev/null @@ -1,2499 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// include --------------------------------------------------------------- - -#include <vcl/msgbox.hxx> -#include <vcl/field.hxx> -#include <vcl/fixed.hxx> -#include <tools/shl.hxx> -#include <tools/dynary.hxx> -#include <i18npool/mslangid.hxx> -#include <unotools/lingucfg.hxx> -#include <editeng/unolingu.hxx> -#include <svx/dlgutil.hxx> -#include <linguistic/lngprops.hxx> -#include <linguistic/misc.hxx> -#include <sfx2/sfxuno.hxx> -#include <sfx2/dispatch.hxx> -#include <tools/urlobj.hxx> -#include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <comphelper/processfactory.hxx> -#include <com/sun/star/linguistic2/XSpellChecker.hpp> -#include <com/sun/star/linguistic2/XProofreader.hpp> -#include <com/sun/star/linguistic2/XHyphenator.hpp> -#include <com/sun/star/linguistic2/XThesaurus.hpp> -#include <com/sun/star/linguistic2/XAvailableLocales.hpp> -#include <com/sun/star/lang/XServiceDisplayName.hpp> -#include <com/sun/star/linguistic2/DictionaryListEventFlags.hpp> -#include <com/sun/star/linguistic2/DictionaryListEvent.hpp> -#include <com/sun/star/linguistic2/XDictionaryListEventListener.hpp> -#include <com/sun/star/linguistic2/XDictionaryList.hpp> -#include <com/sun/star/frame/XStorable.hpp> -#include <com/sun/star/ucb/CommandAbortedException.hpp> -#include <com/sun/star/system/XSystemShellExecute.hpp> -#include <com/sun/star/system/SystemShellExecuteFlags.hpp> -#include <unotools/extendedsecurityoptions.hxx> -#include <svtools/svlbox.hxx> -#include <svtools/langhelp.hxx> -#include <svl/eitem.hxx> -#include <svl/intitem.hxx> -#include <sfx2/viewfrm.hxx> -#include <vcl/svapp.hxx> -#define _SVX_OPTLINGU_CXX -#include "optlingu.hrc" - -#include <svx/svxdlg.hxx> -#include <editeng/optitems.hxx> -#include "optlingu.hxx" -#include <dialmgr.hxx> -#include <cuires.hrc> -#include "helpid.hrc" - -#include <ucbhelper/content.hxx> - -#include <vector> -#include <map> - - -using namespace ::ucbhelper; -using namespace ::rtl; -using namespace ::com::sun::star; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::linguistic2; -using namespace ::com::sun::star::beans; -namespace css = com::sun::star; - -#define C2U(cChar) OUString::createFromAscii(cChar) -#define SVX_MAX_USERDICTS 20 -#define CBCOL_FIRST 0 -#define CBCOL_SECOND 1 -#define CBCOL_BOTH 2 - -static const sal_Char cSpell[] = SN_SPELLCHECKER; -static const sal_Char cGrammar[] = SN_GRAMMARCHECKER; -static const sal_Char cHyph[] = SN_HYPHENATOR; -static const sal_Char cThes[] = SN_THESAURUS; - -// static ---------------------------------------------------------------- - -static Sequence< sal_Int16 > lcl_LocaleSeqToLangSeq( const Sequence< Locale > &rSeq ) -{ - sal_Int32 nLen = rSeq.getLength(); - Sequence< sal_Int16 > aRes( nLen ); - sal_Int16 *pRes = aRes.getArray(); - const Locale *pSeq = rSeq.getConstArray(); - for (sal_Int32 i = 0; i < nLen; ++i) - { - pRes[i] = SvxLocaleToLanguage( pSeq[i] ); - } - return aRes; -} - - -static sal_Bool lcl_SeqHasLang( const Sequence< sal_Int16 > &rSeq, sal_Int16 nLang ) -{ - sal_Int32 nLen = rSeq.getLength(); - const sal_Int16 *pLang = rSeq.getConstArray(); - sal_Int32 nPos = -1; - for (sal_Int32 i = 0; i < nLen && nPos < 0; ++i) - { - if (nLang == pLang[i]) - nPos = i; - } - return nPos < 0 ? sal_False : sal_True; -} - - -static sal_Int32 lcl_SeqGetEntryPos( - const Sequence< OUString > &rSeq, const OUString &rEntry ) -{ - sal_Int32 i; - sal_Int32 nLen = rSeq.getLength(); - const OUString *pItem = rSeq.getConstArray(); - for (i = 0; i < nLen; ++i) - { - if (rEntry == pItem[i]) - break; - } - return i < nLen ? i : -1; -} - -static void lcl_OpenURL( ::rtl::OUString sURL ) -{ - if ( sURL.getLength() > 0 ) - { - localizeWebserviceURI(sURL); - try - { - uno::Reference< lang::XMultiServiceFactory > xSMGR = - ::comphelper::getProcessServiceFactory(); - uno::Reference< css::system::XSystemShellExecute > xSystemShell( - xSMGR->createInstance( ::rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.system.SystemShellExecute" ) ) ), - uno::UNO_QUERY_THROW ); - if ( xSystemShell.is() ) - xSystemShell->execute( sURL, ::rtl::OUString(), css::system::SystemShellExecuteFlags::DEFAULTS ); - } - catch( const uno::Exception& e ) - { - OSL_TRACE( "Caught exception: %s\n thread terminated.\n", - rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr()); - } - } -} - -static const sal_uInt16 nNameLen = 8; - -static sal_uInt16 pRanges[] = -{ - SID_ATTR_SPELL, - SID_ATTR_SPELL, - 0 -}; - -sal_Bool KillFile_Impl( const String& rURL ) -{ - sal_Bool bRet = sal_True; - try - { - Content aCnt( rURL, uno::Reference< ::com::sun::star::ucb::XCommandEnvironment > () ); - aCnt.executeCommand( OUString(RTL_CONSTASCII_USTRINGPARAM("delete")), makeAny( sal_Bool( sal_True ) ) ); - } - catch( ::com::sun::star::ucb::CommandAbortedException& ) - { - DBG_ERRORFILE( "KillFile: CommandAbortedException" ); - bRet = sal_False; - } - catch( ... ) - { - DBG_ERRORFILE( "KillFile: Any other exception" ); - bRet = sal_False; - } - - return bRet; -} - -// 0x 0p 0t 0c nn -// p: 1 -> parent -// t: 1 -> spell, 2 -> hyph, 3 -> thes, 4 -> grammar -// c: 1 -> checked 0 -> unchecked -// n: index - -#define TYPE_SPELL (sal_uInt8)1 -#define TYPE_GRAMMAR (sal_uInt8)2 -#define TYPE_HYPH (sal_uInt8)3 -#define TYPE_THES (sal_uInt8)4 - -class ModuleUserData_Impl -{ - sal_Bool bParent; - sal_Bool bIsChecked; - sal_uInt8 nType; - sal_uInt8 nIndex; - String sImplName; - -public: - ModuleUserData_Impl( String sImpName, sal_Bool bIsParent, sal_Bool bChecked, sal_uInt8 nSetType, sal_uInt8 nSetIndex ) : - bParent(bIsParent), - bIsChecked(bChecked), - nType(nSetType), - nIndex(nSetIndex), - sImplName(sImpName) - { - } - sal_Bool IsParent() const {return bParent;} - sal_uInt8 GetType() const {return nType;} - sal_Bool IsChecked() const {return bIsChecked;} - sal_uInt8 GetIndex() const {return nIndex;} - void SetIndex(sal_uInt8 nSet) {nIndex = nSet;} - const String& GetImplName() const {return sImplName;} - -}; - -// -// User for user-dictionaries (XDictionary interface) -// -class DicUserData -{ - sal_uLong nVal; - -public: - DicUserData( sal_uLong nUserData ) : nVal( nUserData ) {} - DicUserData( sal_uInt16 nEID, - sal_Bool bChecked, sal_Bool bEditable, sal_Bool bDeletable ); - - sal_uLong GetUserData() const { return nVal; } - sal_uInt16 GetEntryId() const { return (sal_uInt16)(nVal >> 16); } - sal_Bool IsChecked() const { return (sal_Bool)(nVal >> 8) & 0x01; } - sal_Bool IsEditable() const { return (sal_Bool)(nVal >> 9) & 0x01; } - sal_Bool IsDeletable() const { return (sal_Bool)(nVal >> 10) & 0x01; } - - void SetChecked( sal_Bool bVal ); -}; - - -DicUserData::DicUserData( - sal_uInt16 nEID, - sal_Bool bChecked, sal_Bool bEditable, sal_Bool bDeletable ) -{ - DBG_ASSERT( nEID < 65000, "Entry Id out of range" ); - nVal = ((sal_uLong)(0xFFFF & nEID) << 16) | - ((sal_uLong)(bChecked ? 1 : 0) << 8) | - ((sal_uLong)(bEditable ? 1 : 0) << 9) | - ((sal_uLong)(bDeletable ? 1 : 0) << 10); -} - - -void DicUserData::SetChecked( sal_Bool bVal ) -{ - nVal &= ~(1UL << 8); - nVal |= (sal_uLong)(bVal ? 1 : 0) << 8; -} - - -// class BrwString_Impl ------------------------------------------------- - -void lcl_SetCheckButton( SvLBoxEntry* pEntry, sal_Bool bCheck ) -{ - SvLBoxButton* pItem = (SvLBoxButton*)(pEntry->GetFirstItem(SV_ITEM_ID_LBOXBUTTON)); - - DBG_ASSERT(pItem,"SetCheckButton:Item not found"); - if (((SvLBoxItem*)pItem)->IsA() == SV_ITEM_ID_LBOXBUTTON) - { - if (bCheck) - pItem->SetStateChecked(); - else - pItem->SetStateUnchecked(); - } -} - - -class BrwStringDic_Impl : public SvLBoxString -{ -public: - - BrwStringDic_Impl( SvLBoxEntry* pEntry, sal_uInt16 nFlags, - const String& rStr ) : SvLBoxString( pEntry, nFlags, rStr ) {} - - virtual void Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 nFlags, - SvLBoxEntry* pEntry); -}; - -void BrwStringDic_Impl::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16, - SvLBoxEntry* pEntry ) -{ - ModuleUserData_Impl* pData = (ModuleUserData_Impl*)pEntry->GetUserData(); - Point aPos(rPos); - Font aOldFont( rDev.GetFont()); - if(pData->IsParent()) - { - Font aFont( aOldFont ); - aFont.SetWeight( WEIGHT_BOLD ); - rDev.SetFont( aFont ); - aPos.X() = 0; - } - else - aPos.X() += 5; - rDev.DrawText( aPos, GetText() ); - rDev.SetFont( aOldFont ); -} - -class OptionsBreakSet : public ModalDialog -{ - OKButton aOKPB; - CancelButton aCancelPB; - FixedLine aValFL; - NumericField aValNF; - -public: - OptionsBreakSet(Window* pParent, int nRID) : - ModalDialog(pParent, CUI_RES(RID_SVXDLG_LNG_ED_NUM_PREBREAK )), - aOKPB (this, CUI_RES(BT_OK_PREBREAK)), - aCancelPB (this, CUI_RES(BT_CANCEL_PREBREAK)), - aValFL (this, CUI_RES(FL_NUMVAL_PREBREAK)), - aValNF (this, CUI_RES(ED_PREBREAK)) - { - DBG_ASSERT( STR_NUM_PRE_BREAK_DLG == nRID || - STR_NUM_POST_BREAK_DLG == nRID || - STR_NUM_MIN_WORDLEN_DLG == nRID, "unexpected RID" ); - - if (nRID != -1) - aValFL.SetText( String( CUI_RES(nRID) ) ); - FreeResource(); - } - - NumericField& GetNumericFld() { return aValNF; } -}; - - -/*-------------------------------------------------- - Entry IDs for options listbox of dialog ---------------------------------------------------*/ - -enum EID_OPTIONS -{ - EID_SPELL_AUTO, - EID_GRAMMAR_AUTO, - EID_CAPITAL_WORDS, - EID_WORDS_WITH_DIGITS, - EID_CAPITALIZATION, - EID_SPELL_SPECIAL, - EID_NUM_MIN_WORDLEN, - EID_NUM_PRE_BREAK, - EID_NUM_POST_BREAK, - EID_HYPH_AUTO, - EID_HYPH_SPECIAL -}; - -//! this array must have an entry for every value of EID_OPTIONS. -// It is used to get the respective property name. -static const char * aEidToPropName[] = -{ - UPN_IS_SPELL_AUTO, // EID_SPELL_AUTO - UPN_IS_GRAMMAR_AUTO, // EID_GRAMMAR_AUTO - UPN_IS_SPELL_UPPER_CASE, // EID_CAPITAL_WORDS - UPN_IS_SPELL_WITH_DIGITS, // EID_WORDS_WITH_DIGITS - UPN_IS_SPELL_CAPITALIZATION, // EID_CAPITALIZATION - UPN_IS_SPELL_SPECIAL, // EID_SPELL_SPECIAL - UPN_HYPH_MIN_WORD_LENGTH, // EID_NUM_MIN_WORDLEN, - UPN_HYPH_MIN_LEADING, // EID_NUM_PRE_BREAK - UPN_HYPH_MIN_TRAILING, // EID_NUM_POST_BREAK - UPN_IS_HYPH_AUTO, // EID_HYPH_AUTO - UPN_IS_HYPH_SPECIAL // EID_HYPH_SPECIAL -}; - - -static inline String lcl_GetPropertyName( EID_OPTIONS eEntryId ) -{ - DBG_ASSERT( (unsigned int) eEntryId < SAL_N_ELEMENTS(aEidToPropName), "index out of range" ); - return String::CreateFromAscii( aEidToPropName[ (int) eEntryId ] ); -} - -// class OptionsUserData ------------------------------------------------- - -class OptionsUserData -{ - sal_uLong nVal; - - void SetModified(); - -public: - OptionsUserData( sal_uLong nUserData ) : nVal( nUserData ) {} - OptionsUserData( sal_uInt16 nEID, - sal_Bool bHasNV, sal_uInt16 nNumVal, - sal_Bool bCheckable, sal_Bool bChecked ); - - sal_uLong GetUserData() const { return nVal; } - sal_uInt16 GetEntryId() const { return (sal_uInt16)(nVal >> 16); } - sal_Bool HasNumericValue() const { return (sal_Bool)(nVal >> 10) & 0x01; } - sal_uInt16 GetNumericValue() const { return (sal_uInt16)(nVal & 0xFF); } - sal_Bool IsChecked() const { return (sal_Bool)(nVal >> 8) & 0x01; } - sal_Bool IsCheckable() const { return (sal_Bool)(nVal >> 9) & 0x01; } - sal_Bool IsModified() const { return (sal_Bool)(nVal >> 11) & 0x01; } - - void SetChecked( sal_Bool bVal ); - void SetNumericValue( sal_uInt8 nNumVal ); -}; - -OptionsUserData::OptionsUserData( sal_uInt16 nEID, - sal_Bool bHasNV, sal_uInt16 nNumVal, - sal_Bool bCheckable, sal_Bool bChecked ) -{ - DBG_ASSERT( nEID < 65000, "Entry Id out of range" ); - DBG_ASSERT( nNumVal < 256, "value out of range" ); - nVal = ((sal_uLong)(0xFFFF & nEID) << 16) | - ((sal_uLong)(bHasNV ? 1 : 0) << 10) | - ((sal_uLong)(bCheckable ? 1 : 0) << 9) | - ((sal_uLong)(bChecked ? 1 : 0) << 8) | - ((sal_uLong)(0xFF & nNumVal)); -} - -void OptionsUserData::SetChecked( sal_Bool bVal ) -{ - if (IsCheckable() && (IsChecked() != bVal)) - { - nVal &= ~(1UL << 8); - nVal |= (sal_uLong)(bVal ? 1 : 0) << 8; - SetModified(); - } -} - -void OptionsUserData::SetNumericValue( sal_uInt8 nNumVal ) -{ - if (HasNumericValue() && (GetNumericValue() != nNumVal)) - { - nVal &= 0xffffff00; - nVal |= (nNumVal); - SetModified(); - } -} - -void OptionsUserData::SetModified() -{ - nVal |= (sal_uLong)1 << 11; -} - -// class BrwString_Impl ------------------------------------------------- - -class BrwString_Impl : public SvLBoxString -{ -public: - - BrwString_Impl( SvLBoxEntry* pEntry, sal_uInt16 nFlags, - const String& rStr ) : SvLBoxString( pEntry, nFlags, rStr ) {} - - virtual void Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 nFlags, - SvLBoxEntry* pEntry); -}; - -void BrwString_Impl::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16, - SvLBoxEntry* pEntry ) -{ - Point aPos(rPos); - aPos.X() += 20; - rDev.DrawText( aPos, GetText() ); - if(pEntry->GetUserData()) - { - Point aNewPos(aPos); - aNewPos.X() += rDev.GetTextWidth(GetText()); - Font aOldFont( rDev.GetFont()); - Font aFont( aOldFont ); - aFont.SetWeight( WEIGHT_BOLD ); - - //??? das untere byte aus dem user data in string wandeln - OptionsUserData aData( (sal_uLong) pEntry->GetUserData() ); - if(aData.HasNumericValue()) - { - String sTxt( ' ' ); - sTxt += String::CreateFromInt32( aData.GetNumericValue() ); - rDev.SetFont( aFont ); - rDev.DrawText( aNewPos, sTxt ); - } - - rDev.SetFont( aOldFont ); - } -} - -// ServiceInfo_Impl ---------------------------------------------------- - -struct ServiceInfo_Impl -{ - OUString sDisplayName; - OUString sSpellImplName; - OUString sHyphImplName; - OUString sThesImplName; - OUString sGrammarImplName; - uno::Reference< XSpellChecker > xSpell; - uno::Reference< XHyphenator > xHyph; - uno::Reference< XThesaurus > xThes; - uno::Reference< XProofreader > xGrammar; - sal_Bool bConfigured; - - ServiceInfo_Impl() : bConfigured(sal_False) {} -}; - -typedef std::vector< ServiceInfo_Impl > ServiceInfoArr; -typedef std::map< sal_Int16 /*LanguageType*/, Sequence< OUString > > LangImplNameTable; - - -// SvxLinguData_Impl ---------------------------------------------------- - -class SvxLinguData_Impl -{ - //contains services and implementation names sorted by implementation names - ServiceInfoArr aDisplayServiceArr; - sal_uLong nDisplayServices; - - Sequence< Locale > aAllServiceLocales; - LangImplNameTable aCfgSpellTable; - LangImplNameTable aCfgHyphTable; - LangImplNameTable aCfgThesTable; - LangImplNameTable aCfgGrammarTable; - uno::Reference< XMultiServiceFactory > xMSF; - uno::Reference< XLinguServiceManager > xLinguSrvcMgr; - - - sal_Bool AddRemove( Sequence< OUString > &rConfigured, - const OUString &rImplName, sal_Bool bAdd ); - -public: - SvxLinguData_Impl(); - SvxLinguData_Impl( const SvxLinguData_Impl &rData ); - ~SvxLinguData_Impl(); - - SvxLinguData_Impl & operator = (const SvxLinguData_Impl &rData); - - uno::Reference<XLinguServiceManager> & GetManager() { return xLinguSrvcMgr; } - - void SetChecked( const Sequence< OUString > &rConfiguredServices ); - void Reconfigure( const OUString &rDisplayName, sal_Bool bEnable ); - - const Sequence<Locale> & GetAllSupportedLocales() const { return aAllServiceLocales; } - - const LangImplNameTable & GetSpellTable() const { return aCfgSpellTable; } - LangImplNameTable & GetSpellTable() { return aCfgSpellTable; } - const LangImplNameTable & GetHyphTable() const { return aCfgHyphTable; } - LangImplNameTable & GetHyphTable() { return aCfgHyphTable; } - const LangImplNameTable & GetThesTable() const { return aCfgThesTable; } - LangImplNameTable & GetThesTable() { return aCfgThesTable; } - const LangImplNameTable & GetGrammarTable() const { return aCfgGrammarTable; } - LangImplNameTable & GetGrammarTable() { return aCfgGrammarTable; } - - const ServiceInfoArr & GetDisplayServiceArray() const { return aDisplayServiceArr; } - ServiceInfoArr & GetDisplayServiceArray() { return aDisplayServiceArr; } - - const sal_uLong & GetDisplayServiceCount() const { return nDisplayServices; } - void SetDisplayServiceCount( sal_uLong nVal ) { nDisplayServices = nVal; } - - // returns the list of service implementation names for the specified - // language and service (TYPE_SPELL, TYPE_HYPH, TYPE_THES) sorted in - // the proper order for the SvxEditModulesDlg (the ones from the - // configuration (keeping that order!) first and then the other ones. - // I.e. the ones available but not configured in arbitrary order). - // They available ones may contain names that do not(!) support that - // language. - Sequence< OUString > GetSortedImplNames( sal_Int16 nLang, sal_uInt8 nType ); - - ServiceInfo_Impl * GetInfoByImplName( const OUString &rSvcImplName ); -}; - - -sal_Int32 lcl_SeqGetIndex( const Sequence< OUString > &rSeq, const OUString &rTxt ) -{ - sal_Int32 nRes = -1; - sal_Int32 nLen = rSeq.getLength(); - const OUString *pString = rSeq.getConstArray(); - for (sal_Int32 i = 0; i < nLen && nRes == -1; ++i) - { - if (pString[i] == rTxt) - nRes = i; - } - return nRes; -} - - -Sequence< OUString > SvxLinguData_Impl::GetSortedImplNames( sal_Int16 nLang, sal_uInt8 nType ) -{ - LangImplNameTable *pTable = 0; - switch (nType) - { - case TYPE_SPELL : pTable = &aCfgSpellTable; break; - case TYPE_HYPH : pTable = &aCfgHyphTable; break; - case TYPE_THES : pTable = &aCfgThesTable; break; - case TYPE_GRAMMAR : pTable = &aCfgGrammarTable; break; - } - Sequence< OUString > aRes; - if (pTable->count( nLang )) - aRes = (*pTable)[ nLang ]; // add configured services - sal_Int32 nIdx = aRes.getLength(); - DBG_ASSERT( (sal_Int32) nDisplayServices >= nIdx, "size mismatch" ); - aRes.realloc( nDisplayServices ); - OUString *pRes = aRes.getArray(); - - // add not configured services - for (sal_Int32 i = 0; i < (sal_Int32) nDisplayServices; ++i) - { - const ServiceInfo_Impl &rInfo = aDisplayServiceArr[ i ]; - OUString aImplName; - switch (nType) - { - case TYPE_SPELL : aImplName = rInfo.sSpellImplName; break; - case TYPE_HYPH : aImplName = rInfo.sHyphImplName; break; - case TYPE_THES : aImplName = rInfo.sThesImplName; break; - case TYPE_GRAMMAR : aImplName = rInfo.sGrammarImplName; break; - } - - if (aImplName.getLength() && (lcl_SeqGetIndex( aRes, aImplName) == -1)) // name not yet added - { - DBG_ASSERT( nIdx < aRes.getLength(), "index out of range" ); - if (nIdx < aRes.getLength()) - pRes[ nIdx++ ] = aImplName; - } - } - // don't forget to put aRes back to its actual size just in case you allocated too much - // since all of the names may have already been added - // otherwise you get duplicate entries in the edit dialog - aRes.realloc( nIdx ); - return aRes; -} - - -ServiceInfo_Impl * SvxLinguData_Impl::GetInfoByImplName( const OUString &rSvcImplName ) -{ - ServiceInfo_Impl* pInfo = 0; - for (sal_uLong i = 0; i < nDisplayServices && !pInfo; ++i) - { - ServiceInfo_Impl &rTmp = aDisplayServiceArr[ i ]; - if (rTmp.sSpellImplName == rSvcImplName || - rTmp.sHyphImplName == rSvcImplName || - rTmp.sThesImplName == rSvcImplName || - rTmp.sGrammarImplName == rSvcImplName) - pInfo = &rTmp; - } - return pInfo; -} - - -//----------------------------------------------------------------------------- - -void lcl_MergeLocales(Sequence< Locale >& aAllLocales, const Sequence< Locale >& rAdd) -{ - const Locale* pAdd = rAdd.getConstArray(); - Sequence<Locale> aLocToAdd(rAdd.getLength()); - const Locale* pAllLocales = aAllLocales.getConstArray(); - Locale* pLocToAdd = aLocToAdd.getArray(); - sal_Int32 nFound = 0; - sal_Int32 i; - for(i = 0; i < rAdd.getLength(); i++) - { - sal_Bool bFound = sal_False; - for(sal_Int32 j = 0; j < aAllLocales.getLength() && !bFound; j++) - { - bFound = pAdd[i].Language == pAllLocales[j].Language && - pAdd[i].Country == pAllLocales[j].Country; - } - if(!bFound) - { - pLocToAdd[nFound++] = pAdd[i]; - } - } - sal_Int32 nLength = aAllLocales.getLength(); - aAllLocales.realloc( nLength + nFound); - Locale* pAllLocales2 = aAllLocales.getArray(); - for(i = 0; i < nFound; i++) - pAllLocales2[nLength++] = pLocToAdd[i]; -} - -void lcl_MergeDisplayArray( - SvxLinguData_Impl &rData, - const ServiceInfo_Impl &rToAdd ) -{ - sal_uLong nCnt = 0; - - ServiceInfoArr &rSvcInfoArr = rData.GetDisplayServiceArray(); - sal_uLong nEntries = rData.GetDisplayServiceCount(); - - ServiceInfo_Impl* pEntry; - for (sal_uLong i = 0; i < nEntries; ++i) - { - pEntry = &rSvcInfoArr[i]; - if (pEntry && pEntry->sDisplayName == rToAdd.sDisplayName) - { - if(rToAdd.xSpell.is()) - { - DBG_ASSERT( !pEntry->xSpell.is() && - pEntry->sSpellImplName.getLength() == 0, - "merge conflict" ); - pEntry->sSpellImplName = rToAdd.sSpellImplName; - pEntry->xSpell = rToAdd.xSpell; - } - if(rToAdd.xGrammar.is()) - { - DBG_ASSERT( !pEntry->xGrammar.is() && - pEntry->sGrammarImplName.getLength() == 0, - "merge conflict" ); - pEntry->sGrammarImplName = rToAdd.sGrammarImplName; - pEntry->xGrammar = rToAdd.xGrammar; - } - if(rToAdd.xHyph.is()) - { - DBG_ASSERT( !pEntry->xHyph.is() && - pEntry->sHyphImplName.getLength() == 0, - "merge conflict" ); - pEntry->sHyphImplName = rToAdd.sHyphImplName; - pEntry->xHyph = rToAdd.xHyph; - } - if(rToAdd.xThes.is()) - { - DBG_ASSERT( !pEntry->xThes.is() && - pEntry->sThesImplName.getLength() == 0, - "merge conflict" ); - pEntry->sThesImplName = rToAdd.sThesImplName; - pEntry->xThes = rToAdd.xThes; - } - return ; - } - ++nCnt; - } - rData.GetDisplayServiceArray().push_back( rToAdd ); - rData.SetDisplayServiceCount( nCnt + 1 ); -} - -SvxLinguData_Impl::SvxLinguData_Impl() : - nDisplayServices (0) -{ - xMSF = ::comphelper::getProcessServiceFactory(); - uno::Reference < XInterface > xI = xMSF->createInstance( - C2U( "com.sun.star.linguistic2.LinguServiceManager" ) ); - xLinguSrvcMgr = uno::Reference<XLinguServiceManager>(xI, UNO_QUERY); - DBG_ASSERT(xLinguSrvcMgr.is(), "No linguistic service available!"); - if(xLinguSrvcMgr.is()) - { - Locale aCurrentLocale; - LanguageType eLang = Application::GetSettings().GetLanguage(); - SvxLanguageToLocale(aCurrentLocale, eLang); - Sequence<Any> aArgs(2);//second arguments has to be empty! - aArgs.getArray()[0] <<= SvxGetLinguPropertySet(); - - //read spell checker - Sequence< OUString > aSpellNames = xLinguSrvcMgr->getAvailableServices( - C2U(cSpell), Locale() ); - const OUString* pSpellNames = aSpellNames.getConstArray(); - - sal_Int32 nIdx; - for(nIdx = 0; nIdx < aSpellNames.getLength(); nIdx++) - { - ServiceInfo_Impl aInfo; - aInfo.sSpellImplName = pSpellNames[nIdx]; - aInfo.xSpell = uno::Reference<XSpellChecker>( - xMSF->createInstanceWithArguments(aInfo.sSpellImplName, aArgs), UNO_QUERY); - - uno::Reference<XServiceDisplayName> xDispName(aInfo.xSpell, UNO_QUERY); - if(xDispName.is()) - aInfo.sDisplayName = xDispName->getServiceDisplayName( aCurrentLocale ); - - const Sequence< Locale > aLocales( aInfo.xSpell->getLocales() ); - //! suppress display of entries with no supported languages (see feature 110994) - if (aLocales.getLength()) - { - lcl_MergeLocales( aAllServiceLocales, aLocales ); - lcl_MergeDisplayArray( *this, aInfo ); - } - } - - //read grammar checker - Sequence< OUString > aGrammarNames = xLinguSrvcMgr->getAvailableServices( - C2U(cGrammar), Locale() ); - const OUString* pGrammarNames = aGrammarNames.getConstArray(); - for(nIdx = 0; nIdx < aGrammarNames.getLength(); nIdx++) - { - ServiceInfo_Impl aInfo; - aInfo.sGrammarImplName = pGrammarNames[nIdx]; - aInfo.xGrammar = uno::Reference<XProofreader>( - xMSF->createInstanceWithArguments(aInfo.sGrammarImplName, aArgs), UNO_QUERY); - - uno::Reference<XServiceDisplayName> xDispName(aInfo.xGrammar, UNO_QUERY); - if(xDispName.is()) - aInfo.sDisplayName = xDispName->getServiceDisplayName( aCurrentLocale ); - - const Sequence< Locale > aLocales( aInfo.xGrammar->getLocales() ); - //! suppress display of entries with no supported languages (see feature 110994) - if (aLocales.getLength()) - { - lcl_MergeLocales( aAllServiceLocales, aLocales ); - lcl_MergeDisplayArray( *this, aInfo ); - } - } - - //read hyphenator - Sequence< OUString > aHyphNames = xLinguSrvcMgr->getAvailableServices( - C2U(cHyph), Locale() ); - const OUString* pHyphNames = aHyphNames.getConstArray(); - for(nIdx = 0; nIdx < aHyphNames.getLength(); nIdx++) - { - ServiceInfo_Impl aInfo; - aInfo.sHyphImplName = pHyphNames[nIdx]; - aInfo.xHyph = uno::Reference<XHyphenator>( - xMSF->createInstanceWithArguments(aInfo.sHyphImplName, aArgs), UNO_QUERY); - - uno::Reference<XServiceDisplayName> xDispName(aInfo.xHyph, UNO_QUERY); - if(xDispName.is()) - aInfo.sDisplayName = xDispName->getServiceDisplayName( aCurrentLocale ); - - const Sequence< Locale > aLocales( aInfo.xHyph->getLocales() ); - //! suppress display of entries with no supported languages (see feature 110994) - if (aLocales.getLength()) - { - lcl_MergeLocales( aAllServiceLocales, aLocales ); - lcl_MergeDisplayArray( *this, aInfo ); - } - } - - //read thesauri - Sequence< OUString > aThesNames = xLinguSrvcMgr->getAvailableServices( - C2U(cThes), Locale() ); - const OUString* pThesNames = aThesNames.getConstArray(); - for(nIdx = 0; nIdx < aThesNames.getLength(); nIdx++) - { - ServiceInfo_Impl aInfo; - aInfo.sThesImplName = pThesNames[nIdx]; - aInfo.xThes = uno::Reference<XThesaurus>( - xMSF->createInstanceWithArguments(aInfo.sThesImplName, aArgs), UNO_QUERY); - - uno::Reference<XServiceDisplayName> xDispName(aInfo.xThes, UNO_QUERY); - if(xDispName.is()) - aInfo.sDisplayName = xDispName->getServiceDisplayName( aCurrentLocale ); - - const Sequence< Locale > aLocales( aInfo.xThes->getLocales() ); - //! suppress display of entries with no supported languages (see feature 110994) - if (aLocales.getLength()) - { - lcl_MergeLocales( aAllServiceLocales, aLocales ); - lcl_MergeDisplayArray( *this, aInfo ); - } - } - - Sequence< OUString > aCfgSvcs; - const Locale* pAllLocales = aAllServiceLocales.getConstArray(); - for(sal_Int32 nLocale = 0; nLocale < aAllServiceLocales.getLength(); nLocale++) - { - sal_Int16 nLang = SvxLocaleToLanguage( pAllLocales[nLocale] ); - - aCfgSvcs = xLinguSrvcMgr->getConfiguredServices(C2U(cSpell), pAllLocales[nLocale]); - SetChecked( aCfgSvcs ); - if (aCfgSvcs.getLength()) - aCfgSpellTable[ nLang ] = aCfgSvcs; - - aCfgSvcs = xLinguSrvcMgr->getConfiguredServices(C2U(cGrammar), pAllLocales[nLocale]); - SetChecked( aCfgSvcs ); - if (aCfgSvcs.getLength()) - aCfgGrammarTable[ nLang ] = aCfgSvcs; - - aCfgSvcs = xLinguSrvcMgr->getConfiguredServices(C2U(cHyph), pAllLocales[nLocale]); - SetChecked( aCfgSvcs ); - if (aCfgSvcs.getLength()) - aCfgHyphTable[ nLang ] = aCfgSvcs; - - aCfgSvcs = xLinguSrvcMgr->getConfiguredServices(C2U(cThes), pAllLocales[nLocale]); - SetChecked( aCfgSvcs ); - if (aCfgSvcs.getLength()) - aCfgThesTable[ nLang ] = aCfgSvcs; - } - } -} - -SvxLinguData_Impl::SvxLinguData_Impl( const SvxLinguData_Impl &rData ) : - aDisplayServiceArr (rData.aDisplayServiceArr), - nDisplayServices (rData.nDisplayServices), - aAllServiceLocales (rData.aAllServiceLocales), - aCfgSpellTable (rData.aCfgSpellTable), - aCfgHyphTable (rData.aCfgHyphTable), - aCfgThesTable (rData.aCfgThesTable), - aCfgGrammarTable (rData.aCfgGrammarTable), - xMSF (rData.xMSF), - xLinguSrvcMgr (rData.xLinguSrvcMgr) -{ -} - -SvxLinguData_Impl & SvxLinguData_Impl::operator = (const SvxLinguData_Impl &rData) -{ - xMSF = rData.xMSF; - xLinguSrvcMgr = rData.xLinguSrvcMgr; - aAllServiceLocales = rData.aAllServiceLocales; - aCfgSpellTable = rData.aCfgSpellTable; - aCfgHyphTable = rData.aCfgHyphTable; - aCfgThesTable = rData.aCfgThesTable; - aCfgGrammarTable = rData.aCfgGrammarTable; - aDisplayServiceArr = rData.aDisplayServiceArr; - nDisplayServices = rData.nDisplayServices; - return *this; -} - -SvxLinguData_Impl::~SvxLinguData_Impl() -{ -} - -void SvxLinguData_Impl::SetChecked(const Sequence<OUString>& rConfiguredServices) -{ - const OUString* pConfiguredServices = rConfiguredServices.getConstArray(); - for(sal_Int32 n = 0; n < rConfiguredServices.getLength(); n++) - { - ServiceInfo_Impl* pEntry; - for (sal_uLong i = 0; i < nDisplayServices; ++i) - { - pEntry = &aDisplayServiceArr[i]; - if (pEntry && !pEntry->bConfigured) - { - const OUString &rSrvcImplName = pConfiguredServices[n]; - if (rSrvcImplName.getLength() && - (pEntry->sSpellImplName == rSrvcImplName || - pEntry->sGrammarImplName == rSrvcImplName || - pEntry->sHyphImplName == rSrvcImplName || - pEntry->sThesImplName == rSrvcImplName)) - { - pEntry->bConfigured = sal_True; - break; - } - } - } - } -} - -sal_Bool SvxLinguData_Impl::AddRemove( - Sequence< OUString > &rConfigured, - const OUString &rImplName, sal_Bool bAdd ) -{ - sal_Bool bRet = sal_False; // modified? - - sal_Int32 nEntries = rConfigured.getLength(); - sal_Int32 nPos = lcl_SeqGetEntryPos(rConfigured, rImplName); - if (bAdd && nPos < 0) // add new entry - { - rConfigured.realloc( ++nEntries ); - OUString *pConfigured = rConfigured.getArray(); - pConfigured = rConfigured.getArray(); - pConfigured[nEntries - 1] = rImplName; - bRet = sal_True; - } - else if (!bAdd && nPos >= 0) // remove existing entry - { - OUString *pConfigured = rConfigured.getArray(); - for (sal_Int32 i = nPos; i < nEntries - 1; ++i) - pConfigured[i] = pConfigured[i + 1]; - rConfigured.realloc(--nEntries); - bRet = sal_True; - } - - return bRet; -} - - -void SvxLinguData_Impl::Reconfigure( const OUString &rDisplayName, sal_Bool bEnable ) -{ - DBG_ASSERT( rDisplayName.getLength(), "empty DisplayName" ); - - ServiceInfo_Impl *pInfo = 0; - ServiceInfo_Impl *pTmp = 0; - for (sal_uLong i = 0; i < nDisplayServices; ++i) - { - pTmp = &aDisplayServiceArr[i]; - if (pTmp && pTmp->sDisplayName == rDisplayName) - { - pInfo = pTmp; - break; - } - } - DBG_ASSERT( pInfo, "DisplayName entry not found" ); - if (pInfo) - { - pInfo->bConfigured = bEnable; - - Sequence< Locale > aLocales; - const Locale *pLocale = 0; - sal_Int32 nLocales = 0; - sal_Int32 i; - - // update configured spellchecker entries - if (pInfo->xSpell.is()) - { - aLocales = pInfo->xSpell->getLocales(); - pLocale = aLocales.getConstArray(); - nLocales = aLocales.getLength(); - for (i = 0; i < nLocales; ++i) - { - sal_Int16 nLang = SvxLocaleToLanguage( pLocale[i] ); - if (!aCfgSpellTable.count( nLang ) && bEnable) - aCfgSpellTable[ nLang ] = Sequence< OUString >(); - if (aCfgSpellTable.count( nLang )) - AddRemove( aCfgSpellTable[ nLang ], pInfo->sSpellImplName, bEnable ); - } - } - - // update configured grammar checker entries - if (pInfo->xGrammar.is()) - { - aLocales = pInfo->xGrammar->getLocales(); - pLocale = aLocales.getConstArray(); - nLocales = aLocales.getLength(); - for (i = 0; i < nLocales; ++i) - { - sal_Int16 nLang = SvxLocaleToLanguage( pLocale[i] ); - if (!aCfgGrammarTable.count( nLang ) && bEnable) - aCfgGrammarTable[ nLang ] = Sequence< OUString >(); - if (aCfgGrammarTable.count( nLang )) - AddRemove( aCfgGrammarTable[ nLang ], pInfo->sGrammarImplName, bEnable ); - } - } - - // update configured hyphenator entries - if (pInfo->xHyph.is()) - { - aLocales = pInfo->xHyph->getLocales(); - pLocale = aLocales.getConstArray(); - nLocales = aLocales.getLength(); - for (i = 0; i < nLocales; ++i) - { - sal_Int16 nLang = SvxLocaleToLanguage( pLocale[i] ); - if (!aCfgHyphTable.count( nLang ) && bEnable) - aCfgHyphTable[ nLang ] = Sequence< OUString >(); - if (aCfgHyphTable.count( nLang )) - AddRemove( aCfgHyphTable[ nLang ], pInfo->sHyphImplName, bEnable ); - } - } - - // update configured spellchecker entries - if (pInfo->xThes.is()) - { - aLocales = pInfo->xThes->getLocales(); - pLocale = aLocales.getConstArray(); - nLocales = aLocales.getLength(); - for (i = 0; i < nLocales; ++i) - { - sal_Int16 nLang = SvxLocaleToLanguage( pLocale[i] ); - if (!aCfgThesTable.count( nLang ) && bEnable) - aCfgThesTable[ nLang ] = Sequence< OUString >(); - if (aCfgThesTable.count( nLang )) - AddRemove( aCfgThesTable[ nLang ], pInfo->sThesImplName, bEnable ); - } - } - } -} - - -// class SvxLinguTabPage ------------------------------------------------- - -#define CBCOL_FIRST 0 -#define CBCOL_SECOND 1 -#define CBCOL_BOTH 2 - -SvxLinguTabPage::SvxLinguTabPage( Window* pParent, - const SfxItemSet& rSet ): - - SfxTabPage( pParent, CUI_RES( RID_SFXPAGE_LINGU ), rSet ), - - aLinguisticFL ( this, CUI_RES( FL_LINGUISTIC ) ), - aLinguModulesFT ( this, CUI_RES( FT_LINGU_MODULES ) ), - aLinguModulesCLB ( this, CUI_RES( CLB_LINGU_MODULES ) ), - aLinguModulesEditPB ( this, CUI_RES( PB_LINGU_MODULES_EDIT ) ), - aLinguDicsFT ( this, CUI_RES( FT_LINGU_DICS ) ), - aLinguDicsCLB ( this, CUI_RES( CLB_LINGU_DICS ) ), - aLinguDicsNewPB ( this, CUI_RES( PB_LINGU_DICS_NEW_DIC ) ), - aLinguDicsEditPB ( this, CUI_RES( PB_LINGU_DICS_EDIT_DIC ) ), - aLinguDicsDelPB ( this, CUI_RES( PB_LINGU_DICS_DEL_DIC ) ), - aLinguOptionsFT ( this, CUI_RES( FT_LINGU_OPTIONS ) ), - aLinguOptionsCLB ( this, CUI_RES( CLB_LINGU_OPTIONS ) ), - aLinguOptionsEditPB ( this, CUI_RES( PB_LINGU_OPTIONS_EDIT ) ), - aMoreDictsLink ( this, CUI_RES( FT_LINGU_OPTIONS_MOREDICTS ) ), - sCapitalWords ( CUI_RES( STR_CAPITAL_WORDS ) ), - sWordsWithDigits ( CUI_RES( STR_WORDS_WITH_DIGITS ) ), - sCapitalization ( CUI_RES( STR_CAPITALIZATION ) ), - sSpellSpecial ( CUI_RES( STR_SPELL_SPECIAL ) ), - sSpellAuto ( CUI_RES( STR_SPELL_AUTO ) ), - sGrammarAuto ( CUI_RES( STR_GRAMMAR_AUTO ) ), - sNumMinWordlen ( CUI_RES( STR_NUM_MIN_WORDLEN ) ), - sNumPreBreak ( CUI_RES( STR_NUM_PRE_BREAK ) ), - sNumPostBreak ( CUI_RES( STR_NUM_POST_BREAK ) ), - sHyphAuto ( CUI_RES( STR_HYPH_AUTO ) ), - sHyphSpecial ( CUI_RES( STR_HYPH_SPECIAL ) ), - - pLinguData ( NULL ) -{ - pCheckButtonData = NULL; - - aLinguModulesCLB.SetStyle( aLinguModulesCLB.GetStyle()|WB_CLIPCHILDREN|WB_HSCROLL|WB_FORCE_MAKEVISIBLE ); - aLinguModulesCLB.SetHelpId(HID_CLB_LINGU_MODULES ); - aLinguModulesCLB.SetHighlightRange(); - aLinguModulesCLB.SetSelectHdl( LINK( this, SvxLinguTabPage, SelectHdl_Impl )); - aLinguModulesCLB.SetDoubleClickHdl(LINK(this, SvxLinguTabPage, BoxDoubleClickHdl_Impl)); - aLinguModulesCLB.SetCheckButtonHdl(LINK(this, SvxLinguTabPage, BoxCheckButtonHdl_Impl)); - - aLinguModulesEditPB.SetClickHdl( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); - aLinguOptionsEditPB.SetClickHdl( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); - - aLinguDicsCLB.SetStyle( aLinguDicsCLB.GetStyle()|WB_CLIPCHILDREN|WB_HSCROLL|WB_FORCE_MAKEVISIBLE ); - aLinguDicsCLB.SetHelpId(HID_CLB_EDIT_MODULES_DICS ); - aLinguDicsCLB.SetHighlightRange(); - aLinguDicsCLB.SetSelectHdl( LINK( this, SvxLinguTabPage, SelectHdl_Impl )); - aLinguDicsCLB.SetCheckButtonHdl(LINK(this, SvxLinguTabPage, BoxCheckButtonHdl_Impl)); - - aLinguDicsNewPB.SetClickHdl( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); - aLinguDicsEditPB.SetClickHdl( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); - aLinguDicsDelPB.SetClickHdl( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); - - aLinguOptionsCLB.SetStyle( aLinguOptionsCLB.GetStyle()|WB_CLIPCHILDREN|WB_HSCROLL|WB_FORCE_MAKEVISIBLE ); - aLinguOptionsCLB.SetHelpId(HID_CLB_LINGU_OPTIONS ); - aLinguOptionsCLB.SetHighlightRange(); - aLinguOptionsCLB.SetSelectHdl( LINK( this, SvxLinguTabPage, SelectHdl_Impl )); - aLinguOptionsCLB.SetDoubleClickHdl(LINK(this, SvxLinguTabPage, BoxDoubleClickHdl_Impl)); - - if ( SvtExtendedSecurityOptions().GetOpenHyperlinkMode() - != SvtExtendedSecurityOptions::OPEN_NEVER ) - { - aMoreDictsLink.SetURL( String( - RTL_CONSTASCII_USTRINGPARAM( "http://extensions.libreoffice.org/dictionary/" ) ) ); - aMoreDictsLink.SetClickHdl( LINK( this, SvxLinguTabPage, OpenURLHdl_Impl ) ); - } - else - aMoreDictsLink.Hide(); - - String sAccessibleNameModuleEdit( CUI_RES( STR_LINGU_MODULES_EDIT ) ); - String sAccessibleNameDicsEdit ( CUI_RES( STR_LINGU_DICS_EDIT_DIC ) ); - String sAccessibleNameOptionEdit( CUI_RES( STR_LINGU_OPTIONS_EDIT ) ); - - aLinguModulesEditPB.SetAccessibleName(sAccessibleNameModuleEdit); - aLinguDicsEditPB.SetAccessibleName(sAccessibleNameDicsEdit); - aLinguOptionsEditPB.SetAccessibleName(sAccessibleNameOptionEdit); - - // force recalculation of hash value used for checking the need of updating - // because new dictionaries might be installed / downloaded. - //! Thus it needs to be called now since it may infuence the supported languages - //! to be reported AND the found user-dictionaries(!) as well. - SvxLinguConfigUpdate::UpdateAll( sal_True ); - - xProp = uno::Reference< XPropertySet >( SvxGetLinguPropertySet(), UNO_QUERY ); - xDicList = uno::Reference< XDictionaryList >( SvxGetDictionaryList(), UNO_QUERY ); - if (xDicList.is()) - { - // keep references to all **currently** available dictionaries, - // since the diclist may get changed meanwhile (e.g. through the API). - // We want the dialog to operate on the same set of dictionaries it - // was started with. - // Also we have to take care to not loose the last reference when - // someone else removes a dictionary from the list. - // removed dics will be replaced by NULL new entries be added to the end - // Thus we may use indizes as consistent references. - aDics = xDicList->getDictionaries(); - - UpdateDicBox_Impl(); - } - else - { - aLinguDicsFT.Disable(); - aLinguDicsCLB.Disable(); - aLinguDicsNewPB.Disable(); - aLinguDicsEditPB.Disable(); - aLinguDicsDelPB.Disable(); - } - - const SfxSpellCheckItem* pItem = 0; - SfxItemState eItemState = SFX_ITEM_UNKNOWN; - - eItemState = rSet.GetItemState( GetWhich( SID_ATTR_SPELL ), - sal_False, (const SfxPoolItem**)&pItem ); - - // handelt es sich um ein Default-Item? - if ( eItemState == SFX_ITEM_DEFAULT ) - pItem = (const SfxSpellCheckItem*)&(rSet.Get( GetWhich( SID_ATTR_SPELL ) ) ); - else if ( eItemState == SFX_ITEM_DONTCARE ) - pItem = NULL; - - FreeResource(); -} - -// ----------------------------------------------------------------------- - -SvxLinguTabPage::~SvxLinguTabPage() -{ - if (pLinguData) - delete pLinguData; -} - -//------------------------------------------------------------------------ - -//nicht �berladen wegschmeissen -sal_uInt16* SvxLinguTabPage::GetRanges() -{ - //TL??? - return pRanges; -} - -//------------------------------------------------------------------------ - -SfxTabPage* SvxLinguTabPage::Create( Window* pParent, - const SfxItemSet& rAttrSet ) -{ - return ( new SvxLinguTabPage( pParent, rAttrSet ) ); -} - -//------------------------------------------------------------------------ - -Any lcl_Bool2Any(sal_Bool bVal) -{ - Any aRet(&bVal, ::getBooleanCppuType()); - return aRet; -} - - -sal_Bool lcl_Bool2Any(Any& rVal) -{ - return *(sal_Bool*)rVal.getValue(); -} - - -sal_Bool SvxLinguTabPage::FillItemSet( SfxItemSet& rCoreSet ) -{ - sal_Bool bModified = sal_True; // !!!! - - // if not HideGroups was called with GROUP_MODULES... - if (aLinguModulesCLB.IsVisible()) - { - DBG_ASSERT( pLinguData, "pLinguData not yet initialized" ); - if (!pLinguData) - pLinguData = new SvxLinguData_Impl; - - LangImplNameTable::const_iterator aIt; - - // update spellchecker configuration entries - const LangImplNameTable *pTable = &pLinguData->GetSpellTable(); - for (aIt = pTable->begin(); aIt != pTable->end(); ++aIt) - { - sal_Int16 nLang = aIt->first; - const Sequence< OUString > aImplNames( aIt->second ); -#if OSL_DEBUG_LEVEL > 1 - const OUString *pTmpStr; - pTmpStr = aImplNames.getConstArray(); -#endif - uno::Reference< XLinguServiceManager > xMgr( pLinguData->GetManager() ); - Locale aLocale( SvxCreateLocale(nLang) ); - if (xMgr.is()) - xMgr->setConfiguredServices( C2U(cSpell), aLocale, aImplNames ); - } - - // update grammar checker configuration entries - pTable = &pLinguData->GetGrammarTable(); - for (aIt = pTable->begin(); aIt != pTable->end(); ++aIt) - { - sal_Int16 nLang = aIt->first; - const Sequence< OUString > aImplNames( aIt->second ); -#if OSL_DEBUG_LEVEL > 1 - const OUString *pTmpStr; - pTmpStr = aImplNames.getConstArray(); -#endif - uno::Reference< XLinguServiceManager > xMgr( pLinguData->GetManager() ); - Locale aLocale( SvxCreateLocale(nLang) ); - if (xMgr.is()) - xMgr->setConfiguredServices( C2U(cGrammar), aLocale, aImplNames ); - } - - // update hyphenator configuration entries - pTable = &pLinguData->GetHyphTable(); - for (aIt = pTable->begin(); aIt != pTable->end(); ++aIt) - { - sal_Int16 nLang = aIt->first; - const Sequence< OUString > aImplNames( aIt->second ); -#if OSL_DEBUG_LEVEL > 1 - const OUString *pTmpStr; - pTmpStr = aImplNames.getConstArray(); -#endif - uno::Reference< XLinguServiceManager > xMgr( pLinguData->GetManager() ); - Locale aLocale( SvxCreateLocale(nLang) ); - if (xMgr.is()) - xMgr->setConfiguredServices( C2U(cHyph), aLocale, aImplNames ); - } - - // update thesaurus configuration entries - pTable = &pLinguData->GetThesTable(); - for (aIt = pTable->begin(); aIt != pTable->end(); ++aIt) - { - sal_Int16 nLang = aIt->first; - const Sequence< OUString > aImplNames( aIt->second ); -#if OSL_DEBUG_LEVEL > 1 - const OUString *pTmpStr; - pTmpStr = aImplNames.getConstArray(); -#endif - uno::Reference< XLinguServiceManager > xMgr( pLinguData->GetManager() ); - Locale aLocale( SvxCreateLocale(nLang) ); - if (xMgr.is()) - xMgr->setConfiguredServices( C2U(cThes), aLocale, aImplNames ); - } - } - - - // - // activate dictionaries according to checkbox state - // - Sequence< OUString > aActiveDics; - sal_Int32 nActiveDics = 0; - sal_uLong nEntries = aLinguDicsCLB.GetEntryCount(); - for (sal_uLong i = 0; i < nEntries; ++i) - { - sal_Int32 nDics = aDics.getLength(); - - aActiveDics.realloc( nDics ); - OUString *pActiveDic = aActiveDics.getArray(); - - SvLBoxEntry *pEntry = aLinguDicsCLB.GetEntry( i ); - if (pEntry) - { - DicUserData aData( (sal_uLong)pEntry->GetUserData() ); - if (aData.GetEntryId() < nDics) - { - sal_Bool bChecked = aLinguDicsCLB.IsChecked( (sal_uInt16) i ); - uno::Reference< XDictionary > xDic( aDics.getConstArray()[ i ] ); - if (xDic.is()) - { - if (SvxGetIgnoreAllList() == xDic) - bChecked = sal_True; - xDic->setActive( bChecked ); - - if (bChecked) - { - String aDicName( xDic->getName() ); - pActiveDic[ nActiveDics++ ] = aDicName; - } - } - } - } - } - - aActiveDics.realloc( nActiveDics ); - Any aTmp; - aTmp <<= aActiveDics; - SvtLinguConfig aLngCfg; - aLngCfg.SetProperty( UPH_ACTIVE_DICTIONARIES, aTmp ); - - - nEntries = aLinguOptionsCLB.GetEntryCount(); - for (sal_uInt16 j = 0; j < nEntries; ++j) - { - SvLBoxEntry *pEntry = aLinguOptionsCLB.GetEntry( j ); - - OptionsUserData aData( (sal_uLong)pEntry->GetUserData() ); - String aPropName( lcl_GetPropertyName( (EID_OPTIONS) aData.GetEntryId() ) ); - - Any aAny; - if (aData.IsCheckable()) - { - sal_Bool bChecked = aLinguOptionsCLB.IsChecked( j ); - aAny <<= bChecked; - } - else if (aData.HasNumericValue()) - { - sal_Int16 nVal = aData.GetNumericValue(); - aAny <<= nVal; - } - - if (xProp.is()) - xProp->setPropertyValue( aPropName, aAny ); - aLngCfg.SetProperty( aPropName, aAny ); - } - - SvLBoxEntry *pPreBreakEntry = aLinguOptionsCLB.GetEntry( (sal_uInt16) EID_NUM_PRE_BREAK ); - SvLBoxEntry *pPostBreakEntry = aLinguOptionsCLB.GetEntry( (sal_uInt16) EID_NUM_POST_BREAK ); - DBG_ASSERT( pPreBreakEntry, "NULL Pointer" ); - DBG_ASSERT( pPostBreakEntry, "NULL Pointer" ); - if (pPreBreakEntry && pPostBreakEntry) - { - OptionsUserData aPreBreakData( (sal_uLong)pPreBreakEntry->GetUserData() ); - OptionsUserData aPostBreakData( (sal_uLong)pPostBreakEntry->GetUserData() ); - if ( aPreBreakData.IsModified() || aPostBreakData.IsModified() ) - { - SfxHyphenRegionItem aHyp( GetWhich( SID_ATTR_HYPHENREGION ) ); - aHyp.GetMinLead() = (sal_uInt8) aPreBreakData.GetNumericValue(); - aHyp.GetMinTrail() = (sal_uInt8) aPostBreakData.GetNumericValue(); - rCoreSet.Put( aHyp ); - } - } - - - // automatic spell checking - sal_Bool bNewAutoCheck = aLinguOptionsCLB.IsChecked( (sal_uInt16) EID_SPELL_AUTO ); - const SfxPoolItem* pOld = GetOldItem( rCoreSet, SID_AUTOSPELL_CHECK ); - if ( !pOld || ( (SfxBoolItem*)pOld )->GetValue() != bNewAutoCheck ) - { - rCoreSet.Put( SfxBoolItem( GetWhich( SID_AUTOSPELL_CHECK ), - bNewAutoCheck ) ); - bModified |= sal_True; - } - - return bModified; -} - -// ---------------------------------------------------------------------- - -sal_uLong SvxLinguTabPage::GetDicUserData( const uno::Reference< XDictionary > &rxDic, sal_uInt16 nIdx ) -{ - sal_uLong nRes = 0; - DBG_ASSERT( rxDic.is(), "dictionary not supplied" ); - if (rxDic.is()) - { - uno::Reference< frame::XStorable > xStor( rxDic, UNO_QUERY ); - - sal_Bool bChecked = rxDic->isActive(); - sal_Bool bEditable = !xStor.is() || !xStor->isReadonly(); - sal_Bool bDeletable = bEditable; - - nRes = DicUserData( nIdx, - bChecked, bEditable, bDeletable ).GetUserData(); - } - return nRes; -} - - -void SvxLinguTabPage::AddDicBoxEntry( - const uno::Reference< XDictionary > &rxDic, - sal_uInt16 nIdx ) -{ - aLinguDicsCLB.SetUpdateMode(sal_False); - - String aTxt( ::GetDicInfoStr( rxDic->getName(), - SvxLocaleToLanguage( rxDic->getLocale() ), - DictionaryType_NEGATIVE == rxDic->getDictionaryType() ) ); - aLinguDicsCLB.InsertEntry( aTxt, (sal_uInt16)LISTBOX_APPEND ); // append at end - SvLBoxEntry* pEntry = aLinguDicsCLB.GetEntry( aLinguDicsCLB.GetEntryCount() - 1 ); - DBG_ASSERT( pEntry, "failed to add entry" ); - if (pEntry) - { - DicUserData aData( GetDicUserData( rxDic, nIdx ) ); - pEntry->SetUserData( (void *) aData.GetUserData() ); - lcl_SetCheckButton( pEntry, aData.IsChecked() ); - } - - aLinguDicsCLB.SetUpdateMode(sal_True); -} - -// ---------------------------------------------------------------------- - -void SvxLinguTabPage::UpdateDicBox_Impl() -{ - aLinguDicsCLB.SetUpdateMode(sal_False); - aLinguDicsCLB.Clear(); - - sal_Int32 nDics = aDics.getLength(); - const uno::Reference< XDictionary > *pDic = aDics.getConstArray(); - for (sal_Int32 i = 0; i < nDics; ++i) - { - const uno::Reference< XDictionary > &rDic = pDic[i]; - if (rDic.is()) - AddDicBoxEntry( rDic, (sal_uInt16)i ); - } - - aLinguDicsCLB.SetUpdateMode(sal_True); -} - -// ---------------------------------------------------------------------- - -void SvxLinguTabPage::UpdateModulesBox_Impl() -{ - if (pLinguData) - { - const ServiceInfoArr &rAllDispSrvcArr = pLinguData->GetDisplayServiceArray(); - const sal_uLong nDispSrvcCount = pLinguData->GetDisplayServiceCount(); - - aLinguModulesCLB.Clear(); - - for (sal_uInt16 i = 0; i < nDispSrvcCount; ++i) - { - const ServiceInfo_Impl &rInfo = rAllDispSrvcArr[i]; - aLinguModulesCLB.InsertEntry( rInfo.sDisplayName, (sal_uInt16)LISTBOX_APPEND ); - SvLBoxEntry* pEntry = aLinguModulesCLB.GetEntry(i); - pEntry->SetUserData( (void *) &rInfo ); - aLinguModulesCLB.CheckEntryPos( i, rInfo.bConfigured ); - } - aLinguModulesEditPB.Enable( nDispSrvcCount > 0 ); - } -} - -//------------------------------------------------------------------------ - -void SvxLinguTabPage::Reset( const SfxItemSet& rSet ) -{ - // if not HideGroups was called with GROUP_MODULES... - if (aLinguModulesCLB.IsVisible()) - { - if (!pLinguData) - pLinguData = new SvxLinguData_Impl; - UpdateModulesBox_Impl(); - } - - - // - // get data from configuration - // - - SvtLinguConfig aLngCfg; - - aLinguOptionsCLB.SetUpdateMode(sal_False); - aLinguOptionsCLB.Clear(); - - SvLBoxTreeList *pModel = aLinguOptionsCLB.GetModel(); - SvLBoxEntry* pEntry = NULL; - - sal_Int16 nVal = 0; - sal_Bool bVal = sal_False; - sal_uLong nUserData = 0; - - pEntry = CreateEntry( sSpellAuto, CBCOL_FIRST ); - aLngCfg.GetProperty( C2U(UPN_IS_SPELL_AUTO) ) >>= bVal; - const SfxPoolItem* pItem = GetItem( rSet, SID_AUTOSPELL_CHECK ); - if (pItem) - bVal = ((SfxBoolItem *) pItem)->GetValue(); - nUserData = OptionsUserData( EID_SPELL_AUTO, sal_False, 0, sal_True, bVal).GetUserData(); - pEntry->SetUserData( (void *)nUserData ); - pModel->Insert( pEntry ); - lcl_SetCheckButton( pEntry, bVal ); - - pEntry = CreateEntry( sGrammarAuto, CBCOL_FIRST ); - aLngCfg.GetProperty( C2U(UPN_IS_GRAMMAR_AUTO) ) >>= bVal; - nUserData = OptionsUserData( EID_GRAMMAR_AUTO, sal_False, 0, sal_True, bVal).GetUserData(); - pEntry->SetUserData( (void *)nUserData ); - pModel->Insert( pEntry ); - lcl_SetCheckButton( pEntry, bVal ); - - pEntry = CreateEntry( sCapitalWords, CBCOL_FIRST ); - aLngCfg.GetProperty( C2U(UPN_IS_SPELL_UPPER_CASE) ) >>= bVal; - nUserData = OptionsUserData( EID_CAPITAL_WORDS, sal_False, 0, sal_True, bVal).GetUserData(); - pEntry->SetUserData( (void *)nUserData ); - pModel->Insert( pEntry ); - lcl_SetCheckButton( pEntry, bVal ); - - pEntry = CreateEntry( sWordsWithDigits, CBCOL_FIRST ); - aLngCfg.GetProperty( C2U(UPN_IS_SPELL_WITH_DIGITS) ) >>= bVal; - nUserData = OptionsUserData( EID_WORDS_WITH_DIGITS, sal_False, 0, sal_True, bVal).GetUserData(); - pEntry->SetUserData( (void *)nUserData ); - pModel->Insert( pEntry ); - lcl_SetCheckButton( pEntry, bVal ); - - pEntry = CreateEntry( sCapitalization, CBCOL_FIRST ); - aLngCfg.GetProperty( C2U(UPN_IS_SPELL_CAPITALIZATION) ) >>= bVal; - nUserData = OptionsUserData( EID_CAPITALIZATION, sal_False, 0, sal_True, bVal).GetUserData(); - pEntry->SetUserData( (void *)nUserData ); - pModel->Insert( pEntry ); - lcl_SetCheckButton( pEntry, bVal ); - - pEntry = CreateEntry( sSpellSpecial, CBCOL_FIRST ); - aLngCfg.GetProperty( C2U(UPN_IS_SPELL_SPECIAL) ) >>= bVal; - nUserData = OptionsUserData( EID_SPELL_SPECIAL, sal_False, 0, sal_True, bVal).GetUserData(); - pEntry->SetUserData( (void *)nUserData ); - pModel->Insert( pEntry ); - lcl_SetCheckButton( pEntry, bVal ); - - pEntry = CreateEntry( sNumMinWordlen, CBCOL_SECOND ); - aLngCfg.GetProperty( C2U(UPN_HYPH_MIN_WORD_LENGTH) ) >>= nVal; - nUserData = OptionsUserData( EID_NUM_MIN_WORDLEN, sal_True, (sal_uInt16)nVal, sal_False, sal_False).GetUserData(); - pEntry->SetUserData( (void *)nUserData ); - pModel->Insert( pEntry ); - - const SfxHyphenRegionItem *pHyp = NULL; - sal_uInt16 nWhich = GetWhich( SID_ATTR_HYPHENREGION ); - if ( rSet.GetItemState( nWhich, sal_False ) == SFX_ITEM_SET ) - pHyp = &( (const SfxHyphenRegionItem &) rSet.Get( nWhich ) ); - - pEntry = CreateEntry( sNumPreBreak, CBCOL_SECOND ); - aLngCfg.GetProperty( C2U(UPN_HYPH_MIN_LEADING) ) >>= nVal; - if (pHyp) - nVal = (sal_Int16) pHyp->GetMinLead(); - nUserData = OptionsUserData( EID_NUM_PRE_BREAK, sal_True, (sal_uInt16)nVal, sal_False, sal_False).GetUserData(); - pEntry->SetUserData( (void *)nUserData ); - pModel->Insert( pEntry ); - - pEntry = CreateEntry( sNumPostBreak, CBCOL_SECOND ); - aLngCfg.GetProperty( C2U(UPN_HYPH_MIN_TRAILING) ) >>= nVal; - if (pHyp) - nVal = (sal_Int16) pHyp->GetMinTrail(); - nUserData = OptionsUserData( EID_NUM_POST_BREAK, sal_True, (sal_uInt16)nVal, sal_False, sal_False).GetUserData(); - pEntry->SetUserData( (void *)nUserData ); - pModel->Insert( pEntry ); - - pEntry = CreateEntry( sHyphAuto, CBCOL_FIRST ); - aLngCfg.GetProperty( C2U(UPN_IS_HYPH_AUTO) ) >>= bVal; - nUserData = OptionsUserData( EID_HYPH_AUTO, sal_False, 0, sal_True, bVal).GetUserData(); - pEntry->SetUserData( (void *)nUserData ); - pModel->Insert( pEntry ); - lcl_SetCheckButton( pEntry, bVal ); - - pEntry = CreateEntry( sHyphSpecial, CBCOL_FIRST ); - aLngCfg.GetProperty( C2U(UPN_IS_HYPH_SPECIAL) ) >>= bVal; - nUserData = OptionsUserData( EID_HYPH_SPECIAL, sal_False, 0, sal_True, bVal).GetUserData(); - pEntry->SetUserData( (void *)nUserData ); - pModel->Insert( pEntry ); - lcl_SetCheckButton( pEntry, bVal ); - - aLinguOptionsCLB.SetUpdateMode(sal_True); -} - -// ----------------------------------------------------------------------- - -IMPL_LINK( SvxLinguTabPage, BoxDoubleClickHdl_Impl, SvTreeListBox *, pBox ) -{ - if (pBox == &aLinguModulesCLB) - { - //! in order to avoid a bug causing a GPF when double clicking - //! on a module entry and exiting the "Edit Modules" dialog - //! after that. - Application::PostUserEvent( LINK( - this, SvxLinguTabPage, PostDblClickHdl_Impl ) ); - } - else if (pBox == &aLinguOptionsCLB) - { - ClickHdl_Impl(&aLinguOptionsEditPB); - } - return 0; -} - -// ----------------------------------------------------------------------- - -IMPL_LINK( SvxLinguTabPage, PostDblClickHdl_Impl, SvTreeListBox *, EMPTYARG ) -{ - ClickHdl_Impl(&aLinguModulesEditPB); - return 0; -} - -// ----------------------------------------------------------------------- - -IMPL_LINK( SvxLinguTabPage, OpenURLHdl_Impl, svt::FixedHyperlink *, EMPTYARG ) -{ - ::rtl::OUString sURL( aMoreDictsLink.GetURL() ); - lcl_OpenURL( sURL ); - return 0; -} - -// ----------------------------------------------------------------------- - -IMPL_LINK( SvxLinguTabPage, BoxCheckButtonHdl_Impl, SvTreeListBox *, pBox ) -{ - if (pBox == &aLinguModulesCLB) - { - DBG_ASSERT( pLinguData, "NULL pointer, LinguData missing" ); - sal_uInt16 nPos = aLinguModulesCLB.GetSelectEntryPos(); - if (nPos != LISTBOX_ENTRY_NOTFOUND && pLinguData) - { - pLinguData->Reconfigure( aLinguModulesCLB.GetText( nPos ), - aLinguModulesCLB.IsChecked( nPos ) ); - } - } - else if (pBox == &aLinguDicsCLB) - { - sal_uInt16 nPos = aLinguDicsCLB.GetSelectEntryPos(); - if (nPos != LISTBOX_ENTRY_NOTFOUND) - { - const uno::Reference< XDictionary > &rDic = aDics.getConstArray()[ nPos ]; - if (SvxGetIgnoreAllList() == rDic) - { - SvLBoxEntry* pEntry = aLinguDicsCLB.GetEntry( nPos ); - if (pEntry) - lcl_SetCheckButton( pEntry, sal_True ); - } - } - } - return 0; -} - -// ----------------------------------------------------------------------- - -IMPL_LINK( SvxLinguTabPage, ClickHdl_Impl, PushButton *, pBtn ) -{ - if (&aLinguModulesEditPB == pBtn) - { - if (!pLinguData) - pLinguData = new SvxLinguData_Impl; - - SvxLinguData_Impl aOldLinguData( *pLinguData ); - SvxEditModulesDlg aDlg( this, *pLinguData ); - if (aDlg.Execute() != RET_OK) - *pLinguData = aOldLinguData; - - // evaluate new status of 'bConfigured' flag - sal_uLong nLen = pLinguData->GetDisplayServiceCount(); - for (sal_uLong i = 0; i < nLen; ++i) - pLinguData->GetDisplayServiceArray()[i].bConfigured = sal_False; - const Locale* pAllLocales = pLinguData->GetAllSupportedLocales().getConstArray(); - sal_Int32 nLocales = pLinguData->GetAllSupportedLocales().getLength(); - for (sal_Int32 k = 0; k < nLocales; ++k) - { - sal_Int16 nLang = SvxLocaleToLanguage( pAllLocales[k] ); - if (pLinguData->GetSpellTable().count( nLang )) - pLinguData->SetChecked( pLinguData->GetSpellTable()[ nLang ] ); - if (pLinguData->GetGrammarTable().count( nLang )) - pLinguData->SetChecked( pLinguData->GetGrammarTable()[ nLang ] ); - if (pLinguData->GetHyphTable().count( nLang )) - pLinguData->SetChecked( pLinguData->GetHyphTable()[ nLang ] ); - if (pLinguData->GetThesTable().count( nLang )) - pLinguData->SetChecked( pLinguData->GetThesTable()[ nLang ] ); - } - - // show new status of modules - UpdateModulesBox_Impl(); - } - else if (&aLinguDicsNewPB == pBtn) - { - uno::Reference< XSpellChecker1 > xSpellChecker1; - SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); - if(pFact) - { - AbstractSvxNewDictionaryDialog* aDlg = pFact->CreateSvxNewDictionaryDialog( this, xSpellChecker1, RID_SFXDLG_NEWDICT ); - DBG_ASSERT(aDlg, "Dialogdiet fail!"); - uno::Reference< XDictionary > xNewDic; - if ( aDlg->Execute() == RET_OK ) - xNewDic = uno::Reference< XDictionary >( aDlg->GetNewDictionary(), UNO_QUERY ); - if ( xNewDic.is() ) - { - // add new dics to the end - sal_Int32 nLen = aDics.getLength(); - aDics.realloc( nLen + 1 ); - - aDics.getArray()[ nLen ] = xNewDic; - - AddDicBoxEntry( xNewDic, (sal_uInt16) nLen ); - } - delete aDlg; - } - } - else if (&aLinguDicsEditPB == pBtn) - { - SvLBoxEntry *pEntry = aLinguDicsCLB.GetCurEntry(); - if (pEntry) - { - DicUserData aData( (sal_uLong) pEntry->GetUserData() ); - sal_uInt16 nDicPos = aData.GetEntryId(); - sal_Int32 nDics = aDics.getLength(); - if (nDicPos < nDics) - { - uno::Reference< XDictionary > xDic; - xDic = aDics.getConstArray()[ nDicPos ]; - if (xDic.is()) - { - uno::Reference< XSpellChecker1 > xSpellChecker1; - SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); - if(pFact) - { - VclAbstractDialog* aDlg = pFact->CreateSvxEditDictionaryDialog( this, xDic->getName(), xSpellChecker1, RID_SFXDLG_EDITDICT ); - DBG_ASSERT(aDlg, "Dialogdiet fail!"); - aDlg->Execute(); - delete aDlg; - } - } - } - } - } - else if (&aLinguDicsDelPB == pBtn) - { - if ( RET_NO == - QueryBox( this, CUI_RES( RID_SFXQB_DELDICT ) ).Execute() ) - return 0; - - SvLBoxEntry *pEntry = aLinguDicsCLB.GetCurEntry(); - if (pEntry) - { - DicUserData aData( (sal_uLong) pEntry->GetUserData() ); - sal_uInt16 nDicPos = aData.GetEntryId(); - sal_Int32 nDics = aDics.getLength(); - if (nDicPos < nDics) - { - uno::Reference< XDictionary > xDic; - xDic = aDics.getConstArray()[ nDicPos ]; - if (xDic.is()) - { - if (SvxGetIgnoreAllList() == xDic) - xDic->clear(); - else - { - if (xDicList.is()) - xDicList->removeDictionary( xDic ); - - uno::Reference< frame::XStorable > xStor( xDic, UNO_QUERY ); - if ( xStor->hasLocation() && !xStor->isReadonly() ) - { - String sURL = xStor->getLocation(); - INetURLObject aObj(sURL); - DBG_ASSERT( aObj.GetProtocol() == INET_PROT_FILE, - "non-file URLs cannot be deleted" ); - if ( aObj.GetProtocol() == INET_PROT_FILE ) - { - KillFile_Impl( aObj.GetMainURL( INetURLObject::NO_DECODE ) ); - } - } - - aDics.getArray()[ nDicPos ] = 0; - - // remove entry from checklistbox - sal_uLong nCnt = aLinguDicsCLB.GetEntryCount(); - for (sal_uLong i = 0; i < nCnt; ++i) - { - SvLBoxEntry *pDicEntry = aLinguDicsCLB.GetEntry( i ); - DBG_ASSERT( pDicEntry, "missing entry" ); - if (pDicEntry) - { - DicUserData aDicData( (sal_uLong) pDicEntry->GetUserData() ); - if (aDicData.GetEntryId() == nDicPos ) - { - aLinguDicsCLB.RemoveEntry( (sal_uInt16) i ); - break; - } - } - } - DBG_ASSERT( nCnt > aLinguDicsCLB.GetEntryCount(), - "remove failed ?"); - } - } - } - } - } - else if (&aLinguOptionsEditPB == pBtn) - { - SvLBoxEntry *pEntry = aLinguOptionsCLB.GetCurEntry(); - DBG_ASSERT( pEntry, "no entry selected" ); - if (pEntry) - { - OptionsUserData aData( (sal_uLong)pEntry->GetUserData() ); - if(aData.HasNumericValue()) - { - int nRID = -1; - switch (aData.GetEntryId()) - { - case EID_NUM_PRE_BREAK : nRID = STR_NUM_PRE_BREAK_DLG; break; - case EID_NUM_POST_BREAK : nRID = STR_NUM_POST_BREAK_DLG; break; - case EID_NUM_MIN_WORDLEN: nRID = STR_NUM_MIN_WORDLEN_DLG; break; - default: - OSL_FAIL( "unexpected case" ); - } - - OptionsBreakSet aDlg( this, nRID ); - aDlg.GetNumericFld().SetValue( aData.GetNumericValue() ); - if (RET_OK == aDlg.Execute() ) - { - long nVal = static_cast<long>(aDlg.GetNumericFld().GetValue()); - if (-1 != nVal && aData.GetNumericValue() != nVal) - { - aData.SetNumericValue( (sal_uInt8)nVal ); //! sets IsModified ! - pEntry->SetUserData( (void *) aData.GetUserData() ); - aLinguOptionsCLB.Invalidate(); - } - } - } - } - } - else - { - OSL_FAIL( "pBtn unexpected value" ); - } - - return 0; -} - -// ----------------------------------------------------------------------- - -IMPL_LINK( SvxLinguTabPage, SelectHdl_Impl, SvxCheckListBox *, pBox ) -{ - if (&aLinguModulesCLB == pBox) - { - } - else if (&aLinguDicsCLB == pBox) - { - SvLBoxEntry *pEntry = pBox->GetCurEntry(); - if (pEntry) - { - DicUserData aData( (sal_uLong) pEntry->GetUserData() ); - - // always allow to edit (i.e. at least view the content of the dictionary) - aLinguDicsEditPB.Enable( true/*aData.IsEditable()*/ ); - aLinguDicsDelPB .Enable( aData.IsDeletable() ); - } - } - else if (&aLinguOptionsCLB == pBox) - { - SvLBoxEntry *pEntry = pBox->GetCurEntry(); - if (pEntry) - { - OptionsUserData aData( (sal_uLong) pEntry->GetUserData() ); - aLinguOptionsEditPB.Enable( aData.HasNumericValue() ); - } - } - else - { - OSL_FAIL( "pBox unexpected value" ); - } - - return 0; -} - -// ----------------------------------------------------------------------- - -SvLBoxEntry* SvxLinguTabPage::CreateEntry( String& rTxt, sal_uInt16 nCol ) -{ - SvLBoxEntry* pEntry = new SvLBoxEntry; - - if( !pCheckButtonData ) - pCheckButtonData = new SvLBoxButtonData( &aLinguOptionsCLB ); - - String sEmpty; - if (CBCOL_FIRST == nCol) - pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) ); - if (CBCOL_SECOND == nCol) - pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) ); // Leerspalte - pEntry->AddItem( new SvLBoxContextBmp( pEntry, 0, Image(), Image(), 0)); // Sonst Puff! - pEntry->AddItem( new BrwString_Impl( pEntry, 0, rTxt ) ); - - return pEntry; -} - -// ----------------------------------------------------------------------- - -void SvxLinguTabPage::HideGroups( sal_uInt16 nGrp ) -{ - if ( 0 != ( GROUP_MODULES & nGrp ) ) - { - aLinguModulesFT.Hide(); - aLinguModulesCLB.Hide(); - aLinguModulesEditPB.Hide(); - - // reposition / resize remaining controls - long nDeltaY = aLinguDicsFT.GetPosPixel().Y() - - aLinguModulesFT.GetPosPixel().Y(); - DBG_ASSERT( nDeltaY >= 0, "move/resize value is negative" ); - Point aPos; - - aPos = aLinguDicsFT.GetPosPixel(); - aPos.Y() -= nDeltaY; - aLinguDicsFT.SetPosPixel( aPos ); - aPos = aLinguDicsCLB.GetPosPixel(); - aPos.Y() -= nDeltaY; - aLinguDicsCLB.SetPosPixel( aPos ); - aPos = aLinguDicsNewPB.GetPosPixel(); - aPos.Y() -= nDeltaY; - aLinguDicsNewPB.SetPosPixel( aPos ); - aPos = aLinguDicsEditPB.GetPosPixel(); - aPos.Y() -= nDeltaY; - aLinguDicsEditPB.SetPosPixel( aPos ); - aPos = aLinguDicsDelPB.GetPosPixel(); - aPos.Y() -= nDeltaY; - aLinguDicsDelPB.SetPosPixel( aPos ); - - aPos = aLinguOptionsFT.GetPosPixel(); - aPos.Y() -= nDeltaY; - aLinguOptionsFT.SetPosPixel( aPos ); - aPos = aLinguOptionsCLB.GetPosPixel(); - aPos.Y() -= nDeltaY; - aLinguOptionsCLB.SetPosPixel( aPos ); - aPos = aLinguOptionsEditPB.GetPosPixel(); - aPos.Y() -= nDeltaY; - aLinguOptionsEditPB.SetPosPixel( aPos ); - - Size aSize( aLinguOptionsCLB.GetSizePixel() ); - aSize.Height() += nDeltaY; - aLinguOptionsCLB.SetSizePixel( aSize ); - - if ( SvtExtendedSecurityOptions().GetOpenHyperlinkMode() - != SvtExtendedSecurityOptions::OPEN_NEVER ) - { - aSize = GetOutputSizePixel(); - aSize.Height() += ( aMoreDictsLink.GetSizePixel().Height() * 11 / 8 ); - SetSizePixel( aSize ); - aMoreDictsLink.Show(); - } - } -} - -SvxEditModulesDlg::SvxEditModulesDlg(Window* pParent, SvxLinguData_Impl& rData) : - ModalDialog( pParent, CUI_RES(RID_SVXDLG_EDIT_MODULES ) ), - aModulesFL ( this, CUI_RES( FL_EDIT_MODULES_OPTIONS ) ), - aLanguageFT ( this, CUI_RES( FT_EDIT_MODULES_LANGUAGE ) ), - aLanguageLB ( this, CUI_RES( LB_EDIT_MODULES_LANGUAGE ), sal_False ), - aModulesCLB ( this, CUI_RES( CLB_EDIT_MODULES_MODULES ) ), - aPrioUpPB ( this, CUI_RES( PB_EDIT_MODULES_PRIO_UP ) ), - aPrioDownPB ( this, CUI_RES( PB_EDIT_MODULES_PRIO_DOWN ) ), - aBackPB ( this, CUI_RES( PB_EDIT_MODULES_PRIO_BACK ) ), - aMoreDictsLink ( this, CUI_RES( FT_EDIT_MODULES_NEWDICTSLINK ) ), - aButtonsFL ( this, CUI_RES( FL_EDIT_MODULES_BUTTONS ) ), - aHelpPB ( this, CUI_RES( PB_HELP ) ), - aClosePB ( this, CUI_RES( PB_OK ) ), - sSpell ( CUI_RES( ST_SPELL ) ), - sHyph ( CUI_RES( ST_HYPH ) ), - sThes ( CUI_RES( ST_THES ) ), - sGrammar ( CUI_RES( ST_GRAMMAR ) ), - rLinguData ( rData ) -{ - pCheckButtonData = NULL; - FreeResource(); - - pDefaultLinguData = new SvxLinguData_Impl( rLinguData ); - - aModulesCLB.SetStyle( aModulesCLB.GetStyle()|WB_CLIPCHILDREN|WB_HSCROLL|WB_FORCE_MAKEVISIBLE ); - aModulesCLB.SetHighlightRange(); - aModulesCLB.SetHelpId(HID_CLB_EDIT_MODULES_MODULES ); - aModulesCLB.SetSelectHdl( LINK( this, SvxEditModulesDlg, SelectHdl_Impl )); - aModulesCLB.SetCheckButtonHdl( LINK( this, SvxEditModulesDlg, BoxCheckButtonHdl_Impl) ); - - aClosePB .SetClickHdl( LINK( this, SvxEditModulesDlg, ClickHdl_Impl )); - aPrioUpPB .SetClickHdl( LINK( this, SvxEditModulesDlg, UpDownHdl_Impl )); - aPrioDownPB.SetClickHdl( LINK( this, SvxEditModulesDlg, UpDownHdl_Impl )); - aBackPB .SetClickHdl( LINK( this, SvxEditModulesDlg, BackHdl_Impl )); - // in case of not installed language modules - aPrioUpPB .Enable( sal_False ); - aPrioDownPB.Enable( sal_False ); - - if ( SvtExtendedSecurityOptions().GetOpenHyperlinkMode() - != SvtExtendedSecurityOptions::OPEN_NEVER ) - { - aMoreDictsLink.SetURL( String( - RTL_CONSTASCII_USTRINGPARAM( "http://extensions.libreoffice.org/dictionary/" ) ) ); - aMoreDictsLink.SetClickHdl( LINK( this, SvxEditModulesDlg, OpenURLHdl_Impl ) ); - } - else - { - aMoreDictsLink.Hide(); - long nPos = aMoreDictsLink.GetPosPixel().Y() + aMoreDictsLink.GetSizePixel().Height(); - Size aSize = aModulesCLB.GetSizePixel(); - aSize.Height() += ( nPos - ( aModulesCLB.GetPosPixel().Y() + aSize.Height() ) ); - aModulesCLB.SetSizePixel( aSize ); - } - - // - //fill language box - // - Sequence< sal_Int16 > aAvailLang; - uno::Reference< XAvailableLocales > xAvail( rLinguData.GetManager(), UNO_QUERY ); - if (xAvail.is()) - { - aAvailLang = lcl_LocaleSeqToLangSeq( - xAvail->getAvailableLocales( C2U(cSpell) ) ); - } - const Sequence< Locale >& rLoc = rLinguData.GetAllSupportedLocales(); - const Locale* pLocales = rLoc.getConstArray(); - aLanguageLB.Clear(); - for(long i = 0; i < rLoc.getLength(); i++) - { - sal_Int16 nLang = SvxLocaleToLanguage( pLocales[i] ); - aLanguageLB.InsertLanguage( nLang, lcl_SeqHasLang( aAvailLang, nLang ) ); - } - LanguageType eSysLang = MsLangId::getSystemLanguage(); - aLanguageLB.SelectLanguage( eSysLang ); - if(!aLanguageLB.IsLanguageSelected( eSysLang ) ) - aLanguageLB.SelectEntryPos(0); - - aLanguageLB.SetSelectHdl( LINK( this, SvxEditModulesDlg, LangSelectHdl_Impl )); - LangSelectHdl_Impl(&aLanguageLB); -} - - -SvxEditModulesDlg::~SvxEditModulesDlg() -{ - delete pDefaultLinguData; -} - - -SvLBoxEntry* SvxEditModulesDlg::CreateEntry( String& rTxt, sal_uInt16 nCol ) -{ - SvLBoxEntry* pEntry = new SvLBoxEntry; - if( !pCheckButtonData ) - { - pCheckButtonData = new SvLBoxButtonData( &aModulesCLB ); - pCheckButtonData->SetLink( aModulesCLB.GetCheckButtonHdl() ); - } - - String sEmpty; - if (CBCOL_FIRST == nCol) - pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) ); - if (CBCOL_SECOND == nCol) - pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) ); // Leerspalte - pEntry->AddItem( new SvLBoxContextBmp( pEntry, 0, Image(), Image(), 0)); // Sonst Puff! - pEntry->AddItem( new BrwStringDic_Impl( pEntry, 0, rTxt ) ); - - return pEntry; -} - -IMPL_LINK( SvxEditModulesDlg, SelectHdl_Impl, SvxCheckListBox *, pBox ) -{ - if (&aModulesCLB == pBox) - { - sal_Bool bDisableUp = sal_True; - sal_Bool bDisableDown = sal_True; - SvLBoxEntry *pEntry = pBox->GetCurEntry(); - if (pEntry) - { - ModuleUserData_Impl* pData = (ModuleUserData_Impl*)pEntry->GetUserData(); - if(!pData->IsParent() && pData->GetType() != TYPE_HYPH) - { - sal_uInt16 nCurPos = pBox->GetSelectEntryPos(); - if(nCurPos < pBox->GetEntryCount() - 1) - { - bDisableDown = ((ModuleUserData_Impl*)pBox-> - GetEntry(nCurPos + 1)->GetUserData())->IsParent(); - } - if(nCurPos > 1) - { - bDisableUp = ((ModuleUserData_Impl*)pBox-> - GetEntry(nCurPos - 1)->GetUserData())->IsParent(); - } - } - aPrioUpPB.Enable(!bDisableUp); - aPrioDownPB.Enable(!bDisableDown); - } - } - else - { - OSL_FAIL( "pBox unexpected value" ); - } - - return 0; -} - -IMPL_LINK( SvxEditModulesDlg, BoxCheckButtonHdl_Impl, SvTreeListBox *, pBox ) -{ - pBox = &aModulesCLB; - SvLBoxEntry *pCurEntry = pBox->GetCurEntry(); - if (pCurEntry) - { - ModuleUserData_Impl* pData = (ModuleUserData_Impl *) - pCurEntry->GetUserData(); - if (!pData->IsParent() && pData->GetType() == TYPE_HYPH) - { - // make hyphenator checkboxes function as radio-buttons - // (at most one box may be checked) - SvLBoxEntry *pEntry = pBox->First(); - while (pEntry) - { - pData = (ModuleUserData_Impl *) pEntry->GetUserData(); - if (!pData->IsParent() && - pData->GetType() == TYPE_HYPH && - pEntry != pCurEntry) - { - lcl_SetCheckButton( pEntry, sal_False ); - pBox->InvalidateEntry( pEntry ); - } - pEntry = pBox->Next( pEntry ); - } - } - } - return 0; -} - -OUString lcl_GetServiceName(sal_uInt8 nType) -{ - switch(nType) - { - case TYPE_SPELL : return C2U(cSpell); - case TYPE_GRAMMAR : return C2U(cGrammar); - case TYPE_HYPH : return C2U(cHyph); - case TYPE_THES : return C2U(cThes); - } - return OUString(); -} - - -IMPL_LINK( SvxEditModulesDlg, LangSelectHdl_Impl, ListBox *, pBox ) -{ - LanguageType eCurLanguage = aLanguageLB.GetSelectLanguage(); - static Locale aLastLocale; - Locale aCurLocale; - SvxLanguageToLocale(aCurLocale, eCurLanguage); - SvLBoxTreeList *pModel = aModulesCLB.GetModel(); - - if (pBox) - { - // save old probably changed settings - // before switching to new language entries - - sal_Int16 nLang = SvxLocaleToLanguage( aLastLocale ); - - sal_Int32 nStart = 0, nLocalIndex = 0; - Sequence< OUString > aChange; - sal_Bool bChanged = sal_False; - for(sal_uInt16 i = 0; i < aModulesCLB.GetEntryCount(); i++) - { - SvLBoxEntry *pEntry = aModulesCLB.GetEntry(i); - ModuleUserData_Impl* pData = (ModuleUserData_Impl*)pEntry->GetUserData(); - if(pData->IsParent()) - { - if(bChanged) - { - LangImplNameTable *pTable = 0; - sal_uInt8 nType = pData->GetType(); - switch (nType - 1) - { - case TYPE_SPELL : pTable = &rLinguData.GetSpellTable(); break; - case TYPE_GRAMMAR : pTable = &rLinguData.GetGrammarTable(); break; - case TYPE_HYPH : pTable = &rLinguData.GetHyphTable(); break; - case TYPE_THES : pTable = &rLinguData.GetThesTable(); break; - } - if (pTable) - { - aChange.realloc(nStart); - (*pTable)[ nLang ] = aChange; - } - } - nLocalIndex = nStart = 0; - aChange.realloc(aModulesCLB.GetEntryCount()); - bChanged = sal_False; - } - else - { - OUString* pChange = aChange.getArray(); - pChange[nStart] = pData->GetImplName(); - bChanged |= pData->GetIndex() != nLocalIndex || - pData->IsChecked() != aModulesCLB.IsChecked(i); - if(aModulesCLB.IsChecked(i)) - nStart++; - ++nLocalIndex; - } - } - if(bChanged) - { - aChange.realloc(nStart); - rLinguData.GetThesTable()[ nLang ] = aChange; - } - } - - for(sal_uLong i = 0; i < aModulesCLB.GetEntryCount(); i++) - delete (ModuleUserData_Impl*)aModulesCLB.GetEntry(i)->GetUserData(); - - // - // display entries for new selected language - // - aModulesCLB.Clear(); - if(LANGUAGE_DONTKNOW != eCurLanguage) - { - sal_uLong n; - ServiceInfo_Impl* pInfo; - - // - // spellchecker entries - // - SvLBoxEntry* pEntry = CreateEntry( sSpell, CBCOL_SECOND ); - ModuleUserData_Impl* pUserData = new ModuleUserData_Impl( - String(), sal_True, sal_False, TYPE_SPELL, 0 ); - pEntry->SetUserData( (void *)pUserData ); - pModel->Insert( pEntry ); - - Sequence< OUString > aNames( rLinguData.GetSortedImplNames( eCurLanguage, TYPE_SPELL ) ); - const OUString *pName = aNames.getConstArray(); - sal_uLong nNames = (sal_uLong) aNames.getLength(); - sal_Int32 nLocalIndex = 0; // index relative to parent - for (n = 0; n < nNames; ++n) - { - OUString aImplName; - sal_Bool bIsSuppLang = sal_False; - - pInfo = rLinguData.GetInfoByImplName( pName[n] ); - if (pInfo) - { - bIsSuppLang = pInfo->xSpell.is() && - pInfo->xSpell->hasLocale( aCurLocale ); - aImplName = pInfo->sSpellImplName; - } - if (aImplName.getLength() && bIsSuppLang) - { - String aTxt( pInfo->sDisplayName ); - SvLBoxEntry* pNewEntry = CreateEntry( aTxt, CBCOL_FIRST ); - - LangImplNameTable &rTable = rLinguData.GetSpellTable(); - const bool bHasLang = rTable.count( eCurLanguage ); - if (!bHasLang) - { - DBG_WARNING( "language entry missing" ); // only relevant if all languages found should be supported - } - const bool bCheck = bHasLang && lcl_SeqGetEntryPos( rTable[ eCurLanguage ], aImplName ) >= 0; - lcl_SetCheckButton( pNewEntry, bCheck ); - pUserData = new ModuleUserData_Impl( aImplName, sal_False, - bCheck, TYPE_SPELL, (sal_uInt8)nLocalIndex++ ); - pNewEntry->SetUserData( (void *)pUserData ); - pModel->Insert( pNewEntry ); - } - } - - // - // grammar checker entries - // - pEntry = CreateEntry( sGrammar, CBCOL_SECOND ); - pUserData = new ModuleUserData_Impl( String(), sal_True, sal_False, TYPE_GRAMMAR, 0 ); - pEntry->SetUserData( (void *)pUserData ); - pModel->Insert( pEntry ); - - aNames = rLinguData.GetSortedImplNames( eCurLanguage, TYPE_GRAMMAR ); - pName = aNames.getConstArray(); - nNames = (sal_uLong) aNames.getLength(); - nLocalIndex = 0; - for (n = 0; n < nNames; ++n) - { - OUString aImplName; - sal_Bool bIsSuppLang = sal_False; - - pInfo = rLinguData.GetInfoByImplName( pName[n] ); - if (pInfo) - { - bIsSuppLang = pInfo->xGrammar.is() && - pInfo->xGrammar->hasLocale( aCurLocale ); - aImplName = pInfo->sGrammarImplName; - } - if (aImplName.getLength() && bIsSuppLang) - { - String aTxt( pInfo->sDisplayName ); - SvLBoxEntry* pNewEntry = CreateEntry( aTxt, CBCOL_FIRST ); - - LangImplNameTable &rTable = rLinguData.GetGrammarTable(); - const bool bHasLang = rTable.count( eCurLanguage ); - if (!bHasLang) - { - DBG_WARNING( "language entry missing" ); // only relevant if all languages found should be supported - } - const bool bCheck = bHasLang && lcl_SeqGetEntryPos( rTable[ eCurLanguage ], aImplName ) >= 0; - lcl_SetCheckButton( pNewEntry, bCheck ); - pUserData = new ModuleUserData_Impl( aImplName, sal_False, - bCheck, TYPE_GRAMMAR, (sal_uInt8)nLocalIndex++ ); - pNewEntry->SetUserData( (void *)pUserData ); - pModel->Insert( pNewEntry ); - } - } - - // - // hyphenator entries - // - pEntry = CreateEntry( sHyph, CBCOL_SECOND ); - pUserData = new ModuleUserData_Impl( String(), sal_True, sal_False, TYPE_HYPH, 0 ); - pEntry->SetUserData( (void *)pUserData ); - pModel->Insert( pEntry ); - - aNames = rLinguData.GetSortedImplNames( eCurLanguage, TYPE_HYPH ); - pName = aNames.getConstArray(); - nNames = (sal_uLong) aNames.getLength(); - nLocalIndex = 0; - for (n = 0; n < nNames; ++n) - { - OUString aImplName; - sal_Bool bIsSuppLang = sal_False; - - pInfo = rLinguData.GetInfoByImplName( pName[n] ); - if (pInfo) - { - bIsSuppLang = pInfo->xHyph.is() && - pInfo->xHyph->hasLocale( aCurLocale ); - aImplName = pInfo->sHyphImplName; - } - if (aImplName.getLength() && bIsSuppLang) - { - String aTxt( pInfo->sDisplayName ); - SvLBoxEntry* pNewEntry = CreateEntry( aTxt, CBCOL_FIRST ); - - LangImplNameTable &rTable = rLinguData.GetHyphTable(); - const bool bHasLang = rTable.count( eCurLanguage ); - if (!bHasLang) - { - DBG_WARNING( "language entry missing" ); // only relevant if all languages found should be supported - } - const bool bCheck = bHasLang && lcl_SeqGetEntryPos( rTable[ eCurLanguage ], aImplName ) >= 0; - lcl_SetCheckButton( pNewEntry, bCheck ); - pUserData = new ModuleUserData_Impl( aImplName, sal_False, - bCheck, TYPE_HYPH, (sal_uInt8)nLocalIndex++ ); - pNewEntry->SetUserData( (void *)pUserData ); - pModel->Insert( pNewEntry ); - } - } - - // - // thesaurus entries - // - pEntry = CreateEntry( sThes, CBCOL_SECOND ); - pUserData = new ModuleUserData_Impl( String(), sal_True, sal_False, TYPE_THES, 0 ); - pEntry->SetUserData( (void *)pUserData ); - pModel->Insert( pEntry ); - - aNames = rLinguData.GetSortedImplNames( eCurLanguage, TYPE_THES ); - pName = aNames.getConstArray(); - nNames = (sal_uLong) aNames.getLength(); - nLocalIndex = 0; - for (n = 0; n < nNames; ++n) - { - OUString aImplName; - sal_Bool bIsSuppLang = sal_False; - - pInfo = rLinguData.GetInfoByImplName( pName[n] ); - if (pInfo) - { - bIsSuppLang = pInfo->xThes.is() && - pInfo->xThes->hasLocale( aCurLocale ); - aImplName = pInfo->sThesImplName; - } - if (aImplName.getLength() && bIsSuppLang) - { - String aTxt( pInfo->sDisplayName ); - SvLBoxEntry* pNewEntry = CreateEntry( aTxt, CBCOL_FIRST ); - - LangImplNameTable &rTable = rLinguData.GetThesTable(); - const bool bHasLang = rTable.count( eCurLanguage ); - if (!bHasLang) - { - DBG_WARNING( "language entry missing" ); // only relevant if all languages found should be supported - } - const bool bCheck = bHasLang && lcl_SeqGetEntryPos( rTable[ eCurLanguage ], aImplName ) >= 0; - lcl_SetCheckButton( pNewEntry, bCheck ); - pUserData = new ModuleUserData_Impl( aImplName, sal_False, - bCheck, TYPE_THES, (sal_uInt8)nLocalIndex++ ); - pNewEntry->SetUserData( (void *)pUserData ); - pModel->Insert( pNewEntry ); - } - } - } - aLastLocale.Language = aCurLocale.Language; - aLastLocale.Country = aCurLocale.Country; - return 0; -} - -IMPL_LINK( SvxEditModulesDlg, UpDownHdl_Impl, PushButton *, pBtn ) -{ - sal_Bool bUp = &aPrioUpPB == pBtn; - sal_uInt16 nCurPos = aModulesCLB.GetSelectEntryPos(); - SvLBoxEntry* pEntry; - if (nCurPos != LISTBOX_ENTRY_NOTFOUND && - 0 != (pEntry = aModulesCLB.GetEntry(nCurPos))) - { - aModulesCLB.SetUpdateMode(sal_False); - SvLBoxTreeList *pModel = aModulesCLB.GetModel(); - - ModuleUserData_Impl* pData = (ModuleUserData_Impl*)pEntry->GetUserData(); - String aStr(aModulesCLB.GetEntryText(pEntry)); - SvLBoxEntry* pToInsert = CreateEntry( aStr, CBCOL_FIRST ); - pToInsert->SetUserData( (void *)pData); - sal_Bool bIsChecked = aModulesCLB.IsChecked(nCurPos); - - pModel->Remove(pEntry); - - sal_uInt16 nDestPos = bUp ? nCurPos - 1 : nCurPos + 1; - pModel->Insert(pToInsert, nDestPos); - aModulesCLB.CheckEntryPos(nDestPos, bIsChecked ); - aModulesCLB.SelectEntryPos(nDestPos ); - SelectHdl_Impl(&aModulesCLB); - aModulesCLB.SetUpdateMode(sal_True); - } - return 0; -} - -IMPL_LINK( SvxEditModulesDlg, ClickHdl_Impl, PushButton *, pBtn ) -{ - if (&aClosePB == pBtn) - { - // store language config - LangSelectHdl_Impl(&aLanguageLB); - EndDialog( RET_OK ); - } - else - { - OSL_FAIL( "pBtn unexpected value" ); - } - - return 0; -} - -IMPL_LINK( SvxEditModulesDlg, BackHdl_Impl, PushButton *, EMPTYARG ) -{ - rLinguData = *pDefaultLinguData; - LangSelectHdl_Impl(0); - return 0; -} - -// ----------------------------------------------------------------------- - -IMPL_LINK( SvxEditModulesDlg, OpenURLHdl_Impl, svt::FixedHyperlink *, EMPTYARG ) -{ - ::rtl::OUString sURL( aMoreDictsLink.GetURL() ); - lcl_OpenURL( sURL ); - return 0; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |