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