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 "toolpaneldrawer.hxx"
22 : #include "toolpaneldrawerpeer.hxx"
23 : #include <svtools/svtresid.hxx>
24 : #include <svtools/svtools.hrc>
25 :
26 : #include <com/sun/star/accessibility/AccessibleRole.hpp>
27 :
28 : #include <vcl/lineinfo.hxx>
29 : #include <vcl/image.hxx>
30 : #include <vcl/svapp.hxx>
31 : #include <vcl/vclevent.hxx>
32 : #include <vcl/settings.hxx>
33 :
34 :
35 : namespace svt
36 : {
37 :
38 :
39 : using ::com::sun::star::uno::Reference;
40 : using ::com::sun::star::awt::XWindowPeer;
41 : namespace AccessibleRole = ::com::sun::star::accessibility::AccessibleRole;
42 :
43 : static const int s_nIndentationWidth = 16;
44 :
45 :
46 : //= DrawerVisualization
47 :
48 :
49 0 : DrawerVisualization::DrawerVisualization( ToolPanelDrawer& i_rParent )
50 : :Window( &i_rParent )
51 0 : ,m_rDrawer( i_rParent )
52 : {
53 0 : SetMouseTransparent( true );
54 0 : Show();
55 0 : SetAccessibleRole( AccessibleRole::LABEL );
56 0 : }
57 :
58 :
59 0 : void DrawerVisualization::Paint(vcl::RenderContext& rRenderContext, const Rectangle& i_rBoundingBox)
60 : {
61 0 : Window::Paint(rRenderContext, i_rBoundingBox);
62 0 : m_rDrawer.Paint(rRenderContext);
63 0 : }
64 :
65 :
66 : //= ToolPanelDrawer
67 :
68 :
69 0 : ToolPanelDrawer::ToolPanelDrawer( vcl::Window& i_rParent, const OUString& i_rTitle )
70 : :Window( &i_rParent, WB_TABSTOP )
71 : ,m_pPaintDevice( VclPtr<VirtualDevice>::Create( *this ) )
72 : ,m_aVisualization( VclPtr<DrawerVisualization>::Create(*this) )
73 : ,m_bFocused( false )
74 0 : ,m_bExpanded( false )
75 : {
76 0 : EnableMapMode( false );
77 0 : SetBackground( Wallpaper() );
78 0 : SetPointer( PointerStyle::RefHand );
79 :
80 0 : SetAccessibleRole( AccessibleRole::LIST_ITEM );
81 :
82 0 : SetText( i_rTitle );
83 0 : SetAccessibleName( i_rTitle );
84 0 : SetAccessibleDescription( i_rTitle );
85 :
86 0 : m_aVisualization->SetAccessibleName( i_rTitle );
87 0 : m_aVisualization->SetAccessibleDescription( i_rTitle );
88 0 : }
89 :
90 0 : ToolPanelDrawer::~ToolPanelDrawer()
91 : {
92 0 : disposeOnce();
93 0 : }
94 :
95 0 : void ToolPanelDrawer::dispose()
96 : {
97 0 : m_aVisualization.disposeAndClear();
98 0 : vcl::Window::dispose();
99 0 : }
100 :
101 0 : long ToolPanelDrawer::GetPreferredHeightPixel() const
102 : {
103 0 : Rectangle aTitleBarBox( impl_calcTitleBarBox( impl_calcTextBoundingBox() ) );
104 0 : return aTitleBarBox.GetHeight();
105 : }
106 :
107 :
108 0 : void ToolPanelDrawer::Paint(vcl::RenderContext& rRenderContext)
109 : {
110 0 : m_pPaintDevice->SetMapMode(rRenderContext.GetMapMode());
111 0 : m_pPaintDevice->SetOutputSize(rRenderContext.GetOutputSizePixel());
112 0 : m_pPaintDevice->SetSettings(rRenderContext.GetSettings());
113 0 : m_pPaintDevice->SetDrawMode(rRenderContext.GetDrawMode());
114 :
115 0 : const Rectangle aTextBox(impl_calcTextBoundingBox());
116 0 : impl_paintBackground(impl_calcTitleBarBox(aTextBox));
117 :
118 0 : Rectangle aFocusBox(impl_paintExpansionIndicator(aTextBox));
119 :
120 0 : m_pPaintDevice->DrawText(aTextBox, GetText(), impl_getTextStyle());
121 :
122 0 : aFocusBox.Union(aTextBox);
123 0 : aFocusBox.Left() += 2;
124 0 : impl_paintFocusIndicator(aFocusBox);
125 :
126 0 : rRenderContext.DrawOutDev(Point(), GetOutputSizePixel(), Point(), GetOutputSizePixel(), *m_pPaintDevice);
127 0 : }
128 :
129 :
130 0 : Rectangle ToolPanelDrawer::impl_paintExpansionIndicator( const Rectangle& i_rTextBox )
131 : {
132 0 : Rectangle aExpansionIndicatorArea;
133 :
134 0 : Image aImage( impl_getExpansionIndicator() );
135 0 : const int nHeight( aImage.GetSizePixel().Height() );
136 0 : if ( nHeight > 0 )
137 : {
138 : Point aPosition(
139 : 0,
140 0 : i_rTextBox.Top() + ( GetTextHeight() - nHeight ) / 2
141 0 : );
142 0 : m_pPaintDevice->DrawImage( aPosition, aImage );
143 :
144 0 : aExpansionIndicatorArea = Rectangle( aPosition, aImage.GetSizePixel() );
145 : }
146 :
147 0 : return aExpansionIndicatorArea;
148 : }
149 :
150 :
151 0 : Image ToolPanelDrawer::impl_getExpansionIndicator() const
152 : {
153 0 : sal_uInt16 nResourceId = 0;
154 0 : if ( m_bExpanded )
155 0 : nResourceId = IMG_TRIANGLE_DOWN;
156 : else
157 0 : nResourceId = IMG_TRIANGLE_RIGHT;
158 0 : return Image( SvtResId( nResourceId ) );
159 : }
160 :
161 :
162 0 : DrawTextFlags ToolPanelDrawer::impl_getTextStyle() const
163 : {
164 : const DrawTextFlags nBasicStyle = DrawTextFlags::Left
165 : | DrawTextFlags::Top
166 0 : | DrawTextFlags::WordBreak;
167 :
168 0 : if ( IsEnabled() )
169 0 : return nBasicStyle;
170 :
171 0 : return nBasicStyle | DrawTextFlags::Disable;
172 : }
173 :
174 :
175 0 : void ToolPanelDrawer::impl_paintBackground( const Rectangle& i_rTitleBarBox )
176 : {
177 0 : m_pPaintDevice->SetFillColor( GetSettings().GetStyleSettings().GetDialogColor() );
178 0 : m_pPaintDevice->DrawRect( i_rTitleBarBox );
179 :
180 0 : m_pPaintDevice->SetFillColor();
181 0 : m_pPaintDevice->SetLineColor( GetSettings().GetStyleSettings().GetLightColor() );
182 0 : m_pPaintDevice->DrawLine( i_rTitleBarBox.TopLeft(), i_rTitleBarBox.TopRight() );
183 0 : m_pPaintDevice->DrawLine( i_rTitleBarBox.TopLeft(), i_rTitleBarBox.BottomLeft() );
184 :
185 0 : m_pPaintDevice->SetLineColor( GetSettings().GetStyleSettings().GetShadowColor() );
186 0 : m_pPaintDevice->DrawLine( i_rTitleBarBox.BottomLeft(), i_rTitleBarBox.BottomRight() );
187 0 : m_pPaintDevice->DrawLine( i_rTitleBarBox.TopRight(), i_rTitleBarBox.BottomRight() );
188 0 : }
189 :
190 :
191 0 : void ToolPanelDrawer::impl_paintFocusIndicator( const Rectangle& i_rTextBox )
192 : {
193 0 : if ( m_bFocused )
194 : {
195 0 : const Rectangle aTextPixelBox( m_pPaintDevice->LogicToPixel( i_rTextBox ) );
196 :
197 0 : m_pPaintDevice->EnableMapMode( false );
198 0 : m_pPaintDevice->SetFillColor();
199 :
200 0 : Rectangle aBox( i_rTextBox );
201 0 : aBox.Top() -= 1;
202 0 : aBox.Bottom() += 1;
203 :
204 0 : m_pPaintDevice->DrawRect( aTextPixelBox );
205 :
206 0 : LineInfo aDottedStyle( LINE_DASH );
207 0 : aDottedStyle.SetDashCount( 0 );
208 0 : aDottedStyle.SetDotCount( 1 );
209 0 : aDottedStyle.SetDotLen( 1 );
210 0 : aDottedStyle.SetDistance( 1 );
211 :
212 0 : m_pPaintDevice->SetLineColor( COL_BLACK );
213 0 : m_pPaintDevice->DrawPolyLine( Polygon( aTextPixelBox ), aDottedStyle );
214 0 : m_pPaintDevice->EnableMapMode( false );
215 : }
216 : else
217 0 : HideFocus();
218 0 : }
219 :
220 :
221 0 : void ToolPanelDrawer::GetFocus()
222 : {
223 0 : m_bFocused = true;
224 0 : Invalidate();
225 0 : }
226 :
227 :
228 0 : void ToolPanelDrawer::LoseFocus()
229 : {
230 0 : m_bFocused = false;
231 0 : Invalidate();
232 0 : }
233 :
234 :
235 0 : void ToolPanelDrawer::Resize()
236 : {
237 0 : Window::Resize();
238 0 : m_aVisualization->SetPosSizePixel( Point(), GetOutputSizePixel() );
239 0 : }
240 :
241 :
242 0 : void ToolPanelDrawer::MouseButtonDown( const MouseEvent& i_rMouseEvent )
243 : {
244 : // consume this event, and do not forward to the base class - it would sent a NotifyEvent, which in turn, when
245 : // we live in a DockingWindow, would start undocking
246 : (void)i_rMouseEvent;
247 0 : }
248 :
249 0 : void ToolPanelDrawer::ApplySettings(vcl::RenderContext& rRenderContext)
250 : {
251 0 : const StyleSettings& rStyleSettings(rRenderContext.GetSettings().GetStyleSettings());
252 0 : ApplyControlFont(rRenderContext, rStyleSettings.GetAppFont());
253 0 : ApplyControlForeground(rRenderContext, rStyleSettings.GetButtonTextColor());
254 0 : rRenderContext.SetTextFillColor();
255 0 : }
256 :
257 0 : void ToolPanelDrawer::DataChanged( const DataChangedEvent& i_rEvent )
258 : {
259 0 : Window::DataChanged( i_rEvent );
260 :
261 0 : switch ( i_rEvent.GetType() )
262 : {
263 : case DataChangedEventType::SETTINGS:
264 0 : if ( !( i_rEvent.GetFlags() & AllSettingsFlags::STYLE ) )
265 0 : break;
266 0 : SetSettings( Application::GetSettings() );
267 0 : m_pPaintDevice.reset( VclPtr<VirtualDevice>::Create( *this ) );
268 :
269 : // fall through.
270 :
271 : case DataChangedEventType::FONTS:
272 : case DataChangedEventType::FONTSUBSTITUTION:
273 : {
274 0 : const StyleSettings& rStyleSettings( GetSettings().GetStyleSettings() );
275 0 : ApplyControlFont(*this, rStyleSettings.GetAppFont());
276 0 : ApplyControlForeground(*this, rStyleSettings.GetButtonTextColor());
277 0 : SetTextFillColor();
278 0 : Invalidate();
279 : }
280 0 : break;
281 0 : default: break;
282 : }
283 0 : }
284 :
285 :
286 0 : Reference< XWindowPeer > ToolPanelDrawer::GetComponentInterface( bool i_bCreate )
287 : {
288 0 : Reference< XWindowPeer > xWindowPeer( Window::GetComponentInterface( false ) );
289 0 : if ( !xWindowPeer.is() && i_bCreate )
290 : {
291 0 : xWindowPeer.set( new ToolPanelDrawerPeer() );
292 0 : SetComponentInterface( xWindowPeer );
293 : }
294 0 : return xWindowPeer;
295 : }
296 :
297 :
298 0 : Rectangle ToolPanelDrawer::impl_calcTextBoundingBox() const
299 : {
300 0 : vcl::Font aFont( GetFont() );
301 0 : if ( m_bExpanded )
302 0 : aFont.SetWeight( m_bExpanded ? WEIGHT_BOLD : WEIGHT_NORMAL );
303 0 : m_pPaintDevice->SetFont( aFont );
304 :
305 0 : int nAvailableWidth = m_pPaintDevice->GetTextWidth( GetText() );
306 :
307 : Rectangle aTextBox(
308 : Point(),
309 : Size(
310 : nAvailableWidth,
311 0 : GetSettings().GetStyleSettings().GetTitleHeight()
312 : )
313 0 : );
314 0 : aTextBox.Top() += ( aTextBox.GetHeight() - GetTextHeight() ) / 2;
315 0 : aTextBox.Left() += s_nIndentationWidth;
316 0 : aTextBox.Right() -= 1;
317 :
318 0 : aTextBox = m_pPaintDevice->GetTextRect( aTextBox, GetText(), impl_getTextStyle() );
319 0 : return aTextBox;
320 : }
321 :
322 :
323 0 : Rectangle ToolPanelDrawer::impl_calcTitleBarBox( const Rectangle& i_rTextBox ) const
324 : {
325 0 : Rectangle aTitleBarBox( i_rTextBox );
326 0 : aTitleBarBox.Bottom() += aTitleBarBox.Top();
327 0 : aTitleBarBox.Top() = 0;
328 0 : aTitleBarBox.Left() = 0;
329 :
330 0 : const long nWidth = GetOutputSizePixel().Width();
331 0 : if ( aTitleBarBox.GetWidth() < nWidth )
332 0 : aTitleBarBox.Right() = nWidth - 1;
333 :
334 0 : return aTitleBarBox;
335 : }
336 :
337 :
338 0 : void ToolPanelDrawer::SetExpanded( const bool i_bExpanded )
339 : {
340 0 : if ( m_bExpanded != i_bExpanded )
341 : {
342 0 : m_bExpanded = i_bExpanded;
343 0 : CallEventListeners( m_bExpanded ? VCLEVENT_ITEM_EXPANDED : VCLEVENT_ITEM_COLLAPSED );
344 0 : Invalidate();
345 : }
346 0 : }
347 :
348 :
349 : } // namespace svt
350 :
351 :
352 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|