xref: /AOO41X/main/svtools/source/config/extcolorcfg.cxx (revision 5900e8ec128faec89519683efce668ccd8cc6084)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 // MARKER(update_precomp.py): autogen include statement, do not remove
24 #include "precompiled_svtools.hxx"
25 
26 #include <svtools/extcolorcfg.hxx>
27 #include <com/sun/star/uno/Any.hxx>
28 #include <com/sun/star/uno/Sequence.hxx>
29 #include <com/sun/star/lang/Locale.hpp>
30 #include <com/sun/star/beans/PropertyValue.hpp>
31 #include <tools/color.hxx>
32 #include <tools/debug.hxx>
33 #include <unotools/configitem.hxx>
34 #include <unotools/configpathes.hxx>
35 #include <com/sun/star/uno/Sequence.h>
36 #include <svl/poolitem.hxx> //Any2Bool
37 #include <svl/smplhint.hxx>
38 #include <vos/mutex.hxx>
39 
40  /* #100822# ----
41 #include <vcl/wrkwin.hxx>
42  ------------- */
43 #include <vcl/svapp.hxx>
44 #include <vcl/event.hxx>
45 #include <rtl/instance.hxx>
46 #include <rtl/strbuf.hxx>
47 #include <comphelper/stl_types.hxx>
48 
49 
50 //-----------------------------------------------------------------------------
51 using namespace utl;
52 using namespace rtl;
53 using namespace com::sun::star;
54 
55 namespace svtools
56 {
57 
58 #define C2U(cChar) OUString::createFromAscii(cChar)
59 sal_Int32            nExtendedColorRefCount_Impl = 0;
60 namespace
61 {
62     struct ColorMutex_Impl
63         : public rtl::Static< ::osl::Mutex, ColorMutex_Impl > {};
64 }
65 
66 ExtendedColorConfig_Impl*    ExtendedColorConfig::m_pImpl = NULL;
67 
68 /* -----------------------------16.01.01 15:36--------------------------------
69  ---------------------------------------------------------------------------*/
70 class ExtendedColorConfig_Impl : public utl::ConfigItem, public SfxBroadcaster
71 {
72     DECLARE_STL_USTRINGACCESS_MAP( ::rtl::OUString, TDisplayNames);
73     DECLARE_STL_USTRINGACCESS_MAP(ExtendedColorConfigValue,TConfigValues);
74     typedef ::std::vector<TConfigValues::iterator> TMapPos;
75     typedef ::std::pair< TConfigValues, TMapPos > TComponentMapping;
76     DECLARE_STL_USTRINGACCESS_MAP(TComponentMapping,TComponents);
77     TComponents         m_aConfigValues;
78     TDisplayNames       m_aComponentDisplayNames;
79     ::std::vector<TComponents::iterator> m_aConfigValuesPos;
80 
81     sal_Bool            m_bEditMode;
82     rtl::OUString       m_sLoadedScheme;
83     sal_Bool            m_bIsBroadcastEnabled;
84     static sal_Bool     m_bLockBroadcast;
85     static sal_Bool     m_bBroadcastWhenUnlocked;
86 
87     uno::Sequence< ::rtl::OUString> GetPropertyNames(const rtl::OUString& rScheme);
88     void FillComponentColors(uno::Sequence < ::rtl::OUString >& _rComponents,const TDisplayNames& _rDisplayNames);
89 public:
90     ExtendedColorConfig_Impl(sal_Bool bEditMode = sal_False);
91     virtual ~ExtendedColorConfig_Impl();
92 
93     void                            Load(const rtl::OUString& rScheme);
94     void                            CommitCurrentSchemeName();
95     //changes the name of the current scheme but doesn't load it!
SetCurrentSchemeName(const rtl::OUString & rSchemeName)96     void                            SetCurrentSchemeName(const rtl::OUString& rSchemeName) {m_sLoadedScheme = rSchemeName;}
97     sal_Bool                        ExistsScheme(const ::rtl::OUString& _sSchemeName);
98     virtual void                    Commit();
99     virtual void                    Notify( const uno::Sequence<rtl::OUString>& aPropertyNames);
100 
101     sal_Int32                       GetComponentCount() const;
102     ::rtl::OUString                 GetComponentName(sal_uInt32 _nPos) const;
103     ::rtl::OUString                 GetComponentDisplayName(const ::rtl::OUString& _sComponentName) const;
104     sal_Int32                       GetComponentColorCount(const ::rtl::OUString& _sName) const;
105     ExtendedColorConfigValue        GetComponentColorConfigValue(const ::rtl::OUString& _sName,sal_uInt32 _nPos) const;
106 
GetColorConfigValue(const::rtl::OUString & _sComponentName,const::rtl::OUString & _sName)107     ExtendedColorConfigValue GetColorConfigValue(const ::rtl::OUString& _sComponentName,const ::rtl::OUString& _sName)
108     {
109         TComponents::iterator aFind = m_aConfigValues.find(_sComponentName);
110         if ( aFind != m_aConfigValues.end() )
111         {
112             TConfigValues::iterator aFind2 = aFind->second.first.find(_sName);
113             if ( aFind2 != aFind->second.first.end() )
114                 return aFind2->second;
115         }
116 #if OSL_DEBUG_LEVEL > 0
117         ::rtl::OStringBuffer aMessage( "Could find the required config:\n" );
118         aMessage.append( "component: " );
119         aMessage.append( ::rtl::OUStringToOString( _sComponentName, RTL_TEXTENCODING_UTF8 ) );
120         aMessage.append( "\nname: " );
121         aMessage.append( ::rtl::OUStringToOString( _sName, RTL_TEXTENCODING_UTF8 ) );
122         OSL_ENSURE( 0, aMessage.makeStringAndClear().getStr() );
123 #endif
124         return ExtendedColorConfigValue();
125     }
126     void                            SetColorConfigValue(const ::rtl::OUString& _sName,
127                                                             const ExtendedColorConfigValue& rValue );
128 
GetLoadedScheme() const129     const rtl::OUString&            GetLoadedScheme() const {return m_sLoadedScheme;}
130 
131     uno::Sequence< ::rtl::OUString> GetSchemeNames();
132 
133     sal_Bool                        AddScheme(const rtl::OUString& rNode);
134     sal_Bool                        RemoveScheme(const rtl::OUString& rNode);
SetModified()135     void                            SetModified(){ConfigItem::SetModified();}
ClearModified()136     void                            ClearModified(){ConfigItem::ClearModified();}
137     void                            SettingsChanged();
138 
139     static void                     DisableBroadcast();
140     static void                     EnableBroadcast();
141     static sal_Bool                 IsEnableBroadcast();
142 
143     static void                     LockBroadcast();
144     static void                     UnlockBroadcast();
145 
146     // #100822#
147     DECL_LINK( DataChangedEventListener, VclWindowEvent* );
148 };
149 
150 /* -----------------------------16.01.01 15:36--------------------------------
151 
152  ---------------------------------------------------------------------------*/
GetPropertyNames(const rtl::OUString & rScheme)153 uno::Sequence< OUString> ExtendedColorConfig_Impl::GetPropertyNames(const rtl::OUString& rScheme)
154 {
155     uno::Sequence< OUString> aNames(GetNodeNames(rScheme));
156     ::rtl::OUString* pIter = aNames.getArray();
157     ::rtl::OUString* pEnd    = pIter + aNames.getLength();
158     ::rtl::OUString sSep(RTL_CONSTASCII_USTRINGPARAM("/"));
159     for(;pIter != pEnd;++pIter)
160     {
161         *pIter = rScheme + sSep + *pIter;
162     }
163     return aNames;
164 }
165 // -----------------------------------------------------------------------------
GetComponentCount() const166 sal_Int32 ExtendedColorConfig_Impl::GetComponentCount() const
167 {
168     return m_aConfigValues.size();
169 }
170 // -----------------------------------------------------------------------------
GetComponentColorCount(const::rtl::OUString & _sName) const171 sal_Int32 ExtendedColorConfig_Impl::GetComponentColorCount(const ::rtl::OUString& _sName) const
172 {
173     sal_Int32 nSize = 0;
174     TComponents::const_iterator aFind = m_aConfigValues.find(_sName);
175     if ( aFind != m_aConfigValues.end() )
176     {
177         nSize = aFind->second.first.size();
178     }
179     return nSize;
180 }
181 // -----------------------------------------------------------------------------
GetComponentColorConfigValue(const::rtl::OUString & _sName,sal_uInt32 _nPos) const182 ExtendedColorConfigValue ExtendedColorConfig_Impl::GetComponentColorConfigValue(const ::rtl::OUString& _sName,sal_uInt32 _nPos) const
183 {
184     TComponents::const_iterator aFind = m_aConfigValues.find(_sName);
185     if ( aFind != m_aConfigValues.end() )
186     {
187         if ( _nPos < aFind->second.second.size() )
188         {
189             return aFind->second.second[_nPos]->second;
190         }
191     }
192     return ExtendedColorConfigValue();
193 }
194 // -----------------------------------------------------------------------------
GetComponentDisplayName(const::rtl::OUString & _sComponentName) const195 ::rtl::OUString ExtendedColorConfig_Impl::GetComponentDisplayName(const ::rtl::OUString& _sComponentName) const
196 {
197     ::rtl::OUString sRet;
198     TDisplayNames::const_iterator aFind = m_aComponentDisplayNames.find(_sComponentName);
199     if ( aFind != m_aComponentDisplayNames.end() )
200         sRet = aFind->second;
201     return sRet;
202 }
203 // -----------------------------------------------------------------------------
GetComponentName(sal_uInt32 _nPos) const204 ::rtl::OUString ExtendedColorConfig_Impl::GetComponentName(sal_uInt32 _nPos) const
205 {
206     ::rtl::OUString sRet;
207     if ( _nPos < m_aConfigValuesPos.size() )
208         sRet = m_aConfigValuesPos[_nPos]->first;
209     return sRet;
210 }
211 // -----------------------------------------------------------------------------
212 /* -----------------------------22.03.2002 14:37------------------------------
213 
214  ---------------------------------------------------------------------------*/
215 sal_Bool ExtendedColorConfig_Impl::m_bLockBroadcast = sal_False;
216 sal_Bool ExtendedColorConfig_Impl::m_bBroadcastWhenUnlocked = sal_False;
ExtendedColorConfig_Impl(sal_Bool bEditMode)217 ExtendedColorConfig_Impl::ExtendedColorConfig_Impl(sal_Bool bEditMode) :
218     ConfigItem(C2U("Office.ExtendedColorScheme")),
219     m_bEditMode(bEditMode),
220     m_bIsBroadcastEnabled(sal_True)
221 {
222     if(!m_bEditMode)
223     {
224         //try to register on the root node - if possible
225         uno::Sequence < ::rtl::OUString > aNames(1);
226         EnableNotification( aNames );
227     }
228     Load(::rtl::OUString());
229 
230     // #100822#
231     ::Application::AddEventListener( LINK(this, ExtendedColorConfig_Impl, DataChangedEventListener) );
232 
233 }
234 /* -----------------------------25.03.2002 12:28------------------------------
235 
236  ---------------------------------------------------------------------------*/
~ExtendedColorConfig_Impl()237 ExtendedColorConfig_Impl::~ExtendedColorConfig_Impl()
238 {
239     // #100822#
240     ::Application::RemoveEventListener( LINK(this, ExtendedColorConfig_Impl, DataChangedEventListener) );
241 }
242 // -----------------------------------------------------------------------------
DisableBroadcast()243 void ExtendedColorConfig_Impl::DisableBroadcast()
244 {
245     if ( ExtendedColorConfig::m_pImpl )
246         ExtendedColorConfig::m_pImpl->m_bIsBroadcastEnabled = sal_False;
247 }
248 // -----------------------------------------------------------------------------
EnableBroadcast()249 void ExtendedColorConfig_Impl::EnableBroadcast()
250 {
251     if ( ExtendedColorConfig::m_pImpl )
252         ExtendedColorConfig::m_pImpl->m_bIsBroadcastEnabled = sal_True;
253 }
254 // -----------------------------------------------------------------------------
IsEnableBroadcast()255 sal_Bool ExtendedColorConfig_Impl::IsEnableBroadcast()
256 {
257     return ExtendedColorConfig::m_pImpl ? ExtendedColorConfig::m_pImpl->m_bIsBroadcastEnabled : sal_False;
258 }
259 /* -----------------------------22.03.2002 14:38------------------------------
260 
261  ---------------------------------------------------------------------------*/
lcl_addString(uno::Sequence<::rtl::OUString> & _rSeq,const::rtl::OUString & _sAdd)262 void lcl_addString(uno::Sequence < ::rtl::OUString >& _rSeq,const ::rtl::OUString& _sAdd)
263 {
264     ::rtl::OUString* pIter = _rSeq.getArray();
265     ::rtl::OUString* pEnd  = pIter + _rSeq.getLength();
266     for(;pIter != pEnd;++pIter)
267         *pIter += _sAdd;
268 }
269 // -----------------------------------------------------------------------------
Load(const rtl::OUString & rScheme)270 void ExtendedColorConfig_Impl::Load(const rtl::OUString& rScheme)
271 {
272     m_aComponentDisplayNames.clear();
273     m_aConfigValuesPos.clear();
274     m_aConfigValues.clear();
275 
276     // fill display names
277     TDisplayNames aDisplayNameMap;
278     ::rtl::OUString sEntryNames(RTL_CONSTASCII_USTRINGPARAM("EntryNames"));
279     uno::Sequence < ::rtl::OUString > aComponentNames = GetPropertyNames(sEntryNames);
280     ::rtl::OUString sDisplayName(RTL_CONSTASCII_USTRINGPARAM("/DisplayName"));
281     ::rtl::OUString* pIter = aComponentNames.getArray();
282     ::rtl::OUString* pEnd  = pIter + aComponentNames.getLength();
283     for(sal_Int32 i = 0;pIter != pEnd;++pIter,++i)
284     {
285         uno::Sequence < ::rtl::OUString > aComponentDisplayNames(1);
286         aComponentDisplayNames[0] = *pIter;
287         aComponentDisplayNames[0] += sDisplayName;
288         uno::Sequence< uno::Any > aComponentDisplayNamesValue = GetProperties( aComponentDisplayNames );
289         ::rtl::OUString sComponentDisplayName;
290         if ( aComponentDisplayNamesValue.getLength() && (aComponentDisplayNamesValue[0] >>= sComponentDisplayName) )
291         {
292             sal_Int32 nIndex = 0;
293             m_aComponentDisplayNames.insert(TDisplayNames::value_type(pIter->getToken(1,'/',nIndex),sComponentDisplayName));
294         }
295 
296         *pIter += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/Entries"));
297         uno::Sequence < ::rtl::OUString > aDisplayNames = GetPropertyNames(*pIter);
298         lcl_addString(aDisplayNames,sDisplayName);
299 
300         uno::Sequence< uno::Any > aDisplayNamesValue = GetProperties( aDisplayNames );
301 
302         const ::rtl::OUString* pDispIter = aDisplayNames.getConstArray();
303         const ::rtl::OUString* pDispEnd  = pDispIter + aDisplayNames.getLength();
304         for(sal_Int32 j = 0;pDispIter != pDispEnd;++pDispIter,++j)
305         {
306             sal_Int32 nIndex = 0;
307             pDispIter->getToken(0,'/',nIndex);
308             ::rtl::OUString sName = pDispIter->copy(nIndex);
309             sName = sName.copy(0,sName.lastIndexOf(sDisplayName));
310             ::rtl::OUString sCurrentDisplayName;
311             aDisplayNamesValue[j] >>= sCurrentDisplayName;
312             aDisplayNameMap.insert(TDisplayNames::value_type(sName,sCurrentDisplayName));
313         }
314     }
315 
316     // load color settings
317     rtl::OUString sScheme(rScheme);
318 
319     if(!sScheme.getLength())
320     {
321         //detect current scheme name
322         uno::Sequence < ::rtl::OUString > aCurrent(1);
323         aCurrent.getArray()[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ExtendedColorScheme/CurrentColorScheme"));
324         uno::Sequence< uno::Any > aCurrentVal = GetProperties( aCurrent );
325         aCurrentVal.getConstArray()[0] >>= sScheme;
326     } // if(!sScheme.getLength())
327 
328     m_sLoadedScheme = sScheme;
329     ::rtl::OUString sBase(RTL_CONSTASCII_USTRINGPARAM("ExtendedColorScheme/ColorSchemes/"));
330     sBase += sScheme;
331 
332     sal_Bool bFound = ExistsScheme(sScheme);
333     if ( bFound )
334     {
335         aComponentNames = GetPropertyNames(sBase);
336         FillComponentColors(aComponentNames,aDisplayNameMap);
337     } // if ( bFound )
338 
339     if ( !m_sLoadedScheme.getLength() )
340         m_sLoadedScheme = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("default"));
341 
342     if ( !sScheme.equalsAscii("default") )
343     {
344         ::rtl::OUString sDefault(RTL_CONSTASCII_USTRINGPARAM("default"));
345         if ( ExistsScheme(sDefault) )
346         {
347             ::rtl::OUString sBaseDefault(RTL_CONSTASCII_USTRINGPARAM("ExtendedColorScheme/ColorSchemes/default"));
348             aComponentNames = GetPropertyNames(sBaseDefault);
349             FillComponentColors(aComponentNames,aDisplayNameMap);
350         }
351     } // if ( !sScheme.equalsAscii("default") )
352     if ( !bFound && sScheme.getLength() )
353     {
354         AddScheme(sScheme);
355         CommitCurrentSchemeName();
356     }
357 }
358 // -----------------------------------------------------------------------------
FillComponentColors(uno::Sequence<::rtl::OUString> & _rComponents,const TDisplayNames & _rDisplayNames)359 void ExtendedColorConfig_Impl::FillComponentColors(uno::Sequence < ::rtl::OUString >& _rComponents,const TDisplayNames& _rDisplayNames)
360 {
361     const ::rtl::OUString sColorEntries(RTL_CONSTASCII_USTRINGPARAM("/Entries"));
362     ::rtl::OUString* pIter = _rComponents.getArray();
363     ::rtl::OUString* pEnd  = pIter + _rComponents.getLength();
364     for(;pIter != pEnd;++pIter)
365     {
366         ::rtl::OUString sComponentName = pIter->copy(pIter->lastIndexOf('/')+1);
367         if ( m_aConfigValues.find(sComponentName) == m_aConfigValues.end() )
368         {
369             ::rtl::OUString sEntry = *pIter;
370             sEntry += sColorEntries;
371 
372             uno::Sequence < ::rtl::OUString > aColorNames = GetPropertyNames(sEntry);
373             uno::Sequence < ::rtl::OUString > aDefaultColorNames = aColorNames;
374 
375             const ::rtl::OUString sColor(RTL_CONSTASCII_USTRINGPARAM("/Color"));
376             const ::rtl::OUString sDefaultColor(RTL_CONSTASCII_USTRINGPARAM("/DefaultColor"));
377             lcl_addString(aColorNames,sColor);
378             lcl_addString(aDefaultColorNames,sDefaultColor);
379             uno::Sequence< uno::Any > aColors = GetProperties( aColorNames );
380             const uno::Any* pColors = aColors.getConstArray();
381 
382             uno::Sequence< uno::Any > aDefaultColors = GetProperties( aDefaultColorNames );
383             bool bDefaultColorFound = aDefaultColors.getLength() != 0;
384             const uno::Any* pDefaultColors = aDefaultColors.getConstArray();
385 
386             ::rtl::OUString* pColorIter = aColorNames.getArray();
387             ::rtl::OUString* pColorEnd  = pColorIter + aColorNames.getLength();
388 
389             m_aConfigValuesPos.push_back(m_aConfigValues.insert(TComponents::value_type(sComponentName,TComponentMapping(TConfigValues(),TMapPos()))).first);
390             TConfigValues& aConfigValues = (*m_aConfigValuesPos.rbegin())->second.first;
391             TMapPos& aConfigValuesPos = (*m_aConfigValuesPos.rbegin())->second.second;
392             for(int i = 0; pColorIter != pColorEnd; ++pColorIter ,++i)
393             {
394                 if ( aConfigValues.find(*pColorIter) == aConfigValues.end() )
395                 {
396                     sal_Int32 nIndex = 0;
397                     pColorIter->getToken(2,'/',nIndex);
398                     ::rtl::OUString sName(pColorIter->copy(nIndex)),sDisplayName;
399                     ::rtl::OUString sTemp = sName.copy(0,sName.lastIndexOf(sColor));
400 
401                     TDisplayNames::const_iterator aFind = _rDisplayNames.find(sTemp);
402                     nIndex = 0;
403                     sName = sName.getToken(2,'/',nIndex);
404                     OSL_ENSURE(aFind != _rDisplayNames.end(),"DisplayName is not in EntryNames config list!");
405                     if ( aFind != _rDisplayNames.end() )
406                         sDisplayName = aFind->second;
407 
408                     OSL_ENSURE(pColors[i].hasValue(),"Color config entry has NIL as color value set!");
409                     OSL_ENSURE(pDefaultColors[i].hasValue(),"Color config entry has NIL as color value set!");
410                     sal_Int32 nColor = 0,nDefaultColor = 0;
411                     pColors[i] >>= nColor;
412                     if ( bDefaultColorFound )
413                         pDefaultColors[i] >>= nDefaultColor;
414                     else
415                         nDefaultColor = nColor;
416                     ExtendedColorConfigValue aValue(sName,sDisplayName,nColor,nDefaultColor);
417                     aConfigValuesPos.push_back(aConfigValues.insert(TConfigValues::value_type(sName,aValue)).first);
418                 }
419             } // for(int i = 0; pColorIter != pColorEnd; ++pColorIter ,++i)
420         }
421     }
422 }
423 /* -----------------------------22.03.2002 14:38------------------------------
424 
425  ---------------------------------------------------------------------------*/
Notify(const uno::Sequence<OUString> &)426 void    ExtendedColorConfig_Impl::Notify( const uno::Sequence<OUString>& /*rPropertyNames*/)
427 {
428     //loading via notification always uses the default setting
429     Load(::rtl::OUString());
430 
431     vos::OGuard aVclGuard( Application::GetSolarMutex() );
432 
433     if(m_bLockBroadcast)
434     {
435         m_bBroadcastWhenUnlocked = sal_True;
436     }
437     else
438         Broadcast(SfxSimpleHint(SFX_HINT_COLORS_CHANGED));
439 }
440 /* -----------------------------22.03.2002 14:38------------------------------
441 
442  ---------------------------------------------------------------------------*/
Commit()443 void ExtendedColorConfig_Impl::Commit()
444 {
445     if ( !m_sLoadedScheme.getLength() )
446         return;
447     const ::rtl::OUString sColorEntries(RTL_CONSTASCII_USTRINGPARAM("Entries"));
448     const ::rtl::OUString sColor(RTL_CONSTASCII_USTRINGPARAM("/Color"));
449     const ::rtl::OUString sDefaultColor(RTL_CONSTASCII_USTRINGPARAM("/DefaultColor"));
450     ::rtl::OUString sBase(RTL_CONSTASCII_USTRINGPARAM("ExtendedColorScheme/ColorSchemes/"));
451     const ::rtl::OUString s_sSep(RTL_CONSTASCII_USTRINGPARAM("/"));
452     sBase += m_sLoadedScheme;
453 
454     TComponents::iterator aIter = m_aConfigValues.begin();
455     TComponents::iterator aEnd = m_aConfigValues.end();
456     for( ;aIter != aEnd;++aIter )
457     {
458         ::rtl::OUString sEntry = aIter->first;
459         sEntry += sColorEntries;
460 
461         if ( ConfigItem::AddNode(sBase, aIter->first) )
462         {
463             rtl::OUString sNode = sBase;
464             sNode += s_sSep;
465             sNode += aIter->first;
466             //ConfigItem::AddNode(sNode, sColorEntries);
467             sNode += s_sSep;
468             sNode += sColorEntries;
469 
470             uno::Sequence < beans::PropertyValue > aPropValues(aIter->second.first.size());
471             beans::PropertyValue* pPropValues = aPropValues.getArray();
472             TConfigValues::iterator aConIter = aIter->second.first.begin();
473             TConfigValues::iterator aConEnd  = aIter->second.first.end();
474             for (; aConIter != aConEnd; ++aConIter,++pPropValues)
475             {
476                 pPropValues->Name = sNode + s_sSep + aConIter->first;
477                 ConfigItem::AddNode(sNode, aConIter->first);
478                 pPropValues->Name += sColor;
479                 pPropValues->Value <<= aConIter->second.getColor();
480                 // the default color will never be changed
481             }
482             ::rtl::OUString s(RTL_CONSTASCII_USTRINGPARAM("ExtendedColorScheme/ColorSchemes"));
483             SetSetProperties(s, aPropValues);
484         }
485     }
486 
487     CommitCurrentSchemeName();
488 }
489 /* -----------------11.12.2002 10:42-----------------
490  *
491  * --------------------------------------------------*/
CommitCurrentSchemeName()492 void ExtendedColorConfig_Impl::CommitCurrentSchemeName()
493 {
494     //save current scheme name
495     uno::Sequence < ::rtl::OUString > aCurrent(1);
496     aCurrent.getArray()[0] = C2U("ExtendedColorScheme/CurrentColorScheme");
497     uno::Sequence< uno::Any > aCurrentVal(1);
498     aCurrentVal.getArray()[0] <<= m_sLoadedScheme;
499     PutProperties(aCurrent, aCurrentVal);
500 }
501 // -----------------------------------------------------------------------------
ExistsScheme(const::rtl::OUString & _sSchemeName)502 sal_Bool ExtendedColorConfig_Impl::ExistsScheme(const ::rtl::OUString& _sSchemeName)
503 {
504     ::rtl::OUString sBase(RTL_CONSTASCII_USTRINGPARAM("ExtendedColorScheme/ColorSchemes"));
505 
506     uno::Sequence < ::rtl::OUString > aComponentNames = GetPropertyNames(sBase);
507     sBase += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")) + _sSchemeName;
508     const ::rtl::OUString* pCompIter = aComponentNames.getConstArray();
509     const ::rtl::OUString* pCompEnd  = pCompIter + aComponentNames.getLength();
510     for(;pCompIter != pCompEnd && *pCompIter != sBase;++pCompIter)
511         ;
512     return pCompIter != pCompEnd;
513 }
514 // -----------------------------------------------------------------------------
515 /* -----------------------------25.03.2002 12:19------------------------------
516 
517  ---------------------------------------------------------------------------*/
SetColorConfigValue(const::rtl::OUString & _sName,const ExtendedColorConfigValue & rValue)518 void ExtendedColorConfig_Impl::SetColorConfigValue(const ::rtl::OUString& _sName, const ExtendedColorConfigValue& rValue )
519 {
520     TComponents::iterator aFind = m_aConfigValues.find(_sName);
521     if ( aFind != m_aConfigValues.end() )
522     {
523         TConfigValues::iterator aFind2 = aFind->second.first.find(rValue.getName());
524         if ( aFind2 != aFind->second.first.end() )
525             aFind2->second = rValue;
526         SetModified();
527     }
528 }
529 /* -----------------------------25.03.2002 15:22------------------------------
530 
531  ---------------------------------------------------------------------------*/
GetSchemeNames()532 uno::Sequence< ::rtl::OUString> ExtendedColorConfig_Impl::GetSchemeNames()
533 {
534     return GetNodeNames(C2U("ExtendedColorScheme/ColorSchemes"));
535 }
536 /* -----------------------------09.04.2002 17:19------------------------------
537 
538  ---------------------------------------------------------------------------*/
AddScheme(const rtl::OUString & rScheme)539 sal_Bool ExtendedColorConfig_Impl::AddScheme(const rtl::OUString& rScheme)
540 {
541     if(ConfigItem::AddNode(C2U("ExtendedColorScheme/ColorSchemes"), rScheme))
542     {
543         m_sLoadedScheme = rScheme;
544         Commit();
545         return sal_True;
546     }
547     return sal_False;
548 }
549 /* -----------------------------09.04.2002 17:19------------------------------
550 
551  ---------------------------------------------------------------------------*/
RemoveScheme(const rtl::OUString & rScheme)552 sal_Bool ExtendedColorConfig_Impl::RemoveScheme(const rtl::OUString& rScheme)
553 {
554     uno::Sequence< rtl::OUString > aElements(1);
555     aElements.getArray()[0] = rScheme;
556     return ClearNodeElements(C2U("ExtendedColorScheme/ColorSchemes"), aElements);
557 }
558 /* -----------------------------2002/06/20 13:03------------------------------
559 
560  ---------------------------------------------------------------------------*/
SettingsChanged()561 void ExtendedColorConfig_Impl::SettingsChanged()
562 {
563     vos::OGuard aVclGuard( Application::GetSolarMutex() );
564 
565     Broadcast( SfxSimpleHint( SFX_HINT_COLORS_CHANGED ) );
566 }
567 /* -----------------11.12.2002 09:21-----------------
568  *
569  * --------------------------------------------------*/
LockBroadcast()570 void ExtendedColorConfig_Impl::LockBroadcast()
571 {
572     m_bLockBroadcast = sal_True;
573 }
574 /* -----------------11.12.2002 09:21-----------------
575  *
576  * --------------------------------------------------*/
UnlockBroadcast()577 void ExtendedColorConfig_Impl::UnlockBroadcast()
578 {
579     if ( m_bBroadcastWhenUnlocked )
580     {
581         m_bBroadcastWhenUnlocked = ExtendedColorConfig::m_pImpl != NULL;
582         if ( m_bBroadcastWhenUnlocked )
583         {
584             if ( ExtendedColorConfig::m_pImpl->IsEnableBroadcast() )
585             {
586                 m_bBroadcastWhenUnlocked = sal_False;
587                 ExtendedColorConfig::m_pImpl->Broadcast(SfxSimpleHint(SFX_HINT_COLORS_CHANGED));
588             }
589         }
590     }
591     m_bLockBroadcast = sal_False;
592 }
593 /* -----------------------------2002/08/16 12:07 -----------------------------
594    #100822#
595  --------------------------------------------------------------------------- */
IMPL_LINK(ExtendedColorConfig_Impl,DataChangedEventListener,VclWindowEvent *,pEvent)596 IMPL_LINK( ExtendedColorConfig_Impl, DataChangedEventListener, VclWindowEvent*, pEvent )
597 {
598     if ( pEvent->GetId() == VCLEVENT_APPLICATION_DATACHANGED )
599     {
600         DataChangedEvent* pData = (DataChangedEvent*)(pEvent->GetData());
601         if ( (pData->GetType() == DATACHANGED_SETTINGS) &&
602              (pData->GetFlags() & SETTINGS_STYLE) )
603         {
604             SettingsChanged();
605             return 1L;
606         } else
607             return 0L;
608     } else
609         return 0L;
610 }
611 
612 // ---------------------------------------------------------------------------
613 
614 // ---------------------------------------------------------------------------
615 
ExtendedColorConfig()616 ExtendedColorConfig::ExtendedColorConfig()
617 {
618     ::osl::MutexGuard aGuard( ColorMutex_Impl::get() );
619     if ( !m_pImpl )
620         m_pImpl = new ExtendedColorConfig_Impl;
621     ++nExtendedColorRefCount_Impl;
622     StartListening( *m_pImpl);
623 }
624 /* -----------------------------16.01.01 15:36--------------------------------
625 
626  ---------------------------------------------------------------------------*/
~ExtendedColorConfig()627 ExtendedColorConfig::~ExtendedColorConfig()
628 {
629     ::osl::MutexGuard aGuard( ColorMutex_Impl::get() );
630     EndListening( *m_pImpl);
631     if(!--nExtendedColorRefCount_Impl)
632     {
633         delete m_pImpl;
634         m_pImpl = 0;
635     }
636 }
637 /* -----------------------------11.04.2002 11:49------------------------------
638 
639  ---------------------------------------------------------------------------*/
GetColorValue(const::rtl::OUString & _sComponentName,const::rtl::OUString & _sName) const640 ExtendedColorConfigValue ExtendedColorConfig::GetColorValue(const ::rtl::OUString& _sComponentName,const ::rtl::OUString& _sName)const
641 {
642     return m_pImpl->GetColorConfigValue(_sComponentName,_sName);
643 }
644 // -----------------------------------------------------------------------------
GetComponentCount() const645 sal_Int32 ExtendedColorConfig::GetComponentCount() const
646 {
647     return m_pImpl->GetComponentCount();
648 }
649 // -----------------------------------------------------------------------------
GetComponentColorCount(const::rtl::OUString & _sName) const650 sal_Int32 ExtendedColorConfig::GetComponentColorCount(const ::rtl::OUString& _sName) const
651 {
652     return m_pImpl->GetComponentColorCount(_sName);
653 }
654 // -----------------------------------------------------------------------------
GetComponentColorConfigValue(const::rtl::OUString & _sName,sal_uInt32 _nPos) const655 ExtendedColorConfigValue ExtendedColorConfig::GetComponentColorConfigValue(const ::rtl::OUString& _sName,sal_uInt32 _nPos) const
656 {
657     return m_pImpl->GetComponentColorConfigValue(_sName,_nPos);
658 }
659 // -----------------------------------------------------------------------------
GetComponentName(sal_uInt32 _nPos) const660 ::rtl::OUString ExtendedColorConfig::GetComponentName(sal_uInt32 _nPos) const
661 {
662     return m_pImpl->GetComponentName(_nPos);
663 }
664 // -----------------------------------------------------------------------------
GetComponentDisplayName(const::rtl::OUString & _sComponentName) const665 ::rtl::OUString ExtendedColorConfig::GetComponentDisplayName(const ::rtl::OUString& _sComponentName) const
666 {
667     return m_pImpl->GetComponentDisplayName(_sComponentName);
668 }
669 // -----------------------------------------------------------------------------
670 /* -----------------------------12.04.2002 09:25------------------------------
671 
672  ---------------------------------------------------------------------------*/
Notify(SfxBroadcaster &,const SfxHint & rHint)673 void ExtendedColorConfig::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
674 {
675     vos::OGuard aVclGuard( Application::GetSolarMutex() );
676 
677     Broadcast( rHint );
678 }
679 /* -----------------------------25.03.2002 12:01------------------------------
680 
681  ---------------------------------------------------------------------------*/
EditableExtendedColorConfig()682 EditableExtendedColorConfig::EditableExtendedColorConfig() :
683     m_pImpl(new ExtendedColorConfig_Impl),
684     m_bModified(sal_False)
685 {
686     m_pImpl->LockBroadcast();
687 }
688 /*-- 25.03.2002 12:03:08---------------------------------------------------
689 
690   -----------------------------------------------------------------------*/
~EditableExtendedColorConfig()691 EditableExtendedColorConfig::~EditableExtendedColorConfig()
692 {
693     m_pImpl->UnlockBroadcast();
694     if(m_bModified)
695         m_pImpl->SetModified();
696     if(m_pImpl->IsModified())
697         m_pImpl->Commit();
698     delete m_pImpl;
699 }
700 
701 /*-- 25.03.2002 12:03:15---------------------------------------------------
702 
703   -----------------------------------------------------------------------*/
GetSchemeNames() const704 uno::Sequence< ::rtl::OUString >  EditableExtendedColorConfig::GetSchemeNames() const
705 {
706     return m_pImpl->GetSchemeNames();
707 }
708 /*-- 25.03.2002 12:03:16---------------------------------------------------
709 
710   -----------------------------------------------------------------------*/
DeleteScheme(const::rtl::OUString & rScheme)711 void EditableExtendedColorConfig::DeleteScheme(const ::rtl::OUString& rScheme )
712 {
713     m_pImpl->RemoveScheme(rScheme);
714 }
715 /*-- 25.03.2002 12:03:16---------------------------------------------------
716 
717   -----------------------------------------------------------------------*/
AddScheme(const::rtl::OUString & rScheme)718 void EditableExtendedColorConfig::AddScheme(const ::rtl::OUString& rScheme )
719 {
720     m_pImpl->AddScheme(rScheme);
721 }
722 /*-- 25.03.2002 12:03:16---------------------------------------------------
723 
724   -----------------------------------------------------------------------*/
LoadScheme(const::rtl::OUString & rScheme)725 sal_Bool EditableExtendedColorConfig::LoadScheme(const ::rtl::OUString& rScheme )
726 {
727     if(m_bModified)
728         m_pImpl->SetModified();
729     if(m_pImpl->IsModified())
730         m_pImpl->Commit();
731     m_bModified = sal_False;
732     m_pImpl->Load(rScheme);
733     //the name of the loaded scheme has to be committed separately
734     m_pImpl->CommitCurrentSchemeName();
735     return sal_True;
736 }
737 /*-- 25.03.2002 12:03:16---------------------------------------------------
738 
739   -----------------------------------------------------------------------*/
GetCurrentSchemeName() const740 const ::rtl::OUString& EditableExtendedColorConfig::GetCurrentSchemeName()const
741 {
742     return m_pImpl->GetLoadedScheme();
743 }
744 /* -----------------11.12.2002 10:56-----------------
745  *  changes the name of the current scheme but doesn't load it!
746  * --------------------------------------------------*/
SetCurrentSchemeName(const::rtl::OUString & rScheme)747 void EditableExtendedColorConfig::SetCurrentSchemeName(const ::rtl::OUString& rScheme)
748 {
749     m_pImpl->SetCurrentSchemeName(rScheme);
750     m_pImpl->CommitCurrentSchemeName();
751 }
752 /*-- 25.03.2002 12:03:17---------------------------------------------------
753 
754   -----------------------------------------------------------------------*/
GetColorValue(const::rtl::OUString & _sComponentName,const::rtl::OUString & _sName) const755 ExtendedColorConfigValue EditableExtendedColorConfig::GetColorValue(const ::rtl::OUString& _sComponentName,
756     const ::rtl::OUString& _sName)const
757 {
758     return m_pImpl->GetColorConfigValue(_sComponentName,_sName);
759 }
760 /*-- 25.03.2002 12:03:17---------------------------------------------------
761 
762   -----------------------------------------------------------------------*/
SetColorValue(const::rtl::OUString & _sName,const ExtendedColorConfigValue & rValue)763 void EditableExtendedColorConfig::SetColorValue(
764     const ::rtl::OUString& _sName, const ExtendedColorConfigValue& rValue)
765 {
766     m_pImpl->SetColorConfigValue(_sName, rValue);
767     m_pImpl->ClearModified();
768     m_bModified = sal_True;
769 }
770 /* -----------------------------10.04.2002 13:22------------------------------
771 
772  ---------------------------------------------------------------------------*/
SetModified()773 void EditableExtendedColorConfig::SetModified()
774 {
775     m_bModified = sal_True;
776 }
777 /* -----------------15.10.2002 14:51-----------------
778  *
779  * --------------------------------------------------*/
Commit()780 void EditableExtendedColorConfig::Commit()
781 {
782     if(m_bModified)
783         m_pImpl->SetModified();
784     if(m_pImpl->IsModified())
785         m_pImpl->Commit();
786     m_bModified = sal_False;
787 }
788 // -----------------------------------------------------------------------------
DisableBroadcast()789 void EditableExtendedColorConfig::DisableBroadcast()
790 {
791     m_pImpl->DisableBroadcast();
792 }
793 // -----------------------------------------------------------------------------
EnableBroadcast()794 void EditableExtendedColorConfig::EnableBroadcast()
795 {
796     m_pImpl->EnableBroadcast();
797 }
798 // -----------------------------------------------------------------------------
GetComponentCount() const799 sal_Int32 EditableExtendedColorConfig::GetComponentCount() const
800 {
801     return m_pImpl->GetComponentCount();
802 }
803 // -----------------------------------------------------------------------------
GetComponentColorCount(const::rtl::OUString & _sName) const804 sal_Int32 EditableExtendedColorConfig::GetComponentColorCount(const ::rtl::OUString& _sName) const
805 {
806     return m_pImpl->GetComponentColorCount(_sName);
807 }
808 // -----------------------------------------------------------------------------
GetComponentColorConfigValue(const::rtl::OUString & _sName,sal_uInt32 _nPos) const809 ExtendedColorConfigValue EditableExtendedColorConfig::GetComponentColorConfigValue(const ::rtl::OUString& _sName,sal_uInt32 _nPos) const
810 {
811     return m_pImpl->GetComponentColorConfigValue(_sName,_nPos);
812 }
813 // -----------------------------------------------------------------------------
GetComponentName(sal_uInt32 _nPos) const814 ::rtl::OUString EditableExtendedColorConfig::GetComponentName(sal_uInt32 _nPos) const
815 {
816     return m_pImpl->GetComponentName(_nPos);
817 }
818 // -----------------------------------------------------------------------------
GetComponentDisplayName(const::rtl::OUString & _sComponentName) const819 ::rtl::OUString EditableExtendedColorConfig::GetComponentDisplayName(const ::rtl::OUString& _sComponentName) const
820 {
821     return m_pImpl->GetComponentDisplayName(_sComponentName);
822 }
823 }//namespace svtools
824