LCOV - code coverage report
Current view: top level - vcl/source/window - split.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 66 387 17.1 %
Date: 2012-08-25 Functions: 11 31 35.5 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 28 429 6.5 %

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

Generated by: LCOV version 1.10