blob: 85d72d248c435b110eaa822750343ad5c251d96d [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.
*
*************************************************************/
#ifndef SFX_SIDEBAR_THEME_HXX
#define SFX_SIDEBAR_THEME_HXX
#include "sfx2/dllapi.h"
#include <tools/color.hxx>
#include <vcl/image.hxx>
#include <cppuhelper/compbase2.hxx>
#include <cppuhelper/basemutex.hxx>
#include <tools/gen.hxx>
#include <rtl/ref.hxx>
#include <vcl/wall.hxx>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <hash_map>
#include <map>
#include <boost/optional.hpp>
class SvBorder;
namespace css = ::com::sun::star;
namespace cssu = ::com::sun::star::uno;
namespace sfx2 { namespace sidebar {
namespace
{
typedef ::cppu::WeakComponentImplHelper2 <
css::beans::XPropertySet,
css::beans::XPropertySetInfo
> ThemeInterfaceBase;
}
class Paint;
/** Simple collection of colors, gradients, fonts that define the
look of the sidebar and its controls.
*/
class SFX2_DLLPUBLIC Theme
: private ::boost::noncopyable,
private ::cppu::BaseMutex,
public ThemeInterfaceBase
{
public:
enum ThemeItem
{
__Begin,
__Pre_Image = __Begin,
__AnyItem = __Pre_Image,
Image_Grip,
Image_Expand,
Image_Collapse,
Image_TabBarMenu,
Image_PanelMenu,
Image_ToolBoxItemSeparator,
Image_Closer,
Image_CloseIndicator,
__Image_Color,
Color_DeckTitleFont,
Color_PanelTitleFont,
Color_TabMenuSeparator,
Color_TabItemBorder,
Color_DropDownBorder,
Color_Highlight,
Color_HighlightText,
__Color_Paint,
Paint_DeckBackground,
Paint_DeckTitleBarBackground,
Paint_PanelBackground,
Paint_PanelTitleBarBackground,
Paint_TabBarBackground,
Paint_TabItemBackgroundNormal,
Paint_TabItemBackgroundHighlight,
Paint_HorizontalBorder,
Paint_VerticalBorder,
Paint_ToolBoxBackground,
Paint_ToolBoxBorderTopLeft,
Paint_ToolBoxBorderCenterCorners,
Paint_ToolBoxBorderBottomRight,
Paint_DropDownBackground,
__Paint_Int,
Int_DeckTitleBarHeight,
Int_DeckBorderSize,
Int_DeckSeparatorHeight,
Int_PanelTitleBarHeight,
Int_TabMenuPadding,
Int_TabMenuSeparatorPadding,
Int_TabItemWidth,
Int_TabItemHeight,
Int_DeckLeftPadding,
Int_DeckTopPadding,
Int_DeckRightPadding,
Int_DeckBottomPadding,
Int_TabBarLeftPadding,
Int_TabBarTopPadding,
Int_TabBarRightPadding,
Int_TabBarBottomPadding,
Int_ButtonCornerRadius,
__Int_Bool,
Bool_UseSymphonyIcons,
Bool_UseSystemColors,
Bool_UseToolBoxItemSeparator,
Bool_IsHighContrastModeActive,
__Bool_Rect,
Rect_ToolBoxPadding,
Rect_ToolBoxBorder,
__Post_Rect,
__End=__Post_Rect
};
static Image GetImage (const ThemeItem eItem);
static Color GetColor (const ThemeItem eItem);
static const Paint& GetPaint (const ThemeItem eItem);
static const Wallpaper GetWallpaper (const ThemeItem eItem);
static sal_Int32 GetInteger (const ThemeItem eItem);
static bool GetBoolean (const ThemeItem eItem);
static Rectangle GetRectangle (const ThemeItem eItem);
static bool IsHighContrastMode (void);
static void HandleDataChange (void);
Theme (void);
virtual ~Theme (void);
virtual void SAL_CALL disposing (void);
static cssu::Reference<css::beans::XPropertySet> GetPropertySet (void);
// beans::XPropertySet
virtual cssu::Reference<css::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo (void)
throw(cssu::RuntimeException);
virtual void SAL_CALL setPropertyValue (
const ::rtl::OUString& rsPropertyName,
const cssu::Any& rValue)
throw(cssu::RuntimeException);
virtual cssu::Any SAL_CALL getPropertyValue (
const ::rtl::OUString& rsPropertyName)
throw(css::beans::UnknownPropertyException,
css::lang::WrappedTargetException,
cssu::RuntimeException);
virtual void SAL_CALL addPropertyChangeListener(
const ::rtl::OUString& rsPropertyName,
const cssu::Reference<css::beans::XPropertyChangeListener>& rxListener)
throw(css::beans::UnknownPropertyException,
css::lang::WrappedTargetException,
cssu::RuntimeException);
virtual void SAL_CALL removePropertyChangeListener(
const ::rtl::OUString& rsPropertyName,
const cssu::Reference<css::beans::XPropertyChangeListener>& rxListener)
throw(css::beans::UnknownPropertyException,
css::lang::WrappedTargetException,
cssu::RuntimeException);
virtual void SAL_CALL addVetoableChangeListener(
const ::rtl::OUString& rsPropertyName,
const cssu::Reference<css::beans::XVetoableChangeListener>& rxListener)
throw(css::beans::UnknownPropertyException,
css::lang::WrappedTargetException,
cssu::RuntimeException);
virtual void SAL_CALL removeVetoableChangeListener(
const ::rtl::OUString& rsPropertyName,
const cssu::Reference<css::beans::XVetoableChangeListener>& rxListener)
throw(css::beans::UnknownPropertyException,
css::lang::WrappedTargetException,
cssu::RuntimeException);
// beans::XPropertySetInfo
virtual cssu::Sequence<css::beans::Property> SAL_CALL getProperties (void)
throw(cssu::RuntimeException);
virtual css::beans::Property SAL_CALL getPropertyByName (const ::rtl::OUString& rsName)
throw(css::beans::UnknownPropertyException,
cssu::RuntimeException);
virtual sal_Bool SAL_CALL hasPropertyByName (const ::rtl::OUString& rsName)
throw(cssu::RuntimeException);
private:
static ::rtl::Reference<Theme> mpInstance;
static Theme& GetCurrentTheme (void);
::std::vector<Image> maImages;
::std::vector<Color> maColors;
::std::vector<Paint> maPaints;
::std::vector<sal_Int32> maIntegers;
::std::vector<bool> maBooleans;
::std::vector<Rectangle> maRectangles;
bool mbIsHighContrastMode;
bool mbIsHighContrastModeSetManually;
typedef ::std::hash_map<rtl::OUString,ThemeItem, rtl::OUStringHash> PropertyNameToIdMap;
PropertyNameToIdMap maPropertyNameToIdMap;
typedef ::std::vector<rtl::OUString> PropertyIdToNameMap;
PropertyIdToNameMap maPropertyIdToNameMap;
typedef ::std::vector<cssu::Any> RawValueContainer;
RawValueContainer maRawValues;
typedef ::std::vector<cssu::Reference<css::beans::XPropertyChangeListener> > ChangeListenerContainer;
typedef ::std::map<ThemeItem,ChangeListenerContainer> ChangeListeners;
ChangeListeners maChangeListeners;
typedef ::std::vector<cssu::Reference<css::beans::XVetoableChangeListener> > VetoableListenerContainer;
typedef ::std::map<ThemeItem,VetoableListenerContainer> VetoableListeners;
VetoableListeners maVetoableListeners;
enum PropertyType
{
PT_Image,
PT_Color,
PT_Paint,
PT_Integer,
PT_Boolean,
PT_Rectangle,
PT_Invalid
};
void SetupPropertyMaps (void);
void InitializeTheme (void);
void UpdateTheme (void);
static PropertyType GetPropertyType (const ThemeItem eItem);
static cssu::Type GetCppuType (const PropertyType eType);
static sal_Int32 GetIndex (
const ThemeItem eItem,
const PropertyType eType);
VetoableListenerContainer* GetVetoableListeners (
const ThemeItem eItem,
const bool bCreate);
ChangeListenerContainer* GetChangeListeners (
const ThemeItem eItem,
const bool bCreate);
bool DoVetoableListenersVeto (
const VetoableListenerContainer* pListeners,
const css::beans::PropertyChangeEvent& rEvent) const;
void BroadcastPropertyChange (
const ChangeListenerContainer* pListeners,
const css::beans::PropertyChangeEvent& rEvent) const;
void ProcessNewValue (
const cssu::Any& rValue,
const ThemeItem eItem,
const PropertyType eType);
};
} } // end of namespace sfx2::sidebar
#endif