1*b5088357SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*b5088357SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*b5088357SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*b5088357SAndrew Rist * distributed with this work for additional information 6*b5088357SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*b5088357SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*b5088357SAndrew Rist * "License"); you may not use this file except in compliance 9*b5088357SAndrew Rist * with the License. You may obtain a copy of the License at 10*b5088357SAndrew Rist * 11*b5088357SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*b5088357SAndrew Rist * 13*b5088357SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*b5088357SAndrew Rist * software distributed under the License is distributed on an 15*b5088357SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b5088357SAndrew Rist * KIND, either express or implied. See the License for the 17*b5088357SAndrew Rist * specific language governing permissions and limitations 18*b5088357SAndrew Rist * under the License. 19*b5088357SAndrew Rist * 20*b5088357SAndrew Rist *************************************************************/ 21*b5088357SAndrew Rist 22*b5088357SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_unotools.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir 28cdf0e10cSrcweir #include <com/sun/star/lang/Locale.hpp> 29cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp> 30cdf0e10cSrcweir #include <com/sun/star/lang/XSingleServiceFactory.hpp> 31cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp> 32cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp> 33cdf0e10cSrcweir #include <com/sun/star/container/XNameReplace.hpp> 34cdf0e10cSrcweir #include "com/sun/star/util/XMacroExpander.hpp" 35cdf0e10cSrcweir #include "com/sun/star/beans/XPropertySet.hpp" 36cdf0e10cSrcweir #include <rtl/uri.hxx> 37cdf0e10cSrcweir #include <vos/mutex.hxx> 38cdf0e10cSrcweir #include <i18npool/mslangid.hxx> 39cdf0e10cSrcweir #include <tools/debug.hxx> 40cdf0e10cSrcweir #include <tools/string.hxx> 41cdf0e10cSrcweir #include <unotools/lingucfg.hxx> 42cdf0e10cSrcweir #include <unotools/linguprops.hxx> 43cdf0e10cSrcweir 44cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 45cdf0e10cSrcweir 46cdf0e10cSrcweir #include <itemholder1.hxx> 47cdf0e10cSrcweir 48cdf0e10cSrcweir using namespace rtl; 49cdf0e10cSrcweir using namespace com::sun::star; 50cdf0e10cSrcweir 51cdf0e10cSrcweir #define A2OU(x) ::rtl::OUString::createFromAscii( x ) 52cdf0e10cSrcweir #define EXPAND_PROTOCOL "vnd.sun.star.expand:" 53cdf0e10cSrcweir #define FILE_PROTOCOL "file:///" 54cdf0e10cSrcweir 55cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////// 56cdf0e10cSrcweir 57cdf0e10cSrcweir 58cdf0e10cSrcweir static osl::Mutex & GetOwnMutex() 59cdf0e10cSrcweir { 60cdf0e10cSrcweir static osl::Mutex aMutex; 61cdf0e10cSrcweir return aMutex; 62cdf0e10cSrcweir } 63cdf0e10cSrcweir 64cdf0e10cSrcweir 65cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////// 66cdf0e10cSrcweir 67cdf0e10cSrcweir 68cdf0e10cSrcweir static sal_Bool lcl_SetLocale( sal_Int16 &rLanguage, const uno::Any &rVal ) 69cdf0e10cSrcweir { 70cdf0e10cSrcweir sal_Bool bSucc = sal_False; 71cdf0e10cSrcweir 72cdf0e10cSrcweir lang::Locale aNew; 73cdf0e10cSrcweir if (rVal >>= aNew) // conversion successful? 74cdf0e10cSrcweir { 75cdf0e10cSrcweir sal_Int16 nNew = MsLangId::convertLocaleToLanguage( aNew ); 76cdf0e10cSrcweir if (nNew != rLanguage) 77cdf0e10cSrcweir { 78cdf0e10cSrcweir rLanguage = nNew; 79cdf0e10cSrcweir bSucc = sal_True; 80cdf0e10cSrcweir } 81cdf0e10cSrcweir } 82cdf0e10cSrcweir return bSucc; 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir 86cdf0e10cSrcweir static inline const OUString lcl_LanguageToCfgLocaleStr( sal_Int16 nLanguage ) 87cdf0e10cSrcweir { 88cdf0e10cSrcweir OUString aRes; 89cdf0e10cSrcweir if (LANGUAGE_SYSTEM != nLanguage) 90cdf0e10cSrcweir aRes = MsLangId::convertLanguageToIsoString( nLanguage ); 91cdf0e10cSrcweir return aRes; 92cdf0e10cSrcweir } 93cdf0e10cSrcweir 94cdf0e10cSrcweir 95cdf0e10cSrcweir static sal_Int16 lcl_CfgAnyToLanguage( const uno::Any &rVal ) 96cdf0e10cSrcweir { 97cdf0e10cSrcweir OUString aTmp; 98cdf0e10cSrcweir rVal >>= aTmp; 99cdf0e10cSrcweir return (aTmp.getLength() == 0) ? LANGUAGE_SYSTEM : MsLangId::convertIsoStringToLanguage( aTmp ); 100cdf0e10cSrcweir } 101cdf0e10cSrcweir 102cdf0e10cSrcweir 103cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 104cdf0e10cSrcweir 105cdf0e10cSrcweir SvtLinguOptions::SvtLinguOptions() 106cdf0e10cSrcweir { 107cdf0e10cSrcweir nDefaultLanguage = LANGUAGE_NONE; 108cdf0e10cSrcweir nDefaultLanguage_CJK = LANGUAGE_NONE; 109cdf0e10cSrcweir nDefaultLanguage_CTL = LANGUAGE_NONE; 110cdf0e10cSrcweir 111cdf0e10cSrcweir // general options 112cdf0e10cSrcweir bIsUseDictionaryList = 113cdf0e10cSrcweir bIsIgnoreControlCharacters = sal_True; 114cdf0e10cSrcweir 115cdf0e10cSrcweir // spelling options 116cdf0e10cSrcweir bIsSpellCapitalization = 117cdf0e10cSrcweir bIsSpellSpecial = sal_True; 118cdf0e10cSrcweir bIsSpellAuto = 119cdf0e10cSrcweir bIsSpellReverse = 120cdf0e10cSrcweir bIsSpellWithDigits = 121cdf0e10cSrcweir bIsSpellUpperCase = sal_False; 122cdf0e10cSrcweir 123cdf0e10cSrcweir // text conversion options 124cdf0e10cSrcweir bIsIgnorePostPositionalWord = sal_True; 125cdf0e10cSrcweir bIsAutoCloseDialog = 126cdf0e10cSrcweir bIsShowEntriesRecentlyUsedFirst = 127cdf0e10cSrcweir bIsAutoReplaceUniqueEntries = sal_False; 128cdf0e10cSrcweir bIsDirectionToSimplified = sal_True; 129cdf0e10cSrcweir bIsUseCharacterVariants = 130cdf0e10cSrcweir bIsTranslateCommonTerms = 131cdf0e10cSrcweir bIsReverseMapping = sal_False; 132cdf0e10cSrcweir 133cdf0e10cSrcweir bROIsDirectionToSimplified = 134cdf0e10cSrcweir bROIsUseCharacterVariants = 135cdf0e10cSrcweir bROIsTranslateCommonTerms = 136cdf0e10cSrcweir bROIsReverseMapping = sal_False; 137cdf0e10cSrcweir 138cdf0e10cSrcweir // hyphenation options 139cdf0e10cSrcweir bIsHyphSpecial = sal_True; 140cdf0e10cSrcweir bIsHyphAuto = sal_False; 141cdf0e10cSrcweir nHyphMinLeading = 142cdf0e10cSrcweir nHyphMinTrailing = 2; 143cdf0e10cSrcweir nHyphMinWordLength = 0; 144cdf0e10cSrcweir 145cdf0e10cSrcweir nDataFilesChangedCheckValue = 0; 146cdf0e10cSrcweir 147cdf0e10cSrcweir //grammar options 148cdf0e10cSrcweir bIsGrammarAuto = sal_False, 149cdf0e10cSrcweir bIsGrammarInteractive = sal_False; 150cdf0e10cSrcweir 151cdf0e10cSrcweir } 152cdf0e10cSrcweir 153cdf0e10cSrcweir 154cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 155cdf0e10cSrcweir 156cdf0e10cSrcweir 157cdf0e10cSrcweir class SvtLinguConfigItem : public utl::ConfigItem 158cdf0e10cSrcweir { 159cdf0e10cSrcweir SvtLinguOptions aOpt; 160cdf0e10cSrcweir 161cdf0e10cSrcweir // disallow copy-constructor and assignment-operator for now 162cdf0e10cSrcweir SvtLinguConfigItem( const SvtLinguConfigItem & ); 163cdf0e10cSrcweir SvtLinguConfigItem & operator = ( const SvtLinguConfigItem & ); 164cdf0e10cSrcweir 165cdf0e10cSrcweir static sal_Bool GetHdlByName( sal_Int32 &rnHdl, const OUString &rPropertyName, sal_Bool bFullPropName = sal_False ); 166cdf0e10cSrcweir static const uno::Sequence< OUString > & GetPropertyNames(); 167cdf0e10cSrcweir sal_Bool LoadOptions( const uno::Sequence< OUString > &rProperyNames ); 168cdf0e10cSrcweir sal_Bool SaveOptions( const uno::Sequence< OUString > &rProperyNames ); 169cdf0e10cSrcweir 170cdf0e10cSrcweir public: 171cdf0e10cSrcweir SvtLinguConfigItem(); 172cdf0e10cSrcweir virtual ~SvtLinguConfigItem(); 173cdf0e10cSrcweir 174cdf0e10cSrcweir // utl::ConfigItem 175cdf0e10cSrcweir virtual void Notify( const com::sun::star::uno::Sequence< rtl::OUString > &rPropertyNames ); 176cdf0e10cSrcweir virtual void Commit(); 177cdf0e10cSrcweir 178cdf0e10cSrcweir // make some protected functions of utl::ConfigItem public 179cdf0e10cSrcweir using utl::ConfigItem::GetNodeNames; 180cdf0e10cSrcweir using utl::ConfigItem::GetProperties; 181cdf0e10cSrcweir //using utl::ConfigItem::PutProperties; 182cdf0e10cSrcweir //using utl::ConfigItem::SetSetProperties; 183cdf0e10cSrcweir using utl::ConfigItem::ReplaceSetProperties; 184cdf0e10cSrcweir //using utl::ConfigItem::GetReadOnlyStates; 185cdf0e10cSrcweir 186cdf0e10cSrcweir 187cdf0e10cSrcweir com::sun::star::uno::Any 188cdf0e10cSrcweir GetProperty( const rtl::OUString &rPropertyName ) const; 189cdf0e10cSrcweir com::sun::star::uno::Any 190cdf0e10cSrcweir GetProperty( sal_Int32 nPropertyHandle ) const; 191cdf0e10cSrcweir 192cdf0e10cSrcweir sal_Bool SetProperty( const rtl::OUString &rPropertyName, 193cdf0e10cSrcweir const com::sun::star::uno::Any &rValue ); 194cdf0e10cSrcweir sal_Bool SetProperty( sal_Int32 nPropertyHandle, 195cdf0e10cSrcweir const com::sun::star::uno::Any &rValue ); 196cdf0e10cSrcweir 197cdf0e10cSrcweir sal_Bool GetOptions( SvtLinguOptions &rOptions ) const; 198cdf0e10cSrcweir sal_Bool SetOptions( const SvtLinguOptions &rOptions ); 199cdf0e10cSrcweir 200cdf0e10cSrcweir sal_Bool IsReadOnly( const rtl::OUString &rPropertyName ) const; 201cdf0e10cSrcweir sal_Bool IsReadOnly( sal_Int32 nPropertyHandle ) const; 202cdf0e10cSrcweir }; 203cdf0e10cSrcweir 204cdf0e10cSrcweir 205cdf0e10cSrcweir SvtLinguConfigItem::SvtLinguConfigItem() : 206cdf0e10cSrcweir utl::ConfigItem( String::CreateFromAscii( "Office.Linguistic" ) ) 207cdf0e10cSrcweir { 208cdf0e10cSrcweir LoadOptions( GetPropertyNames() ); 209cdf0e10cSrcweir ClearModified(); 210cdf0e10cSrcweir 211cdf0e10cSrcweir // request notify events when properties change 212cdf0e10cSrcweir EnableNotification( GetPropertyNames() ); 213cdf0e10cSrcweir } 214cdf0e10cSrcweir 215cdf0e10cSrcweir 216cdf0e10cSrcweir SvtLinguConfigItem::~SvtLinguConfigItem() 217cdf0e10cSrcweir { 218cdf0e10cSrcweir //! Commit (SaveOptions) will be called by the d-tor of the base called ! 219cdf0e10cSrcweir } 220cdf0e10cSrcweir 221cdf0e10cSrcweir 222cdf0e10cSrcweir void SvtLinguConfigItem::Notify( const uno::Sequence< OUString > &rPropertyNames ) 223cdf0e10cSrcweir { 224cdf0e10cSrcweir LoadOptions( rPropertyNames ); 225cdf0e10cSrcweir NotifyListeners(0); 226cdf0e10cSrcweir } 227cdf0e10cSrcweir 228cdf0e10cSrcweir 229cdf0e10cSrcweir void SvtLinguConfigItem::Commit() 230cdf0e10cSrcweir { 231cdf0e10cSrcweir SaveOptions( GetPropertyNames() ); 232cdf0e10cSrcweir } 233cdf0e10cSrcweir 234cdf0e10cSrcweir 235cdf0e10cSrcweir static struct NamesToHdl 236cdf0e10cSrcweir { 237cdf0e10cSrcweir const char *pFullPropName; // full qualified name as used in configuration 238cdf0e10cSrcweir const char *pPropName; // property name only (atom) of above 239cdf0e10cSrcweir sal_Int32 nHdl; // numeric handle representing the property 240cdf0e10cSrcweir }aNamesToHdl[] = 241cdf0e10cSrcweir { 242cdf0e10cSrcweir {/* 0 */ "General/DefaultLocale", UPN_DEFAULT_LOCALE, UPH_DEFAULT_LOCALE}, 243cdf0e10cSrcweir {/* 1 */ "General/DictionaryList/ActiveDictionaries", UPN_ACTIVE_DICTIONARIES, UPH_ACTIVE_DICTIONARIES}, 244cdf0e10cSrcweir {/* 2 */ "General/DictionaryList/IsUseDictionaryList", UPN_IS_USE_DICTIONARY_LIST, UPH_IS_USE_DICTIONARY_LIST}, 245cdf0e10cSrcweir {/* 3 */ "General/IsIgnoreControlCharacters", UPN_IS_IGNORE_CONTROL_CHARACTERS, UPH_IS_IGNORE_CONTROL_CHARACTERS}, 246cdf0e10cSrcweir {/* 5 */ "General/DefaultLocale_CJK", UPN_DEFAULT_LOCALE_CJK, UPH_DEFAULT_LOCALE_CJK}, 247cdf0e10cSrcweir {/* 6 */ "General/DefaultLocale_CTL", UPN_DEFAULT_LOCALE_CTL, UPH_DEFAULT_LOCALE_CTL}, 248cdf0e10cSrcweir 249cdf0e10cSrcweir {/* 7 */ "SpellChecking/IsSpellUpperCase", UPN_IS_SPELL_UPPER_CASE, UPH_IS_SPELL_UPPER_CASE}, 250cdf0e10cSrcweir {/* 8 */ "SpellChecking/IsSpellWithDigits", UPN_IS_SPELL_WITH_DIGITS, UPH_IS_SPELL_WITH_DIGITS}, 251cdf0e10cSrcweir {/* 9 */ "SpellChecking/IsSpellCapitalization", UPN_IS_SPELL_CAPITALIZATION, UPH_IS_SPELL_CAPITALIZATION}, 252cdf0e10cSrcweir {/* 10 */ "SpellChecking/IsSpellAuto", UPN_IS_SPELL_AUTO, UPH_IS_SPELL_AUTO}, 253cdf0e10cSrcweir {/* 11 */ "SpellChecking/IsSpellSpecial", UPN_IS_SPELL_SPECIAL, UPH_IS_SPELL_SPECIAL}, 254cdf0e10cSrcweir {/* 14 */ "SpellChecking/IsReverseDirection", UPN_IS_WRAP_REVERSE, UPH_IS_WRAP_REVERSE}, 255cdf0e10cSrcweir 256cdf0e10cSrcweir {/* 15 */ "Hyphenation/MinLeading", UPN_HYPH_MIN_LEADING, UPH_HYPH_MIN_LEADING}, 257cdf0e10cSrcweir {/* 16 */ "Hyphenation/MinTrailing", UPN_HYPH_MIN_TRAILING, UPH_HYPH_MIN_TRAILING}, 258cdf0e10cSrcweir {/* 17 */ "Hyphenation/MinWordLength", UPN_HYPH_MIN_WORD_LENGTH, UPH_HYPH_MIN_WORD_LENGTH}, 259cdf0e10cSrcweir {/* 18 */ "Hyphenation/IsHyphSpecial", UPN_IS_HYPH_SPECIAL, UPH_IS_HYPH_SPECIAL}, 260cdf0e10cSrcweir {/* 19 */ "Hyphenation/IsHyphAuto", UPN_IS_HYPH_AUTO, UPH_IS_HYPH_AUTO}, 261cdf0e10cSrcweir 262cdf0e10cSrcweir {/* 20 */ "TextConversion/ActiveConversionDictionaries", UPN_ACTIVE_CONVERSION_DICTIONARIES, UPH_ACTIVE_CONVERSION_DICTIONARIES}, 263cdf0e10cSrcweir {/* 21 */ "TextConversion/IsIgnorePostPositionalWord", UPN_IS_IGNORE_POST_POSITIONAL_WORD, UPH_IS_IGNORE_POST_POSITIONAL_WORD}, 264cdf0e10cSrcweir {/* 22 */ "TextConversion/IsAutoCloseDialog", UPN_IS_AUTO_CLOSE_DIALOG, UPH_IS_AUTO_CLOSE_DIALOG}, 265cdf0e10cSrcweir {/* 23 */ "TextConversion/IsShowEntriesRecentlyUsedFirst", UPN_IS_SHOW_ENTRIES_RECENTLY_USED_FIRST, UPH_IS_SHOW_ENTRIES_RECENTLY_USED_FIRST}, 266cdf0e10cSrcweir {/* 24 */ "TextConversion/IsAutoReplaceUniqueEntries", UPN_IS_AUTO_REPLACE_UNIQUE_ENTRIES, UPH_IS_AUTO_REPLACE_UNIQUE_ENTRIES}, 267cdf0e10cSrcweir {/* 25 */ "TextConversion/IsDirectionToSimplified", UPN_IS_DIRECTION_TO_SIMPLIFIED, UPH_IS_DIRECTION_TO_SIMPLIFIED}, 268cdf0e10cSrcweir {/* 26 */ "TextConversion/IsUseCharacterVariants", UPN_IS_USE_CHARACTER_VARIANTS, UPH_IS_USE_CHARACTER_VARIANTS}, 269cdf0e10cSrcweir {/* 27 */ "TextConversion/IsTranslateCommonTerms", UPN_IS_TRANSLATE_COMMON_TERMS, UPH_IS_TRANSLATE_COMMON_TERMS}, 270cdf0e10cSrcweir {/* 28 */ "TextConversion/IsReverseMapping", UPN_IS_REVERSE_MAPPING, UPH_IS_REVERSE_MAPPING}, 271cdf0e10cSrcweir 272cdf0e10cSrcweir {/* 29 */ "ServiceManager/DataFilesChangedCheckValue", UPN_DATA_FILES_CHANGED_CHECK_VALUE, UPH_DATA_FILES_CHANGED_CHECK_VALUE}, 273cdf0e10cSrcweir 274cdf0e10cSrcweir {/* 30 */ "GrammarChecking/IsAutoCheck", UPN_IS_GRAMMAR_AUTO, UPH_IS_GRAMMAR_AUTO}, 275cdf0e10cSrcweir {/* 31 */ "GrammarChecking/IsInteractiveCheck", UPN_IS_GRAMMAR_INTERACTIVE, UPH_IS_GRAMMAR_INTERACTIVE}, 276cdf0e10cSrcweir 277cdf0e10cSrcweir /* similar to entry 0 (thus no own configuration entry) but with different property name and type */ 278cdf0e10cSrcweir { NULL, UPN_DEFAULT_LANGUAGE, UPH_DEFAULT_LANGUAGE}, 279cdf0e10cSrcweir 280cdf0e10cSrcweir { NULL, NULL, -1} 281cdf0e10cSrcweir }; 282cdf0e10cSrcweir 283cdf0e10cSrcweir 284cdf0e10cSrcweir const uno::Sequence< OUString > & SvtLinguConfigItem::GetPropertyNames() 285cdf0e10cSrcweir { 286cdf0e10cSrcweir static uno::Sequence< OUString > aNames; 287cdf0e10cSrcweir static sal_Bool bInitialized = sal_False; 288cdf0e10cSrcweir 289cdf0e10cSrcweir if (!bInitialized) 290cdf0e10cSrcweir { 291cdf0e10cSrcweir sal_Int32 nMax = sizeof(aNamesToHdl) / sizeof(aNamesToHdl[0]); 292cdf0e10cSrcweir 293cdf0e10cSrcweir aNames.realloc( nMax ); 294cdf0e10cSrcweir OUString *pNames = aNames.getArray(); 295cdf0e10cSrcweir sal_Int32 nIdx = 0; 296cdf0e10cSrcweir for (sal_Int32 i = 0; i < nMax; ++i) 297cdf0e10cSrcweir { 298cdf0e10cSrcweir const sal_Char *pFullPropName = aNamesToHdl[i].pFullPropName; 299cdf0e10cSrcweir if (pFullPropName) 300cdf0e10cSrcweir pNames[ nIdx++ ] = A2OU( pFullPropName ); 301cdf0e10cSrcweir } 302cdf0e10cSrcweir aNames.realloc( nIdx ); 303cdf0e10cSrcweir bInitialized = sal_True; 304cdf0e10cSrcweir } 305cdf0e10cSrcweir return aNames; 306cdf0e10cSrcweir } 307cdf0e10cSrcweir 308cdf0e10cSrcweir 309cdf0e10cSrcweir sal_Bool SvtLinguConfigItem::GetHdlByName( 310cdf0e10cSrcweir sal_Int32 &rnHdl, 311cdf0e10cSrcweir const OUString &rPropertyName, 312cdf0e10cSrcweir sal_Bool bFullPropName ) 313cdf0e10cSrcweir { 314cdf0e10cSrcweir NamesToHdl *pEntry = &aNamesToHdl[0]; 315cdf0e10cSrcweir 316cdf0e10cSrcweir if (bFullPropName) 317cdf0e10cSrcweir { 318cdf0e10cSrcweir while (pEntry && pEntry->pFullPropName != NULL) 319cdf0e10cSrcweir { 320cdf0e10cSrcweir if (0 == rPropertyName.compareToAscii( pEntry->pFullPropName )) 321cdf0e10cSrcweir { 322cdf0e10cSrcweir rnHdl = pEntry->nHdl; 323cdf0e10cSrcweir break; 324cdf0e10cSrcweir } 325cdf0e10cSrcweir ++pEntry; 326cdf0e10cSrcweir } 327cdf0e10cSrcweir return pEntry && pEntry->pFullPropName != NULL; 328cdf0e10cSrcweir } 329cdf0e10cSrcweir else 330cdf0e10cSrcweir { 331cdf0e10cSrcweir while (pEntry && pEntry->pPropName != NULL) 332cdf0e10cSrcweir { 333cdf0e10cSrcweir if (0 == rPropertyName.compareToAscii( pEntry->pPropName )) 334cdf0e10cSrcweir { 335cdf0e10cSrcweir rnHdl = pEntry->nHdl; 336cdf0e10cSrcweir break; 337cdf0e10cSrcweir } 338cdf0e10cSrcweir ++pEntry; 339cdf0e10cSrcweir } 340cdf0e10cSrcweir return pEntry && pEntry->pPropName != NULL; 341cdf0e10cSrcweir } 342cdf0e10cSrcweir } 343cdf0e10cSrcweir 344cdf0e10cSrcweir 345cdf0e10cSrcweir uno::Any SvtLinguConfigItem::GetProperty( const OUString &rPropertyName ) const 346cdf0e10cSrcweir { 347cdf0e10cSrcweir osl::MutexGuard aGuard( GetOwnMutex() ); 348cdf0e10cSrcweir 349cdf0e10cSrcweir sal_Int32 nHdl; 350cdf0e10cSrcweir return GetHdlByName( nHdl, rPropertyName ) ? GetProperty( nHdl ) : uno::Any(); 351cdf0e10cSrcweir } 352cdf0e10cSrcweir 353cdf0e10cSrcweir 354cdf0e10cSrcweir uno::Any SvtLinguConfigItem::GetProperty( sal_Int32 nPropertyHandle ) const 355cdf0e10cSrcweir { 356cdf0e10cSrcweir osl::MutexGuard aGuard( GetOwnMutex() ); 357cdf0e10cSrcweir 358cdf0e10cSrcweir uno::Any aRes; 359cdf0e10cSrcweir 360cdf0e10cSrcweir const sal_Int16 *pnVal = 0; 361cdf0e10cSrcweir const sal_Bool *pbVal = 0; 362cdf0e10cSrcweir const sal_Int32 *pnInt32Val = 0; 363cdf0e10cSrcweir 364cdf0e10cSrcweir const SvtLinguOptions &rOpt = const_cast< SvtLinguConfigItem * >(this)->aOpt; 365cdf0e10cSrcweir switch (nPropertyHandle) 366cdf0e10cSrcweir { 367cdf0e10cSrcweir case UPH_IS_USE_DICTIONARY_LIST : pbVal = &rOpt.bIsUseDictionaryList; break; 368cdf0e10cSrcweir case UPH_IS_IGNORE_CONTROL_CHARACTERS : pbVal = &rOpt.bIsIgnoreControlCharacters; break; 369cdf0e10cSrcweir case UPH_IS_HYPH_AUTO : pbVal = &rOpt.bIsHyphAuto; break; 370cdf0e10cSrcweir case UPH_IS_HYPH_SPECIAL : pbVal = &rOpt.bIsHyphSpecial; break; 371cdf0e10cSrcweir case UPH_IS_SPELL_AUTO : pbVal = &rOpt.bIsSpellAuto; break; 372cdf0e10cSrcweir case UPH_IS_SPELL_SPECIAL : pbVal = &rOpt.bIsSpellSpecial; break; 373cdf0e10cSrcweir case UPH_IS_WRAP_REVERSE : pbVal = &rOpt.bIsSpellReverse; break; 374cdf0e10cSrcweir case UPH_DEFAULT_LANGUAGE : pnVal = &rOpt.nDefaultLanguage; break; 375cdf0e10cSrcweir case UPH_IS_SPELL_CAPITALIZATION : pbVal = &rOpt.bIsSpellCapitalization; break; 376cdf0e10cSrcweir case UPH_IS_SPELL_WITH_DIGITS : pbVal = &rOpt.bIsSpellWithDigits; break; 377cdf0e10cSrcweir case UPH_IS_SPELL_UPPER_CASE : pbVal = &rOpt.bIsSpellUpperCase; break; 378cdf0e10cSrcweir case UPH_HYPH_MIN_LEADING : pnVal = &rOpt.nHyphMinLeading; break; 379cdf0e10cSrcweir case UPH_HYPH_MIN_TRAILING : pnVal = &rOpt.nHyphMinTrailing; break; 380cdf0e10cSrcweir case UPH_HYPH_MIN_WORD_LENGTH : pnVal = &rOpt.nHyphMinWordLength; break; 381cdf0e10cSrcweir case UPH_ACTIVE_DICTIONARIES : 382cdf0e10cSrcweir { 383cdf0e10cSrcweir aRes <<= rOpt.aActiveDics; 384cdf0e10cSrcweir break; 385cdf0e10cSrcweir } 386cdf0e10cSrcweir case UPH_ACTIVE_CONVERSION_DICTIONARIES : 387cdf0e10cSrcweir { 388cdf0e10cSrcweir aRes <<= rOpt.aActiveConvDics; 389cdf0e10cSrcweir break; 390cdf0e10cSrcweir } 391cdf0e10cSrcweir case UPH_DEFAULT_LOCALE : 392cdf0e10cSrcweir { 393cdf0e10cSrcweir lang::Locale aLocale( MsLangId::convertLanguageToLocale( rOpt.nDefaultLanguage, false ) ); 394cdf0e10cSrcweir aRes.setValue( &aLocale, ::getCppuType((lang::Locale*)0 )); 395cdf0e10cSrcweir break; 396cdf0e10cSrcweir } 397cdf0e10cSrcweir case UPH_DEFAULT_LOCALE_CJK : 398cdf0e10cSrcweir { 399cdf0e10cSrcweir lang::Locale aLocale( MsLangId::convertLanguageToLocale( rOpt.nDefaultLanguage_CJK, false ) ); 400cdf0e10cSrcweir aRes.setValue( &aLocale, ::getCppuType((lang::Locale*)0 )); 401cdf0e10cSrcweir break; 402cdf0e10cSrcweir } 403cdf0e10cSrcweir case UPH_DEFAULT_LOCALE_CTL : 404cdf0e10cSrcweir { 405cdf0e10cSrcweir lang::Locale aLocale( MsLangId::convertLanguageToLocale( rOpt.nDefaultLanguage_CTL, false ) ); 406cdf0e10cSrcweir aRes.setValue( &aLocale, ::getCppuType((lang::Locale*)0 )); 407cdf0e10cSrcweir break; 408cdf0e10cSrcweir } 409cdf0e10cSrcweir case UPH_IS_IGNORE_POST_POSITIONAL_WORD : pbVal = &rOpt.bIsIgnorePostPositionalWord; break; 410cdf0e10cSrcweir case UPH_IS_AUTO_CLOSE_DIALOG : pbVal = &rOpt.bIsAutoCloseDialog; break; 411cdf0e10cSrcweir case UPH_IS_SHOW_ENTRIES_RECENTLY_USED_FIRST : pbVal = &rOpt.bIsShowEntriesRecentlyUsedFirst; break; 412cdf0e10cSrcweir case UPH_IS_AUTO_REPLACE_UNIQUE_ENTRIES : pbVal = &rOpt.bIsAutoReplaceUniqueEntries; break; 413cdf0e10cSrcweir 414cdf0e10cSrcweir case UPH_IS_DIRECTION_TO_SIMPLIFIED: pbVal = &rOpt.bIsDirectionToSimplified; break; 415cdf0e10cSrcweir case UPH_IS_USE_CHARACTER_VARIANTS : pbVal = &rOpt.bIsUseCharacterVariants; break; 416cdf0e10cSrcweir case UPH_IS_TRANSLATE_COMMON_TERMS : pbVal = &rOpt.bIsTranslateCommonTerms; break; 417cdf0e10cSrcweir case UPH_IS_REVERSE_MAPPING : pbVal = &rOpt.bIsReverseMapping; break; 418cdf0e10cSrcweir 419cdf0e10cSrcweir case UPH_DATA_FILES_CHANGED_CHECK_VALUE : pnInt32Val = &rOpt.nDataFilesChangedCheckValue; break; 420cdf0e10cSrcweir case UPH_IS_GRAMMAR_AUTO: pbVal = &rOpt.bIsGrammarAuto; break; 421cdf0e10cSrcweir case UPH_IS_GRAMMAR_INTERACTIVE: pbVal = &rOpt.bIsGrammarInteractive; break; 422cdf0e10cSrcweir default : 423cdf0e10cSrcweir DBG_ASSERT( 0, "unexpected property handle" ); 424cdf0e10cSrcweir } 425cdf0e10cSrcweir 426cdf0e10cSrcweir if (pbVal) 427cdf0e10cSrcweir aRes <<= *pbVal; 428cdf0e10cSrcweir else if (pnVal) 429cdf0e10cSrcweir aRes <<= *pnVal; 430cdf0e10cSrcweir else if (pnInt32Val) 431cdf0e10cSrcweir aRes <<= *pnInt32Val; 432cdf0e10cSrcweir 433cdf0e10cSrcweir return aRes; 434cdf0e10cSrcweir } 435cdf0e10cSrcweir 436cdf0e10cSrcweir 437cdf0e10cSrcweir sal_Bool SvtLinguConfigItem::SetProperty( const OUString &rPropertyName, const uno::Any &rValue ) 438cdf0e10cSrcweir { 439cdf0e10cSrcweir osl::MutexGuard aGuard( GetOwnMutex() ); 440cdf0e10cSrcweir 441cdf0e10cSrcweir sal_Bool bSucc = sal_False; 442cdf0e10cSrcweir sal_Int32 nHdl; 443cdf0e10cSrcweir if (GetHdlByName( nHdl, rPropertyName )) 444cdf0e10cSrcweir bSucc = SetProperty( nHdl, rValue ); 445cdf0e10cSrcweir return bSucc; 446cdf0e10cSrcweir } 447cdf0e10cSrcweir 448cdf0e10cSrcweir 449cdf0e10cSrcweir sal_Bool SvtLinguConfigItem::SetProperty( sal_Int32 nPropertyHandle, const uno::Any &rValue ) 450cdf0e10cSrcweir { 451cdf0e10cSrcweir osl::MutexGuard aGuard( GetOwnMutex() ); 452cdf0e10cSrcweir 453cdf0e10cSrcweir sal_Bool bSucc = sal_False; 454cdf0e10cSrcweir if (!rValue.hasValue()) 455cdf0e10cSrcweir return bSucc; 456cdf0e10cSrcweir 457cdf0e10cSrcweir sal_Bool bMod = sal_False; 458cdf0e10cSrcweir 459cdf0e10cSrcweir sal_Int16 *pnVal = 0; 460cdf0e10cSrcweir sal_Bool *pbVal = 0; 461cdf0e10cSrcweir sal_Int32 *pnInt32Val = 0; 462cdf0e10cSrcweir 463cdf0e10cSrcweir SvtLinguOptions &rOpt = aOpt; 464cdf0e10cSrcweir switch (nPropertyHandle) 465cdf0e10cSrcweir { 466cdf0e10cSrcweir case UPH_IS_USE_DICTIONARY_LIST : pbVal = &rOpt.bIsUseDictionaryList; break; 467cdf0e10cSrcweir case UPH_IS_IGNORE_CONTROL_CHARACTERS : pbVal = &rOpt.bIsIgnoreControlCharacters; break; 468cdf0e10cSrcweir case UPH_IS_HYPH_AUTO : pbVal = &rOpt.bIsHyphAuto; break; 469cdf0e10cSrcweir case UPH_IS_HYPH_SPECIAL : pbVal = &rOpt.bIsHyphSpecial; break; 470cdf0e10cSrcweir case UPH_IS_SPELL_AUTO : pbVal = &rOpt.bIsSpellAuto; break; 471cdf0e10cSrcweir case UPH_IS_SPELL_SPECIAL : pbVal = &rOpt.bIsSpellSpecial; break; 472cdf0e10cSrcweir case UPH_IS_WRAP_REVERSE : pbVal = &rOpt.bIsSpellReverse; break; 473cdf0e10cSrcweir case UPH_DEFAULT_LANGUAGE : pnVal = &rOpt.nDefaultLanguage; break; 474cdf0e10cSrcweir case UPH_IS_SPELL_CAPITALIZATION : pbVal = &rOpt.bIsSpellCapitalization; break; 475cdf0e10cSrcweir case UPH_IS_SPELL_WITH_DIGITS : pbVal = &rOpt.bIsSpellWithDigits; break; 476cdf0e10cSrcweir case UPH_IS_SPELL_UPPER_CASE : pbVal = &rOpt.bIsSpellUpperCase; break; 477cdf0e10cSrcweir case UPH_HYPH_MIN_LEADING : pnVal = &rOpt.nHyphMinLeading; break; 478cdf0e10cSrcweir case UPH_HYPH_MIN_TRAILING : pnVal = &rOpt.nHyphMinTrailing; break; 479cdf0e10cSrcweir case UPH_HYPH_MIN_WORD_LENGTH : pnVal = &rOpt.nHyphMinWordLength; break; 480cdf0e10cSrcweir case UPH_ACTIVE_DICTIONARIES : 481cdf0e10cSrcweir { 482cdf0e10cSrcweir rValue >>= rOpt.aActiveDics; 483cdf0e10cSrcweir bMod = sal_True; 484cdf0e10cSrcweir break; 485cdf0e10cSrcweir } 486cdf0e10cSrcweir case UPH_ACTIVE_CONVERSION_DICTIONARIES : 487cdf0e10cSrcweir { 488cdf0e10cSrcweir rValue >>= rOpt.aActiveConvDics; 489cdf0e10cSrcweir bMod = sal_True; 490cdf0e10cSrcweir break; 491cdf0e10cSrcweir } 492cdf0e10cSrcweir case UPH_DEFAULT_LOCALE : 493cdf0e10cSrcweir { 494cdf0e10cSrcweir bSucc = lcl_SetLocale( rOpt.nDefaultLanguage, rValue ); 495cdf0e10cSrcweir bMod = bSucc; 496cdf0e10cSrcweir break; 497cdf0e10cSrcweir } 498cdf0e10cSrcweir case UPH_DEFAULT_LOCALE_CJK : 499cdf0e10cSrcweir { 500cdf0e10cSrcweir bSucc = lcl_SetLocale( rOpt.nDefaultLanguage_CJK, rValue ); 501cdf0e10cSrcweir bMod = bSucc; 502cdf0e10cSrcweir break; 503cdf0e10cSrcweir } 504cdf0e10cSrcweir case UPH_DEFAULT_LOCALE_CTL : 505cdf0e10cSrcweir { 506cdf0e10cSrcweir bSucc = lcl_SetLocale( rOpt.nDefaultLanguage_CTL, rValue ); 507cdf0e10cSrcweir bMod = bSucc; 508cdf0e10cSrcweir break; 509cdf0e10cSrcweir } 510cdf0e10cSrcweir case UPH_IS_IGNORE_POST_POSITIONAL_WORD : pbVal = &rOpt.bIsIgnorePostPositionalWord; break; 511cdf0e10cSrcweir case UPH_IS_AUTO_CLOSE_DIALOG : pbVal = &rOpt.bIsAutoCloseDialog; break; 512cdf0e10cSrcweir case UPH_IS_SHOW_ENTRIES_RECENTLY_USED_FIRST : pbVal = &rOpt.bIsShowEntriesRecentlyUsedFirst; break; 513cdf0e10cSrcweir case UPH_IS_AUTO_REPLACE_UNIQUE_ENTRIES : pbVal = &rOpt.bIsAutoReplaceUniqueEntries; break; 514cdf0e10cSrcweir 515cdf0e10cSrcweir case UPH_IS_DIRECTION_TO_SIMPLIFIED : pbVal = &rOpt.bIsDirectionToSimplified; break; 516cdf0e10cSrcweir case UPH_IS_USE_CHARACTER_VARIANTS : pbVal = &rOpt.bIsUseCharacterVariants; break; 517cdf0e10cSrcweir case UPH_IS_TRANSLATE_COMMON_TERMS : pbVal = &rOpt.bIsTranslateCommonTerms; break; 518cdf0e10cSrcweir case UPH_IS_REVERSE_MAPPING : pbVal = &rOpt.bIsReverseMapping; break; 519cdf0e10cSrcweir 520cdf0e10cSrcweir case UPH_DATA_FILES_CHANGED_CHECK_VALUE : pnInt32Val = &rOpt.nDataFilesChangedCheckValue; break; 521cdf0e10cSrcweir case UPH_IS_GRAMMAR_AUTO: pbVal = &rOpt.bIsGrammarAuto; break; 522cdf0e10cSrcweir case UPH_IS_GRAMMAR_INTERACTIVE: pbVal = &rOpt.bIsGrammarInteractive; break; 523cdf0e10cSrcweir default : 524cdf0e10cSrcweir DBG_ASSERT( 0, "unexpected property handle" ); 525cdf0e10cSrcweir } 526cdf0e10cSrcweir 527cdf0e10cSrcweir if (pbVal) 528cdf0e10cSrcweir { 529cdf0e10cSrcweir sal_Bool bNew = sal_Bool(); 530cdf0e10cSrcweir if (rValue >>= bNew) 531cdf0e10cSrcweir { 532cdf0e10cSrcweir if (bNew != *pbVal) 533cdf0e10cSrcweir { 534cdf0e10cSrcweir *pbVal = bNew; 535cdf0e10cSrcweir bMod = sal_True; 536cdf0e10cSrcweir } 537cdf0e10cSrcweir bSucc = sal_True; 538cdf0e10cSrcweir } 539cdf0e10cSrcweir } 540cdf0e10cSrcweir else if (pnVal) 541cdf0e10cSrcweir { 542cdf0e10cSrcweir sal_Int16 nNew = sal_Int16(); 543cdf0e10cSrcweir if (rValue >>= nNew) 544cdf0e10cSrcweir { 545cdf0e10cSrcweir if (nNew != *pnVal) 546cdf0e10cSrcweir { 547cdf0e10cSrcweir *pnVal = nNew; 548cdf0e10cSrcweir bMod = sal_True; 549cdf0e10cSrcweir } 550cdf0e10cSrcweir bSucc = sal_True; 551cdf0e10cSrcweir } 552cdf0e10cSrcweir } 553cdf0e10cSrcweir else if (pnInt32Val) 554cdf0e10cSrcweir { 555cdf0e10cSrcweir sal_Int32 nNew = sal_Int32(); 556cdf0e10cSrcweir if (rValue >>= nNew) 557cdf0e10cSrcweir { 558cdf0e10cSrcweir if (nNew != *pnInt32Val) 559cdf0e10cSrcweir { 560cdf0e10cSrcweir *pnInt32Val = nNew; 561cdf0e10cSrcweir bMod = sal_True; 562cdf0e10cSrcweir } 563cdf0e10cSrcweir bSucc = sal_True; 564cdf0e10cSrcweir } 565cdf0e10cSrcweir } 566cdf0e10cSrcweir 567cdf0e10cSrcweir if (bMod) 568cdf0e10cSrcweir SetModified(); 569cdf0e10cSrcweir 570cdf0e10cSrcweir NotifyListeners(0); 571cdf0e10cSrcweir return bSucc; 572cdf0e10cSrcweir } 573cdf0e10cSrcweir 574cdf0e10cSrcweir 575cdf0e10cSrcweir sal_Bool SvtLinguConfigItem::GetOptions( SvtLinguOptions &rOptions ) const 576cdf0e10cSrcweir { 577cdf0e10cSrcweir osl::MutexGuard aGuard( GetOwnMutex() ); 578cdf0e10cSrcweir 579cdf0e10cSrcweir rOptions = aOpt; 580cdf0e10cSrcweir return sal_True; 581cdf0e10cSrcweir } 582cdf0e10cSrcweir 583cdf0e10cSrcweir 584cdf0e10cSrcweir sal_Bool SvtLinguConfigItem::SetOptions( const SvtLinguOptions &rOptions ) 585cdf0e10cSrcweir { 586cdf0e10cSrcweir osl::MutexGuard aGuard( GetOwnMutex() ); 587cdf0e10cSrcweir 588cdf0e10cSrcweir aOpt = rOptions; 589cdf0e10cSrcweir SetModified(); 590cdf0e10cSrcweir NotifyListeners(0); 591cdf0e10cSrcweir return sal_True; 592cdf0e10cSrcweir } 593cdf0e10cSrcweir 594cdf0e10cSrcweir 595cdf0e10cSrcweir sal_Bool SvtLinguConfigItem::LoadOptions( const uno::Sequence< OUString > &rProperyNames ) 596cdf0e10cSrcweir { 597cdf0e10cSrcweir osl::MutexGuard aGuard( GetOwnMutex() ); 598cdf0e10cSrcweir 599cdf0e10cSrcweir sal_Bool bRes = sal_False; 600cdf0e10cSrcweir 601cdf0e10cSrcweir const OUString *pProperyNames = rProperyNames.getConstArray(); 602cdf0e10cSrcweir sal_Int32 nProps = rProperyNames.getLength(); 603cdf0e10cSrcweir 604cdf0e10cSrcweir const uno::Sequence< uno::Any > aValues = GetProperties( rProperyNames ); 605cdf0e10cSrcweir const uno::Sequence< sal_Bool > aROStates = GetReadOnlyStates( rProperyNames ); 606cdf0e10cSrcweir 607cdf0e10cSrcweir if (nProps && aValues.getLength() == nProps && aROStates.getLength() == nProps) 608cdf0e10cSrcweir { 609cdf0e10cSrcweir SvtLinguOptions &rOpt = aOpt; 610cdf0e10cSrcweir 611cdf0e10cSrcweir const uno::Any *pValue = aValues.getConstArray(); 612cdf0e10cSrcweir const sal_Bool *pROStates = aROStates.getConstArray(); 613cdf0e10cSrcweir for (sal_Int32 i = 0; i < nProps; ++i) 614cdf0e10cSrcweir { 615cdf0e10cSrcweir const uno::Any &rVal = pValue[i]; 616cdf0e10cSrcweir sal_Int32 nPropertyHandle; 617cdf0e10cSrcweir GetHdlByName( nPropertyHandle, pProperyNames[i], sal_True ); 618cdf0e10cSrcweir switch ( nPropertyHandle ) 619cdf0e10cSrcweir { 620cdf0e10cSrcweir case UPH_DEFAULT_LOCALE : 621cdf0e10cSrcweir { rOpt.bRODefaultLanguage = pROStates[i]; rOpt.nDefaultLanguage = lcl_CfgAnyToLanguage( rVal ); } break; 622cdf0e10cSrcweir case UPH_ACTIVE_DICTIONARIES : 623cdf0e10cSrcweir { rOpt.bROActiveDics = pROStates[i]; rVal >>= rOpt.aActiveDics; } break; 624cdf0e10cSrcweir case UPH_IS_USE_DICTIONARY_LIST : 625cdf0e10cSrcweir { rOpt.bROIsUseDictionaryList = pROStates[i]; rVal >>= rOpt.bIsUseDictionaryList; } break; 626cdf0e10cSrcweir case UPH_IS_IGNORE_CONTROL_CHARACTERS : 627cdf0e10cSrcweir { rOpt.bROIsIgnoreControlCharacters = pROStates[i]; rVal >>= rOpt.bIsIgnoreControlCharacters; } break; 628cdf0e10cSrcweir case UPH_DEFAULT_LOCALE_CJK : 629cdf0e10cSrcweir { rOpt.bRODefaultLanguage_CJK = pROStates[i]; rOpt.nDefaultLanguage_CJK = lcl_CfgAnyToLanguage( rVal ); } break; 630cdf0e10cSrcweir case UPH_DEFAULT_LOCALE_CTL : 631cdf0e10cSrcweir { rOpt.bRODefaultLanguage_CTL = pROStates[i]; rOpt.nDefaultLanguage_CTL = lcl_CfgAnyToLanguage( rVal ); } break; 632cdf0e10cSrcweir 633cdf0e10cSrcweir case UPH_IS_SPELL_UPPER_CASE : 634cdf0e10cSrcweir { rOpt.bROIsSpellUpperCase = pROStates[i]; rVal >>= rOpt.bIsSpellUpperCase; } break; 635cdf0e10cSrcweir case UPH_IS_SPELL_WITH_DIGITS : 636cdf0e10cSrcweir { rOpt.bROIsSpellWithDigits = pROStates[i]; rVal >>= rOpt.bIsSpellWithDigits; } break; 637cdf0e10cSrcweir case UPH_IS_SPELL_CAPITALIZATION : 638cdf0e10cSrcweir { rOpt.bROIsSpellCapitalization = pROStates[i]; rVal >>= rOpt.bIsSpellCapitalization; } break; 639cdf0e10cSrcweir case UPH_IS_SPELL_AUTO : 640cdf0e10cSrcweir { rOpt.bROIsSpellAuto = pROStates[i]; rVal >>= rOpt.bIsSpellAuto; } break; 641cdf0e10cSrcweir case UPH_IS_SPELL_SPECIAL : 642cdf0e10cSrcweir { rOpt.bROIsSpellSpecial = pROStates[i]; rVal >>= rOpt.bIsSpellSpecial; } break; 643cdf0e10cSrcweir case UPH_IS_WRAP_REVERSE : 644cdf0e10cSrcweir { rOpt.bROIsSpellReverse = pROStates[i]; rVal >>= rOpt.bIsSpellReverse; } break; 645cdf0e10cSrcweir 646cdf0e10cSrcweir case UPH_HYPH_MIN_LEADING : 647cdf0e10cSrcweir { rOpt.bROHyphMinLeading = pROStates[i]; rVal >>= rOpt.nHyphMinLeading; } break; 648cdf0e10cSrcweir case UPH_HYPH_MIN_TRAILING : 649cdf0e10cSrcweir { rOpt.bROHyphMinTrailing = pROStates[i]; rVal >>= rOpt.nHyphMinTrailing; } break; 650cdf0e10cSrcweir case UPH_HYPH_MIN_WORD_LENGTH : 651cdf0e10cSrcweir { rOpt.bROHyphMinWordLength = pROStates[i]; rVal >>= rOpt.nHyphMinWordLength; } break; 652cdf0e10cSrcweir case UPH_IS_HYPH_SPECIAL : 653cdf0e10cSrcweir { rOpt.bROIsHyphSpecial = pROStates[i]; rVal >>= rOpt.bIsHyphSpecial; } break; 654cdf0e10cSrcweir case UPH_IS_HYPH_AUTO : 655cdf0e10cSrcweir { rOpt.bROIsHyphAuto = pROStates[i]; rVal >>= rOpt.bIsHyphAuto; } break; 656cdf0e10cSrcweir 657cdf0e10cSrcweir case UPH_ACTIVE_CONVERSION_DICTIONARIES : { rOpt.bROActiveConvDics = pROStates[i]; rVal >>= rOpt.aActiveConvDics; } break; 658cdf0e10cSrcweir 659cdf0e10cSrcweir case UPH_IS_IGNORE_POST_POSITIONAL_WORD : 660cdf0e10cSrcweir { rOpt.bROIsIgnorePostPositionalWord = pROStates[i]; rVal >>= rOpt.bIsIgnorePostPositionalWord; } break; 661cdf0e10cSrcweir case UPH_IS_AUTO_CLOSE_DIALOG : 662cdf0e10cSrcweir { rOpt.bROIsAutoCloseDialog = pROStates[i]; rVal >>= rOpt.bIsAutoCloseDialog; } break; 663cdf0e10cSrcweir case UPH_IS_SHOW_ENTRIES_RECENTLY_USED_FIRST : 664cdf0e10cSrcweir { rOpt.bROIsShowEntriesRecentlyUsedFirst = pROStates[i]; rVal >>= rOpt.bIsShowEntriesRecentlyUsedFirst; } break; 665cdf0e10cSrcweir case UPH_IS_AUTO_REPLACE_UNIQUE_ENTRIES : 666cdf0e10cSrcweir { rOpt.bROIsAutoReplaceUniqueEntries = pROStates[i]; rVal >>= rOpt.bIsAutoReplaceUniqueEntries; } break; 667cdf0e10cSrcweir 668cdf0e10cSrcweir case UPH_IS_DIRECTION_TO_SIMPLIFIED : 669cdf0e10cSrcweir { rOpt.bROIsDirectionToSimplified = pROStates[i]; 670cdf0e10cSrcweir if( ! (rVal >>= rOpt.bIsDirectionToSimplified) ) 671cdf0e10cSrcweir { 672cdf0e10cSrcweir //default is locale dependent: 673cdf0e10cSrcweir if( rOpt.nDefaultLanguage_CJK == LANGUAGE_CHINESE_HONGKONG 674cdf0e10cSrcweir || rOpt.nDefaultLanguage_CJK == LANGUAGE_CHINESE_MACAU 675cdf0e10cSrcweir || rOpt.nDefaultLanguage_CJK == LANGUAGE_CHINESE_TRADITIONAL ) 676cdf0e10cSrcweir { 677cdf0e10cSrcweir rOpt.bIsDirectionToSimplified = sal_False; 678cdf0e10cSrcweir } 679cdf0e10cSrcweir else 680cdf0e10cSrcweir { 681cdf0e10cSrcweir rOpt.bIsDirectionToSimplified = sal_True; 682cdf0e10cSrcweir } 683cdf0e10cSrcweir } 684cdf0e10cSrcweir } break; 685cdf0e10cSrcweir case UPH_IS_USE_CHARACTER_VARIANTS : 686cdf0e10cSrcweir { rOpt.bROIsUseCharacterVariants = pROStates[i]; rVal >>= rOpt.bIsUseCharacterVariants; } break; 687cdf0e10cSrcweir case UPH_IS_TRANSLATE_COMMON_TERMS : 688cdf0e10cSrcweir { rOpt.bROIsTranslateCommonTerms = pROStates[i]; rVal >>= rOpt.bIsTranslateCommonTerms; } break; 689cdf0e10cSrcweir case UPH_IS_REVERSE_MAPPING : 690cdf0e10cSrcweir { rOpt.bROIsReverseMapping = pROStates[i]; rVal >>= rOpt.bIsReverseMapping; } break; 691cdf0e10cSrcweir 692cdf0e10cSrcweir case UPH_DATA_FILES_CHANGED_CHECK_VALUE : 693cdf0e10cSrcweir { rOpt.bRODataFilesChangedCheckValue = pROStates[i]; rVal >>= rOpt.nDataFilesChangedCheckValue; } break; 694cdf0e10cSrcweir 695cdf0e10cSrcweir case UPH_IS_GRAMMAR_AUTO: 696cdf0e10cSrcweir { rOpt.bROIsGrammarAuto = pROStates[i]; rVal >>= rOpt.bIsGrammarAuto; } 697cdf0e10cSrcweir break; 698cdf0e10cSrcweir case UPH_IS_GRAMMAR_INTERACTIVE: 699cdf0e10cSrcweir { rOpt.bROIsGrammarInteractive = pROStates[i]; rVal >>= rOpt.bIsGrammarInteractive; } 700cdf0e10cSrcweir break; 701cdf0e10cSrcweir 702cdf0e10cSrcweir default: 703cdf0e10cSrcweir DBG_ASSERT( 0, "unexpected case" ); 704cdf0e10cSrcweir } 705cdf0e10cSrcweir } 706cdf0e10cSrcweir 707cdf0e10cSrcweir bRes = sal_True; 708cdf0e10cSrcweir } 709cdf0e10cSrcweir DBG_ASSERT( bRes, "LoadOptions failed" ); 710cdf0e10cSrcweir 711cdf0e10cSrcweir return bRes; 712cdf0e10cSrcweir } 713cdf0e10cSrcweir 714cdf0e10cSrcweir 715cdf0e10cSrcweir sal_Bool SvtLinguConfigItem::SaveOptions( const uno::Sequence< OUString > &rProperyNames ) 716cdf0e10cSrcweir { 717cdf0e10cSrcweir if (!IsModified()) 718cdf0e10cSrcweir return sal_True; 719cdf0e10cSrcweir 720cdf0e10cSrcweir osl::MutexGuard aGuard( GetOwnMutex() ); 721cdf0e10cSrcweir 722cdf0e10cSrcweir sal_Bool bRet = sal_False; 723cdf0e10cSrcweir const uno::Type &rBOOL = ::getBooleanCppuType(); 724cdf0e10cSrcweir const uno::Type &rINT16 = ::getCppuType( (sal_Int16 *) NULL ); 725cdf0e10cSrcweir const uno::Type &rINT32 = ::getCppuType( (sal_Int32 *) NULL ); 726cdf0e10cSrcweir 727cdf0e10cSrcweir sal_Int32 nProps = rProperyNames.getLength(); 728cdf0e10cSrcweir uno::Sequence< uno::Any > aValues( nProps ); 729cdf0e10cSrcweir uno::Any *pValue = aValues.getArray(); 730cdf0e10cSrcweir 731cdf0e10cSrcweir if (nProps && aValues.getLength() == nProps) 732cdf0e10cSrcweir { 733cdf0e10cSrcweir const SvtLinguOptions &rOpt = aOpt; 734cdf0e10cSrcweir 735cdf0e10cSrcweir OUString aTmp( lcl_LanguageToCfgLocaleStr( rOpt.nDefaultLanguage ) ); 736cdf0e10cSrcweir *pValue++ = uno::makeAny( aTmp ); // 0 737cdf0e10cSrcweir *pValue++ = uno::makeAny( rOpt.aActiveDics ); // 1 738cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsUseDictionaryList, rBOOL ); // 2 739cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsIgnoreControlCharacters, rBOOL ); // 3 740cdf0e10cSrcweir aTmp = lcl_LanguageToCfgLocaleStr( rOpt.nDefaultLanguage_CJK ); 741cdf0e10cSrcweir *pValue++ = uno::makeAny( aTmp ); // 5 742cdf0e10cSrcweir aTmp = lcl_LanguageToCfgLocaleStr( rOpt.nDefaultLanguage_CTL ); 743cdf0e10cSrcweir *pValue++ = uno::makeAny( aTmp ); // 6 744cdf0e10cSrcweir 745cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsSpellUpperCase, rBOOL ); // 7 746cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsSpellWithDigits, rBOOL ); // 8 747cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsSpellCapitalization, rBOOL ); // 9 748cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsSpellAuto, rBOOL ); // 10 749cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsSpellSpecial, rBOOL ); // 11 750cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsSpellReverse, rBOOL ); // 14 751cdf0e10cSrcweir 752cdf0e10cSrcweir pValue++->setValue( &rOpt.nHyphMinLeading, rINT16 ); // 15 753cdf0e10cSrcweir pValue++->setValue( &rOpt.nHyphMinTrailing, rINT16 ); // 16 754cdf0e10cSrcweir pValue++->setValue( &rOpt.nHyphMinWordLength, rINT16 ); // 17 755cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsHyphSpecial, rBOOL ); // 18 756cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsHyphAuto, rBOOL ); // 19 757cdf0e10cSrcweir 758cdf0e10cSrcweir *pValue++ = uno::makeAny( rOpt.aActiveConvDics ); // 20 759cdf0e10cSrcweir 760cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsIgnorePostPositionalWord, rBOOL ); // 21 761cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsAutoCloseDialog, rBOOL ); // 22 762cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsShowEntriesRecentlyUsedFirst, rBOOL ); // 23 763cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsAutoReplaceUniqueEntries, rBOOL ); // 24 764cdf0e10cSrcweir 765cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsDirectionToSimplified, rBOOL ); // 25 766cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsUseCharacterVariants, rBOOL ); // 26 767cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsTranslateCommonTerms, rBOOL ); // 27 768cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsReverseMapping, rBOOL ); // 28 769cdf0e10cSrcweir 770cdf0e10cSrcweir pValue++->setValue( &rOpt.nDataFilesChangedCheckValue, rINT32 ); // 29 771cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsGrammarAuto, rBOOL ); // 30 772cdf0e10cSrcweir pValue++->setValue( &rOpt.bIsGrammarInteractive, rBOOL ); // 31 773cdf0e10cSrcweir 774cdf0e10cSrcweir bRet |= PutProperties( rProperyNames, aValues ); 775cdf0e10cSrcweir } 776cdf0e10cSrcweir 777cdf0e10cSrcweir if (bRet) 778cdf0e10cSrcweir ClearModified(); 779cdf0e10cSrcweir 780cdf0e10cSrcweir return bRet; 781cdf0e10cSrcweir } 782cdf0e10cSrcweir 783cdf0e10cSrcweir sal_Bool SvtLinguConfigItem::IsReadOnly( const rtl::OUString &rPropertyName ) const 784cdf0e10cSrcweir { 785cdf0e10cSrcweir osl::MutexGuard aGuard( GetOwnMutex() ); 786cdf0e10cSrcweir 787cdf0e10cSrcweir sal_Bool bReadOnly = sal_False; 788cdf0e10cSrcweir sal_Int32 nHdl; 789cdf0e10cSrcweir if (GetHdlByName( nHdl, rPropertyName )) 790cdf0e10cSrcweir bReadOnly = IsReadOnly( nHdl ); 791cdf0e10cSrcweir return bReadOnly; 792cdf0e10cSrcweir } 793cdf0e10cSrcweir 794cdf0e10cSrcweir sal_Bool SvtLinguConfigItem::IsReadOnly( sal_Int32 nPropertyHandle ) const 795cdf0e10cSrcweir { 796cdf0e10cSrcweir osl::MutexGuard aGuard( GetOwnMutex() ); 797cdf0e10cSrcweir 798cdf0e10cSrcweir sal_Bool bReadOnly = sal_False; 799cdf0e10cSrcweir 800cdf0e10cSrcweir const SvtLinguOptions &rOpt = const_cast< SvtLinguConfigItem * >(this)->aOpt; 801cdf0e10cSrcweir switch(nPropertyHandle) 802cdf0e10cSrcweir { 803cdf0e10cSrcweir case UPH_IS_USE_DICTIONARY_LIST : bReadOnly = rOpt.bROIsUseDictionaryList ; break; 804cdf0e10cSrcweir case UPH_IS_IGNORE_CONTROL_CHARACTERS : bReadOnly = rOpt.bROIsIgnoreControlCharacters; break; 805cdf0e10cSrcweir case UPH_IS_HYPH_AUTO : bReadOnly = rOpt.bROIsHyphAuto ; break; 806cdf0e10cSrcweir case UPH_IS_HYPH_SPECIAL : bReadOnly = rOpt.bROIsHyphSpecial ; break; 807cdf0e10cSrcweir case UPH_IS_SPELL_AUTO : bReadOnly = rOpt.bROIsSpellAuto ; break; 808cdf0e10cSrcweir case UPH_IS_SPELL_SPECIAL : bReadOnly = rOpt.bROIsSpellSpecial ; break; 809cdf0e10cSrcweir case UPH_IS_WRAP_REVERSE : bReadOnly = rOpt.bROIsSpellReverse ; break; 810cdf0e10cSrcweir case UPH_DEFAULT_LANGUAGE : bReadOnly = rOpt.bRODefaultLanguage ; break; 811cdf0e10cSrcweir case UPH_IS_SPELL_CAPITALIZATION : bReadOnly = rOpt.bROIsSpellCapitalization ; break; 812cdf0e10cSrcweir case UPH_IS_SPELL_WITH_DIGITS : bReadOnly = rOpt.bROIsSpellWithDigits ; break; 813cdf0e10cSrcweir case UPH_IS_SPELL_UPPER_CASE : bReadOnly = rOpt.bROIsSpellUpperCase ; break; 814cdf0e10cSrcweir case UPH_HYPH_MIN_LEADING : bReadOnly = rOpt.bROHyphMinLeading ; break; 815cdf0e10cSrcweir case UPH_HYPH_MIN_TRAILING : bReadOnly = rOpt.bROHyphMinTrailing ; break; 816cdf0e10cSrcweir case UPH_HYPH_MIN_WORD_LENGTH : bReadOnly = rOpt.bROHyphMinWordLength ; break; 817cdf0e10cSrcweir case UPH_ACTIVE_DICTIONARIES : bReadOnly = rOpt.bROActiveDics ; break; 818cdf0e10cSrcweir case UPH_ACTIVE_CONVERSION_DICTIONARIES : bReadOnly = rOpt.bROActiveConvDics ; break; 819cdf0e10cSrcweir case UPH_DEFAULT_LOCALE : bReadOnly = rOpt.bRODefaultLanguage ; break; 820cdf0e10cSrcweir case UPH_DEFAULT_LOCALE_CJK : bReadOnly = rOpt.bRODefaultLanguage_CJK ; break; 821cdf0e10cSrcweir case UPH_DEFAULT_LOCALE_CTL : bReadOnly = rOpt.bRODefaultLanguage_CTL ; break; 822cdf0e10cSrcweir case UPH_IS_IGNORE_POST_POSITIONAL_WORD : bReadOnly = rOpt.bROIsIgnorePostPositionalWord; break; 823cdf0e10cSrcweir case UPH_IS_AUTO_CLOSE_DIALOG : bReadOnly = rOpt.bROIsAutoCloseDialog; break; 824cdf0e10cSrcweir case UPH_IS_SHOW_ENTRIES_RECENTLY_USED_FIRST : bReadOnly = rOpt.bROIsShowEntriesRecentlyUsedFirst; break; 825cdf0e10cSrcweir case UPH_IS_AUTO_REPLACE_UNIQUE_ENTRIES : bReadOnly = rOpt.bROIsAutoReplaceUniqueEntries; break; 826cdf0e10cSrcweir case UPH_IS_DIRECTION_TO_SIMPLIFIED : bReadOnly = rOpt.bROIsDirectionToSimplified; break; 827cdf0e10cSrcweir case UPH_IS_USE_CHARACTER_VARIANTS : bReadOnly = rOpt.bROIsUseCharacterVariants; break; 828cdf0e10cSrcweir case UPH_IS_TRANSLATE_COMMON_TERMS : bReadOnly = rOpt.bROIsTranslateCommonTerms; break; 829cdf0e10cSrcweir case UPH_IS_REVERSE_MAPPING : bReadOnly = rOpt.bROIsReverseMapping; break; 830cdf0e10cSrcweir case UPH_DATA_FILES_CHANGED_CHECK_VALUE : bReadOnly = rOpt.bRODataFilesChangedCheckValue; break; 831cdf0e10cSrcweir case UPH_IS_GRAMMAR_AUTO: bReadOnly = rOpt.bROIsGrammarAuto; break; 832cdf0e10cSrcweir case UPH_IS_GRAMMAR_INTERACTIVE: bReadOnly = rOpt.bROIsGrammarInteractive; break; 833cdf0e10cSrcweir default : 834cdf0e10cSrcweir DBG_ASSERT( 0, "unexpected property handle" ); 835cdf0e10cSrcweir } 836cdf0e10cSrcweir return bReadOnly; 837cdf0e10cSrcweir } 838cdf0e10cSrcweir 839cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 840cdf0e10cSrcweir 841cdf0e10cSrcweir static SvtLinguConfigItem *pCfgItem = 0; 842cdf0e10cSrcweir static sal_Int32 nCfgItemRefCount = 0; 843cdf0e10cSrcweir 844cdf0e10cSrcweir static const rtl::OUString aG_SupportedDictionaryFormats( A2OU("SupportedDictionaryFormats") ); 845cdf0e10cSrcweir static const rtl::OUString aG_Dictionaries( A2OU("Dictionaries") ); 846cdf0e10cSrcweir static const rtl::OUString aG_Locations( A2OU("Locations") ); 847cdf0e10cSrcweir static const rtl::OUString aG_Format( A2OU("Format") ); 848cdf0e10cSrcweir static const rtl::OUString aG_Locales( A2OU("Locales") ); 849cdf0e10cSrcweir static const rtl::OUString aG_DisabledDictionaries( A2OU("DisabledDictionaries") ); 850cdf0e10cSrcweir static const rtl::OUString aG_LastActiveDictionaries( A2OU("LastActiveDictionaries") ); 851cdf0e10cSrcweir 852cdf0e10cSrcweir SvtLinguConfig::SvtLinguConfig() 853cdf0e10cSrcweir { 854cdf0e10cSrcweir // Global access, must be guarded (multithreading) 855cdf0e10cSrcweir osl::MutexGuard aGuard( GetOwnMutex() ); 856cdf0e10cSrcweir ++nCfgItemRefCount; 857cdf0e10cSrcweir } 858cdf0e10cSrcweir 859cdf0e10cSrcweir 860cdf0e10cSrcweir SvtLinguConfig::~SvtLinguConfig() 861cdf0e10cSrcweir { 862cdf0e10cSrcweir osl::MutexGuard aGuard( GetOwnMutex() ); 863cdf0e10cSrcweir 864cdf0e10cSrcweir if (pCfgItem && pCfgItem->IsModified()) 865cdf0e10cSrcweir pCfgItem->Commit(); 866cdf0e10cSrcweir 867cdf0e10cSrcweir if (--nCfgItemRefCount <= 0) 868cdf0e10cSrcweir { 869cdf0e10cSrcweir if (pCfgItem) 870cdf0e10cSrcweir delete pCfgItem; 871cdf0e10cSrcweir pCfgItem = 0; 872cdf0e10cSrcweir } 873cdf0e10cSrcweir } 874cdf0e10cSrcweir 875cdf0e10cSrcweir 876cdf0e10cSrcweir SvtLinguConfigItem & SvtLinguConfig::GetConfigItem() 877cdf0e10cSrcweir { 878cdf0e10cSrcweir // Global access, must be guarded (multithreading) 879cdf0e10cSrcweir osl::MutexGuard aGuard( GetOwnMutex() ); 880cdf0e10cSrcweir if (!pCfgItem) 881cdf0e10cSrcweir { 882cdf0e10cSrcweir pCfgItem = new SvtLinguConfigItem; 883cdf0e10cSrcweir ItemHolder1::holdConfigItem(E_LINGUCFG); 884cdf0e10cSrcweir } 885cdf0e10cSrcweir return *pCfgItem; 886cdf0e10cSrcweir } 887cdf0e10cSrcweir 888cdf0e10cSrcweir 889cdf0e10cSrcweir uno::Sequence< OUString > SvtLinguConfig::GetNodeNames( const OUString &rNode ) 890cdf0e10cSrcweir { 891cdf0e10cSrcweir return GetConfigItem().GetNodeNames( rNode ); 892cdf0e10cSrcweir } 893cdf0e10cSrcweir 894cdf0e10cSrcweir 895cdf0e10cSrcweir uno::Sequence< uno::Any > SvtLinguConfig::GetProperties( const uno::Sequence< OUString > &rNames ) 896cdf0e10cSrcweir { 897cdf0e10cSrcweir return GetConfigItem().GetProperties(rNames); 898cdf0e10cSrcweir } 899cdf0e10cSrcweir 900cdf0e10cSrcweir 901cdf0e10cSrcweir sal_Bool SvtLinguConfig::ReplaceSetProperties( 902cdf0e10cSrcweir const OUString &rNode, uno::Sequence< beans::PropertyValue > rValues ) 903cdf0e10cSrcweir { 904cdf0e10cSrcweir return GetConfigItem().ReplaceSetProperties( rNode, rValues ); 905cdf0e10cSrcweir } 906cdf0e10cSrcweir 907cdf0e10cSrcweir 908cdf0e10cSrcweir uno::Any SvtLinguConfig::GetProperty( const OUString &rPropertyName ) const 909cdf0e10cSrcweir { 910cdf0e10cSrcweir return GetConfigItem().GetProperty( rPropertyName ); 911cdf0e10cSrcweir } 912cdf0e10cSrcweir 913cdf0e10cSrcweir 914cdf0e10cSrcweir uno::Any SvtLinguConfig::GetProperty( sal_Int32 nPropertyHandle ) const 915cdf0e10cSrcweir { 916cdf0e10cSrcweir return GetConfigItem().GetProperty( nPropertyHandle ); 917cdf0e10cSrcweir } 918cdf0e10cSrcweir 919cdf0e10cSrcweir 920cdf0e10cSrcweir sal_Bool SvtLinguConfig::SetProperty( const OUString &rPropertyName, const uno::Any &rValue ) 921cdf0e10cSrcweir { 922cdf0e10cSrcweir return GetConfigItem().SetProperty( rPropertyName, rValue ); 923cdf0e10cSrcweir } 924cdf0e10cSrcweir 925cdf0e10cSrcweir 926cdf0e10cSrcweir sal_Bool SvtLinguConfig::SetProperty( sal_Int32 nPropertyHandle, const uno::Any &rValue ) 927cdf0e10cSrcweir { 928cdf0e10cSrcweir return GetConfigItem().SetProperty( nPropertyHandle, rValue ); 929cdf0e10cSrcweir } 930cdf0e10cSrcweir 931cdf0e10cSrcweir 932cdf0e10cSrcweir sal_Bool SvtLinguConfig::GetOptions( SvtLinguOptions &rOptions ) const 933cdf0e10cSrcweir { 934cdf0e10cSrcweir return GetConfigItem().GetOptions( rOptions ); 935cdf0e10cSrcweir } 936cdf0e10cSrcweir 937cdf0e10cSrcweir 938cdf0e10cSrcweir sal_Bool SvtLinguConfig::SetOptions( const SvtLinguOptions &rOptions ) 939cdf0e10cSrcweir { 940cdf0e10cSrcweir return GetConfigItem().SetOptions( rOptions ); 941cdf0e10cSrcweir } 942cdf0e10cSrcweir 943cdf0e10cSrcweir 944cdf0e10cSrcweir sal_Bool SvtLinguConfig::IsReadOnly( const rtl::OUString &rPropertyName ) const 945cdf0e10cSrcweir { 946cdf0e10cSrcweir return GetConfigItem().IsReadOnly( rPropertyName ); 947cdf0e10cSrcweir } 948cdf0e10cSrcweir 949cdf0e10cSrcweir sal_Bool SvtLinguConfig::IsReadOnly( sal_Int32 nPropertyHandle ) const 950cdf0e10cSrcweir { 951cdf0e10cSrcweir return GetConfigItem().IsReadOnly( nPropertyHandle ); 952cdf0e10cSrcweir } 953cdf0e10cSrcweir 954cdf0e10cSrcweir sal_Bool SvtLinguConfig::GetElementNamesFor( 955cdf0e10cSrcweir const rtl::OUString &rNodeName, 956cdf0e10cSrcweir uno::Sequence< rtl::OUString > &rElementNames ) const 957cdf0e10cSrcweir { 958cdf0e10cSrcweir bool bSuccess = false; 959cdf0e10cSrcweir try 960cdf0e10cSrcweir { 961cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNA( GetMainUpdateAccess(), uno::UNO_QUERY_THROW ); 962cdf0e10cSrcweir xNA.set( xNA->getByName( A2OU("ServiceManager") ), uno::UNO_QUERY_THROW ); 963cdf0e10cSrcweir xNA.set( xNA->getByName( rNodeName ), uno::UNO_QUERY_THROW ); 964cdf0e10cSrcweir rElementNames = xNA->getElementNames(); 965cdf0e10cSrcweir bSuccess = true; 966cdf0e10cSrcweir } 967cdf0e10cSrcweir catch (uno::Exception &) 968cdf0e10cSrcweir { 969cdf0e10cSrcweir } 970cdf0e10cSrcweir return bSuccess; 971cdf0e10cSrcweir } 972cdf0e10cSrcweir 973cdf0e10cSrcweir static uno::Reference< container::XNameAccess > GetOrCreateSetEntry_Impl( 974cdf0e10cSrcweir const uno::Reference< container::XNameAccess > &rxSetNameAccess, 975cdf0e10cSrcweir const rtl::OUString &rEntryName ) 976cdf0e10cSrcweir { 977cdf0e10cSrcweir uno::Reference< container::XNameAccess > xResult; 978cdf0e10cSrcweir try 979cdf0e10cSrcweir { 980cdf0e10cSrcweir if (!rxSetNameAccess->hasByName( rEntryName )) 981cdf0e10cSrcweir { 982cdf0e10cSrcweir uno::Reference< lang::XSingleServiceFactory > xFactory( rxSetNameAccess, uno::UNO_QUERY_THROW); 983cdf0e10cSrcweir uno::Reference< uno::XInterface > xNewEntry( xFactory->createInstance() ); 984cdf0e10cSrcweir uno::Reference< container::XNameContainer > xNC( rxSetNameAccess, uno::UNO_QUERY_THROW ); 985cdf0e10cSrcweir xNC->insertByName( rEntryName, makeAny( xNewEntry ) ); 986cdf0e10cSrcweir } 987cdf0e10cSrcweir xResult.set( rxSetNameAccess->getByName( rEntryName ), uno::UNO_QUERY_THROW ); 988cdf0e10cSrcweir } 989cdf0e10cSrcweir catch (uno::Exception &) 990cdf0e10cSrcweir { 991cdf0e10cSrcweir } 992cdf0e10cSrcweir return xResult; 993cdf0e10cSrcweir } 994cdf0e10cSrcweir 995cdf0e10cSrcweir sal_Bool SvtLinguConfig::GetSupportedDictionaryFormatsFor( 996cdf0e10cSrcweir const rtl::OUString &rSetName, 997cdf0e10cSrcweir const rtl::OUString &rSetEntry, 998cdf0e10cSrcweir uno::Sequence< rtl::OUString > &rFormatList ) const 999cdf0e10cSrcweir { 1000cdf0e10cSrcweir if (rSetName.getLength() == 0 || rSetEntry.getLength() == 0) 1001cdf0e10cSrcweir return sal_False; 1002cdf0e10cSrcweir bool bSuccess = false; 1003cdf0e10cSrcweir try 1004cdf0e10cSrcweir { 1005cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNA( GetMainUpdateAccess(), uno::UNO_QUERY_THROW ); 1006cdf0e10cSrcweir xNA.set( xNA->getByName( A2OU("ServiceManager") ), uno::UNO_QUERY_THROW ); 1007cdf0e10cSrcweir xNA.set( xNA->getByName( rSetName ), uno::UNO_QUERY_THROW ); 1008cdf0e10cSrcweir xNA.set( xNA->getByName( rSetEntry ), uno::UNO_QUERY_THROW ); 1009cdf0e10cSrcweir if (xNA->getByName( aG_SupportedDictionaryFormats ) >>= rFormatList) 1010cdf0e10cSrcweir bSuccess = true; 1011cdf0e10cSrcweir DBG_ASSERT( rFormatList.getLength(), "supported dictionary format list is empty" ); 1012cdf0e10cSrcweir } 1013cdf0e10cSrcweir catch (uno::Exception &) 1014cdf0e10cSrcweir { 1015cdf0e10cSrcweir } 1016cdf0e10cSrcweir return bSuccess; 1017cdf0e10cSrcweir } 1018cdf0e10cSrcweir 1019cdf0e10cSrcweir void SvtLinguConfig::SetOrCreateSupportedDictionaryFormatsFor( 1020cdf0e10cSrcweir const rtl::OUString &rSetName, 1021cdf0e10cSrcweir const rtl::OUString &rSetEntry, 1022cdf0e10cSrcweir const uno::Sequence< rtl::OUString > &rFormatList ) const 1023cdf0e10cSrcweir { 1024cdf0e10cSrcweir if (rSetName.getLength() == 0 || rSetEntry.getLength() == 0) 1025cdf0e10cSrcweir return; 1026cdf0e10cSrcweir try 1027cdf0e10cSrcweir { 1028cdf0e10cSrcweir DBG_ASSERT( rFormatList.getLength(), "applying empty format list. Really??" ); 1029cdf0e10cSrcweir 1030cdf0e10cSrcweir uno::Reference< util::XChangesBatch > xUpdateAccess( GetMainUpdateAccess() ); 1031cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNA( xUpdateAccess, uno::UNO_QUERY_THROW ); 1032cdf0e10cSrcweir xNA.set( xNA->getByName( A2OU("ServiceManager") ), uno::UNO_QUERY_THROW ); 1033cdf0e10cSrcweir xNA.set( xNA->getByName( rSetName ), uno::UNO_QUERY_THROW ); 1034cdf0e10cSrcweir xNA = GetOrCreateSetEntry_Impl( xNA, rSetEntry ); 1035cdf0e10cSrcweir 1036cdf0e10cSrcweir uno::Reference< container::XNameReplace > xNR( xNA, uno::UNO_QUERY_THROW ); 1037cdf0e10cSrcweir xNR->replaceByName( aG_SupportedDictionaryFormats, uno::makeAny( rFormatList ) ); 1038cdf0e10cSrcweir 1039cdf0e10cSrcweir xUpdateAccess->commitChanges(); 1040cdf0e10cSrcweir } 1041cdf0e10cSrcweir catch (uno::Exception &) 1042cdf0e10cSrcweir { 1043cdf0e10cSrcweir } 1044cdf0e10cSrcweir } 1045cdf0e10cSrcweir 1046cdf0e10cSrcweir 1047cdf0e10cSrcweir static uno::WeakReference< util::XMacroExpander > aG_xMacroExpander; 1048cdf0e10cSrcweir 1049cdf0e10cSrcweir static uno::Reference< util::XMacroExpander > lcl_GetMacroExpander() 1050cdf0e10cSrcweir { 1051cdf0e10cSrcweir uno::Reference< util::XMacroExpander > xMacroExpander( aG_xMacroExpander ); 1052cdf0e10cSrcweir if ( !xMacroExpander.is() ) 1053cdf0e10cSrcweir { 1054cdf0e10cSrcweir if ( !xMacroExpander.is() ) 1055cdf0e10cSrcweir { 1056cdf0e10cSrcweir uno::Reference< uno::XComponentContext > xContext; 1057cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY ); 1058cdf0e10cSrcweir xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))) >>= xContext; 1059cdf0e10cSrcweir if ( xContext.is() ) 1060cdf0e10cSrcweir { 1061cdf0e10cSrcweir aG_xMacroExpander = uno::Reference< com::sun::star::util::XMacroExpander >( xContext->getValueByName( 1062cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "/singletons/com.sun.star.util.theMacroExpander"))), 1063cdf0e10cSrcweir uno::UNO_QUERY ); 1064cdf0e10cSrcweir xMacroExpander = aG_xMacroExpander; 1065cdf0e10cSrcweir } 1066cdf0e10cSrcweir } 1067cdf0e10cSrcweir } 1068cdf0e10cSrcweir 1069cdf0e10cSrcweir return xMacroExpander; 1070cdf0e10cSrcweir } 1071cdf0e10cSrcweir 1072cdf0e10cSrcweir 1073cdf0e10cSrcweir static bool lcl_GetFileUrlFromOrigin( 1074cdf0e10cSrcweir OUString /*out*/ &rFileUrl, 1075cdf0e10cSrcweir const OUString &rOrigin, 1076cdf0e10cSrcweir uno::Reference< util::XMacroExpander > &rxMacroExpander ) 1077cdf0e10cSrcweir { 1078cdf0e10cSrcweir bool bSuccess = false; 1079cdf0e10cSrcweir if (rOrigin.getLength() > 0 && rxMacroExpander.is()) 1080cdf0e10cSrcweir { 1081cdf0e10cSrcweir rtl::OUString aURL( rOrigin ); 1082cdf0e10cSrcweir if (( aURL.compareToAscii( RTL_CONSTASCII_STRINGPARAM( EXPAND_PROTOCOL )) == 0 ) && 1083cdf0e10cSrcweir rxMacroExpander.is() ) 1084cdf0e10cSrcweir { 1085cdf0e10cSrcweir // cut protocol 1086cdf0e10cSrcweir OUString aMacro( aURL.copy( sizeof ( EXPAND_PROTOCOL ) -1 ) ); 1087cdf0e10cSrcweir // decode uric class chars 1088cdf0e10cSrcweir aMacro = Uri::decode( aMacro, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 ); 1089cdf0e10cSrcweir // expand macro string 1090cdf0e10cSrcweir aURL = rxMacroExpander->expandMacros( aMacro ); 1091cdf0e10cSrcweir 1092cdf0e10cSrcweir bool bIsFileUrl = aURL.compareToAscii( RTL_CONSTASCII_STRINGPARAM( FILE_PROTOCOL )) == 0; 1093cdf0e10cSrcweir if (bIsFileUrl) 1094cdf0e10cSrcweir { 1095cdf0e10cSrcweir rFileUrl = aURL; 1096cdf0e10cSrcweir bSuccess = true; 1097cdf0e10cSrcweir } 1098cdf0e10cSrcweir else 1099cdf0e10cSrcweir { 1100cdf0e10cSrcweir DBG_ASSERT( bIsFileUrl, "not a file URL"); 1101cdf0e10cSrcweir } 1102cdf0e10cSrcweir } 1103cdf0e10cSrcweir else 1104cdf0e10cSrcweir { 1105cdf0e10cSrcweir DBG_ASSERT( 0, "failed to get file URL" ); 1106cdf0e10cSrcweir } 1107cdf0e10cSrcweir } 1108cdf0e10cSrcweir return bSuccess; 1109cdf0e10cSrcweir } 1110cdf0e10cSrcweir 1111cdf0e10cSrcweir 1112cdf0e10cSrcweir sal_Bool SvtLinguConfig::GetDictionaryEntry( 1113cdf0e10cSrcweir const rtl::OUString &rNodeName, 1114cdf0e10cSrcweir SvtLinguConfigDictionaryEntry &rDicEntry ) const 1115cdf0e10cSrcweir { 1116cdf0e10cSrcweir if (rNodeName.getLength() == 0) 1117cdf0e10cSrcweir return sal_False; 1118cdf0e10cSrcweir bool bSuccess = false; 1119cdf0e10cSrcweir try 1120cdf0e10cSrcweir { 1121cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNA( GetMainUpdateAccess(), uno::UNO_QUERY_THROW ); 1122cdf0e10cSrcweir xNA.set( xNA->getByName( A2OU("ServiceManager") ), uno::UNO_QUERY_THROW ); 1123cdf0e10cSrcweir xNA.set( xNA->getByName( aG_Dictionaries ), uno::UNO_QUERY_THROW ); 1124cdf0e10cSrcweir xNA.set( xNA->getByName( rNodeName ), uno::UNO_QUERY_THROW ); 1125cdf0e10cSrcweir 1126cdf0e10cSrcweir // read group data... 1127cdf0e10cSrcweir uno::Sequence< rtl::OUString > aLocations; 1128cdf0e10cSrcweir rtl::OUString aFormatName; 1129cdf0e10cSrcweir uno::Sequence< rtl::OUString > aLocaleNames; 1130cdf0e10cSrcweir bSuccess = (xNA->getByName( aG_Locations ) >>= aLocations) && 1131cdf0e10cSrcweir (xNA->getByName( aG_Format ) >>= aFormatName) && 1132cdf0e10cSrcweir (xNA->getByName( aG_Locales ) >>= aLocaleNames); 1133cdf0e10cSrcweir DBG_ASSERT( aLocations.getLength(), "Dictionary locations not set" ); 1134cdf0e10cSrcweir DBG_ASSERT( aFormatName.getLength(), "Dictionary format name not set" ); 1135cdf0e10cSrcweir DBG_ASSERT( aLocaleNames.getLength(), "No locales set for the dictionary" ); 1136cdf0e10cSrcweir 1137cdf0e10cSrcweir // if sucessful continue 1138cdf0e10cSrcweir if (bSuccess) 1139cdf0e10cSrcweir { 1140cdf0e10cSrcweir // get file URL's for the locations 1141cdf0e10cSrcweir uno::Reference< util::XMacroExpander > xMacroExpander( lcl_GetMacroExpander() ); 1142cdf0e10cSrcweir for (sal_Int32 i = 0; i < aLocations.getLength(); ++i) 1143cdf0e10cSrcweir { 1144cdf0e10cSrcweir rtl::OUString &rLocation = aLocations[i]; 1145cdf0e10cSrcweir if (!lcl_GetFileUrlFromOrigin( rLocation, rLocation, xMacroExpander )) 1146cdf0e10cSrcweir bSuccess = false; 1147cdf0e10cSrcweir } 1148cdf0e10cSrcweir 1149cdf0e10cSrcweir // if everything was fine return the result 1150cdf0e10cSrcweir if (bSuccess) 1151cdf0e10cSrcweir { 1152cdf0e10cSrcweir rDicEntry.aLocations = aLocations; 1153cdf0e10cSrcweir rDicEntry.aFormatName = aFormatName; 1154cdf0e10cSrcweir rDicEntry.aLocaleNames = aLocaleNames; 1155cdf0e10cSrcweir } 1156cdf0e10cSrcweir } 1157cdf0e10cSrcweir } 1158cdf0e10cSrcweir catch (uno::Exception &) 1159cdf0e10cSrcweir { 1160cdf0e10cSrcweir } 1161cdf0e10cSrcweir return bSuccess; 1162cdf0e10cSrcweir } 1163cdf0e10cSrcweir 1164cdf0e10cSrcweir void SvtLinguConfig::SetOrCreateDictionaryEntry( 1165cdf0e10cSrcweir const rtl::OUString &rNodeName, 1166cdf0e10cSrcweir const SvtLinguConfigDictionaryEntry &rDicEntry ) const 1167cdf0e10cSrcweir { 1168cdf0e10cSrcweir if (rNodeName.getLength() == 0) 1169cdf0e10cSrcweir return; 1170cdf0e10cSrcweir try 1171cdf0e10cSrcweir { 1172cdf0e10cSrcweir uno::Reference< util::XChangesBatch > xUpdateAccess( GetMainUpdateAccess() ); 1173cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNA( xUpdateAccess, uno::UNO_QUERY_THROW ); 1174cdf0e10cSrcweir xNA.set( xNA->getByName( A2OU("ServiceManager") ), uno::UNO_QUERY_THROW ); 1175cdf0e10cSrcweir xNA.set( xNA->getByName( aG_Dictionaries ), uno::UNO_QUERY_THROW ); 1176cdf0e10cSrcweir xNA = GetOrCreateSetEntry_Impl( xNA, rNodeName ); 1177cdf0e10cSrcweir 1178cdf0e10cSrcweir DBG_ASSERT( rDicEntry.aLocations.getLength(), "Applying empty dictionary locations. Really correct??" ); 1179cdf0e10cSrcweir DBG_ASSERT( rDicEntry.aFormatName.getLength(), "Applying empty dictionary format name. Really correct??" ); 1180cdf0e10cSrcweir DBG_ASSERT( rDicEntry.aLocaleNames.getLength(), "Applying empty list of locales for the dictionary. Really correct??" ); 1181cdf0e10cSrcweir 1182cdf0e10cSrcweir uno::Reference< container::XNameReplace > xNR( xNA, uno::UNO_QUERY_THROW ); 1183cdf0e10cSrcweir xNR->replaceByName( aG_Locations, uno::makeAny( rDicEntry.aLocations ) ); 1184cdf0e10cSrcweir xNR->replaceByName( aG_Format, uno::makeAny( rDicEntry.aFormatName ) ); 1185cdf0e10cSrcweir xNR->replaceByName( aG_Locales, uno::makeAny( rDicEntry.aLocaleNames ) ); 1186cdf0e10cSrcweir 1187cdf0e10cSrcweir xUpdateAccess->commitChanges(); 1188cdf0e10cSrcweir } 1189cdf0e10cSrcweir catch (uno::Exception &) 1190cdf0e10cSrcweir { 1191cdf0e10cSrcweir } 1192cdf0e10cSrcweir } 1193cdf0e10cSrcweir 1194cdf0e10cSrcweir uno::Sequence< rtl::OUString > SvtLinguConfig::GetDisabledDictionaries() const 1195cdf0e10cSrcweir { 1196cdf0e10cSrcweir uno::Sequence< rtl::OUString > aResult; 1197cdf0e10cSrcweir try 1198cdf0e10cSrcweir { 1199cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNA( GetMainUpdateAccess(), uno::UNO_QUERY_THROW ); 1200cdf0e10cSrcweir xNA.set( xNA->getByName( A2OU("ServiceManager") ), uno::UNO_QUERY_THROW ); 1201cdf0e10cSrcweir xNA->getByName( aG_DisabledDictionaries ) >>= aResult; 1202cdf0e10cSrcweir } 1203cdf0e10cSrcweir catch (uno::Exception &) 1204cdf0e10cSrcweir { 1205cdf0e10cSrcweir } 1206cdf0e10cSrcweir return aResult; 1207cdf0e10cSrcweir } 1208cdf0e10cSrcweir 1209cdf0e10cSrcweir void SvtLinguConfig::SetDisabledDictionaries( 1210cdf0e10cSrcweir const uno::Sequence< rtl::OUString > &rDictionaries ) const 1211cdf0e10cSrcweir { 1212cdf0e10cSrcweir try 1213cdf0e10cSrcweir { 1214cdf0e10cSrcweir uno::Reference< util::XChangesBatch > xUpdateAccess( GetMainUpdateAccess() ); 1215cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNA( xUpdateAccess, uno::UNO_QUERY_THROW ); 1216cdf0e10cSrcweir xNA.set( xNA->getByName( A2OU("ServiceManager") ), uno::UNO_QUERY_THROW ); 1217cdf0e10cSrcweir if (xNA->hasByName( aG_DisabledDictionaries )) 1218cdf0e10cSrcweir { 1219cdf0e10cSrcweir uno::Reference< container::XNameReplace > xNR( xNA, uno::UNO_QUERY_THROW ); 1220cdf0e10cSrcweir xNR->replaceByName( aG_DisabledDictionaries, makeAny( rDictionaries ) ); 1221cdf0e10cSrcweir } 1222cdf0e10cSrcweir else 1223cdf0e10cSrcweir { 1224cdf0e10cSrcweir uno::Reference< container::XNameContainer > xNC( xNA, uno::UNO_QUERY_THROW ); 1225cdf0e10cSrcweir xNC->insertByName( aG_DisabledDictionaries, makeAny( rDictionaries ) ); 1226cdf0e10cSrcweir } 1227cdf0e10cSrcweir 1228cdf0e10cSrcweir xUpdateAccess->commitChanges(); 1229cdf0e10cSrcweir } 1230cdf0e10cSrcweir catch (uno::Exception &) 1231cdf0e10cSrcweir { 1232cdf0e10cSrcweir } 1233cdf0e10cSrcweir } 1234cdf0e10cSrcweir 1235cdf0e10cSrcweir std::vector< SvtLinguConfigDictionaryEntry > SvtLinguConfig::GetActiveDictionariesByFormat( 1236cdf0e10cSrcweir const rtl::OUString &rFormatName ) 1237cdf0e10cSrcweir { 1238cdf0e10cSrcweir std::vector< SvtLinguConfigDictionaryEntry > aRes; 1239cdf0e10cSrcweir if (rFormatName.getLength() == 0) 1240cdf0e10cSrcweir return aRes; 1241cdf0e10cSrcweir 1242cdf0e10cSrcweir try 1243cdf0e10cSrcweir { 1244cdf0e10cSrcweir uno::Sequence< rtl::OUString > aElementNames; 1245cdf0e10cSrcweir GetElementNamesFor( aG_Dictionaries, aElementNames ); 1246cdf0e10cSrcweir sal_Int32 nLen = aElementNames.getLength(); 1247cdf0e10cSrcweir const rtl::OUString *pElementNames = aElementNames.getConstArray(); 1248cdf0e10cSrcweir 1249cdf0e10cSrcweir SvtLinguConfigDictionaryEntry aDicEntry; 1250cdf0e10cSrcweir for (sal_Int32 i = 0; i < nLen; ++i) 1251cdf0e10cSrcweir { 1252cdf0e10cSrcweir // does dictionary match the format we are looking for? 1253cdf0e10cSrcweir if (GetDictionaryEntry( pElementNames[i], aDicEntry ) && 1254cdf0e10cSrcweir aDicEntry.aFormatName == rFormatName) 1255cdf0e10cSrcweir { 1256cdf0e10cSrcweir // check if it is active or not 1257cdf0e10cSrcweir bool bDicIsActive = true; 1258cdf0e10cSrcweir const uno::Sequence< rtl::OUString > aDisabledDics( GetDisabledDictionaries() ); 1259cdf0e10cSrcweir for (sal_Int32 k = 0; bDicIsActive && k < aDisabledDics.getLength(); ++k) 1260cdf0e10cSrcweir { 1261cdf0e10cSrcweir if (aDisabledDics[k] == pElementNames[i]) 1262cdf0e10cSrcweir bDicIsActive = false; 1263cdf0e10cSrcweir } 1264cdf0e10cSrcweir 1265cdf0e10cSrcweir if (bDicIsActive) 1266cdf0e10cSrcweir { 1267cdf0e10cSrcweir DBG_ASSERT( aDicEntry.aFormatName.getLength(), 1268cdf0e10cSrcweir "FormatName not set" ); 1269cdf0e10cSrcweir DBG_ASSERT( aDicEntry.aLocations.getLength(), 1270cdf0e10cSrcweir "Locations not set" ); 1271cdf0e10cSrcweir DBG_ASSERT( aDicEntry.aLocaleNames.getLength(), 1272cdf0e10cSrcweir "Locales not set" ); 1273cdf0e10cSrcweir aRes.push_back( aDicEntry ); 1274cdf0e10cSrcweir } 1275cdf0e10cSrcweir } 1276cdf0e10cSrcweir } 1277cdf0e10cSrcweir } 1278cdf0e10cSrcweir catch (uno::Exception &) 1279cdf0e10cSrcweir { 1280cdf0e10cSrcweir } 1281cdf0e10cSrcweir 1282cdf0e10cSrcweir return aRes; 1283cdf0e10cSrcweir } 1284cdf0e10cSrcweir 1285cdf0e10cSrcweir 1286cdf0e10cSrcweir uno::Reference< util::XChangesBatch > SvtLinguConfig::GetMainUpdateAccess() const 1287cdf0e10cSrcweir { 1288cdf0e10cSrcweir if (!m_xMainUpdateAccess.is()) 1289cdf0e10cSrcweir { 1290cdf0e10cSrcweir try 1291cdf0e10cSrcweir { 1292cdf0e10cSrcweir // get configuration provider 1293cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > xConfigurationProvider; 1294cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > xMgr = comphelper::getProcessServiceFactory(); 1295cdf0e10cSrcweir if (xMgr.is()) 1296cdf0e10cSrcweir { 1297cdf0e10cSrcweir xConfigurationProvider = uno::Reference< lang::XMultiServiceFactory > ( 1298cdf0e10cSrcweir xMgr->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( 1299cdf0e10cSrcweir "com.sun.star.configuration.ConfigurationProvider" ) ) ), 1300cdf0e10cSrcweir uno::UNO_QUERY_THROW ) ; 1301cdf0e10cSrcweir } 1302cdf0e10cSrcweir 1303cdf0e10cSrcweir // get configuration update access 1304cdf0e10cSrcweir beans::PropertyValue aValue; 1305cdf0e10cSrcweir aValue.Name = A2OU( "nodepath" ); 1306cdf0e10cSrcweir aValue.Value = uno::makeAny( A2OU("org.openoffice.Office.Linguistic") ); 1307cdf0e10cSrcweir uno::Sequence< uno::Any > aProps(1); 1308cdf0e10cSrcweir aProps[0] <<= aValue; 1309cdf0e10cSrcweir m_xMainUpdateAccess = uno::Reference< util::XChangesBatch >( 1310cdf0e10cSrcweir xConfigurationProvider->createInstanceWithArguments( 1311cdf0e10cSrcweir A2OU( "com.sun.star.configuration.ConfigurationUpdateAccess" ), aProps ), 1312cdf0e10cSrcweir uno::UNO_QUERY_THROW ); 1313cdf0e10cSrcweir } 1314cdf0e10cSrcweir catch (uno::Exception &) 1315cdf0e10cSrcweir { 1316cdf0e10cSrcweir } 1317cdf0e10cSrcweir } 1318cdf0e10cSrcweir 1319cdf0e10cSrcweir return m_xMainUpdateAccess; 1320cdf0e10cSrcweir } 1321cdf0e10cSrcweir 1322cdf0e10cSrcweir 1323cdf0e10cSrcweir rtl::OUString SvtLinguConfig::GetVendorImageUrl_Impl( 1324cdf0e10cSrcweir const rtl::OUString &rServiceImplName, 1325cdf0e10cSrcweir const rtl::OUString &rImageName ) const 1326cdf0e10cSrcweir { 1327cdf0e10cSrcweir rtl::OUString aRes; 1328cdf0e10cSrcweir try 1329cdf0e10cSrcweir { 1330cdf0e10cSrcweir uno::Reference< container::XNameAccess > xImagesNA( GetMainUpdateAccess(), uno::UNO_QUERY_THROW ); 1331cdf0e10cSrcweir xImagesNA.set( xImagesNA->getByName( A2OU("Images") ), uno::UNO_QUERY_THROW ); 1332cdf0e10cSrcweir 1333cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNA( xImagesNA->getByName( A2OU("ServiceNameEntries") ), uno::UNO_QUERY_THROW ); 1334cdf0e10cSrcweir xNA.set( xNA->getByName( rServiceImplName ), uno::UNO_QUERY_THROW ); 1335cdf0e10cSrcweir uno::Any aAny( xNA->getByName( A2OU("VendorImagesNode") ) ); 1336cdf0e10cSrcweir rtl::OUString aVendorImagesNode; 1337cdf0e10cSrcweir if (aAny >>= aVendorImagesNode) 1338cdf0e10cSrcweir { 1339cdf0e10cSrcweir xNA = xImagesNA; 1340cdf0e10cSrcweir xNA.set( xNA->getByName( A2OU("VendorImages") ), uno::UNO_QUERY_THROW ); 1341cdf0e10cSrcweir xNA.set( xNA->getByName( aVendorImagesNode ), uno::UNO_QUERY_THROW ); 1342cdf0e10cSrcweir aAny = xNA->getByName( rImageName ); 1343cdf0e10cSrcweir rtl::OUString aTmp; 1344cdf0e10cSrcweir if (aAny >>= aTmp) 1345cdf0e10cSrcweir { 1346cdf0e10cSrcweir uno::Reference< util::XMacroExpander > xMacroExpander( lcl_GetMacroExpander() ); 1347cdf0e10cSrcweir if (lcl_GetFileUrlFromOrigin( aTmp, aTmp, xMacroExpander )) 1348cdf0e10cSrcweir aRes = aTmp; 1349cdf0e10cSrcweir } 1350cdf0e10cSrcweir } 1351cdf0e10cSrcweir } 1352cdf0e10cSrcweir catch (uno::Exception &) 1353cdf0e10cSrcweir { 1354cdf0e10cSrcweir DBG_ASSERT( 0, "exception caught. GetVendorImageUrl_Impl failed" ); 1355cdf0e10cSrcweir } 1356cdf0e10cSrcweir return aRes; 1357cdf0e10cSrcweir } 1358cdf0e10cSrcweir 1359cdf0e10cSrcweir 1360cdf0e10cSrcweir rtl::OUString SvtLinguConfig::GetSpellAndGrammarDialogImage( 1361cdf0e10cSrcweir const rtl::OUString &rServiceImplName, 1362cdf0e10cSrcweir bool bHighContrast ) const 1363cdf0e10cSrcweir { 1364cdf0e10cSrcweir rtl::OUString aRes; 1365cdf0e10cSrcweir if (rServiceImplName.getLength() > 0) 1366cdf0e10cSrcweir { 1367cdf0e10cSrcweir rtl::OUString aImageName( A2OU( bHighContrast ? "SpellAndGrammarDialogImage_HC" : "SpellAndGrammarDialogImage" )); 1368cdf0e10cSrcweir rtl::OUString aPath( GetVendorImageUrl_Impl( rServiceImplName, aImageName ) ); 1369cdf0e10cSrcweir aRes = aPath; 1370cdf0e10cSrcweir } 1371cdf0e10cSrcweir return aRes; 1372cdf0e10cSrcweir } 1373cdf0e10cSrcweir 1374cdf0e10cSrcweir 1375cdf0e10cSrcweir rtl::OUString SvtLinguConfig::GetSpellAndGrammarContextSuggestionImage( 1376cdf0e10cSrcweir const rtl::OUString &rServiceImplName, 1377cdf0e10cSrcweir bool bHighContrast ) const 1378cdf0e10cSrcweir { 1379cdf0e10cSrcweir rtl::OUString aRes; 1380cdf0e10cSrcweir if (rServiceImplName.getLength() > 0) 1381cdf0e10cSrcweir { 1382cdf0e10cSrcweir rtl::OUString aImageName( A2OU( bHighContrast ? "SpellAndGrammarContextMenuSuggestionImage_HC" : "SpellAndGrammarContextMenuSuggestionImage" )); 1383cdf0e10cSrcweir rtl::OUString aPath( GetVendorImageUrl_Impl( rServiceImplName, aImageName ) ); 1384cdf0e10cSrcweir aRes = aPath; 1385cdf0e10cSrcweir } 1386cdf0e10cSrcweir return aRes; 1387cdf0e10cSrcweir } 1388cdf0e10cSrcweir 1389cdf0e10cSrcweir 1390cdf0e10cSrcweir rtl::OUString SvtLinguConfig::GetSpellAndGrammarContextDictionaryImage( 1391cdf0e10cSrcweir const rtl::OUString &rServiceImplName, 1392cdf0e10cSrcweir bool bHighContrast ) const 1393cdf0e10cSrcweir { 1394cdf0e10cSrcweir rtl::OUString aRes; 1395cdf0e10cSrcweir if (rServiceImplName.getLength() > 0) 1396cdf0e10cSrcweir { 1397cdf0e10cSrcweir rtl::OUString aImageName( A2OU( bHighContrast ? "SpellAndGrammarContextMenuDictionaryImage_HC" : "SpellAndGrammarContextMenuDictionaryImage" )); 1398cdf0e10cSrcweir rtl::OUString aPath( GetVendorImageUrl_Impl( rServiceImplName, aImageName ) ); 1399cdf0e10cSrcweir aRes = aPath; 1400cdf0e10cSrcweir } 1401cdf0e10cSrcweir return aRes; 1402cdf0e10cSrcweir } 1403cdf0e10cSrcweir 1404cdf0e10cSrcweir 1405cdf0e10cSrcweir ::rtl::OUString SvtLinguConfig::GetThesaurusDialogImage( 1406cdf0e10cSrcweir const ::rtl::OUString &rServiceImplName, 1407cdf0e10cSrcweir bool bHighContrast ) const 1408cdf0e10cSrcweir { 1409cdf0e10cSrcweir rtl::OUString aRes; 1410cdf0e10cSrcweir if (rServiceImplName.getLength() > 0) 1411cdf0e10cSrcweir { 1412cdf0e10cSrcweir rtl::OUString aImageName( A2OU( bHighContrast ? "ThesaurusDialogImage_HC" : "ThesaurusDialogImage" )); 1413cdf0e10cSrcweir rtl::OUString aPath( GetVendorImageUrl_Impl( rServiceImplName, aImageName ) ); 1414cdf0e10cSrcweir aRes = aPath; 1415cdf0e10cSrcweir } 1416cdf0e10cSrcweir return aRes; 1417cdf0e10cSrcweir } 1418cdf0e10cSrcweir 1419cdf0e10cSrcweir 1420cdf0e10cSrcweir ::rtl::OUString SvtLinguConfig::GetSynonymsContextImage( 1421cdf0e10cSrcweir const ::rtl::OUString &rServiceImplName, 1422cdf0e10cSrcweir bool bHighContrast ) const 1423cdf0e10cSrcweir { 1424cdf0e10cSrcweir rtl::OUString aRes; 1425cdf0e10cSrcweir if (rServiceImplName.getLength() > 0) 1426cdf0e10cSrcweir { 1427cdf0e10cSrcweir rtl::OUString aImageName( A2OU( bHighContrast ? "SynonymsContextMenuImage_HC" : "SynonymsContextMenuImage" )); 1428cdf0e10cSrcweir rtl::OUString aPath( GetVendorImageUrl_Impl( rServiceImplName, aImageName ) ); 1429cdf0e10cSrcweir aRes = aPath; 1430cdf0e10cSrcweir } 1431cdf0e10cSrcweir return aRes; 1432cdf0e10cSrcweir } 1433cdf0e10cSrcweir 1434cdf0e10cSrcweir 1435cdf0e10cSrcweir bool SvtLinguConfig::HasVendorImages( const char *pImageName ) const 1436cdf0e10cSrcweir { 1437cdf0e10cSrcweir bool bRes = false; 1438cdf0e10cSrcweir if (pImageName) 1439cdf0e10cSrcweir { 1440cdf0e10cSrcweir try 1441cdf0e10cSrcweir { 1442cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNA( GetMainUpdateAccess(), uno::UNO_QUERY_THROW ); 1443cdf0e10cSrcweir xNA.set( xNA->getByName( A2OU("Images") ), uno::UNO_QUERY_THROW ); 1444cdf0e10cSrcweir xNA.set( xNA->getByName( A2OU("VendorImages") ), uno::UNO_QUERY_THROW ); 1445cdf0e10cSrcweir 1446cdf0e10cSrcweir uno::Sequence< rtl::OUString > aElementNames( xNA->getElementNames() ); 1447cdf0e10cSrcweir sal_Int32 nVendors = aElementNames.getLength(); 1448cdf0e10cSrcweir const rtl::OUString *pVendor = aElementNames.getConstArray(); 1449cdf0e10cSrcweir for (sal_Int32 i = 0; i < nVendors; ++i) 1450cdf0e10cSrcweir { 1451cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNA2( xNA->getByName( pVendor[i] ), uno::UNO_QUERY_THROW ); 1452cdf0e10cSrcweir uno::Sequence< rtl::OUString > aPropNames( xNA2->getElementNames() ); 1453cdf0e10cSrcweir sal_Int32 nProps = aPropNames.getLength(); 1454cdf0e10cSrcweir const rtl::OUString *pPropNames = aPropNames.getConstArray(); 1455cdf0e10cSrcweir for (sal_Int32 k = 0; k < nProps; ++k) 1456cdf0e10cSrcweir { 1457cdf0e10cSrcweir // for a quicker check we ignore the HC image names here 1458cdf0e10cSrcweir const OUString &rName = pPropNames[k]; 1459cdf0e10cSrcweir if (rName.equalsAscii( pImageName )) 1460cdf0e10cSrcweir { 1461cdf0e10cSrcweir bRes = true; 1462cdf0e10cSrcweir break; 1463cdf0e10cSrcweir } 1464cdf0e10cSrcweir } 1465cdf0e10cSrcweir } 1466cdf0e10cSrcweir } 1467cdf0e10cSrcweir catch (uno::Exception &) 1468cdf0e10cSrcweir { 1469cdf0e10cSrcweir DBG_ASSERT( 0, "exception caught. HasVendorImages failed" ); 1470cdf0e10cSrcweir } 1471cdf0e10cSrcweir } 1472cdf0e10cSrcweir return bRes; 1473cdf0e10cSrcweir } 1474cdf0e10cSrcweir 1475cdf0e10cSrcweir 1476cdf0e10cSrcweir bool SvtLinguConfig::HasGrammarChecker() const 1477cdf0e10cSrcweir { 1478cdf0e10cSrcweir bool bRes = false; 1479cdf0e10cSrcweir 1480cdf0e10cSrcweir try 1481cdf0e10cSrcweir { 1482cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNA( GetMainUpdateAccess(), uno::UNO_QUERY_THROW ); 1483cdf0e10cSrcweir xNA.set( xNA->getByName( A2OU("ServiceManager") ), uno::UNO_QUERY_THROW ); 1484cdf0e10cSrcweir xNA.set( xNA->getByName( A2OU("GrammarCheckerList") ), uno::UNO_QUERY_THROW ); 1485cdf0e10cSrcweir 1486cdf0e10cSrcweir uno::Sequence< rtl::OUString > aElementNames( xNA->getElementNames() ); 1487cdf0e10cSrcweir bRes = aElementNames.getLength() > 0; 1488cdf0e10cSrcweir } 1489cdf0e10cSrcweir catch (uno::Exception &) 1490cdf0e10cSrcweir { 1491cdf0e10cSrcweir } 1492cdf0e10cSrcweir 1493cdf0e10cSrcweir return bRes; 1494cdf0e10cSrcweir } 1495cdf0e10cSrcweir 1496cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 1497cdf0e10cSrcweir 1498