LCOV - code coverage report
Current view: top level - vcl/source/window - split.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 82 390 21.0 %
Date: 2015-06-13 12:38:46 Functions: 14 33 42.4 %
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          51 :         Wallpaper operator () () {
      41          51 :             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         704 : void Splitter::ImplInitSplitterData()
      53             : {
      54         704 :     ImplGetWindowImpl()->mbSplitter        = true;
      55         704 :     mpRefWin          = NULL;
      56         704 :     mnSplitPos        = 0;
      57         704 :     mnLastSplitPos    = 0;
      58         704 :     mnStartSplitPos   = 0;
      59         704 :     mbDragFull        = false;
      60         704 :     mbKbdSplitting    = false;
      61         704 :     mbInKeyEvent      = 0;
      62         704 :     mnKeyboardStepSize = SPLITTER_DEFAULTSTEPSIZE;
      63         704 : }
      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         704 : void Splitter::ImplInitHorVer(bool bNew)
      69             : {
      70         704 :     mbHorzSplit = bNew;
      71             : 
      72             :     PointerStyle ePointerStyle;
      73         704 :     const StyleSettings& rSettings = GetSettings().GetStyleSettings();
      74             : 
      75         704 :     if ( mbHorzSplit )
      76             :     {
      77         349 :         ePointerStyle = PointerStyle::HSplit;
      78         349 :         SetSizePixel( Size( rSettings.GetSplitSize(), rSettings.GetScrollBarSize() ) );
      79             :     }
      80             :     else
      81             :     {
      82         355 :         ePointerStyle = PointerStyle::VSplit;
      83         355 :         SetSizePixel( Size( rSettings.GetScrollBarSize(), rSettings.GetSplitSize() ) );
      84             :     }
      85             : 
      86         704 :     SetPointer( Pointer( ePointerStyle ) );
      87         704 : }
      88             : 
      89         704 : void Splitter::ImplInit( vcl::Window* pParent, WinBits nWinStyle )
      90             : {
      91         704 :     Window::ImplInit( pParent, nWinStyle, NULL );
      92             : 
      93         704 :     mpRefWin = pParent;
      94             : 
      95         704 :     ImplInitHorVer(nWinStyle & WB_HSCROLL);
      96             : 
      97         704 :     if( GetSettings().GetStyleSettings().GetFaceColor().IsDark() )
      98           0 :         SetBackground( ImplWhiteWall::get() );
      99             :     else
     100         704 :         SetBackground( ImplBlackWall::get() );
     101             : 
     102         704 :     TaskPaneList *pTList = GetSystemWindow()->GetTaskPaneList();
     103         704 :     pTList->AddWindow( this );
     104         704 : }
     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         704 : Splitter::Splitter( vcl::Window* pParent, WinBits nStyle ) :
     143         704 :     Window( WINDOW_SPLITTER )
     144             : {
     145         704 :     ImplInitSplitterData();
     146         704 :     ImplInit( pParent, nStyle );
     147             : 
     148         704 :     SetLineColor();
     149         704 :     SetFillColor();
     150         704 : }
     151             : 
     152        1398 : Splitter::~Splitter()
     153             : {
     154         696 :     disposeOnce();
     155         702 : }
     156             : 
     157         696 : void Splitter::dispose()
     158             : {
     159         696 :     SystemWindow *pSysWin = GetSystemWindow();
     160         696 :     if(pSysWin)
     161             :     {
     162         696 :         TaskPaneList *pTList = pSysWin->GetTaskPaneList();
     163         696 :         pTList->RemoveWindow(this);
     164             :     }
     165         696 :     mpRefWin.clear();
     166         696 :     Window::dispose();
     167         696 : }
     168             : 
     169           0 : void Splitter::SetHorizontal(bool bNew)
     170             : {
     171           0 :     if(bNew != (bool)mbHorzSplit)
     172             :     {
     173           0 :         ImplInitHorVer(bNew);
     174             :     }
     175           0 : }
     176             : 
     177         696 : void Splitter::SetKeyboardStepSize( long nStepSize )
     178             : {
     179         696 :     mnKeyboardStepSize = nStepSize;
     180         696 : }
     181             : 
     182           0 : Splitter* Splitter::ImplFindSibling()
     183             : {
     184             :     // look for another splitter with the same parent but different orientation
     185           0 :     vcl::Window *pWin = GetParent()->GetWindow( GetWindowType::FirstChild );
     186           0 :     Splitter *pSplitter = NULL;
     187           0 :     while( pWin )
     188             :     {
     189           0 :         if( pWin->ImplIsSplitter() )
     190             :         {
     191           0 :             pSplitter = static_cast<Splitter*>(pWin);
     192           0 :             if( pSplitter != this && IsHorizontal() != pSplitter->IsHorizontal() )
     193           0 :                 return pSplitter;
     194             :         }
     195           0 :         pWin = pWin->GetWindow( GetWindowType::Next );
     196             :     }
     197           0 :     return NULL;
     198             : }
     199             : 
     200           0 : bool Splitter::ImplSplitterActive()
     201             : {
     202             :     // is splitter in document or at scrollbar handle ?
     203             : 
     204           0 :     bool bActive = true;
     205           0 :     const StyleSettings& rSettings = GetSettings().GetStyleSettings();
     206           0 :     long nA = rSettings.GetScrollBarSize();
     207           0 :     long nB = rSettings.GetSplitSize();
     208             : 
     209           0 :     Size aSize = GetOutputSize();
     210           0 :     if ( mbHorzSplit )
     211             :     {
     212           0 :         if( aSize.Width() == nB && aSize.Height() == nA )
     213           0 :             bActive = false;
     214             :     }
     215             :     else
     216             :     {
     217           0 :         if( aSize.Width() == nA && aSize.Height() == nB )
     218           0 :             bActive = false;
     219             :     }
     220           0 :     return bActive;
     221             : }
     222             : 
     223           0 : void Splitter::MouseButtonDown( const MouseEvent& rMEvt )
     224             : {
     225           0 :     if ( rMEvt.GetClicks() == 2 )
     226             :     {
     227           0 :         if ( mnLastSplitPos != mnSplitPos )
     228             :         {
     229           0 :             StartSplit();
     230           0 :             Point aPos = rMEvt.GetPosPixel();
     231           0 :             if ( mbHorzSplit )
     232           0 :                 aPos.X() = mnLastSplitPos;
     233             :             else
     234           0 :                 aPos.Y() = mnLastSplitPos;
     235           0 :             ImplSplitMousePos( aPos );
     236           0 :             Splitting( aPos );
     237           0 :             ImplSplitMousePos( aPos );
     238           0 :             long nTemp = mnSplitPos;
     239           0 :             if ( mbHorzSplit )
     240           0 :                 SetSplitPosPixel( aPos.X() );
     241             :             else
     242           0 :                 SetSplitPosPixel( aPos.Y() );
     243           0 :             mnLastSplitPos = nTemp;
     244           0 :             Split();
     245           0 :             EndSplit();
     246             :         }
     247             :     }
     248             :     else
     249           0 :         StartDrag();
     250           0 : }
     251             : 
     252           0 : void Splitter::Tracking( const TrackingEvent& rTEvt )
     253             : {
     254           0 :     if ( rTEvt.IsTrackingEnded() )
     255             :     {
     256           0 :         if ( !mbDragFull )
     257           0 :             ImplDrawSplitter();
     258             : 
     259           0 :         if ( !rTEvt.IsTrackingCanceled() )
     260             :         {
     261             :             long nNewPos;
     262           0 :             if ( mbHorzSplit )
     263           0 :                 nNewPos = maDragPos.X();
     264             :             else
     265           0 :                 nNewPos = maDragPos.Y();
     266           0 :             if ( nNewPos != mnStartSplitPos )
     267             :             {
     268           0 :                 SetSplitPosPixel( nNewPos );
     269           0 :                 mnLastSplitPos = 0;
     270           0 :                 Split();
     271             :             }
     272           0 :             EndSplit();
     273             :         }
     274           0 :         else if ( mbDragFull )
     275             :         {
     276           0 :             SetSplitPosPixel( mnStartSplitPos );
     277           0 :             Split();
     278             :         }
     279           0 :         mnStartSplitPos = 0;
     280             :     }
     281             :     else
     282             :     {
     283             :         //Point aNewPos = mpRefWin->ScreenToOutputPixel( OutputToScreenPixel( rTEvt.GetMouseEvent().GetPosPixel() ) );
     284           0 :         Point aNewPos = mpRefWin->NormalizedScreenToOutputPixel( OutputToNormalizedScreenPixel( rTEvt.GetMouseEvent().GetPosPixel() ) );
     285           0 :         ImplSplitMousePos( aNewPos );
     286           0 :         Splitting( aNewPos );
     287           0 :         ImplSplitMousePos( aNewPos );
     288             : 
     289           0 :         if ( mbHorzSplit )
     290             :         {
     291           0 :             if ( aNewPos.X() == maDragPos.X() )
     292           0 :                 return;
     293             :         }
     294             :         else
     295             :         {
     296           0 :             if ( aNewPos.Y() == maDragPos.Y() )
     297           0 :                 return;
     298             :         }
     299             : 
     300           0 :         if ( mbDragFull )
     301             :         {
     302           0 :             maDragPos = aNewPos;
     303             :             long nNewPos;
     304           0 :             if ( mbHorzSplit )
     305           0 :                 nNewPos = maDragPos.X();
     306             :             else
     307           0 :                 nNewPos = maDragPos.Y();
     308           0 :             if ( nNewPos != mnSplitPos )
     309             :             {
     310           0 :                 SetSplitPosPixel( nNewPos );
     311           0 :                 mnLastSplitPos = 0;
     312           0 :                 Split();
     313             :             }
     314             : 
     315           0 :             GetParent()->Update();
     316             :         }
     317             :         else
     318             :         {
     319           0 :             ImplDrawSplitter();
     320           0 :             maDragPos = aNewPos;
     321           0 :             ImplDrawSplitter();
     322             :         }
     323             :     }
     324             : }
     325             : 
     326           0 : void Splitter::ImplKbdTracking( vcl::KeyCode aKeyCode )
     327             : {
     328           0 :     sal_uInt16 nCode = aKeyCode.GetCode();
     329           0 :     if ( nCode == KEY_ESCAPE || nCode == KEY_RETURN )
     330             :     {
     331           0 :         if( !mbKbdSplitting )
     332           0 :             return;
     333             :         else
     334           0 :             mbKbdSplitting = false;
     335             : 
     336           0 :         if ( nCode != KEY_ESCAPE )
     337             :         {
     338             :             long nNewPos;
     339           0 :             if ( mbHorzSplit )
     340           0 :                 nNewPos = maDragPos.X();
     341             :             else
     342           0 :                 nNewPos = maDragPos.Y();
     343           0 :             if ( nNewPos != mnStartSplitPos )
     344             :             {
     345           0 :                 SetSplitPosPixel( nNewPos );
     346           0 :                 mnLastSplitPos = 0;
     347           0 :                 Split();
     348             :             }
     349             :         }
     350             :         else
     351             :         {
     352           0 :             SetSplitPosPixel( mnStartSplitPos );
     353           0 :             Split();
     354           0 :             EndSplit();
     355             :         }
     356           0 :         mnStartSplitPos = 0;
     357             :     }
     358             :     else
     359             :     {
     360           0 :         Point aNewPos;
     361           0 :         Size aSize = mpRefWin->GetOutputSize();
     362           0 :         Point aPos = GetPosPixel();
     363             :         // depending on the position calc allows continuous moves or snaps to row/columns
     364             :         // continuous mode is active when position is at the origin or end of the splitter
     365             :         // otherwise snap mode is active
     366             :         // default here is snap, holding shift sets continuous mode
     367           0 :         if( mbHorzSplit )
     368           0 :             aNewPos = Point( ImplSplitterActive() ? aPos.X() : mnSplitPos, aKeyCode.IsShift() ? 0 : aSize.Height()/2);
     369             :         else
     370           0 :             aNewPos = Point( aKeyCode.IsShift() ? 0 : aSize.Width()/2, ImplSplitterActive() ? aPos.Y() : mnSplitPos );
     371             : 
     372           0 :         Point aOldWindowPos = GetPosPixel();
     373             : 
     374           0 :         int maxiter = 500;  // avoid endless loop
     375           0 :         int delta=0;
     376           0 :         int delta_step = mbHorzSplit  ? aSize.Width()/10 : aSize.Height()/10;
     377             : 
     378             :         // use the specified step size if it was set
     379           0 :         if( mnKeyboardStepSize != SPLITTER_DEFAULTSTEPSIZE )
     380           0 :             delta_step = mnKeyboardStepSize;
     381             : 
     382           0 :         while( maxiter-- && aOldWindowPos == GetPosPixel() )
     383             :         {
     384             :             // inc/dec position until application performs changes
     385             :             // thus a single key press really moves the splitter
     386           0 :             if( aKeyCode.IsShift() )
     387           0 :                 delta++;
     388             :             else
     389           0 :                 delta += delta_step;
     390             : 
     391           0 :             switch( nCode )
     392             :             {
     393             :             case KEY_LEFT:
     394           0 :                 aNewPos.X()-=delta;
     395           0 :                 break;
     396             :             case KEY_RIGHT:
     397           0 :                 aNewPos.X()+=delta;
     398           0 :                 break;
     399             :             case KEY_UP:
     400           0 :                 aNewPos.Y()-=delta;
     401           0 :                 break;
     402             :             case KEY_DOWN:
     403           0 :                 aNewPos.Y()+=delta;
     404           0 :                 break;
     405             :             default:
     406           0 :                 maxiter = 0;    // leave loop
     407           0 :                 break;
     408             :             }
     409           0 :             ImplSplitMousePos( aNewPos );
     410           0 :             Splitting( aNewPos );
     411           0 :             ImplSplitMousePos( aNewPos );
     412             : 
     413           0 :             if ( mbHorzSplit )
     414             :             {
     415           0 :                 if ( aNewPos.X() == maDragPos.X() )
     416           0 :                     continue;
     417             :             }
     418             :             else
     419             :             {
     420           0 :                 if ( aNewPos.Y() == maDragPos.Y() )
     421           0 :                     continue;
     422             :             }
     423             : 
     424           0 :             maDragPos = aNewPos;
     425             :             long nNewPos;
     426           0 :             if ( mbHorzSplit )
     427           0 :                 nNewPos = maDragPos.X();
     428             :             else
     429           0 :                 nNewPos = maDragPos.Y();
     430           0 :             if ( nNewPos != mnSplitPos )
     431             :             {
     432           0 :                 SetSplitPosPixel( nNewPos );
     433           0 :                 mnLastSplitPos = 0;
     434           0 :                 Split();
     435             :             }
     436           0 :             GetParent()->Update();
     437             :         }
     438             :     }
     439             : }
     440             : 
     441           0 : void Splitter::StartSplit()
     442             : {
     443           0 :     maStartSplitHdl.Call( this );
     444           0 : }
     445             : 
     446           0 : void Splitter::Split()
     447             : {
     448           0 :     maSplitHdl.Call( this );
     449           0 : }
     450             : 
     451           0 : void Splitter::EndSplit()
     452             : {
     453           0 :     if ( maEndSplitHdl.IsSet() )
     454           0 :         maEndSplitHdl.Call( this );
     455           0 : }
     456             : 
     457           0 : void Splitter::Splitting( Point& /* rSplitPos */ )
     458             : {
     459           0 : }
     460             : 
     461        3709 : void Splitter::SetDragRectPixel( const Rectangle& rDragRect, vcl::Window* _pRefWin )
     462             : {
     463        3709 :     maDragRect = rDragRect;
     464        3709 :     if ( !_pRefWin )
     465          39 :         mpRefWin = GetParent();
     466             :     else
     467        3670 :         mpRefWin = _pRefWin;
     468        3709 : }
     469             : 
     470           8 : void Splitter::SetSplitPosPixel( long nNewPos )
     471             : {
     472           8 :     mnSplitPos = nNewPos;
     473           8 : }
     474             : 
     475           0 : void Splitter::StartDrag()
     476             : {
     477           0 :     if ( IsTracking() )
     478           0 :         return;
     479             : 
     480           0 :     StartSplit();
     481             : 
     482             :     // Tracking starten
     483           0 :     StartTracking();
     484             : 
     485             :     // Start-Position ermitteln
     486           0 :     maDragPos = mpRefWin->GetPointerPosPixel();
     487           0 :     ImplSplitMousePos( maDragPos );
     488           0 :     Splitting( maDragPos );
     489           0 :     ImplSplitMousePos( maDragPos );
     490           0 :     if ( mbHorzSplit )
     491           0 :         mnStartSplitPos = maDragPos.X();
     492             :     else
     493           0 :         mnStartSplitPos = maDragPos.Y();
     494             : 
     495           0 :     mbDragFull = bool(Application::GetSettings().GetStyleSettings().GetDragFullOptions() & DragFullOptions::Split);
     496           0 :     if ( !mbDragFull )
     497           0 :         ImplDrawSplitter();
     498             : }
     499             : 
     500           0 : void Splitter::ImplStartKbdSplitting()
     501             : {
     502           0 :     if( mbKbdSplitting )
     503           0 :         return;
     504             : 
     505           0 :     mbKbdSplitting = true;
     506             : 
     507           0 :     StartSplit();
     508             : 
     509             :     // determine start position
     510             :     // because we have no mouse position we take either the position
     511             :     // of the splitter window or the last split position
     512             :     // the other coordinate is just the center of the reference window
     513           0 :     Size aSize = mpRefWin->GetOutputSize();
     514           0 :     Point aPos = GetPosPixel();
     515           0 :     if( mbHorzSplit )
     516           0 :         maDragPos = Point( ImplSplitterActive() ? aPos.X() : mnSplitPos, aSize.Height()/2 );
     517             :     else
     518           0 :         maDragPos = Point( aSize.Width()/2, ImplSplitterActive() ? aPos.Y() : mnSplitPos );
     519           0 :     ImplSplitMousePos( maDragPos );
     520           0 :     Splitting( maDragPos );
     521           0 :     ImplSplitMousePos( maDragPos );
     522           0 :     if ( mbHorzSplit )
     523           0 :         mnStartSplitPos = maDragPos.X();
     524             :     else
     525           0 :         mnStartSplitPos = maDragPos.Y();
     526             : }
     527             : 
     528           0 : void Splitter::ImplRestoreSplitter()
     529             : {
     530             :     // set splitter in the center of the ref window
     531           0 :     StartSplit();
     532           0 :     Size aSize = mpRefWin->GetOutputSize();
     533           0 :     Point aPos = Point( aSize.Width()/2 , aSize.Height()/2);
     534           0 :     if ( mnLastSplitPos != mnSplitPos && mnLastSplitPos > 5 )
     535             :     {
     536             :         // restore last pos if it was a useful position (>5)
     537           0 :         if ( mbHorzSplit )
     538           0 :             aPos.X() = mnLastSplitPos;
     539             :         else
     540           0 :             aPos.Y() = mnLastSplitPos;
     541             :     }
     542             : 
     543           0 :     ImplSplitMousePos( aPos );
     544           0 :     Splitting( aPos );
     545           0 :     ImplSplitMousePos( aPos );
     546           0 :     long nTemp = mnSplitPos;
     547           0 :     if ( mbHorzSplit )
     548           0 :         SetSplitPosPixel( aPos.X() );
     549             :     else
     550           0 :         SetSplitPosPixel( aPos.Y() );
     551           0 :     mnLastSplitPos = nTemp;
     552           0 :     Split();
     553           0 :     EndSplit();
     554           0 : }
     555             : 
     556           0 : void Splitter::GetFocus()
     557             : {
     558           0 :     if( !ImplSplitterActive() )
     559           0 :         ImplRestoreSplitter();
     560             : 
     561           0 :     Invalidate();
     562           0 : }
     563             : 
     564           0 : void Splitter::LoseFocus()
     565             : {
     566           0 :     if( mbKbdSplitting )
     567             :     {
     568           0 :         vcl::KeyCode aReturnKey( KEY_RETURN );
     569           0 :         ImplKbdTracking( aReturnKey );
     570           0 :         mbKbdSplitting = false;
     571             :     }
     572           0 :     Invalidate();
     573           0 : }
     574             : 
     575           0 : void Splitter::KeyInput( const KeyEvent& rKEvt )
     576             : {
     577           0 :     if( mbInKeyEvent )
     578           0 :         return;
     579             : 
     580           0 :     mbInKeyEvent = 1;
     581             : 
     582           0 :     Splitter *pSibling = ImplFindSibling();
     583           0 :     vcl::KeyCode aKeyCode = rKEvt.GetKeyCode();
     584           0 :     sal_uInt16 nCode = aKeyCode.GetCode();
     585           0 :     switch ( nCode )
     586             :     {
     587             :         case KEY_UP:
     588             :         case KEY_DOWN:
     589           0 :             if( !mbHorzSplit )
     590             :             {
     591           0 :                 ImplStartKbdSplitting();
     592           0 :                 ImplKbdTracking( aKeyCode );
     593             :             }
     594             :             else
     595             :             {
     596           0 :                 if( pSibling )
     597             :                 {
     598           0 :                     pSibling->GrabFocus();
     599           0 :                     pSibling->KeyInput( rKEvt );
     600             :                 }
     601             :             }
     602           0 :             break;
     603             :         case KEY_RIGHT:
     604             :         case KEY_LEFT:
     605           0 :             if( mbHorzSplit )
     606             :             {
     607           0 :                 ImplStartKbdSplitting();
     608           0 :                 ImplKbdTracking( aKeyCode );
     609             :             }
     610             :             else
     611             :             {
     612           0 :                 if( pSibling )
     613             :                 {
     614           0 :                     pSibling->GrabFocus();
     615           0 :                     pSibling->KeyInput( rKEvt );
     616             :                 }
     617             :             }
     618           0 :             break;
     619             : 
     620             :         case KEY_DELETE:
     621           0 :             if( ImplSplitterActive() )
     622             :             {
     623           0 :                 if( mbKbdSplitting )
     624             :                 {
     625           0 :                     vcl::KeyCode aKey( KEY_ESCAPE );
     626           0 :                     ImplKbdTracking( aKey );
     627             :                 }
     628             : 
     629           0 :                 StartSplit();
     630           0 :                 Point aPos;
     631           0 :                 if ( mbHorzSplit )
     632           0 :                     aPos.X() = 0;
     633             :                 else
     634           0 :                     aPos.Y() = 0;
     635           0 :                 ImplSplitMousePos( aPos );
     636           0 :                 Splitting( aPos );
     637           0 :                 ImplSplitMousePos( aPos );
     638           0 :                 long nTemp = mnSplitPos;
     639           0 :                 if ( mbHorzSplit )
     640           0 :                     SetSplitPosPixel( aPos.X() );
     641             :                 else
     642           0 :                     SetSplitPosPixel( aPos.Y() );
     643           0 :                 mnLastSplitPos = nTemp;
     644           0 :                 Split();
     645           0 :                 EndSplit();
     646             : 
     647             :                 // Shift-Del deletes both splitters
     648           0 :                 if( aKeyCode.IsShift() && pSibling )
     649           0 :                     pSibling->KeyInput( rKEvt );
     650             : 
     651           0 :                 GrabFocusToDocument();
     652             :             }
     653           0 :             break;
     654             : 
     655             :         case KEY_ESCAPE:
     656           0 :             if( mbKbdSplitting )
     657           0 :                 ImplKbdTracking( aKeyCode );
     658             :             else
     659           0 :                 GrabFocusToDocument();
     660           0 :             break;
     661             : 
     662             :         case KEY_RETURN:
     663           0 :             ImplKbdTracking( aKeyCode );
     664           0 :             GrabFocusToDocument();
     665           0 :             break;
     666             :         default:    // let any key input fix the splitter
     667           0 :             Window::KeyInput( rKEvt );
     668           0 :             GrabFocusToDocument();
     669           0 :             break;
     670             :     }
     671           0 :     mbInKeyEvent = 0;
     672             : }
     673             : 
     674          54 : bool Splitter::Notify( NotifyEvent& rNEvt )
     675             : {
     676          54 :     return Window::Notify( rNEvt );
     677             : }
     678             : 
     679          52 : void Splitter::DataChanged( const DataChangedEvent& rDCEvt )
     680             : {
     681          52 :     Window::DataChanged( rDCEvt );
     682          52 :     if( rDCEvt.GetType() == DataChangedEventType::SETTINGS )
     683             :     {
     684          52 :         const AllSettings* pOldSettings = rDCEvt.GetOldSettings();
     685          52 :         if(!pOldSettings)
     686          52 :             return;
     687             : 
     688          52 :         Color oldFaceColor = pOldSettings->GetStyleSettings().GetFaceColor();
     689          52 :         Color newFaceColor = Application::GetSettings().GetStyleSettings().GetFaceColor();
     690          52 :         if( oldFaceColor.IsDark() != newFaceColor.IsDark() )
     691             :         {
     692           0 :             if( newFaceColor.IsDark() )
     693           0 :                 SetBackground( ImplWhiteWall::get() );
     694             :             else
     695           0 :                 SetBackground( ImplBlackWall::get() );
     696             :         }
     697             :     }
     698             : }
     699             : 
     700           5 : void Splitter::Paint(vcl::RenderContext& rRenderContext, const Rectangle& rPaintRect)
     701             : {
     702           5 :     rRenderContext.DrawRect(rPaintRect);
     703             : 
     704           5 :     Polygon aPoly(rPaintRect);
     705          10 :     tools::PolyPolygon aPolyPoly(aPoly);
     706           5 :     rRenderContext.DrawTransparent(aPolyPoly, 85);
     707             : 
     708           5 :     if (mbKbdSplitting)
     709             :     {
     710           0 :         LineInfo aInfo( LINE_DASH );
     711             :         //aInfo.SetDashLen( 2 );
     712             :         //aInfo.SetDashCount( 1 );
     713           0 :         aInfo.SetDistance( 1 );
     714           0 :         aInfo.SetDotLen( 2 );
     715           0 :         aInfo.SetDotCount( 3 );
     716             : 
     717           0 :         rRenderContext.DrawPolyLine( aPoly, aInfo );
     718             :     }
     719             :     else
     720             :     {
     721           5 :         rRenderContext.DrawRect(rPaintRect);
     722           5 :     }
     723           5 : }
     724             : 
     725             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11