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