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