Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include "taskpane/TitleBar.hxx"
22 :
23 : #include "ControlContainerDescriptor.hxx"
24 : #include "tools/IconCache.hxx"
25 : #include "AccessibleTreeNode.hxx"
26 : #include <vcl/decoview.hxx>
27 : #include <vcl/window.hxx>
28 : #include <vcl/virdev.hxx>
29 : #include <osl/mutex.hxx>
30 : #include <vcl/svapp.hxx>
31 : #include "sdresid.hxx"
32 : #include <vcl/bitmap.hxx>
33 : #include <vcl/lineinfo.hxx>
34 : #include <vcl/bitmapex.hxx>
35 : #include <tools/color.hxx>
36 : #include <svx/xdash.hxx>
37 : #include <svl/itemset.hxx>
38 : #include <svx/xlndsit.hxx>
39 : #include <svx/xlineit0.hxx>
40 : #include <svx/svdobj.hxx>
41 : #include <svx/svdpool.hxx>
42 : #include <svtools/colorcfg.hxx>
43 : #include <svx/xlnclit.hxx>
44 : #include <svx/xfillit0.hxx>
45 : #include "res_bmp.hrc"
46 :
47 :
48 : namespace sd { namespace toolpanel {
49 :
50 : const int TitleBar::snIndentationWidth = 16;
51 :
52 0 : TitleBar::TitleBar ( ::Window* pParent, const String& rsTitle, TitleBarType eType, bool bIsExpandable)
53 : : ::Window (pParent, WB_TABSTOP)
54 : , TreeNode(this)
55 : , meType(eType)
56 : , msTitle(rsTitle)
57 : , mbExpanded(false)
58 : , mbFocused(false)
59 0 : , mpDevice(new VirtualDevice (*this))
60 0 : , mbIsExpandable (bIsExpandable)
61 : {
62 0 : EnableMapMode (sal_False);
63 :
64 0 : SetBackground (Wallpaper());
65 :
66 : // Change the mouse pointer shape so that it acts as a mouse over effect.
67 0 : switch (meType)
68 : {
69 : case TBT_SUB_CONTROL_HEADLINE:
70 0 : if (mbIsExpandable)
71 0 : SetPointer (POINTER_REFHAND);
72 0 : break;
73 : }
74 0 : }
75 :
76 :
77 :
78 :
79 0 : TitleBar::~TitleBar (void)
80 : {
81 0 : }
82 :
83 :
84 :
85 :
86 0 : Size TitleBar::GetPreferredSize (void)
87 : {
88 0 : int nWidth = GetOutputSizePixel().Width();
89 : Rectangle aTitleBarBox (
90 : CalculateTitleBarBox(
91 : CalculateTextBoundingBox(nWidth, true),
92 0 : nWidth));
93 :
94 0 : return aTitleBarBox.GetSize();
95 : }
96 :
97 :
98 :
99 :
100 0 : sal_Int32 TitleBar::GetPreferredWidth (sal_Int32 )
101 : {
102 : Rectangle aTitleBarBox (
103 : CalculateTitleBarBox(
104 : CalculateTextBoundingBox(0, true),
105 0 : 0));
106 0 : return aTitleBarBox.GetWidth();
107 : }
108 :
109 :
110 :
111 :
112 0 : sal_Int32 TitleBar::GetPreferredHeight (sal_Int32 nWidth)
113 : {
114 : Rectangle aTitleBarBox (
115 : CalculateTitleBarBox(
116 : CalculateTextBoundingBox(nWidth, true),
117 0 : nWidth));
118 :
119 0 : return aTitleBarBox.GetHeight();
120 : }
121 :
122 :
123 :
124 :
125 0 : bool TitleBar::IsResizable (void)
126 : {
127 0 : return true;
128 : }
129 :
130 :
131 :
132 :
133 0 : ::Window* TitleBar::GetWindow (void)
134 : {
135 0 : return this;
136 : }
137 :
138 :
139 :
140 :
141 0 : sal_Int32 TitleBar::GetMinimumWidth (void)
142 : {
143 0 : return 20;
144 : }
145 :
146 :
147 :
148 :
149 0 : void TitleBar::Paint (const Rectangle& rBoundingBox)
150 : {
151 0 : mpDevice->SetMapMode(GetMapMode());
152 0 : mpDevice->SetOutputSize (GetOutputSizePixel());
153 0 : mpDevice->SetSettings(GetSettings());
154 0 : mpDevice->SetDrawMode(GetDrawMode());
155 :
156 0 : switch (meType)
157 : {
158 : case TBT_SUB_CONTROL_HEADLINE:
159 0 : PaintSubPanelHeadLineBar ();
160 0 : break;
161 : }
162 :
163 : DrawOutDev (
164 : Point(0,0),
165 0 : GetOutputSizePixel(),
166 : Point(0,0),
167 0 : GetOutputSizePixel(),
168 0 : *mpDevice);
169 :
170 0 : ::Window::Paint (rBoundingBox);
171 0 : }
172 :
173 :
174 :
175 :
176 0 : bool TitleBar::Expand (bool bFlag)
177 : {
178 0 : bool bExpansionStateChanged (bFlag!=IsExpanded());
179 0 : mbExpanded = bFlag;
180 0 : Invalidate ();
181 0 : return bExpansionStateChanged;
182 : }
183 :
184 :
185 :
186 :
187 0 : bool TitleBar::IsExpanded (void) const
188 : {
189 0 : return mbExpanded;
190 : }
191 :
192 :
193 0 : void TitleBar::SetEnabledState(bool bFlag)
194 : {
195 0 : if(bFlag)
196 0 : Enable();
197 : else
198 0 : Disable();
199 0 : Invalidate ();
200 0 : }
201 :
202 :
203 :
204 :
205 0 : void TitleBar::GetFocus()
206 : {
207 0 : mbFocused = true;
208 0 : Invalidate();
209 0 : }
210 :
211 :
212 :
213 :
214 0 : void TitleBar::LoseFocus()
215 : {
216 0 : mbFocused = false;
217 0 : Invalidate();
218 0 : }
219 :
220 :
221 :
222 :
223 0 : bool TitleBar::HasExpansionIndicator (void) const
224 : {
225 0 : bool bHasExpansionIndicator (false);
226 0 : if (mbIsExpandable)
227 : {
228 0 : switch (meType)
229 : {
230 : case TBT_SUB_CONTROL_HEADLINE:
231 0 : bHasExpansionIndicator = true;
232 0 : break;
233 : }
234 : }
235 0 : return bHasExpansionIndicator;
236 : }
237 :
238 :
239 :
240 :
241 0 : Image TitleBar::GetExpansionIndicator (void) const
242 : {
243 0 : Image aIndicator;
244 0 : if (mbIsExpandable)
245 : {
246 0 : sal_uInt16 nResourceId = 0;
247 0 : switch (meType)
248 : {
249 : case TBT_SUB_CONTROL_HEADLINE:
250 0 : if (mbExpanded)
251 0 : nResourceId = BMP_COLLAPSE;
252 : else
253 0 : nResourceId = BMP_EXPAND;
254 :
255 0 : aIndicator = IconCache::Instance().GetIcon(nResourceId);
256 0 : break;
257 : }
258 : }
259 :
260 0 : return aIndicator;
261 : }
262 :
263 :
264 :
265 :
266 0 : void TitleBar::PaintSubPanelHeadLineBar (void)
267 : {
268 0 : int nWidth (GetOutputSizePixel().Width());
269 0 : Rectangle aTextBox (CalculateTextBoundingBox (nWidth, true));
270 :
271 0 : Rectangle aTitleBarBox (CalculateTitleBarBox(aTextBox, nWidth));
272 0 : int nVerticalOffset = -aTitleBarBox.Top();
273 0 : aTitleBarBox.Top() += nVerticalOffset;
274 0 : aTitleBarBox.Bottom() += nVerticalOffset;
275 0 : aTextBox.Top() += nVerticalOffset;
276 0 : aTextBox.Bottom() += nVerticalOffset;
277 :
278 0 : PaintBackground (aTitleBarBox);
279 0 : Rectangle aFocusBox (PaintExpansionIndicator (aTextBox));
280 0 : PaintText (aTextBox);
281 :
282 0 : aFocusBox.Union (aTextBox);
283 0 : aFocusBox.Left() -= 2;
284 0 : aFocusBox.Right() += 1;
285 0 : PaintFocusIndicator (aFocusBox);
286 0 : }
287 :
288 :
289 :
290 :
291 0 : void TitleBar::PaintFocusIndicator (const Rectangle& rTextBox)
292 : {
293 0 : if (mbFocused)
294 : {
295 0 : Rectangle aTextPixelBox (mpDevice->LogicToPixel (rTextBox));
296 0 : mpDevice->EnableMapMode (sal_False);
297 0 : Rectangle aBox (rTextBox);
298 0 : aBox.Top() -= 1;
299 0 : aBox.Bottom() += 1;
300 :
301 0 : mpDevice->SetFillColor ();
302 :
303 0 : mpDevice->DrawRect (aTextPixelBox);
304 :
305 0 : LineInfo aDottedStyle (LINE_DASH);
306 0 : aDottedStyle.SetDashCount (0);
307 0 : aDottedStyle.SetDotCount (1);
308 0 : aDottedStyle.SetDotLen (1);
309 0 : aDottedStyle.SetDistance (1);
310 :
311 0 : mpDevice->SetLineColor (COL_BLACK);
312 0 : mpDevice->DrawPolyLine (Polygon(aTextPixelBox), aDottedStyle);
313 0 : mpDevice->EnableMapMode (sal_False);
314 : }
315 : else
316 0 : HideFocus ();
317 0 : }
318 :
319 :
320 :
321 :
322 0 : Rectangle TitleBar::PaintExpansionIndicator (const Rectangle& rTextBox)
323 : {
324 0 : Rectangle aExpansionIndicatorArea;
325 :
326 0 : if (HasExpansionIndicator())
327 : {
328 0 : Image aImage = GetExpansionIndicator();
329 0 : int nHeight (aImage.GetSizePixel().Height());
330 0 : if (nHeight > 0)
331 : {
332 : Point aPosition (
333 : 0,
334 0 : rTextBox.Top() + (GetTextHeight() - nHeight) / 2);
335 0 : if (meType == TBT_SUB_CONTROL_HEADLINE)
336 0 : aPosition.X() += 3;
337 0 : mpDevice->DrawImage (aPosition, aImage);
338 :
339 : aExpansionIndicatorArea = Rectangle (
340 0 : aPosition, aImage.GetSizePixel());
341 0 : }
342 : }
343 :
344 0 : return aExpansionIndicatorArea;
345 : }
346 :
347 :
348 :
349 :
350 0 : void TitleBar::PaintText (const Rectangle& rTextBox)
351 : {
352 0 : mpDevice->DrawText (rTextBox, msTitle, GetTextStyle());
353 0 : }
354 :
355 :
356 :
357 :
358 0 : sal_uInt16 TitleBar::GetTextStyle (void)
359 : {
360 0 : if(IsEnabled())
361 : {
362 : return TEXT_DRAW_LEFT
363 : | TEXT_DRAW_TOP
364 : | TEXT_DRAW_MULTILINE
365 0 : | TEXT_DRAW_WORDBREAK;
366 : }
367 : else
368 : {
369 0 : return TEXT_DRAW_DISABLE;
370 : }
371 : }
372 :
373 :
374 :
375 0 : void TitleBar::PaintBackground (const Rectangle& rTitleBarBox)
376 : {
377 : // Fill a slightly rounded rectangle.
378 0 : switch (meType)
379 : {
380 : case TBT_SUB_CONTROL_HEADLINE:
381 : {
382 0 : Color aColor (GetSettings().GetStyleSettings().GetDialogColor());
383 0 : if (mbExpanded)
384 : {
385 : // Make the color a little bit darker.
386 0 : aColor.SetRed(sal_uInt8(((sal_uInt16)aColor.GetRed()) * 8 / 10));
387 0 : aColor.SetGreen(sal_uInt8(((sal_uInt16)aColor.GetGreen()) * 8 / 10));
388 0 : aColor.SetBlue(sal_uInt8(((sal_uInt16)aColor.GetBlue()) * 8 / 10));
389 : }
390 :
391 0 : mpDevice->SetFillColor (aColor);
392 0 : mpDevice->SetLineColor ();
393 0 : mpDevice->DrawRect (rTitleBarBox);
394 :
395 : // Erase the four corner pixels to make the rectangle appear
396 : // rounded.
397 0 : mpDevice->SetLineColor (
398 0 : GetSettings().GetStyleSettings().GetWindowColor());
399 0 : mpDevice->DrawPixel (
400 0 : rTitleBarBox.TopLeft());
401 0 : mpDevice->DrawPixel (
402 0 : Point(rTitleBarBox.Right(), rTitleBarBox.Top()));
403 0 : mpDevice->DrawPixel (
404 0 : Point(rTitleBarBox.Left(), rTitleBarBox.Bottom()));
405 0 : mpDevice->DrawPixel (
406 0 : Point(rTitleBarBox.Right(), rTitleBarBox.Bottom()));
407 : }
408 0 : break;
409 : }
410 0 : }
411 :
412 :
413 :
414 :
415 0 : Rectangle TitleBar::CalculateTextBoundingBox (
416 : int nAvailableWidth,
417 : bool bEmphasizeExpanded)
418 : {
419 : // Show the title of expanded controls in bold font.
420 0 : const Font& rOriginalFont (GetFont());
421 0 : Font aFont (rOriginalFont);
422 0 : if (bEmphasizeExpanded && mbExpanded)
423 0 : aFont.SetWeight (WEIGHT_BOLD);
424 : else
425 0 : aFont.SetWeight (WEIGHT_NORMAL);
426 0 : mpDevice->SetFont (aFont);
427 :
428 : // Use the natural width of the text when no width is given.
429 0 : if (nAvailableWidth == 0)
430 0 : nAvailableWidth = GetTextWidth (msTitle);
431 :
432 : Rectangle aTextBox (
433 : Point(0,0),
434 : Size (nAvailableWidth,
435 0 : GetSettings().GetStyleSettings().GetTitleHeight()));
436 0 : aTextBox.Top() += (aTextBox.GetHeight() - GetTextHeight()) / 2;
437 0 : if (HasExpansionIndicator())
438 0 : aTextBox.Left() += snIndentationWidth;
439 : else
440 0 : aTextBox.Left() += 3;
441 0 : aTextBox.Right() -= 1;
442 :
443 0 : aTextBox = mpDevice->GetTextRect (aTextBox, msTitle, GetTextStyle());
444 :
445 0 : return aTextBox;
446 : }
447 :
448 :
449 :
450 :
451 0 : Rectangle TitleBar::CalculateTitleBarBox (
452 : const Rectangle& rTextBox,
453 : int nWidth)
454 : {
455 0 : Rectangle aTitleBarBox (rTextBox);
456 :
457 0 : switch (meType)
458 : {
459 : case TBT_SUB_CONTROL_HEADLINE:
460 0 : aTitleBarBox.Top() -= 3;
461 0 : aTitleBarBox.Bottom() += 3;
462 0 : break;
463 :
464 : }
465 0 : aTitleBarBox.Left() = 0;
466 0 : if (aTitleBarBox.GetWidth() < nWidth)
467 0 : aTitleBarBox.Right() = nWidth-1;
468 :
469 0 : return aTitleBarBox;
470 : }
471 :
472 :
473 :
474 :
475 0 : void TitleBar::MouseMove (const MouseEvent& )
476 : {
477 0 : }
478 :
479 :
480 :
481 :
482 0 : void TitleBar::MouseButtonDown (const MouseEvent& )
483 : {
484 : // Do not forward to parent window so that the mouse button handler of
485 : // the docking window is not invoked.
486 0 : }
487 :
488 :
489 :
490 :
491 0 : void TitleBar::MouseButtonUp (const MouseEvent& )
492 : {
493 : // Do not forward to parent window so that the mouse button handler of
494 : // the docking window is not invoked.
495 0 : }
496 :
497 :
498 :
499 :
500 0 : void TitleBar::DataChanged (const DataChangedEvent& rEvent)
501 : {
502 0 : ::Window::DataChanged (rEvent);
503 :
504 0 : switch (rEvent.GetType())
505 : {
506 : case DATACHANGED_SETTINGS:
507 0 : if ((rEvent.GetFlags() & SETTINGS_STYLE) == 0)
508 0 : break;
509 0 : SetSettings(Application::GetSettings());
510 0 : mpDevice.reset(new VirtualDevice (*this));
511 :
512 : // fall through.
513 :
514 : case DATACHANGED_FONTS:
515 : case DATACHANGED_FONTSUBSTITUTION:
516 : {
517 0 : const StyleSettings& rStyleSettings (GetSettings().GetStyleSettings());
518 :
519 : // Font.
520 0 : Font aFont = rStyleSettings.GetAppFont();
521 0 : if (IsControlFont())
522 0 : aFont.Merge(GetControlFont());
523 0 : SetZoomedPointFont(aFont);
524 :
525 : // Color.
526 0 : Color aColor;
527 0 : if (IsControlForeground())
528 0 : aColor = GetControlForeground();
529 : else
530 0 : aColor = rStyleSettings.GetButtonTextColor();
531 0 : SetTextColor(aColor);
532 0 : SetTextFillColor();
533 :
534 0 : Resize();
535 0 : Invalidate();
536 : }
537 0 : break;
538 : }
539 0 : }
540 :
541 :
542 :
543 :
544 0 : String TitleBar::GetTitle (void) const
545 : {
546 0 : return msTitle;
547 : }
548 :
549 :
550 :
551 :
552 : ::com::sun::star::uno::Reference<
553 0 : ::com::sun::star::accessibility::XAccessible > TitleBar::CreateAccessibleObject (
554 : const ::com::sun::star::uno::Reference<
555 : ::com::sun::star::accessibility::XAccessible>& )
556 : {
557 : return new ::accessibility::AccessibleTreeNode(
558 : *this,
559 : GetTitle(),
560 : GetTitle(),
561 0 : ::com::sun::star::accessibility::AccessibleRole::LABEL);
562 : }
563 :
564 :
565 : } } // end of namespace ::sd::toolpanel
566 :
567 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|