LCOV - code coverage report
Current view: top level - svtools/source/config - extcolorcfg.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 0 367 0.0 %
Date: 2015-06-13 12:38:46 Functions: 0 56 0.0 %
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 <sal/config.h>
      21             : 
      22             : #include <map>
      23             : 
      24             : #include <svtools/extcolorcfg.hxx>
      25             : #include <com/sun/star/uno/Any.hxx>
      26             : #include <com/sun/star/uno/Sequence.hxx>
      27             : #include <com/sun/star/lang/Locale.hpp>
      28             : #include <com/sun/star/beans/PropertyValue.hpp>
      29             : #include <tools/color.hxx>
      30             : #include <unotools/configitem.hxx>
      31             : #include <unotools/configpaths.hxx>
      32             : #include <com/sun/star/uno/Sequence.h>
      33             : #include <svl/poolitem.hxx>
      34             : #include <svl/smplhint.hxx>
      35             : #include <osl/mutex.hxx>
      36             : 
      37             : #include <vcl/svapp.hxx>
      38             : #include <vcl/settings.hxx>
      39             : #include <vcl/event.hxx>
      40             : #include <rtl/instance.hxx>
      41             : #include <rtl/strbuf.hxx>
      42             : 
      43             : 
      44             : using namespace utl;
      45             : using namespace com::sun::star;
      46             : 
      47             : 
      48             : namespace svtools
      49             : {
      50             : 
      51             : sal_Int32            nExtendedColorRefCount_Impl = 0;
      52             : namespace
      53             : {
      54             :     struct ColorMutex_Impl
      55             :         : public rtl::Static< ::osl::Mutex, ColorMutex_Impl > {};
      56             : }
      57             : 
      58             : ExtendedColorConfig_Impl*    ExtendedColorConfig::m_pImpl = NULL;
      59             : 
      60             : class ExtendedColorConfig_Impl : public utl::ConfigItem, public SfxBroadcaster
      61             : {
      62             :     typedef std::map<OUString, OUString> TDisplayNames;
      63             :     typedef std::map<OUString, ExtendedColorConfigValue> TConfigValues;
      64             :     typedef ::std::vector<TConfigValues::iterator> TMapPos;
      65             :     typedef ::std::pair< TConfigValues, TMapPos > TComponentMapping;
      66             :     typedef std::map<OUString, TComponentMapping> TComponents;
      67             :     TComponents         m_aConfigValues;
      68             :     TDisplayNames       m_aComponentDisplayNames;
      69             :     ::std::vector<TComponents::iterator> m_aConfigValuesPos;
      70             : 
      71             :     bool            m_bEditMode;
      72             :     OUString        m_sLoadedScheme;
      73             :     bool            m_bIsBroadcastEnabled;
      74             :     static bool     m_bLockBroadcast;
      75             :     static bool     m_bBroadcastWhenUnlocked;
      76             : 
      77             :     uno::Sequence< OUString> GetPropertyNames(const OUString& rScheme);
      78             :     void FillComponentColors(uno::Sequence < OUString >& _rComponents,const TDisplayNames& _rDisplayNames);
      79             : 
      80             :     virtual void                    ImplCommit() SAL_OVERRIDE;
      81             : 
      82             : public:
      83             :     explicit ExtendedColorConfig_Impl(bool bEditMode = false);
      84             :     virtual ~ExtendedColorConfig_Impl();
      85             : 
      86             :     void                            Load(const OUString& rScheme);
      87             :     void                            CommitCurrentSchemeName();
      88             :     //changes the name of the current scheme but doesn't load it!
      89           0 :     void                            SetCurrentSchemeName(const OUString& rSchemeName) {m_sLoadedScheme = rSchemeName;}
      90             :     bool                            ExistsScheme(const OUString& _sSchemeName);
      91             :     virtual void                    Notify( const uno::Sequence<OUString>& aPropertyNames) SAL_OVERRIDE;
      92             : 
      93             :     sal_Int32                       GetComponentCount() const;
      94             :     OUString                 GetComponentName(sal_uInt32 _nPos) const;
      95             :     OUString                 GetComponentDisplayName(const OUString& _sComponentName) const;
      96             :     sal_Int32                       GetComponentColorCount(const OUString& _sName) const;
      97             :     ExtendedColorConfigValue        GetComponentColorConfigValue(const OUString& _sName,sal_uInt32 _nPos) const;
      98             : 
      99           0 :     ExtendedColorConfigValue GetColorConfigValue(const OUString& _sComponentName,const OUString& _sName)
     100             :     {
     101           0 :         TComponents::iterator aFind = m_aConfigValues.find(_sComponentName);
     102           0 :         if ( aFind != m_aConfigValues.end() )
     103             :         {
     104           0 :             TConfigValues::iterator aFind2 = aFind->second.first.find(_sName);
     105           0 :             if ( aFind2 != aFind->second.first.end() )
     106           0 :                 return aFind2->second;
     107             :         }
     108             : #if OSL_DEBUG_LEVEL > 0
     109             :         OStringBuffer aMessage( "Could find the required config:\n" );
     110             :         aMessage.append( "component: " );
     111             :         aMessage.append( OUStringToOString( _sComponentName, RTL_TEXTENCODING_UTF8 ) );
     112             :         aMessage.append( "\nname: " );
     113             :         aMessage.append( OUStringToOString( _sName, RTL_TEXTENCODING_UTF8 ) );
     114             :         OSL_FAIL( aMessage.makeStringAndClear().getStr() );
     115             : #endif
     116           0 :         return ExtendedColorConfigValue();
     117             :     }
     118             :     void                            SetColorConfigValue(const OUString& _sName,
     119             :                                                             const ExtendedColorConfigValue& rValue );
     120             : 
     121             :     bool                            AddScheme(const OUString& rNode);
     122             :     bool                            RemoveScheme(const OUString& rNode);
     123           0 :     void                            SetModified(){ConfigItem::SetModified();}
     124           0 :     void                            ClearModified(){ConfigItem::ClearModified();}
     125             :     void                            SettingsChanged();
     126             : 
     127             :     static void                     DisableBroadcast();
     128             :     static void                     EnableBroadcast();
     129             :     static bool                     IsEnableBroadcast();
     130             : 
     131             :     static void                     LockBroadcast();
     132             :     static void                     UnlockBroadcast();
     133             : 
     134             :     // #100822#
     135             :     DECL_LINK( DataChangedEventListener, VclWindowEvent* );
     136             : };
     137             : 
     138           0 : uno::Sequence< OUString> ExtendedColorConfig_Impl::GetPropertyNames(const OUString& rScheme)
     139             : {
     140           0 :     uno::Sequence< OUString> aNames(GetNodeNames(rScheme));
     141           0 :     OUString* pIter = aNames.getArray();
     142           0 :     OUString* pEnd    = pIter + aNames.getLength();
     143           0 :     OUString sSep("/");
     144           0 :     for(;pIter != pEnd;++pIter)
     145             :     {
     146           0 :         *pIter = rScheme + sSep + *pIter;
     147             :     }
     148           0 :     return aNames;
     149             : }
     150             : 
     151           0 : sal_Int32 ExtendedColorConfig_Impl::GetComponentCount() const
     152             : {
     153           0 :     return m_aConfigValues.size();
     154             : }
     155             : 
     156           0 : sal_Int32 ExtendedColorConfig_Impl::GetComponentColorCount(const OUString& _sName) const
     157             : {
     158           0 :     sal_Int32 nSize = 0;
     159           0 :     TComponents::const_iterator aFind = m_aConfigValues.find(_sName);
     160           0 :     if ( aFind != m_aConfigValues.end() )
     161             :     {
     162           0 :         nSize = aFind->second.first.size();
     163             :     }
     164           0 :     return nSize;
     165             : }
     166             : 
     167           0 : ExtendedColorConfigValue ExtendedColorConfig_Impl::GetComponentColorConfigValue(const OUString& _sName,sal_uInt32 _nPos) const
     168             : {
     169           0 :     TComponents::const_iterator aFind = m_aConfigValues.find(_sName);
     170           0 :     if ( aFind != m_aConfigValues.end() )
     171             :     {
     172           0 :         if ( _nPos < aFind->second.second.size() )
     173             :         {
     174           0 :             return aFind->second.second[_nPos]->second;
     175             :         }
     176             :     }
     177           0 :     return ExtendedColorConfigValue();
     178             : }
     179             : 
     180           0 : OUString ExtendedColorConfig_Impl::GetComponentDisplayName(const OUString& _sComponentName) const
     181             : {
     182           0 :     OUString sRet;
     183           0 :     TDisplayNames::const_iterator aFind = m_aComponentDisplayNames.find(_sComponentName);
     184           0 :     if ( aFind != m_aComponentDisplayNames.end() )
     185           0 :         sRet = aFind->second;
     186           0 :     return sRet;
     187             : }
     188             : 
     189           0 : OUString ExtendedColorConfig_Impl::GetComponentName(sal_uInt32 _nPos) const
     190             : {
     191           0 :     OUString sRet;
     192           0 :     if ( _nPos < m_aConfigValuesPos.size() )
     193           0 :         sRet = m_aConfigValuesPos[_nPos]->first;
     194           0 :     return sRet;
     195             : }
     196             : 
     197             : bool ExtendedColorConfig_Impl::m_bLockBroadcast = false;
     198             : bool ExtendedColorConfig_Impl::m_bBroadcastWhenUnlocked = false;
     199           0 : ExtendedColorConfig_Impl::ExtendedColorConfig_Impl(bool bEditMode) :
     200             :     ConfigItem(OUString("Office.ExtendedColorScheme")),
     201             :     m_bEditMode(bEditMode),
     202           0 :     m_bIsBroadcastEnabled(true)
     203             : {
     204           0 :     if(!m_bEditMode)
     205             :     {
     206             :         //try to register on the root node - if possible
     207           0 :         uno::Sequence < OUString > aNames(1);
     208           0 :         EnableNotification( aNames );
     209             :     }
     210           0 :     Load(OUString());
     211             : 
     212             :     // #100822#
     213           0 :     ::Application::AddEventListener( LINK(this, ExtendedColorConfig_Impl, DataChangedEventListener) );
     214             : 
     215           0 : }
     216             : 
     217           0 : ExtendedColorConfig_Impl::~ExtendedColorConfig_Impl()
     218             : {
     219             :     // #100822#
     220           0 :     ::Application::RemoveEventListener( LINK(this, ExtendedColorConfig_Impl, DataChangedEventListener) );
     221           0 : }
     222             : 
     223           0 : void ExtendedColorConfig_Impl::DisableBroadcast()
     224             : {
     225           0 :     if ( ExtendedColorConfig::m_pImpl )
     226           0 :         ExtendedColorConfig::m_pImpl->m_bIsBroadcastEnabled = false;
     227           0 : }
     228             : 
     229           0 : void ExtendedColorConfig_Impl::EnableBroadcast()
     230             : {
     231           0 :     if ( ExtendedColorConfig::m_pImpl )
     232           0 :         ExtendedColorConfig::m_pImpl->m_bIsBroadcastEnabled = true;
     233           0 : }
     234             : 
     235           0 : bool ExtendedColorConfig_Impl::IsEnableBroadcast()
     236             : {
     237           0 :     return ExtendedColorConfig::m_pImpl && ExtendedColorConfig::m_pImpl->m_bIsBroadcastEnabled;
     238             : }
     239             : 
     240           0 : void lcl_addString(uno::Sequence < OUString >& _rSeq,const OUString& _sAdd)
     241             : {
     242           0 :     OUString* pIter = _rSeq.getArray();
     243           0 :     OUString* pEnd  = pIter + _rSeq.getLength();
     244           0 :     for(;pIter != pEnd;++pIter)
     245           0 :         *pIter += _sAdd;
     246           0 : }
     247             : 
     248           0 : void ExtendedColorConfig_Impl::Load(const OUString& rScheme)
     249             : {
     250           0 :     m_aComponentDisplayNames.clear();
     251           0 :     m_aConfigValuesPos.clear();
     252           0 :     m_aConfigValues.clear();
     253             : 
     254             :     // fill display names
     255           0 :     TDisplayNames aDisplayNameMap;
     256           0 :     OUString sEntryNames("EntryNames");
     257           0 :     uno::Sequence < OUString > aComponentNames = GetPropertyNames(sEntryNames);
     258           0 :     OUString sDisplayName("/DisplayName");
     259           0 :     OUString* pIter = aComponentNames.getArray();
     260           0 :     OUString* pEnd  = pIter + aComponentNames.getLength();
     261           0 :     for(sal_Int32 i = 0;pIter != pEnd;++pIter,++i)
     262             :     {
     263           0 :         uno::Sequence < OUString > aComponentDisplayNames(1);
     264           0 :         aComponentDisplayNames[0] = *pIter;
     265           0 :         aComponentDisplayNames[0] += sDisplayName;
     266           0 :         uno::Sequence< uno::Any > aComponentDisplayNamesValue = GetProperties( aComponentDisplayNames );
     267           0 :         OUString sComponentDisplayName;
     268           0 :         if ( aComponentDisplayNamesValue.getLength() && (aComponentDisplayNamesValue[0] >>= sComponentDisplayName) )
     269             :         {
     270           0 :             sal_Int32 nIndex = 0;
     271           0 :             m_aComponentDisplayNames.insert(TDisplayNames::value_type(pIter->getToken(1,'/',nIndex),sComponentDisplayName));
     272             :         }
     273             : 
     274           0 :         *pIter += "/Entries";
     275           0 :         uno::Sequence < OUString > aDisplayNames = GetPropertyNames(*pIter);
     276           0 :         lcl_addString(aDisplayNames,sDisplayName);
     277             : 
     278           0 :         uno::Sequence< uno::Any > aDisplayNamesValue = GetProperties( aDisplayNames );
     279             : 
     280           0 :         const OUString* pDispIter = aDisplayNames.getConstArray();
     281           0 :         const OUString* pDispEnd  = pDispIter + aDisplayNames.getLength();
     282           0 :         for(sal_Int32 j = 0;pDispIter != pDispEnd;++pDispIter,++j)
     283             :         {
     284           0 :             sal_Int32 nIndex = 0;
     285           0 :             pDispIter->getToken(0,'/',nIndex);
     286           0 :             OUString sName = pDispIter->copy(nIndex);
     287           0 :             sName = sName.copy(0,sName.lastIndexOf(sDisplayName));
     288           0 :             OUString sCurrentDisplayName;
     289           0 :             aDisplayNamesValue[j] >>= sCurrentDisplayName;
     290           0 :             aDisplayNameMap.insert(TDisplayNames::value_type(sName,sCurrentDisplayName));
     291           0 :         }
     292           0 :     }
     293             : 
     294             :     // load color settings
     295           0 :     OUString sScheme(rScheme);
     296             : 
     297           0 :     if(sScheme.isEmpty())
     298             :     {
     299             :         //detect current scheme name
     300           0 :         uno::Sequence < OUString > aCurrent(1);
     301           0 :         aCurrent.getArray()[0] = "ExtendedColorScheme/CurrentColorScheme";
     302           0 :         uno::Sequence< uno::Any > aCurrentVal = GetProperties( aCurrent );
     303           0 :         aCurrentVal.getConstArray()[0] >>= sScheme;
     304             :     } // if(!sScheme.getLength())
     305             : 
     306           0 :     m_sLoadedScheme = sScheme;
     307           0 :     OUString sBase("ExtendedColorScheme/ColorSchemes/");
     308           0 :     sBase += sScheme;
     309             : 
     310           0 :     bool bFound = ExistsScheme(sScheme);
     311           0 :     if ( bFound )
     312             :     {
     313           0 :         aComponentNames = GetPropertyNames(sBase);
     314           0 :         FillComponentColors(aComponentNames,aDisplayNameMap);
     315             :     }
     316             : 
     317           0 :     if ( m_sLoadedScheme.isEmpty() )
     318           0 :         m_sLoadedScheme = "default";
     319             : 
     320           0 :     if ( sScheme != "default" )
     321             :     {
     322           0 :         OUString sDefault("default");
     323           0 :         if ( ExistsScheme(sDefault) )
     324             :         {
     325           0 :             OUString sBaseDefault("ExtendedColorScheme/ColorSchemes/default");
     326           0 :             aComponentNames = GetPropertyNames(sBaseDefault);
     327           0 :             FillComponentColors(aComponentNames,aDisplayNameMap);
     328           0 :         }
     329             :     }
     330           0 :     if ( !bFound && !sScheme.isEmpty() )
     331             :     {
     332           0 :         AddScheme(sScheme);
     333           0 :         CommitCurrentSchemeName();
     334           0 :     }
     335           0 : }
     336             : 
     337           0 : void ExtendedColorConfig_Impl::FillComponentColors(uno::Sequence < OUString >& _rComponents,const TDisplayNames& _rDisplayNames)
     338             : {
     339           0 :     const OUString sColorEntries("/Entries");
     340           0 :     OUString* pIter = _rComponents.getArray();
     341           0 :     OUString* pEnd  = pIter + _rComponents.getLength();
     342           0 :     for(;pIter != pEnd;++pIter)
     343             :     {
     344           0 :         OUString sComponentName = pIter->copy(pIter->lastIndexOf('/')+1);
     345           0 :         if ( m_aConfigValues.find(sComponentName) == m_aConfigValues.end() )
     346             :         {
     347           0 :             OUString sEntry = *pIter;
     348           0 :             sEntry += sColorEntries;
     349             : 
     350           0 :             uno::Sequence < OUString > aColorNames = GetPropertyNames(sEntry);
     351           0 :             uno::Sequence < OUString > aDefaultColorNames = aColorNames;
     352             : 
     353           0 :             const OUString sColor("/Color");
     354           0 :             const OUString sDefaultColor("/DefaultColor");
     355           0 :             lcl_addString(aColorNames,sColor);
     356           0 :             lcl_addString(aDefaultColorNames,sDefaultColor);
     357           0 :             uno::Sequence< uno::Any > aColors = GetProperties( aColorNames );
     358           0 :             const uno::Any* pColors = aColors.getConstArray();
     359             : 
     360           0 :             uno::Sequence< uno::Any > aDefaultColors = GetProperties( aDefaultColorNames );
     361           0 :             bool bDefaultColorFound = aDefaultColors.getLength() != 0;
     362           0 :             const uno::Any* pDefaultColors = aDefaultColors.getConstArray();
     363             : 
     364           0 :             OUString* pColorIter = aColorNames.getArray();
     365           0 :             OUString* pColorEnd  = pColorIter + aColorNames.getLength();
     366             : 
     367           0 :             m_aConfigValuesPos.push_back(m_aConfigValues.insert(TComponents::value_type(sComponentName,TComponentMapping(TConfigValues(),TMapPos()))).first);
     368           0 :             TConfigValues& aConfigValues = (*m_aConfigValuesPos.rbegin())->second.first;
     369           0 :             TMapPos& aConfigValuesPos = (*m_aConfigValuesPos.rbegin())->second.second;
     370           0 :             for(int i = 0; pColorIter != pColorEnd; ++pColorIter ,++i)
     371             :             {
     372           0 :                 if ( aConfigValues.find(*pColorIter) == aConfigValues.end() )
     373             :                 {
     374           0 :                     sal_Int32 nIndex = 0;
     375           0 :                     pColorIter->getToken(2,'/',nIndex);
     376           0 :                     OUString sName(pColorIter->copy(nIndex)),sDisplayName;
     377           0 :                     OUString sTemp = sName.copy(0,sName.lastIndexOf(sColor));
     378             : 
     379           0 :                     TDisplayNames::const_iterator aFind = _rDisplayNames.find(sTemp);
     380           0 :                     nIndex = 0;
     381           0 :                     sName = sName.getToken(2,'/',nIndex);
     382             :                     OSL_ENSURE(aFind != _rDisplayNames.end(),"DisplayName is not in EntryNames config list!");
     383           0 :                     if ( aFind != _rDisplayNames.end() )
     384           0 :                         sDisplayName = aFind->second;
     385             : 
     386             :                     OSL_ENSURE(pColors[i].hasValue(),"Color config entry has NIL as color value set!");
     387             :                     OSL_ENSURE(pDefaultColors[i].hasValue(),"Color config entry has NIL as color value set!");
     388           0 :                     sal_Int32 nColor = 0,nDefaultColor = 0;
     389           0 :                     pColors[i] >>= nColor;
     390           0 :                     if ( bDefaultColorFound )
     391           0 :                         pDefaultColors[i] >>= nDefaultColor;
     392             :                     else
     393           0 :                         nDefaultColor = nColor;
     394           0 :                     ExtendedColorConfigValue aValue(sName,sDisplayName,nColor,nDefaultColor);
     395           0 :                     aConfigValuesPos.push_back(aConfigValues.insert(TConfigValues::value_type(sName,aValue)).first);
     396             :                 }
     397           0 :             } // for(int i = 0; pColorIter != pColorEnd; ++pColorIter ,++i)
     398             :         }
     399           0 :     }
     400           0 : }
     401             : 
     402           0 : void    ExtendedColorConfig_Impl::Notify( const uno::Sequence<OUString>& /*rPropertyNames*/)
     403             : {
     404             :     //loading via notification always uses the default setting
     405           0 :     Load(OUString());
     406             : 
     407           0 :     SolarMutexGuard aVclGuard;
     408             : 
     409           0 :     if(m_bLockBroadcast)
     410             :     {
     411           0 :         m_bBroadcastWhenUnlocked = true;
     412             :     }
     413             :     else
     414           0 :         Broadcast(SfxSimpleHint(SFX_HINT_COLORS_CHANGED));
     415           0 : }
     416             : 
     417           0 : void ExtendedColorConfig_Impl::ImplCommit()
     418             : {
     419           0 :     if ( m_sLoadedScheme.isEmpty() )
     420           0 :         return;
     421           0 :     const OUString sColorEntries("Entries");
     422           0 :     const OUString sColor("/Color");
     423           0 :     OUString sBase("ExtendedColorScheme/ColorSchemes/");
     424           0 :     const OUString s_sSep("/");
     425           0 :     sBase += m_sLoadedScheme;
     426             : 
     427           0 :     TComponents::iterator aIter = m_aConfigValues.begin();
     428           0 :     TComponents::iterator aEnd = m_aConfigValues.end();
     429           0 :     for( ;aIter != aEnd;++aIter )
     430             :     {
     431           0 :         OUString sEntry = aIter->first;
     432           0 :         sEntry += sColorEntries;
     433             : 
     434           0 :         if ( ConfigItem::AddNode(sBase, aIter->first) )
     435             :         {
     436           0 :             OUString sNode = sBase;
     437           0 :             sNode += s_sSep;
     438           0 :             sNode += aIter->first;
     439             :             //ConfigItem::AddNode(sNode, sColorEntries);
     440           0 :             sNode += s_sSep;
     441           0 :             sNode += sColorEntries;
     442             : 
     443           0 :             uno::Sequence < beans::PropertyValue > aPropValues(aIter->second.first.size());
     444           0 :             beans::PropertyValue* pPropValues = aPropValues.getArray();
     445           0 :             TConfigValues::iterator aConIter = aIter->second.first.begin();
     446           0 :             TConfigValues::iterator aConEnd  = aIter->second.first.end();
     447           0 :             for (; aConIter != aConEnd; ++aConIter,++pPropValues)
     448             :             {
     449           0 :                 pPropValues->Name = sNode + s_sSep + aConIter->first;
     450           0 :                 ConfigItem::AddNode(sNode, aConIter->first);
     451           0 :                 pPropValues->Name += sColor;
     452           0 :                 pPropValues->Value <<= aConIter->second.getColor();
     453             :                 // the default color will never be changed
     454             :             }
     455           0 :             OUString s("ExtendedColorScheme/ColorSchemes");
     456           0 :             SetSetProperties(s, aPropValues);
     457             :         }
     458           0 :     }
     459             : 
     460           0 :     CommitCurrentSchemeName();
     461             : }
     462             : 
     463           0 : void ExtendedColorConfig_Impl::CommitCurrentSchemeName()
     464             : {
     465             :     //save current scheme name
     466           0 :     uno::Sequence < OUString > aCurrent(1);
     467           0 :     aCurrent.getArray()[0] = "ExtendedColorScheme/CurrentColorScheme";
     468           0 :     uno::Sequence< uno::Any > aCurrentVal(1);
     469           0 :     aCurrentVal.getArray()[0] <<= m_sLoadedScheme;
     470           0 :     PutProperties(aCurrent, aCurrentVal);
     471           0 : }
     472             : 
     473           0 : bool ExtendedColorConfig_Impl::ExistsScheme(const OUString& _sSchemeName)
     474             : {
     475           0 :     OUString sBase("ExtendedColorScheme/ColorSchemes");
     476             : 
     477           0 :     uno::Sequence < OUString > aComponentNames = GetPropertyNames(sBase);
     478           0 :     sBase += "/" + _sSchemeName;
     479           0 :     const OUString* pCompIter = aComponentNames.getConstArray();
     480           0 :     const OUString* pCompEnd  = pCompIter + aComponentNames.getLength();
     481           0 :     for(;pCompIter != pCompEnd && *pCompIter != sBase;++pCompIter)
     482             :         ;
     483           0 :     return pCompIter != pCompEnd;
     484             : }
     485             : 
     486           0 : void ExtendedColorConfig_Impl::SetColorConfigValue(const OUString& _sName, const ExtendedColorConfigValue& rValue )
     487             : {
     488           0 :     TComponents::iterator aFind = m_aConfigValues.find(_sName);
     489           0 :     if ( aFind != m_aConfigValues.end() )
     490             :     {
     491           0 :         TConfigValues::iterator aFind2 = aFind->second.first.find(rValue.getName());
     492           0 :         if ( aFind2 != aFind->second.first.end() )
     493           0 :             aFind2->second = rValue;
     494           0 :         SetModified();
     495             :     }
     496           0 : }
     497             : 
     498           0 : bool ExtendedColorConfig_Impl::AddScheme(const OUString& rScheme)
     499             : {
     500           0 :     if(ConfigItem::AddNode(OUString("ExtendedColorScheme/ColorSchemes"), rScheme))
     501             :     {
     502           0 :         m_sLoadedScheme = rScheme;
     503           0 :         Commit();
     504           0 :         return true;
     505             :     }
     506           0 :     return false;
     507             : }
     508             : 
     509           0 : bool ExtendedColorConfig_Impl::RemoveScheme(const OUString& rScheme)
     510             : {
     511           0 :     uno::Sequence< OUString > aElements(1);
     512           0 :     aElements.getArray()[0] = rScheme;
     513           0 :     return ClearNodeElements(OUString("ExtendedColorScheme/ColorSchemes"), aElements);
     514             : }
     515             : 
     516           0 : void ExtendedColorConfig_Impl::SettingsChanged()
     517             : {
     518           0 :     SolarMutexGuard aVclGuard;
     519             : 
     520           0 :     Broadcast( SfxSimpleHint( SFX_HINT_COLORS_CHANGED ) );
     521           0 : }
     522             : 
     523           0 : void ExtendedColorConfig_Impl::LockBroadcast()
     524             : {
     525           0 :     m_bLockBroadcast = true;
     526           0 : }
     527             : 
     528           0 : void ExtendedColorConfig_Impl::UnlockBroadcast()
     529             : {
     530           0 :     if ( m_bBroadcastWhenUnlocked )
     531             :     {
     532           0 :         m_bBroadcastWhenUnlocked = ExtendedColorConfig::m_pImpl != NULL;
     533           0 :         if ( m_bBroadcastWhenUnlocked )
     534             :         {
     535           0 :             if ( ExtendedColorConfig_Impl::IsEnableBroadcast() )
     536             :             {
     537           0 :                 m_bBroadcastWhenUnlocked = false;
     538           0 :                 ExtendedColorConfig::m_pImpl->Broadcast(SfxSimpleHint(SFX_HINT_COLORS_CHANGED));
     539             :             }
     540             :         }
     541             :     }
     542           0 :     m_bLockBroadcast = false;
     543           0 : }
     544             : 
     545           0 : IMPL_LINK( ExtendedColorConfig_Impl, DataChangedEventListener, VclWindowEvent*, pEvent )
     546             : {
     547           0 :     if ( pEvent->GetId() == VCLEVENT_APPLICATION_DATACHANGED )
     548             :     {
     549           0 :         DataChangedEvent* pData = static_cast<DataChangedEvent*>(pEvent->GetData());
     550           0 :         if ( (pData->GetType() == DataChangedEventType::SETTINGS) &&
     551           0 :              (pData->GetFlags() & AllSettingsFlags::STYLE) )
     552             :         {
     553           0 :             SettingsChanged();
     554           0 :             return 1L;
     555             :         } else
     556           0 :             return 0L;
     557             :     } else
     558           0 :         return 0L;
     559             : }
     560             : 
     561             : 
     562             : 
     563             : 
     564             : 
     565           0 : ExtendedColorConfig::ExtendedColorConfig()
     566             : {
     567           0 :     ::osl::MutexGuard aGuard( ColorMutex_Impl::get() );
     568           0 :     if ( !m_pImpl )
     569           0 :         m_pImpl = new ExtendedColorConfig_Impl;
     570           0 :     ++nExtendedColorRefCount_Impl;
     571           0 :     StartListening( *m_pImpl);
     572           0 : }
     573             : 
     574           0 : ExtendedColorConfig::~ExtendedColorConfig()
     575             : {
     576           0 :     ::osl::MutexGuard aGuard( ColorMutex_Impl::get() );
     577           0 :     EndListening( *m_pImpl);
     578           0 :     if(!--nExtendedColorRefCount_Impl)
     579             :     {
     580           0 :         delete m_pImpl;
     581           0 :         m_pImpl = 0;
     582           0 :     }
     583           0 : }
     584             : 
     585           0 : ExtendedColorConfigValue ExtendedColorConfig::GetColorValue(const OUString& _sComponentName,const OUString& _sName)const
     586             : {
     587           0 :     return m_pImpl->GetColorConfigValue(_sComponentName,_sName);
     588             : }
     589             : 
     590           0 : sal_Int32 ExtendedColorConfig::GetComponentCount() const
     591             : {
     592           0 :     return m_pImpl->GetComponentCount();
     593             : }
     594             : 
     595           0 : sal_Int32 ExtendedColorConfig::GetComponentColorCount(const OUString& _sName) const
     596             : {
     597           0 :     return m_pImpl->GetComponentColorCount(_sName);
     598             : }
     599             : 
     600           0 : ExtendedColorConfigValue ExtendedColorConfig::GetComponentColorConfigValue(const OUString& _sName,sal_uInt32 _nPos) const
     601             : {
     602           0 :     return m_pImpl->GetComponentColorConfigValue(_sName,_nPos);
     603             : }
     604             : 
     605           0 : OUString ExtendedColorConfig::GetComponentName(sal_uInt32 _nPos) const
     606             : {
     607           0 :     return m_pImpl->GetComponentName(_nPos);
     608             : }
     609             : 
     610           0 : OUString ExtendedColorConfig::GetComponentDisplayName(const OUString& _sComponentName) const
     611             : {
     612           0 :     return m_pImpl->GetComponentDisplayName(_sComponentName);
     613             : }
     614             : 
     615           0 : void ExtendedColorConfig::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
     616             : {
     617           0 :     SolarMutexGuard aVclGuard;
     618             : 
     619           0 :     Broadcast( rHint );
     620           0 : }
     621             : 
     622           0 : EditableExtendedColorConfig::EditableExtendedColorConfig() :
     623           0 :     m_pImpl(new ExtendedColorConfig_Impl),
     624           0 :     m_bModified(false)
     625             : {
     626           0 :     ExtendedColorConfig_Impl::LockBroadcast();
     627           0 : }
     628             : 
     629           0 : EditableExtendedColorConfig::~EditableExtendedColorConfig()
     630             : {
     631           0 :     ExtendedColorConfig_Impl::UnlockBroadcast();
     632           0 :     if(m_bModified)
     633           0 :         m_pImpl->SetModified();
     634           0 :     if(m_pImpl->IsModified())
     635           0 :         m_pImpl->Commit();
     636           0 :     delete m_pImpl;
     637           0 : }
     638             : 
     639           0 : void EditableExtendedColorConfig::DeleteScheme(const OUString& rScheme )
     640             : {
     641           0 :     m_pImpl->RemoveScheme(rScheme);
     642           0 : }
     643             : 
     644           0 : void EditableExtendedColorConfig::AddScheme(const OUString& rScheme )
     645             : {
     646           0 :     m_pImpl->AddScheme(rScheme);
     647           0 : }
     648             : 
     649           0 : bool EditableExtendedColorConfig::LoadScheme(const OUString& rScheme )
     650             : {
     651           0 :     if(m_bModified)
     652           0 :         m_pImpl->SetModified();
     653           0 :     if(m_pImpl->IsModified())
     654           0 :         m_pImpl->Commit();
     655           0 :     m_bModified = false;
     656           0 :     m_pImpl->Load(rScheme);
     657             :     //the name of the loaded scheme has to be committed separately
     658           0 :     m_pImpl->CommitCurrentSchemeName();
     659           0 :     return true;
     660             : }
     661             : 
     662             : // Changes the name of the current scheme but doesn't load it!
     663           0 : void EditableExtendedColorConfig::SetCurrentSchemeName(const OUString& rScheme)
     664             : {
     665           0 :     m_pImpl->SetCurrentSchemeName(rScheme);
     666           0 :     m_pImpl->CommitCurrentSchemeName();
     667           0 : }
     668             : 
     669           0 : void EditableExtendedColorConfig::SetColorValue(
     670             :     const OUString& _sName, const ExtendedColorConfigValue& rValue)
     671             : {
     672           0 :     m_pImpl->SetColorConfigValue(_sName, rValue);
     673           0 :     m_pImpl->ClearModified();
     674           0 :     m_bModified = true;
     675           0 : }
     676             : 
     677           0 : void EditableExtendedColorConfig::SetModified()
     678             : {
     679           0 :     m_bModified = true;
     680           0 : }
     681             : 
     682           0 : void EditableExtendedColorConfig::Commit()
     683             : {
     684           0 :     if(m_bModified)
     685           0 :         m_pImpl->SetModified();
     686           0 :     if(m_pImpl->IsModified())
     687           0 :         m_pImpl->Commit();
     688           0 :     m_bModified = false;
     689           0 : }
     690             : 
     691           0 : void EditableExtendedColorConfig::DisableBroadcast()
     692             : {
     693           0 :     ExtendedColorConfig_Impl::DisableBroadcast();
     694           0 : }
     695             : 
     696           0 : void EditableExtendedColorConfig::EnableBroadcast()
     697             : {
     698           0 :     ExtendedColorConfig_Impl::EnableBroadcast();
     699           0 : }
     700             : 
     701           0 : sal_Int32 EditableExtendedColorConfig::GetComponentCount() const
     702             : {
     703           0 :     return m_pImpl->GetComponentCount();
     704             : }
     705             : 
     706           0 : sal_Int32 EditableExtendedColorConfig::GetComponentColorCount(const OUString& _sName) const
     707             : {
     708           0 :     return m_pImpl->GetComponentColorCount(_sName);
     709             : }
     710             : 
     711           0 : ExtendedColorConfigValue EditableExtendedColorConfig::GetComponentColorConfigValue(const OUString& _sName,sal_uInt32 _nPos) const
     712             : {
     713           0 :     return m_pImpl->GetComponentColorConfigValue(_sName,_nPos);
     714             : }
     715             : 
     716           0 : OUString EditableExtendedColorConfig::GetComponentName(sal_uInt32 _nPos) const
     717             : {
     718           0 :     return m_pImpl->GetComponentName(_nPos);
     719             : }
     720             : }//namespace svtools
     721             : 
     722             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11