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