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