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