/************************************************************** * * 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_sd.hxx" #include "view/SlsTheme.hxx" #include "SlsResource.hxx" #include "controller/SlsProperties.hxx" #include "sdresid.hxx" #include #include #include #include #include namespace sd { namespace slidesorter { namespace view { const static ColorData Black = 0x000000; const static ColorData White = 0xffffff; ColorData ChangeLuminance (const ColorData aColorData, const int nValue) { Color aColor (aColorData); if (nValue > 0) aColor.IncreaseLuminance(nValue); else aColor.DecreaseLuminance(-nValue); return aColor.GetColor(); } ColorData HGBAdapt ( const ColorData aColorData, const sal_Int32 nNewSaturation, const sal_Int32 nNewBrightness) { sal_uInt16 nHue (0); sal_uInt16 nSaturation (0); sal_uInt16 nBrightness (0); Color(aColorData).RGBtoHSB(nHue, nSaturation, nBrightness); return Color::HSBtoRGB( nHue, nNewSaturation>=0 ? nNewSaturation : nSaturation, nNewBrightness>=0 ? nNewBrightness : nBrightness); } Theme::Theme (const ::boost::shared_ptr& rpProperties) : mbIsHighContrastMode(false), maBackgroundColor(rpProperties->GetBackgroundColor().GetColor()), maPageBackgroundColor(COL_WHITE), maGradients(), maIcons(), maColor(), maIntegerValues() { { LocalResource aResource (RID_SLIDESORTER_ICONS); maStrings.resize(_StringType_Size_); maStrings[String_DragAndDropPages] = String(SdResId(STRING_DRAG_AND_DROP_PAGES)); maStrings[String_DragAndDropSlides] = String(SdResId(STRING_DRAG_AND_DROP_SLIDES)); maStrings[String_Command1] = String(SdResId(STRING_COMMAND1)); maStrings[String_Command2] = String(SdResId(STRING_COMMAND2_A)); maStrings[String_Command2B] = String(SdResId(STRING_COMMAND2_B)); maStrings[String_Command3] = String(SdResId(STRING_COMMAND3)); maColor.resize(_ColorType_Size_); maColor[Color_Background] = maBackgroundColor; maColor[Color_ButtonBackground] = Black; maColor[Color_ButtonText] = 0xc0c0c0; maColor[Color_ButtonTextHover] = White; maColor[Color_PageNumberDefault] = 0x0808080; maColor[Color_PageNumberHover] = 0x4c4c4c; maColor[Color_PageNumberHighContrast] = White; maColor[Color_PageNumberBrightBackground] = 0x333333; maColor[Color_PageNumberDarkBackground] = 0xcccccc; maColor[Color_PreviewBorder] = 0x949599; maIntegerValues.resize(_IntegerValueType_Size_); maIntegerValues[Integer_ButtonCornerRadius] = 3; maIntegerValues[Integer_ButtonMaxAlpha] = 0; maIntegerValues[Integer_ButtonBarMaxAlpha] = 0; maIntegerValues[Integer_ButtonPaintType] = 1; maIntegerValues[Integer_ButtonBorder] = 4; maIntegerValues[Integer_ButtonGap] = 0; maIntegerValues[Integer_ButtonFadeInDelay] = 800; maIntegerValues[Integer_ButtonFadeInDuration] = 100; maIntegerValues[Integer_ButtonFadeOutDelay] = 0; maIntegerValues[Integer_ButtonFadeOutDuration] = 100; maIntegerValues[Integer_ToolTipDelay] = 1000; maIntegerValues[Integer_FocusIndicatorWidth] = 3; } Update(rpProperties); } void Theme::Update (const ::boost::shared_ptr& rpProperties) { const bool bSavedHighContrastMode (mbIsHighContrastMode); mbIsHighContrastMode = rpProperties->IsHighContrastModeActive(); // Set up colors. maBackgroundColor = rpProperties->GetBackgroundColor().GetColor(); maPageBackgroundColor = svtools::ColorConfig().GetColorValue(svtools::DOCCOLOR).nColor; maColor[Color_Background] = maBackgroundColor; maGradients.resize(_GradientColorType_Size_); maColor[Color_Background] = maBackgroundColor; const ColorData aSelectionColor (rpProperties->GetSelectionColor().GetColor()); maColor[Color_Selection] = aSelectionColor; if (Color(aSelectionColor).IsBright()) maColor[Color_PageCountFontColor] = Black; else maColor[Color_PageCountFontColor] = White; // Set up gradients. SetGradient(Gradient_SelectedPage, aSelectionColor, 50, 50, +100,+100, +50,+25); SetGradient(Gradient_MouseOverPage, aSelectionColor, 75, 75, +100,+100, +50,+25); SetGradient(Gradient_SelectedAndFocusedPage, aSelectionColor, 50, 50, +100,+100, -50,-75); SetGradient(Gradient_MouseOverSelectedAndFocusedPage, aSelectionColor, 75, 75, +100,+100, -50,-75); SetGradient(Gradient_FocusedPage, aSelectionColor, -1,-1, 0,0, -50,-75); SetGradient(Gradient_ButtonBackground, Black, -1,-1, 0,0, 0,0); SetGradient(Gradient_NormalPage, maBackgroundColor, -1,-1, 0,0, 0,0); // The focused gradient needs special handling because its fill color is // like that of the NormalPage gradient. GetGradient(Gradient_FocusedPage).maFillColor1 = GetGradient(Gradient_NormalPage).maFillColor1; GetGradient(Gradient_FocusedPage).maFillColor2 = GetGradient(Gradient_NormalPage).maFillColor2; // Set up icons. if (bSavedHighContrastMode != mbIsHighContrastMode || maIcons.empty()) { LocalResource aResource (RID_SLIDESORTER_ICONS); maIcons.resize(_IconType_Size_); if (mbIsHighContrastMode) { InitializeIcon(Icon_RawShadow, IMAGE_SHADOW); InitializeIcon(Icon_RawInsertShadow, IMAGE_INSERT_SHADOW); InitializeIcon(Icon_HideSlideOverlay, IMAGE_HIDE_SLIDE_OVERLAY); InitializeIcon(Icon_ButtonBarLarge, IMAGE_BUTTONBAR_LARGE_HC); InitializeIcon(Icon_ButtonBarMedium, IMAGE_BUTTONBAR_MEDIUM_HC); InitializeIcon(Icon_ButtonBarSmall, IMAGE_BUTTONBAR_SMALL_HC); InitializeIcon(Icon_Command1Large, IMAGE_COMMAND1_LARGE_HC); InitializeIcon(Icon_Command1LargeHover, IMAGE_COMMAND1_LARGE_HOVER_HC); InitializeIcon(Icon_Command1Medium, IMAGE_COMMAND1_MEDIUM_HC); InitializeIcon(Icon_Command1MediumHover, IMAGE_COMMAND1_MEDIUM_HOVER_HC); InitializeIcon(Icon_Command1Small, IMAGE_COMMAND1_SMALL_HC); InitializeIcon(Icon_Command1SmallHover, IMAGE_COMMAND1_SMALL_HOVER_HC); InitializeIcon(Icon_Command2Large, IMAGE_COMMAND2_LARGE_HC); InitializeIcon(Icon_Command2LargeHover, IMAGE_COMMAND2_LARGE_HOVER_HC); InitializeIcon(Icon_Command2Medium, IMAGE_COMMAND2_MEDIUM_HC); InitializeIcon(Icon_Command2MediumHover, IMAGE_COMMAND2_MEDIUM_HOVER_HC); InitializeIcon(Icon_Command2Small, IMAGE_COMMAND2_SMALL_HC); InitializeIcon(Icon_Command2SmallHover, IMAGE_COMMAND2_SMALL_HOVER_HC); InitializeIcon(Icon_Command2BLarge, IMAGE_COMMAND2B_LARGE_HC); InitializeIcon(Icon_Command2BLargeHover, IMAGE_COMMAND2B_LARGE_HOVER_HC); InitializeIcon(Icon_Command2BMedium, IMAGE_COMMAND2B_MEDIUM_HC); InitializeIcon(Icon_Command2BMediumHover, IMAGE_COMMAND2B_MEDIUM_HOVER_HC); InitializeIcon(Icon_Command2BSmall, IMAGE_COMMAND2B_SMALL_HC); InitializeIcon(Icon_Command2BSmallHover, IMAGE_COMMAND2B_SMALL_HOVER_HC); InitializeIcon(Icon_Command3Large, IMAGE_COMMAND3_LARGE_HC); InitializeIcon(Icon_Command3LargeHover, IMAGE_COMMAND3_LARGE_HOVER_HC); InitializeIcon(Icon_Command3Medium, IMAGE_COMMAND3_SMALL_HC); InitializeIcon(Icon_Command3MediumHover, IMAGE_COMMAND3_SMALL_HOVER_HC); InitializeIcon(Icon_Command3Small, IMAGE_COMMAND3_SMALL_HC); InitializeIcon(Icon_Command3SmallHover, IMAGE_COMMAND3_SMALL_HOVER_HC); } else { InitializeIcon(Icon_RawShadow, IMAGE_SHADOW); InitializeIcon(Icon_RawInsertShadow, IMAGE_INSERT_SHADOW); InitializeIcon(Icon_HideSlideOverlay, IMAGE_HIDE_SLIDE_OVERLAY); InitializeIcon(Icon_ButtonBarLarge, IMAGE_BUTTONBAR_LARGE); InitializeIcon(Icon_ButtonBarMedium, IMAGE_BUTTONBAR_MEDIUM); InitializeIcon(Icon_ButtonBarSmall, IMAGE_BUTTONBAR_SMALL); InitializeIcon(Icon_Command1Large, IMAGE_COMMAND1_LARGE); InitializeIcon(Icon_Command1LargeHover, IMAGE_COMMAND1_LARGE_HOVER); InitializeIcon(Icon_Command1Medium, IMAGE_COMMAND1_MEDIUM); InitializeIcon(Icon_Command1MediumHover, IMAGE_COMMAND1_MEDIUM_HOVER); InitializeIcon(Icon_Command1Small, IMAGE_COMMAND1_SMALL); InitializeIcon(Icon_Command1SmallHover, IMAGE_COMMAND1_SMALL_HOVER); InitializeIcon(Icon_Command2Large, IMAGE_COMMAND2_LARGE); InitializeIcon(Icon_Command2LargeHover, IMAGE_COMMAND2_LARGE_HOVER); InitializeIcon(Icon_Command2Medium, IMAGE_COMMAND2_MEDIUM); InitializeIcon(Icon_Command2MediumHover, IMAGE_COMMAND2_MEDIUM_HOVER); InitializeIcon(Icon_Command2Small, IMAGE_COMMAND2_SMALL); InitializeIcon(Icon_Command2SmallHover, IMAGE_COMMAND2_SMALL_HOVER); InitializeIcon(Icon_Command2BLarge, IMAGE_COMMAND2B_LARGE); InitializeIcon(Icon_Command2BLargeHover, IMAGE_COMMAND2B_LARGE_HOVER); InitializeIcon(Icon_Command2BMedium, IMAGE_COMMAND2B_MEDIUM); InitializeIcon(Icon_Command2BMediumHover, IMAGE_COMMAND2B_MEDIUM_HOVER); InitializeIcon(Icon_Command2BSmall, IMAGE_COMMAND2B_SMALL); InitializeIcon(Icon_Command2BSmallHover, IMAGE_COMMAND2B_SMALL_HOVER); InitializeIcon(Icon_Command3Large, IMAGE_COMMAND3_LARGE); InitializeIcon(Icon_Command3LargeHover, IMAGE_COMMAND3_LARGE_HOVER); InitializeIcon(Icon_Command3Medium, IMAGE_COMMAND3_MEDIUM); InitializeIcon(Icon_Command3MediumHover, IMAGE_COMMAND3_MEDIUM_HOVER); InitializeIcon(Icon_Command3Small, IMAGE_COMMAND3_SMALL); InitializeIcon(Icon_Command3SmallHover, IMAGE_COMMAND3_SMALL_HOVER); } InitializeIcon(Icon_FocusBorder, IMAGE_FOCUS_BORDER); } } ::boost::shared_ptr Theme::GetFont ( const FontType eType, const OutputDevice& rDevice) { ::boost::shared_ptr pFont; switch (eType) { case Font_PageNumber: pFont.reset(new Font(Application::GetSettings().GetStyleSettings().GetAppFont())); pFont->SetTransparent(sal_True); pFont->SetWeight(WEIGHT_BOLD); break; case Font_PageCount: pFont.reset(new Font(Application::GetSettings().GetStyleSettings().GetAppFont())); pFont->SetTransparent(sal_True); pFont->SetWeight(WEIGHT_NORMAL); { const Size aSize (pFont->GetSize()); pFont->SetSize(Size(aSize.Width()*5/3, aSize.Height()*5/3)); } break; case Font_Button: pFont.reset(new Font(Application::GetSettings().GetStyleSettings().GetAppFont())); pFont->SetTransparent(sal_True); pFont->SetWeight(WEIGHT_BOLD); { const Size aSize (pFont->GetSize()); pFont->SetSize(Size(aSize.Width()*4/3, aSize.Height()*4/3)); } break; } if (pFont) { // Transform the point size to pixel size. const MapMode aFontMapMode (MAP_POINT); const Size aFontSize (rDevice.LogicToPixel(pFont->GetSize(), aFontMapMode)); // Transform the font size to the logical coordinates of the device. pFont->SetSize(rDevice.PixelToLogic(aFontSize)); } return pFont; } ColorData Theme::GetColor (const ColorType eType) { if (eType>=0 && sal_uInt32(eType)=0 && sal_uInt32(eType)=0 || nBrightnessOverride>=0 ? HGBAdapt(aBaseColor, nSaturationOverride, nBrightnessOverride) : aBaseColor); rGradient.maFillColor1 = ChangeLuminance(aColor, nFillStartOffset); rGradient.maFillColor2 = ChangeLuminance(aColor, nFillEndOffset); rGradient.maBorderColor1 = ChangeLuminance(aColor, nBorderStartOffset); rGradient.maBorderColor2 = ChangeLuminance(aColor, nBorderEndOffset); rGradient.mnFillOffset1 = nFillStartOffset; rGradient.mnFillOffset2 = nFillEndOffset; rGradient.mnBorderOffset1 = nBorderStartOffset; rGradient.mnBorderOffset2 = nBorderEndOffset; } sal_Int32 Theme::GetGradientSaturationOverride (const GradientColorType eType) { GradientDescriptor& rGradient (GetGradient(eType)); return rGradient.mnSaturationOverride; } sal_Int32 Theme::GetGradientBrightnessOverride (const GradientColorType eType) { GradientDescriptor& rGradient (GetGradient(eType)); return rGradient.mnBrightnessOverride; } void Theme::SetGradientSaturationOverride (const GradientColorType eType, const sal_Int32 nValue) { GradientDescriptor& rGradient (GetGradient(eType)); SetGradient( eType, rGradient.maBaseColor, nValue, rGradient.mnBrightnessOverride, rGradient.mnFillOffset1, rGradient.mnFillOffset2, rGradient.mnBorderOffset1, rGradient.mnBorderOffset2); } void Theme::SetGradientBrightnessOverride (const GradientColorType eType, const sal_Int32 nValue) { GradientDescriptor& rGradient (GetGradient(eType)); SetGradient(eType, rGradient.maBaseColor, rGradient.mnSaturationOverride, nValue, rGradient.mnFillOffset1, rGradient.mnFillOffset2, rGradient.mnBorderOffset1, rGradient.mnBorderOffset2); } const BitmapEx& Theme::GetIcon (const IconType eType) { if (eType>=0 && size_t(eType)=0 && size_t(eType)=0 && size_t(eType)=0 && size_t(eType)=0 && size_t(eType)=0 && size_t(eType)=0 && size_t(eType)=0 && size_t(eType)=0 && size_t(eType)=0 && size_t(eType)=0 && size_t(eType)=0 && size_t(eType)