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 : #include <sfx2/sidebar/Theme.hxx>
20 : #include "Paint.hxx"
21 : #include "SidebarResource.hxx"
22 : #include <sfx2/sidebar/Tools.hxx>
23 : #include <sfx2/app.hxx>
24 :
25 : #include <tools/svborder.hxx>
26 : #include <tools/rc.hxx>
27 : #include <vcl/svapp.hxx>
28 : #include <vcl/settings.hxx>
29 :
30 : using namespace css;
31 : using namespace css::uno;
32 :
33 : namespace sfx2 { namespace sidebar {
34 :
35 326713 : Theme& Theme::GetCurrentTheme()
36 : {
37 326713 : return SfxGetpApp()->GetSidebarTheme();
38 : }
39 :
40 97 : Theme::Theme()
41 : : ThemeInterfaceBase(m_aMutex),
42 : maImages(),
43 : maColors(),
44 : maPaints(),
45 : maIntegers(),
46 : maBooleans(),
47 97 : mbIsHighContrastMode(Application::GetSettings().GetStyleSettings().GetHighContrastMode()),
48 : mbIsHighContrastModeSetManually(false),
49 : maPropertyNameToIdMap(),
50 : maPropertyIdToNameMap(),
51 : maRawValues(),
52 : maChangeListeners(),
53 194 : maVetoableListeners()
54 :
55 : {
56 97 : SetupPropertyMaps();
57 97 : }
58 :
59 90 : Theme::~Theme()
60 : {
61 90 : }
62 :
63 28032 : Image Theme::GetImage (const ThemeItem eItem)
64 : {
65 28032 : const PropertyType eType (GetPropertyType(eItem));
66 : OSL_ASSERT(eType==PT_Image);
67 28032 : const sal_Int32 nIndex (GetIndex(eItem, eType));
68 28032 : const Theme& rTheme (GetCurrentTheme());
69 28032 : return rTheme.maImages[nIndex];
70 : }
71 :
72 7322 : Color Theme::GetColor (const ThemeItem eItem)
73 : {
74 7322 : const PropertyType eType (GetPropertyType(eItem));
75 : OSL_ASSERT(eType==PT_Color || eType==PT_Paint);
76 7322 : const sal_Int32 nIndex (GetIndex(eItem, eType));
77 7322 : const Theme& rTheme (GetCurrentTheme());
78 7322 : if (eType == PT_Color)
79 7312 : return rTheme.maColors[nIndex];
80 10 : else if (eType == PT_Paint)
81 10 : return rTheme.maPaints[nIndex].GetColor();
82 : else
83 0 : return COL_WHITE;
84 : }
85 :
86 33851 : const Paint& Theme::GetPaint (const ThemeItem eItem)
87 : {
88 33851 : const PropertyType eType (GetPropertyType(eItem));
89 : OSL_ASSERT(eType==PT_Paint);
90 33851 : const sal_Int32 nIndex (GetIndex(eItem, eType));
91 33851 : const Theme& rTheme (GetCurrentTheme());
92 33851 : return rTheme.maPaints[nIndex];
93 : }
94 :
95 7413 : const Wallpaper Theme::GetWallpaper (const ThemeItem eItem)
96 : {
97 7413 : return GetPaint(eItem).GetWallpaper();
98 : }
99 :
100 238832 : sal_Int32 Theme::GetInteger (const ThemeItem eItem)
101 : {
102 238832 : const PropertyType eType (GetPropertyType(eItem));
103 : OSL_ASSERT(eType==PT_Integer);
104 238832 : const sal_Int32 nIndex (GetIndex(eItem, eType));
105 238832 : const Theme& rTheme (GetCurrentTheme());
106 238832 : return rTheme.maIntegers[nIndex];
107 : }
108 :
109 251 : bool Theme::GetBoolean (const ThemeItem eItem)
110 : {
111 251 : const PropertyType eType (GetPropertyType(eItem));
112 : OSL_ASSERT(eType==PT_Boolean);
113 251 : const sal_Int32 nIndex (GetIndex(eItem, eType));
114 251 : const Theme& rTheme (GetCurrentTheme());
115 251 : return rTheme.maBooleans[nIndex];
116 : }
117 :
118 6788 : bool Theme::IsHighContrastMode()
119 : {
120 6788 : const Theme& rTheme (GetCurrentTheme());
121 6788 : return rTheme.mbIsHighContrastMode;
122 : }
123 :
124 100 : void Theme::HandleDataChange()
125 : {
126 100 : Theme& rTheme (GetCurrentTheme());
127 :
128 100 : if ( ! rTheme.mbIsHighContrastModeSetManually)
129 : {
130 : // Do not modify mbIsHighContrastMode when it was manually set.
131 100 : GetCurrentTheme().mbIsHighContrastMode = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
132 100 : rTheme.maRawValues[Bool_IsHighContrastModeActive] = Any(GetCurrentTheme().mbIsHighContrastMode);
133 : }
134 :
135 100 : GetCurrentTheme().UpdateTheme();
136 100 : }
137 :
138 97 : void Theme::InitializeTheme()
139 : {
140 : setPropertyValue(
141 97 : maPropertyIdToNameMap[Bool_UseSymphonyIcons],
142 194 : Any(false));
143 : setPropertyValue(
144 97 : maPropertyIdToNameMap[Bool_UseSystemColors],
145 194 : Any(false));
146 97 : }
147 :
148 100 : void Theme::UpdateTheme()
149 : {
150 100 : SidebarResource aLocalResource;
151 :
152 : try
153 : {
154 100 : const StyleSettings& rStyle (Application::GetSettings().GetStyleSettings());
155 100 : const bool bUseSystemColors (GetBoolean(Bool_UseSystemColors));
156 :
157 : #define Alternatives(n,hc,sys) (mbIsHighContrastMode ? hc : (bUseSystemColors ? sys : n))
158 :
159 100 : Color aBaseBackgroundColor (rStyle.GetDialogColor());
160 : // UX says this should be a little brighter, but that looks off when compared to the other windows.
161 : //aBaseBackgroundColor.IncreaseLuminance(7);
162 100 : Color aBorderColor (aBaseBackgroundColor);
163 100 : aBorderColor.DecreaseLuminance(15);
164 100 : Color aSecondColor (aBaseBackgroundColor);
165 100 : aSecondColor.DecreaseLuminance(15);
166 :
167 : setPropertyValue(
168 100 : maPropertyIdToNameMap[Paint_DeckBackground],
169 200 : Any(sal_Int32(aBaseBackgroundColor.GetRGBColor())));
170 :
171 : setPropertyValue(
172 100 : maPropertyIdToNameMap[Paint_DeckTitleBarBackground],
173 200 : Any(sal_Int32(aBaseBackgroundColor.GetRGBColor())));
174 : setPropertyValue(
175 100 : maPropertyIdToNameMap[Int_DeckLeftPadding],
176 200 : Any(sal_Int32(2)));
177 : setPropertyValue(
178 100 : maPropertyIdToNameMap[Int_DeckTopPadding],
179 200 : Any(sal_Int32(2)));
180 : setPropertyValue(
181 100 : maPropertyIdToNameMap[Int_DeckRightPadding],
182 200 : Any(sal_Int32(2)));
183 : setPropertyValue(
184 100 : maPropertyIdToNameMap[Int_DeckBottomPadding],
185 200 : Any(sal_Int32(2)));
186 : setPropertyValue(
187 100 : maPropertyIdToNameMap[Int_DeckBorderSize],
188 200 : Any(sal_Int32(1)));
189 : setPropertyValue(
190 100 : maPropertyIdToNameMap[Int_DeckSeparatorHeight],
191 200 : Any(sal_Int32(1)));
192 : setPropertyValue(
193 100 : maPropertyIdToNameMap[Int_ButtonCornerRadius],
194 200 : Any(sal_Int32(3)));
195 : setPropertyValue(
196 100 : maPropertyIdToNameMap[Color_DeckTitleFont],
197 200 : Any(sal_Int32(rStyle.GetFontColor().GetRGBColor())));
198 : setPropertyValue(
199 100 : maPropertyIdToNameMap[Int_DeckTitleBarHeight],
200 0 : Any(sal_Int32(Alternatives(
201 : 26,
202 : 26,
203 200 : rStyle.GetFloatTitleHeight()))));
204 : setPropertyValue(
205 100 : maPropertyIdToNameMap[Paint_PanelBackground],
206 200 : Any(sal_Int32(aBaseBackgroundColor.GetRGBColor())));
207 :
208 : setPropertyValue(
209 100 : maPropertyIdToNameMap[Paint_PanelTitleBarBackground],
210 : Any(Tools::VclToAwtGradient(Gradient(
211 : GradientStyle_LINEAR,
212 : aSecondColor.GetRGBColor(),
213 : aBaseBackgroundColor.GetRGBColor()
214 200 : ))));
215 : setPropertyValue(
216 100 : maPropertyIdToNameMap[Color_PanelTitleFont],
217 200 : Any(sal_Int32(mbIsHighContrastMode ? 0x00ff00 : 0x262626)));
218 : setPropertyValue(
219 100 : maPropertyIdToNameMap[Int_PanelTitleBarHeight],
220 0 : Any(sal_Int32(Alternatives(
221 : 26,
222 : 26,
223 200 : rStyle.GetTitleHeight()))));
224 : setPropertyValue(
225 100 : maPropertyIdToNameMap[Paint_TabBarBackground],
226 200 : Any(sal_Int32(aBaseBackgroundColor.GetRGBColor())));
227 : setPropertyValue(
228 100 : maPropertyIdToNameMap[Int_TabBarLeftPadding],
229 200 : Any(sal_Int32(2)));
230 : setPropertyValue(
231 100 : maPropertyIdToNameMap[Int_TabBarTopPadding],
232 200 : Any(sal_Int32(2)));
233 : setPropertyValue(
234 100 : maPropertyIdToNameMap[Int_TabBarRightPadding],
235 200 : Any(sal_Int32(2)));
236 : setPropertyValue(
237 100 : maPropertyIdToNameMap[Int_TabBarBottomPadding],
238 200 : Any(sal_Int32(2)));
239 :
240 : setPropertyValue(
241 100 : maPropertyIdToNameMap[Int_TabMenuPadding],
242 200 : Any(sal_Int32(6)));
243 : setPropertyValue(
244 100 : maPropertyIdToNameMap[Color_TabMenuSeparator],
245 200 : Any(sal_Int32(aBorderColor.GetRGBColor())));
246 : setPropertyValue(
247 100 : maPropertyIdToNameMap[Int_TabMenuSeparatorPadding],
248 200 : Any(sal_Int32(7)));
249 :
250 : setPropertyValue(
251 100 : maPropertyIdToNameMap[Int_TabItemWidth],
252 200 : Any(sal_Int32(32)));
253 : setPropertyValue(
254 100 : maPropertyIdToNameMap[Int_TabItemHeight],
255 200 : Any(sal_Int32(32)));
256 : setPropertyValue(
257 100 : maPropertyIdToNameMap[Color_TabItemBorder],
258 200 : Any(sal_Int32(rStyle.GetActiveBorderColor().GetRGBColor())));
259 : // mbIsHighContrastMode ? 0x00ff00 : 0xbfbfbf)));
260 :
261 : setPropertyValue(
262 100 : maPropertyIdToNameMap[Paint_DropDownBackground],
263 200 : Any(sal_Int32(aBaseBackgroundColor.GetRGBColor())));
264 : setPropertyValue(
265 100 : maPropertyIdToNameMap[Color_DropDownBorder],
266 200 : Any(sal_Int32(rStyle.GetActiveBorderColor().GetRGBColor())));
267 :
268 : setPropertyValue(
269 100 : maPropertyIdToNameMap[Color_Highlight],
270 200 : Any(sal_Int32(rStyle.GetHighlightColor().GetRGBColor())));
271 : setPropertyValue(
272 100 : maPropertyIdToNameMap[Color_HighlightText],
273 200 : Any(sal_Int32(rStyle.GetHighlightTextColor().GetRGBColor())));
274 :
275 : setPropertyValue(
276 100 : maPropertyIdToNameMap[Paint_TabItemBackgroundNormal],
277 200 : Any());
278 : setPropertyValue(
279 100 : maPropertyIdToNameMap[Paint_TabItemBackgroundHighlight],
280 200 : Any(sal_Int32(rStyle.GetActiveTabColor().GetRGBColor())));
281 : // mbIsHighContrastMode ? 0x000000 : 0x00ffffff)));
282 :
283 : setPropertyValue(
284 100 : maPropertyIdToNameMap[Paint_HorizontalBorder],
285 200 : Any(sal_Int32(aBorderColor.GetRGBColor())));
286 : // mbIsHighContrastMode ? 0x00ff00 : 0xe4e4e4)));
287 : setPropertyValue(
288 100 : maPropertyIdToNameMap[Paint_VerticalBorder],
289 200 : Any(sal_Int32(aBorderColor.GetRGBColor())));
290 : setPropertyValue(
291 100 : maPropertyIdToNameMap[Image_Grip],
292 200 : Any(OUString("private:graphicrepository/sfx2/res/grip.png")));
293 : setPropertyValue(
294 100 : maPropertyIdToNameMap[Image_Expand],
295 200 : Any(OUString("private:graphicrepository/res/plus.png")));
296 : setPropertyValue(
297 100 : maPropertyIdToNameMap[Image_Collapse],
298 200 : Any(OUString("private:graphicrepository/res/minus.png")));
299 : setPropertyValue(
300 100 : maPropertyIdToNameMap[Image_TabBarMenu],
301 200 : Any(OUString("private:graphicrepository/sfx2/res/symphony/open_more.png")));
302 : setPropertyValue(
303 100 : maPropertyIdToNameMap[Image_PanelMenu],
304 200 : Any(OUString("private:graphicrepository/sfx2/res/symphony/morebutton.png")));
305 : setPropertyValue(
306 100 : maPropertyIdToNameMap[Image_Closer],
307 200 : Any(OUString("private:graphicrepository/sfx2/res/closedoc.png")));
308 : setPropertyValue(
309 100 : maPropertyIdToNameMap[Image_CloseIndicator],
310 200 : Any(OUString("private:graphicrepository/cmd/lc_decrementlevel.png")));
311 : setPropertyValue(
312 100 : maPropertyIdToNameMap[Image_ToolBoxItemSeparator],
313 : Any(
314 200 : OUString("private:graphicrepository/sfx2/res/separator.png")));
315 :
316 : // ToolBox
317 :
318 : /*
319 : // Separator style
320 : setPropertyValue(
321 : maPropertyIdToNameMap[Paint_ToolBoxBackground],
322 : Any(sal_Int32(rStyle.GetMenuColor().GetRGBColor())));
323 : setPropertyValue(
324 : maPropertyIdToNameMap[Paint_ToolBoxBorderTopLeft],
325 : Any());
326 : setPropertyValue(
327 : maPropertyIdToNameMap[Paint_ToolBoxBorderCenterCorners],
328 : Any());
329 : setPropertyValue(
330 : maPropertyIdToNameMap[Paint_ToolBoxBorderBottomRight],
331 : Any());
332 : setPropertyValue(
333 : maPropertyIdToNameMap[Rect_ToolBoxPadding],
334 : Any(awt::Rectangle(2,2,2,2)));
335 : setPropertyValue(
336 : maPropertyIdToNameMap[Rect_ToolBoxBorder],
337 : Any(awt::Rectangle(0,0,0,0)));
338 : setPropertyValue(
339 : maPropertyIdToNameMap[Bool_UseToolBoxItemSeparator],
340 : Any(true));
341 :
342 : */
343 : // Gradient style
344 100 : Color aGradientStop2 (aBaseBackgroundColor);
345 100 : aGradientStop2.IncreaseLuminance(17);
346 100 : Color aToolBoxBorderColor (aBaseBackgroundColor);
347 100 : aToolBoxBorderColor.DecreaseLuminance(12);
348 : setPropertyValue(
349 100 : maPropertyIdToNameMap[Paint_ToolBoxBackground],
350 : Any(Tools::VclToAwtGradient(Gradient(
351 : GradientStyle_LINEAR,
352 : aBaseBackgroundColor.GetRGBColor(),
353 : aGradientStop2.GetRGBColor()
354 200 : ))));
355 : setPropertyValue(
356 100 : maPropertyIdToNameMap[Paint_ToolBoxBorderTopLeft],
357 : mbIsHighContrastMode
358 : ? Any(util::Color(sal_uInt32(0x00ff00)))
359 200 : : Any(util::Color(aToolBoxBorderColor.GetRGBColor())));
360 : setPropertyValue(
361 100 : maPropertyIdToNameMap[Paint_ToolBoxBorderCenterCorners],
362 : mbIsHighContrastMode
363 : ? Any(util::Color(sal_uInt32(0x00ff00)))
364 200 : : Any(util::Color(aToolBoxBorderColor.GetRGBColor())));
365 : setPropertyValue(
366 100 : maPropertyIdToNameMap[Paint_ToolBoxBorderBottomRight],
367 : mbIsHighContrastMode
368 : ? Any(util::Color(sal_uInt32(0x00ff00)))
369 200 : : Any(util::Color(aToolBoxBorderColor.GetRGBColor())));
370 : setPropertyValue(
371 100 : maPropertyIdToNameMap[Rect_ToolBoxPadding],
372 200 : Any(awt::Rectangle(2,2,2,2)));
373 : setPropertyValue(
374 100 : maPropertyIdToNameMap[Rect_ToolBoxBorder],
375 200 : Any(awt::Rectangle(1,1,1,1)));
376 : setPropertyValue(
377 100 : maPropertyIdToNameMap[Bool_UseToolBoxItemSeparator],
378 200 : Any(false));
379 : }
380 0 : catch(beans::UnknownPropertyException& rException)
381 : {
382 : OSL_TRACE("unknown property: %s",
383 : OUStringToOString(
384 : rException.Message,
385 : RTL_TEXTENCODING_ASCII_US).getStr());
386 : OSL_ASSERT(false);
387 100 : }
388 100 : }
389 :
390 45 : void SAL_CALL Theme::disposing()
391 : {
392 45 : ChangeListeners aListeners;
393 45 : aListeners.swap(maChangeListeners);
394 :
395 90 : const lang::EventObject aEvent (static_cast<XWeak*>(this));
396 :
397 45 : for (ChangeListeners::const_iterator
398 45 : iContainer(aListeners.begin()),
399 45 : iContainerEnd(aListeners.end());
400 : iContainer != iContainerEnd;
401 : ++iContainer)
402 : {
403 0 : for (ChangeListenerContainer::const_iterator
404 0 : iListener(iContainer->second.begin()),
405 0 : iEnd(iContainer->second.end());
406 : iListener!=iEnd;
407 : ++iListener)
408 : {
409 : try
410 : {
411 0 : (*iListener)->disposing(aEvent);
412 : }
413 0 : catch(const Exception&)
414 : {
415 : }
416 : }
417 45 : }
418 45 : }
419 :
420 11237 : Reference<beans::XPropertySet> Theme::GetPropertySet()
421 : {
422 11237 : return Reference<beans::XPropertySet>(static_cast<XWeak*>(&GetCurrentTheme()), UNO_QUERY);
423 : }
424 :
425 0 : Reference<beans::XPropertySetInfo> SAL_CALL Theme::getPropertySetInfo()
426 : throw(css::uno::RuntimeException, std::exception)
427 : {
428 0 : return Reference<beans::XPropertySetInfo>(this);
429 : }
430 :
431 5094 : void SAL_CALL Theme::setPropertyValue (
432 : const ::rtl::OUString& rsPropertyName,
433 : const css::uno::Any& rValue)
434 : throw (css::beans::UnknownPropertyException,
435 : css::uno::RuntimeException,
436 : std::exception)
437 : {
438 5094 : PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
439 5094 : if (iId == maPropertyNameToIdMap.end())
440 0 : throw beans::UnknownPropertyException(rsPropertyName);
441 :
442 5094 : const PropertyType eType (GetPropertyType(iId->second));
443 5094 : if (eType == PT_Invalid)
444 0 : throw beans::UnknownPropertyException(rsPropertyName);
445 :
446 5094 : const ThemeItem eItem (iId->second);
447 :
448 5094 : if (rValue == maRawValues[eItem])
449 : {
450 : // Value is not different from the one in the property
451 : // set => nothing to do.
452 488 : return;
453 : }
454 :
455 4850 : const Any aOldValue (maRawValues[eItem]);
456 :
457 : const beans::PropertyChangeEvent aEvent(
458 : static_cast<XWeak*>(this),
459 : rsPropertyName,
460 : sal_False,
461 : eItem,
462 : aOldValue,
463 9700 : rValue);
464 :
465 4850 : if (DoVetoableListenersVeto(GetVetoableListeners(__AnyItem, false), aEvent))
466 0 : return;
467 4850 : if (DoVetoableListenersVeto(GetVetoableListeners(eItem, false), aEvent))
468 0 : return;
469 :
470 4850 : maRawValues[eItem] = rValue;
471 4850 : ProcessNewValue(rValue, eItem, eType);
472 :
473 4850 : BroadcastPropertyChange(GetChangeListeners(__AnyItem, false), aEvent);
474 9700 : BroadcastPropertyChange(GetChangeListeners(eItem, false), aEvent);
475 : }
476 :
477 0 : Any SAL_CALL Theme::getPropertyValue (
478 : const ::rtl::OUString& rsPropertyName)
479 : throw(css::beans::UnknownPropertyException,
480 : css::lang::WrappedTargetException,
481 : css::uno::RuntimeException, std::exception)
482 : {
483 0 : PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
484 0 : if (iId == maPropertyNameToIdMap.end())
485 0 : throw beans::UnknownPropertyException();
486 :
487 0 : const PropertyType eType (GetPropertyType(iId->second));
488 0 : if (eType == PT_Invalid)
489 0 : throw beans::UnknownPropertyException();
490 :
491 0 : const ThemeItem eItem (iId->second);
492 :
493 0 : return maRawValues[eItem];
494 : }
495 :
496 3155 : void SAL_CALL Theme::addPropertyChangeListener(
497 : const ::rtl::OUString& rsPropertyName,
498 : const css::uno::Reference<css::beans::XPropertyChangeListener>& rxListener)
499 : throw(css::beans::UnknownPropertyException,
500 : css::lang::WrappedTargetException,
501 : css::uno::RuntimeException, std::exception)
502 : {
503 3155 : ThemeItem eItem (__AnyItem);
504 3155 : if (rsPropertyName.getLength() > 0)
505 : {
506 0 : PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
507 0 : if (iId == maPropertyNameToIdMap.end())
508 0 : throw beans::UnknownPropertyException();
509 :
510 0 : const PropertyType eType (GetPropertyType(iId->second));
511 0 : if (eType == PT_Invalid)
512 0 : throw beans::UnknownPropertyException();
513 :
514 0 : eItem = iId->second;
515 : }
516 3155 : ChangeListenerContainer* pListeners = GetChangeListeners(eItem, true);
517 3155 : if (pListeners != NULL)
518 3155 : pListeners->push_back(rxListener);
519 3155 : }
520 :
521 3155 : void SAL_CALL Theme::removePropertyChangeListener(
522 : const ::rtl::OUString& rsPropertyName,
523 : const css::uno::Reference<css::beans::XPropertyChangeListener>& rxListener)
524 : throw(css::beans::UnknownPropertyException,
525 : css::lang::WrappedTargetException,
526 : css::uno::RuntimeException, std::exception)
527 : {
528 3155 : ThemeItem eItem (__AnyItem);
529 3155 : if (rsPropertyName.getLength() > 0)
530 : {
531 0 : PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
532 0 : if (iId == maPropertyNameToIdMap.end())
533 0 : throw beans::UnknownPropertyException();
534 :
535 0 : const PropertyType eType (GetPropertyType(iId->second));
536 0 : if (eType == PT_Invalid)
537 0 : throw beans::UnknownPropertyException();
538 :
539 0 : eItem = iId->second;
540 : }
541 3155 : ChangeListenerContainer* pContainer = GetChangeListeners(eItem, false);
542 3155 : if (pContainer != NULL)
543 : {
544 3155 : ChangeListenerContainer::iterator iListener (::std::find(pContainer->begin(), pContainer->end(), rxListener));
545 3155 : if (iListener != pContainer->end())
546 : {
547 3155 : pContainer->erase(iListener);
548 :
549 : // Remove the listener container when empty.
550 3155 : if (pContainer->empty())
551 3044 : maChangeListeners.erase(eItem);
552 : }
553 : }
554 3155 : }
555 :
556 0 : void SAL_CALL Theme::addVetoableChangeListener(
557 : const ::rtl::OUString& rsPropertyName,
558 : const css::uno::Reference<css::beans::XVetoableChangeListener>& rxListener)
559 : throw(css::beans::UnknownPropertyException,
560 : css::lang::WrappedTargetException,
561 : css::uno::RuntimeException, std::exception)
562 : {
563 0 : ThemeItem eItem (__AnyItem);
564 0 : if (rsPropertyName.getLength() > 0)
565 : {
566 0 : PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
567 0 : if (iId == maPropertyNameToIdMap.end())
568 0 : throw beans::UnknownPropertyException();
569 :
570 0 : const PropertyType eType (GetPropertyType(iId->second));
571 0 : if (eType == PT_Invalid)
572 0 : throw beans::UnknownPropertyException();
573 :
574 0 : eItem = iId->second;
575 : }
576 0 : VetoableListenerContainer* pListeners = GetVetoableListeners(eItem, true);
577 0 : if (pListeners != NULL)
578 0 : pListeners->push_back(rxListener);
579 0 : }
580 :
581 0 : void SAL_CALL Theme::removeVetoableChangeListener(
582 : const ::rtl::OUString& rsPropertyName,
583 : const css::uno::Reference<css::beans::XVetoableChangeListener>& rxListener)
584 : throw(css::beans::UnknownPropertyException,
585 : css::lang::WrappedTargetException,
586 : css::uno::RuntimeException, std::exception)
587 : {
588 0 : ThemeItem eItem (__AnyItem);
589 0 : if (rsPropertyName.getLength() > 0)
590 : {
591 0 : PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
592 0 : if (iId == maPropertyNameToIdMap.end())
593 0 : throw beans::UnknownPropertyException();
594 :
595 0 : const PropertyType eType (GetPropertyType(iId->second));
596 0 : if (eType == PT_Invalid)
597 0 : throw beans::UnknownPropertyException();
598 :
599 0 : eItem = iId->second;
600 : }
601 0 : VetoableListenerContainer* pContainer = GetVetoableListeners(eItem, false);
602 0 : if (pContainer != NULL)
603 : {
604 0 : VetoableListenerContainer::iterator iListener (::std::find(pContainer->begin(), pContainer->end(), rxListener));
605 0 : if (iListener != pContainer->end())
606 : {
607 0 : pContainer->erase(iListener);
608 : // Remove container when empty.
609 0 : if (pContainer->empty())
610 0 : maVetoableListeners.erase(eItem);
611 : }
612 : }
613 0 : }
614 :
615 0 : css::uno::Sequence<css::beans::Property> SAL_CALL Theme::getProperties()
616 : throw(css::uno::RuntimeException, std::exception)
617 : {
618 0 : ::std::vector<beans::Property> aProperties;
619 :
620 0 : for (sal_Int32 nItem(__Begin),nEnd(__End); nItem!=nEnd; ++nItem)
621 : {
622 0 : const ThemeItem eItem (static_cast<ThemeItem>(nItem));
623 0 : const PropertyType eType (GetPropertyType(eItem));
624 0 : if (eType == PT_Invalid)
625 0 : continue;
626 :
627 : const beans::Property aProperty(
628 0 : maPropertyIdToNameMap[eItem],
629 : eItem,
630 : GetCppuType(eType),
631 0 : 0);
632 0 : aProperties.push_back(aProperty);
633 0 : }
634 :
635 : return css::uno::Sequence<css::beans::Property>(
636 0 : &aProperties.front(),
637 0 : aProperties.size());
638 : }
639 :
640 0 : beans::Property SAL_CALL Theme::getPropertyByName (const ::rtl::OUString& rsPropertyName)
641 : throw(css::beans::UnknownPropertyException,
642 : css::uno::RuntimeException, std::exception)
643 : {
644 0 : PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
645 0 : if (iId == maPropertyNameToIdMap.end())
646 0 : throw beans::UnknownPropertyException();
647 :
648 0 : const PropertyType eType (GetPropertyType(iId->second));
649 0 : if (eType == PT_Invalid)
650 0 : throw beans::UnknownPropertyException();
651 :
652 0 : const ThemeItem eItem (iId->second);
653 :
654 : return beans::Property(
655 : rsPropertyName,
656 : eItem,
657 : GetCppuType(eType),
658 0 : 0);
659 : }
660 :
661 0 : sal_Bool SAL_CALL Theme::hasPropertyByName (const ::rtl::OUString& rsPropertyName)
662 : throw(css::uno::RuntimeException, std::exception)
663 : {
664 0 : PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
665 0 : if (iId == maPropertyNameToIdMap.end())
666 0 : return sal_False;
667 :
668 0 : const PropertyType eType (GetPropertyType(iId->second));
669 0 : if (eType == PT_Invalid)
670 0 : return sal_False;
671 :
672 0 : return sal_True;
673 : }
674 :
675 97 : void Theme::SetupPropertyMaps()
676 : {
677 97 : maPropertyIdToNameMap.resize(__Post_Rect);
678 97 : maImages.resize(__Image_Color - __Pre_Image - 1);
679 97 : maColors.resize(__Color_Paint - __Image_Color - 1);
680 97 : maPaints.resize(__Paint_Int - __Color_Paint - 1);
681 97 : maIntegers.resize(__Int_Bool - __Paint_Int - 1);
682 97 : maBooleans.resize(__Bool_Rect - __Int_Bool - 1);
683 97 : maRectangles.resize(__Post_Rect - __Bool_Rect - 1);
684 :
685 : #define AddEntry(e) maPropertyNameToIdMap[OUString(#e)]=e; maPropertyIdToNameMap[e]=#e
686 :
687 97 : AddEntry(Image_Grip);
688 97 : AddEntry(Image_Expand);
689 97 : AddEntry(Image_Collapse);
690 97 : AddEntry(Image_TabBarMenu);
691 97 : AddEntry(Image_PanelMenu);
692 97 : AddEntry(Image_ToolBoxItemSeparator);
693 97 : AddEntry(Image_Closer);
694 97 : AddEntry(Image_CloseIndicator);
695 :
696 97 : AddEntry(Color_DeckTitleFont);
697 97 : AddEntry(Color_PanelTitleFont);
698 97 : AddEntry(Color_TabMenuSeparator);
699 97 : AddEntry(Color_TabItemBorder);
700 97 : AddEntry(Color_DropDownBorder);
701 97 : AddEntry(Color_Highlight);
702 97 : AddEntry(Color_HighlightText);
703 :
704 97 : AddEntry(Paint_DeckBackground);
705 97 : AddEntry(Paint_DeckTitleBarBackground);
706 97 : AddEntry(Paint_PanelBackground);
707 97 : AddEntry(Paint_PanelTitleBarBackground);
708 97 : AddEntry(Paint_TabBarBackground);
709 97 : AddEntry(Paint_TabItemBackgroundNormal);
710 97 : AddEntry(Paint_TabItemBackgroundHighlight);
711 97 : AddEntry(Paint_HorizontalBorder);
712 97 : AddEntry(Paint_VerticalBorder);
713 97 : AddEntry(Paint_ToolBoxBackground);
714 97 : AddEntry(Paint_ToolBoxBorderTopLeft);
715 97 : AddEntry(Paint_ToolBoxBorderCenterCorners);
716 97 : AddEntry(Paint_ToolBoxBorderBottomRight);
717 97 : AddEntry(Paint_DropDownBackground);
718 :
719 97 : AddEntry(Int_DeckTitleBarHeight);
720 97 : AddEntry(Int_DeckBorderSize);
721 97 : AddEntry(Int_DeckSeparatorHeight);
722 97 : AddEntry(Int_PanelTitleBarHeight);
723 97 : AddEntry(Int_TabMenuPadding);
724 97 : AddEntry(Int_TabMenuSeparatorPadding);
725 97 : AddEntry(Int_TabItemWidth);
726 97 : AddEntry(Int_TabItemHeight);
727 97 : AddEntry(Int_DeckLeftPadding);
728 97 : AddEntry(Int_DeckTopPadding);
729 97 : AddEntry(Int_DeckRightPadding);
730 97 : AddEntry(Int_DeckBottomPadding);
731 97 : AddEntry(Int_TabBarLeftPadding);
732 97 : AddEntry(Int_TabBarTopPadding);
733 97 : AddEntry(Int_TabBarRightPadding);
734 97 : AddEntry(Int_TabBarBottomPadding);
735 97 : AddEntry(Int_ButtonCornerRadius);
736 :
737 97 : AddEntry(Bool_UseSymphonyIcons);
738 97 : AddEntry(Bool_UseSystemColors);
739 97 : AddEntry(Bool_UseToolBoxItemSeparator);
740 97 : AddEntry(Bool_IsHighContrastModeActive);
741 :
742 97 : AddEntry(Rect_ToolBoxPadding);
743 97 : AddEntry(Rect_ToolBoxBorder);
744 :
745 : #undef AddEntry
746 :
747 97 : maRawValues.resize(maPropertyIdToNameMap.size());
748 97 : }
749 :
750 313382 : Theme::PropertyType Theme::GetPropertyType (const ThemeItem eItem)
751 : {
752 313382 : switch(eItem)
753 : {
754 : case Image_Grip:
755 : case Image_Expand:
756 : case Image_Collapse:
757 : case Image_TabBarMenu:
758 : case Image_PanelMenu:
759 : case Image_ToolBoxItemSeparator:
760 : case Image_Closer:
761 : case Image_CloseIndicator:
762 28832 : return PT_Image;
763 :
764 : case Color_DeckTitleFont:
765 : case Color_PanelTitleFont:
766 : case Color_TabMenuSeparator:
767 : case Color_TabItemBorder:
768 : case Color_DropDownBorder:
769 : case Color_Highlight:
770 : case Color_HighlightText:
771 8012 : return PT_Color;
772 :
773 : case Paint_DeckBackground:
774 : case Paint_DeckTitleBarBackground:
775 : case Paint_PanelBackground:
776 : case Paint_PanelTitleBarBackground:
777 : case Paint_TabBarBackground:
778 : case Paint_TabItemBackgroundNormal:
779 : case Paint_TabItemBackgroundHighlight:
780 : case Paint_HorizontalBorder:
781 : case Paint_VerticalBorder:
782 : case Paint_ToolBoxBackground:
783 : case Paint_ToolBoxBorderTopLeft:
784 : case Paint_ToolBoxBorderCenterCorners:
785 : case Paint_ToolBoxBorderBottomRight:
786 : case Paint_DropDownBackground:
787 35261 : return PT_Paint;
788 :
789 : case Int_DeckTitleBarHeight:
790 : case Int_DeckBorderSize:
791 : case Int_DeckSeparatorHeight:
792 : case Int_PanelTitleBarHeight:
793 : case Int_TabMenuPadding:
794 : case Int_TabMenuSeparatorPadding:
795 : case Int_TabItemWidth:
796 : case Int_TabItemHeight:
797 : case Int_DeckLeftPadding:
798 : case Int_DeckTopPadding:
799 : case Int_DeckRightPadding:
800 : case Int_DeckBottomPadding:
801 : case Int_TabBarLeftPadding:
802 : case Int_TabBarTopPadding:
803 : case Int_TabBarRightPadding:
804 : case Int_TabBarBottomPadding:
805 : case Int_ButtonCornerRadius:
806 240532 : return PT_Integer;
807 :
808 : case Bool_UseSymphonyIcons:
809 : case Bool_UseSystemColors:
810 : case Bool_UseToolBoxItemSeparator:
811 : case Bool_IsHighContrastModeActive:
812 545 : return PT_Boolean;
813 :
814 : case Rect_ToolBoxBorder:
815 : case Rect_ToolBoxPadding:
816 200 : return PT_Rectangle;
817 :
818 : default:
819 0 : return PT_Invalid;
820 : }
821 : }
822 :
823 0 : css::uno::Type Theme::GetCppuType (const PropertyType eType)
824 : {
825 0 : switch(eType)
826 : {
827 : case PT_Image:
828 0 : return cppu::UnoType<rtl::OUString>::get();
829 :
830 : case PT_Color:
831 0 : return cppu::UnoType<sal_uInt32>::get();
832 :
833 : case PT_Paint:
834 0 : return cppu::UnoType<void>::get();
835 :
836 : case PT_Integer:
837 0 : return cppu::UnoType<sal_Int32>::get();
838 :
839 : case PT_Boolean:
840 0 : return cppu::UnoType<sal_Bool>::get();
841 :
842 : case PT_Rectangle:
843 0 : return cppu::UnoType<awt::Rectangle>::get();
844 :
845 : case PT_Invalid:
846 : default:
847 0 : return cppu::UnoType<void>::get();
848 : }
849 : }
850 :
851 313138 : sal_Int32 Theme::GetIndex (const ThemeItem eItem, const PropertyType eType)
852 : {
853 313138 : switch(eType)
854 : {
855 : case PT_Image:
856 28808 : return eItem - __Pre_Image-1;
857 : case PT_Color:
858 7991 : return eItem - __Image_Color-1;
859 : case PT_Paint:
860 35122 : return eItem - __Color_Paint-1;
861 : case PT_Integer:
862 240481 : return eItem - __Paint_Int-1;
863 : case PT_Boolean:
864 542 : return eItem - __Int_Bool-1;
865 : case PT_Rectangle:
866 194 : return eItem - __Bool_Rect-1;
867 :
868 : default:
869 : OSL_ASSERT(false);
870 0 : return 0;
871 : }
872 : }
873 :
874 9700 : Theme::VetoableListenerContainer* Theme::GetVetoableListeners (
875 : const ThemeItem eItem,
876 : const bool bCreate)
877 : {
878 9700 : VetoableListeners::iterator iContainer (maVetoableListeners.find(eItem));
879 9700 : if (iContainer != maVetoableListeners.end())
880 0 : return &iContainer->second;
881 9700 : else if (bCreate)
882 : {
883 0 : maVetoableListeners[eItem] = VetoableListenerContainer();
884 0 : return &maVetoableListeners[eItem];
885 : }
886 : else
887 9700 : return NULL;
888 : }
889 :
890 16010 : Theme::ChangeListenerContainer* Theme::GetChangeListeners (
891 : const ThemeItem eItem,
892 : const bool bCreate)
893 : {
894 16010 : ChangeListeners::iterator iContainer (maChangeListeners.find(eItem));
895 16010 : if (iContainer != maChangeListeners.end())
896 3266 : return &iContainer->second;
897 12744 : else if (bCreate)
898 : {
899 3044 : maChangeListeners[eItem] = ChangeListenerContainer();
900 3044 : return &maChangeListeners[eItem];
901 : }
902 : else
903 9700 : return NULL;
904 : }
905 :
906 9700 : bool Theme::DoVetoableListenersVeto (
907 : const VetoableListenerContainer* pListeners,
908 : const beans::PropertyChangeEvent& rEvent)
909 : {
910 9700 : if (pListeners == NULL)
911 9700 : return false;
912 :
913 0 : VetoableListenerContainer aListeners (*pListeners);
914 : try
915 : {
916 0 : for (VetoableListenerContainer::const_iterator
917 0 : iListener(aListeners.begin()),
918 0 : iEnd(aListeners.end());
919 : iListener!=iEnd;
920 : ++iListener)
921 : {
922 0 : (*iListener)->vetoableChange(rEvent);
923 : }
924 : }
925 0 : catch(const beans::PropertyVetoException&)
926 : {
927 0 : return true;
928 : }
929 0 : catch(const Exception&)
930 : {
931 : // Ignore any other errors (such as disposed listeners).
932 : }
933 0 : return false;
934 : }
935 :
936 9700 : void Theme::BroadcastPropertyChange (
937 : const ChangeListenerContainer* pListeners,
938 : const beans::PropertyChangeEvent& rEvent)
939 : {
940 9700 : if (pListeners == NULL)
941 19400 : return;
942 :
943 0 : const ChangeListenerContainer aListeners (*pListeners);
944 : try
945 : {
946 0 : for (ChangeListenerContainer::const_iterator
947 0 : iListener(aListeners.begin()),
948 0 : iEnd(aListeners.end());
949 : iListener!=iEnd;
950 : ++iListener)
951 : {
952 0 : (*iListener)->propertyChange(rEvent);
953 : }
954 : }
955 0 : catch(const Exception&)
956 : {
957 : // Ignore any errors (such as disposed listeners).
958 0 : }
959 : }
960 :
961 4850 : void Theme::ProcessNewValue (
962 : const Any& rValue,
963 : const ThemeItem eItem,
964 : const PropertyType eType)
965 : {
966 4850 : const sal_Int32 nIndex (GetIndex (eItem, eType));
967 4850 : switch (eType)
968 : {
969 : case PT_Image:
970 : {
971 776 : ::rtl::OUString sURL;
972 776 : if (rValue >>= sURL)
973 : {
974 776 : maImages[nIndex] = Tools::GetImage(sURL, NULL);
975 : }
976 776 : break;
977 : }
978 : case PT_Color:
979 : {
980 679 : sal_Int32 nColorValue (0);
981 679 : if (rValue >>= nColorValue)
982 : {
983 679 : maColors[nIndex] = Color(nColorValue);
984 : }
985 679 : break;
986 : }
987 : case PT_Paint:
988 : {
989 1261 : maPaints[nIndex] = Paint::Create(rValue);
990 1261 : break;
991 : }
992 : case PT_Integer:
993 : {
994 1649 : sal_Int32 nValue (0);
995 1649 : if (rValue >>= nValue)
996 : {
997 1649 : maIntegers[nIndex] = nValue;
998 : }
999 1649 : break;
1000 : }
1001 : case PT_Boolean:
1002 : {
1003 291 : bool nValue (false);
1004 291 : if (rValue >>= nValue)
1005 : {
1006 291 : maBooleans[nIndex] = nValue;
1007 291 : if (eItem == Bool_IsHighContrastModeActive)
1008 : {
1009 0 : mbIsHighContrastModeSetManually = true;
1010 0 : mbIsHighContrastMode = maBooleans[nIndex];
1011 0 : HandleDataChange();
1012 : }
1013 291 : else if (eItem == Bool_UseSystemColors)
1014 : {
1015 97 : HandleDataChange();
1016 : }
1017 : }
1018 291 : break;
1019 : }
1020 : case PT_Rectangle:
1021 : {
1022 194 : awt::Rectangle aBox;
1023 194 : if (rValue >>= aBox)
1024 : {
1025 194 : maRectangles[nIndex] = Rectangle(
1026 : aBox.X,
1027 : aBox.Y,
1028 : aBox.Width,
1029 194 : aBox.Height);
1030 : }
1031 194 : break;
1032 : }
1033 : case PT_Invalid:
1034 : OSL_ASSERT(eType != PT_Invalid);
1035 0 : throw RuntimeException();
1036 : }
1037 4850 : }
1038 :
1039 : } } // end of namespace sfx2::sidebar
1040 :
1041 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|