LCOV - code coverage report
Current view: top level - vcl/source/window - split.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 75 395 19.0 %
Date: 2014-11-03 Functions: 15 35 42.9 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10