xref: /AOO41X/main/vcl/source/window/decoview.cxx (revision 9f62ea84a806e17e6f2bbff75724a7257a0eb5d9)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_vcl.hxx"
26 #include <vcl/settings.hxx>
27 #include <tools/poly.hxx>
28 #include <vcl/outdev.hxx>
29 #include <vcl/bmpacc.hxx>
30 #include <vcl/decoview.hxx>
31 #include <vcl/window.hxx>
32 #include <vcl/ctrl.hxx>
33 
34 // =======================================================================
35 
36 #define BUTTON_DRAW_FLATTEST    (BUTTON_DRAW_FLAT |             \
37                                  BUTTON_DRAW_PRESSED |          \
38                                  BUTTON_DRAW_CHECKED |          \
39                                  BUTTON_DRAW_HIGHLIGHT)
40 
41 // =======================================================================
42 
ImplDrawSymbol(OutputDevice * pDev,const Rectangle & rRect,SymbolType eType)43 static void ImplDrawSymbol( OutputDevice* pDev, const Rectangle& rRect,
44                             SymbolType eType  )
45 {
46     // Groessen vorberechnen
47     long    nMin    = Min( rRect.GetWidth(), rRect.GetHeight() );
48     long    nSize   = nMin;
49 
50     if ( nMin & 0x01 )
51         nMin--;
52     Point   aCenter = rRect.Center();
53     long    nCenterX = aCenter.X();
54     long    nCenterY = aCenter.Y();
55     long    n2 = nMin / 2;
56     long    n4 = nMin / 4;
57     long    nLeft;
58     long    nTop;
59     long    nRight;
60     long    nBottom;
61     long    nTemp;
62     long    i;
63 
64     switch ( eType )
65     {
66         case SYMBOL_ARROW_UP:
67             {
68             if ( !(nMin & 0x01) )
69             {
70                 n2--;
71                 n4--;
72             }
73             nTop = nCenterY-n2;
74             nBottom = nCenterY;
75             pDev->DrawRect( Rectangle( nCenterX, nTop, nCenterX, nBottom ) );
76             i = 1;
77             while ( i <= n2 )
78             {
79                 nTop++;
80                 nTemp = nCenterX-i;
81                 pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
82                 nTemp = nCenterX+i;
83                 pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
84                 i++;
85             }
86             pDev->DrawRect( Rectangle( nCenterX-n4, nBottom,
87                                        nCenterX+n4, nBottom+n2 ) );
88             }
89             break;
90 
91         case SYMBOL_ARROW_DOWN:
92             {
93             if ( !(nMin & 0x01) )
94             {
95                 n2--;
96                 n4--;
97             }
98             nTop = nCenterY;
99             nBottom = nCenterY+n2;
100             pDev->DrawRect( Rectangle( nCenterX, nTop, nCenterX, nBottom ) );
101             i = 1;
102             while ( i <= n2 )
103             {
104                 nBottom--;
105                 nTemp = nCenterX-i;
106                 pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
107                 nTemp = nCenterX+i;
108                 pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
109                 i++;
110             }
111             pDev->DrawRect( Rectangle( nCenterX-n4, nTop-n2,
112                                        nCenterX+n4, nTop ) );
113             }
114             break;
115 
116         case SYMBOL_ARROW_LEFT:
117             {
118             if ( !(nMin & 0x01) )
119             {
120                 n2--;
121                 n4--;
122             }
123             nLeft = nCenterX-n2;
124             nRight = nCenterX;
125             pDev->DrawRect( Rectangle( nLeft, nCenterY, nRight, nCenterY ) );
126             i = 1;
127             while ( i <= n2 )
128             {
129                 nLeft++;
130                 nTemp = nCenterY-i;
131                 pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
132                 nTemp = nCenterY+i;
133                 pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
134                 i++;
135             }
136             pDev->DrawRect( Rectangle( nRight, nCenterY-n4,
137                                        nRight+n2, nCenterY+n4 ) );
138             }
139             break;
140 
141         case SYMBOL_ARROW_RIGHT:
142             {
143             if ( !(nMin & 0x01) )
144             {
145                 n2--;
146                 n4--;
147             }
148             nLeft = nCenterX;
149             nRight = nCenterX+n2;
150             pDev->DrawRect( Rectangle( nLeft, nCenterY, nRight, nCenterY ) );
151             i = 1;
152             while ( i <= n2 )
153             {
154                 nRight--;
155                 nTemp = nCenterY-i;
156                 pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
157                 nTemp = nCenterY+i;
158                 pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
159                 i++;
160             }
161             pDev->DrawRect( Rectangle( nLeft-n2, nCenterY-n4,
162                                        nLeft, nCenterY+n4 ) );
163             }
164             break;
165 
166 
167         case SYMBOL_SPIN_UP:
168             {
169             if ( !(nMin & 0x01) )
170                 n2--;
171             nTop = nCenterY-n4;
172             nBottom = nTop+n2;
173             pDev->DrawRect( Rectangle( nCenterX, nTop, nCenterX, nBottom ) );
174             i = 1;
175             while ( i <= n2 )
176             {
177                 nTop++;
178                 nTemp = nCenterX-i;
179                 pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
180                 nTemp = nCenterX+i;
181                 pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
182                 i++;
183             }
184             }
185             break;
186 
187         case SYMBOL_SPIN_DOWN:
188             {
189             if ( !(nMin & 0x01) )
190                 n2--;
191             nTop = nCenterY-n4;
192             nBottom = nTop+n2;
193             pDev->DrawRect( Rectangle( nCenterX, nTop, nCenterX, nBottom ) );
194             i = 1;
195             while ( i <= n2 )
196             {
197                 nBottom--;
198                 nTemp = nCenterX-i;
199                 pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
200                 nTemp = nCenterX+i;
201                 pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
202                 i++;
203             }
204             }
205             break;
206 
207         case SYMBOL_SPIN_LEFT:
208         case SYMBOL_FIRST:
209         case SYMBOL_PREV:
210         case SYMBOL_REVERSEPLAY:
211             {
212             if ( !(nMin & 0x01) )
213                 n2--;
214             nLeft = nCenterX-n4;
215             if ( eType == SYMBOL_FIRST )
216                 nLeft++;
217             nRight = nLeft+n2;
218             pDev->DrawRect( Rectangle( nLeft, nCenterY, nRight, nCenterY ) );
219             i = 1;
220             while ( i <= n2 )
221             {
222                 nLeft++;
223                 nTemp = nCenterY-i;
224                 pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
225                 nTemp = nCenterY+i;
226                 pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
227                 i++;
228             }
229             if ( eType == SYMBOL_FIRST )
230             {
231                 pDev->DrawRect( Rectangle( nCenterX-n4-1, nCenterY-n2,
232                                            nCenterX-n4-1, nCenterY+n2 ) );
233             }
234             }
235             break;
236 
237         case SYMBOL_SPIN_RIGHT:
238         case SYMBOL_LAST:
239         case SYMBOL_NEXT:
240         case SYMBOL_PLAY:
241             {
242             if ( !(nMin & 0x01) )
243                 n2--;
244             nLeft = nCenterX-n4;
245             if ( eType == SYMBOL_LAST )
246                 nLeft--;
247             nRight = nLeft+n2;
248             pDev->DrawRect( Rectangle( nLeft, nCenterY, nRight, nCenterY ) );
249             i = 1;
250             while ( i <= n2 )
251             {
252                 nRight--;
253                 nTemp = nCenterY-i;
254                 pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
255                 nTemp = nCenterY+i;
256                 pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
257                 i++;
258             }
259             if ( eType == SYMBOL_LAST )
260             {
261                 pDev->DrawRect( Rectangle( nCenterX+n4+1, nCenterY-n2,
262                                            nCenterX+n4+1, nCenterY+n2 ) );
263             }
264             }
265             break;
266 
267         case SYMBOL_PAGEUP:
268         case SYMBOL_PAGEDOWN:
269         {
270             if ( !( nSize & 0x01 ))
271             {
272                 // An even rectangle size means we have to use a smaller size for
273                 // our arrows as we want to use one pixel for the spearhead! Otherwise
274                 // it will be clipped!
275                 nCenterX++;
276                 n2 = ( nMin-1 ) / 2;
277                 n4 = ( nMin-1 ) / 4;
278             }
279 
280             nTop = nCenterY-n2;
281             nBottom = nCenterY-1;
282             pDev->DrawRect( Rectangle( nCenterX, nTop, nCenterX, nBottom ) );
283             pDev->DrawRect( Rectangle( nCenterX, nTop+n2+1, nCenterX, nBottom+n2+1 ) );
284             i = 1;
285             while ( i < n2 )
286             {
287                 ( eType == SYMBOL_PAGEUP ) ? nTop++ : nBottom--;
288                 nTemp = nCenterX-i;
289                 pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
290                 pDev->DrawRect( Rectangle( nTemp, nTop+n2+1, nTemp, nBottom+n2+1 ) );
291                 nTemp = nCenterX+i;
292                 pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
293                 pDev->DrawRect( Rectangle( nTemp, nTop+n2+1, nTemp, nBottom+n2+1 ) );
294                 i++;
295             }
296         }
297         break;
298 
299         case SYMBOL_RADIOCHECKMARK:
300         case SYMBOL_RECORD:
301         {
302             const long          nExt = ( n2 << 1 ) + 1;
303             Bitmap              aBmp( Size( nExt, nExt ), 1 );
304             BitmapWriteAccess*  pWAcc = aBmp.AcquireWriteAccess();
305 
306             if( pWAcc )
307             {
308                 const Color aWhite( COL_WHITE );
309                 const Color aBlack( COL_BLACK );
310 
311                 pWAcc->Erase( aWhite );
312                 pWAcc->SetLineColor( aBlack );
313                 pWAcc->SetFillColor( aBlack );
314                 pWAcc->DrawPolygon( Polygon( Point( n2, n2 ), n2, n2 ) );
315                 aBmp.ReleaseAccess( pWAcc );
316                 pDev->DrawMask( Point( nCenterX - n2, nCenterY - n2 ), aBmp, pDev->GetFillColor() );
317             }
318             else
319                 pDev->DrawPolygon( Polygon( Point( nCenterX, nCenterY ), n2, n2 ) );
320         }
321         break;
322 
323         case SYMBOL_STOP:
324             {
325             nLeft = nCenterX-n2;
326             nRight = nCenterX+n2;
327             nTop = nCenterY-n2;
328             nBottom = nCenterY+n2;
329             pDev->DrawRect( Rectangle( nLeft, nTop, nRight, nBottom ) );
330             }
331             break;
332 
333         case SYMBOL_PAUSE:
334             {
335             nLeft = nCenterX-n2;
336             nRight = nCenterX+n2-1;
337             nTop = nCenterY-n2;
338             nBottom = nCenterY+n2;
339             pDev->DrawRect( Rectangle( nLeft, nTop, nCenterX-2, nBottom ) );
340             pDev->DrawRect( Rectangle( nCenterX+1, nTop, nRight, nBottom ) );
341             }
342             break;
343 
344         case SYMBOL_WINDSTART:
345         case SYMBOL_WINDBACKWARD:
346             {
347             nLeft = nCenterX-n2+1;
348             nRight = nCenterX;
349             pDev->DrawRect( Rectangle( nLeft, nCenterY, nRight, nCenterY ) );
350             pDev->DrawRect( Rectangle( nLeft+n2, nCenterY, nRight+n2, nCenterY ) );
351             i = 1;
352             while ( i < n2 )
353             {
354                 nLeft++;
355                 nTemp = nCenterY-i;
356                 pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
357                 pDev->DrawRect( Rectangle( nLeft+n2, nTemp, nRight+n2, nTemp ) );
358                 nTemp = nCenterY+i;
359                 pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
360                 pDev->DrawRect( Rectangle( nLeft+n2, nTemp, nRight+n2, nTemp ) );
361                 i++;
362             }
363             if ( eType == SYMBOL_WINDSTART )
364             {
365                 pDev->DrawRect( Rectangle( nCenterX-n2, nCenterY-n2,
366                                            nCenterX-n2, nCenterY+n2 ) );
367             }
368             }
369             break;
370 
371         case SYMBOL_WINDEND:
372         case SYMBOL_WINDFORWARD:
373             {
374             nLeft = nCenterX-n2;
375             nRight = nCenterX-1;
376             pDev->DrawRect( Rectangle( nLeft, nCenterY, nRight, nCenterY ) );
377             pDev->DrawRect( Rectangle( nLeft+n2, nCenterY, nRight+n2, nCenterY ) );
378             i = 1;
379             while ( i < n2 )
380             {
381                 nRight--;
382                 nTemp = nCenterY-i;
383                 pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
384                 pDev->DrawRect( Rectangle( nLeft+n2, nTemp, nRight+n2, nTemp ) );
385                 nTemp = nCenterY+i;
386                 pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
387                 pDev->DrawRect( Rectangle( nLeft+n2, nTemp, nRight+n2, nTemp ) );
388                 i++;
389             }
390             if ( eType == SYMBOL_WINDEND )
391             {
392                 pDev->DrawRect( Rectangle( nCenterX+n2, nCenterY-n2,
393                                            nCenterX+n2, nCenterY+n2 ) );
394             }
395             }
396             break;
397 
398         case SYMBOL_CLOSE:
399             {
400             Size aRectSize( 2, 1 );
401             if ( nMin < 8 )
402                 aRectSize.Width() = 1;
403             else if ( nMin > 20 )
404                 aRectSize.Width() = nMin/10;
405             nLeft   = nCenterX-n2+1;
406             nTop    = nCenterY-n2+1;
407             nBottom = nCenterY-n2+nMin-aRectSize.Width()+1;
408             i = 0;
409             while ( i < nMin-aRectSize.Width()+1 )
410             {
411                 pDev->DrawRect( Rectangle( Point( nLeft+i, nTop+i ), aRectSize ) );
412                 pDev->DrawRect( Rectangle( Point( nLeft+i, nBottom-i ), aRectSize ) );
413                 i++;
414             }
415             }
416             break;
417 
418         case SYMBOL_ROLLUP:
419         case SYMBOL_ROLLDOWN:
420             {
421             Rectangle aRect( nCenterX-n2, nCenterY-n2,
422                              nCenterX+n2, nCenterY-n2+1 );
423             pDev->DrawRect( aRect );
424             if ( eType == SYMBOL_ROLLDOWN )
425             {
426                 Rectangle aTempRect = aRect;
427                 aTempRect.Bottom() = nCenterY+n2;
428                 aTempRect.Right() = aRect.Left();
429                 pDev->DrawRect( aTempRect );
430                 aTempRect.Left() = aRect.Right();
431                 aTempRect.Right() = aRect.Right();
432                 pDev->DrawRect( aTempRect );
433                 aTempRect.Top() = aTempRect.Bottom();
434                 aTempRect.Left() = aRect.Left();
435                 pDev->DrawRect( aTempRect );
436             }
437             }
438             break;
439         case SYMBOL_CHECKMARK:
440             {
441                 // #106953# never mirror checkmarks
442                 sal_Bool bRTL = pDev->ImplHasMirroredGraphics() && pDev->IsRTLEnabled();
443                 Point aPos1( bRTL ? rRect.Right() : rRect.Left(),
444                     rRect.Bottom() - rRect.GetHeight() / 3 );
445                 Point aPos2( bRTL ? rRect.Right() - rRect.GetWidth()/3 : rRect.Left() + rRect.GetWidth()/3,
446                     rRect.Bottom() );
447                 Point aPos3( bRTL ? rRect.TopLeft() : rRect.TopRight() );
448                 Size aRectSize( 1, 2 );
449                 long nStepsY = aPos2.Y()-aPos1.Y();
450                 long nX = aPos1.X();
451                 long nY = aPos1.Y();
452                 long n;
453                 for ( n = 0; n <= nStepsY; n++ )
454                 {
455                     if( bRTL )
456                         nX--;
457                     pDev->DrawRect( Rectangle( Point( nX, nY++ ), aRectSize ) );
458                     if( !bRTL )
459                         nX++;
460                 }
461                 nStepsY = aPos2.Y()-aPos3.Y();
462                 nX = aPos2.X();
463                 nY = aPos2.Y();
464                 for ( n = 0; n <= nStepsY; n++ )
465                 {
466                     if( bRTL )
467                         if ( --nX < rRect.Left() )
468                             break;
469                     pDev->DrawRect( Rectangle( Point( nX, nY-- ), aRectSize ) );
470                     if( !bRTL )
471                         if ( ++nX > rRect.Right() )
472                             break;
473                 }
474             }
475             break;
476 
477         case SYMBOL_SPIN_UPDOWN:
478             {
479             nTop = nCenterY-n2-1;
480             nBottom = nTop+n2;
481             pDev->DrawRect( Rectangle( nCenterX, nTop, nCenterX, nBottom ) );
482             i = 1;
483             while ( i <= n2 )
484             {
485                 nTop++;
486                 nTemp = nCenterX-i;
487                 pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
488                 nTemp = nCenterX+i;
489                 pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
490                 i++;
491             }
492             nTop = nCenterY+1;
493             nBottom = nTop+n2;
494             pDev->DrawRect( Rectangle( nCenterX, nTop, nCenterX, nBottom ) );
495             i = 1;
496             while ( i <= n2 )
497             {
498                 nBottom--;
499                 nTemp = nCenterX-i;
500                 pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
501                 nTemp = nCenterX+i;
502                 pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
503                 i++;
504             }
505             }
506             break;
507 
508 
509         case SYMBOL_FLOAT:
510             {
511             Rectangle aRect( nCenterX-n2, nCenterY-n2+3,
512                              nCenterX+n2-2, nCenterY-n2+4 );
513             pDev->DrawRect( aRect );
514             Rectangle aTempRect = aRect;
515             aTempRect.Bottom() = nCenterY+n2;
516             aTempRect.Right() = aRect.Left();
517             pDev->DrawRect( aTempRect );
518             aTempRect.Left() = aRect.Right();
519             aTempRect.Right() = aRect.Right();
520             pDev->DrawRect( aTempRect );
521             aTempRect.Top() = aTempRect.Bottom();
522             aTempRect.Left() = aRect.Left();
523             pDev->DrawRect( aTempRect );
524             aRect = Rectangle( nCenterX-n2+2, nCenterY-n2,
525                              nCenterX+n2, nCenterY-n2+1 );
526             pDev->DrawRect( aRect );
527             aTempRect = aRect;
528             aTempRect.Bottom() = nCenterY+n2-3;
529             aTempRect.Right() = aRect.Left();
530             pDev->DrawRect( aTempRect );
531             aTempRect.Left() = aRect.Right();
532             aTempRect.Right() = aRect.Right();
533             pDev->DrawRect( aTempRect );
534             aTempRect.Top() = aTempRect.Bottom();
535             aTempRect.Left() = aRect.Left();
536             pDev->DrawRect( aTempRect );
537             }
538             break;
539         case SYMBOL_DOCK:
540             {
541             Rectangle aRect( nCenterX-n2, nCenterY-n2,
542                              nCenterX+n2, nCenterY-n2 );
543             pDev->DrawRect( aRect );
544             Rectangle aTempRect = aRect;
545             aTempRect.Bottom() = nCenterY+n2;
546             aTempRect.Right() = aRect.Left();
547             pDev->DrawRect( aTempRect );
548             aTempRect.Left() = aRect.Right();
549             aTempRect.Right() = aRect.Right();
550             pDev->DrawRect( aTempRect );
551             aTempRect.Top() = aTempRect.Bottom();
552             aTempRect.Left() = aRect.Left();
553             pDev->DrawRect( aTempRect );
554             }
555             break;
556         case SYMBOL_HIDE:
557             {
558             long nExtra = nMin / 8;
559             Rectangle aRect( nCenterX-n2+nExtra, nCenterY+n2-1,
560                              nCenterX+n2-nExtra, nCenterY+n2 );
561             pDev->DrawRect( aRect );
562             }
563             break;
564     }
565 }
566 
567 // -----------------------------------------------------------------------
568 
DrawSymbol(const Rectangle & rRect,SymbolType eType,const Color & rColor,sal_uInt16 nStyle)569 void DecorationView::DrawSymbol( const Rectangle& rRect, SymbolType eType,
570                                  const Color& rColor, sal_uInt16 nStyle )
571 {
572     const StyleSettings&    rStyleSettings  = mpOutDev->GetSettings().GetStyleSettings();
573     Rectangle               aRect           = mpOutDev->LogicToPixel( rRect );
574     Color                   aOldLineColor   = mpOutDev->GetLineColor();
575     Color                   aOldFillColor   = mpOutDev->GetFillColor();
576     sal_Bool                    bOldMapMode     = mpOutDev->IsMapModeEnabled();
577     mpOutDev->SetLineColor();
578     mpOutDev->SetFillColor( rColor );
579     mpOutDev->EnableMapMode( sal_False );
580 
581     if ( (rStyleSettings.GetOptions() & STYLE_OPTION_MONO) ||
582          (mpOutDev->GetOutDevType() == OUTDEV_PRINTER) )
583         nStyle |= BUTTON_DRAW_MONO;
584 
585     if ( nStyle & SYMBOL_DRAW_MONO )
586     {
587         if ( nStyle & SYMBOL_DRAW_DISABLE )
588             mpOutDev->SetFillColor( Color( COL_GRAY ) );
589         else
590             mpOutDev->SetFillColor( Color( COL_BLACK ) );
591     }
592     else
593     {
594         if ( nStyle & SYMBOL_DRAW_DISABLE )
595         {
596             // Als Embosed ausgeben
597             mpOutDev->SetFillColor( rStyleSettings.GetLightColor() );
598             Rectangle aTempRect = aRect;
599             aTempRect.Move( 1, 1 );
600             ImplDrawSymbol( mpOutDev, aTempRect, eType );
601             mpOutDev->SetFillColor( rStyleSettings.GetShadowColor() );
602         }
603         else
604             mpOutDev->SetFillColor( rColor );
605     }
606 
607     ImplDrawSymbol( mpOutDev, aRect, eType );
608 
609     mpOutDev->SetLineColor( aOldLineColor );
610     mpOutDev->SetFillColor( aOldFillColor );
611     mpOutDev->EnableMapMode( bOldMapMode );
612 }
613 
614 // =======================================================================
615 
DrawFrame(const Rectangle & rRect,const Color & rLeftTopColor,const Color & rRightBottomColor)616 void DecorationView::DrawFrame( const Rectangle& rRect,
617                                 const Color& rLeftTopColor,
618                                 const Color& rRightBottomColor )
619 {
620     Rectangle   aRect           = mpOutDev->LogicToPixel( rRect );
621     Color       aOldLineColor   = mpOutDev->GetLineColor();
622     Color       aOldFillColor   = mpOutDev->GetFillColor();
623     sal_Bool        bOldMapMode     = mpOutDev->IsMapModeEnabled();
624     mpOutDev->EnableMapMode( sal_False );
625     mpOutDev->SetLineColor();
626     mpOutDev->ImplDraw2ColorFrame( aRect, rLeftTopColor, rRightBottomColor );
627     mpOutDev->SetLineColor( aOldLineColor );
628     mpOutDev->SetFillColor( aOldFillColor );
629     mpOutDev->EnableMapMode( bOldMapMode );
630 }
631 
632 // =======================================================================
633 
DrawHighlightFrame(const Rectangle & rRect,sal_uInt16 nStyle)634 void DecorationView::DrawHighlightFrame( const Rectangle& rRect,
635                                          sal_uInt16 nStyle )
636 {
637     const StyleSettings& rStyleSettings = mpOutDev->GetSettings().GetStyleSettings();
638     Color aLightColor = rStyleSettings.GetLightColor();
639     Color aShadowColor = rStyleSettings.GetShadowColor();
640 
641     if ( (rStyleSettings.GetOptions() & STYLE_OPTION_MONO) ||
642          (mpOutDev->GetOutDevType() == OUTDEV_PRINTER) )
643     {
644         aLightColor = Color( COL_BLACK );
645         aShadowColor = Color( COL_BLACK );
646     }
647     else if ( nStyle & FRAME_HIGHLIGHT_TESTBACKGROUND )
648     {
649         Wallpaper aBackground = mpOutDev->GetBackground();
650         if ( aBackground.IsBitmap() || aBackground.IsGradient() )
651         {
652             aLightColor = rStyleSettings.GetFaceColor();
653             aShadowColor = Color( COL_BLACK );
654         }
655         else
656         {
657             Color aBackColor = aBackground.GetColor();
658             if ( (aLightColor.GetColorError( aBackColor ) < 32) ||
659                  (aShadowColor.GetColorError( aBackColor ) < 32) )
660             {
661                 aLightColor = Color( COL_WHITE );
662                 aShadowColor = Color( COL_BLACK );
663 
664                 if ( aLightColor.GetColorError( aBackColor ) < 32 )
665                     aLightColor.DecreaseLuminance( 64 );
666                 if ( aShadowColor.GetColorError( aBackColor ) < 32 )
667                     aShadowColor.IncreaseLuminance( 64 );
668             }
669         }
670     }
671 
672     if ( (nStyle & FRAME_HIGHLIGHT_STYLE) == FRAME_HIGHLIGHT_IN )
673     {
674         Color aTempColor = aLightColor;
675         aLightColor = aShadowColor;
676         aShadowColor = aTempColor;
677     }
678 
679     DrawFrame( rRect, aLightColor, aShadowColor );
680 }
681 
682 // =======================================================================
683 
ImplDrawDPILineRect(OutputDevice * pDev,Rectangle & rRect,const Color * pColor,sal_Bool bRound=sal_False)684 static void ImplDrawDPILineRect( OutputDevice* pDev, Rectangle& rRect,
685                                  const Color* pColor, sal_Bool bRound = sal_False )
686 {
687     long nLineWidth = pDev->ImplGetDPIX()/300;
688     long nLineHeight = pDev->ImplGetDPIY()/300;
689     if ( !nLineWidth )
690         nLineWidth = 1;
691     if ( !nLineHeight )
692         nLineHeight = 1;
693 
694     if ( pColor )
695     {
696         if ( (nLineWidth == 1) && (nLineHeight == 1) )
697         {
698             pDev->SetLineColor( *pColor );
699             pDev->SetFillColor();
700             if( bRound )
701             {
702                 pDev->DrawLine( Point( rRect.Left()+1, rRect.Top()), Point( rRect.Right()-1, rRect.Top()) );
703                 pDev->DrawLine( Point( rRect.Left()+1, rRect.Bottom()), Point( rRect.Right()-1, rRect.Bottom()) );
704                 pDev->DrawLine( Point( rRect.Left(), rRect.Top()+1), Point( rRect.Left(), rRect.Bottom()-1) );
705                 pDev->DrawLine( Point( rRect.Right(), rRect.Top()+1), Point( rRect.Right(), rRect.Bottom()-1) );
706             }
707             else
708                 pDev->DrawRect( rRect );
709         }
710         else
711         {
712             long nWidth = rRect.GetWidth();
713             long nHeight = rRect.GetHeight();
714             pDev->SetLineColor();
715             pDev->SetFillColor( *pColor );
716             pDev->DrawRect( Rectangle( rRect.TopLeft(), Size( nWidth, nLineHeight ) ) );
717             pDev->DrawRect( Rectangle( rRect.TopLeft(), Size( nLineWidth, nHeight ) ) );
718             pDev->DrawRect( Rectangle( Point( rRect.Left(), rRect.Bottom()-nLineHeight ),
719                                        Size( nWidth, nLineHeight ) ) );
720             pDev->DrawRect( Rectangle( Point( rRect.Right()-nLineWidth, rRect.Top() ),
721                                        Size( nLineWidth, nHeight ) ) );
722         }
723     }
724 
725     rRect.Left()    += nLineWidth;
726     rRect.Top()     += nLineHeight;
727     rRect.Right()   -= nLineWidth;
728     rRect.Bottom()  -= nLineHeight;
729 }
730 
731 // =======================================================================
732 
ImplDrawFrame(OutputDevice * pDev,Rectangle & rRect,const StyleSettings & rStyleSettings,sal_uInt16 nStyle)733 static void ImplDrawFrame( OutputDevice* pDev, Rectangle& rRect,
734                            const StyleSettings& rStyleSettings, sal_uInt16 nStyle )
735 {
736     // mask menu style
737     sal_Bool bMenuStyle = (nStyle & FRAME_DRAW_MENU) ? sal_True : sal_False;
738     nStyle &= ~FRAME_DRAW_MENU;
739 
740     Window *pWin = NULL;
741     if( pDev->GetOutDevType() == OUTDEV_WINDOW )
742         pWin = (Window*) pDev;
743 
744     // UseFlatBorders disables 3D style for all frames except menus
745     // menus may use different border colors (eg on XP)
746     // normal frames will be drawn using the shadow color
747     // whereas window frame borders will use black
748     sal_Bool bFlatBorders = ( !bMenuStyle && rStyleSettings.GetUseFlatBorders() );
749 
750     // no flat borders for standard VCL controls (ie formcontrols that keep their classic look)
751     // will not affect frame windows (like dropdowns)
752     if( bFlatBorders && pWin && pWin->GetType() == WINDOW_BORDERWINDOW && (pWin != pWin->ImplGetFrameWindow()) )
753     {
754         // check for formcontrol, i.e., a control without NWF enabled
755         Control *pControl = dynamic_cast< Control* >( pWin->GetWindow( WINDOW_CLIENT ) );
756         if( pControl && pControl->IsNativeWidgetEnabled() )
757             bFlatBorders = sal_True;
758         else
759             bFlatBorders = sal_False;
760     }
761 
762     // no round corners for window frame borders
763     sal_Bool bRound = (bFlatBorders && !(nStyle & FRAME_DRAW_WINDOWBORDER));
764 
765     if ( (rStyleSettings.GetOptions() & STYLE_OPTION_MONO) ||
766          (pDev->GetOutDevType() == OUTDEV_PRINTER) ||
767          bFlatBorders )
768         nStyle |= FRAME_DRAW_MONO;
769 
770     if ( nStyle & FRAME_DRAW_NODRAW )
771     {
772         sal_uInt16 nValueStyle = bMenuStyle ? nStyle | FRAME_DRAW_MENU : nStyle;
773         if( pWin->GetType() == WINDOW_BORDERWINDOW )
774             nValueStyle |= FRAME_DRAW_BORDERWINDOWBORDER;
775         ImplControlValue aControlValue( nValueStyle );
776         Rectangle aBound, aContent;
777         Rectangle aNatRgn( rRect );
778         if(pWin && pWin->GetNativeControlRegion(CTRL_FRAME, PART_BORDER,
779             aNatRgn, 0, aControlValue, rtl::OUString(), aBound, aContent) )
780         {
781             rRect = aContent;
782         }
783         else if ( nStyle & FRAME_DRAW_MONO )
784             ImplDrawDPILineRect( pDev, rRect, NULL, bRound );
785         else
786         {
787             sal_uInt16 nFrameStyle = nStyle & FRAME_DRAW_STYLE;
788 
789             if ( nFrameStyle == FRAME_DRAW_GROUP )
790             {
791                 rRect.Left()    += 2;
792                 rRect.Top()     += 2;
793                 rRect.Right()   -= 2;
794                 rRect.Bottom()  -= 2;
795             }
796             else if ( (nFrameStyle == FRAME_DRAW_IN) ||
797                       (nFrameStyle == FRAME_DRAW_OUT) )
798             {
799                 rRect.Left()++;
800                 rRect.Top()++;
801                 rRect.Right()--;
802                 rRect.Bottom()--;
803             }
804             else // FRAME_DRAW_DOUBLEIN || FRAME_DRAW_DOUBLEOUT
805             {
806                 rRect.Left()    += 2;
807                 rRect.Top()     += 2;
808                 rRect.Right()   -= 2;
809                 rRect.Bottom()  -= 2;
810             }
811         }
812     }
813     else
814     {
815         if( pWin && pWin->IsNativeControlSupported(CTRL_FRAME, PART_BORDER) )
816         {
817             sal_uInt16 nValueStyle = bMenuStyle ? nStyle | FRAME_DRAW_MENU : nStyle;
818             if( pWin->GetType() == WINDOW_BORDERWINDOW )
819                 nValueStyle |= FRAME_DRAW_BORDERWINDOWBORDER;
820             ImplControlValue aControlValue( nValueStyle );
821             Rectangle aBound, aContent;
822             Rectangle aNatRgn( rRect );
823             if( pWin->GetNativeControlRegion(CTRL_FRAME, PART_BORDER,
824                 aNatRgn, 0, aControlValue, rtl::OUString(), aBound, aContent) )
825             {
826                 if( pWin->DrawNativeControl( CTRL_FRAME, PART_BORDER, aContent, CTRL_STATE_ENABLED,
827                              aControlValue, rtl::OUString()) )
828                 {
829                     rRect = aContent;
830                     return;
831                 }
832             }
833         }
834 
835         if ( nStyle & FRAME_DRAW_MONO )
836         {
837             Color aColor = bRound ? rStyleSettings.GetShadowColor()
838                                   : pDev->GetSettings().GetStyleSettings().GetMonoColor();
839             // when the MonoColor wasn't set, check face color
840             if (
841                 (bRound && aColor.IsDark()) ||
842                 (
843                   (aColor == Color(COL_BLACK)) &&
844                   (pDev->GetSettings().GetStyleSettings().GetFaceColor().IsDark())
845                 )
846                )
847             {
848                 aColor = Color( COL_WHITE );
849             }
850             ImplDrawDPILineRect( pDev, rRect, &aColor, bRound );
851         }
852         else
853         {
854             sal_uInt16 nFrameStyle = nStyle & FRAME_DRAW_STYLE;
855             if ( nFrameStyle == FRAME_DRAW_GROUP )
856             {
857                 pDev->SetFillColor();
858                 pDev->SetLineColor( rStyleSettings.GetLightColor() );
859                 rRect.Top()++;
860                 rRect.Left()++;
861                 pDev->DrawRect( rRect );
862                 rRect.Top()--;
863                 rRect.Left()--;
864                 pDev->SetLineColor( rStyleSettings.GetShadowColor() );
865                 rRect.Right()--;
866                 rRect.Bottom()--;
867                 pDev->DrawRect( rRect );
868                 rRect.Right()++;
869                 rRect.Bottom()++;
870             }
871             else
872             {
873                 pDev->SetLineColor();
874 
875                 if ( (nFrameStyle == FRAME_DRAW_IN) ||
876                      (nFrameStyle == FRAME_DRAW_OUT) )
877                 {
878                     if ( nFrameStyle == FRAME_DRAW_IN )
879                     {
880                         pDev->ImplDraw2ColorFrame( rRect,
881                                                    rStyleSettings.GetShadowColor(),
882                                                    rStyleSettings.GetLightColor() );
883                     }
884                     else
885                     {
886                         pDev->ImplDraw2ColorFrame( rRect,
887                                                    rStyleSettings.GetLightColor(),
888                                                    rStyleSettings.GetShadowColor() );
889                     }
890 
891                     rRect.Left()++;
892                     rRect.Top()++;
893                     rRect.Right()--;
894                     rRect.Bottom()--;
895                 }
896                 else // FRAME_DRAW_DOUBLEIN || FRAME_DRAW_DOUBLEOUT
897                 {
898                     if ( nFrameStyle == FRAME_DRAW_DOUBLEIN )
899                     {
900                         if( bFlatBorders ) // no 3d effect
901                             pDev->ImplDraw2ColorFrame( rRect,
902                                                     rStyleSettings.GetShadowColor(),
903                                                     rStyleSettings.GetShadowColor() );
904                         else
905                             pDev->ImplDraw2ColorFrame( rRect,
906                                                     rStyleSettings.GetShadowColor(),
907                                                     rStyleSettings.GetLightColor() );
908                     }
909                     else
910                     {
911                         if( bMenuStyle )
912                             pDev->ImplDraw2ColorFrame( rRect,
913                                                    rStyleSettings.GetMenuBorderColor(),
914                                                    rStyleSettings.GetDarkShadowColor() );
915                         else
916                             pDev->ImplDraw2ColorFrame( rRect,
917                                                    bFlatBorders ? // no 3d effect
918                                                    rStyleSettings.GetDarkShadowColor() :
919                                                    rStyleSettings.GetLightBorderColor(),
920                                                    rStyleSettings.GetDarkShadowColor() );
921 
922                     }
923 
924                     rRect.Left()++;
925                     rRect.Top()++;
926                     rRect.Right()--;
927                     rRect.Bottom()--;
928 
929                     sal_Bool bDrawn = sal_True;
930                     if ( nFrameStyle == FRAME_DRAW_DOUBLEIN )
931                     {
932                         if( bFlatBorders ) // no 3d effect
933                             pDev->ImplDraw2ColorFrame( rRect,
934                                                     rStyleSettings.GetFaceColor(),
935                                                     rStyleSettings.GetFaceColor() );
936                         else
937                             pDev->ImplDraw2ColorFrame( rRect,
938                                                     rStyleSettings.GetDarkShadowColor(),
939                                                     rStyleSettings.GetLightBorderColor() );
940                     }
941                     else
942                     {
943                         // flat menues have no shadow border
944                         if( !bMenuStyle || !rStyleSettings.GetUseFlatMenues() )
945                             pDev->ImplDraw2ColorFrame( rRect,
946                                                     rStyleSettings.GetLightColor(),
947                                                     rStyleSettings.GetShadowColor() );
948                         else
949                             bDrawn = sal_False;
950                     }
951                     if( bDrawn )
952                     {
953                         rRect.Left()++;
954                         rRect.Top()++;
955                         rRect.Right()--;
956                         rRect.Bottom()--;
957                     }
958                 }
959             }
960         }
961     }
962 }
963 
964 // -----------------------------------------------------------------------
965 
DrawFrame(const Rectangle & rRect,sal_uInt16 nStyle)966 Rectangle DecorationView::DrawFrame( const Rectangle& rRect, sal_uInt16 nStyle )
967 {
968     Rectangle   aRect = rRect;
969     sal_Bool        bOldMap = mpOutDev->IsMapModeEnabled();
970     if ( bOldMap )
971     {
972         aRect = mpOutDev->LogicToPixel( aRect );
973         mpOutDev->EnableMapMode( sal_False );
974     }
975 
976     if ( !rRect.IsEmpty() )
977     {
978         if ( nStyle & FRAME_DRAW_NODRAW )
979              ImplDrawFrame( mpOutDev, aRect, mpOutDev->GetSettings().GetStyleSettings(), nStyle );
980         else
981         {
982              Color maOldLineColor  = mpOutDev->GetLineColor();
983              Color maOldFillColor  = mpOutDev->GetFillColor();
984              ImplDrawFrame( mpOutDev, aRect, mpOutDev->GetSettings().GetStyleSettings(), nStyle );
985              mpOutDev->SetLineColor( maOldLineColor );
986              mpOutDev->SetFillColor( maOldFillColor );
987         }
988     }
989 
990     if ( bOldMap )
991     {
992         mpOutDev->EnableMapMode( bOldMap );
993         aRect = mpOutDev->PixelToLogic( aRect );
994     }
995 
996     return aRect;
997 }
998 
999 // =======================================================================
1000 
ImplDrawButton(OutputDevice * pDev,Rectangle & rRect,const StyleSettings & rStyleSettings,sal_uInt16 nStyle)1001 static void ImplDrawButton( OutputDevice* pDev, Rectangle& rRect,
1002                             const StyleSettings& rStyleSettings, sal_uInt16 nStyle )
1003 {
1004     Rectangle aFillRect = rRect;
1005 
1006     if ( nStyle & BUTTON_DRAW_MONO )
1007     {
1008         if ( !(nStyle & BUTTON_DRAW_NODRAW) )
1009         {
1010             Color aBlackColor( COL_BLACK );
1011 
1012             if ( nStyle & BUTTON_DRAW_DEFAULT )
1013                 ImplDrawDPILineRect( pDev, aFillRect, &aBlackColor );
1014 
1015             ImplDrawDPILineRect( pDev, aFillRect, &aBlackColor );
1016 
1017             Size aBrdSize( 1, 1 );
1018             if ( pDev->GetOutDevType() == OUTDEV_PRINTER )
1019             {
1020                 MapMode aResMapMode( MAP_100TH_MM );
1021                 aBrdSize = pDev->LogicToPixel( Size( 20, 20 ), aResMapMode );
1022                 if ( !aBrdSize.Width() )
1023                     aBrdSize.Width() = 1;
1024                 if ( !aBrdSize.Height() )
1025                     aBrdSize.Height() = 1;
1026             }
1027             pDev->SetLineColor();
1028             pDev->SetFillColor( aBlackColor );
1029             Rectangle aRect1;
1030             Rectangle aRect2;
1031             aRect1.Left()   = aFillRect.Left();
1032             aRect1.Right()  = aFillRect.Right(),
1033             aRect2.Top()    = aFillRect.Top();
1034             aRect2.Bottom() = aFillRect.Bottom();
1035             if ( nStyle & (BUTTON_DRAW_PRESSED | BUTTON_DRAW_CHECKED) )
1036             {
1037                 aRect1.Top()    = aFillRect.Top();
1038                 aRect1.Bottom() = aBrdSize.Height()-1;
1039                 aRect2.Left()   = aFillRect.Left();
1040                 aRect2.Right()  = aFillRect.Left()+aBrdSize.Width()-1;
1041                 aFillRect.Left() += aBrdSize.Width();
1042                 aFillRect.Top()  += aBrdSize.Height();
1043             }
1044             else
1045             {
1046                 aRect1.Top()    = aFillRect.Bottom()-aBrdSize.Height()+1;
1047                 aRect1.Bottom() = aFillRect.Bottom();
1048                 aRect2.Left()   = aFillRect.Right()-aBrdSize.Width()+1;
1049                 aRect2.Right()  = aFillRect.Right(),
1050                 aFillRect.Right()  -= aBrdSize.Width();
1051                 aFillRect.Bottom() -= aBrdSize.Height();
1052             }
1053             pDev->DrawRect( aRect1 );
1054             pDev->DrawRect( aRect2 );
1055         }
1056     }
1057     else
1058     {
1059         if ( !(nStyle & BUTTON_DRAW_NODRAW) )
1060         {
1061             if ( nStyle & BUTTON_DRAW_DEFAULT )
1062             {
1063                 Color aDefBtnColor = rStyleSettings.GetDarkShadowColor();
1064                 ImplDrawDPILineRect( pDev, aFillRect, &aDefBtnColor );
1065             }
1066         }
1067 
1068         if ( !(nStyle & BUTTON_DRAW_NODRAW) )
1069         {
1070             pDev->SetLineColor();
1071             if ( nStyle & BUTTON_DRAW_NOLEFTLIGHTBORDER )
1072             {
1073                 pDev->SetFillColor( rStyleSettings.GetLightBorderColor() );
1074                 pDev->DrawRect( Rectangle( aFillRect.Left(), aFillRect.Top(),
1075                                            aFillRect.Left(), aFillRect.Bottom() ) );
1076                 aFillRect.Left()++;
1077             }
1078             if ( (nStyle & BUTTON_DRAW_NOTOPLIGHTBORDER) &&
1079                  !(nStyle & (BUTTON_DRAW_PRESSED | BUTTON_DRAW_CHECKED)) )
1080             {
1081                 pDev->SetFillColor( rStyleSettings.GetLightBorderColor() );
1082                 pDev->DrawRect( Rectangle( aFillRect.Left(), aFillRect.Top(),
1083                                            aFillRect.Right(), aFillRect.Top() ) );
1084                 aFillRect.Top()++;
1085             }
1086             if ( (( (nStyle & BUTTON_DRAW_NOBOTTOMSHADOWBORDER) | BUTTON_DRAW_FLAT) == (BUTTON_DRAW_NOBOTTOMSHADOWBORDER | BUTTON_DRAW_FLAT)) &&
1087                  !(nStyle & (BUTTON_DRAW_PRESSED | BUTTON_DRAW_CHECKED | BUTTON_DRAW_HIGHLIGHT)) )
1088             {
1089                 pDev->SetFillColor( rStyleSettings.GetDarkShadowColor() );
1090                 pDev->DrawRect( Rectangle( aFillRect.Left(), aFillRect.Bottom(),
1091                                            aFillRect.Right(), aFillRect.Bottom() ) );
1092                 aFillRect.Bottom()--;
1093             }
1094 
1095             Color aColor1;
1096             Color aColor2;
1097             if ( nStyle & (BUTTON_DRAW_PRESSED | BUTTON_DRAW_CHECKED) )
1098             {
1099                 aColor1 = rStyleSettings.GetDarkShadowColor();
1100                 aColor2 = rStyleSettings.GetLightColor();
1101             }
1102             else
1103             {
1104                 if ( nStyle & BUTTON_DRAW_NOLIGHTBORDER )
1105                     aColor1 = rStyleSettings.GetLightBorderColor();
1106                 else
1107                     aColor1 = rStyleSettings.GetLightColor();
1108                 if ( (nStyle & BUTTON_DRAW_FLATTEST) == BUTTON_DRAW_FLAT )
1109                     aColor2 = rStyleSettings.GetShadowColor();
1110                 else
1111                     aColor2 = rStyleSettings.GetDarkShadowColor();
1112             }
1113             pDev->ImplDraw2ColorFrame( aFillRect, aColor1, aColor2 );
1114             aFillRect.Left()++;
1115             aFillRect.Top()++;
1116             aFillRect.Right()--;
1117             aFillRect.Bottom()--;
1118 
1119             if ( !((nStyle & BUTTON_DRAW_FLATTEST) == BUTTON_DRAW_FLAT) )
1120             {
1121                 if ( nStyle & (BUTTON_DRAW_PRESSED | BUTTON_DRAW_CHECKED) )
1122                 {
1123                     aColor1 = rStyleSettings.GetShadowColor();
1124                     aColor2 = rStyleSettings.GetLightBorderColor();
1125                 }
1126                 else
1127                 {
1128                     if ( nStyle & BUTTON_DRAW_NOLIGHTBORDER )
1129                         aColor1 = rStyleSettings.GetLightColor();
1130                     else
1131                         aColor1 = rStyleSettings.GetLightBorderColor();
1132                     aColor2 = rStyleSettings.GetShadowColor();
1133                 }
1134                 pDev->ImplDraw2ColorFrame( aFillRect, aColor1, aColor2 );
1135                 aFillRect.Left()++;
1136                 aFillRect.Top()++;
1137                 aFillRect.Right()--;
1138                 aFillRect.Bottom()--;
1139             }
1140         }
1141     }
1142 
1143     if ( !(nStyle & (BUTTON_DRAW_NOFILL | BUTTON_DRAW_NODRAW)) )
1144     {
1145         pDev->SetLineColor();
1146         if ( nStyle & BUTTON_DRAW_MONO )
1147         {
1148             // Hack: Auf Druckern wollen wir im MonoChrom-Modus trotzdem
1149             // erstmal graue Buttons haben
1150             if ( pDev->GetOutDevType() == OUTDEV_PRINTER )
1151                 pDev->SetFillColor( Color( COL_LIGHTGRAY ) );
1152             else
1153                 pDev->SetFillColor( Color( COL_WHITE ) );
1154         }
1155         else
1156         {
1157             if ( nStyle & (BUTTON_DRAW_CHECKED | BUTTON_DRAW_DONTKNOW) )
1158                 pDev->SetFillColor( rStyleSettings.GetCheckedColor() );
1159             else
1160                 pDev->SetFillColor( rStyleSettings.GetFaceColor() );
1161         }
1162         pDev->DrawRect( aFillRect );
1163     }
1164 
1165     // Ein Border freilassen, der jedoch bei Default-Darstellung
1166     // mitbenutzt wird
1167     rRect.Left()++;
1168     rRect.Top()++;
1169     rRect.Right()--;
1170     rRect.Bottom()--;
1171 
1172     if ( nStyle & BUTTON_DRAW_NOLIGHTBORDER )
1173     {
1174         rRect.Left()++;
1175         rRect.Top()++;
1176     }
1177     else if ( nStyle & BUTTON_DRAW_NOLEFTLIGHTBORDER )
1178         rRect.Left()++;
1179 
1180     if ( nStyle & BUTTON_DRAW_PRESSED )
1181     {
1182         if ( (rRect.GetHeight() > 10) && (rRect.GetWidth() > 10) )
1183         {
1184             rRect.Left()    += 4;
1185             rRect.Top()     += 4;
1186             rRect.Right()   -= 1;
1187             rRect.Bottom()  -= 1;
1188         }
1189         else
1190         {
1191             rRect.Left()    += 3;
1192             rRect.Top()     += 3;
1193             rRect.Right()   -= 2;
1194             rRect.Bottom()  -= 2;
1195         }
1196     }
1197     else if ( nStyle & BUTTON_DRAW_CHECKED )
1198     {
1199         rRect.Left()    += 3;
1200         rRect.Top()     += 3;
1201         rRect.Right()   -= 2;
1202         rRect.Bottom()  -= 2;
1203     }
1204     else
1205     {
1206         rRect.Left()    += 2;
1207         rRect.Top()     += 2;
1208         rRect.Right()   -= 3;
1209         rRect.Bottom()  -= 3;
1210     }
1211 }
1212 
1213 // -----------------------------------------------------------------------
1214 
DrawButton(const Rectangle & rRect,sal_uInt16 nStyle)1215 Rectangle DecorationView::DrawButton( const Rectangle& rRect, sal_uInt16 nStyle )
1216 {
1217     Rectangle   aRect = rRect;
1218     sal_Bool        bOldMap = mpOutDev->IsMapModeEnabled();
1219     if ( bOldMap )
1220     {
1221         aRect = mpOutDev->LogicToPixel( aRect );
1222         mpOutDev->EnableMapMode( sal_False );
1223     }
1224 
1225     if ( !rRect.IsEmpty() )
1226     {
1227         const StyleSettings& rStyleSettings = mpOutDev->GetSettings().GetStyleSettings();
1228 
1229         if ( rStyleSettings.GetOptions() & STYLE_OPTION_MONO )
1230             nStyle |= BUTTON_DRAW_MONO;
1231 
1232         if ( nStyle & BUTTON_DRAW_NODRAW )
1233              ImplDrawButton( mpOutDev, aRect, rStyleSettings, nStyle );
1234         else
1235         {
1236              Color maOldLineColor  = mpOutDev->GetLineColor();
1237              Color maOldFillColor  = mpOutDev->GetFillColor();
1238              ImplDrawButton( mpOutDev, aRect, rStyleSettings, nStyle );
1239              mpOutDev->SetLineColor( maOldLineColor );
1240              mpOutDev->SetFillColor( maOldFillColor );
1241         }
1242     }
1243 
1244     if ( bOldMap )
1245     {
1246         mpOutDev->EnableMapMode( bOldMap );
1247         aRect = mpOutDev->PixelToLogic( aRect );
1248     }
1249 
1250     return aRect;
1251 }
1252 
1253 // -----------------------------------------------------------------------
1254 
DrawSeparator(const Point & rStart,const Point & rStop,bool bVertical)1255 void DecorationView::DrawSeparator( const Point& rStart, const Point& rStop, bool bVertical )
1256 {
1257     Point aStart( rStart ), aStop( rStop );
1258     const StyleSettings& rStyleSettings = mpOutDev->GetSettings().GetStyleSettings();
1259 
1260     mpOutDev->Push( PUSH_LINECOLOR );
1261     if ( rStyleSettings.GetOptions() & STYLE_OPTION_MONO )
1262         mpOutDev->SetLineColor( Color( COL_BLACK ) );
1263     else
1264         mpOutDev->SetLineColor( rStyleSettings.GetShadowColor() );
1265 
1266     mpOutDev->DrawLine( aStart, aStop );
1267     if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) )
1268     {
1269         mpOutDev->SetLineColor( rStyleSettings.GetLightColor() );
1270         if( bVertical )
1271         {
1272             aStart.X()++;
1273             aStop.X()++;
1274         }
1275         else
1276         {
1277             aStart.Y()++;
1278             aStop.Y()++;
1279         }
1280         mpOutDev->DrawLine( aStart, aStop );
1281     }
1282     mpOutDev->Pop();
1283 }
1284 
1285