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 25 #include <tools/rc.h> 26 #include <tools/poly.hxx> 27 28 #include <vcl/event.hxx> 29 #include <vcl/split.hxx> 30 #include <vcl/svapp.hxx> 31 #include <vcl/syswin.hxx> 32 #include <vcl/taskpanelist.hxx> 33 #include <vcl/gradient.hxx> 34 #include <vcl/lineinfo.hxx> 35 36 #include <rtl/instance.hxx> 37 38 #include <window.h> 39 40 namespace 41 { 42 struct ImplBlackWall 43 : public rtl::StaticWithInit<Wallpaper, ImplBlackWall> { 44 Wallpaper operator () () { 45 return Wallpaper(COL_BLACK); 46 } 47 }; 48 struct ImplWhiteWall 49 : public rtl::StaticWithInit<Wallpaper, ImplWhiteWall> { 50 Wallpaper operator () () { 51 return Wallpaper(COL_LIGHTGRAY); 52 } 53 }; 54 } 55 56 // ======================================================================= 57 58 void Splitter::ImplInitSplitterData() 59 { 60 ImplGetWindowImpl()->mbSplitter = sal_True; 61 mpRefWin = NULL; 62 mnSplitPos = 0; 63 mnLastSplitPos = 0; 64 mnStartSplitPos = 0; 65 mbDragFull = sal_False; 66 mbKbdSplitting = sal_False; 67 mbInKeyEvent = 0; 68 mnKeyboardStepSize = SPLITTER_DEFAULTSTEPSIZE; 69 } 70 71 // ----------------------------------------------------------------------- 72 73 void Splitter::ImplInitHorVer(bool bNew) 74 { 75 if(bNew != (bool)mbHorzSplit) 76 { 77 mbHorzSplit = bNew; 78 79 PointerStyle ePointerStyle; 80 const StyleSettings& rSettings = GetSettings().GetStyleSettings(); 81 82 if ( mbHorzSplit ) 83 { 84 ePointerStyle = POINTER_HSPLIT; 85 SetSizePixel( Size( rSettings.GetSplitSize(), rSettings.GetScrollBarSize() ) ); 86 } 87 else 88 { 89 ePointerStyle = POINTER_VSPLIT; 90 SetSizePixel( Size( rSettings.GetScrollBarSize(), rSettings.GetSplitSize() ) ); 91 } 92 93 SetPointer( Pointer( ePointerStyle ) ); 94 } 95 } 96 97 // ----------------------------------------------------------------------- 98 99 void Splitter::ImplInit( Window* pParent, WinBits nWinStyle ) 100 { 101 Window::ImplInit( pParent, nWinStyle, NULL ); 102 103 mpRefWin = pParent; 104 105 ImplInitHorVer(nWinStyle & WB_HSCROLL); 106 107 if( GetSettings().GetStyleSettings().GetFaceColor().IsDark() ) 108 SetBackground( ImplWhiteWall::get() ); 109 else 110 SetBackground( ImplBlackWall::get() ); 111 112 TaskPaneList *pTList = GetSystemWindow()->GetTaskPaneList(); 113 pTList->AddWindow( this ); 114 } 115 116 // ----------------------------------------------------------------------- 117 118 void Splitter::ImplSplitMousePos( Point& rPos ) 119 { 120 if ( mbHorzSplit ) 121 { 122 if ( rPos.X() > maDragRect.Right()-1 ) 123 rPos.X() = maDragRect.Right()-1; 124 if ( rPos.X() < maDragRect.Left()+1 ) 125 rPos.X() = maDragRect.Left()+1; 126 } 127 else 128 { 129 if ( rPos.Y() > maDragRect.Bottom()-1 ) 130 rPos.Y() = maDragRect.Bottom()-1; 131 if ( rPos.Y() < maDragRect.Top()+1 ) 132 rPos.Y() = maDragRect.Top()+1; 133 } 134 } 135 136 // ----------------------------------------------------------------------- 137 138 void Splitter::ImplDrawSplitter() 139 { 140 Rectangle aInvRect( maDragRect ); 141 142 if ( mbHorzSplit ) 143 { 144 aInvRect.Left() = maDragPos.X() - 1; 145 aInvRect.Right() = maDragPos.X() + 1; 146 } 147 else 148 { 149 aInvRect.Top() = maDragPos.Y() - 1; 150 aInvRect.Bottom() = maDragPos.Y() + 1; 151 } 152 153 mpRefWin->InvertTracking( mpRefWin->PixelToLogic(aInvRect), SHOWTRACK_SPLIT ); 154 } 155 156 // ----------------------------------------------------------------------- 157 158 Splitter::Splitter( Window* pParent, WinBits nStyle ) : 159 Window( WINDOW_SPLITTER ) 160 { 161 ImplInitSplitterData(); 162 ImplInit( pParent, nStyle ); 163 } 164 165 // ----------------------------------------------------------------------- 166 167 Splitter::Splitter( Window* pParent, const ResId& rResId ) : 168 Window( WINDOW_SPLITTER ) 169 { 170 ImplInitSplitterData(); 171 rResId.SetRT( RSC_SPLITTER ); 172 WinBits nStyle = ImplInitRes( rResId ); 173 ImplInit( pParent, nStyle ); 174 ImplLoadRes( rResId ); 175 176 if ( !(nStyle & WB_HIDE) ) 177 Show(); 178 } 179 180 // ----------------------------------------------------------------------- 181 182 Splitter::~Splitter() 183 { 184 TaskPaneList *pTList = GetSystemWindow()->GetTaskPaneList(); 185 pTList->RemoveWindow( this ); 186 } 187 188 // ----------------------------------------------------------------------- 189 190 void Splitter::SetHorizontal(bool bNew) 191 { 192 if(bNew != (bool)mbHorzSplit) 193 { 194 ImplInitHorVer(bNew); 195 } 196 } 197 198 // ----------------------------------------------------------------------- 199 200 void Splitter::SetKeyboardStepSize( long nStepSize ) 201 { 202 mnKeyboardStepSize = nStepSize; 203 } 204 205 // ----------------------------------------------------------------------- 206 207 long Splitter::GetKeyboardStepSize() const 208 { 209 return mnKeyboardStepSize; 210 } 211 212 // ----------------------------------------------------------------------- 213 214 Splitter* Splitter::ImplFindSibling() 215 { 216 // look for another splitter with the same parent but different orientation 217 Window *pWin = GetParent()->GetWindow( WINDOW_FIRSTCHILD ); 218 Splitter *pSplitter = NULL; 219 while( pWin ) 220 { 221 if( pWin->ImplIsSplitter() ) 222 { 223 pSplitter = (Splitter*) pWin; 224 if( pSplitter != this && IsHorizontal() != pSplitter->IsHorizontal() ) 225 return pSplitter; 226 } 227 pWin = pWin->GetWindow( WINDOW_NEXT ); 228 } 229 return NULL; 230 } 231 232 // ----------------------------------------------------------------------- 233 234 sal_Bool Splitter::ImplSplitterActive() 235 { 236 // is splitter in document or at scrollbar handle ? 237 238 sal_Bool bActive = sal_True; 239 const StyleSettings& rSettings = GetSettings().GetStyleSettings(); 240 long nA = rSettings.GetScrollBarSize(); 241 long nB = rSettings.GetSplitSize(); 242 243 Size aSize = GetOutputSize(); 244 if ( mbHorzSplit ) 245 { 246 if( aSize.Width() == nB && aSize.Height() == nA ) 247 bActive = sal_False; 248 } 249 else 250 { 251 if( aSize.Width() == nA && aSize.Height() == nB ) 252 bActive = sal_False; 253 } 254 return bActive; 255 } 256 257 // ----------------------------------------------------------------------- 258 259 void Splitter::MouseButtonDown( const MouseEvent& rMEvt ) 260 { 261 if ( rMEvt.GetClicks() == 2 ) 262 { 263 if ( mnLastSplitPos != mnSplitPos ) 264 { 265 StartSplit(); 266 Point aPos = rMEvt.GetPosPixel(); 267 if ( mbHorzSplit ) 268 aPos.X() = mnLastSplitPos; 269 else 270 aPos.Y() = mnLastSplitPos; 271 ImplSplitMousePos( aPos ); 272 Splitting( aPos ); 273 ImplSplitMousePos( aPos ); 274 long nTemp = mnSplitPos; 275 if ( mbHorzSplit ) 276 SetSplitPosPixel( aPos.X() ); 277 else 278 SetSplitPosPixel( aPos.Y() ); 279 mnLastSplitPos = nTemp; 280 Split(); 281 EndSplit(); 282 } 283 } 284 else 285 StartDrag(); 286 } 287 288 // ----------------------------------------------------------------------- 289 290 void Splitter::Tracking( const TrackingEvent& rTEvt ) 291 { 292 if ( rTEvt.IsTrackingEnded() ) 293 { 294 if ( !mbDragFull ) 295 ImplDrawSplitter(); 296 297 if ( !rTEvt.IsTrackingCanceled() ) 298 { 299 long nNewPos; 300 if ( mbHorzSplit ) 301 nNewPos = maDragPos.X(); 302 else 303 nNewPos = maDragPos.Y(); 304 if ( nNewPos != mnStartSplitPos ) 305 { 306 SetSplitPosPixel( nNewPos ); 307 mnLastSplitPos = 0; 308 Split(); 309 } 310 EndSplit(); 311 } 312 else if ( mbDragFull ) 313 { 314 SetSplitPosPixel( mnStartSplitPos ); 315 Split(); 316 } 317 mnStartSplitPos = 0; 318 } 319 else 320 { 321 //Point aNewPos = mpRefWin->ScreenToOutputPixel( OutputToScreenPixel( rTEvt.GetMouseEvent().GetPosPixel() ) ); 322 Point aNewPos = mpRefWin->NormalizedScreenToOutputPixel( OutputToNormalizedScreenPixel( rTEvt.GetMouseEvent().GetPosPixel() ) ); 323 ImplSplitMousePos( aNewPos ); 324 Splitting( aNewPos ); 325 ImplSplitMousePos( aNewPos ); 326 327 if ( mbHorzSplit ) 328 { 329 if ( aNewPos.X() == maDragPos.X() ) 330 return; 331 } 332 else 333 { 334 if ( aNewPos.Y() == maDragPos.Y() ) 335 return; 336 } 337 338 if ( mbDragFull ) 339 { 340 maDragPos = aNewPos; 341 long nNewPos; 342 if ( mbHorzSplit ) 343 nNewPos = maDragPos.X(); 344 else 345 nNewPos = maDragPos.Y(); 346 if ( nNewPos != mnSplitPos ) 347 { 348 SetSplitPosPixel( nNewPos ); 349 mnLastSplitPos = 0; 350 Split(); 351 } 352 353 GetParent()->Update(); 354 } 355 else 356 { 357 ImplDrawSplitter(); 358 maDragPos = aNewPos; 359 ImplDrawSplitter(); 360 } 361 } 362 } 363 364 // ----------------------------------------------------------------------- 365 366 void Splitter::ImplKbdTracking( KeyCode aKeyCode ) 367 { 368 sal_uInt16 nCode = aKeyCode.GetCode(); 369 if ( nCode == KEY_ESCAPE || nCode == KEY_RETURN ) 370 { 371 if( !mbKbdSplitting ) 372 return; 373 else 374 mbKbdSplitting = sal_False; 375 376 if ( nCode != KEY_ESCAPE ) 377 { 378 long nNewPos; 379 if ( mbHorzSplit ) 380 nNewPos = maDragPos.X(); 381 else 382 nNewPos = maDragPos.Y(); 383 if ( nNewPos != mnStartSplitPos ) 384 { 385 SetSplitPosPixel( nNewPos ); 386 mnLastSplitPos = 0; 387 Split(); 388 } 389 } 390 else 391 { 392 SetSplitPosPixel( mnStartSplitPos ); 393 Split(); 394 EndSplit(); 395 } 396 mnStartSplitPos = 0; 397 } 398 else 399 { 400 Point aNewPos; 401 Size aSize = mpRefWin->GetOutputSize(); 402 Point aPos = GetPosPixel(); 403 // depending on the position calc allows continous moves or snaps to row/columns 404 // continous mode is active when position is at the origin or end of the splitter 405 // otherwise snap mode is active 406 // default here is snap, holding shift sets continous mode 407 if( mbHorzSplit ) 408 aNewPos = Point( ImplSplitterActive() ? aPos.X() : mnSplitPos, aKeyCode.IsShift() ? 0 : aSize.Height()/2); 409 else 410 aNewPos = Point( aKeyCode.IsShift() ? 0 : aSize.Width()/2, ImplSplitterActive() ? aPos.Y() : mnSplitPos ); 411 412 Point aOldWindowPos = GetPosPixel(); 413 414 int maxiter = 500; // avoid endless loop 415 int delta=0; 416 int delta_step = mbHorzSplit ? aSize.Width()/10 : aSize.Height()/10; 417 418 // use the specified step size if it was set 419 if( mnKeyboardStepSize != SPLITTER_DEFAULTSTEPSIZE ) 420 delta_step = mnKeyboardStepSize; 421 422 while( maxiter-- && aOldWindowPos == GetPosPixel() ) 423 { 424 // inc/dec position until application performs changes 425 // thus a single key press really moves the splitter 426 if( aKeyCode.IsShift() ) 427 delta++; 428 else 429 delta += delta_step; 430 431 switch( nCode ) 432 { 433 case KEY_LEFT: 434 aNewPos.X()-=delta; 435 break; 436 case KEY_RIGHT: 437 aNewPos.X()+=delta; 438 break; 439 case KEY_UP: 440 aNewPos.Y()-=delta; 441 break; 442 case KEY_DOWN: 443 aNewPos.Y()+=delta; 444 break; 445 default: 446 maxiter = 0; // leave loop 447 break; 448 } 449 ImplSplitMousePos( aNewPos ); 450 Splitting( aNewPos ); 451 ImplSplitMousePos( aNewPos ); 452 453 if ( mbHorzSplit ) 454 { 455 if ( aNewPos.X() == maDragPos.X() ) 456 continue; 457 } 458 else 459 { 460 if ( aNewPos.Y() == maDragPos.Y() ) 461 continue; 462 } 463 464 maDragPos = aNewPos; 465 long nNewPos; 466 if ( mbHorzSplit ) 467 nNewPos = maDragPos.X(); 468 else 469 nNewPos = maDragPos.Y(); 470 if ( nNewPos != mnSplitPos ) 471 { 472 SetSplitPosPixel( nNewPos ); 473 mnLastSplitPos = 0; 474 Split(); 475 } 476 GetParent()->Update(); 477 } 478 } 479 } 480 481 // ----------------------------------------------------------------------- 482 483 void Splitter::StartSplit() 484 { 485 maStartSplitHdl.Call( this ); 486 } 487 488 // ----------------------------------------------------------------------- 489 490 void Splitter::Split() 491 { 492 maSplitHdl.Call( this ); 493 } 494 495 // ----------------------------------------------------------------------- 496 497 void Splitter::EndSplit() 498 { 499 if ( maEndSplitHdl.IsSet() ) 500 maEndSplitHdl.Call( this ); 501 } 502 503 // ----------------------------------------------------------------------- 504 505 void Splitter::Splitting( Point& /* rSplitPos */ ) 506 { 507 } 508 509 // ----------------------------------------------------------------------- 510 511 void Splitter::SetDragRectPixel( const Rectangle& rDragRect, Window* _pRefWin ) 512 { 513 maDragRect = rDragRect; 514 if ( !_pRefWin ) 515 mpRefWin = GetParent(); 516 else 517 mpRefWin = _pRefWin; 518 } 519 520 // ----------------------------------------------------------------------- 521 522 void Splitter::SetSplitPosPixel( long nNewPos ) 523 { 524 mnSplitPos = nNewPos; 525 } 526 527 // ----------------------------------------------------------------------- 528 529 void Splitter::SetLastSplitPosPixel( long nNewPos ) 530 { 531 mnLastSplitPos = nNewPos; 532 } 533 534 // ----------------------------------------------------------------------- 535 536 void Splitter::StartDrag() 537 { 538 if ( IsTracking() ) 539 return; 540 541 StartSplit(); 542 543 // Tracking starten 544 StartTracking(); 545 546 // Start-Positon ermitteln 547 maDragPos = mpRefWin->GetPointerPosPixel(); 548 ImplSplitMousePos( maDragPos ); 549 Splitting( maDragPos ); 550 ImplSplitMousePos( maDragPos ); 551 if ( mbHorzSplit ) 552 mnStartSplitPos = maDragPos.X(); 553 else 554 mnStartSplitPos = maDragPos.Y(); 555 556 mbDragFull = (Application::GetSettings().GetStyleSettings().GetDragFullOptions() & DRAGFULL_OPTION_SPLIT) != 0; 557 if ( !mbDragFull ) 558 ImplDrawSplitter(); 559 } 560 561 562 // ----------------------------------------------------------------------- 563 564 void Splitter::ImplStartKbdSplitting() 565 { 566 if( mbKbdSplitting ) 567 return; 568 569 mbKbdSplitting = sal_True; 570 571 StartSplit(); 572 573 // determine start position 574 // because we have no mouse position we take either the position 575 // of the splitter window or the last split position 576 // the other coordinate is just the center of the reference window 577 Size aSize = mpRefWin->GetOutputSize(); 578 Point aPos = GetPosPixel(); 579 if( mbHorzSplit ) 580 maDragPos = Point( ImplSplitterActive() ? aPos.X() : mnSplitPos, aSize.Height()/2 ); 581 else 582 maDragPos = Point( aSize.Width()/2, ImplSplitterActive() ? aPos.Y() : mnSplitPos ); 583 ImplSplitMousePos( maDragPos ); 584 Splitting( maDragPos ); 585 ImplSplitMousePos( maDragPos ); 586 if ( mbHorzSplit ) 587 mnStartSplitPos = maDragPos.X(); 588 else 589 mnStartSplitPos = maDragPos.Y(); 590 } 591 592 // ----------------------------------------------------------------------- 593 594 void Splitter::ImplRestoreSplitter() 595 { 596 // set splitter in the center of the ref window 597 StartSplit(); 598 Size aSize = mpRefWin->GetOutputSize(); 599 Point aPos = Point( aSize.Width()/2 , aSize.Height()/2); 600 if ( mnLastSplitPos != mnSplitPos && mnLastSplitPos > 5 ) 601 { 602 // restore last pos if it was a useful position (>5) 603 if ( mbHorzSplit ) 604 aPos.X() = mnLastSplitPos; 605 else 606 aPos.Y() = mnLastSplitPos; 607 } 608 609 ImplSplitMousePos( aPos ); 610 Splitting( aPos ); 611 ImplSplitMousePos( aPos ); 612 long nTemp = mnSplitPos; 613 if ( mbHorzSplit ) 614 SetSplitPosPixel( aPos.X() ); 615 else 616 SetSplitPosPixel( aPos.Y() ); 617 mnLastSplitPos = nTemp; 618 Split(); 619 EndSplit(); 620 } 621 622 623 // ----------------------------------------------------------------------- 624 625 void Splitter::GetFocus() 626 { 627 if( !ImplSplitterActive() ) 628 ImplRestoreSplitter(); 629 630 Invalidate(); 631 } 632 633 // ----------------------------------------------------------------------- 634 635 void Splitter::LoseFocus() 636 { 637 if( mbKbdSplitting ) 638 { 639 KeyCode aReturnKey( KEY_RETURN ); 640 ImplKbdTracking( aReturnKey ); 641 mbKbdSplitting = sal_False; 642 } 643 Invalidate(); 644 } 645 646 // ----------------------------------------------------------------------- 647 648 void Splitter::KeyInput( const KeyEvent& rKEvt ) 649 { 650 if( mbInKeyEvent ) 651 return; 652 653 mbInKeyEvent = 1; 654 655 Splitter *pSibling = ImplFindSibling(); 656 KeyCode aKeyCode = rKEvt.GetKeyCode(); 657 sal_uInt16 nCode = aKeyCode.GetCode(); 658 switch ( nCode ) 659 { 660 case KEY_UP: 661 case KEY_DOWN: 662 if( !mbHorzSplit ) 663 { 664 ImplStartKbdSplitting(); 665 ImplKbdTracking( aKeyCode ); 666 } 667 else 668 { 669 if( pSibling ) 670 { 671 pSibling->GrabFocus(); 672 pSibling->KeyInput( rKEvt ); 673 } 674 } 675 break; 676 case KEY_RIGHT: 677 case KEY_LEFT: 678 if( mbHorzSplit ) 679 { 680 ImplStartKbdSplitting(); 681 ImplKbdTracking( aKeyCode ); 682 } 683 else 684 { 685 if( pSibling ) 686 { 687 pSibling->GrabFocus(); 688 pSibling->KeyInput( rKEvt ); 689 } 690 } 691 break; 692 693 case KEY_DELETE: 694 if( ImplSplitterActive() ) 695 { 696 if( mbKbdSplitting ) 697 { 698 KeyCode aKey( KEY_ESCAPE ); 699 ImplKbdTracking( aKey ); 700 } 701 702 StartSplit(); 703 Point aPos; 704 if ( mbHorzSplit ) 705 aPos.X() = 0; 706 else 707 aPos.Y() = 0; 708 ImplSplitMousePos( aPos ); 709 Splitting( aPos ); 710 ImplSplitMousePos( aPos ); 711 long nTemp = mnSplitPos; 712 if ( mbHorzSplit ) 713 SetSplitPosPixel( aPos.X() ); 714 else 715 SetSplitPosPixel( aPos.Y() ); 716 mnLastSplitPos = nTemp; 717 Split(); 718 EndSplit(); 719 720 // Shift-Del deletes both splitters 721 if( aKeyCode.IsShift() && pSibling ) 722 pSibling->KeyInput( rKEvt ); 723 724 GrabFocusToDocument(); 725 } 726 break; 727 728 case KEY_ESCAPE: 729 if( mbKbdSplitting ) 730 ImplKbdTracking( aKeyCode ); 731 else 732 GrabFocusToDocument(); 733 break; 734 735 case KEY_RETURN: 736 ImplKbdTracking( aKeyCode ); 737 GrabFocusToDocument(); 738 break; 739 default: // let any key input fix the splitter 740 Window::KeyInput( rKEvt ); 741 GrabFocusToDocument(); 742 break; 743 } 744 mbInKeyEvent = 0; 745 } 746 747 // ----------------------------------------------------------------------- 748 749 long Splitter::Notify( NotifyEvent& rNEvt ) 750 { 751 return Window::Notify( rNEvt ); 752 } 753 754 // ----------------------------------------------------------------------- 755 756 void Splitter::DataChanged( const DataChangedEvent& rDCEvt ) 757 { 758 Window::DataChanged( rDCEvt ); 759 if( rDCEvt.GetType() == DATACHANGED_SETTINGS ) 760 { 761 Color oldFaceColor = ((AllSettings *) rDCEvt.GetData())->GetStyleSettings().GetFaceColor(); 762 Color newFaceColor = Application::GetSettings().GetStyleSettings().GetFaceColor(); 763 if( oldFaceColor.IsDark() != newFaceColor.IsDark() ) 764 { 765 if( newFaceColor.IsDark() ) 766 SetBackground( ImplWhiteWall::get() ); 767 else 768 SetBackground( ImplBlackWall::get() ); 769 } 770 } 771 } 772 773 // ----------------------------------------------------------------------- 774 775 void Splitter::Paint( const Rectangle& rPaintRect ) 776 { 777 if( HasFocus() || mbKbdSplitting ) 778 { 779 Color oldFillCol = GetFillColor(); 780 Color oldLineCol = GetLineColor(); 781 782 SetLineColor(); 783 SetFillColor( GetSettings().GetStyleSettings().GetFaceColor() ); 784 DrawRect( rPaintRect ); 785 786 Color aSelectionBorderCol( GetSettings().GetStyleSettings().GetActiveColor() ); 787 SetFillColor( aSelectionBorderCol ); 788 SetLineColor(); 789 790 Polygon aPoly( rPaintRect ); 791 PolyPolygon aPolyPoly( aPoly ); 792 DrawTransparent( aPolyPoly, 85 ); 793 794 SetLineColor( aSelectionBorderCol ); 795 SetFillColor(); 796 797 if( mbKbdSplitting ) 798 { 799 LineInfo aInfo( LINE_DASH ); 800 //aInfo.SetDashLen( 2 ); 801 //aInfo.SetDashCount( 1 ); 802 aInfo.SetDistance( 1 ); 803 aInfo.SetDotLen( 2 ); 804 aInfo.SetDotCount( 1 ); 805 806 DrawPolyLine( aPoly, aInfo ); 807 } 808 else 809 DrawRect( rPaintRect ); 810 811 SetFillColor( oldFillCol); 812 SetLineColor( oldLineCol); 813 } 814 else 815 { 816 Window::Paint( rPaintRect ); 817 } 818 } 819