LCOV - code coverage report
Current view: top level - unotools/source/config - syslocaleoptions.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 221 320 69.1 %
Date: 2015-06-13 12:38:46 Functions: 35 49 71.4 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11