Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : :
30 : : #include "view/SlsTheme.hxx"
31 : : #include "SlsResource.hxx"
32 : : #include "controller/SlsProperties.hxx"
33 : : #include "sdresid.hxx"
34 : : #include <tools/color.hxx>
35 : : #include <vcl/outdev.hxx>
36 : : #include <vcl/image.hxx>
37 : : #include <vcl/svapp.hxx>
38 : : #include <svtools/colorcfg.hxx>
39 : :
40 : : namespace sd { namespace slidesorter { namespace view {
41 : :
42 : : const static ColorData Black = 0x000000;
43 : : const static ColorData White = 0xffffff;
44 : :
45 : :
46 : :
47 : 3640 : ColorData ChangeLuminance (const ColorData aColorData, const int nValue)
48 : : {
49 : 3640 : Color aColor (aColorData);
50 [ + + ]: 3640 : if (nValue > 0)
51 [ + - ]: 1560 : aColor.IncreaseLuminance(nValue);
52 : : else
53 [ + - ]: 2080 : aColor.DecreaseLuminance(-nValue);
54 : 3640 : return aColor.GetColor();
55 : : }
56 : :
57 : 520 : ColorData HGBAdapt (
58 : : const ColorData aColorData,
59 : : const sal_Int32 nNewSaturation,
60 : : const sal_Int32 nNewBrightness)
61 : : {
62 : 520 : sal_uInt16 nHue (0);
63 : 520 : sal_uInt16 nSaturation (0);
64 : 520 : sal_uInt16 nBrightness (0);
65 [ + - ]: 520 : Color(aColorData).RGBtoHSB(nHue, nSaturation, nBrightness);
66 : : return Color::HSBtoRGB(
67 : : nHue,
68 : : nNewSaturation>=0 ? nNewSaturation : nSaturation,
69 [ + - ][ + - ]: 520 : nNewBrightness>=0 ? nNewBrightness : nBrightness);
[ + - ]
70 : : }
71 : :
72 : :
73 : :
74 : :
75 : 130 : Theme::Theme (const ::boost::shared_ptr<controller::Properties>& rpProperties)
76 : : : mbIsHighContrastMode(false),
77 : 130 : maBackgroundColor(rpProperties->GetBackgroundColor().GetColor()),
78 : : maPageBackgroundColor(COL_WHITE),
79 : : maGradients(),
80 : : maIcons(),
81 [ + - ][ + - ]: 130 : maColor()
82 : : {
83 : : {
84 [ + - ]: 130 : LocalResource aResource (RID_SLIDESORTER_ICONS);
85 : :
86 [ + - ]: 130 : maColor.resize(_ColorType_Size_);
87 [ + - ]: 130 : maColor[Color_Background] = maBackgroundColor;
88 [ + - ]: 130 : maColor[Color_PageNumberDefault] = 0x0808080;
89 [ + - ]: 130 : maColor[Color_PageNumberHover] = 0x4c4c4c;
90 [ + - ]: 130 : maColor[Color_PageNumberHighContrast] = White;
91 [ + - ]: 130 : maColor[Color_PageNumberBrightBackground] = 0x333333;
92 [ + - ]: 130 : maColor[Color_PageNumberDarkBackground] = 0xcccccc;
93 [ + - ][ + - ]: 130 : maColor[Color_PreviewBorder] = 0x949599;
94 : : }
95 : :
96 [ + - ]: 130 : Update(rpProperties);
97 : 130 : }
98 : :
99 : :
100 : :
101 : :
102 : 130 : void Theme::Update (const ::boost::shared_ptr<controller::Properties>& rpProperties)
103 : : {
104 : 130 : const bool bSavedHighContrastMode (mbIsHighContrastMode);
105 : 130 : mbIsHighContrastMode = rpProperties->IsHighContrastModeActive();
106 : :
107 : : // Set up colors.
108 : 130 : maBackgroundColor = rpProperties->GetBackgroundColor().GetColor();
109 [ + - ]: 130 : maPageBackgroundColor = svtools::ColorConfig().GetColorValue(svtools::DOCCOLOR).nColor;
110 : :
111 : 130 : maColor[Color_Background] = maBackgroundColor;
112 : :
113 : 130 : maGradients.resize(_GradientColorType_Size_);
114 : :
115 : 130 : maColor[Color_Background] = maBackgroundColor;
116 : 130 : const ColorData aSelectionColor (rpProperties->GetSelectionColor().GetColor());
117 : 130 : maColor[Color_Selection] = aSelectionColor;
118 [ - + ][ + - ]: 130 : if (Color(aSelectionColor).IsBright())
119 : 0 : maColor[Color_PageCountFontColor] = Black;
120 : : else
121 : 130 : maColor[Color_PageCountFontColor] = White;
122 : :
123 : : // Set up gradients.
124 : 130 : SetGradient(Gradient_SelectedPage, aSelectionColor, 50, 50, +100,+100, +50,+25);
125 : 130 : SetGradient(Gradient_MouseOverPage, aSelectionColor, 75, 75, +100,+100, +50,+25);
126 : 130 : SetGradient(Gradient_SelectedAndFocusedPage, aSelectionColor, 50, 50, +100,+100, -50,-75);
127 : 130 : SetGradient(Gradient_MouseOverSelectedAndFocusedPage, aSelectionColor, 75, 75, +100,+100, -50,-75);
128 : 130 : SetGradient(Gradient_FocusedPage, aSelectionColor, -1,-1, 0,0, -50,-75);
129 : :
130 : 130 : SetGradient(Gradient_ButtonBackground, Black, -1,-1, 0,0, 0,0);
131 : 130 : SetGradient(Gradient_NormalPage, maBackgroundColor, -1,-1, 0,0, 0,0);
132 : :
133 : : // The focused gradient needs special handling because its fill color is
134 : : // like that of the NormalPage gradient.
135 : 130 : GetGradient(Gradient_FocusedPage).maFillColor1 = GetGradient(Gradient_NormalPage).maFillColor1;
136 : 130 : GetGradient(Gradient_FocusedPage).maFillColor2 = GetGradient(Gradient_NormalPage).maFillColor2;
137 : :
138 : : // Set up icons.
139 [ + - ][ + - ]: 130 : if (bSavedHighContrastMode != mbIsHighContrastMode || maIcons.empty())
[ + - ]
140 : : {
141 [ + - ]: 130 : LocalResource aResource (RID_SLIDESORTER_ICONS);
142 : :
143 [ + - ]: 130 : maIcons.resize(_IconType_Size_);
144 [ - + ]: 130 : if (mbIsHighContrastMode)
145 : : {
146 [ # # ]: 0 : InitializeIcon(Icon_RawShadow, IMAGE_SHADOW);
147 [ # # ]: 0 : InitializeIcon(Icon_RawInsertShadow, IMAGE_INSERT_SHADOW);
148 [ # # ]: 0 : InitializeIcon(Icon_HideSlideOverlay, IMAGE_HIDE_SLIDE_OVERLAY);
149 : :
150 [ # # ]: 0 : InitializeIcon(Icon_ButtonBarLarge, IMAGE_BUTTONBAR_LARGE_HC);
151 [ # # ]: 0 : InitializeIcon(Icon_ButtonBarMedium, IMAGE_BUTTONBAR_MEDIUM_HC);
152 [ # # ]: 0 : InitializeIcon(Icon_ButtonBarSmall, IMAGE_BUTTONBAR_SMALL_HC);
153 : :
154 [ # # ]: 0 : InitializeIcon(Icon_Command1Large, IMAGE_COMMAND1_LARGE_HC);
155 [ # # ]: 0 : InitializeIcon(Icon_Command1LargeHover, IMAGE_COMMAND1_LARGE_HOVER_HC);
156 [ # # ]: 0 : InitializeIcon(Icon_Command1Medium, IMAGE_COMMAND1_MEDIUM_HC);
157 [ # # ]: 0 : InitializeIcon(Icon_Command1MediumHover, IMAGE_COMMAND1_MEDIUM_HOVER_HC);
158 [ # # ]: 0 : InitializeIcon(Icon_Command1Small, IMAGE_COMMAND1_SMALL_HC);
159 [ # # ]: 0 : InitializeIcon(Icon_Command1SmallHover, IMAGE_COMMAND1_SMALL_HOVER_HC);
160 : :
161 [ # # ]: 0 : InitializeIcon(Icon_Command2Large, IMAGE_COMMAND2_LARGE_HC);
162 [ # # ]: 0 : InitializeIcon(Icon_Command2LargeHover, IMAGE_COMMAND2_LARGE_HOVER_HC);
163 [ # # ]: 0 : InitializeIcon(Icon_Command2Medium, IMAGE_COMMAND2_MEDIUM_HC);
164 [ # # ]: 0 : InitializeIcon(Icon_Command2MediumHover, IMAGE_COMMAND2_MEDIUM_HOVER_HC);
165 [ # # ]: 0 : InitializeIcon(Icon_Command2Small, IMAGE_COMMAND2_SMALL_HC);
166 [ # # ]: 0 : InitializeIcon(Icon_Command2SmallHover, IMAGE_COMMAND2_SMALL_HOVER_HC);
167 : :
168 [ # # ]: 0 : InitializeIcon(Icon_Command2BLarge, IMAGE_COMMAND2B_LARGE_HC);
169 [ # # ]: 0 : InitializeIcon(Icon_Command2BLargeHover, IMAGE_COMMAND2B_LARGE_HOVER_HC);
170 [ # # ]: 0 : InitializeIcon(Icon_Command2BMedium, IMAGE_COMMAND2B_MEDIUM_HC);
171 [ # # ]: 0 : InitializeIcon(Icon_Command2BMediumHover, IMAGE_COMMAND2B_MEDIUM_HOVER_HC);
172 [ # # ]: 0 : InitializeIcon(Icon_Command2BSmall, IMAGE_COMMAND2B_SMALL_HC);
173 [ # # ]: 0 : InitializeIcon(Icon_Command2BSmallHover, IMAGE_COMMAND2B_SMALL_HOVER_HC);
174 : :
175 [ # # ]: 0 : InitializeIcon(Icon_Command3Large, IMAGE_COMMAND3_LARGE_HC);
176 [ # # ]: 0 : InitializeIcon(Icon_Command3LargeHover, IMAGE_COMMAND3_LARGE_HOVER_HC);
177 [ # # ]: 0 : InitializeIcon(Icon_Command3Medium, IMAGE_COMMAND3_SMALL_HC);
178 [ # # ]: 0 : InitializeIcon(Icon_Command3MediumHover, IMAGE_COMMAND3_SMALL_HOVER_HC);
179 [ # # ]: 0 : InitializeIcon(Icon_Command3Small, IMAGE_COMMAND3_SMALL_HC);
180 [ # # ]: 0 : InitializeIcon(Icon_Command3SmallHover, IMAGE_COMMAND3_SMALL_HOVER_HC);
181 : : }
182 : : else
183 : : {
184 [ + - ]: 130 : InitializeIcon(Icon_RawShadow, IMAGE_SHADOW);
185 [ + - ]: 130 : InitializeIcon(Icon_RawInsertShadow, IMAGE_INSERT_SHADOW);
186 [ + - ]: 130 : InitializeIcon(Icon_HideSlideOverlay, IMAGE_HIDE_SLIDE_OVERLAY);
187 : :
188 [ + - ]: 130 : InitializeIcon(Icon_ButtonBarLarge, IMAGE_BUTTONBAR_LARGE);
189 [ + - ]: 130 : InitializeIcon(Icon_ButtonBarMedium, IMAGE_BUTTONBAR_MEDIUM);
190 [ + - ]: 130 : InitializeIcon(Icon_ButtonBarSmall, IMAGE_BUTTONBAR_SMALL);
191 : :
192 [ + - ]: 130 : InitializeIcon(Icon_Command1Large, IMAGE_COMMAND1_LARGE);
193 [ + - ]: 130 : InitializeIcon(Icon_Command1LargeHover, IMAGE_COMMAND1_LARGE_HOVER);
194 [ + - ]: 130 : InitializeIcon(Icon_Command1Medium, IMAGE_COMMAND1_MEDIUM);
195 [ + - ]: 130 : InitializeIcon(Icon_Command1MediumHover, IMAGE_COMMAND1_MEDIUM_HOVER);
196 [ + - ]: 130 : InitializeIcon(Icon_Command1Small, IMAGE_COMMAND1_SMALL);
197 [ + - ]: 130 : InitializeIcon(Icon_Command1SmallHover, IMAGE_COMMAND1_SMALL_HOVER);
198 : :
199 [ + - ]: 130 : InitializeIcon(Icon_Command2Large, IMAGE_COMMAND2_LARGE);
200 [ + - ]: 130 : InitializeIcon(Icon_Command2LargeHover, IMAGE_COMMAND2_LARGE_HOVER);
201 [ + - ]: 130 : InitializeIcon(Icon_Command2Medium, IMAGE_COMMAND2_MEDIUM);
202 [ + - ]: 130 : InitializeIcon(Icon_Command2MediumHover, IMAGE_COMMAND2_MEDIUM_HOVER);
203 [ + - ]: 130 : InitializeIcon(Icon_Command2Small, IMAGE_COMMAND2_SMALL);
204 [ + - ]: 130 : InitializeIcon(Icon_Command2SmallHover, IMAGE_COMMAND2_SMALL_HOVER);
205 : :
206 [ + - ]: 130 : InitializeIcon(Icon_Command2BLarge, IMAGE_COMMAND2B_LARGE);
207 [ + - ]: 130 : InitializeIcon(Icon_Command2BLargeHover, IMAGE_COMMAND2B_LARGE_HOVER);
208 [ + - ]: 130 : InitializeIcon(Icon_Command2BMedium, IMAGE_COMMAND2B_MEDIUM);
209 [ + - ]: 130 : InitializeIcon(Icon_Command2BMediumHover, IMAGE_COMMAND2B_MEDIUM_HOVER);
210 [ + - ]: 130 : InitializeIcon(Icon_Command2BSmall, IMAGE_COMMAND2B_SMALL);
211 [ + - ]: 130 : InitializeIcon(Icon_Command2BSmallHover, IMAGE_COMMAND2B_SMALL_HOVER);
212 : :
213 [ + - ]: 130 : InitializeIcon(Icon_Command3Large, IMAGE_COMMAND3_LARGE);
214 [ + - ]: 130 : InitializeIcon(Icon_Command3LargeHover, IMAGE_COMMAND3_LARGE_HOVER);
215 [ + - ]: 130 : InitializeIcon(Icon_Command3Medium, IMAGE_COMMAND3_MEDIUM);
216 [ + - ]: 130 : InitializeIcon(Icon_Command3MediumHover, IMAGE_COMMAND3_MEDIUM_HOVER);
217 [ + - ]: 130 : InitializeIcon(Icon_Command3Small, IMAGE_COMMAND3_SMALL);
218 [ + - ]: 130 : InitializeIcon(Icon_Command3SmallHover, IMAGE_COMMAND3_SMALL_HOVER);
219 : : }
220 [ + - ][ + - ]: 130 : InitializeIcon(Icon_FocusBorder, IMAGE_FOCUS_BORDER);
221 : : }
222 : 130 : }
223 : :
224 : :
225 : :
226 : :
227 : 774 : ::boost::shared_ptr<Font> Theme::GetFont (
228 : : const FontType eType,
229 : : const OutputDevice& rDevice)
230 : : {
231 : 774 : ::boost::shared_ptr<Font> pFont;
232 : :
233 [ + - - ]: 774 : switch (eType)
234 : : {
235 : : case Font_PageNumber:
236 [ + - ][ + - ]: 774 : pFont.reset(new Font(Application::GetSettings().GetStyleSettings().GetAppFont()));
[ + - ][ + - ]
237 [ + - ]: 774 : pFont->SetTransparent(sal_True);
238 [ + - ]: 774 : pFont->SetWeight(WEIGHT_BOLD);
239 : 774 : break;
240 : :
241 : : case Font_PageCount:
242 [ # # ][ # # ]: 0 : pFont.reset(new Font(Application::GetSettings().GetStyleSettings().GetAppFont()));
[ # # ][ # # ]
243 [ # # ]: 0 : pFont->SetTransparent(sal_True);
244 [ # # ]: 0 : pFont->SetWeight(WEIGHT_NORMAL);
245 : : {
246 [ # # ]: 0 : const Size aSize (pFont->GetSize());
247 [ # # ]: 0 : pFont->SetSize(Size(aSize.Width()*5/3, aSize.Height()*5/3));
248 : : }
249 : 0 : break;
250 : : }
251 : :
252 [ + - ]: 774 : if (pFont)
253 : : {
254 : : // Transform the point size to pixel size.
255 [ + - ]: 774 : const MapMode aFontMapMode (MAP_POINT);
256 [ + - ][ + - ]: 774 : const Size aFontSize (rDevice.LogicToPixel(pFont->GetSize(), aFontMapMode));
257 : :
258 : : // Transform the font size to the logical coordinates of the device.
259 [ + - ][ + - ]: 774 : pFont->SetSize(rDevice.PixelToLogic(aFontSize));
[ + - ]
260 : : }
261 : :
262 : 774 : return pFont;
263 : : }
264 : :
265 : :
266 : :
267 : :
268 : 1761 : ColorData Theme::GetColor (const ColorType eType)
269 : : {
270 [ + - ][ + - ]: 1761 : if (eType>=0 && sal_uInt32(eType)<maColor.size())
[ + - ]
271 : 1761 : return maColor[eType];
272 : : else
273 : 1761 : return 0;
274 : : }
275 : :
276 : :
277 : :
278 : :
279 : 588 : ColorData Theme::GetGradientColor (
280 : : const GradientColorType eType,
281 : : const GradientColorClass eClass)
282 : : {
283 : 588 : GradientDescriptor& rDescriptor (GetGradient(eType));
284 : :
285 [ + + + + : 588 : switch (eClass)
- ]
286 : : {
287 : 147 : case Border1: return rDescriptor.maBorderColor1;
288 : 147 : case Border2: return rDescriptor.maBorderColor2;
289 : 147 : case Fill1: return rDescriptor.maFillColor1;
290 : 147 : case Fill2: return rDescriptor.maFillColor2;
291 : : default: OSL_ASSERT(false); // fall through
292 : 588 : case Base: return rDescriptor.maBaseColor;
293 : : }
294 : : }
295 : :
296 : :
297 : :
298 : :
299 : 910 : void Theme::SetGradient (
300 : : const GradientColorType eType,
301 : : const ColorData aBaseColor,
302 : : const sal_Int32 nSaturationOverride,
303 : : const sal_Int32 nBrightnessOverride,
304 : : const sal_Int32 nFillStartOffset,
305 : : const sal_Int32 nFillEndOffset,
306 : : const sal_Int32 nBorderStartOffset,
307 : : const sal_Int32 nBorderEndOffset)
308 : : {
309 : 910 : GradientDescriptor& rGradient (GetGradient(eType));
310 : :
311 : 910 : rGradient.maBaseColor = aBaseColor;
312 : :
313 : 910 : rGradient.mnSaturationOverride = nSaturationOverride;
314 : 910 : rGradient.mnBrightnessOverride = nBrightnessOverride;
315 : : const ColorData aColor (nSaturationOverride>=0 || nBrightnessOverride>=0
316 : : ? HGBAdapt(aBaseColor, nSaturationOverride, nBrightnessOverride)
317 [ - + ][ + + ]: 910 : : aBaseColor);
318 : :
319 : 910 : rGradient.maFillColor1 = ChangeLuminance(aColor, nFillStartOffset);
320 : 910 : rGradient.maFillColor2 = ChangeLuminance(aColor, nFillEndOffset);
321 : 910 : rGradient.maBorderColor1 = ChangeLuminance(aColor, nBorderStartOffset);
322 : 910 : rGradient.maBorderColor2 = ChangeLuminance(aColor, nBorderEndOffset);
323 : :
324 : 910 : rGradient.mnFillOffset1 = nFillStartOffset;
325 : 910 : rGradient.mnFillOffset2 = nFillEndOffset;
326 : 910 : rGradient.mnBorderOffset1 = nBorderStartOffset;
327 : 910 : rGradient.mnBorderOffset2 = nBorderEndOffset;
328 : 910 : }
329 : :
330 : :
331 : :
332 : :
333 : 3510 : const BitmapEx& Theme::GetIcon (const IconType eType)
334 : : {
335 [ + - ][ + - ]: 3510 : if (eType>=0 && size_t(eType)<maIcons.size())
[ + - ]
336 : 3510 : return maIcons[eType];
337 : : else
338 : : {
339 : : OSL_ASSERT(eType>=0 && size_t(eType)<maIcons.size());
340 : 3510 : return maIcons[0];
341 : : }
342 : : }
343 : :
344 : :
345 : :
346 : :
347 : 2018 : Theme::GradientDescriptor& Theme::GetGradient (const GradientColorType eType)
348 : : {
349 [ + - ][ + - ]: 2018 : if (eType>=0 && size_t(eType)<maGradients.size())
[ + - ]
350 : 2018 : return maGradients[eType];
351 : : else
352 : : {
353 : : OSL_ASSERT(eType>=0 && size_t(eType)<maGradients.size());
354 : 2018 : return maGradients[0];
355 : : }
356 : : }
357 : :
358 : :
359 : :
360 : :
361 : 4030 : void Theme::InitializeIcon (const IconType eType, sal_uInt16 nResourceId)
362 : : {
363 [ + - ][ + - ]: 4030 : if (eType>=0 && size_t(eType)<maIcons.size())
[ + - ]
364 : : {
365 [ + - ][ + - ]: 4030 : const BitmapEx aIcon (Image(SdResId(nResourceId)).GetBitmapEx());
[ + - ][ + - ]
366 [ + - ][ + - ]: 4030 : maIcons[eType] = aIcon;
[ + - ]
367 : : }
368 : : else
369 : : {
370 : : OSL_ASSERT(eType>=0 && size_t(eType)<maIcons.size());
371 : : }
372 : 4030 : }
373 : :
374 : :
375 : :
376 : :
377 : : } } } // end of namespace ::sd::slidesorter::view
378 : :
379 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|