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