LCOV - code coverage report
Current view: top level - unotools/source/config - syslocaleoptions.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 204 323 63.2 %
Date: 2014-11-03 Functions: 32 49 65.3 %
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 <i18nlangtag/mslangid.hxx>
      24             : #include <i18nlangtag/languagetag.hxx>
      25             : #include <tools/debug.hxx>
      26             : #include <unotools/syslocaleoptions.hxx>
      27             : #include <unotools/configmgr.hxx>
      28             : #include <unotools/configitem.hxx>
      29             : #include <com/sun/star/uno/Any.hxx>
      30             : 
      31             : #include "itemholder1.hxx"
      32             : 
      33             : #define CFG_READONLY_DEFAULT    false
      34             : 
      35             : using namespace osl;
      36             : using namespace utl;
      37             : using namespace com::sun::star::uno;
      38             : using namespace com::sun::star::lang;
      39             : 
      40             : SvtSysLocaleOptions_Impl*   SvtSysLocaleOptions::pOptions = NULL;
      41             : sal_Int32                   SvtSysLocaleOptions::nRefCount = 0;
      42             : namespace
      43             : {
      44             :     struct CurrencyChangeLink
      45             :         : public rtl::Static<Link, CurrencyChangeLink> {};
      46             : }
      47             : 
      48             : class SvtSysLocaleOptions_Impl : public utl::ConfigItem
      49             : {
      50             :         LanguageTag             m_aRealLocale;
      51             :         LanguageTag             m_aRealUILocale;
      52             :         OUString                m_aLocaleString;    // en-US or de-DE or empty for SYSTEM
      53             :         OUString                m_aUILocaleString;    // en-US or de-DE or empty for SYSTEM
      54             :         OUString                m_aCurrencyString;  // USD-en-US or EUR-de-DE
      55             :         OUString                m_aDatePatternsString;  // "Y-M-D;M-D"
      56             :         bool                    m_bDecimalSeparator; //use decimal separator same as locale
      57             :         bool                    m_bIgnoreLanguageChange; //OS language change doesn't affect LO document language
      58             : 
      59             :         bool                    m_bROLocale;
      60             :         bool                    m_bROUILocale;
      61             :         bool                    m_bROCurrency;
      62             :         bool                    m_bRODatePatterns;
      63             :         bool                    m_bRODecimalSeparator;
      64             :         bool                    m_bROIgnoreLanguageChange;
      65             : 
      66             :         static  const Sequence< /* const */ OUString >  GetPropertyNames();
      67             :         void                    MakeRealLocale();
      68             :         void                    MakeRealUILocale();
      69             : 
      70             : public:
      71             :                                 SvtSysLocaleOptions_Impl();
      72             :     virtual                     ~SvtSysLocaleOptions_Impl();
      73             : 
      74             :     virtual void                Notify( const com::sun::star::uno::Sequence< OUString >& aPropertyNames ) SAL_OVERRIDE;
      75             :     virtual void                Commit() SAL_OVERRIDE;
      76             : 
      77          90 :             const OUString&     GetLocaleString() const
      78          90 :                                     { return m_aLocaleString; }
      79             :             void                SetLocaleString( const OUString& rStr );
      80             : 
      81             :             void                SetUILocaleString( const OUString& rStr );
      82             : 
      83          62 :             const OUString&     GetCurrencyString() const
      84          62 :                                     { return m_aCurrencyString; }
      85             :             void                SetCurrencyString( const OUString& rStr );
      86             : 
      87         349 :             const OUString&     GetDatePatternsString() const
      88         349 :                                     { return m_aDatePatternsString; }
      89             :             void                SetDatePatternsString( const OUString& rStr );
      90             : 
      91         677 :             bool                IsDecimalSeparatorAsLocale() const { return m_bDecimalSeparator;}
      92             :             void                SetDecimalSeparatorAsLocale( bool bSet);
      93             : 
      94           0 :             bool                IsIgnoreLanguageChange() const { return m_bIgnoreLanguageChange;}
      95             :             void                SetIgnoreLanguageChange( bool bSet);
      96             : 
      97             :             bool                IsReadOnly( SvtSysLocaleOptions::EOption eOption ) const;
      98       41701 :             const LanguageTag&  GetRealLocale() { return m_aRealLocale; }
      99        6323 :             const LanguageTag&  GetRealUILocale() { return m_aRealUILocale; }
     100             : };
     101             : 
     102             : #define ROOTNODE_SYSLOCALE              OUString("Setup/L10N")
     103             : 
     104             : #define PROPERTYNAME_LOCALE             OUString("ooSetupSystemLocale")
     105             : #define PROPERTYNAME_UILOCALE           OUString("ooLocale")
     106             : #define PROPERTYNAME_CURRENCY           OUString("ooSetupCurrency")
     107             : #define PROPERTYNAME_DECIMALSEPARATOR   OUString("DecimalSeparatorAsLocale")
     108             : #define PROPERTYNAME_DATEPATTERNS       OUString("DateAcceptancePatterns")
     109             : #define PROPERTYNAME_IGNORELANGCHANGE   OUString("IgnoreLanguageChange")
     110             : 
     111             : #define PROPERTYHANDLE_LOCALE           0
     112             : #define PROPERTYHANDLE_UILOCALE         1
     113             : #define PROPERTYHANDLE_CURRENCY         2
     114             : #define PROPERTYHANDLE_DECIMALSEPARATOR 3
     115             : #define PROPERTYHANDLE_DATEPATTERNS     4
     116             : #define PROPERTYHANDLE_IGNORELANGCHANGE 5
     117             : 
     118             : //#define PROPERTYCOUNT                   5
     119             : #define PROPERTYCOUNT                   6
     120             : 
     121         471 : const Sequence< OUString > SvtSysLocaleOptions_Impl::GetPropertyNames()
     122             : {
     123             :     const OUString pProperties[] =
     124             :     {
     125             :         PROPERTYNAME_LOCALE,
     126             :         PROPERTYNAME_UILOCALE,
     127             :         PROPERTYNAME_CURRENCY,
     128             :         PROPERTYNAME_DECIMALSEPARATOR,
     129             :         PROPERTYNAME_DATEPATTERNS,
     130             :         PROPERTYNAME_IGNORELANGCHANGE
     131        3297 :     };
     132         471 :     const Sequence< OUString > seqPropertyNames( pProperties, PROPERTYCOUNT );
     133        3297 :     return seqPropertyNames;
     134             : }
     135             : 
     136         375 : SvtSysLocaleOptions_Impl::SvtSysLocaleOptions_Impl()
     137             :     : ConfigItem( ROOTNODE_SYSLOCALE )
     138             :     , m_aRealLocale( LANGUAGE_SYSTEM)
     139             :     , m_aRealUILocale( LANGUAGE_SYSTEM)
     140             :     , m_bDecimalSeparator( true )
     141             :     , m_bIgnoreLanguageChange( false)
     142             :     , m_bROLocale(CFG_READONLY_DEFAULT)
     143             :     , m_bROUILocale(CFG_READONLY_DEFAULT)
     144             :     , m_bROCurrency(CFG_READONLY_DEFAULT)
     145             :     , m_bRODatePatterns(CFG_READONLY_DEFAULT)
     146             :     , m_bRODecimalSeparator(false)
     147         375 :     , m_bROIgnoreLanguageChange(false)
     148             : 
     149             : {
     150         375 :     const Sequence< OUString > aNames = GetPropertyNames();
     151         750 :     Sequence< Any > aValues = GetProperties( aNames );
     152         750 :     Sequence< sal_Bool > aROStates = GetReadOnlyStates( aNames );
     153         375 :     const Any* pValues = aValues.getConstArray();
     154         375 :     const sal_Bool* pROStates = aROStates.getConstArray();
     155             :     DBG_ASSERT( aValues.getLength() == aNames.getLength(), "GetProperties failed" );
     156             :     DBG_ASSERT( aROStates.getLength() == aNames.getLength(), "GetReadOnlyStates failed" );
     157         375 :     if ( aValues.getLength() == aNames.getLength() && aROStates.getLength() == aNames.getLength() )
     158             :     {
     159        2625 :         for ( sal_Int32 nProp = 0; nProp < aNames.getLength(); nProp++ )
     160             :         {
     161        2250 :             if ( pValues[nProp].hasValue() )
     162             :             {
     163        2250 :                 switch ( nProp )
     164             :                 {
     165             :                 case PROPERTYHANDLE_LOCALE :
     166             :                     {
     167         375 :                         OUString aStr;
     168         375 :                         if ( pValues[nProp] >>= aStr )
     169         375 :                             m_aLocaleString = aStr;
     170             :                         else
     171             :                         {
     172             :                             SAL_WARN( "unotools.config", "Wrong property type!" );
     173             :                         }
     174         375 :                         m_bROLocale = pROStates[nProp];
     175             :                     }
     176         375 :                     break;
     177             :                 case PROPERTYHANDLE_UILOCALE :
     178             :                     {
     179         375 :                         OUString aStr;
     180         375 :                         if ( pValues[nProp] >>= aStr )
     181         375 :                             m_aUILocaleString = aStr;
     182             :                         else
     183             :                         {
     184             :                             SAL_WARN( "unotools.config", "Wrong property type!" );
     185             :                         }
     186         375 :                         m_bROUILocale = pROStates[nProp];
     187             :                     }
     188         375 :                     break;
     189             :                 case PROPERTYHANDLE_CURRENCY :
     190             :                     {
     191         375 :                         OUString aStr;
     192         375 :                         if ( pValues[nProp] >>= aStr )
     193         375 :                             m_aCurrencyString = aStr;
     194             :                         else
     195             :                         {
     196             :                             SAL_WARN( "unotools.config", "Wrong property type!" );
     197             :                         }
     198         375 :                         m_bROCurrency = pROStates[nProp];
     199             :                     }
     200         375 :                     break;
     201             :                 case  PROPERTYHANDLE_DECIMALSEPARATOR:
     202             :                     {
     203         375 :                         bool bValue = false;
     204         375 :                         if ( pValues[nProp] >>= bValue )
     205         375 :                             m_bDecimalSeparator = bValue;
     206             :                         else
     207             :                         {
     208             :                             SAL_WARN( "unotools.config", "Wrong property type!" );
     209             :                         }
     210         375 :                         m_bRODecimalSeparator = pROStates[nProp];
     211             :                         }
     212         375 :                     break;
     213             :                 case PROPERTYHANDLE_DATEPATTERNS :
     214             :                     {
     215         375 :                         OUString aStr;
     216         375 :                         if ( pValues[nProp] >>= aStr )
     217         375 :                             m_aDatePatternsString = aStr;
     218             :                         else
     219             :                         {
     220             :                             SAL_WARN( "unotools.config", "Wrong property type!" );
     221             :                         }
     222         375 :                         m_bRODatePatterns = pROStates[nProp];
     223             :                     }
     224         375 :                     break;
     225             :                 case PROPERTYHANDLE_IGNORELANGCHANGE :
     226             :                     {
     227         375 :                         bool bValue = false;
     228         375 :                         if ( pValues[nProp] >>= bValue )
     229         375 :                             m_bIgnoreLanguageChange = bValue;
     230             :                         else
     231             :                         {
     232             :                             SAL_WARN( "unotools.config", "Wrong property type!" );
     233             :                         }
     234         375 :                         m_bROIgnoreLanguageChange = pROStates[nProp];
     235             :                     }
     236         375 :                     break;
     237             :                 default:
     238             :                     SAL_WARN( "unotools.config", "Wrong property type!" );
     239             :                 }
     240             :             }
     241             :         }
     242             :     }
     243         375 :     EnableNotification( aNames );
     244             : 
     245         375 :     MakeRealLocale();
     246         750 :     MakeRealUILocale();
     247         375 : }
     248             : 
     249         792 : SvtSysLocaleOptions_Impl::~SvtSysLocaleOptions_Impl()
     250             : {
     251         264 :     if ( IsModified() )
     252           0 :         Commit();
     253         528 : }
     254             : 
     255         477 : void SvtSysLocaleOptions_Impl::MakeRealLocale()
     256             : {
     257         477 :     if (m_aLocaleString.isEmpty())
     258             :     {
     259         275 :         LanguageType nLang = MsLangId::getSystemLanguage();
     260         275 :         m_aRealLocale.reset( nLang).makeFallback();
     261             :     }
     262             :     else
     263             :     {
     264         202 :         m_aRealLocale.reset( m_aLocaleString).makeFallback();
     265             :     }
     266         477 : }
     267             : 
     268         475 : void SvtSysLocaleOptions_Impl::MakeRealUILocale()
     269             : {
     270         475 :     if (m_aUILocaleString.isEmpty())
     271             :     {
     272         115 :         LanguageType nLang = MsLangId::getSystemUILanguage();
     273         115 :         m_aRealUILocale.reset( nLang).makeFallback();
     274             :     }
     275             :     else
     276             :     {
     277         360 :         m_aRealUILocale.reset( m_aUILocaleString).makeFallback();
     278             :     }
     279         475 : }
     280             : 
     281           0 : bool SvtSysLocaleOptions_Impl::IsReadOnly( SvtSysLocaleOptions::EOption eOption ) const
     282             : {
     283           0 :     bool bReadOnly = CFG_READONLY_DEFAULT;
     284           0 :     switch(eOption)
     285             :     {
     286             :         case SvtSysLocaleOptions::E_LOCALE :
     287             :             {
     288           0 :                 bReadOnly = m_bROLocale;
     289           0 :                 break;
     290             :             }
     291             :         case SvtSysLocaleOptions::E_UILOCALE :
     292             :             {
     293           0 :                 bReadOnly = m_bROUILocale;
     294           0 :                 break;
     295             :             }
     296             :         case SvtSysLocaleOptions::E_CURRENCY :
     297             :             {
     298           0 :                 bReadOnly = m_bROCurrency;
     299           0 :                 break;
     300             :             }
     301             :         case SvtSysLocaleOptions::E_DATEPATTERNS :
     302             :             {
     303           0 :                 bReadOnly = m_bRODatePatterns;
     304           0 :                 break;
     305             :             }
     306             :     }
     307           0 :     return bReadOnly;
     308             : }
     309             : 
     310          96 : void SvtSysLocaleOptions_Impl::Commit()
     311             : {
     312          96 :     const Sequence< OUString > aOrgNames = GetPropertyNames();
     313          96 :     sal_Int32 nOrgCount = aOrgNames.getLength();
     314             : 
     315         192 :     Sequence< OUString > aNames( nOrgCount );
     316         192 :     Sequence< Any > aValues( nOrgCount );
     317             : 
     318          96 :     OUString* pNames = aNames.getArray();
     319          96 :     Any* pValues = aValues.getArray();
     320          96 :     sal_Int32 nRealCount = 0;
     321             : 
     322         672 :     for ( sal_Int32 nProp = 0; nProp < nOrgCount; nProp++ )
     323             :     {
     324         576 :         switch ( nProp )
     325             :         {
     326             :             case PROPERTYHANDLE_LOCALE :
     327             :                 {
     328          96 :                     if (!m_bROLocale)
     329             :                     {
     330          96 :                         pNames[nRealCount] = aOrgNames[nProp];
     331          96 :                         pValues[nRealCount] <<= m_aLocaleString;
     332          96 :                         ++nRealCount;
     333             :                     }
     334             :                 }
     335          96 :                 break;
     336             :             case PROPERTYHANDLE_UILOCALE :
     337             :                 {
     338          96 :                     if (!m_bROUILocale)
     339             :                     {
     340          96 :                         pNames[nRealCount] = aOrgNames[nProp];
     341          96 :                         pValues[nRealCount] <<= m_aUILocaleString;
     342          96 :                         ++nRealCount;
     343             :                     }
     344             :                 }
     345          96 :                 break;
     346             :             case PROPERTYHANDLE_CURRENCY :
     347             :                 {
     348          96 :                     if (!m_bROCurrency)
     349             :                     {
     350          96 :                         pNames[nRealCount] = aOrgNames[nProp];
     351          96 :                         pValues[nRealCount] <<= m_aCurrencyString;
     352          96 :                         ++nRealCount;
     353             :                     }
     354             :                 }
     355          96 :                 break;
     356             :             case PROPERTYHANDLE_DECIMALSEPARATOR:
     357          96 :                 if( !m_bRODecimalSeparator )
     358             :                 {
     359          96 :                     pNames[nRealCount] = aOrgNames[nProp];
     360          96 :                     pValues[nRealCount] <<= m_bDecimalSeparator;
     361          96 :                     ++nRealCount;
     362             :                 }
     363          96 :             break;
     364             :             case PROPERTYHANDLE_DATEPATTERNS :
     365          96 :                 if (!m_bRODatePatterns)
     366             :                 {
     367          96 :                     pNames[nRealCount] = aOrgNames[nProp];
     368          96 :                     pValues[nRealCount] <<= m_aDatePatternsString;
     369          96 :                     ++nRealCount;
     370             :                 }
     371          96 :                 break;
     372             :             case PROPERTYHANDLE_IGNORELANGCHANGE :
     373          96 :                 if (!m_bROIgnoreLanguageChange)
     374             :                 {
     375          96 :                     pNames[nRealCount] = aOrgNames[nProp];
     376          96 :                     pValues[nRealCount] <<= m_bIgnoreLanguageChange;
     377          96 :                     ++nRealCount;
     378             :                 }
     379          96 :                 break;
     380             :             default:
     381             :                 SAL_WARN( "unotools.config", "invalid index to save a path" );
     382             :         }
     383             :     }
     384          96 :     aNames.realloc(nRealCount);
     385          96 :     aValues.realloc(nRealCount);
     386          96 :     PutProperties( aNames, aValues );
     387         192 :     ClearModified();
     388          96 : }
     389             : 
     390         212 : void SvtSysLocaleOptions_Impl::SetLocaleString( const OUString& rStr )
     391             : {
     392         212 :     if (!m_bROLocale && rStr != m_aLocaleString )
     393             :     {
     394         102 :         m_aLocaleString = rStr;
     395         102 :         MakeRealLocale();
     396         102 :         LanguageTag::setConfiguredSystemLanguage( m_aRealLocale.getLanguageType() );
     397         102 :         SetModified();
     398         102 :         sal_uLong nHint = SYSLOCALEOPTIONS_HINT_LOCALE;
     399         102 :         if ( m_aCurrencyString.isEmpty() )
     400         102 :             nHint |= SYSLOCALEOPTIONS_HINT_CURRENCY;
     401         102 :         NotifyListeners( nHint );
     402             :     }
     403         212 : }
     404             : 
     405         210 : void SvtSysLocaleOptions_Impl::SetUILocaleString( const OUString& rStr )
     406             : {
     407         210 :     if (!m_bROUILocale && rStr != m_aUILocaleString )
     408             :     {
     409         100 :         m_aUILocaleString = rStr;
     410             : 
     411             :         // as we can't switch UILocale at runtime, we only store changes in the configuration
     412         100 :         MakeRealUILocale();
     413         100 :         SetModified();
     414         100 :         NotifyListeners( SYSLOCALEOPTIONS_HINT_UILOCALE );
     415             :     }
     416         210 : }
     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           0 : void SvtSysLocaleOptions_Impl::Notify( const Sequence< OUString >& seqPropertyNames )
     459             : {
     460           0 :     sal_uLong nHint = 0;
     461           0 :     Sequence< Any > seqValues = GetProperties( seqPropertyNames );
     462           0 :     Sequence< sal_Bool > seqROStates = GetReadOnlyStates( seqPropertyNames );
     463           0 :     sal_Int32 nCount = seqPropertyNames.getLength();
     464           0 :     for( sal_Int32 nProp = 0; nProp < nCount; ++nProp )
     465             :     {
     466           0 :         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           0 :         if( seqPropertyNames[nProp] == PROPERTYNAME_UILOCALE )
     477             :         {
     478             :             DBG_ASSERT( seqValues[nProp].getValueTypeClass() == TypeClass_STRING, "Locale property type" );
     479           0 :             seqValues[nProp] >>= m_aUILocaleString;
     480           0 :             m_bROUILocale = seqROStates[nProp];
     481           0 :             nHint |= SYSLOCALEOPTIONS_HINT_UILOCALE;
     482           0 :             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           0 :     if ( nHint )
     510           0 :         NotifyListeners( nHint );
     511           0 : }
     512             : 
     513        6337 : SvtSysLocaleOptions::SvtSysLocaleOptions()
     514             : {
     515        6337 :     MutexGuard aGuard( GetMutex() );
     516        6337 :     if ( !pOptions )
     517             :     {
     518         375 :         pOptions = new SvtSysLocaleOptions_Impl;
     519             : 
     520         375 :         ItemHolder1::holdConfigItem(E_SYSLOCALEOPTIONS);
     521             :     }
     522        6337 :     ++nRefCount;
     523        6337 :     pOptions->AddListener(this);
     524        6337 : }
     525             : 
     526       12781 : SvtSysLocaleOptions::~SvtSysLocaleOptions()
     527             : {
     528        6205 :     MutexGuard aGuard( GetMutex() );
     529        6205 :     pOptions->RemoveListener(this);
     530        6205 :     if ( !--nRefCount )
     531             :     {
     532         264 :         delete pOptions;
     533         264 :         pOptions = NULL;
     534        6205 :     }
     535        6576 : }
     536             : 
     537             : // static
     538       14410 : Mutex& SvtSysLocaleOptions::GetMutex()
     539             : {
     540             :     static Mutex* pMutex = NULL;
     541       14410 :     if( !pMutex )
     542             :     {
     543         375 :         MutexGuard aGuard( Mutex::getGlobalMutex() );
     544         375 :         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         375 :             pMutex = new Mutex;
     550         375 :         }
     551             :     }
     552       14410 :     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          90 : const OUString& SvtSysLocaleOptions::GetLocaleConfigString() const
     574             : {
     575          90 :     MutexGuard aGuard( GetMutex() );
     576          90 :     return pOptions->GetLocaleString();
     577             : }
     578             : 
     579         212 : void SvtSysLocaleOptions::SetLocaleConfigString( const OUString& rStr )
     580             : {
     581         212 :     MutexGuard aGuard( GetMutex() );
     582         212 :     pOptions->SetLocaleString( rStr );
     583         212 : }
     584             : 
     585         210 : void SvtSysLocaleOptions::SetUILocaleConfigString( const OUString& rStr )
     586             : {
     587         210 :     MutexGuard aGuard( GetMutex() );
     588         210 :     pOptions->SetUILocaleString( rStr );
     589         210 : }
     590             : 
     591          62 : const OUString& SvtSysLocaleOptions::GetCurrencyConfigString() const
     592             : {
     593          62 :     MutexGuard aGuard( GetMutex() );
     594          62 :     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         349 : const OUString& SvtSysLocaleOptions::GetDatePatternsConfigString() const
     604             : {
     605         349 :     MutexGuard aGuard( GetMutex() );
     606         349 :     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         677 : bool SvtSysLocaleOptions::IsDecimalSeparatorAsLocale() const
     616             : {
     617         677 :     MutexGuard aGuard( GetMutex() );
     618         677 :     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           0 : bool SvtSysLocaleOptions::IsIgnoreLanguageChange() const
     628             : {
     629           0 :     MutexGuard aGuard( GetMutex() );
     630           0 :     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          62 : void SvtSysLocaleOptions::GetCurrencyAbbrevAndLanguage( OUString& rAbbrev,
     647             :                                                         LanguageType& eLang,
     648             :                                                         const OUString& rConfigString )
     649             : {
     650          62 :     sal_Int32 nDelim = rConfigString.indexOf( '-' );
     651          62 :     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          62 :         rAbbrev = rConfigString;
     660          62 :         eLang = (rAbbrev.isEmpty() ? LANGUAGE_SYSTEM : LANGUAGE_NONE);
     661             :     }
     662          62 : }
     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          62 : void SvtSysLocaleOptions::SetCurrencyChangeLink( const Link& rLink )
     683             : {
     684          62 :     MutexGuard aGuard( GetMutex() );
     685             :     DBG_ASSERT( !CurrencyChangeLink::get().IsSet(), "SvtSysLocaleOptions::SetCurrencyChangeLink: already set" );
     686          62 :     CurrencyChangeLink::get() = rLink;
     687          62 : }
     688             : 
     689             : // static
     690         206 : const Link& SvtSysLocaleOptions::GetCurrencyChangeLink()
     691             : {
     692         206 :     MutexGuard aGuard( GetMutex() );
     693         206 :     return CurrencyChangeLink::get();
     694             : }
     695             : 
     696         406 : void SvtSysLocaleOptions::ConfigurationChanged( utl::ConfigurationBroadcaster* p, sal_uInt32 nHint  )
     697             : {
     698         406 :     if ( nHint & SYSLOCALEOPTIONS_HINT_CURRENCY )
     699             :     {
     700         206 :         const Link& rLink = GetCurrencyChangeLink();
     701         206 :         if ( rLink.IsSet() )
     702           0 :             rLink.Call( NULL );
     703             :     }
     704             : 
     705         406 :     ::utl::detail::Options::ConfigurationChanged( p, nHint );
     706         406 : }
     707             : 
     708           2 : LanguageTag SvtSysLocaleOptions::GetLanguageTag() const
     709             : {
     710           2 :     return LanguageTag( GetLocaleConfigString() );
     711             : }
     712             : 
     713       41701 : const LanguageTag & SvtSysLocaleOptions::GetRealLanguageTag() const
     714             : {
     715       41701 :     return pOptions->GetRealLocale();
     716             : }
     717             : 
     718        6323 : const LanguageTag & SvtSysLocaleOptions::GetRealUILanguageTag() const
     719             : {
     720        6323 :     return pOptions->GetRealUILocale();
     721             : }
     722             : 
     723             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10