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 :
21 : #include <svtools/colorcfg.hxx>
22 : #include <com/sun/star/uno/Any.hxx>
23 : #include <com/sun/star/uno/Sequence.hxx>
24 : #include <com/sun/star/lang/Locale.hpp>
25 : #include <com/sun/star/beans/PropertyValue.hpp>
26 : #include <comphelper/processfactory.hxx>
27 : #include <unotools/configitem.hxx>
28 : #include <unotools/confignode.hxx>
29 : #include <unotools/configpaths.hxx>
30 : #include <com/sun/star/uno/Sequence.h>
31 : #include <svl/poolitem.hxx>
32 : #include <svl/smplhint.hxx>
33 : #include <osl/mutex.hxx>
34 :
35 : #include "itemholder2.hxx"
36 :
37 : /* #100822# ----
38 : #include <vcl/wrkwin.hxx>
39 : ------------- */
40 : #include <vcl/svapp.hxx>
41 : #include <vcl/event.hxx>
42 : #include <vcl/settings.hxx>
43 : #include <rtl/instance.hxx>
44 :
45 :
46 : using namespace utl;
47 : using namespace com::sun::star;
48 :
49 :
50 : namespace svtools
51 : {
52 :
53 : static const sal_Char cColor[] = "/Color";
54 : static const sal_Char cColorSchemes[] = "ColorSchemes/";
55 : sal_Int32 nColorRefCount_Impl = 0;
56 : namespace
57 : {
58 : struct ColorMutex_Impl
59 : : public rtl::Static< ::osl::Mutex, ColorMutex_Impl > {};
60 : }
61 :
62 : ColorConfig_Impl* ColorConfig::m_pImpl = NULL;
63 :
64 : class ColorConfig_Impl : public utl::ConfigItem
65 : {
66 : ColorConfigValue m_aConfigValues[ColorConfigEntryCount];
67 : bool m_bEditMode;
68 : OUString m_sIsVisible;
69 : OUString m_sLoadedScheme;
70 : bool m_bAutoDetectSystemHC;
71 :
72 : uno::Sequence< OUString> GetPropertyNames(const OUString& rScheme);
73 :
74 : virtual void ImplCommit() SAL_OVERRIDE;
75 :
76 : public:
77 : explicit ColorConfig_Impl(bool bEditMode = false);
78 : virtual ~ColorConfig_Impl();
79 :
80 : void Load(const OUString& rScheme);
81 : void CommitCurrentSchemeName();
82 : //changes the name of the current scheme but doesn't load it!
83 0 : void SetCurrentSchemeName(const OUString& rSchemeName) {m_sLoadedScheme = rSchemeName;}
84 : virtual void Notify( const uno::Sequence<OUString>& aPropertyNames) SAL_OVERRIDE;
85 :
86 133383 : const ColorConfigValue& GetColorConfigValue(ColorConfigEntry eValue)
87 133383 : {return m_aConfigValues[eValue];}
88 : void SetColorConfigValue(ColorConfigEntry eValue,
89 : const ColorConfigValue& rValue );
90 :
91 0 : const OUString& GetLoadedScheme() const {return m_sLoadedScheme;}
92 :
93 : uno::Sequence< OUString> GetSchemeNames();
94 :
95 : bool AddScheme(const OUString& rNode);
96 : bool RemoveScheme(const OUString& rNode);
97 24 : void SetModified(){ConfigItem::SetModified();}
98 12 : void ClearModified(){ConfigItem::ClearModified();}
99 : void SettingsChanged();
100 130595 : bool GetAutoDetectSystemHC() {return m_bAutoDetectSystemHC;}
101 :
102 : // #100822#
103 : DECL_LINK( DataChangedEventListener, VclWindowEvent* );
104 :
105 : void ImplUpdateApplicationSettings();
106 : };
107 :
108 170 : uno::Sequence< OUString> ColorConfig_Impl::GetPropertyNames(const OUString& rScheme)
109 : {
110 170 : uno::Sequence<OUString> aNames(2 * ColorConfigEntryCount);
111 170 : OUString* pNames = aNames.getArray();
112 : struct ColorConfigEntryData_Impl
113 : {
114 : const sal_Char* cName;
115 : sal_Int32 nLength;
116 : rtl_TextEncoding eEncoding;
117 : bool bCanBeVisible;
118 : };
119 : static const ColorConfigEntryData_Impl cNames[] =
120 : {
121 : { RTL_CONSTASCII_USTRINGPARAM("/DocColor") ,false },
122 : { RTL_CONSTASCII_USTRINGPARAM("/DocBoundaries") ,true },
123 : { RTL_CONSTASCII_USTRINGPARAM("/AppBackground") ,false },
124 : { RTL_CONSTASCII_USTRINGPARAM("/ObjectBoundaries"),true },
125 : { RTL_CONSTASCII_USTRINGPARAM("/TableBoundaries") ,true },
126 : { RTL_CONSTASCII_USTRINGPARAM("/FontColor") ,false },
127 : { RTL_CONSTASCII_USTRINGPARAM("/Links") ,true },
128 : { RTL_CONSTASCII_USTRINGPARAM("/LinksVisited") ,true },
129 : { RTL_CONSTASCII_USTRINGPARAM("/Spell") ,false },
130 : { RTL_CONSTASCII_USTRINGPARAM("/SmartTags") ,false },
131 : { RTL_CONSTASCII_USTRINGPARAM("/Shadow") , true },
132 : { RTL_CONSTASCII_USTRINGPARAM("/WriterTextGrid") ,false },
133 : { RTL_CONSTASCII_USTRINGPARAM("/WriterFieldShadings"),true },
134 : { RTL_CONSTASCII_USTRINGPARAM("/WriterIdxShadings") ,true },
135 : { RTL_CONSTASCII_USTRINGPARAM("/WriterDirectCursor") ,true },
136 : { RTL_CONSTASCII_USTRINGPARAM("/WriterScriptIndicator") ,false },
137 : { RTL_CONSTASCII_USTRINGPARAM("/WriterSectionBoundaries") ,true },
138 : { RTL_CONSTASCII_USTRINGPARAM("/WriterHeaderFooterMark") ,false },
139 : { RTL_CONSTASCII_USTRINGPARAM("/WriterPageBreaks") ,false },
140 : { RTL_CONSTASCII_USTRINGPARAM("/HTMLSGML") ,false },
141 : { RTL_CONSTASCII_USTRINGPARAM("/HTMLComment") ,false },
142 : { RTL_CONSTASCII_USTRINGPARAM("/HTMLKeyword") ,false },
143 : { RTL_CONSTASCII_USTRINGPARAM("/HTMLUnknown") ,false },
144 : { RTL_CONSTASCII_USTRINGPARAM("/CalcGrid") ,false },
145 : { RTL_CONSTASCII_USTRINGPARAM("/CalcPageBreak"), false },
146 : { RTL_CONSTASCII_USTRINGPARAM("/CalcPageBreakManual"), false },
147 : { RTL_CONSTASCII_USTRINGPARAM("/CalcPageBreakAutomatic"), false },
148 : { RTL_CONSTASCII_USTRINGPARAM("/CalcDetective") ,false },
149 : { RTL_CONSTASCII_USTRINGPARAM("/CalcDetectiveError") ,false },
150 : { RTL_CONSTASCII_USTRINGPARAM("/CalcReference") ,false },
151 : { RTL_CONSTASCII_USTRINGPARAM("/CalcNotesBackground") ,false },
152 : { RTL_CONSTASCII_USTRINGPARAM("/DrawGrid") ,true },
153 : { RTL_CONSTASCII_USTRINGPARAM("/BASICIdentifier"), false },
154 : { RTL_CONSTASCII_USTRINGPARAM("/BASICComment") , false },
155 : { RTL_CONSTASCII_USTRINGPARAM("/BASICNumber") , false },
156 : { RTL_CONSTASCII_USTRINGPARAM("/BASICString") , false },
157 : { RTL_CONSTASCII_USTRINGPARAM("/BASICOperator") , false },
158 : { RTL_CONSTASCII_USTRINGPARAM("/BASICKeyword") , false },
159 : { RTL_CONSTASCII_USTRINGPARAM("/BASICError"), false },
160 : { RTL_CONSTASCII_USTRINGPARAM("/SQLIdentifier"), false },
161 : { RTL_CONSTASCII_USTRINGPARAM("/SQLNumber"), false },
162 : { RTL_CONSTASCII_USTRINGPARAM("/SQLString"), false },
163 : { RTL_CONSTASCII_USTRINGPARAM("/SQLOperator"), false },
164 : { RTL_CONSTASCII_USTRINGPARAM("/SQLKeyword"), false },
165 : { RTL_CONSTASCII_USTRINGPARAM("/SQLParameter"), false },
166 : { RTL_CONSTASCII_USTRINGPARAM("/SQLComment"), false }
167 : };
168 170 : int nIndex = 0;
169 340 : OUString sColor = cColor;
170 340 : OUString sBase(cColorSchemes);
171 170 : sBase += utl::wrapConfigurationElementName(rScheme);
172 170 : const int nCount = ColorConfigEntryCount;
173 7990 : for(sal_Int32 i = 0; i < 4 * nCount; i+= 4)
174 : {
175 7820 : OUString sBaseName(sBase);
176 7820 : sal_Int32 nPos = i / 4;
177 7820 : sBaseName += OUString(cNames[nPos].cName, cNames[nPos].nLength, cNames[nPos].eEncoding);
178 7820 : pNames[nIndex] += sBaseName;
179 7820 : pNames[nIndex++] += sColor;
180 7820 : if(cNames[nPos].bCanBeVisible)
181 : {
182 1870 : pNames[nIndex] += sBaseName;
183 1870 : pNames[nIndex++] += m_sIsVisible;
184 : }
185 7820 : }
186 170 : aNames.realloc(nIndex);
187 340 : return aNames;
188 : }
189 :
190 134 : ColorConfig_Impl::ColorConfig_Impl(bool bEditMode) :
191 : ConfigItem("Office.UI/ColorScheme"),
192 : m_bEditMode(bEditMode),
193 : m_sIsVisible("/IsVisible"),
194 134 : m_bAutoDetectSystemHC(true)
195 : {
196 134 : if(!m_bEditMode)
197 : {
198 : //try to register on the root node - if possible
199 134 : uno::Sequence < OUString > aNames(1);
200 134 : EnableNotification( aNames );
201 : }
202 134 : Load(OUString());
203 :
204 134 : ImplUpdateApplicationSettings();
205 :
206 : // #100822#
207 134 : ::Application::AddEventListener( LINK(this, ColorConfig_Impl, DataChangedEventListener) );
208 :
209 134 : }
210 :
211 204 : ColorConfig_Impl::~ColorConfig_Impl()
212 : {
213 : // #100822#
214 68 : ::Application::RemoveEventListener( LINK(this, ColorConfig_Impl, DataChangedEventListener) );
215 136 : }
216 :
217 158 : void ColorConfig_Impl::Load(const OUString& rScheme)
218 : {
219 158 : OUString sScheme(rScheme);
220 158 : if(sScheme.isEmpty())
221 : {
222 : //detect current scheme name
223 158 : uno::Sequence < OUString > aCurrent(1);
224 158 : aCurrent.getArray()[0] = "CurrentColorScheme";
225 316 : uno::Sequence< uno::Any > aCurrentVal = GetProperties( aCurrent );
226 316 : aCurrentVal.getConstArray()[0] >>= sScheme;
227 : }
228 158 : m_sLoadedScheme = sScheme;
229 :
230 316 : uno::Sequence < OUString > aColorNames = GetPropertyNames(sScheme);
231 316 : uno::Sequence< uno::Any > aColors = GetProperties( aColorNames );
232 158 : const uno::Any* pColors = aColors.getConstArray();
233 158 : const OUString* pColorNames = aColorNames.getConstArray();
234 158 : sal_Int32 nIndex = 0;
235 7268 : for(int i = 0; i < 2 * ColorConfigEntryCount && aColors.getLength() > nIndex; i+= 2)
236 : {
237 7268 : if(pColors[nIndex].hasValue())
238 0 : pColors[nIndex] >>= m_aConfigValues[i / 2].nColor;
239 : else
240 7268 : m_aConfigValues[i/2].nColor = COL_AUTO;
241 7268 : nIndex++;
242 7268 : if(nIndex >= aColors.getLength())
243 158 : break;
244 : //test for visibility property
245 7110 : if(pColorNames[nIndex].endsWith(m_sIsVisible))
246 1738 : m_aConfigValues[i / 2].bIsVisible = Any2Bool(pColors[nIndex++]);
247 : }
248 : // fdo#71511: check if we are running in a11y autodetect
249 : {
250 158 : utl::OConfigurationNode aNode = utl::OConfigurationTreeRoot::tryCreateWithComponentContext(comphelper::getProcessComponentContext(),OUString("org.openoffice.Office.Common/Accessibility") );
251 158 : if(aNode.isValid())
252 : {
253 158 : uno::Any aValue = aNode.getNodeValue(OUString("AutoDetectSystemHC"));
254 158 : aValue >>= m_bAutoDetectSystemHC;
255 158 : }
256 158 : }
257 158 : }
258 :
259 24 : void ColorConfig_Impl::Notify( const uno::Sequence<OUString>& )
260 : {
261 : //loading via notification always uses the default setting
262 24 : Load(OUString());
263 24 : NotifyListeners(0);
264 24 : }
265 :
266 12 : void ColorConfig_Impl::ImplCommit()
267 : {
268 12 : uno::Sequence < OUString > aColorNames = GetPropertyNames(m_sLoadedScheme);
269 24 : uno::Sequence < beans::PropertyValue > aPropValues(aColorNames.getLength());
270 12 : beans::PropertyValue* pPropValues = aPropValues.getArray();
271 12 : const OUString* pColorNames = aColorNames.getConstArray();
272 12 : sal_Int32 nIndex = 0;
273 12 : const uno::Type& rBoolType = cppu::UnoType<bool>::get();
274 552 : for(int i = 0; i < 2 * ColorConfigEntryCount && aColorNames.getLength() > nIndex; i+= 2)
275 : {
276 552 : pPropValues[nIndex].Name = pColorNames[nIndex];
277 : //save automatic colors as void value
278 552 : if(COL_AUTO != sal::static_int_cast<ColorData>(m_aConfigValues[i/2].nColor))
279 0 : pPropValues[nIndex].Value <<= m_aConfigValues[i/2].nColor;
280 :
281 552 : nIndex++;
282 552 : if(nIndex >= aColorNames.getLength())
283 12 : break;
284 : //test for visibility property
285 540 : if(pColorNames[nIndex].endsWith(m_sIsVisible))
286 : {
287 132 : pPropValues[nIndex].Name = pColorNames[nIndex];
288 132 : pPropValues[nIndex].Value.setValue(&m_aConfigValues[i/2].bIsVisible, rBoolType);
289 132 : nIndex++;
290 : }
291 : }
292 24 : OUString sNode("ColorSchemes");
293 12 : SetSetProperties(sNode, aPropValues);
294 :
295 24 : CommitCurrentSchemeName();
296 12 : }
297 :
298 12 : void ColorConfig_Impl::CommitCurrentSchemeName()
299 : {
300 : //save current scheme name
301 12 : uno::Sequence < OUString > aCurrent(1);
302 12 : aCurrent.getArray()[0] = "CurrentColorScheme";
303 24 : uno::Sequence< uno::Any > aCurrentVal(1);
304 12 : aCurrentVal.getArray()[0] <<= m_sLoadedScheme;
305 24 : PutProperties(aCurrent, aCurrentVal);
306 12 : }
307 :
308 12 : void ColorConfig_Impl::SetColorConfigValue(ColorConfigEntry eValue, const ColorConfigValue& rValue )
309 : {
310 12 : if(rValue != m_aConfigValues[eValue])
311 : {
312 12 : m_aConfigValues[eValue] = rValue;
313 12 : SetModified();
314 : }
315 12 : }
316 :
317 0 : uno::Sequence< OUString> ColorConfig_Impl::GetSchemeNames()
318 : {
319 0 : return GetNodeNames("ColorSchemes");
320 : }
321 :
322 0 : bool ColorConfig_Impl::AddScheme(const OUString& rScheme)
323 : {
324 0 : if(ConfigItem::AddNode("ColorSchemes", rScheme))
325 : {
326 0 : m_sLoadedScheme = rScheme;
327 0 : Commit();
328 0 : return true;
329 : }
330 0 : return false;
331 : }
332 :
333 0 : bool ColorConfig_Impl::RemoveScheme(const OUString& rScheme)
334 : {
335 0 : uno::Sequence< OUString > aElements(1);
336 0 : aElements.getArray()[0] = rScheme;
337 0 : return ClearNodeElements("ColorSchemes", aElements);
338 : }
339 :
340 69 : void ColorConfig_Impl::SettingsChanged()
341 : {
342 69 : SolarMutexGuard aVclGuard;
343 :
344 69 : ImplUpdateApplicationSettings();
345 :
346 69 : NotifyListeners(0);
347 69 : }
348 :
349 6104482 : IMPL_LINK( ColorConfig_Impl, DataChangedEventListener, VclWindowEvent*, pEvent )
350 : {
351 3052241 : if ( pEvent->GetId() == VCLEVENT_APPLICATION_DATACHANGED )
352 : {
353 75 : DataChangedEvent* pData = static_cast<DataChangedEvent*>(pEvent->GetData());
354 300 : if ( (pData->GetType() == DataChangedEventType::SETTINGS) &&
355 300 : (pData->GetFlags() & AllSettingsFlags::STYLE) )
356 : {
357 69 : SettingsChanged();
358 69 : return 1L;
359 : } else
360 6 : return 0L;
361 : } else
362 3052166 : return 0L;
363 : }
364 :
365 :
366 :
367 : /** updates the font color in the vcl window settings */
368 203 : void ColorConfig_Impl::ImplUpdateApplicationSettings()
369 : {
370 203 : Application* pApp = GetpApp();
371 203 : if( pApp )
372 : {
373 203 : AllSettings aSettings = Application::GetSettings();
374 406 : StyleSettings aStyleSettings( aSettings.GetStyleSettings() );
375 :
376 203 : ColorConfigValue aRet = GetColorConfigValue(svtools::FONTCOLOR);
377 203 : if(COL_AUTO == sal::static_int_cast<ColorData>(aRet.nColor))
378 203 : aRet.nColor = ColorConfig::GetDefaultColor(svtools::FONTCOLOR).GetColor();
379 :
380 203 : Color aFontColor(aRet.nColor);
381 :
382 203 : if( aStyleSettings.GetFontColor() != aFontColor )
383 : {
384 0 : aStyleSettings.SetFontColor( aFontColor );
385 :
386 0 : aSettings.SetStyleSettings( aStyleSettings );
387 0 : Application::SetSettings( aSettings );
388 203 : }
389 : }
390 203 : }
391 :
392 :
393 :
394 39232 : ColorConfig::ColorConfig()
395 : {
396 39232 : ::osl::MutexGuard aGuard( ColorMutex_Impl::get() );
397 39232 : if ( !m_pImpl )
398 : {
399 122 : m_pImpl = new ColorConfig_Impl;
400 122 : svtools::ItemHolder2::holdConfigItem(E_COLORCFG);
401 : }
402 39232 : ++nColorRefCount_Impl;
403 39232 : m_pImpl->AddListener(this);
404 39232 : }
405 :
406 79085 : ColorConfig::~ColorConfig()
407 : {
408 39063 : ::osl::MutexGuard aGuard( ColorMutex_Impl::get() );
409 39063 : m_pImpl->RemoveListener(this);
410 39063 : if(!--nColorRefCount_Impl)
411 : {
412 56 : delete m_pImpl;
413 56 : m_pImpl = 0;
414 39063 : }
415 40022 : }
416 :
417 130719 : Color ColorConfig::GetDefaultColor(ColorConfigEntry eEntry)
418 : {
419 : static const sal_Int32 aAutoColors[] =
420 : {
421 : COL_WHITE, // DOCCOLOR
422 : 0xc0c0c0, // DOCBOUNDARIES
423 : 0xDFDFDE, // APPBACKGROUND
424 : COL_LIGHTGRAY, // OBJECTBOUNDARIES
425 : COL_LIGHTGRAY, // TABLEBOUNDARIES
426 : COL_BLACK, // FONTCOLOR
427 : COL_BLUE, // LINKS
428 : 0x0000cc, // LINKSVISITED
429 : COL_LIGHTRED, // SPELL
430 : COL_LIGHTMAGENTA,// SMARTTAGS
431 : COL_GRAY, // SHADOWCOLOR
432 : COL_LIGHTGRAY, // WRITERTEXTGRID
433 : COL_LIGHTGRAY, // WRITERFIELDSHADIN
434 : COL_LIGHTGRAY, // WRITERIDXSHADINGS
435 : 0, // WRITERDIRECTCURSOR
436 : COL_GREEN, //WRITERSCRIPTINDICATOR
437 : COL_LIGHTGRAY, //WRITERSECTIONBOUNDARIES
438 : 0x0369a3, //WRITERHEADERFOOTERMARK,
439 : COL_BLUE, //WRITERPAGEBREAKS,
440 : COL_LIGHTBLUE, // HTMLSGML
441 : COL_LIGHTGREEN, // HTMLCOMMENT
442 : COL_LIGHTRED, // HTMLKEYWORD
443 : COL_GRAY, // HTMLUNKNOWN
444 : COL_LIGHTGRAY, // CALCGRID
445 : COL_BLUE, //CALCPAGEBREAK
446 : 0x2300dc, //CALCPAGEBREAKMANUAL
447 : COL_GRAY, //CALCPAGEBREAKAUTOMATIC
448 : COL_LIGHTBLUE, // CALCDETECTIVE
449 : COL_LIGHTRED, // CALCDETECTIVEERROR
450 : 0xef0fff, // CALCREFERENCE
451 : 0xffffc0, // CALCNOTESBACKGROUND
452 : COL_LIGHTGRAY, // DRAWGRID
453 : COL_GREEN, // BASICIDENTIFIER,
454 : COL_GRAY,// BASICCOMMENT ,
455 : COL_LIGHTRED,// BASICNUMBER ,
456 : COL_LIGHTRED,// BASICSTRING ,
457 : COL_BLUE, // BASICOPERATOR ,
458 : COL_BLUE, // BASICKEYWORD ,
459 : COL_RED, //BASICERROR
460 : 0x009900, // SQLIDENTIFIER
461 : 0x000000, // SQLNUMBER
462 : 0xCE7B00, // SQLSTRING
463 : 0x000000, // SQLOPERATOR
464 : 0x0000E6, // SQLKEYWORD
465 : 0x259D9D, // SQLPARAMTER
466 : 0x969696,// SQLCOMMENT
467 : };
468 130719 : Color aRet;
469 130719 : switch(eEntry)
470 : {
471 : case APPBACKGROUND :
472 20933 : aRet = Application::GetSettings().GetStyleSettings().GetWorkspaceColor();
473 20933 : break;
474 :
475 : case LINKS :
476 155 : aRet = Application::GetSettings().GetStyleSettings().GetLinkColor();
477 155 : break;
478 :
479 : case LINKSVISITED :
480 112 : aRet = Application::GetSettings().GetStyleSettings().GetVisitedLinkColor();
481 112 : break;
482 :
483 : default:
484 109519 : aRet = aAutoColors[eEntry];
485 : }
486 : // fdo#71511: if in autodetected a11y HC mode, do pull background color from theme
487 130719 : if(m_pImpl && m_pImpl->GetAutoDetectSystemHC())
488 : {
489 0 : switch(eEntry)
490 : {
491 : case DOCCOLOR :
492 0 : aRet = Application::GetSettings().GetStyleSettings().GetWindowColor();
493 0 : break;
494 : case FONTCOLOR :
495 0 : aRet = Application::GetSettings().GetStyleSettings().GetWindowTextColor();
496 0 : break;
497 : default:
498 0 : break;
499 : }
500 : }
501 130719 : return aRet;
502 : }
503 :
504 133168 : ColorConfigValue ColorConfig::GetColorValue(ColorConfigEntry eEntry, bool bSmart) const
505 : {
506 133168 : ColorConfigValue aRet = m_pImpl->GetColorConfigValue(eEntry);
507 133168 : if(bSmart)
508 : {
509 130204 : if(COL_AUTO == sal::static_int_cast<ColorData>(aRet.nColor))
510 130204 : aRet.nColor = ColorConfig::GetDefaultColor(eEntry).GetColor();
511 : }
512 :
513 133168 : return aRet;
514 : }
515 :
516 0 : void ColorConfig::Reload()
517 : {
518 0 : m_pImpl->Load(OUString());
519 0 : }
520 :
521 12 : EditableColorConfig::EditableColorConfig() :
522 12 : m_pImpl(new ColorConfig_Impl),
523 24 : m_bModified(false)
524 : {
525 12 : m_pImpl->BlockBroadcasts(true);
526 12 : }
527 :
528 12 : EditableColorConfig::~EditableColorConfig()
529 : {
530 12 : m_pImpl->BlockBroadcasts(false);
531 12 : if(m_bModified)
532 12 : m_pImpl->SetModified();
533 12 : if(m_pImpl->IsModified())
534 12 : m_pImpl->Commit();
535 12 : delete m_pImpl;
536 12 : }
537 :
538 0 : uno::Sequence< OUString > EditableColorConfig::GetSchemeNames() const
539 : {
540 0 : return m_pImpl->GetSchemeNames();
541 : }
542 :
543 0 : void EditableColorConfig::DeleteScheme(const OUString& rScheme )
544 : {
545 0 : m_pImpl->RemoveScheme(rScheme);
546 0 : }
547 :
548 0 : void EditableColorConfig::AddScheme(const OUString& rScheme )
549 : {
550 0 : m_pImpl->AddScheme(rScheme);
551 0 : }
552 :
553 0 : bool EditableColorConfig::LoadScheme(const OUString& rScheme )
554 : {
555 0 : if(m_bModified)
556 0 : m_pImpl->SetModified();
557 0 : if(m_pImpl->IsModified())
558 0 : m_pImpl->Commit();
559 0 : m_bModified = false;
560 0 : m_pImpl->Load(rScheme);
561 : //the name of the loaded scheme has to be committed separately
562 0 : m_pImpl->CommitCurrentSchemeName();
563 0 : return true;
564 : }
565 :
566 0 : const OUString& EditableColorConfig::GetCurrentSchemeName()const
567 : {
568 0 : return m_pImpl->GetLoadedScheme();
569 : }
570 :
571 : // Changes the name of the current scheme but doesn't load it!
572 0 : void EditableColorConfig::SetCurrentSchemeName(const OUString& rScheme)
573 : {
574 0 : m_pImpl->SetCurrentSchemeName(rScheme);
575 0 : m_pImpl->CommitCurrentSchemeName();
576 0 : }
577 :
578 12 : const ColorConfigValue& EditableColorConfig::GetColorValue(
579 : ColorConfigEntry eEntry)const
580 : {
581 12 : return m_pImpl->GetColorConfigValue(eEntry);
582 : }
583 :
584 12 : void EditableColorConfig::SetColorValue(
585 : ColorConfigEntry eEntry, const ColorConfigValue& rValue)
586 : {
587 12 : m_pImpl->SetColorConfigValue(eEntry, rValue);
588 12 : m_pImpl->ClearModified();
589 12 : m_bModified = true;
590 12 : }
591 :
592 0 : void EditableColorConfig::SetModified()
593 : {
594 0 : m_bModified = true;
595 0 : }
596 :
597 0 : void EditableColorConfig::Commit()
598 : {
599 0 : if(m_bModified)
600 0 : m_pImpl->SetModified();
601 0 : if(m_pImpl->IsModified())
602 0 : m_pImpl->Commit();
603 0 : m_bModified = false;
604 0 : }
605 :
606 0 : void EditableColorConfig::DisableBroadcast()
607 : {
608 0 : m_pImpl->BlockBroadcasts(true);
609 0 : }
610 :
611 0 : void EditableColorConfig::EnableBroadcast()
612 : {
613 0 : m_pImpl->BlockBroadcasts(false);
614 0 : }
615 :
616 :
617 : }//namespace svtools
618 :
619 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|