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