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 : #include <vcl/settings.hxx>
21 : #include <vcl/outdev.hxx>
22 : #include <vcl/decoview.hxx>
23 : #include <vcl/window.hxx>
24 : #include <vcl/ctrl.hxx>
25 :
26 : #define BUTTON_DRAW_FLATTEST (DrawButtonFlags::Flat | \
27 : DrawButtonFlags::Pressed | \
28 : DrawButtonFlags::Checked | \
29 : DrawButtonFlags::Highlight)
30 :
31 : using namespace std;
32 :
33 : namespace {
34 :
35 59889 : long AdjustRectToSquare( Rectangle &rRect )
36 : {
37 59889 : const long nWidth = rRect.GetWidth();
38 59889 : const long nHeight = rRect.GetHeight();
39 59889 : long nSide = std::min( nWidth, nHeight );
40 :
41 59889 : if ( nSide && !(nSide & 1) )
42 : {
43 : // we prefer an odd size
44 58482 : --nSide;
45 : }
46 :
47 : // Make the rectangle a square
48 59889 : rRect.SetSize( Size( nSide, nSide ) );
49 :
50 : // and place it at the center of the original rectangle
51 59889 : rRect.Move( (nWidth-nSide)/2, (nHeight-nSide)/2 );
52 :
53 59889 : return nSide;
54 : }
55 :
56 59889 : void ImplDrawSymbol( OutputDevice* pDev, Rectangle nRect, const SymbolType eType )
57 : {
58 59889 : const long nSide = AdjustRectToSquare( nRect );
59 :
60 59889 : if ( !nSide ) return;
61 59889 : if ( nSide==1 )
62 : {
63 0 : pDev->DrawPixel( Point( nRect.Left(), nRect.Top() ) );
64 0 : return;
65 : }
66 :
67 : // Precalculate some values
68 59889 : const long n2 = nSide/2;
69 59889 : const long n4 = (n2+1)/2;
70 59889 : const long n8 = (n4+1)/2;
71 59889 : const Point aCenter = nRect.Center();
72 :
73 59889 : switch ( eType )
74 : {
75 : case SymbolType::ARROW_UP:
76 0 : pDev->DrawPixel( Point( aCenter.X(), nRect.Top() ) );
77 0 : for ( long i=1; i <= n2; ++i )
78 : {
79 0 : ++nRect.Top();
80 0 : pDev->DrawLine( Point( aCenter.X()-i, nRect.Top() ),
81 0 : Point( aCenter.X()+i, nRect.Top() ) );
82 : }
83 0 : pDev->DrawRect( Rectangle( aCenter.X()-n8, nRect.Top()+1,
84 0 : aCenter.X()+n8, nRect.Bottom() ) );
85 0 : break;
86 :
87 : case SymbolType::ARROW_DOWN:
88 0 : pDev->DrawPixel( Point( aCenter.X(), nRect.Bottom() ) );
89 0 : for ( long i=1; i <= n2; ++i )
90 : {
91 0 : --nRect.Bottom();
92 0 : pDev->DrawLine( Point( aCenter.X()-i, nRect.Bottom() ),
93 0 : Point( aCenter.X()+i, nRect.Bottom() ) );
94 : }
95 0 : pDev->DrawRect( Rectangle( aCenter.X()-n8, nRect.Top(),
96 0 : aCenter.X()+n8, nRect.Bottom()-1 ) );
97 0 : break;
98 :
99 : case SymbolType::ARROW_LEFT:
100 0 : pDev->DrawPixel( Point( nRect.Left(), aCenter.Y() ) );
101 0 : for ( long i=1; i <= n2; ++i )
102 : {
103 0 : ++nRect.Left();
104 0 : pDev->DrawLine( Point( nRect.Left(), aCenter.Y()-i ),
105 0 : Point( nRect.Left(), aCenter.Y()+i ) );
106 : }
107 0 : pDev->DrawRect( Rectangle( nRect.Left()+1, aCenter.Y()-n8,
108 0 : nRect.Right(), aCenter.Y()+n8 ) );
109 0 : break;
110 :
111 : case SymbolType::ARROW_RIGHT:
112 0 : pDev->DrawPixel( Point( nRect.Right(), aCenter.Y() ) );
113 0 : for ( long i=1; i <= n2; ++i )
114 : {
115 0 : --nRect.Right();
116 0 : pDev->DrawLine( Point( nRect.Right(), aCenter.Y()-i ),
117 0 : Point( nRect.Right(), aCenter.Y()+i ) );
118 : }
119 0 : pDev->DrawRect( Rectangle( nRect.Left(), aCenter.Y()-n8,
120 0 : nRect.Right()-1, aCenter.Y()+n8 ) );
121 0 : break;
122 :
123 : case SymbolType::SPIN_UP:
124 23034 : nRect.Top() += n4;
125 23034 : pDev->DrawPixel( Point( aCenter.X(), nRect.Top() ) );
126 92109 : for ( long i=1; i <= n2; ++i )
127 : {
128 69075 : ++nRect.Top();
129 138150 : pDev->DrawLine( Point( aCenter.X()-i, nRect.Top() ),
130 207225 : Point( aCenter.X()+i, nRect.Top() ) );
131 : }
132 23034 : break;
133 :
134 : case SymbolType::SPIN_DOWN:
135 16570 : nRect.Bottom() -= n4;
136 16570 : pDev->DrawPixel( Point( aCenter.X(), nRect.Bottom() ) );
137 66461 : for ( long i=1; i <= n2; ++i )
138 : {
139 49891 : --nRect.Bottom();
140 99782 : pDev->DrawLine( Point( aCenter.X()-i, nRect.Bottom() ),
141 149673 : Point( aCenter.X()+i, nRect.Bottom() ) );
142 : }
143 16570 : break;
144 :
145 : case SymbolType::SPIN_LEFT:
146 : case SymbolType::FIRST:
147 : case SymbolType::PREV:
148 : case SymbolType::REVERSEPLAY:
149 13091 : nRect.Left() += n4;
150 13091 : if ( eType==SymbolType::FIRST )
151 : {
152 432 : pDev->DrawLine( Point( nRect.Left(), nRect.Top() ),
153 648 : Point( nRect.Left(), nRect.Bottom() ) );
154 216 : ++nRect.Left();
155 : }
156 13091 : pDev->DrawPixel( Point( nRect.Left(), aCenter.Y() ) );
157 54284 : for ( long i=1; i <= n2; ++i )
158 : {
159 41193 : ++nRect.Left();
160 82386 : pDev->DrawLine( Point( nRect.Left(), aCenter.Y()-i ),
161 123579 : Point( nRect.Left(), aCenter.Y()+i ) );
162 : }
163 13091 : break;
164 :
165 : case SymbolType::SPIN_RIGHT:
166 : case SymbolType::LAST:
167 : case SymbolType::NEXT:
168 : case SymbolType::PLAY:
169 6925 : nRect.Right() -= n4;
170 6925 : if ( eType==SymbolType::LAST )
171 : {
172 244 : pDev->DrawLine( Point( nRect.Right(), nRect.Top() ),
173 366 : Point( nRect.Right(), nRect.Bottom() ) );
174 122 : --nRect.Right();
175 : }
176 6925 : pDev->DrawPixel( Point( nRect.Right(), aCenter.Y() ) );
177 28902 : for ( long i=1; i <= n2; ++i )
178 : {
179 21977 : --nRect.Right();
180 43954 : pDev->DrawLine( Point( nRect.Right(), aCenter.Y()-i ),
181 65931 : Point( nRect.Right(), aCenter.Y()+i ) );
182 : }
183 6925 : break;
184 :
185 : case SymbolType::PAGEUP:
186 0 : pDev->DrawPixel( Point( aCenter.X(), nRect.Top() ) );
187 0 : pDev->DrawPixel( Point( aCenter.X(), nRect.Top()+n2 ) );
188 0 : for ( long i=1; i < n2; ++i )
189 : {
190 0 : ++nRect.Top();
191 0 : pDev->DrawLine( Point( aCenter.X()-i, nRect.Top() ),
192 0 : Point( aCenter.X()+i, nRect.Top() ) );
193 0 : pDev->DrawLine( Point( aCenter.X()-i, nRect.Top()+n2 ),
194 0 : Point( aCenter.X()+i, nRect.Top()+n2 ) );
195 : }
196 0 : break;
197 :
198 : case SymbolType::PAGEDOWN:
199 0 : pDev->DrawPixel( Point( aCenter.X(), nRect.Bottom() ) );
200 0 : pDev->DrawPixel( Point( aCenter.X(), nRect.Bottom()-n2 ) );
201 0 : for ( long i=1; i < n2; ++i )
202 : {
203 0 : --nRect.Bottom();
204 0 : pDev->DrawLine( Point( aCenter.X()-i, nRect.Bottom() ),
205 0 : Point( aCenter.X()+i, nRect.Bottom() ) );
206 0 : pDev->DrawLine( Point( aCenter.X()-i, nRect.Bottom()-n2 ),
207 0 : Point( aCenter.X()+i, nRect.Bottom()-n2 ) );
208 : }
209 0 : break;
210 :
211 : case SymbolType::RADIOCHECKMARK:
212 : case SymbolType::RECORD:
213 : {
214 : // Midpoint circle algorithm
215 3 : long x = 0;
216 3 : long y = n2;
217 3 : long p = 1 - n2;
218 : // Draw central line
219 3 : pDev->DrawLine( Point( aCenter.X(), aCenter.Y()-y ),
220 6 : Point( aCenter.X(), aCenter.Y()+y ) );
221 12 : while ( x<y )
222 : {
223 6 : if ( p>=0 )
224 : {
225 : // Draw vertical lines close to sides
226 6 : pDev->DrawLine( Point( aCenter.X()+y, aCenter.Y()-x ),
227 9 : Point( aCenter.X()+y, aCenter.Y()+x ) );
228 6 : pDev->DrawLine( Point( aCenter.X()-y, aCenter.Y()-x ),
229 9 : Point( aCenter.X()-y, aCenter.Y()+x ) );
230 3 : --y;
231 3 : p -= 2*y;
232 : }
233 6 : ++x;
234 6 : p += 2*x+1;
235 : // Draw vertical lines close to center
236 12 : pDev->DrawLine( Point( aCenter.X()-x, aCenter.Y()-y ),
237 18 : Point( aCenter.X()-x, aCenter.Y()+y ) );
238 12 : pDev->DrawLine( Point( aCenter.X()+x, aCenter.Y()-y ),
239 18 : Point( aCenter.X()+x, aCenter.Y()+y ) );
240 : }
241 : }
242 3 : break;
243 :
244 : case SymbolType::STOP:
245 0 : pDev->DrawRect( nRect );
246 0 : break;
247 :
248 : case SymbolType::PAUSE:
249 0 : pDev->DrawRect( Rectangle ( nRect.Left(), nRect.Top(),
250 0 : aCenter.X()-n8, nRect.Bottom() ) );
251 0 : pDev->DrawRect( Rectangle ( aCenter.X()+n8, nRect.Top(),
252 0 : nRect.Right(), nRect.Bottom() ) );
253 0 : break;
254 :
255 : case SymbolType::WINDSTART:
256 0 : pDev->DrawLine( Point( nRect.Left(), aCenter.Y()-n2+1 ),
257 0 : Point( nRect.Left(), aCenter.Y()+n2-1 ) );
258 0 : ++nRect.Left();
259 : // Intentional fall-through
260 : case SymbolType::WINDBACKWARD:
261 0 : pDev->DrawPixel( Point( nRect.Left(), aCenter.Y() ) );
262 0 : pDev->DrawPixel( Point( nRect.Left()+n2, aCenter.Y() ) );
263 0 : for ( long i=1; i < n2; ++i )
264 : {
265 0 : ++nRect.Left();
266 0 : pDev->DrawLine( Point( nRect.Left(), aCenter.Y()-i ),
267 0 : Point( nRect.Left(), aCenter.Y()+i ) );
268 0 : pDev->DrawLine( Point( nRect.Left()+n2, aCenter.Y()-i ),
269 0 : Point( nRect.Left()+n2, aCenter.Y()+i ) );
270 : }
271 0 : break;
272 :
273 : case SymbolType::WINDEND:
274 0 : pDev->DrawLine( Point( nRect.Right(), aCenter.Y()-n2+1 ),
275 0 : Point( nRect.Right(), aCenter.Y()+n2-1 ) );
276 0 : --nRect.Right();
277 : // Intentional fall-through
278 : case SymbolType::WINDFORWARD:
279 0 : pDev->DrawPixel( Point( nRect.Right(), aCenter.Y() ) );
280 0 : pDev->DrawPixel( Point( nRect.Right()-n2, aCenter.Y() ) );
281 0 : for ( long i=1; i < n2; ++i )
282 : {
283 0 : --nRect.Right();
284 0 : pDev->DrawLine( Point( nRect.Right(), aCenter.Y()-i ),
285 0 : Point( nRect.Right(), aCenter.Y()+i ) );
286 0 : pDev->DrawLine( Point( nRect.Right()-n2, aCenter.Y()-i ),
287 0 : Point( nRect.Right()-n2, aCenter.Y()+i ) );
288 : }
289 0 : break;
290 :
291 : case SymbolType::CLOSE:
292 0 : pDev->DrawLine( Point( nRect.Left(), nRect.Top() ),
293 0 : Point( nRect.Right(), nRect.Bottom() ) );
294 0 : pDev->DrawLine( Point( nRect.Left(), nRect.Bottom() ),
295 0 : Point( nRect.Right(), nRect.Top() ) );
296 0 : for ( long i=1; i<n8; ++i )
297 : {
298 0 : pDev->DrawLine( Point( nRect.Left()+i, nRect.Top() ),
299 0 : Point( nRect.Right(), nRect.Bottom()-i ) );
300 0 : pDev->DrawLine( Point( nRect.Left(), nRect.Top()+i ),
301 0 : Point( nRect.Right()-i, nRect.Bottom() ) );
302 0 : pDev->DrawLine( Point( nRect.Left()+i, nRect.Bottom() ),
303 0 : Point( nRect.Right(), nRect.Top()+i ) );
304 0 : pDev->DrawLine( Point( nRect.Left(), nRect.Bottom()-i ),
305 0 : Point( nRect.Right()-i, nRect.Top() ) );
306 : }
307 0 : break;
308 :
309 : case SymbolType::ROLLDOWN:
310 0 : pDev->DrawLine( Point( nRect.Left(), nRect.Top() ),
311 0 : Point( nRect.Left(), nRect.Bottom() ) );
312 0 : pDev->DrawLine( Point( nRect.Right(), nRect.Top() ),
313 0 : Point( nRect.Right(), nRect.Bottom() ) );
314 0 : pDev->DrawLine( Point( nRect.Left(), nRect.Bottom() ),
315 0 : Point( nRect.Right(), nRect.Bottom() ) );
316 : // Intentional fall-through
317 : case SymbolType::ROLLUP:
318 0 : pDev->DrawRect( Rectangle( nRect.Left(), nRect.Top(),
319 0 : nRect.Right(), nRect.Top()+n8 ) );
320 0 : break;
321 :
322 : case SymbolType::CHECKMARK:
323 : {
324 15 : long n3 = nSide/3;
325 15 : nRect.Top() -= n3/2;
326 15 : nRect.Bottom() -= n3/2;
327 : // #106953# never mirror checkmarks
328 15 : if ( pDev->HasMirroredGraphics() && pDev->IsRTLEnabled() )
329 : {
330 : // Draw a mirrored checkmark so that it looks "normal" in a
331 : // mirrored graphics device (double mirroring!)
332 0 : pDev->DrawLine( Point( nRect.Right(), nRect.Bottom()-n3 ),
333 0 : Point( nRect.Right()-n3, nRect.Bottom() ) );
334 0 : pDev->DrawLine( Point( nRect.Right()-n3, nRect.Bottom() ),
335 0 : Point( nRect.Left(), nRect.Top()+n3 ) );
336 0 : ++nRect.Top();
337 0 : ++nRect.Bottom();
338 0 : pDev->DrawLine( Point( nRect.Right(), nRect.Bottom()-n3 ),
339 0 : Point( nRect.Right()-n3, nRect.Bottom() ) );
340 0 : pDev->DrawLine( Point( nRect.Right()-n3, nRect.Bottom() ),
341 0 : Point( nRect.Left(), nRect.Top()+n3 ) );
342 : }
343 : else
344 : {
345 30 : pDev->DrawLine( Point( nRect.Left(), nRect.Bottom()-n3 ),
346 45 : Point( nRect.Left()+n3, nRect.Bottom() ) );
347 30 : pDev->DrawLine( Point( nRect.Left()+n3, nRect.Bottom() ),
348 45 : Point( nRect.Right(), nRect.Top()+n3 ) );
349 15 : ++nRect.Top();
350 15 : ++nRect.Bottom();
351 30 : pDev->DrawLine( Point( nRect.Left(), nRect.Bottom()-n3 ),
352 45 : Point( nRect.Left()+n3, nRect.Bottom() ) );
353 30 : pDev->DrawLine( Point( nRect.Left()+n3, nRect.Bottom() ),
354 45 : Point( nRect.Right(), nRect.Top()+n3 ) );
355 : }
356 : }
357 15 : break;
358 :
359 : case SymbolType::SPIN_UPDOWN:
360 0 : pDev->DrawPixel( Point( aCenter.X(), nRect.Top() ) );
361 0 : pDev->DrawPixel( Point( aCenter.X(), nRect.Bottom() ) );
362 0 : for ( long i=1; i < n2; ++i )
363 : {
364 0 : ++nRect.Top();
365 0 : --nRect.Bottom();
366 0 : pDev->DrawLine( Point( aCenter.X()-i, nRect.Top() ),
367 0 : Point( aCenter.X()+i, nRect.Top() ) );
368 0 : pDev->DrawLine( Point( aCenter.X()-i, nRect.Bottom() ),
369 0 : Point( aCenter.X()+i, nRect.Bottom() ) );
370 : }
371 0 : break;
372 :
373 : case SymbolType::FLOAT:
374 0 : nRect.Right() -= n4;
375 0 : nRect.Top() += n4+1;
376 0 : pDev->DrawRect( Rectangle( nRect.Left(), nRect.Top(),
377 0 : nRect.Right(), nRect.Top()+n8 ) );
378 0 : pDev->DrawLine( Point( nRect.Left(), nRect.Top()+n8 ),
379 0 : Point( nRect.Left(), nRect.Bottom() ) );
380 0 : pDev->DrawLine( Point( nRect.Left(), nRect.Bottom() ),
381 0 : Point( nRect.Right(), nRect.Bottom() ) );
382 0 : pDev->DrawLine( Point( nRect.Right(), nRect.Top()+n8 ),
383 0 : Point( nRect.Right(), nRect.Bottom() ) );
384 0 : nRect.Right() += n4;
385 0 : nRect.Top() -= n4+1;
386 0 : nRect.Left() += n4;
387 0 : nRect.Bottom() -= n4+1;
388 0 : pDev->DrawRect( Rectangle( nRect.Left(), nRect.Top(),
389 0 : nRect.Right(), nRect.Top()+n8 ) );
390 0 : pDev->DrawLine( Point( nRect.Left(), nRect.Top()+n8 ),
391 0 : Point( nRect.Left(), nRect.Bottom() ) );
392 0 : pDev->DrawLine( Point( nRect.Left(), nRect.Bottom() ),
393 0 : Point( nRect.Right(), nRect.Bottom() ) );
394 0 : pDev->DrawLine( Point( nRect.Right(), nRect.Top()+n8 ),
395 0 : Point( nRect.Right(), nRect.Bottom() ) );
396 0 : break;
397 :
398 : case SymbolType::DOCK:
399 0 : pDev->DrawLine( Point( nRect.Left(), nRect.Top() ),
400 0 : Point( nRect.Right(), nRect.Top() ) );
401 0 : pDev->DrawLine( Point( nRect.Left(), nRect.Top() ),
402 0 : Point( nRect.Left(), nRect.Bottom() ) );
403 0 : pDev->DrawLine( Point( nRect.Left(), nRect.Bottom() ),
404 0 : Point( nRect.Right(), nRect.Bottom() ) );
405 0 : pDev->DrawLine( Point( nRect.Right(), nRect.Top() ),
406 0 : Point( nRect.Right(), nRect.Bottom() ) );
407 0 : break;
408 :
409 : case SymbolType::HIDE:
410 0 : pDev->DrawRect( Rectangle( nRect.Left()+n8, nRect.Bottom()-n8,
411 0 : nRect.Right()-n8, nRect.Bottom() ) );
412 0 : break;
413 :
414 : case SymbolType::PLUS:
415 502 : pDev->DrawRect( Rectangle( nRect.Left(), aCenter.Y()-n8,
416 753 : nRect.Right(), aCenter.Y()+n8 ) );
417 502 : pDev->DrawRect( Rectangle( aCenter.X()-n8, nRect.Top(),
418 753 : aCenter.X()+n8, nRect.Bottom() ) );
419 251 : break;
420 : case SymbolType::DONTKNOW:
421 : case SymbolType::IMAGE:
422 0 : case SymbolType::HELP: break;
423 : }
424 : }
425 :
426 1861 : void ImplDrawDPILineRect( OutputDevice *const pDev, Rectangle& rRect,
427 : const Color *const pColor, const bool bRound = false )
428 : {
429 1861 : long nLineWidth = pDev->GetDPIX()/300;
430 1861 : long nLineHeight = pDev->GetDPIY()/300;
431 1861 : if ( !nLineWidth )
432 1861 : nLineWidth = 1;
433 1861 : if ( !nLineHeight )
434 1861 : nLineHeight = 1;
435 :
436 1861 : if ( pColor )
437 : {
438 1346 : if ( (nLineWidth == 1) && (nLineHeight == 1) )
439 : {
440 1346 : pDev->SetLineColor( *pColor );
441 2692 : if( bRound )
442 : {
443 0 : pDev->DrawLine( Point( rRect.Left()+1, rRect.Top()), Point( rRect.Right()-1, rRect.Top()) );
444 0 : pDev->DrawLine( Point( rRect.Left()+1, rRect.Bottom()), Point( rRect.Right()-1, rRect.Bottom()) );
445 0 : pDev->DrawLine( Point( rRect.Left(), rRect.Top()+1), Point( rRect.Left(), rRect.Bottom()-1) );
446 0 : pDev->DrawLine( Point( rRect.Right(), rRect.Top()+1), Point( rRect.Right(), rRect.Bottom()-1) );
447 : }
448 : else
449 : {
450 1346 : pDev->SetFillColor();
451 1346 : pDev->DrawRect( rRect );
452 : }
453 : }
454 : else
455 : {
456 0 : const long nWidth = rRect.GetWidth();
457 0 : const long nHeight = rRect.GetHeight();
458 0 : pDev->SetLineColor();
459 0 : pDev->SetFillColor( *pColor );
460 0 : pDev->DrawRect( Rectangle( rRect.TopLeft(), Size( nWidth, nLineHeight ) ) );
461 0 : pDev->DrawRect( Rectangle( rRect.TopLeft(), Size( nLineWidth, nHeight ) ) );
462 0 : pDev->DrawRect( Rectangle( Point( rRect.Left(), rRect.Bottom()-nLineHeight ),
463 0 : Size( nWidth, nLineHeight ) ) );
464 0 : pDev->DrawRect( Rectangle( Point( rRect.Right()-nLineWidth, rRect.Top() ),
465 0 : Size( nLineWidth, nHeight ) ) );
466 : }
467 : }
468 :
469 1861 : rRect.Left() += nLineWidth;
470 1861 : rRect.Top() += nLineHeight;
471 1861 : rRect.Right() -= nLineWidth;
472 1861 : rRect.Bottom() -= nLineHeight;
473 1861 : }
474 :
475 132916 : void ImplDraw2ColorFrame( OutputDevice *const pDev, Rectangle& rRect,
476 : const Color& rLeftTopColor, const Color& rRightBottomColor )
477 : {
478 132916 : pDev->SetLineColor( rLeftTopColor );
479 132916 : pDev->DrawLine( rRect.TopLeft(), rRect.BottomLeft() );
480 132916 : pDev->DrawLine( rRect.TopLeft(), rRect.TopRight() );
481 132916 : pDev->SetLineColor( rRightBottomColor );
482 132916 : pDev->DrawLine( rRect.BottomLeft(), rRect.BottomRight() );
483 132916 : pDev->DrawLine( rRect.TopRight(), rRect.BottomRight() );
484 :
485 : // reduce drawing area
486 132916 : ++rRect.Left();
487 132916 : ++rRect.Top();
488 132916 : --rRect.Right();
489 132916 : --rRect.Bottom();
490 132916 : }
491 :
492 59006 : void ImplDrawButton( OutputDevice *const pDev, Rectangle aFillRect,
493 : const DrawButtonFlags nStyle )
494 : {
495 59006 : const StyleSettings& rStyleSettings = pDev->GetSettings().GetStyleSettings();
496 :
497 295030 : if ( (nStyle & DrawButtonFlags::Mono) ||
498 236024 : (rStyleSettings.GetOptions() & StyleSettingsOptions::Mono) )
499 : {
500 0 : const Color aBlackColor( COL_BLACK );
501 :
502 0 : if ( nStyle & DrawButtonFlags::Default )
503 : {
504 : // default selection shows a wider border
505 0 : ImplDrawDPILineRect( pDev, aFillRect, &aBlackColor );
506 : }
507 :
508 0 : ImplDrawDPILineRect( pDev, aFillRect, &aBlackColor );
509 :
510 0 : Size aBrdSize( 1, 1 );
511 0 : if ( pDev->GetOutDevType() == OUTDEV_PRINTER )
512 : {
513 0 : aBrdSize = pDev->LogicToPixel( Size( 20, 20 ), MapMode(MAP_100TH_MM) );
514 0 : if ( !aBrdSize.Width() )
515 0 : aBrdSize.Width() = 1;
516 0 : if ( !aBrdSize.Height() )
517 0 : aBrdSize.Height() = 1;
518 : }
519 :
520 0 : pDev->SetLineColor();
521 0 : pDev->SetFillColor( aBlackColor );
522 0 : const Rectangle aOrigFillRect(aFillRect);
523 0 : if ( nStyle & (DrawButtonFlags::Pressed | DrawButtonFlags::Checked) )
524 : {
525 : // shrink fill rect
526 0 : aFillRect.Left() += aBrdSize.Width();
527 0 : aFillRect.Top() += aBrdSize.Height();
528 : // draw top and left borders (aOrigFillRect-aFillRect)
529 : pDev->DrawRect( Rectangle( aOrigFillRect.Left(), aOrigFillRect.Top(),
530 0 : aOrigFillRect.Right(), aFillRect.Top()-1 ) );
531 : pDev->DrawRect( Rectangle( aOrigFillRect.Left(), aOrigFillRect.Top(),
532 0 : aFillRect.Left()-1, aOrigFillRect.Bottom() ) );
533 : }
534 : else
535 : {
536 : // shrink fill rect
537 0 : aFillRect.Right() -= aBrdSize.Width();
538 0 : aFillRect.Bottom() -= aBrdSize.Height();
539 : // draw bottom and right borders (aOrigFillRect-aFillRect)
540 0 : pDev->DrawRect( Rectangle( aOrigFillRect.Left(), aFillRect.Bottom()+1,
541 0 : aOrigFillRect.Right(), aOrigFillRect.Bottom() ) );
542 0 : pDev->DrawRect( Rectangle( aFillRect.Right()+1, aOrigFillRect.Top(),
543 0 : aOrigFillRect.Right(), aOrigFillRect.Bottom() ) );
544 : }
545 :
546 0 : if ( !(nStyle & DrawButtonFlags::NoFill) )
547 : {
548 : // Hack: in monochrome mode on printers we like to have grey buttons
549 0 : if ( pDev->GetOutDevType() == OUTDEV_PRINTER )
550 0 : pDev->SetFillColor( Color( COL_LIGHTGRAY ) );
551 : else
552 0 : pDev->SetFillColor( Color( COL_WHITE ) );
553 0 : pDev->DrawRect( aFillRect );
554 : }
555 : }
556 : else
557 : {
558 59006 : if ( nStyle & DrawButtonFlags::Default )
559 : {
560 2 : const Color aDefBtnColor = rStyleSettings.GetDarkShadowColor();
561 2 : ImplDrawDPILineRect( pDev, aFillRect, &aDefBtnColor );
562 : }
563 :
564 59006 : if ( nStyle & DrawButtonFlags::NoLeftLightBorder )
565 : {
566 1110 : pDev->SetLineColor( rStyleSettings.GetLightBorderColor() );
567 2220 : pDev->DrawLine( Point( aFillRect.Left(), aFillRect.Top() ),
568 3330 : Point( aFillRect.Left(), aFillRect.Bottom() ) );
569 1110 : ++aFillRect.Left();
570 : }
571 :
572 59006 : Color aColor1;
573 59006 : Color aColor2;
574 59006 : if ( nStyle & (DrawButtonFlags::Pressed | DrawButtonFlags::Checked) )
575 : {
576 77 : aColor1 = rStyleSettings.GetDarkShadowColor();
577 77 : aColor2 = rStyleSettings.GetLightColor();
578 : }
579 : else
580 : {
581 58929 : if ( nStyle & DrawButtonFlags::NoLightBorder )
582 55442 : aColor1 = rStyleSettings.GetLightBorderColor();
583 : else
584 3487 : aColor1 = rStyleSettings.GetLightColor();
585 58929 : if ( (nStyle & BUTTON_DRAW_FLATTEST) == DrawButtonFlags::Flat )
586 0 : aColor2 = rStyleSettings.GetShadowColor();
587 : else
588 58929 : aColor2 = rStyleSettings.GetDarkShadowColor();
589 : }
590 :
591 59006 : ImplDraw2ColorFrame( pDev, aFillRect, aColor1, aColor2 );
592 :
593 59006 : if ( !((nStyle & BUTTON_DRAW_FLATTEST) == DrawButtonFlags::Flat) )
594 : {
595 59006 : if ( nStyle & (DrawButtonFlags::Pressed | DrawButtonFlags::Checked) )
596 : {
597 77 : aColor1 = rStyleSettings.GetShadowColor();
598 77 : aColor2 = rStyleSettings.GetLightBorderColor();
599 : }
600 : else
601 : {
602 58929 : if ( nStyle & DrawButtonFlags::NoLightBorder )
603 55442 : aColor1 = rStyleSettings.GetLightColor();
604 : else
605 3487 : aColor1 = rStyleSettings.GetLightBorderColor();
606 58929 : aColor2 = rStyleSettings.GetShadowColor();
607 : }
608 59006 : ImplDraw2ColorFrame( pDev, aFillRect, aColor1, aColor2 );
609 : }
610 :
611 59006 : if ( !(nStyle & DrawButtonFlags::NoFill) )
612 : {
613 59006 : pDev->SetLineColor();
614 59006 : if ( nStyle & (DrawButtonFlags::Checked | DrawButtonFlags::DontKnow) )
615 72 : pDev->SetFillColor( rStyleSettings.GetCheckedColor() );
616 : else
617 58934 : pDev->SetFillColor( rStyleSettings.GetFaceColor() );
618 59006 : pDev->DrawRect( aFillRect );
619 : }
620 : }
621 59006 : }
622 :
623 62648 : void ImplDrawFrame( OutputDevice *const pDev, Rectangle& rRect,
624 : const StyleSettings& rStyleSettings, DrawFrameStyle nStyle, DrawFrameFlags nFlags )
625 : {
626 62648 : vcl::Window *const pWin = (pDev->GetOutDevType()==OUTDEV_WINDOW) ? static_cast<vcl::Window*>(pDev) : NULL;
627 :
628 62648 : const bool bMenuStyle(nFlags & DrawFrameFlags::Menu);
629 :
630 : // UseFlatBorders disables 3D style for all frames except menus
631 : // menus may use different border colors (eg on XP)
632 : // normal frames will be drawn using the shadow color
633 : // whereas window frame borders will use black
634 62648 : bool bFlatBorders = !bMenuStyle && rStyleSettings.GetUseFlatBorders();
635 :
636 : // no flat borders for standard VCL controls (ie formcontrols that keep their classic look)
637 : // will not affect frame windows (like dropdowns)
638 62648 : if( bFlatBorders && pWin && pWin->GetType() == WINDOW_BORDERWINDOW && (pWin != pWin->ImplGetFrameWindow()) )
639 : {
640 : // check for formcontrol, i.e., a control without NWF enabled
641 0 : Control *const pControl = dynamic_cast< Control* >( pWin->GetWindow( GetWindowType::Client ) );
642 0 : if( !pControl || !pControl->IsNativeWidgetEnabled() )
643 0 : bFlatBorders = false;
644 : }
645 :
646 62648 : const bool bNoDraw(nFlags & DrawFrameFlags::NoDraw);
647 :
648 187944 : if ( (rStyleSettings.GetOptions() & StyleSettingsOptions::Mono) ||
649 187944 : (pDev->GetOutDevType() == OUTDEV_PRINTER) ||
650 : bFlatBorders )
651 0 : nFlags |= DrawFrameFlags::Mono;
652 :
653 125296 : if( nStyle != DrawFrameStyle::NWF &&
654 125296 : pWin && pWin->IsNativeControlSupported(CTRL_FRAME, PART_BORDER) )
655 : {
656 47 : long nControlFlags = static_cast<long>(nStyle);
657 47 : nControlFlags |= static_cast<long>(nFlags);
658 47 : nControlFlags |= static_cast<long>(pWin->GetType()==WINDOW_BORDERWINDOW ?
659 47 : DrawFrameFlags::BorderWindowBorder : DrawFrameFlags::NONE);
660 47 : ImplControlValue aControlValue( nControlFlags );
661 :
662 47 : Rectangle aBound, aContent;
663 47 : Rectangle aNatRgn( rRect );
664 94 : if( pWin->GetNativeControlRegion(CTRL_FRAME, PART_BORDER,
665 94 : aNatRgn, ControlState::NONE, aControlValue, OUString(), aBound, aContent) )
666 : {
667 : // if bNoDraw is true then don't call the drawing routine
668 : // but just update the target rectangle
669 141 : if( bNoDraw ||
670 : pWin->DrawNativeControl( CTRL_FRAME, PART_BORDER, aContent, ControlState::ENABLED,
671 47 : aControlValue, OUString()) )
672 : {
673 47 : rRect = aContent;
674 62695 : return;
675 : }
676 0 : }
677 : }
678 :
679 62601 : if ( nFlags & DrawFrameFlags::Mono )
680 : {
681 : // no round corners for window frame borders
682 1859 : const bool bRound = bFlatBorders && !(nFlags & DrawFrameFlags::WindowBorder);
683 :
684 1859 : if ( bNoDraw )
685 : {
686 515 : ImplDrawDPILineRect( pDev, rRect, NULL, bRound );
687 : }
688 : else
689 : {
690 : Color aColor = bRound ? rStyleSettings.GetShadowColor()
691 1344 : : pDev->GetSettings().GetStyleSettings().GetMonoColor();
692 : // when the MonoColor wasn't set, check face color
693 2688 : if (
694 4032 : (bRound && aColor.IsDark()) ||
695 : (
696 6702 : (aColor == Color(COL_BLACK)) &&
697 1326 : pDev->GetSettings().GetStyleSettings().GetFaceColor().IsDark()
698 : )
699 : )
700 : {
701 0 : aColor = Color( COL_WHITE );
702 : }
703 1344 : ImplDrawDPILineRect( pDev, rRect, &aColor, bRound );
704 : }
705 : }
706 : else
707 : {
708 60742 : if ( bNoDraw )
709 : {
710 51533 : switch ( nStyle )
711 : {
712 : case DrawFrameStyle::In:
713 : case DrawFrameStyle::Out:
714 32 : ++rRect.Left();
715 32 : ++rRect.Top();
716 32 : --rRect.Right();
717 32 : --rRect.Bottom();
718 32 : break;
719 :
720 : case DrawFrameStyle::Group:
721 : case DrawFrameStyle::DoubleIn:
722 : case DrawFrameStyle::DoubleOut:
723 51501 : rRect.Left() += 2;
724 51501 : rRect.Top() += 2;
725 51501 : rRect.Right() -= 2;
726 51501 : rRect.Bottom() -= 2;
727 51501 : break;
728 :
729 : case DrawFrameStyle::NWF:
730 : // enough space for the native rendering
731 0 : rRect.Left() += 4;
732 0 : rRect.Top() += 4;
733 0 : rRect.Right() -= 4;
734 0 : rRect.Bottom() -= 4;
735 0 : break;
736 0 : default: break;
737 : }
738 : }
739 : else
740 : {
741 9209 : switch ( nStyle )
742 : {
743 : case DrawFrameStyle::Group:
744 0 : pDev->SetFillColor();
745 0 : pDev->SetLineColor( rStyleSettings.GetLightColor() );
746 0 : pDev->DrawRect( Rectangle( rRect.Left()+1, rRect.Top()+1,
747 0 : rRect.Right(), rRect.Bottom() ) );
748 0 : pDev->SetLineColor( rStyleSettings.GetShadowColor() );
749 0 : pDev->DrawRect( Rectangle( rRect.Left(), rRect.Top(),
750 0 : rRect.Right()-1, rRect.Bottom()-1 ) );
751 :
752 : // adjust target rectangle
753 0 : rRect.Left() += 2;
754 0 : rRect.Top() += 2;
755 0 : rRect.Right() -= 2;
756 0 : rRect.Bottom() -= 2;
757 0 : break;
758 :
759 : case DrawFrameStyle::In:
760 : ImplDraw2ColorFrame( pDev, rRect,
761 3514 : rStyleSettings.GetShadowColor(),
762 7028 : rStyleSettings.GetLightColor() );
763 3514 : break;
764 :
765 : case DrawFrameStyle::Out:
766 : ImplDraw2ColorFrame( pDev, rRect,
767 0 : rStyleSettings.GetLightColor(),
768 0 : rStyleSettings.GetShadowColor() );
769 0 : break;
770 :
771 : case DrawFrameStyle::DoubleIn:
772 5683 : if( bFlatBorders )
773 : {
774 : // no 3d effect
775 : ImplDraw2ColorFrame( pDev, rRect,
776 0 : rStyleSettings.GetShadowColor(),
777 0 : rStyleSettings.GetShadowColor() );
778 : ImplDraw2ColorFrame( pDev, rRect,
779 0 : rStyleSettings.GetFaceColor(),
780 0 : rStyleSettings.GetFaceColor() );
781 : }
782 : else
783 : {
784 : ImplDraw2ColorFrame( pDev, rRect,
785 5683 : rStyleSettings.GetShadowColor(),
786 11366 : rStyleSettings.GetLightColor() );
787 : ImplDraw2ColorFrame( pDev, rRect,
788 5683 : rStyleSettings.GetDarkShadowColor(),
789 11366 : rStyleSettings.GetLightBorderColor() );
790 : }
791 5683 : break;
792 :
793 : case DrawFrameStyle::DoubleOut:
794 12 : if( bMenuStyle )
795 : {
796 : ImplDraw2ColorFrame( pDev, rRect,
797 8 : rStyleSettings.GetMenuBorderColor(),
798 16 : rStyleSettings.GetDarkShadowColor() );
799 8 : if ( !rStyleSettings.GetUseFlatMenus() )
800 : {
801 : ImplDraw2ColorFrame( pDev, rRect,
802 8 : rStyleSettings.GetLightColor(),
803 16 : rStyleSettings.GetShadowColor() );
804 : }
805 : }
806 : else
807 : {
808 : ImplDraw2ColorFrame( pDev, rRect,
809 : bFlatBorders ? // no 3d effect
810 : rStyleSettings.GetDarkShadowColor() :
811 : rStyleSettings.GetLightBorderColor(),
812 4 : rStyleSettings.GetDarkShadowColor() );
813 : ImplDraw2ColorFrame( pDev, rRect,
814 4 : rStyleSettings.GetLightColor(),
815 8 : rStyleSettings.GetShadowColor() );
816 : }
817 12 : break;
818 :
819 : case DrawFrameStyle::NWF:
820 : // no rendering, just enough space for the native rendering
821 0 : rRect.Left() += 4;
822 0 : rRect.Top() += 4;
823 0 : rRect.Right() -= 4;
824 0 : rRect.Bottom() -= 4;
825 0 : break;
826 0 : default: break;
827 : }
828 : }
829 : }
830 : }
831 :
832 : } // end anonymous namespace
833 :
834 135293 : DecorationView::DecorationView(OutputDevice* pOutDev) :
835 135293 : mpOutDev(pOutDev)
836 135293 : {}
837 :
838 41048 : void DecorationView::DrawSymbol( const Rectangle& rRect, SymbolType eType,
839 : const Color& rColor, DrawSymbolFlags nStyle )
840 : {
841 41048 : const StyleSettings& rStyleSettings = mpOutDev->GetSettings().GetStyleSettings();
842 41048 : const Rectangle aRect = mpOutDev->LogicToPixel( rRect );
843 41048 : const Color aOldLineColor = mpOutDev->GetLineColor();
844 41048 : const Color aOldFillColor = mpOutDev->GetFillColor();
845 41048 : const bool bOldMapMode = mpOutDev->IsMapModeEnabled();
846 41048 : Color nColor(rColor);
847 41048 : mpOutDev->EnableMapMode( false );
848 :
849 123144 : if ( (rStyleSettings.GetOptions() & StyleSettingsOptions::Mono) ||
850 82096 : (mpOutDev->GetOutDevType() == OUTDEV_PRINTER) )
851 0 : nStyle |= DrawSymbolFlags::Mono;
852 :
853 41048 : if ( nStyle & DrawSymbolFlags::Mono )
854 : {
855 : // Monochrome: set color to black if enabled, to gray if disabled
856 0 : nColor = Color( ( nStyle & DrawSymbolFlags::Disable ) ? COL_GRAY : COL_BLACK );
857 : }
858 : else
859 : {
860 41048 : if ( nStyle & DrawSymbolFlags::Disable )
861 : {
862 : // Draw shifted and brighter symbol for embossed look
863 18841 : mpOutDev->SetLineColor( rStyleSettings.GetLightColor() );
864 18841 : mpOutDev->SetFillColor( rStyleSettings.GetLightColor() );
865 18841 : ImplDrawSymbol( mpOutDev, aRect + Point(1, 1) , eType );
866 18841 : nColor = rStyleSettings.GetShadowColor();
867 : }
868 : }
869 :
870 : // Set selected color and draw the symbol
871 41048 : mpOutDev->SetLineColor( nColor );
872 41048 : mpOutDev->SetFillColor( nColor );
873 41048 : ImplDrawSymbol( mpOutDev, aRect, eType );
874 :
875 : // Restore previous settings
876 41048 : mpOutDev->SetLineColor( aOldLineColor );
877 41048 : mpOutDev->SetFillColor( aOldFillColor );
878 41048 : mpOutDev->EnableMapMode( bOldMapMode );
879 41048 : }
880 :
881 0 : void DecorationView::DrawFrame( const Rectangle& rRect,
882 : const Color& rLeftTopColor,
883 : const Color& rRightBottomColor )
884 : {
885 0 : Rectangle aRect = mpOutDev->LogicToPixel( rRect );
886 0 : const Color aOldLineColor = mpOutDev->GetLineColor();
887 0 : const bool bOldMapMode = mpOutDev->IsMapModeEnabled();
888 0 : mpOutDev->EnableMapMode( false );
889 0 : ImplDraw2ColorFrame( mpOutDev, aRect, rLeftTopColor, rRightBottomColor );
890 0 : mpOutDev->SetLineColor( aOldLineColor );
891 0 : mpOutDev->EnableMapMode( bOldMapMode );
892 0 : }
893 :
894 0 : void DecorationView::DrawHighlightFrame( const Rectangle& rRect,
895 : DrawHighlightFrameStyle nStyle, bool bTestBackground )
896 : {
897 0 : const StyleSettings& rStyleSettings = mpOutDev->GetSettings().GetStyleSettings();
898 0 : Color aLightColor = rStyleSettings.GetLightColor();
899 0 : Color aShadowColor = rStyleSettings.GetShadowColor();
900 :
901 0 : if ( (rStyleSettings.GetOptions() & StyleSettingsOptions::Mono) ||
902 0 : (mpOutDev->GetOutDevType() == OUTDEV_PRINTER) )
903 : {
904 0 : aLightColor = Color( COL_BLACK );
905 0 : aShadowColor = Color( COL_BLACK );
906 : }
907 0 : else if ( bTestBackground )
908 : {
909 0 : Wallpaper aBackground = mpOutDev->GetBackground();
910 0 : if ( aBackground.IsBitmap() || aBackground.IsGradient() )
911 : {
912 0 : aLightColor = rStyleSettings.GetFaceColor();
913 0 : aShadowColor = Color( COL_BLACK );
914 : }
915 : else
916 : {
917 0 : Color aBackColor = aBackground.GetColor();
918 0 : if ( (aLightColor.GetColorError( aBackColor ) < 32) ||
919 0 : (aShadowColor.GetColorError( aBackColor ) < 32) )
920 : {
921 0 : aLightColor = Color( COL_WHITE );
922 0 : aShadowColor = Color( COL_BLACK );
923 :
924 0 : if ( aLightColor.GetColorError( aBackColor ) < 32 )
925 0 : aLightColor.DecreaseLuminance( 64 );
926 0 : if ( aShadowColor.GetColorError( aBackColor ) < 32 )
927 0 : aShadowColor.IncreaseLuminance( 64 );
928 : }
929 0 : }
930 : }
931 :
932 0 : if ( nStyle == DrawHighlightFrameStyle::In )
933 : {
934 0 : Color aTempColor = aLightColor;
935 0 : aLightColor = aShadowColor;
936 0 : aShadowColor = aTempColor;
937 : }
938 :
939 0 : DrawFrame( rRect, aLightColor, aShadowColor );
940 0 : }
941 :
942 62648 : Rectangle DecorationView::DrawFrame( const Rectangle& rRect, DrawFrameStyle nStyle, DrawFrameFlags nFlags )
943 : {
944 62648 : Rectangle aRect = rRect;
945 62648 : bool bOldMap = mpOutDev->IsMapModeEnabled();
946 62648 : if ( bOldMap )
947 : {
948 0 : aRect = mpOutDev->LogicToPixel( aRect );
949 0 : mpOutDev->EnableMapMode( false );
950 : }
951 :
952 62648 : if ( !rRect.IsEmpty() )
953 : {
954 62648 : if ( nFlags & DrawFrameFlags::NoDraw )
955 52095 : ImplDrawFrame( mpOutDev, aRect, mpOutDev->GetSettings().GetStyleSettings(), nStyle, nFlags );
956 : else
957 : {
958 10553 : Color maOldLineColor = mpOutDev->GetLineColor();
959 10553 : Color maOldFillColor = mpOutDev->GetFillColor();
960 10553 : ImplDrawFrame( mpOutDev, aRect, mpOutDev->GetSettings().GetStyleSettings(), nStyle, nFlags );
961 10553 : mpOutDev->SetLineColor( maOldLineColor );
962 10553 : mpOutDev->SetFillColor( maOldFillColor );
963 : }
964 : }
965 :
966 62648 : if ( bOldMap )
967 : {
968 0 : mpOutDev->EnableMapMode( bOldMap );
969 0 : aRect = mpOutDev->PixelToLogic( aRect );
970 : }
971 :
972 62648 : return aRect;
973 : }
974 :
975 59290 : Rectangle DecorationView::DrawButton( const Rectangle& rRect, DrawButtonFlags nStyle )
976 : {
977 59290 : if ( rRect.IsEmpty() )
978 : {
979 284 : return rRect;
980 : }
981 :
982 59006 : Rectangle aRect = rRect;
983 59006 : const bool bOldMap = mpOutDev->IsMapModeEnabled();
984 :
985 59006 : if ( bOldMap )
986 : {
987 0 : aRect = mpOutDev->LogicToPixel( aRect );
988 0 : mpOutDev->EnableMapMode( false );
989 : }
990 :
991 59006 : const Color maOldLineColor = mpOutDev->GetLineColor();
992 59006 : const Color maOldFillColor = mpOutDev->GetFillColor();
993 59006 : ImplDrawButton( mpOutDev, aRect, nStyle );
994 59006 : mpOutDev->SetLineColor( maOldLineColor );
995 59006 : mpOutDev->SetFillColor( maOldFillColor );
996 :
997 : // keep border free, although it is used at default representation
998 59006 : ++aRect.Left();
999 59006 : ++aRect.Top();
1000 59006 : --aRect.Right();
1001 59006 : --aRect.Bottom();
1002 :
1003 59006 : if ( nStyle & DrawButtonFlags::NoLightBorder )
1004 : {
1005 55447 : ++aRect.Left();
1006 55447 : ++aRect.Top();
1007 : }
1008 3559 : else if ( nStyle & DrawButtonFlags::NoLeftLightBorder )
1009 : {
1010 1110 : ++aRect.Left();
1011 : }
1012 :
1013 59006 : if ( nStyle & DrawButtonFlags::Pressed )
1014 : {
1015 5 : if ( (aRect.GetHeight() > 10) && (aRect.GetWidth() > 10) )
1016 : {
1017 5 : aRect.Left() += 4;
1018 5 : aRect.Top() += 4;
1019 5 : aRect.Right() -= 1;
1020 5 : aRect.Bottom() -= 1;
1021 : }
1022 : else
1023 : {
1024 0 : aRect.Left() += 3;
1025 0 : aRect.Top() += 3;
1026 0 : aRect.Right() -= 2;
1027 0 : aRect.Bottom() -= 2;
1028 : }
1029 : }
1030 59001 : else if ( nStyle & DrawButtonFlags::Checked )
1031 : {
1032 72 : aRect.Left() += 3;
1033 72 : aRect.Top() += 3;
1034 72 : aRect.Right() -= 2;
1035 72 : aRect.Bottom() -= 2;
1036 : }
1037 : else
1038 : {
1039 58929 : aRect.Left() += 2;
1040 58929 : aRect.Top() += 2;
1041 58929 : aRect.Right() -= 3;
1042 58929 : aRect.Bottom() -= 3;
1043 : }
1044 :
1045 59006 : if ( bOldMap )
1046 : {
1047 0 : mpOutDev->EnableMapMode( bOldMap );
1048 0 : aRect = mpOutDev->PixelToLogic( aRect );
1049 : }
1050 :
1051 59006 : return aRect;
1052 : }
1053 :
1054 42869 : void DecorationView::DrawSeparator( const Point& rStart, const Point& rStop, bool bVertical )
1055 : {
1056 42869 : Point aStart( rStart ), aStop( rStop );
1057 42869 : const StyleSettings& rStyleSettings = mpOutDev->GetSettings().GetStyleSettings();
1058 42869 : vcl::Window *const pWin = (mpOutDev->GetOutDevType()==OUTDEV_WINDOW) ? static_cast<vcl::Window*>(mpOutDev.get()) : NULL;
1059 42869 : if(pWin)
1060 : {
1061 42869 : ControlPart nPart = ( bVertical ? PART_SEPARATOR_VERT : PART_SEPARATOR_HORZ );
1062 42869 : bool nativeSupported = pWin->IsNativeControlSupported( CTRL_FIXEDLINE, nPart );
1063 42869 : ImplControlValue aValue;
1064 42869 : ControlState nState = ControlState::NONE;
1065 42869 : Rectangle aRect(rStart,rStop);
1066 42869 : if(nativeSupported && pWin->DrawNativeControl(CTRL_FIXEDLINE,nPart,aRect,nState,aValue,OUString()))
1067 42869 : return;
1068 : }
1069 :
1070 42869 : mpOutDev->Push( PushFlags::LINECOLOR );
1071 42869 : if ( rStyleSettings.GetOptions() & StyleSettingsOptions::Mono )
1072 0 : mpOutDev->SetLineColor( Color( COL_BLACK ) );
1073 : else
1074 42869 : mpOutDev->SetLineColor( rStyleSettings.GetShadowColor() );
1075 :
1076 42869 : mpOutDev->DrawLine( aStart, aStop );
1077 42869 : if ( !(rStyleSettings.GetOptions() & StyleSettingsOptions::Mono) )
1078 : {
1079 42869 : mpOutDev->SetLineColor( rStyleSettings.GetLightColor() );
1080 42869 : if( bVertical )
1081 : {
1082 42862 : aStart.X()++;
1083 42862 : aStop.X()++;
1084 : }
1085 : else
1086 : {
1087 7 : aStart.Y()++;
1088 7 : aStop.Y()++;
1089 : }
1090 42869 : mpOutDev->DrawLine( aStart, aStop );
1091 : }
1092 42869 : mpOutDev->Pop();
1093 : }
1094 :
1095 0 : void DecorationView::DrawHandle(const Rectangle& rRect, bool bVertical)
1096 : {
1097 0 : const StyleSettings& rStyleSettings = mpOutDev->GetSettings().GetStyleSettings();
1098 :
1099 0 : Size aOutputSize = rRect.GetSize();
1100 :
1101 0 : mpOutDev->SetLineColor(rStyleSettings.GetDarkShadowColor());
1102 0 : mpOutDev->SetFillColor(rStyleSettings.GetDarkShadowColor());
1103 :
1104 0 : sal_Int32 nNumberOfPoints = 3;
1105 :
1106 0 : long nHalfWidth = aOutputSize.Width() / 2.0f;
1107 0 : long nHalfHeight = aOutputSize.Height() / 2.0f;
1108 :
1109 0 : float fDistance = bVertical ? aOutputSize.Height() : aOutputSize.Width();
1110 0 : fDistance /= (nNumberOfPoints + 1);
1111 :
1112 0 : long nRadius = bVertical ? aOutputSize.Width() : aOutputSize.Height();
1113 0 : nRadius /= (nNumberOfPoints + 2);
1114 :
1115 0 : for (long i = 1; i <= nNumberOfPoints; i++)
1116 : {
1117 0 : Rectangle aLocation;
1118 0 : if (bVertical)
1119 : {
1120 : aLocation = Rectangle(nHalfWidth - nRadius,
1121 0 : round(fDistance * i) - nRadius,
1122 : nHalfWidth + nRadius,
1123 0 : round(fDistance * i) + nRadius);
1124 : }
1125 : else
1126 : {
1127 0 : aLocation = Rectangle(round(fDistance * i) - nRadius,
1128 : nHalfHeight - nRadius,
1129 0 : round(fDistance * i) + nRadius,
1130 0 : nHalfHeight + nRadius);
1131 : }
1132 0 : mpOutDev->DrawEllipse(aLocation);
1133 : }
1134 0 : }
1135 :
1136 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|