blob: 19b51cf411bcc6e4c246689ce83018364100ca37 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include "precompiled_sfx2.hxx"
#include "sfx2/sidebar/Theme.hxx"
#include "Paint.hxx"
#include "SidebarResource.hxx"
#include "sfx2/sidebar/Tools.hxx"
#include <tools/svborder.hxx>
#include <tools/rc.hxx>
#include <vcl/svapp.hxx>
using namespace css;
using namespace cssu;
namespace sfx2 { namespace sidebar {
::rtl::Reference<Theme> Theme::mpInstance;
Theme& Theme::GetCurrentTheme (void)
{
if ( ! mpInstance.is())
{
mpInstance.set(new Theme());
mpInstance->InitializeTheme();
}
return *mpInstance;
}
Theme::Theme (void)
: ThemeInterfaceBase(m_aMutex),
maImages(),
maColors(),
maPaints(),
maIntegers(),
maBooleans(),
mbIsHighContrastMode(Application::GetSettings().GetStyleSettings().GetHighContrastMode()),
mbIsHighContrastModeSetManually(false),
maPropertyNameToIdMap(),
maPropertyIdToNameMap(),
maRawValues(),
maChangeListeners(),
maVetoableListeners()
{
SetupPropertyMaps();
}
Theme::~Theme (void)
{
}
Image Theme::GetImage (const ThemeItem eItem)
{
const PropertyType eType (GetPropertyType(eItem));
OSL_ASSERT(eType==PT_Image);
const sal_Int32 nIndex (GetIndex(eItem, eType));
const Theme& rTheme (GetCurrentTheme());
return rTheme.maImages[nIndex];
}
Color Theme::GetColor (const ThemeItem eItem)
{
const PropertyType eType (GetPropertyType(eItem));
OSL_ASSERT(eType==PT_Color || eType==PT_Paint);
const sal_Int32 nIndex (GetIndex(eItem, eType));
const Theme& rTheme (GetCurrentTheme());
if (eType == PT_Color)
return rTheme.maColors[nIndex];
else if (eType == PT_Paint)
return rTheme.maPaints[nIndex].GetColor();
else
return COL_WHITE;
}
const Paint& Theme::GetPaint (const ThemeItem eItem)
{
const PropertyType eType (GetPropertyType(eItem));
OSL_ASSERT(eType==PT_Paint);
const sal_Int32 nIndex (GetIndex(eItem, eType));
const Theme& rTheme (GetCurrentTheme());
return rTheme.maPaints[nIndex];
}
const Wallpaper Theme::GetWallpaper (const ThemeItem eItem)
{
return GetPaint(eItem).GetWallpaper();
}
sal_Int32 Theme::GetInteger (const ThemeItem eItem)
{
const PropertyType eType (GetPropertyType(eItem));
OSL_ASSERT(eType==PT_Integer);
const sal_Int32 nIndex (GetIndex(eItem, eType));
const Theme& rTheme (GetCurrentTheme());
return rTheme.maIntegers[nIndex];
}
bool Theme::GetBoolean (const ThemeItem eItem)
{
const PropertyType eType (GetPropertyType(eItem));
OSL_ASSERT(eType==PT_Boolean);
const sal_Int32 nIndex (GetIndex(eItem, eType));
const Theme& rTheme (GetCurrentTheme());
return rTheme.maBooleans[nIndex];
}
Rectangle Theme::GetRectangle (const ThemeItem eItem)
{
const PropertyType eType (GetPropertyType(eItem));
OSL_ASSERT(eType==PT_Rectangle);
const sal_Int32 nIndex (GetIndex(eItem, eType));
const Theme& rTheme (GetCurrentTheme());
return rTheme.maRectangles[nIndex];
}
bool Theme::IsHighContrastMode (void)
{
const Theme& rTheme (GetCurrentTheme());
return rTheme.mbIsHighContrastMode;
}
void Theme::HandleDataChange (void)
{
Theme& rTheme (GetCurrentTheme());
if ( ! rTheme.mbIsHighContrastModeSetManually)
{
// Do not modify mbIsHighContrastMode when it was manually set.
GetCurrentTheme().mbIsHighContrastMode = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
rTheme.maRawValues[Bool_IsHighContrastModeActive] = Any(GetCurrentTheme().mbIsHighContrastMode);
}
GetCurrentTheme().UpdateTheme();
}
void Theme::InitializeTheme (void)
{
setPropertyValue(
maPropertyIdToNameMap[Bool_UseSymphonyIcons],
Any(false));
setPropertyValue(
maPropertyIdToNameMap[Bool_UseSystemColors],
Any(false));
}
void Theme::UpdateTheme (void)
{
SidebarResource aLocalResource;
try
{
const StyleSettings& rStyle (Application::GetSettings().GetStyleSettings());
const bool bUseSystemColors (GetBoolean(Bool_UseSystemColors));
#define Alternatives(n,hc,sys) (mbIsHighContrastMode ? hc : (bUseSystemColors ? sys : n))
Color aBaseBackgroundColor (rStyle.GetDialogColor());
// UX says this should be a little brighter, but that looks off when compared to the other windows.
//aBaseBackgroundColor.IncreaseLuminance(7);
Color aBorderColor (aBaseBackgroundColor);
aBorderColor.DecreaseLuminance(15);
Color aSecondColor (aBaseBackgroundColor);
aSecondColor.DecreaseLuminance(15);
setPropertyValue(
maPropertyIdToNameMap[Paint_DeckBackground],
Any(sal_Int32(aBaseBackgroundColor.GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Paint_DeckTitleBarBackground],
Any(sal_Int32(aBaseBackgroundColor.GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Int_DeckLeftPadding],
Any(sal_Int32(2)));
setPropertyValue(
maPropertyIdToNameMap[Int_DeckTopPadding],
Any(sal_Int32(2)));
setPropertyValue(
maPropertyIdToNameMap[Int_DeckRightPadding],
Any(sal_Int32(2)));
setPropertyValue(
maPropertyIdToNameMap[Int_DeckBottomPadding],
Any(sal_Int32(2)));
setPropertyValue(
maPropertyIdToNameMap[Int_DeckBorderSize],
Any(sal_Int32(1)));
setPropertyValue(
maPropertyIdToNameMap[Int_DeckSeparatorHeight],
Any(sal_Int32(1)));
setPropertyValue(
maPropertyIdToNameMap[Int_ButtonCornerRadius],
Any(sal_Int32(3)));
setPropertyValue(
maPropertyIdToNameMap[Color_DeckTitleFont],
Any(sal_Int32(rStyle.GetFontColor().GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Int_DeckTitleBarHeight],
Any(sal_Int32(Alternatives(
26,
26,
rStyle.GetFloatTitleHeight()))));
setPropertyValue(
maPropertyIdToNameMap[Paint_PanelBackground],
Any(sal_Int32(aBaseBackgroundColor.GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Paint_PanelTitleBarBackground],
Any(Tools::VclToAwtGradient(Gradient(
GRADIENT_LINEAR,
aSecondColor.GetRGBColor(),
aBaseBackgroundColor.GetRGBColor()
))));
setPropertyValue(
maPropertyIdToNameMap[Color_PanelTitleFont],
Any(sal_Int32(mbIsHighContrastMode ? 0x00ff00 : 0x262626)));
setPropertyValue(
maPropertyIdToNameMap[Int_PanelTitleBarHeight],
Any(sal_Int32(Alternatives(
26,
26,
rStyle.GetTitleHeight()))));
setPropertyValue(
maPropertyIdToNameMap[Paint_TabBarBackground],
Any(sal_Int32(aBaseBackgroundColor.GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Int_TabBarLeftPadding],
Any(sal_Int32(2)));
setPropertyValue(
maPropertyIdToNameMap[Int_TabBarTopPadding],
Any(sal_Int32(2)));
setPropertyValue(
maPropertyIdToNameMap[Int_TabBarRightPadding],
Any(sal_Int32(2)));
setPropertyValue(
maPropertyIdToNameMap[Int_TabBarBottomPadding],
Any(sal_Int32(2)));
setPropertyValue(
maPropertyIdToNameMap[Int_TabMenuPadding],
Any(sal_Int32(6)));
setPropertyValue(
maPropertyIdToNameMap[Color_TabMenuSeparator],
Any(sal_Int32(aBorderColor.GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Int_TabMenuSeparatorPadding],
Any(sal_Int32(7)));
setPropertyValue(
maPropertyIdToNameMap[Int_TabItemWidth],
Any(sal_Int32(32)));
setPropertyValue(
maPropertyIdToNameMap[Int_TabItemHeight],
Any(sal_Int32(32)));
setPropertyValue(
maPropertyIdToNameMap[Color_TabItemBorder],
Any(sal_Int32(rStyle.GetActiveBorderColor().GetRGBColor())));
// mbIsHighContrastMode ? 0x00ff00 : 0xbfbfbf)));
setPropertyValue(
maPropertyIdToNameMap[Paint_DropDownBackground],
Any(sal_Int32(aBaseBackgroundColor.GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Color_DropDownBorder],
Any(sal_Int32(rStyle.GetActiveBorderColor().GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Color_Highlight],
Any(sal_Int32(rStyle.GetHighlightColor().GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Color_HighlightText],
Any(sal_Int32(rStyle.GetHighlightTextColor().GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Paint_TabItemBackgroundNormal],
Any());
setPropertyValue(
maPropertyIdToNameMap[Paint_TabItemBackgroundHighlight],
Any(sal_Int32(rStyle.GetActiveTabColor().GetRGBColor())));
// mbIsHighContrastMode ? 0x000000 : 0x00ffffff)));
setPropertyValue(
maPropertyIdToNameMap[Paint_HorizontalBorder],
Any(sal_Int32(aBorderColor.GetRGBColor())));
// mbIsHighContrastMode ? 0x00ff00 : 0xe4e4e4)));
setPropertyValue(
maPropertyIdToNameMap[Paint_VerticalBorder],
Any(sal_Int32(aBorderColor.GetRGBColor())));
// mbIsHighContrastMode ? 0x00ff00 : 0xe4e4e4)));
setPropertyValue(
maPropertyIdToNameMap[Image_Grip],
Any(
mbIsHighContrastMode
? A2S("private:graphicrepository/sfx2/res/grip_hc.png")
: A2S("private:graphicrepository/sfx2/res/grip.png")));
setPropertyValue(
maPropertyIdToNameMap[Image_Expand],
Any(
mbIsHighContrastMode
? A2S("private:graphicrepository/res/plus_sch.png")
: A2S("private:graphicrepository/res/plus.png")));
setPropertyValue(
maPropertyIdToNameMap[Image_Collapse],
Any(
mbIsHighContrastMode
? A2S("private:graphicrepository/res/minus_sch.png")
: A2S("private:graphicrepository/res/minus.png")));
setPropertyValue(
maPropertyIdToNameMap[Image_TabBarMenu],
Any(
mbIsHighContrastMode
? A2S("private:graphicrepository/sfx2/res/menu_hc.png")
: A2S("private:graphicrepository/sfx2/res/symphony/open_more.png")));
setPropertyValue(
maPropertyIdToNameMap[Image_PanelMenu],
Any(
mbIsHighContrastMode
? A2S("private:graphicrepository/sfx2/res/symphony/morebutton.png")
: A2S("private:graphicrepository/sfx2/res/symphony/morebutton_h.png")));
setPropertyValue(
maPropertyIdToNameMap[Image_Closer],
Any(A2S("private:graphicrepository/sfx2/res/closedoc.png")));
setPropertyValue(
maPropertyIdToNameMap[Image_CloseIndicator],
Any(
mbIsHighContrastMode
? A2S("private:graphicrepository/res/commandimagelist/lch_decrementlevel.png")
: A2S("private:graphicrepository/res/commandimagelist/lc_decrementlevel.png")));
setPropertyValue(
maPropertyIdToNameMap[Image_ToolBoxItemSeparator],
Any(
A2S("private:graphicrepository/sfx2/res/separator.png")));
// ToolBox
/*
// Separator style
setPropertyValue(
maPropertyIdToNameMap[Paint_ToolBoxBackground],
Any(sal_Int32(rStyle.GetMenuColor().GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Paint_ToolBoxBorderTopLeft],
Any());
setPropertyValue(
maPropertyIdToNameMap[Paint_ToolBoxBorderCenterCorners],
Any());
setPropertyValue(
maPropertyIdToNameMap[Paint_ToolBoxBorderBottomRight],
Any());
setPropertyValue(
maPropertyIdToNameMap[Rect_ToolBoxPadding],
Any(awt::Rectangle(2,2,2,2)));
setPropertyValue(
maPropertyIdToNameMap[Rect_ToolBoxBorder],
Any(awt::Rectangle(0,0,0,0)));
setPropertyValue(
maPropertyIdToNameMap[Bool_UseToolBoxItemSeparator],
Any(true));
*/
// Gradient style
Color aGradientStop2 (aBaseBackgroundColor);
aGradientStop2.IncreaseLuminance(17);
Color aToolBoxBorderColor (aBaseBackgroundColor);
aToolBoxBorderColor.DecreaseLuminance(12);
setPropertyValue(
maPropertyIdToNameMap[Paint_ToolBoxBackground],
Any(Tools::VclToAwtGradient(Gradient(
GRADIENT_LINEAR,
aBaseBackgroundColor.GetRGBColor(),
aGradientStop2.GetRGBColor()
))));
setPropertyValue(
maPropertyIdToNameMap[Paint_ToolBoxBorderTopLeft],
mbIsHighContrastMode
? Any(util::Color(sal_uInt32(0x00ff00)))
: Any(util::Color(aToolBoxBorderColor.GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Paint_ToolBoxBorderCenterCorners],
mbIsHighContrastMode
? Any(util::Color(sal_uInt32(0x00ff00)))
: Any(util::Color(aToolBoxBorderColor.GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Paint_ToolBoxBorderBottomRight],
mbIsHighContrastMode
? Any(util::Color(sal_uInt32(0x00ff00)))
: Any(util::Color(aToolBoxBorderColor.GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Rect_ToolBoxPadding],
Any(awt::Rectangle(2,2,2,2)));
setPropertyValue(
maPropertyIdToNameMap[Rect_ToolBoxBorder],
Any(awt::Rectangle(1,1,1,1)));
setPropertyValue(
maPropertyIdToNameMap[Bool_UseToolBoxItemSeparator],
Any(false));
}
catch(beans::UnknownPropertyException& rException)
{
OSL_TRACE("unknown property: %s",
OUStringToOString(
rException.Message,
RTL_TEXTENCODING_ASCII_US).getStr());
OSL_ASSERT(false);
}
}
void SAL_CALL Theme::disposing (void)
{
ChangeListeners aListeners;
maChangeListeners.swap(aListeners);
const lang::EventObject aEvent (static_cast<XWeak*>(this));
for (ChangeListeners::const_iterator
iContainer(maChangeListeners.begin()),
iContainerEnd(maChangeListeners.end());
iContainerEnd!=iContainerEnd;
++iContainerEnd)
{
for (ChangeListenerContainer::const_iterator
iListener(iContainer->second.begin()),
iEnd(iContainer->second.end());
iListener!=iEnd;
++iListener)
{
try
{
(*iListener)->disposing(aEvent);
}
catch(const Exception&)
{
}
}
}
}
Reference<beans::XPropertySet> Theme::GetPropertySet (void)
{
return Reference<beans::XPropertySet>(static_cast<XWeak*>(&GetCurrentTheme()), UNO_QUERY);
}
Reference<beans::XPropertySetInfo> SAL_CALL Theme::getPropertySetInfo (void)
throw(cssu::RuntimeException)
{
return Reference<beans::XPropertySetInfo>(this);
}
void SAL_CALL Theme::setPropertyValue (
const ::rtl::OUString& rsPropertyName,
const cssu::Any& rValue)
throw(cssu::RuntimeException)
{
PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
if (iId == maPropertyNameToIdMap.end())
throw beans::UnknownPropertyException(rsPropertyName, NULL);
const PropertyType eType (GetPropertyType(iId->second));
if (eType == PT_Invalid)
throw beans::UnknownPropertyException(rsPropertyName, NULL);
const ThemeItem eItem (iId->second);
if (rValue == maRawValues[eItem])
{
// Value is not different from the one in the property
// set => nothing to do.
return;
}
const Any aOldValue (maRawValues[eItem]);
const beans::PropertyChangeEvent aEvent(
static_cast<XWeak*>(this),
rsPropertyName,
sal_False,
eItem,
aOldValue,
rValue);
if (DoVetoableListenersVeto(GetVetoableListeners(__AnyItem, false), aEvent))
return;
if (DoVetoableListenersVeto(GetVetoableListeners(eItem, false), aEvent))
return;
maRawValues[eItem] = rValue;
ProcessNewValue(rValue, eItem, eType);
BroadcastPropertyChange(GetChangeListeners(__AnyItem, false), aEvent);
BroadcastPropertyChange(GetChangeListeners(eItem, false), aEvent);
}
Any SAL_CALL Theme::getPropertyValue (
const ::rtl::OUString& rsPropertyName)
throw(css::beans::UnknownPropertyException,
css::lang::WrappedTargetException,
cssu::RuntimeException)
{
PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
if (iId == maPropertyNameToIdMap.end())
throw beans::UnknownPropertyException();
const PropertyType eType (GetPropertyType(iId->second));
if (eType == PT_Invalid)
throw beans::UnknownPropertyException();
const ThemeItem eItem (iId->second);
return maRawValues[eItem];
}
void SAL_CALL Theme::addPropertyChangeListener(
const ::rtl::OUString& rsPropertyName,
const cssu::Reference<css::beans::XPropertyChangeListener>& rxListener)
throw(css::beans::UnknownPropertyException,
css::lang::WrappedTargetException,
cssu::RuntimeException)
{
ThemeItem eItem (__AnyItem);
if (rsPropertyName.getLength() > 0)
{
PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
if (iId == maPropertyNameToIdMap.end())
throw beans::UnknownPropertyException();
const PropertyType eType (GetPropertyType(iId->second));
if (eType == PT_Invalid)
throw beans::UnknownPropertyException();
eItem = iId->second;
}
ChangeListenerContainer* pListeners = GetChangeListeners(eItem, true);
if (pListeners != NULL)
pListeners->push_back(rxListener);
}
void SAL_CALL Theme::removePropertyChangeListener(
const ::rtl::OUString& rsPropertyName,
const cssu::Reference<css::beans::XPropertyChangeListener>& rxListener)
throw(css::beans::UnknownPropertyException,
css::lang::WrappedTargetException,
cssu::RuntimeException)
{
ThemeItem eItem (__AnyItem);
if (rsPropertyName.getLength() > 0)
{
PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
if (iId == maPropertyNameToIdMap.end())
throw beans::UnknownPropertyException();
const PropertyType eType (GetPropertyType(iId->second));
if (eType == PT_Invalid)
throw beans::UnknownPropertyException();
eItem = iId->second;
}
ChangeListenerContainer* pContainer = GetChangeListeners(eItem, false);
if (pContainer != NULL)
{
ChangeListenerContainer::iterator iListener (::std::find(pContainer->begin(), pContainer->end(), rxListener));
if (iListener != pContainer->end())
{
pContainer->erase(iListener);
// Remove the listener container when empty.
if (pContainer->empty())
maChangeListeners.erase(eItem);
}
}
}
void SAL_CALL Theme::addVetoableChangeListener(
const ::rtl::OUString& rsPropertyName,
const cssu::Reference<css::beans::XVetoableChangeListener>& rxListener)
throw(css::beans::UnknownPropertyException,
css::lang::WrappedTargetException,
cssu::RuntimeException)
{
ThemeItem eItem (__AnyItem);
if (rsPropertyName.getLength() > 0)
{
PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
if (iId == maPropertyNameToIdMap.end())
throw beans::UnknownPropertyException();
const PropertyType eType (GetPropertyType(iId->second));
if (eType == PT_Invalid)
throw beans::UnknownPropertyException();
eItem = iId->second;
}
VetoableListenerContainer* pListeners = GetVetoableListeners(eItem, true);
if (pListeners != NULL)
pListeners->push_back(rxListener);
}
void SAL_CALL Theme::removeVetoableChangeListener(
const ::rtl::OUString& rsPropertyName,
const cssu::Reference<css::beans::XVetoableChangeListener>& rxListener)
throw(css::beans::UnknownPropertyException,
css::lang::WrappedTargetException,
cssu::RuntimeException)
{
ThemeItem eItem (__AnyItem);
if (rsPropertyName.getLength() > 0)
{
PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
if (iId == maPropertyNameToIdMap.end())
throw beans::UnknownPropertyException();
const PropertyType eType (GetPropertyType(iId->second));
if (eType == PT_Invalid)
throw beans::UnknownPropertyException();
eItem = iId->second;
}
VetoableListenerContainer* pContainer = GetVetoableListeners(eItem, false);
if (pContainer != NULL)
{
VetoableListenerContainer::iterator iListener (::std::find(pContainer->begin(), pContainer->end(), rxListener));
if (iListener != pContainer->end())
{
pContainer->erase(iListener);
// Remove container when empty.
if (pContainer->empty())
maVetoableListeners.erase(eItem);
}
}
}
cssu::Sequence<css::beans::Property> SAL_CALL Theme::getProperties (void)
throw(cssu::RuntimeException)
{
::std::vector<beans::Property> aProperties;
for (sal_Int32 nItem(__Begin),nEnd(__End); nItem!=nEnd; ++nItem)
{
const ThemeItem eItem (static_cast<ThemeItem>(nItem));
const PropertyType eType (GetPropertyType(eItem));
if (eType == PT_Invalid)
continue;
const beans::Property aProperty(
maPropertyIdToNameMap[eItem],
eItem,
GetCppuType(eType),
0);
aProperties.push_back(aProperty);
}
return cssu::Sequence<css::beans::Property>(
&aProperties.front(),
aProperties.size());
}
beans::Property SAL_CALL Theme::getPropertyByName (const ::rtl::OUString& rsPropertyName)
throw(css::beans::UnknownPropertyException,
cssu::RuntimeException)
{
PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
if (iId == maPropertyNameToIdMap.end())
throw beans::UnknownPropertyException();
const PropertyType eType (GetPropertyType(iId->second));
if (eType == PT_Invalid)
throw beans::UnknownPropertyException();
const ThemeItem eItem (iId->second);
return beans::Property(
rsPropertyName,
eItem,
GetCppuType(eType),
0);
}
sal_Bool SAL_CALL Theme::hasPropertyByName (const ::rtl::OUString& rsPropertyName)
throw(cssu::RuntimeException)
{
PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName));
if (iId == maPropertyNameToIdMap.end())
return sal_False;
const PropertyType eType (GetPropertyType(iId->second));
if (eType == PT_Invalid)
return sal_False;
return sal_True;
}
void Theme::SetupPropertyMaps (void)
{
maPropertyIdToNameMap.resize(__Post_Rect);
maImages.resize(__Image_Color - __Pre_Image - 1);
maColors.resize(__Color_Paint - __Image_Color - 1);
maPaints.resize(__Paint_Int - __Color_Paint - 1);
maIntegers.resize(__Int_Bool - __Paint_Int - 1);
maBooleans.resize(__Bool_Rect - __Int_Bool - 1);
maRectangles.resize(__Post_Rect - __Bool_Rect - 1);
#define AddEntry(e) maPropertyNameToIdMap[A2S(#e)]=e; maPropertyIdToNameMap[e]=A2S(#e)
AddEntry(Image_Grip);
AddEntry(Image_Expand);
AddEntry(Image_Collapse);
AddEntry(Image_TabBarMenu);
AddEntry(Image_PanelMenu);
AddEntry(Image_ToolBoxItemSeparator);
AddEntry(Image_Closer);
AddEntry(Image_CloseIndicator);
AddEntry(Color_DeckTitleFont);
AddEntry(Color_PanelTitleFont);
AddEntry(Color_TabMenuSeparator);
AddEntry(Color_TabItemBorder);
AddEntry(Color_DropDownBorder);
AddEntry(Color_Highlight);
AddEntry(Color_HighlightText);
AddEntry(Paint_DeckBackground);
AddEntry(Paint_DeckTitleBarBackground);
AddEntry(Paint_PanelBackground);
AddEntry(Paint_PanelTitleBarBackground);
AddEntry(Paint_TabBarBackground);
AddEntry(Paint_TabItemBackgroundNormal);
AddEntry(Paint_TabItemBackgroundHighlight);
AddEntry(Paint_HorizontalBorder);
AddEntry(Paint_VerticalBorder);
AddEntry(Paint_ToolBoxBackground);
AddEntry(Paint_ToolBoxBorderTopLeft);
AddEntry(Paint_ToolBoxBorderCenterCorners);
AddEntry(Paint_ToolBoxBorderBottomRight);
AddEntry(Paint_DropDownBackground);
AddEntry(Int_DeckTitleBarHeight);
AddEntry(Int_DeckBorderSize);
AddEntry(Int_DeckSeparatorHeight);
AddEntry(Int_PanelTitleBarHeight);
AddEntry(Int_TabMenuPadding);
AddEntry(Int_TabMenuSeparatorPadding);
AddEntry(Int_TabItemWidth);
AddEntry(Int_TabItemHeight);
AddEntry(Int_DeckLeftPadding);
AddEntry(Int_DeckTopPadding);
AddEntry(Int_DeckRightPadding);
AddEntry(Int_DeckBottomPadding);
AddEntry(Int_TabBarLeftPadding);
AddEntry(Int_TabBarTopPadding);
AddEntry(Int_TabBarRightPadding);
AddEntry(Int_TabBarBottomPadding);
AddEntry(Int_ButtonCornerRadius);
AddEntry(Bool_UseSymphonyIcons);
AddEntry(Bool_UseSystemColors);
AddEntry(Bool_UseToolBoxItemSeparator);
AddEntry(Bool_IsHighContrastModeActive);
AddEntry(Rect_ToolBoxPadding);
AddEntry(Rect_ToolBoxBorder);
#undef AddEntry
maRawValues.resize(maPropertyIdToNameMap.size());
}
Theme::PropertyType Theme::GetPropertyType (const ThemeItem eItem)
{
switch(eItem)
{
case Image_Grip:
case Image_Expand:
case Image_Collapse:
case Image_TabBarMenu:
case Image_PanelMenu:
case Image_ToolBoxItemSeparator:
case Image_Closer:
case Image_CloseIndicator:
return PT_Image;
case Color_DeckTitleFont:
case Color_PanelTitleFont:
case Color_TabMenuSeparator:
case Color_TabItemBorder:
case Color_DropDownBorder:
case Color_Highlight:
case Color_HighlightText:
return PT_Color;
case Paint_DeckBackground:
case Paint_DeckTitleBarBackground:
case Paint_PanelBackground:
case Paint_PanelTitleBarBackground:
case Paint_TabBarBackground:
case Paint_TabItemBackgroundNormal:
case Paint_TabItemBackgroundHighlight:
case Paint_HorizontalBorder:
case Paint_VerticalBorder:
case Paint_ToolBoxBackground:
case Paint_ToolBoxBorderTopLeft:
case Paint_ToolBoxBorderCenterCorners:
case Paint_ToolBoxBorderBottomRight:
case Paint_DropDownBackground:
return PT_Paint;
case Int_DeckTitleBarHeight:
case Int_DeckBorderSize:
case Int_DeckSeparatorHeight:
case Int_PanelTitleBarHeight:
case Int_TabMenuPadding:
case Int_TabMenuSeparatorPadding:
case Int_TabItemWidth:
case Int_TabItemHeight:
case Int_DeckLeftPadding:
case Int_DeckTopPadding:
case Int_DeckRightPadding:
case Int_DeckBottomPadding:
case Int_TabBarLeftPadding:
case Int_TabBarTopPadding:
case Int_TabBarRightPadding:
case Int_TabBarBottomPadding:
case Int_ButtonCornerRadius:
return PT_Integer;
case Bool_UseSymphonyIcons:
case Bool_UseSystemColors:
case Bool_UseToolBoxItemSeparator:
case Bool_IsHighContrastModeActive:
return PT_Boolean;
case Rect_ToolBoxBorder:
case Rect_ToolBoxPadding:
return PT_Rectangle;
default:
return PT_Invalid;
}
}
cssu::Type Theme::GetCppuType (const PropertyType eType)
{
switch(eType)
{
case PT_Image:
return getCppuType((rtl::OUString*)NULL);
case PT_Color:
return getCppuType((sal_uInt32*)NULL);
case PT_Paint:
return getCppuVoidType();
case PT_Integer:
return getCppuType((sal_Int32*)NULL);
case PT_Boolean:
return getCppuType((sal_Bool*)NULL);
case PT_Rectangle:
return getCppuType((awt::Rectangle*)NULL);
case PT_Invalid:
default:
return getCppuVoidType();
}
}
sal_Int32 Theme::GetIndex (const ThemeItem eItem, const PropertyType eType)
{
switch(eType)
{
case PT_Image:
return eItem - __Pre_Image-1;
case PT_Color:
return eItem - __Image_Color-1;
case PT_Paint:
return eItem - __Color_Paint-1;
case PT_Integer:
return eItem - __Paint_Int-1;
case PT_Boolean:
return eItem - __Int_Bool-1;
case PT_Rectangle:
return eItem - __Bool_Rect-1;
default:
OSL_ASSERT(false);
return 0;
}
}
Theme::VetoableListenerContainer* Theme::GetVetoableListeners (
const ThemeItem eItem,
const bool bCreate)
{
VetoableListeners::iterator iContainer (maVetoableListeners.find(eItem));
if (iContainer != maVetoableListeners.end())
return &iContainer->second;
else if (bCreate)
{
maVetoableListeners[eItem] = VetoableListenerContainer();
return &maVetoableListeners[eItem];
}
else
return NULL;
}
Theme::ChangeListenerContainer* Theme::GetChangeListeners (
const ThemeItem eItem,
const bool bCreate)
{
ChangeListeners::iterator iContainer (maChangeListeners.find(eItem));
if (iContainer != maChangeListeners.end())
return &iContainer->second;
else if (bCreate)
{
maChangeListeners[eItem] = ChangeListenerContainer();
return &maChangeListeners[eItem];
}
else
return NULL;
}
bool Theme::DoVetoableListenersVeto (
const VetoableListenerContainer* pListeners,
const beans::PropertyChangeEvent& rEvent) const
{
if (pListeners == NULL)
return false;
VetoableListenerContainer aListeners (*pListeners);
try
{
for (VetoableListenerContainer::const_iterator
iListener(aListeners.begin()),
iEnd(aListeners.end());
iListener!=iEnd;
++iListener)
{
(*iListener)->vetoableChange(rEvent);
}
}
catch(const beans::PropertyVetoException&)
{
return true;
}
catch(const Exception&)
{
// Ignore any other errors (such as disposed listeners).
}
return false;
}
void Theme::BroadcastPropertyChange (
const ChangeListenerContainer* pListeners,
const beans::PropertyChangeEvent& rEvent) const
{
if (pListeners == NULL)
return;
const ChangeListenerContainer aListeners (*pListeners);
try
{
for (ChangeListenerContainer::const_iterator
iListener(aListeners.begin()),
iEnd(aListeners.end());
iListener!=iEnd;
++iListener)
{
(*iListener)->propertyChange(rEvent);
}
}
catch(const Exception&)
{
// Ignore any errors (such as disposed listeners).
}
}
void Theme::ProcessNewValue (
const Any& rValue,
const ThemeItem eItem,
const PropertyType eType)
{
const sal_Int32 nIndex (GetIndex (eItem, eType));
switch (eType)
{
case PT_Image:
{
::rtl::OUString sURL;
if (rValue >>= sURL)
{
maImages[nIndex] = Tools::GetImage(sURL, NULL);
}
break;
}
case PT_Color:
{
sal_Int32 nColorValue (0);
if (rValue >>= nColorValue)
{
maColors[nIndex] = Color(nColorValue);
}
break;
}
case PT_Paint:
{
maPaints[nIndex] = Paint::Create(rValue);
break;
}
case PT_Integer:
{
sal_Int32 nValue (0);
if (rValue >>= nValue)
{
maIntegers[nIndex] = nValue;
}
break;
}
case PT_Boolean:
{
sal_Bool nValue (0);
if (rValue >>= nValue)
{
maBooleans[nIndex] = (nValue==sal_True);
if (eItem == Bool_IsHighContrastModeActive)
{
mbIsHighContrastModeSetManually = true;
mbIsHighContrastMode = maBooleans[nIndex];
HandleDataChange();
}
else if (eItem == Bool_UseSystemColors)
{
HandleDataChange();
}
}
break;
}
case PT_Rectangle:
{
awt::Rectangle aBox;
if (rValue >>= aBox)
{
maRectangles[nIndex] = Rectangle(
aBox.X,
aBox.Y,
aBox.Width,
aBox.Height);
}
break;
}
case PT_Invalid:
OSL_ASSERT(eType != PT_Invalid);
throw RuntimeException();
}
}
} } // end of namespace sfx2::sidebar