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