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