1*b5088357SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*b5088357SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*b5088357SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*b5088357SAndrew Rist  * distributed with this work for additional information
6*b5088357SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*b5088357SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*b5088357SAndrew Rist  * "License"); you may not use this file except in compliance
9*b5088357SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*b5088357SAndrew Rist  *
11*b5088357SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*b5088357SAndrew Rist  *
13*b5088357SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*b5088357SAndrew Rist  * software distributed under the License is distributed on an
15*b5088357SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b5088357SAndrew Rist  * KIND, either express or implied.  See the License for the
17*b5088357SAndrew Rist  * specific language governing permissions and limitations
18*b5088357SAndrew Rist  * under the License.
19*b5088357SAndrew Rist  *
20*b5088357SAndrew Rist  *************************************************************/
21*b5088357SAndrew Rist 
22*b5088357SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_unotools.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <com/sun/star/uno/Sequence.hxx>
28cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
29cdf0e10cSrcweir #include <rtl/instance.hxx>
30cdf0e10cSrcweir #include <rtl/logfile.hxx>
31cdf0e10cSrcweir #include <i18npool/mslangid.hxx>
32cdf0e10cSrcweir #include <tools/string.hxx>
33cdf0e10cSrcweir #include <tools/debug.hxx>
34cdf0e10cSrcweir #include <unotools/syslocaleoptions.hxx>
35cdf0e10cSrcweir #include <unotools/configmgr.hxx>
36cdf0e10cSrcweir #include <unotools/configitem.hxx>
37cdf0e10cSrcweir #include <com/sun/star/uno/Any.hxx>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include "itemholder1.hxx"
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #define CFG_READONLY_DEFAULT    sal_False
42cdf0e10cSrcweir 
43cdf0e10cSrcweir using namespace osl;
44cdf0e10cSrcweir using namespace utl;
45cdf0e10cSrcweir using namespace rtl;
46cdf0e10cSrcweir using namespace com::sun::star::uno;
47cdf0e10cSrcweir using namespace com::sun::star::lang;
48cdf0e10cSrcweir 
49cdf0e10cSrcweir 
50cdf0e10cSrcweir SvtSysLocaleOptions_Impl*   SvtSysLocaleOptions::pOptions = NULL;
51cdf0e10cSrcweir sal_Int32                   SvtSysLocaleOptions::nRefCount = 0;
52cdf0e10cSrcweir namespace
53cdf0e10cSrcweir {
54cdf0e10cSrcweir     struct CurrencyChangeLink
55cdf0e10cSrcweir         : public rtl::Static<Link, CurrencyChangeLink> {};
56cdf0e10cSrcweir }
57cdf0e10cSrcweir 
lcl_str_to_locale(const::rtl::OUString rStr)58cdf0e10cSrcweir com::sun::star::lang::Locale lcl_str_to_locale( const ::rtl::OUString rStr )
59cdf0e10cSrcweir {
60cdf0e10cSrcweir 	com::sun::star::lang::Locale aRet;
61cdf0e10cSrcweir 	if ( rStr.getLength() )
62cdf0e10cSrcweir 	{
63cdf0e10cSrcweir 		aRet = com::sun::star::lang::Locale();
64cdf0e10cSrcweir 		sal_Int32 nSep = rStr.indexOf('-');
65cdf0e10cSrcweir 		if (nSep < 0)
66cdf0e10cSrcweir 			aRet.Language = rStr;
67cdf0e10cSrcweir 		else
68cdf0e10cSrcweir 		{
69cdf0e10cSrcweir 			aRet.Language = rStr.copy(0, nSep);
70cdf0e10cSrcweir 			if (nSep < rStr.getLength())
71cdf0e10cSrcweir 				aRet.Country = rStr.copy(nSep+1, rStr.getLength() - (nSep+1));
72cdf0e10cSrcweir 		}
73cdf0e10cSrcweir 	}
74cdf0e10cSrcweir 
75cdf0e10cSrcweir 	return aRet;
76cdf0e10cSrcweir }
77cdf0e10cSrcweir 
78cdf0e10cSrcweir class SvtSysLocaleOptions_Impl : public utl::ConfigItem
79cdf0e10cSrcweir {
80cdf0e10cSrcweir 		Locale					m_aRealLocale;
81cdf0e10cSrcweir 		Locale					m_aRealUILocale;
82cdf0e10cSrcweir 		LanguageType			m_eRealLanguage;
83cdf0e10cSrcweir 		LanguageType			m_eRealUILanguage;
84cdf0e10cSrcweir 		OUString                m_aLocaleString;    // en-US or de-DE or empty for SYSTEM
85cdf0e10cSrcweir         OUString                m_aUILocaleString;    // en-US or de-DE or empty for SYSTEM
86cdf0e10cSrcweir         OUString                m_aCurrencyString;  // USD-en-US or EUR-de-DE
87cdf0e10cSrcweir         sal_uLong                   m_nBlockedHint;     // pending hints
88cdf0e10cSrcweir         sal_Bool                m_bDecimalSeparator; //use decimal separator same as locale
89cdf0e10cSrcweir 
90cdf0e10cSrcweir         sal_Bool                m_bROLocale;
91cdf0e10cSrcweir         sal_Bool                m_bROUILocale;
92cdf0e10cSrcweir         sal_Bool                m_bROCurrency;
93cdf0e10cSrcweir         sal_Bool                m_bRODecimalSeparator;
94cdf0e10cSrcweir 
95cdf0e10cSrcweir 		static  const Sequence< /* const */ OUString >  GetPropertyNames();
96cdf0e10cSrcweir 		void					MakeRealLocale();
97cdf0e10cSrcweir 		void					MakeRealUILocale();
98cdf0e10cSrcweir 
99cdf0e10cSrcweir public:
100cdf0e10cSrcweir                                 SvtSysLocaleOptions_Impl();
101cdf0e10cSrcweir     virtual                     ~SvtSysLocaleOptions_Impl();
102cdf0e10cSrcweir 
103cdf0e10cSrcweir     virtual void                Notify( const com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames );
104cdf0e10cSrcweir     virtual void                Commit();
105cdf0e10cSrcweir 
GetLocaleString() const106cdf0e10cSrcweir             const OUString&     GetLocaleString() const
107cdf0e10cSrcweir                                     { return m_aLocaleString; }
108cdf0e10cSrcweir             void                SetLocaleString( const OUString& rStr );
109cdf0e10cSrcweir 
GetUILocaleString() const110cdf0e10cSrcweir             const OUString&     GetUILocaleString() const
111cdf0e10cSrcweir                                     { return m_aUILocaleString; }
112cdf0e10cSrcweir             void                SetUILocaleString( const OUString& rStr );
113cdf0e10cSrcweir 
GetCurrencyString() const114cdf0e10cSrcweir             const OUString&     GetCurrencyString() const
115cdf0e10cSrcweir                                     { return m_aCurrencyString; }
116cdf0e10cSrcweir             void                SetCurrencyString( const OUString& rStr );
117cdf0e10cSrcweir 
IsDecimalSeparatorAsLocale() const118cdf0e10cSrcweir             sal_Bool            IsDecimalSeparatorAsLocale() const { return m_bDecimalSeparator;}
119cdf0e10cSrcweir             void                SetDecimalSeparatorAsLocale( sal_Bool bSet);
120cdf0e10cSrcweir 
121cdf0e10cSrcweir             sal_Bool            IsReadOnly( SvtSysLocaleOptions::EOption eOption ) const;
GetRealLocale()122cdf0e10cSrcweir 			const Locale&		GetRealLocale() { return m_aRealLocale; }
GetRealUILocale()123cdf0e10cSrcweir 			const Locale&		GetRealUILocale() { return m_aRealUILocale; }
GetRealLanguage()124cdf0e10cSrcweir 			LanguageType		GetRealLanguage() { return m_eRealLanguage; }
GetRealUILanguage()125cdf0e10cSrcweir 			LanguageType		GetRealUILanguage() { return m_eRealUILanguage; }
126cdf0e10cSrcweir };
127cdf0e10cSrcweir 
128cdf0e10cSrcweir 
129cdf0e10cSrcweir #define ROOTNODE_SYSLOCALE  			OUString(RTL_CONSTASCII_USTRINGPARAM("Setup/L10N"))
130cdf0e10cSrcweir 
131cdf0e10cSrcweir #define PROPERTYNAME_LOCALE         	OUString(RTL_CONSTASCII_USTRINGPARAM("ooSetupSystemLocale"))
132cdf0e10cSrcweir #define PROPERTYNAME_UILOCALE       	OUString(RTL_CONSTASCII_USTRINGPARAM("ooLocale"))
133cdf0e10cSrcweir #define PROPERTYNAME_CURRENCY       	OUString(RTL_CONSTASCII_USTRINGPARAM("ooSetupCurrency"))
134cdf0e10cSrcweir #define PROPERTYNAME_DECIMALSEPARATOR 	OUString(RTL_CONSTASCII_USTRINGPARAM("DecimalSeparatorAsLocale"))
135cdf0e10cSrcweir 
136cdf0e10cSrcweir #define PROPERTYHANDLE_LOCALE       	0
137cdf0e10cSrcweir #define PROPERTYHANDLE_UILOCALE       	1
138cdf0e10cSrcweir #define PROPERTYHANDLE_CURRENCY     	2
139cdf0e10cSrcweir #define PROPERTYHANDLE_DECIMALSEPARATOR 3
140cdf0e10cSrcweir 
141cdf0e10cSrcweir #define PROPERTYCOUNT               	4
142cdf0e10cSrcweir 
GetPropertyNames()143cdf0e10cSrcweir const Sequence< OUString > SvtSysLocaleOptions_Impl::GetPropertyNames()
144cdf0e10cSrcweir {
145cdf0e10cSrcweir 	static const OUString pProperties[] =
146cdf0e10cSrcweir 	{
147cdf0e10cSrcweir         PROPERTYNAME_LOCALE,
148cdf0e10cSrcweir         PROPERTYNAME_UILOCALE,
149cdf0e10cSrcweir         PROPERTYNAME_CURRENCY,
150cdf0e10cSrcweir         PROPERTYNAME_DECIMALSEPARATOR
151cdf0e10cSrcweir 	};
152cdf0e10cSrcweir     static const Sequence< OUString > seqPropertyNames( pProperties, PROPERTYCOUNT );
153cdf0e10cSrcweir 	return seqPropertyNames;
154cdf0e10cSrcweir }
155cdf0e10cSrcweir 
156cdf0e10cSrcweir // -----------------------------------------------------------------------
157cdf0e10cSrcweir 
SvtSysLocaleOptions_Impl()158cdf0e10cSrcweir SvtSysLocaleOptions_Impl::SvtSysLocaleOptions_Impl()
159cdf0e10cSrcweir     : ConfigItem( ROOTNODE_SYSLOCALE )
160cdf0e10cSrcweir     , m_nBlockedHint( 0 )
161cdf0e10cSrcweir     , m_bDecimalSeparator( sal_True )
162cdf0e10cSrcweir     , m_bROLocale(CFG_READONLY_DEFAULT)
163cdf0e10cSrcweir     , m_bROUILocale(CFG_READONLY_DEFAULT)
164cdf0e10cSrcweir     , m_bROCurrency(CFG_READONLY_DEFAULT)
165cdf0e10cSrcweir     , m_bRODecimalSeparator(sal_False)
166cdf0e10cSrcweir 
167cdf0e10cSrcweir {
168cdf0e10cSrcweir     if ( IsValidConfigMgr() )
169cdf0e10cSrcweir     {
170cdf0e10cSrcweir         const Sequence< OUString > aNames = GetPropertyNames();
171cdf0e10cSrcweir         Sequence< Any > aValues = GetProperties( aNames );
172cdf0e10cSrcweir         Sequence< sal_Bool > aROStates = GetReadOnlyStates( aNames );
173cdf0e10cSrcweir         const Any* pValues = aValues.getConstArray();
174cdf0e10cSrcweir         const sal_Bool* pROStates = aROStates.getConstArray();
175cdf0e10cSrcweir         DBG_ASSERT( aValues.getLength() == aNames.getLength(), "GetProperties failed" );
176cdf0e10cSrcweir         DBG_ASSERT( aROStates.getLength() == aNames.getLength(), "GetReadOnlyStates failed" );
177cdf0e10cSrcweir         if ( aValues.getLength() == aNames.getLength() && aROStates.getLength() == aNames.getLength() )
178cdf0e10cSrcweir         {
179cdf0e10cSrcweir             for ( sal_Int32 nProp = 0; nProp < aNames.getLength(); nProp++ )
180cdf0e10cSrcweir             {
181cdf0e10cSrcweir                 DBG_ASSERT( pValues[nProp].hasValue(), "property value missing" );
182cdf0e10cSrcweir                 if ( pValues[nProp].hasValue() )
183cdf0e10cSrcweir                 {
184cdf0e10cSrcweir                     switch ( nProp )
185cdf0e10cSrcweir                     {
186cdf0e10cSrcweir                         case PROPERTYHANDLE_LOCALE :
187cdf0e10cSrcweir                             {
188cdf0e10cSrcweir                                 OUString aStr;
189cdf0e10cSrcweir                                 if ( pValues[nProp] >>= aStr )
190cdf0e10cSrcweir                                     m_aLocaleString = aStr;
191cdf0e10cSrcweir                                 else
192cdf0e10cSrcweir                                 {
193cdf0e10cSrcweir                                     DBG_ERRORFILE( "Wrong property type!" );
194cdf0e10cSrcweir                                 }
195cdf0e10cSrcweir                                 m_bROLocale = pROStates[nProp];
196cdf0e10cSrcweir                             }
197cdf0e10cSrcweir                             break;
198cdf0e10cSrcweir                         case PROPERTYHANDLE_UILOCALE :
199cdf0e10cSrcweir                             {
200cdf0e10cSrcweir                                 OUString aStr;
201cdf0e10cSrcweir                                 if ( pValues[nProp] >>= aStr )
202cdf0e10cSrcweir                                     m_aUILocaleString = aStr;
203cdf0e10cSrcweir                                 else
204cdf0e10cSrcweir                                 {
205cdf0e10cSrcweir                                     DBG_ERRORFILE( "Wrong property type!" );
206cdf0e10cSrcweir                                 }
207cdf0e10cSrcweir                                 m_bROUILocale = pROStates[nProp];
208cdf0e10cSrcweir                             }
209cdf0e10cSrcweir                             break;
210cdf0e10cSrcweir                         case PROPERTYHANDLE_CURRENCY :
211cdf0e10cSrcweir                             {
212cdf0e10cSrcweir                                 OUString aStr;
213cdf0e10cSrcweir                                 if ( pValues[nProp] >>= aStr )
214cdf0e10cSrcweir                                     m_aCurrencyString = aStr;
215cdf0e10cSrcweir                                 else
216cdf0e10cSrcweir                                 {
217cdf0e10cSrcweir                                     DBG_ERRORFILE( "Wrong property type!" );
218cdf0e10cSrcweir                                 }
219cdf0e10cSrcweir                                 m_bROCurrency = pROStates[nProp];
220cdf0e10cSrcweir                             }
221cdf0e10cSrcweir                         break;
222cdf0e10cSrcweir                         case  PROPERTYHANDLE_DECIMALSEPARATOR:
223cdf0e10cSrcweir                         {
224cdf0e10cSrcweir                                     sal_Bool bValue = sal_Bool();
225cdf0e10cSrcweir                             if ( pValues[nProp] >>= bValue )
226cdf0e10cSrcweir                                 m_bDecimalSeparator = bValue;
227cdf0e10cSrcweir                             else
228cdf0e10cSrcweir                             {
229cdf0e10cSrcweir                                 DBG_ERRORFILE( "Wrong property type!" );
230cdf0e10cSrcweir                             }
231cdf0e10cSrcweir                             m_bRODecimalSeparator = pROStates[nProp];
232cdf0e10cSrcweir                         }
233cdf0e10cSrcweir                         break;
234cdf0e10cSrcweir                         default:
235cdf0e10cSrcweir                             DBG_ERRORFILE( "Wrong property type!" );
236cdf0e10cSrcweir                     }
237cdf0e10cSrcweir                 }
238cdf0e10cSrcweir             }
239cdf0e10cSrcweir         }
240cdf0e10cSrcweir //        UpdateMiscSettings_Impl();
241cdf0e10cSrcweir         EnableNotification( aNames );
242cdf0e10cSrcweir     }
243cdf0e10cSrcweir 
244cdf0e10cSrcweir 	MakeRealLocale();
245cdf0e10cSrcweir 	MakeRealUILocale();
246cdf0e10cSrcweir }
247cdf0e10cSrcweir 
248cdf0e10cSrcweir 
~SvtSysLocaleOptions_Impl()249cdf0e10cSrcweir SvtSysLocaleOptions_Impl::~SvtSysLocaleOptions_Impl()
250cdf0e10cSrcweir {
251cdf0e10cSrcweir     if ( IsModified() )
252cdf0e10cSrcweir         Commit();
253cdf0e10cSrcweir }
254cdf0e10cSrcweir 
MakeRealLocale()255cdf0e10cSrcweir void SvtSysLocaleOptions_Impl::MakeRealLocale()
256cdf0e10cSrcweir {
257cdf0e10cSrcweir 	m_aRealLocale = lcl_str_to_locale( m_aLocaleString );
258cdf0e10cSrcweir 	if ( m_aRealLocale.Language.getLength() )
259cdf0e10cSrcweir 	{
260cdf0e10cSrcweir 	    m_eRealLanguage = MsLangId::convertLocaleToLanguage( m_aRealLocale );
261cdf0e10cSrcweir 	}
262cdf0e10cSrcweir 	else
263cdf0e10cSrcweir 	{
264cdf0e10cSrcweir 		m_eRealLanguage = MsLangId::getSystemLanguage();
265cdf0e10cSrcweir 	    MsLangId::convertLanguageToLocale( m_eRealLanguage, m_aRealLocale );
266cdf0e10cSrcweir 	}
267cdf0e10cSrcweir }
268cdf0e10cSrcweir 
MakeRealUILocale()269cdf0e10cSrcweir void SvtSysLocaleOptions_Impl::MakeRealUILocale()
270cdf0e10cSrcweir {
271cdf0e10cSrcweir 	if ( !m_aRealUILocale.Language.getLength() )
272cdf0e10cSrcweir 	{
273cdf0e10cSrcweir 		// as we can't switch UILocale at runtime, we only store changes in the configuration
274cdf0e10cSrcweir 		m_aRealUILocale = lcl_str_to_locale( m_aUILocaleString );
275cdf0e10cSrcweir 		if ( m_aRealUILocale.Language.getLength() )
276cdf0e10cSrcweir 		{
277cdf0e10cSrcweir 			m_eRealUILanguage = MsLangId::convertLocaleToLanguage( m_aRealUILocale );
278cdf0e10cSrcweir 		}
279cdf0e10cSrcweir 		else
280cdf0e10cSrcweir 		{
281cdf0e10cSrcweir 			m_eRealUILanguage = MsLangId::getSystemUILanguage();
282cdf0e10cSrcweir 			MsLangId::convertLanguageToLocale( m_eRealUILanguage, m_aRealUILocale );
283cdf0e10cSrcweir 		}
284cdf0e10cSrcweir 	}
285cdf0e10cSrcweir }
286cdf0e10cSrcweir 
IsReadOnly(SvtSysLocaleOptions::EOption eOption) const287cdf0e10cSrcweir sal_Bool SvtSysLocaleOptions_Impl::IsReadOnly( SvtSysLocaleOptions::EOption eOption ) const
288cdf0e10cSrcweir {
289cdf0e10cSrcweir     sal_Bool bReadOnly = CFG_READONLY_DEFAULT;
290cdf0e10cSrcweir     switch(eOption)
291cdf0e10cSrcweir     {
292cdf0e10cSrcweir         case SvtSysLocaleOptions::E_LOCALE :
293cdf0e10cSrcweir             {
294cdf0e10cSrcweir                 bReadOnly = m_bROLocale;
295cdf0e10cSrcweir                 break;
296cdf0e10cSrcweir             }
297cdf0e10cSrcweir         case SvtSysLocaleOptions::E_UILOCALE :
298cdf0e10cSrcweir             {
299cdf0e10cSrcweir                 bReadOnly = m_bROUILocale;
300cdf0e10cSrcweir                 break;
301cdf0e10cSrcweir             }
302cdf0e10cSrcweir         case SvtSysLocaleOptions::E_CURRENCY :
303cdf0e10cSrcweir             {
304cdf0e10cSrcweir                 bReadOnly = m_bROCurrency;
305cdf0e10cSrcweir                 break;
306cdf0e10cSrcweir             }
307cdf0e10cSrcweir     }
308cdf0e10cSrcweir     return bReadOnly;
309cdf0e10cSrcweir }
310cdf0e10cSrcweir 
311cdf0e10cSrcweir 
Commit()312cdf0e10cSrcweir void SvtSysLocaleOptions_Impl::Commit()
313cdf0e10cSrcweir {
314cdf0e10cSrcweir     const Sequence< OUString > aOrgNames = GetPropertyNames();
315cdf0e10cSrcweir     sal_Int32 nOrgCount = aOrgNames.getLength();
316cdf0e10cSrcweir 
317cdf0e10cSrcweir     Sequence< OUString > aNames( nOrgCount );
318cdf0e10cSrcweir     Sequence< Any > aValues( nOrgCount );
319cdf0e10cSrcweir 
320cdf0e10cSrcweir     OUString* pNames = aNames.getArray();
321cdf0e10cSrcweir 	Any* pValues = aValues.getArray();
322cdf0e10cSrcweir     sal_Int32 nRealCount = 0;
323cdf0e10cSrcweir 
324cdf0e10cSrcweir     for ( sal_Int32 nProp = 0; nProp < nOrgCount; nProp++ )
325cdf0e10cSrcweir 	{
326cdf0e10cSrcweir         switch ( nProp )
327cdf0e10cSrcweir         {
328cdf0e10cSrcweir             case PROPERTYHANDLE_LOCALE :
329cdf0e10cSrcweir                 {
330cdf0e10cSrcweir                     if (!m_bROLocale)
331cdf0e10cSrcweir                     {
332cdf0e10cSrcweir                         pNames[nRealCount] = aOrgNames[nProp];
333cdf0e10cSrcweir                         pValues[nRealCount] <<= m_aLocaleString;
334cdf0e10cSrcweir                         ++nRealCount;
335cdf0e10cSrcweir                     }
336cdf0e10cSrcweir                 }
337cdf0e10cSrcweir                 break;
338cdf0e10cSrcweir             case PROPERTYHANDLE_UILOCALE :
339cdf0e10cSrcweir                 {
340cdf0e10cSrcweir                     if (!m_bROUILocale)
341cdf0e10cSrcweir                     {
342cdf0e10cSrcweir                         pNames[nRealCount] = aOrgNames[nProp];
343cdf0e10cSrcweir                         pValues[nRealCount] <<= m_aUILocaleString;
344cdf0e10cSrcweir                         ++nRealCount;
345cdf0e10cSrcweir                     }
346cdf0e10cSrcweir                 }
347cdf0e10cSrcweir                 break;
348cdf0e10cSrcweir             case PROPERTYHANDLE_CURRENCY :
349cdf0e10cSrcweir                 {
350cdf0e10cSrcweir                     if (!m_bROCurrency)
351cdf0e10cSrcweir                     {
352cdf0e10cSrcweir                         pNames[nRealCount] = aOrgNames[nProp];
353cdf0e10cSrcweir                         pValues[nRealCount] <<= m_aCurrencyString;
354cdf0e10cSrcweir                         ++nRealCount;
355cdf0e10cSrcweir                     }
356cdf0e10cSrcweir                 }
357cdf0e10cSrcweir                 break;
358cdf0e10cSrcweir             case  PROPERTYHANDLE_DECIMALSEPARATOR:
359cdf0e10cSrcweir                 if( !m_bRODecimalSeparator )
360cdf0e10cSrcweir                 {
361cdf0e10cSrcweir                     pNames[nRealCount] = aOrgNames[nProp];
362cdf0e10cSrcweir                     pValues[nRealCount] <<= m_bDecimalSeparator;
363cdf0e10cSrcweir                     ++nRealCount;
364cdf0e10cSrcweir                 }
365cdf0e10cSrcweir             break;
366cdf0e10cSrcweir             default:
367cdf0e10cSrcweir                 DBG_ERRORFILE( "invalid index to save a path" );
368cdf0e10cSrcweir         }
369cdf0e10cSrcweir 	}
370cdf0e10cSrcweir     aNames.realloc(nRealCount);
371cdf0e10cSrcweir     aValues.realloc(nRealCount);
372cdf0e10cSrcweir 	PutProperties( aNames, aValues );
373cdf0e10cSrcweir     ClearModified();
374cdf0e10cSrcweir }
375cdf0e10cSrcweir 
376cdf0e10cSrcweir 
SetLocaleString(const OUString & rStr)377cdf0e10cSrcweir void SvtSysLocaleOptions_Impl::SetLocaleString( const OUString& rStr )
378cdf0e10cSrcweir {
379cdf0e10cSrcweir     if (!m_bROLocale && rStr != m_aLocaleString )
380cdf0e10cSrcweir     {
381cdf0e10cSrcweir         m_aLocaleString = rStr;
382cdf0e10cSrcweir 		MakeRealLocale();
383cdf0e10cSrcweir 	    MsLangId::setConfiguredSystemLanguage( m_eRealLanguage );
384cdf0e10cSrcweir         SetModified();
385cdf0e10cSrcweir         sal_uLong nHint = SYSLOCALEOPTIONS_HINT_LOCALE;
386cdf0e10cSrcweir 		if ( !m_aCurrencyString.getLength() )
387cdf0e10cSrcweir 		    nHint |= SYSLOCALEOPTIONS_HINT_CURRENCY;
388cdf0e10cSrcweir 		NotifyListeners( nHint );
389cdf0e10cSrcweir     }
390cdf0e10cSrcweir }
391cdf0e10cSrcweir 
SetUILocaleString(const OUString & rStr)392cdf0e10cSrcweir void SvtSysLocaleOptions_Impl::SetUILocaleString( const OUString& rStr )
393cdf0e10cSrcweir {
394cdf0e10cSrcweir     if (!m_bROUILocale && rStr != m_aUILocaleString )
395cdf0e10cSrcweir     {
396cdf0e10cSrcweir         m_aUILocaleString = rStr;
397cdf0e10cSrcweir /*
398cdf0e10cSrcweir 		// as we can't switch UILocale at runtime, we only store changes in the configuration
399cdf0e10cSrcweir 		MakeRealUILocale();
400cdf0e10cSrcweir 	    MsLangId::setConfiguredSystemLanguage( m_eRealUILanguage );
401cdf0e10cSrcweir         SetModified();
402cdf0e10cSrcweir 		NotifyListeners( SYSLOCALEOPTIONS_HINT_UILOCALE );
403cdf0e10cSrcweir */
404cdf0e10cSrcweir     }
405cdf0e10cSrcweir }
406cdf0e10cSrcweir 
SetCurrencyString(const OUString & rStr)407cdf0e10cSrcweir void SvtSysLocaleOptions_Impl::SetCurrencyString( const OUString& rStr )
408cdf0e10cSrcweir {
409cdf0e10cSrcweir     if (!m_bROCurrency && rStr != m_aCurrencyString )
410cdf0e10cSrcweir     {
411cdf0e10cSrcweir         m_aCurrencyString = rStr;
412cdf0e10cSrcweir         SetModified();
413cdf0e10cSrcweir 		NotifyListeners( SYSLOCALEOPTIONS_HINT_CURRENCY );
414cdf0e10cSrcweir     }
415cdf0e10cSrcweir }
416cdf0e10cSrcweir 
SetDecimalSeparatorAsLocale(sal_Bool bSet)417cdf0e10cSrcweir void SvtSysLocaleOptions_Impl::SetDecimalSeparatorAsLocale( sal_Bool bSet)
418cdf0e10cSrcweir {
419cdf0e10cSrcweir     if(bSet != m_bDecimalSeparator)
420cdf0e10cSrcweir     {
421cdf0e10cSrcweir         m_bDecimalSeparator = bSet;
422cdf0e10cSrcweir         SetModified();
423cdf0e10cSrcweir 		NotifyListeners( SYSLOCALEOPTIONS_HINT_DECSEP );
424cdf0e10cSrcweir     }
425cdf0e10cSrcweir }
426cdf0e10cSrcweir 
Notify(const Sequence<rtl::OUString> & seqPropertyNames)427cdf0e10cSrcweir void SvtSysLocaleOptions_Impl::Notify( const Sequence< rtl::OUString >& seqPropertyNames )
428cdf0e10cSrcweir {
429cdf0e10cSrcweir     sal_uLong nHint = 0;
430cdf0e10cSrcweir 	Sequence< Any > seqValues = GetProperties( seqPropertyNames );
431cdf0e10cSrcweir     Sequence< sal_Bool > seqROStates = GetReadOnlyStates( seqPropertyNames );
432cdf0e10cSrcweir 	sal_Int32 nCount = seqPropertyNames.getLength();
433cdf0e10cSrcweir     for( sal_Int32 nProp = 0; nProp < nCount; ++nProp )
434cdf0e10cSrcweir 	{
435cdf0e10cSrcweir         if( seqPropertyNames[nProp] == PROPERTYNAME_LOCALE )
436cdf0e10cSrcweir 		{
437cdf0e10cSrcweir             DBG_ASSERT( seqValues[nProp].getValueTypeClass() == TypeClass_STRING, "Locale property type" );
438cdf0e10cSrcweir             seqValues[nProp] >>= m_aLocaleString;
439cdf0e10cSrcweir             m_bROLocale = seqROStates[nProp];
440cdf0e10cSrcweir             nHint |= SYSLOCALEOPTIONS_HINT_LOCALE;
441cdf0e10cSrcweir 			if ( !m_aCurrencyString.getLength() )
442cdf0e10cSrcweir 				nHint |= SYSLOCALEOPTIONS_HINT_CURRENCY;
443cdf0e10cSrcweir 			MakeRealLocale();
444cdf0e10cSrcweir 		}
445cdf0e10cSrcweir         if( seqPropertyNames[nProp] == PROPERTYNAME_UILOCALE )
446cdf0e10cSrcweir 		{
447cdf0e10cSrcweir             DBG_ASSERT( seqValues[nProp].getValueTypeClass() == TypeClass_STRING, "Locale property type" );
448cdf0e10cSrcweir             seqValues[nProp] >>= m_aUILocaleString;
449cdf0e10cSrcweir             m_bROUILocale = seqROStates[nProp];
450cdf0e10cSrcweir             nHint |= SYSLOCALEOPTIONS_HINT_UILOCALE;
451cdf0e10cSrcweir 			MakeRealUILocale();
452cdf0e10cSrcweir 		}
453cdf0e10cSrcweir         else if( seqPropertyNames[nProp] == PROPERTYNAME_CURRENCY )
454cdf0e10cSrcweir 		{
455cdf0e10cSrcweir             DBG_ASSERT( seqValues[nProp].getValueTypeClass() == TypeClass_STRING, "Currency property type" );
456cdf0e10cSrcweir             seqValues[nProp] >>= m_aCurrencyString;
457cdf0e10cSrcweir             m_bROCurrency = seqROStates[nProp];
458cdf0e10cSrcweir             nHint |= SYSLOCALEOPTIONS_HINT_CURRENCY;
459cdf0e10cSrcweir 		}
460cdf0e10cSrcweir         else if( seqPropertyNames[nProp] == PROPERTYNAME_DECIMALSEPARATOR )
461cdf0e10cSrcweir         {
462cdf0e10cSrcweir             seqValues[nProp] >>= m_bDecimalSeparator;
463cdf0e10cSrcweir             m_bRODecimalSeparator = seqROStates[nProp];
464cdf0e10cSrcweir         }
465cdf0e10cSrcweir 	}
466cdf0e10cSrcweir     if ( nHint )
467cdf0e10cSrcweir 		NotifyListeners( nHint );
468cdf0e10cSrcweir }
469cdf0e10cSrcweir 
470cdf0e10cSrcweir // ====================================================================
471cdf0e10cSrcweir 
SvtSysLocaleOptions()472cdf0e10cSrcweir SvtSysLocaleOptions::SvtSysLocaleOptions()
473cdf0e10cSrcweir {
474cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
475cdf0e10cSrcweir     if ( !pOptions )
476cdf0e10cSrcweir     {
477cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT(aLog, "svl ( ??? ) ::SvtSysLocaleOptions_Impl::ctor()");
478cdf0e10cSrcweir         pOptions = new SvtSysLocaleOptions_Impl;
479cdf0e10cSrcweir 
480cdf0e10cSrcweir         ItemHolder1::holdConfigItem(E_SYSLOCALEOPTIONS);
481cdf0e10cSrcweir     }
482cdf0e10cSrcweir     ++nRefCount;
483cdf0e10cSrcweir 	pOptions->AddListener(this);
484cdf0e10cSrcweir }
485cdf0e10cSrcweir 
486cdf0e10cSrcweir 
~SvtSysLocaleOptions()487cdf0e10cSrcweir SvtSysLocaleOptions::~SvtSysLocaleOptions()
488cdf0e10cSrcweir {
489cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
490cdf0e10cSrcweir 	pOptions->RemoveListener(this);
491cdf0e10cSrcweir     if ( !--nRefCount )
492cdf0e10cSrcweir 	{
493cdf0e10cSrcweir         delete pOptions;
494cdf0e10cSrcweir         pOptions = NULL;
495cdf0e10cSrcweir 	}
496cdf0e10cSrcweir }
497cdf0e10cSrcweir 
498cdf0e10cSrcweir 
499cdf0e10cSrcweir // static
GetMutex()500cdf0e10cSrcweir Mutex& SvtSysLocaleOptions::GetMutex()
501cdf0e10cSrcweir {
502cdf0e10cSrcweir     static Mutex* pMutex = NULL;
503cdf0e10cSrcweir     if( !pMutex )
504cdf0e10cSrcweir     {
505cdf0e10cSrcweir         MutexGuard aGuard( Mutex::getGlobalMutex() );
506cdf0e10cSrcweir         if( !pMutex )
507cdf0e10cSrcweir         {
508cdf0e10cSrcweir             // #i77768# Due to a static reference in the toolkit lib
509cdf0e10cSrcweir             // we need a mutex that lives longer than the svl library.
510cdf0e10cSrcweir             // Otherwise the dtor would use a destructed mutex!!
511cdf0e10cSrcweir             pMutex = new Mutex;
512cdf0e10cSrcweir         }
513cdf0e10cSrcweir     }
514cdf0e10cSrcweir     return *pMutex;
515cdf0e10cSrcweir }
516cdf0e10cSrcweir 
517cdf0e10cSrcweir 
IsModified()518cdf0e10cSrcweir sal_Bool SvtSysLocaleOptions::IsModified()
519cdf0e10cSrcweir {
520cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
521cdf0e10cSrcweir     return pOptions->IsModified();
522cdf0e10cSrcweir }
523cdf0e10cSrcweir 
524cdf0e10cSrcweir 
Commit()525cdf0e10cSrcweir void SvtSysLocaleOptions::Commit()
526cdf0e10cSrcweir {
527cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
528cdf0e10cSrcweir     pOptions->Commit();
529cdf0e10cSrcweir }
530cdf0e10cSrcweir 
531cdf0e10cSrcweir 
BlockBroadcasts(bool bBlock)532cdf0e10cSrcweir void SvtSysLocaleOptions::BlockBroadcasts( bool bBlock )
533cdf0e10cSrcweir {
534cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
535cdf0e10cSrcweir     pOptions->BlockBroadcasts( bBlock );
536cdf0e10cSrcweir }
537cdf0e10cSrcweir 
538cdf0e10cSrcweir 
GetLocaleConfigString() const539cdf0e10cSrcweir const OUString& SvtSysLocaleOptions::GetLocaleConfigString() const
540cdf0e10cSrcweir {
541cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
542cdf0e10cSrcweir     return pOptions->GetLocaleString();
543cdf0e10cSrcweir }
544cdf0e10cSrcweir 
SetLocaleConfigString(const OUString & rStr)545cdf0e10cSrcweir void SvtSysLocaleOptions::SetLocaleConfigString( const OUString& rStr )
546cdf0e10cSrcweir {
547cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
548cdf0e10cSrcweir     pOptions->SetLocaleString( rStr );
549cdf0e10cSrcweir }
550cdf0e10cSrcweir 
GetUILocaleConfigString() const551cdf0e10cSrcweir const OUString& SvtSysLocaleOptions::GetUILocaleConfigString() const
552cdf0e10cSrcweir {
553cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
554cdf0e10cSrcweir     return pOptions->GetUILocaleString();
555cdf0e10cSrcweir }
556cdf0e10cSrcweir 
SetUILocaleConfigString(const OUString & rStr)557cdf0e10cSrcweir void SvtSysLocaleOptions::SetUILocaleConfigString( const OUString& rStr )
558cdf0e10cSrcweir {
559cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
560cdf0e10cSrcweir     pOptions->SetUILocaleString( rStr );
561cdf0e10cSrcweir }
562cdf0e10cSrcweir 
GetCurrencyConfigString() const563cdf0e10cSrcweir const OUString& SvtSysLocaleOptions::GetCurrencyConfigString() const
564cdf0e10cSrcweir {
565cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
566cdf0e10cSrcweir     return pOptions->GetCurrencyString();
567cdf0e10cSrcweir }
568cdf0e10cSrcweir 
569cdf0e10cSrcweir 
SetCurrencyConfigString(const OUString & rStr)570cdf0e10cSrcweir void SvtSysLocaleOptions::SetCurrencyConfigString( const OUString& rStr )
571cdf0e10cSrcweir {
572cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
573cdf0e10cSrcweir     pOptions->SetCurrencyString( rStr );
574cdf0e10cSrcweir }
575cdf0e10cSrcweir 
576cdf0e10cSrcweir 
577cdf0e10cSrcweir 
578cdf0e10cSrcweir /*-- 11.02.2004 13:31:41---------------------------------------------------
579cdf0e10cSrcweir 
580cdf0e10cSrcweir   -----------------------------------------------------------------------*/
IsDecimalSeparatorAsLocale() const581cdf0e10cSrcweir sal_Bool SvtSysLocaleOptions::IsDecimalSeparatorAsLocale() const
582cdf0e10cSrcweir {
583cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
584cdf0e10cSrcweir     return pOptions->IsDecimalSeparatorAsLocale();
585cdf0e10cSrcweir }
586cdf0e10cSrcweir /*-- 11.02.2004 13:31:41---------------------------------------------------
587cdf0e10cSrcweir 
588cdf0e10cSrcweir   -----------------------------------------------------------------------*/
SetDecimalSeparatorAsLocale(sal_Bool bSet)589cdf0e10cSrcweir void SvtSysLocaleOptions::SetDecimalSeparatorAsLocale( sal_Bool bSet)
590cdf0e10cSrcweir {
591cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
592cdf0e10cSrcweir     pOptions->SetDecimalSeparatorAsLocale(bSet);
593cdf0e10cSrcweir }
594cdf0e10cSrcweir 
595cdf0e10cSrcweir 
IsReadOnly(EOption eOption) const596cdf0e10cSrcweir sal_Bool SvtSysLocaleOptions::IsReadOnly( EOption eOption ) const
597cdf0e10cSrcweir {
598cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
599cdf0e10cSrcweir     return pOptions->IsReadOnly( eOption );
600cdf0e10cSrcweir }
601cdf0e10cSrcweir 
602cdf0e10cSrcweir // static
GetCurrencyAbbrevAndLanguage(String & rAbbrev,LanguageType & eLang,const::rtl::OUString & rConfigString)603cdf0e10cSrcweir void SvtSysLocaleOptions::GetCurrencyAbbrevAndLanguage( String& rAbbrev,
604cdf0e10cSrcweir         LanguageType& eLang, const ::rtl::OUString& rConfigString )
605cdf0e10cSrcweir {
606cdf0e10cSrcweir     sal_Int32 nDelim = rConfigString.indexOf( '-' );
607cdf0e10cSrcweir     if ( nDelim >= 0 )
608cdf0e10cSrcweir     {
609cdf0e10cSrcweir         rAbbrev = rConfigString.copy( 0, nDelim );
610cdf0e10cSrcweir         String aIsoStr( rConfigString.copy( nDelim+1 ) );
611cdf0e10cSrcweir         eLang = MsLangId::convertIsoStringToLanguage( aIsoStr );
612cdf0e10cSrcweir     }
613cdf0e10cSrcweir     else
614cdf0e10cSrcweir     {
615cdf0e10cSrcweir         rAbbrev = rConfigString;
616cdf0e10cSrcweir         eLang = (rAbbrev.Len() ? LANGUAGE_NONE : LANGUAGE_SYSTEM);
617cdf0e10cSrcweir     }
618cdf0e10cSrcweir }
619cdf0e10cSrcweir 
620cdf0e10cSrcweir 
621cdf0e10cSrcweir // static
CreateCurrencyConfigString(const String & rAbbrev,LanguageType eLang)622cdf0e10cSrcweir ::rtl::OUString SvtSysLocaleOptions::CreateCurrencyConfigString(
623cdf0e10cSrcweir         const String& rAbbrev, LanguageType eLang )
624cdf0e10cSrcweir {
625cdf0e10cSrcweir     String aIsoStr( MsLangId::convertLanguageToIsoString( eLang ) );
626cdf0e10cSrcweir     if ( aIsoStr.Len() )
627cdf0e10cSrcweir     {
628cdf0e10cSrcweir         ::rtl::OUStringBuffer aStr( rAbbrev.Len() + 1 + aIsoStr.Len() );
629cdf0e10cSrcweir         aStr.append( rAbbrev.GetBuffer(), rAbbrev.Len() );
630cdf0e10cSrcweir         aStr.append( sal_Unicode('-') );
631cdf0e10cSrcweir         aStr.append( aIsoStr.GetBuffer(), aIsoStr.Len() );
632cdf0e10cSrcweir         return aStr.makeStringAndClear();
633cdf0e10cSrcweir     }
634cdf0e10cSrcweir     else
635cdf0e10cSrcweir         return rAbbrev;
636cdf0e10cSrcweir }
637cdf0e10cSrcweir 
638cdf0e10cSrcweir 
639cdf0e10cSrcweir // static
SetCurrencyChangeLink(const Link & rLink)640cdf0e10cSrcweir void SvtSysLocaleOptions::SetCurrencyChangeLink( const Link& rLink )
641cdf0e10cSrcweir {
642cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
643cdf0e10cSrcweir     DBG_ASSERT( !CurrencyChangeLink::get().IsSet(), "SvtSysLocaleOptions::SetCurrencyChangeLink: already set" );
644cdf0e10cSrcweir     CurrencyChangeLink::get() = rLink;
645cdf0e10cSrcweir }
646cdf0e10cSrcweir 
647cdf0e10cSrcweir 
648cdf0e10cSrcweir // static
GetCurrencyChangeLink()649cdf0e10cSrcweir const Link& SvtSysLocaleOptions::GetCurrencyChangeLink()
650cdf0e10cSrcweir {
651cdf0e10cSrcweir     MutexGuard aGuard( GetMutex() );
652cdf0e10cSrcweir     return CurrencyChangeLink::get();
653cdf0e10cSrcweir }
654cdf0e10cSrcweir 
655cdf0e10cSrcweir 
ConfigurationChanged(utl::ConfigurationBroadcaster * p,sal_uInt32 nHint)656cdf0e10cSrcweir void SvtSysLocaleOptions::ConfigurationChanged( utl::ConfigurationBroadcaster* p, sal_uInt32 nHint  )
657cdf0e10cSrcweir {
658cdf0e10cSrcweir     if ( nHint & SYSLOCALEOPTIONS_HINT_CURRENCY )
659cdf0e10cSrcweir 	{
660cdf0e10cSrcweir 		const Link& rLink = GetCurrencyChangeLink();
661cdf0e10cSrcweir 		if ( rLink.IsSet() )
662cdf0e10cSrcweir 		    rLink.Call( NULL );
663cdf0e10cSrcweir 	}
664cdf0e10cSrcweir 
665cdf0e10cSrcweir 	::utl::detail::Options::ConfigurationChanged( p, nHint );
666cdf0e10cSrcweir }
667cdf0e10cSrcweir 
GetLocale() const668cdf0e10cSrcweir com::sun::star::lang::Locale SvtSysLocaleOptions::GetLocale() const
669cdf0e10cSrcweir {
670cdf0e10cSrcweir 	return lcl_str_to_locale( GetLocaleConfigString() );
671cdf0e10cSrcweir }
672cdf0e10cSrcweir 
GetUILocale() const673cdf0e10cSrcweir com::sun::star::lang::Locale SvtSysLocaleOptions::GetUILocale() const
674cdf0e10cSrcweir {
675cdf0e10cSrcweir 	return lcl_str_to_locale( GetUILocaleConfigString() );
676cdf0e10cSrcweir }
677cdf0e10cSrcweir 
GetRealLocale() const678cdf0e10cSrcweir com::sun::star::lang::Locale SvtSysLocaleOptions::GetRealLocale() const
679cdf0e10cSrcweir {
680cdf0e10cSrcweir 	return pOptions->GetRealLocale();
681cdf0e10cSrcweir }
682cdf0e10cSrcweir 
GetRealUILocale() const683cdf0e10cSrcweir com::sun::star::lang::Locale SvtSysLocaleOptions::GetRealUILocale() const
684cdf0e10cSrcweir {
685cdf0e10cSrcweir 	return pOptions->GetRealUILocale();
686cdf0e10cSrcweir }
687cdf0e10cSrcweir 
GetRealLanguage() const688cdf0e10cSrcweir LanguageType SvtSysLocaleOptions::GetRealLanguage() const
689cdf0e10cSrcweir {
690cdf0e10cSrcweir 	return pOptions->GetRealLanguage();
691cdf0e10cSrcweir }
692cdf0e10cSrcweir 
GetRealUILanguage() const693cdf0e10cSrcweir LanguageType SvtSysLocaleOptions::GetRealUILanguage() const
694cdf0e10cSrcweir {
695cdf0e10cSrcweir 	return pOptions->GetRealUILanguage();
696cdf0e10cSrcweir }
697cdf0e10cSrcweir 
698cdf0e10cSrcweir 
699