LCOV - code coverage report
Current view: top level - vcl/source/control - scrbar.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 358 809 44.3 %
Date: 2012-08-25 Functions: 31 48 64.6 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 300 1141 26.3 %

           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 "vcl/event.hxx"
      31                 :            : #include "vcl/decoview.hxx"
      32                 :            : #include "vcl/scrbar.hxx"
      33                 :            : #include "vcl/timer.hxx"
      34                 :            : 
      35                 :            : #include "svdata.hxx"
      36                 :            : 
      37                 :            : #include "rtl/string.hxx"
      38                 :            : #include "tools/rc.h"
      39                 :            : 
      40                 :            : using ::rtl::OUString;
      41                 :            : 
      42                 :            : 
      43                 :            : /*  #i77549#
      44                 :            :     HACK: for scrollbars in case of thumb rect, page up and page down rect we
      45                 :            :     abuse the HitTestNativeControl interface. All theming engines but aqua
      46                 :            :     are actually able to draw the thumb according to our internal representation.
      47                 :            :     However aqua draws a little outside. The canonical way would be to enhance the
      48                 :            :     HitTestNativeControl passing a ScrollbarValue additionally so all necessary
      49                 :            :     information is available in the call.
      50                 :            :     .
      51                 :            :     However since there is only this one small exception we will deviate a little and
      52                 :            :     instead pass the respective rect as control region to allow for a small correction.
      53                 :            : 
      54                 :            :     So all places using HitTestNativeControl on PART_THUMB_HORZ, PART_THUMB_VERT,
      55                 :            :     PART_TRACK_HORZ_LEFT, PART_TRACK_HORZ_RIGHT, PART_TRACK_VERT_UPPER, PART_TRACK_VERT_LOWER
      56                 :            :     do not use the control rectangle as region but the actuall part rectangle, making
      57                 :            :     only small deviations feasible.
      58                 :            : */
      59                 :            : 
      60                 :            : #include "thumbpos.hxx"
      61                 :            : 
      62                 :            : // =======================================================================
      63                 :            : 
      64                 :            : #define SCRBAR_DRAW_BTN1            ((sal_uInt16)0x0001)
      65                 :            : #define SCRBAR_DRAW_BTN2            ((sal_uInt16)0x0002)
      66                 :            : #define SCRBAR_DRAW_PAGE1           ((sal_uInt16)0x0004)
      67                 :            : #define SCRBAR_DRAW_PAGE2           ((sal_uInt16)0x0008)
      68                 :            : #define SCRBAR_DRAW_THUMB           ((sal_uInt16)0x0010)
      69                 :            : #define SCRBAR_DRAW_BACKGROUND      ((sal_uInt16)0x0020)
      70                 :            : #define SCRBAR_DRAW_ALL             (SCRBAR_DRAW_BTN1 | SCRBAR_DRAW_BTN2 |  \
      71                 :            :                                      SCRBAR_DRAW_PAGE1 | SCRBAR_DRAW_PAGE2 |\
      72                 :            :                                      SCRBAR_DRAW_THUMB | SCRBAR_DRAW_BACKGROUND )
      73                 :            : 
      74                 :            : #define SCRBAR_STATE_BTN1_DOWN      ((sal_uInt16)0x0001)
      75                 :            : #define SCRBAR_STATE_BTN1_DISABLE   ((sal_uInt16)0x0002)
      76                 :            : #define SCRBAR_STATE_BTN2_DOWN      ((sal_uInt16)0x0004)
      77                 :            : #define SCRBAR_STATE_BTN2_DISABLE   ((sal_uInt16)0x0008)
      78                 :            : #define SCRBAR_STATE_PAGE1_DOWN     ((sal_uInt16)0x0010)
      79                 :            : #define SCRBAR_STATE_PAGE2_DOWN     ((sal_uInt16)0x0020)
      80                 :            : #define SCRBAR_STATE_THUMB_DOWN     ((sal_uInt16)0x0040)
      81                 :            : 
      82                 :            : #define SCRBAR_VIEW_STYLE           (WB_3DLOOK | WB_HORZ | WB_VERT)
      83                 :            : 
      84         [ +  - ]:      25343 : struct ImplScrollBarData
      85                 :            : {
      86                 :            :     AutoTimer       maTimer;            // Timer
      87                 :            :     sal_Bool            mbHide;
      88                 :            :     Rectangle       maTrackRect; // TODO: move to ScrollBar class when binary incompatibility of ScrollBar class is no longer problematic
      89                 :            : };
      90                 :            : 
      91                 :            : // =======================================================================
      92                 :            : 
      93                 :      12774 : void ScrollBar::ImplInit( Window* pParent, WinBits nStyle )
      94                 :            : {
      95                 :      12774 :     mpData              = NULL;
      96                 :      12774 :     mnThumbPixRange     = 0;
      97                 :      12774 :     mnThumbPixPos       = 0;
      98                 :      12774 :     mnThumbPixSize      = 0;
      99                 :      12774 :     mnMinRange          = 0;
     100                 :      12774 :     mnMaxRange          = 100;
     101                 :      12774 :     mnThumbPos          = 0;
     102                 :      12774 :     mnVisibleSize       = 0;
     103                 :      12774 :     mnLineSize          = 1;
     104                 :      12774 :     mnPageSize          = 1;
     105                 :      12774 :     mnDelta             = 0;
     106                 :      12774 :     mnDragDraw          = 0;
     107                 :      12774 :     mnStateFlags        = 0;
     108                 :      12774 :     meScrollType        = SCROLL_DONTKNOW;
     109                 :      12774 :     meDDScrollType      = SCROLL_DONTKNOW;
     110                 :      12774 :     mbCalcSize          = sal_True;
     111                 :      12774 :     mbFullDrag          = 0;
     112                 :            : 
     113         [ +  - ]:      12774 :     if( !mpData )  // TODO: remove when maTrackRect is no longer in mpData
     114                 :            :     {
     115         [ +  - ]:      12774 :         mpData = new ImplScrollBarData;
     116                 :      12774 :         mpData->maTimer.SetTimeoutHdl( LINK( this, ScrollBar, ImplAutoTimerHdl ) );
     117                 :      12774 :         mpData->mbHide = sal_False;
     118                 :            :     }
     119                 :            : 
     120                 :      12774 :     ImplInitStyle( nStyle );
     121                 :      12774 :     Control::ImplInit( pParent, nStyle, NULL );
     122                 :            : 
     123                 :      12774 :     long nScrollSize = GetSettings().GetStyleSettings().GetScrollBarSize();
     124         [ +  - ]:      12774 :     SetSizePixel( Size( nScrollSize, nScrollSize ) );
     125                 :      12774 :     SetBackground();
     126                 :      12774 : }
     127                 :            : 
     128                 :            : // -----------------------------------------------------------------------
     129                 :            : 
     130                 :      12776 : void ScrollBar::ImplInitStyle( WinBits nStyle )
     131                 :            : {
     132         [ +  + ]:      12776 :     if ( nStyle & WB_DRAG )
     133                 :       9846 :         mbFullDrag = sal_True;
     134                 :            :     else
     135                 :       2930 :         mbFullDrag = (GetSettings().GetStyleSettings().GetDragFullOptions() & DRAGFULL_OPTION_SCROLL) != 0;
     136                 :      12776 : }
     137                 :            : 
     138                 :            : // -----------------------------------------------------------------------
     139                 :            : 
     140                 :      12774 : ScrollBar::ScrollBar( Window* pParent, WinBits nStyle ) :
     141 [ +  - ][ +  - ]:      12774 :     Control( WINDOW_SCROLLBAR )
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
     142                 :            : {
     143         [ +  - ]:      12774 :     ImplInit( pParent, nStyle );
     144                 :      12774 : }
     145                 :            : 
     146                 :            : // -----------------------------------------------------------------------
     147                 :            : 
     148                 :          0 : ScrollBar::ScrollBar( Window* pParent, const ResId& rResId ) :
     149 [ #  # ][ #  # ]:          0 :     Control( WINDOW_SCROLLBAR )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     150                 :            : {
     151                 :          0 :     rResId.SetRT( RSC_SCROLLBAR );
     152         [ #  # ]:          0 :     WinBits nStyle = ImplInitRes( rResId );
     153         [ #  # ]:          0 :     ImplInit( pParent, nStyle );
     154         [ #  # ]:          0 :     ImplLoadRes( rResId );
     155                 :            : 
     156         [ #  # ]:          0 :     if ( !(nStyle & WB_HIDE) )
     157         [ #  # ]:          0 :         Show();
     158                 :          0 : }
     159                 :            : 
     160                 :            : // -----------------------------------------------------------------------
     161                 :            : 
     162                 :      12569 : ScrollBar::~ScrollBar()
     163                 :            : {
     164         [ +  - ]:      12569 :     if( mpData )
     165 [ +  - ][ +  - ]:      12569 :         delete mpData;
     166         [ -  + ]:      21049 : }
     167                 :            : 
     168                 :            : // -----------------------------------------------------------------------
     169                 :            : 
     170                 :          0 : void ScrollBar::ImplLoadRes( const ResId& rResId )
     171                 :            : {
     172                 :          0 :     Control::ImplLoadRes( rResId );
     173                 :            : 
     174                 :          0 :     sal_Int16 nMin          = ReadShortRes();
     175                 :          0 :     sal_Int16 nMax          = ReadShortRes();
     176                 :          0 :     sal_Int16 nThumbPos     = ReadShortRes();
     177                 :          0 :     sal_Int16 nPage         = ReadShortRes();
     178                 :          0 :     sal_Int16 nStep         = ReadShortRes();
     179                 :          0 :     sal_Int16 nVisibleSize  = ReadShortRes();
     180                 :            : 
     181         [ #  # ]:          0 :     SetRange( Range( nMin, nMax ) );
     182                 :          0 :     SetLineSize( nStep );
     183                 :          0 :     SetPageSize( nPage );
     184                 :          0 :     SetVisibleSize( nVisibleSize );
     185                 :          0 :     SetThumbPos( nThumbPos );
     186                 :          0 : }
     187                 :            : 
     188                 :            : // -----------------------------------------------------------------------
     189                 :            : 
     190                 :      10689 : void ScrollBar::ImplUpdateRects( sal_Bool bUpdate )
     191                 :            : {
     192                 :      10689 :     sal_uInt16      nOldStateFlags  = mnStateFlags;
     193                 :      10689 :     Rectangle   aOldPage1Rect = maPage1Rect;
     194                 :      10689 :     Rectangle   aOldPage2Rect = maPage2Rect;
     195                 :      10689 :     Rectangle   aOldThumbRect = maThumbRect;
     196                 :            : 
     197                 :      10689 :     mnStateFlags  &= ~SCRBAR_STATE_BTN1_DISABLE;
     198                 :      10689 :     mnStateFlags  &= ~SCRBAR_STATE_BTN2_DISABLE;
     199                 :            : 
     200                 :      10689 :     Rectangle& maTrackRect = mpData->maTrackRect; // TODO: remove when maTrackRect is no longer in mpData
     201         [ +  + ]:      10689 :     if ( mnThumbPixRange )
     202                 :            :     {
     203 [ +  - ][ +  + ]:       7115 :         if ( GetStyle() & WB_HORZ )
     204                 :            :         {
     205                 :       2470 :             maThumbRect.Left()      = maTrackRect.Left()+mnThumbPixPos;
     206                 :       2470 :             maThumbRect.Right()     = maThumbRect.Left()+mnThumbPixSize-1;
     207         [ +  + ]:       2470 :             if ( !mnThumbPixPos )
     208                 :       1750 :                 maPage1Rect.Right()     = RECT_EMPTY;
     209                 :            :             else
     210                 :        720 :                 maPage1Rect.Right()     = maThumbRect.Left()-1;
     211         [ +  + ]:       2470 :             if ( mnThumbPixPos >= (mnThumbPixRange-mnThumbPixSize) )
     212                 :        201 :                 maPage2Rect.Right()     = RECT_EMPTY;
     213                 :            :             else
     214                 :            :             {
     215                 :       2269 :                 maPage2Rect.Left()      = maThumbRect.Right()+1;
     216                 :       2269 :                 maPage2Rect.Right()     = maTrackRect.Right();
     217                 :            :             }
     218                 :            :         }
     219                 :            :         else
     220                 :            :         {
     221                 :       4645 :             maThumbRect.Top()       = maTrackRect.Top()+mnThumbPixPos;
     222                 :       4645 :             maThumbRect.Bottom()    = maThumbRect.Top()+mnThumbPixSize-1;
     223         [ +  + ]:       4645 :             if ( !mnThumbPixPos )
     224                 :       3505 :                 maPage1Rect.Bottom()    = RECT_EMPTY;
     225                 :            :             else
     226                 :       1140 :                 maPage1Rect.Bottom()    = maThumbRect.Top()-1;
     227         [ +  + ]:       4645 :             if ( mnThumbPixPos >= (mnThumbPixRange-mnThumbPixSize) )
     228                 :        219 :                 maPage2Rect.Bottom()    = RECT_EMPTY;
     229                 :            :             else
     230                 :            :             {
     231                 :       4426 :                 maPage2Rect.Top()       = maThumbRect.Bottom()+1;
     232                 :       4426 :                 maPage2Rect.Bottom()    = maTrackRect.Bottom();
     233                 :            :             }
     234                 :            :         }
     235                 :            :     }
     236                 :            :     else
     237                 :            :     {
     238 [ +  - ][ +  + ]:       3574 :         if ( GetStyle() & WB_HORZ )
     239                 :            :         {
     240                 :       1903 :             const long nSpace = maTrackRect.Right() - maTrackRect.Left();
     241         [ -  + ]:       1903 :             if ( nSpace > 0 )
     242                 :            :             {
     243                 :          0 :                 maPage1Rect.Left()   = maTrackRect.Left();
     244                 :          0 :                 maPage1Rect.Right()  = maTrackRect.Left() + (nSpace/2);
     245                 :          0 :                 maPage2Rect.Left()   = maPage1Rect.Right() + 1;
     246                 :          0 :                 maPage2Rect.Right()  = maTrackRect.Right();
     247                 :            :             }
     248                 :            :         }
     249                 :            :         else
     250                 :            :         {
     251                 :       1671 :             const long nSpace = maTrackRect.Bottom() - maTrackRect.Top();
     252         [ -  + ]:       1671 :             if ( nSpace > 0 )
     253                 :            :             {
     254                 :          0 :                 maPage1Rect.Top()    = maTrackRect.Top();
     255                 :          0 :                 maPage1Rect.Bottom() = maTrackRect.Top() + (nSpace/2);
     256                 :          0 :                 maPage2Rect.Top()    = maPage1Rect.Bottom() + 1;
     257                 :          0 :                 maPage2Rect.Bottom() = maTrackRect.Bottom();
     258                 :            :             }
     259                 :            :         }
     260                 :            :     }
     261                 :            : 
     262 [ +  - ][ +  - ]:      10689 :     if( !IsNativeControlSupported(CTRL_SCROLLBAR, PART_ENTIRE_CONTROL) )
     263                 :            :     {
     264                 :            :         // disable scrollbar buttons only in VCL's own 'theme'
     265                 :            :         // as it is uncommon on other platforms
     266         [ +  + ]:      10689 :         if ( mnThumbPos == mnMinRange )
     267                 :       8814 :             mnStateFlags |= SCRBAR_STATE_BTN1_DISABLE;
     268         [ +  + ]:      10689 :         if ( mnThumbPos >= (mnMaxRange-mnVisibleSize) )
     269                 :        580 :             mnStateFlags |= SCRBAR_STATE_BTN2_DISABLE;
     270                 :            :     }
     271                 :            : 
     272         [ +  + ]:      10689 :     if ( bUpdate )
     273                 :            :     {
     274                 :        132 :         sal_uInt16 nDraw = 0;
     275         [ +  + ]:        132 :         if ( (nOldStateFlags & SCRBAR_STATE_BTN1_DISABLE) !=
     276                 :            :              (mnStateFlags & SCRBAR_STATE_BTN1_DISABLE) )
     277                 :         22 :             nDraw |= SCRBAR_DRAW_BTN1;
     278         [ +  + ]:        132 :         if ( (nOldStateFlags & SCRBAR_STATE_BTN2_DISABLE) !=
     279                 :            :              (mnStateFlags & SCRBAR_STATE_BTN2_DISABLE) )
     280                 :         12 :             nDraw |= SCRBAR_DRAW_BTN2;
     281 [ +  - ][ +  + ]:        132 :         if ( aOldPage1Rect != maPage1Rect )
     282                 :        107 :             nDraw |= SCRBAR_DRAW_PAGE1;
     283 [ +  - ][ +  + ]:        132 :         if ( aOldPage2Rect != maPage2Rect )
     284                 :        118 :             nDraw |= SCRBAR_DRAW_PAGE2;
     285 [ +  - ][ +  + ]:        132 :         if ( aOldThumbRect != maThumbRect )
     286                 :        118 :             nDraw |= SCRBAR_DRAW_THUMB;
     287         [ +  - ]:        132 :         ImplDraw( nDraw, this );
     288                 :            :     }
     289                 :      10689 : }
     290                 :            : 
     291                 :            : // -----------------------------------------------------------------------
     292                 :            : 
     293                 :          0 : long ScrollBar::ImplCalcThumbPos( long nPixPos )
     294                 :            : {
     295                 :            :     // Position berechnen
     296                 :            :     long nCalcThumbPos;
     297                 :            :     nCalcThumbPos = ImplMulDiv( nPixPos, mnMaxRange-mnVisibleSize-mnMinRange,
     298                 :          0 :                                 mnThumbPixRange-mnThumbPixSize );
     299                 :          0 :     nCalcThumbPos += mnMinRange;
     300                 :          0 :     return nCalcThumbPos;
     301                 :            : }
     302                 :            : 
     303                 :            : // -----------------------------------------------------------------------
     304                 :            : 
     305                 :       6719 : long ScrollBar::ImplCalcThumbPosPix( long nPos )
     306                 :            : {
     307                 :            :     long nCalcThumbPos;
     308                 :            : 
     309                 :            :     // Position berechnen
     310                 :            :     nCalcThumbPos = ImplMulDiv( nPos-mnMinRange, mnThumbPixRange-mnThumbPixSize,
     311                 :       6719 :                                 mnMaxRange-mnVisibleSize-mnMinRange );
     312                 :            : 
     313                 :            :     // Am Anfang und Ende des ScrollBars versuchen wir die Anzeige korrekt
     314                 :            :     // anzuzeigen
     315 [ -  + ][ +  + ]:       6719 :     if ( !nCalcThumbPos && (mnThumbPos > mnMinRange) )
     316                 :          0 :         nCalcThumbPos = 1;
     317 [ +  + ][ +  + ]:       6719 :     if ( nCalcThumbPos &&
                 [ -  + ]
     318                 :            :          ((nCalcThumbPos+mnThumbPixSize) >= mnThumbPixRange) &&
     319                 :            :          (mnThumbPos < (mnMaxRange-mnVisibleSize)) )
     320                 :          0 :         nCalcThumbPos--;
     321                 :            : 
     322                 :       6719 :     return nCalcThumbPos;
     323                 :            : }
     324                 :            : 
     325                 :            : // -----------------------------------------------------------------------
     326                 :            : 
     327                 :      10689 : void ScrollBar::ImplCalc( sal_Bool bUpdate )
     328                 :            : {
     329                 :      10689 :     const Size aSize = GetOutputSizePixel();
     330                 :      10689 :     const long nMinThumbSize = GetSettings().GetStyleSettings().GetMinThumbSize();
     331                 :            : 
     332                 :      10689 :     Rectangle& maTrackRect = mpData->maTrackRect;  // TODO: remove when maTrackRect is no longer in mpData
     333         [ +  + ]:      10689 :     if ( mbCalcSize )
     334                 :            :     {
     335         [ +  - ]:       7692 :         const Rectangle aControlRegion( Point(0,0), aSize );
     336 [ +  - ][ +  - ]:       7692 :         Rectangle aBtn1Region, aBtn2Region, aTrackRegion, aBoundingRegion;
         [ +  - ][ +  - ]
     337                 :            : 
     338 [ +  - ][ +  + ]:       7692 :         if ( GetStyle() & WB_HORZ )
     339                 :            :         {
     340 [ -  + ][ #  # ]:       6890 :             if ( GetNativeControlRegion( CTRL_SCROLLBAR, PART_BUTTON_LEFT,
                 [ -  + ]
     341 [ +  - ][ +  - ]:       6890 :                         aControlRegion, 0, ImplControlValue(), rtl::OUString(), aBoundingRegion, aBtn1Region ) &&
         [ +  - ][ +  - ]
           [ #  #  #  # ]
     342                 :            :                  GetNativeControlRegion( CTRL_SCROLLBAR, PART_BUTTON_RIGHT,
     343 [ #  # ][ -  + ]:       3445 :                         aControlRegion, 0, ImplControlValue(), rtl::OUString(), aBoundingRegion, aBtn2Region ) )
         [ #  # ][ -  + ]
           [ #  #  #  # ]
     344                 :            :             {
     345                 :          0 :                 maBtn1Rect = aBtn1Region;
     346                 :          0 :                 maBtn2Rect = aBtn2Region;
     347                 :            :             }
     348                 :            :             else
     349                 :            :             {
     350                 :       3445 :                 Size aBtnSize( aSize.Height(), aSize.Height() );
     351                 :       3445 :                 maBtn2Rect.Top()    = maBtn1Rect.Top();
     352                 :       3445 :                 maBtn2Rect.Left()   = aSize.Width()-aSize.Height();
     353         [ +  - ]:       3445 :                 maBtn1Rect.SetSize( aBtnSize );
     354         [ +  - ]:       3445 :                 maBtn2Rect.SetSize( aBtnSize );
     355                 :            :             }
     356                 :            : 
     357         [ -  + ]:       3445 :             if ( GetNativeControlRegion( CTRL_SCROLLBAR, PART_TRACK_HORZ_AREA,
     358 [ +  - ][ +  - ]:       3445 :                      aControlRegion, 0, ImplControlValue(), rtl::OUString(), aBoundingRegion, aTrackRegion ) )
     359                 :          0 :                 maTrackRect = aTrackRegion;
     360                 :            :             else
     361 [ +  - ][ +  - ]:       3445 :                 maTrackRect = Rectangle( maBtn1Rect.TopRight(), maBtn2Rect.BottomLeft() );
                 [ +  - ]
     362                 :            : 
     363                 :            :             // Check if available space is big enough for thumb ( min thumb size = ScrBar width/height )
     364                 :       3445 :             mnThumbPixRange = maTrackRect.Right() - maTrackRect.Left();
     365         [ +  + ]:       3445 :             if( mnThumbPixRange > 0 )
     366                 :            :             {
     367                 :       1696 :                 maPage1Rect.Left()      = maTrackRect.Left();
     368                 :       1696 :                 maPage1Rect.Bottom()    =
     369                 :       1696 :                 maPage2Rect.Bottom()    =
     370                 :       1696 :                 maThumbRect.Bottom()    = maTrackRect.Bottom();
     371                 :            :             }
     372                 :            :             else
     373                 :            :             {
     374                 :       1749 :                 mnThumbPixRange = 0;
     375                 :       1749 :                 maPage1Rect.SetEmpty();
     376                 :       1749 :                 maPage2Rect.SetEmpty();
     377                 :            :             }
     378                 :            :         }
     379                 :            :         else
     380                 :            :         {
     381 [ -  + ][ #  # ]:       8494 :             if ( GetNativeControlRegion( CTRL_SCROLLBAR, PART_BUTTON_UP,
                 [ -  + ]
     382 [ +  - ][ +  - ]:       8494 :                         aControlRegion, 0, ImplControlValue(), rtl::OUString(), aBoundingRegion, aBtn1Region ) &&
         [ +  - ][ +  - ]
           [ #  #  #  # ]
     383                 :            :                  GetNativeControlRegion( CTRL_SCROLLBAR, PART_BUTTON_DOWN,
     384 [ #  # ][ -  + ]:       4247 :                         aControlRegion, 0, ImplControlValue(), rtl::OUString(), aBoundingRegion, aBtn2Region ) )
         [ #  # ][ -  + ]
           [ #  #  #  # ]
     385                 :            :             {
     386                 :          0 :                 maBtn1Rect = aBtn1Region;
     387                 :          0 :                 maBtn2Rect = aBtn2Region;
     388                 :            :             }
     389                 :            :             else
     390                 :            :             {
     391                 :       4247 :                 const Size aBtnSize( aSize.Width(), aSize.Width() );
     392                 :       4247 :                 maBtn2Rect.Left()   = maBtn1Rect.Left();
     393                 :       4247 :                 maBtn2Rect.Top()    = aSize.Height()-aSize.Width();
     394         [ +  - ]:       4247 :                 maBtn1Rect.SetSize( aBtnSize );
     395         [ +  - ]:       4247 :                 maBtn2Rect.SetSize( aBtnSize );
     396                 :            :             }
     397                 :            : 
     398         [ -  + ]:       4247 :             if ( GetNativeControlRegion( CTRL_SCROLLBAR, PART_TRACK_VERT_AREA,
     399 [ +  - ][ +  - ]:       4247 :                      aControlRegion, 0, ImplControlValue(), rtl::OUString(), aBoundingRegion, aTrackRegion ) )
     400                 :          0 :                 maTrackRect = aTrackRegion;
     401                 :            :             else
     402 [ +  - ][ +  - ]:       4247 :                 maTrackRect = Rectangle( maBtn1Rect.BottomLeft()+Point(0,1), maBtn2Rect.TopRight() );
                 [ +  - ]
     403                 :            : 
     404                 :            :             // Check if available space is big enough for thumb
     405                 :       4247 :             mnThumbPixRange = maTrackRect.Bottom() - maTrackRect.Top();
     406         [ +  + ]:       4247 :             if( mnThumbPixRange > 0 )
     407                 :            :             {
     408                 :       2586 :                 maPage1Rect.Top()       = maTrackRect.Top();
     409                 :       2586 :                 maPage1Rect.Right()     =
     410                 :       2586 :                 maPage2Rect.Right()     =
     411                 :       2586 :                 maThumbRect.Right()     = maTrackRect.Right();
     412                 :            :             }
     413                 :            :             else
     414                 :            :             {
     415                 :       1661 :                 mnThumbPixRange = 0;
     416                 :       1661 :                 maPage1Rect.SetEmpty();
     417                 :       1661 :                 maPage2Rect.SetEmpty();
     418                 :            :             }
     419                 :            :         }
     420                 :            : 
     421         [ +  + ]:       7692 :         if ( !mnThumbPixRange )
     422                 :       3410 :             maThumbRect.SetEmpty();
     423                 :            : 
     424                 :       7692 :         mbCalcSize = sal_False;
     425                 :            :     }
     426                 :            : 
     427         [ +  + ]:      10689 :     if ( mnThumbPixRange )
     428                 :            :     {
     429                 :            :         // Werte berechnen
     430 [ +  + ][ +  + ]:       7115 :         if ( (mnVisibleSize >= (mnMaxRange-mnMinRange)) ||
     431                 :            :              ((mnMaxRange-mnMinRange) <= 0) )
     432                 :            :         {
     433                 :        396 :             mnThumbPos      = mnMinRange;
     434                 :        396 :             mnThumbPixPos   = 0;
     435                 :        396 :             mnThumbPixSize  = mnThumbPixRange;
     436                 :            :         }
     437                 :            :         else
     438                 :            :         {
     439         [ +  + ]:       6719 :             if ( mnVisibleSize )
     440                 :       6549 :                 mnThumbPixSize = ImplMulDiv( mnThumbPixRange, mnVisibleSize, mnMaxRange-mnMinRange );
     441                 :            :             else
     442                 :            :             {
     443 [ +  - ][ +  + ]:        170 :                 if ( GetStyle() & WB_HORZ )
     444         [ +  - ]:         40 :                     mnThumbPixSize = maThumbRect.GetWidth();
     445                 :            :                 else
     446         [ +  - ]:        130 :                     mnThumbPixSize = maThumbRect.GetHeight();
     447                 :            :             }
     448         [ +  + ]:       6719 :             if ( mnThumbPixSize < nMinThumbSize )
     449                 :         76 :                 mnThumbPixSize = nMinThumbSize;
     450         [ +  + ]:       6719 :             if ( mnThumbPixSize > mnThumbPixRange )
     451                 :          6 :                 mnThumbPixSize = mnThumbPixRange;
     452                 :       7115 :             mnThumbPixPos = ImplCalcThumbPosPix( mnThumbPos );
     453                 :            :         }
     454                 :            :     }
     455                 :            : 
     456                 :            :     // Wenn neu ausgegeben werden soll und wir schon ueber eine
     457                 :            :     // Aktion einen Paint-Event ausgeloest bekommen haben, dann
     458                 :            :     // geben wir nicht direkt aus, sondern invalidieren nur alles
     459 [ +  + ][ +  - ]:      10689 :     if ( bUpdate && HasPaintEvent() )
         [ +  + ][ +  + ]
     460                 :            :     {
     461         [ +  - ]:       2875 :         Invalidate();
     462                 :       2875 :         bUpdate = sal_False;
     463                 :            :     }
     464         [ +  - ]:      10689 :     ImplUpdateRects( bUpdate );
     465                 :      10689 : }
     466                 :            : 
     467                 :            : // -----------------------------------------------------------------------
     468                 :            : 
     469                 :          0 : void ScrollBar::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags )
     470                 :            : {
     471         [ #  # ]:          0 :     Point       aPos  = pDev->LogicToPixel( rPos );
     472         [ #  # ]:          0 :     Size        aSize = pDev->LogicToPixel( rSize );
     473         [ #  # ]:          0 :     Rectangle   aRect( aPos, aSize );
     474                 :            : 
     475         [ #  # ]:          0 :     pDev->Push();
     476         [ #  # ]:          0 :     pDev->SetMapMode();
     477         [ #  # ]:          0 :     if ( !(nFlags & WINDOW_DRAW_MONO) )
     478                 :            :     {
     479                 :            :         // DecoView uses the FaceColor...
     480         [ #  # ]:          0 :         AllSettings aSettings = pDev->GetSettings();
     481         [ #  # ]:          0 :         StyleSettings aStyleSettings = aSettings.GetStyleSettings();
     482 [ #  # ][ #  # ]:          0 :         if ( IsControlBackground() )
     483 [ #  # ][ #  # ]:          0 :             aStyleSettings.SetFaceColor( GetControlBackground() );
     484                 :            :         else
     485         [ #  # ]:          0 :             aStyleSettings.SetFaceColor( GetSettings().GetStyleSettings().GetFaceColor() );
     486                 :            : 
     487         [ #  # ]:          0 :         aSettings.SetStyleSettings( aStyleSettings );
     488 [ #  # ][ #  # ]:          0 :         pDev->SetSettings( aSettings );
                 [ #  # ]
     489                 :            :     }
     490                 :            : 
     491                 :            :     // for printing:
     492                 :            :     // -calculate the size of the rects
     493                 :            :     // -because this is zero-based add the correct offset
     494                 :            :     // -print
     495                 :            :     // -force recalculate
     496                 :            : 
     497         [ #  # ]:          0 :     if ( mbCalcSize )
     498         [ #  # ]:          0 :         ImplCalc( sal_False );
     499                 :            : 
     500         [ #  # ]:          0 :     maBtn1Rect+=aPos;
     501         [ #  # ]:          0 :     maBtn2Rect+=aPos;
     502         [ #  # ]:          0 :     maThumbRect+=aPos;
     503         [ #  # ]:          0 :     mpData->maTrackRect+=aPos; // TODO: update when maTrackRect is no longer in mpData
     504         [ #  # ]:          0 :     maPage1Rect+=aPos;
     505         [ #  # ]:          0 :     maPage2Rect+=aPos;
     506                 :            : 
     507         [ #  # ]:          0 :     ImplDraw( SCRBAR_DRAW_ALL, pDev );
     508         [ #  # ]:          0 :     pDev->Pop();
     509                 :            : 
     510                 :          0 :     mbCalcSize = sal_True;
     511                 :          0 : }
     512                 :            : 
     513                 :            : // -----------------------------------------------------------------------
     514                 :            : 
     515                 :      24917 : sal_Bool ScrollBar::ImplDrawNative( sal_uInt16 nDrawFlags )
     516                 :            : {
     517         [ +  - ]:      24917 :     ScrollbarValue scrValue;
     518                 :            : 
     519         [ +  - ]:      24917 :     sal_Bool bNativeOK = IsNativeControlSupported(CTRL_SCROLLBAR, PART_ENTIRE_CONTROL);
     520         [ -  + ]:      24917 :     if( bNativeOK )
     521                 :            :     {
     522         [ #  # ]:          0 :         sal_Bool bHorz = (GetStyle() & WB_HORZ ? true : false);
     523                 :            : 
     524                 :            :         // Draw the entire background if the control supports it
     525 [ #  # ][ #  # ]:          0 :         if( IsNativeControlSupported(CTRL_SCROLLBAR, bHorz ? PART_DRAW_BACKGROUND_HORZ : PART_DRAW_BACKGROUND_VERT) )
                 [ #  # ]
     526                 :            :         {
     527 [ #  # ][ #  # ]:          0 :             ControlState        nState = ( IsEnabled() ? CTRL_STATE_ENABLED : 0 ) | ( HasFocus() ? CTRL_STATE_FOCUSED : 0 );
         [ #  # ][ #  # ]
     528                 :            : 
     529                 :          0 :             scrValue.mnMin = mnMinRange;
     530                 :          0 :             scrValue.mnMax = mnMaxRange;
     531                 :          0 :             scrValue.mnCur = mnThumbPos;
     532                 :          0 :             scrValue.mnVisibleSize = mnVisibleSize;
     533                 :          0 :             scrValue.maThumbRect = maThumbRect;
     534                 :          0 :             scrValue.maButton1Rect = maBtn1Rect;
     535                 :          0 :             scrValue.maButton2Rect = maBtn2Rect;
     536                 :            :             scrValue.mnButton1State = ((mnStateFlags & SCRBAR_STATE_BTN1_DOWN) ? CTRL_STATE_PRESSED : 0) |
     537 [ #  # ][ #  # ]:          0 :                                 ((!(mnStateFlags & SCRBAR_STATE_BTN1_DISABLE)) ? CTRL_STATE_ENABLED : 0);
     538                 :            :             scrValue.mnButton2State = ((mnStateFlags & SCRBAR_STATE_BTN2_DOWN) ? CTRL_STATE_PRESSED : 0) |
     539         [ #  # ]:          0 :                                 ((!(mnStateFlags & SCRBAR_STATE_BTN2_DISABLE)) ? CTRL_STATE_ENABLED : 0);
     540         [ #  # ]:          0 :             scrValue.mnThumbState = nState | ((mnStateFlags & SCRBAR_STATE_THUMB_DOWN) ? CTRL_STATE_PRESSED : 0);
     541         [ #  # ]:          0 :             scrValue.mnPage1State = nState | ((mnStateFlags & SCRBAR_STATE_PAGE1_DOWN) ? CTRL_STATE_PRESSED : 0);
     542         [ #  # ]:          0 :             scrValue.mnPage2State = nState | ((mnStateFlags & SCRBAR_STATE_PAGE2_DOWN) ? CTRL_STATE_PRESSED : 0);
     543                 :            : 
     544 [ #  # ][ #  # ]:          0 :             if( IsMouseOver() )
     545                 :            :             {
     546 [ #  # ][ #  # ]:          0 :                 Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
     547         [ #  # ]:          0 :                 if( pRect )
     548                 :            :                 {
     549         [ #  # ]:          0 :                     if( pRect == &maThumbRect )
     550                 :          0 :                         scrValue.mnThumbState |= CTRL_STATE_ROLLOVER;
     551         [ #  # ]:          0 :                     else if( pRect == &maBtn1Rect )
     552                 :          0 :                         scrValue.mnButton1State |= CTRL_STATE_ROLLOVER;
     553         [ #  # ]:          0 :                     else if( pRect == &maBtn2Rect )
     554                 :          0 :                         scrValue.mnButton2State |= CTRL_STATE_ROLLOVER;
     555         [ #  # ]:          0 :                     else if( pRect == &maPage1Rect )
     556                 :          0 :                         scrValue.mnPage1State |= CTRL_STATE_ROLLOVER;
     557         [ #  # ]:          0 :                     else if( pRect == &maPage2Rect )
     558                 :          0 :                         scrValue.mnPage2State |= CTRL_STATE_ROLLOVER;
     559                 :            :                 }
     560                 :            :             }
     561                 :            : 
     562         [ #  # ]:          0 :             Rectangle aCtrlRegion;
     563         [ #  # ]:          0 :             aCtrlRegion.Union( maBtn1Rect );
     564         [ #  # ]:          0 :             aCtrlRegion.Union( maBtn2Rect );
     565         [ #  # ]:          0 :             aCtrlRegion.Union( maPage1Rect );
     566         [ #  # ]:          0 :             aCtrlRegion.Union( maPage2Rect );
     567         [ #  # ]:          0 :             aCtrlRegion.Union( maThumbRect );
     568                 :            :             bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, (bHorz ? PART_DRAW_BACKGROUND_HORZ : PART_DRAW_BACKGROUND_VERT),
     569 [ #  # ][ #  # ]:          0 :                             aCtrlRegion, nState, scrValue, rtl::OUString() );
     570                 :            :         }
     571                 :            :         else
     572                 :            :       {
     573 [ #  # ][ #  # ]:          0 :         if ( (nDrawFlags & SCRBAR_DRAW_PAGE1) || (nDrawFlags & SCRBAR_DRAW_PAGE2) )
     574                 :            :         {
     575         [ #  # ]:          0 :             sal_uInt32  part1 = bHorz ? PART_TRACK_HORZ_LEFT : PART_TRACK_VERT_UPPER;
     576         [ #  # ]:          0 :             sal_uInt32  part2 = bHorz ? PART_TRACK_HORZ_RIGHT : PART_TRACK_VERT_LOWER;
     577                 :          0 :             Rectangle   aCtrlRegion1( maPage1Rect );
     578                 :          0 :             Rectangle   aCtrlRegion2( maPage2Rect );
     579 [ #  # ][ #  # ]:          0 :             ControlState nState1 = (IsEnabled() ? CTRL_STATE_ENABLED : 0) | (HasFocus() ? CTRL_STATE_FOCUSED : 0);
         [ #  # ][ #  # ]
     580                 :          0 :             ControlState nState2 = nState1;
     581                 :            : 
     582         [ #  # ]:          0 :             nState1 |= ((mnStateFlags & SCRBAR_STATE_PAGE1_DOWN) ? CTRL_STATE_PRESSED : 0);
     583         [ #  # ]:          0 :             nState2 |= ((mnStateFlags & SCRBAR_STATE_PAGE2_DOWN) ? CTRL_STATE_PRESSED : 0);
     584                 :            : 
     585 [ #  # ][ #  # ]:          0 :             if( IsMouseOver() )
     586                 :            :             {
     587 [ #  # ][ #  # ]:          0 :                 Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
     588         [ #  # ]:          0 :                 if( pRect )
     589                 :            :                 {
     590         [ #  # ]:          0 :                     if( pRect == &maPage1Rect )
     591                 :          0 :                         nState1 |= CTRL_STATE_ROLLOVER;
     592         [ #  # ]:          0 :                     else if( pRect == &maPage2Rect )
     593                 :          0 :                         nState2 |= CTRL_STATE_ROLLOVER;
     594                 :            :                 }
     595                 :            :             }
     596                 :            : 
     597         [ #  # ]:          0 :             if ( nDrawFlags & SCRBAR_DRAW_PAGE1 )
     598                 :            :                 bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, part1, aCtrlRegion1, nState1,
     599         [ #  # ]:          0 :                                 scrValue, rtl::OUString() );
     600                 :            : 
     601         [ #  # ]:          0 :             if ( nDrawFlags & SCRBAR_DRAW_PAGE2 )
     602                 :            :                 bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, part2, aCtrlRegion2, nState2,
     603         [ #  # ]:          0 :                                 scrValue, rtl::OUString() );
     604                 :            :         }
     605 [ #  # ][ #  # ]:          0 :         if ( (nDrawFlags & SCRBAR_DRAW_BTN1) || (nDrawFlags & SCRBAR_DRAW_BTN2) )
     606                 :            :         {
     607         [ #  # ]:          0 :             sal_uInt32  part1 = bHorz ? PART_BUTTON_LEFT : PART_BUTTON_UP;
     608         [ #  # ]:          0 :             sal_uInt32  part2 = bHorz ? PART_BUTTON_RIGHT : PART_BUTTON_DOWN;
     609                 :          0 :             Rectangle   aCtrlRegion1( maBtn1Rect );
     610                 :          0 :             Rectangle   aCtrlRegion2( maBtn2Rect );
     611 [ #  # ][ #  # ]:          0 :             ControlState nState1 = HasFocus() ? CTRL_STATE_FOCUSED : 0;
     612                 :          0 :             ControlState nState2 = nState1;
     613                 :            : 
     614 [ #  # ][ #  # ]:          0 :             if ( !Window::IsEnabled() || !IsEnabled() )
         [ #  # ][ #  # ]
                 [ #  # ]
     615                 :          0 :                 nState1 = (nState2 &= ~CTRL_STATE_ENABLED);
     616                 :            :             else
     617                 :          0 :                 nState1 = (nState2 |= CTRL_STATE_ENABLED);
     618                 :            : 
     619         [ #  # ]:          0 :             nState1 |= ((mnStateFlags & SCRBAR_STATE_BTN1_DOWN) ? CTRL_STATE_PRESSED : 0);
     620                 :          0 :             nState2 |= ((mnStateFlags & SCRBAR_STATE_BTN2_DOWN) ? CTRL_STATE_PRESSED : 0);
     621                 :            : 
     622         [ #  # ]:          0 :             if(mnStateFlags & SCRBAR_STATE_BTN1_DISABLE)
     623                 :          0 :                 nState1 &= ~CTRL_STATE_ENABLED;
     624         [ #  # ]:          0 :             if(mnStateFlags & SCRBAR_STATE_BTN2_DISABLE)
     625                 :          0 :                 nState2 &= ~CTRL_STATE_ENABLED;
     626                 :            : 
     627 [ #  # ][ #  # ]:          0 :             if( IsMouseOver() )
     628                 :            :             {
     629 [ #  # ][ #  # ]:          0 :                 Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
     630         [ #  # ]:          0 :                 if( pRect )
     631                 :            :                 {
     632         [ #  # ]:          0 :                     if( pRect == &maBtn1Rect )
     633                 :          0 :                         nState1 |= CTRL_STATE_ROLLOVER;
     634         [ #  # ]:          0 :                     else if( pRect == &maBtn2Rect )
     635                 :          0 :                         nState2 |= CTRL_STATE_ROLLOVER;
     636                 :            :                 }
     637                 :            :             }
     638                 :            : 
     639         [ #  # ]:          0 :             if ( nDrawFlags & SCRBAR_DRAW_BTN1 )
     640                 :            :                 bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, part1, aCtrlRegion1, nState1,
     641         [ #  # ]:          0 :                                 scrValue, rtl::OUString() );
     642                 :            : 
     643         [ #  # ]:          0 :             if ( nDrawFlags & SCRBAR_DRAW_BTN2 )
     644                 :            :                 bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, part2, aCtrlRegion2, nState2,
     645         [ #  # ]:          0 :                                 scrValue, rtl::OUString() );
     646                 :            :         }
     647 [ #  # ][ #  # ]:          0 :         if ( (nDrawFlags & SCRBAR_DRAW_THUMB) && !maThumbRect.IsEmpty() )
         [ #  # ][ #  # ]
     648                 :            :         {
     649 [ #  # ][ #  # ]:          0 :             ControlState    nState = IsEnabled() ? CTRL_STATE_ENABLED : 0;
     650                 :          0 :             Rectangle       aCtrlRegion( maThumbRect );
     651                 :            : 
     652         [ #  # ]:          0 :             if ( mnStateFlags & SCRBAR_STATE_THUMB_DOWN )
     653                 :          0 :                 nState |= CTRL_STATE_PRESSED;
     654                 :            : 
     655 [ #  # ][ #  # ]:          0 :             if ( HasFocus() )
     656                 :          0 :                 nState |= CTRL_STATE_FOCUSED;
     657                 :            : 
     658 [ #  # ][ #  # ]:          0 :             if( IsMouseOver() )
     659                 :            :             {
     660 [ #  # ][ #  # ]:          0 :                 Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
     661         [ #  # ]:          0 :                 if( pRect )
     662                 :            :                 {
     663         [ #  # ]:          0 :                     if( pRect == &maThumbRect )
     664                 :          0 :                         nState |= CTRL_STATE_ROLLOVER;
     665                 :            :                 }
     666                 :            :             }
     667                 :            : 
     668                 :            :             bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, (bHorz ? PART_THUMB_HORZ : PART_THUMB_VERT),
     669 [ #  # ][ #  # ]:          0 :                     aCtrlRegion, nState, scrValue, rtl::OUString() );
     670                 :            :         }
     671                 :            :       }
     672                 :            :     }
     673         [ +  - ]:      24917 :     return bNativeOK;
     674                 :            : }
     675                 :            : 
     676                 :       5040 : void ScrollBar::ImplDraw( sal_uInt16 nDrawFlags, OutputDevice* pOutDev )
     677                 :            : {
     678                 :       5040 :     DecorationView          aDecoView( pOutDev );
     679         [ +  - ]:       5040 :     Rectangle               aTempRect;
     680                 :            :     sal_uInt16                  nStyle;
     681                 :       5040 :     const StyleSettings&    rStyleSettings = pOutDev->GetSettings().GetStyleSettings();
     682                 :            :     SymbolType              eSymbolType;
     683         [ +  - ]:       5040 :     sal_Bool                    bEnabled = IsEnabled();
     684                 :            : 
     685                 :            :     // Evt. noch offene Berechnungen nachholen
     686         [ +  + ]:       5040 :     if ( mbCalcSize )
     687         [ +  - ]:       1887 :         ImplCalc( sal_False );
     688                 :            : 
     689                 :       5040 :     Window *pWin = NULL;
     690         [ +  - ]:       5040 :     if( pOutDev->GetOutDevType() == OUTDEV_WINDOW )
     691                 :       5040 :         pWin = (Window*) pOutDev;
     692                 :            : 
     693                 :            :     // Draw the entire control if the native theme engine needs it
     694 [ +  + ][ +  - ]:       5040 :     if ( nDrawFlags && pWin && pWin->IsNativeControlSupported(CTRL_SCROLLBAR, PART_DRAW_BACKGROUND_HORZ) )
         [ +  - ][ -  + ]
                 [ -  + ]
     695                 :            :     {
     696         [ #  # ]:          0 :         ImplDrawNative( SCRBAR_DRAW_BACKGROUND );
     697                 :       5040 :         return;
     698                 :            :     }
     699                 :            : 
     700 [ +  + ][ +  - ]:       5040 :     if( (nDrawFlags & SCRBAR_DRAW_BTN1) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_BTN1 ) ) )
         [ +  - ][ +  - ]
                 [ +  + ]
     701                 :            :     {
     702                 :       4930 :         nStyle = BUTTON_DRAW_NOLIGHTBORDER;
     703         [ -  + ]:       4930 :         if ( mnStateFlags & SCRBAR_STATE_BTN1_DOWN )
     704                 :          0 :             nStyle |= BUTTON_DRAW_PRESSED;
     705         [ +  - ]:       4930 :         aTempRect = aDecoView.DrawButton( maBtn1Rect, nStyle );
     706         [ +  - ]:       4930 :         ImplCalcSymbolRect( aTempRect );
     707                 :       4930 :         nStyle = 0;
     708 [ +  + ][ -  + ]:       4930 :         if ( (mnStateFlags & SCRBAR_STATE_BTN1_DISABLE) || !bEnabled )
     709                 :       4116 :             nStyle |= SYMBOL_DRAW_DISABLE;
     710         [ -  + ]:       4930 :         if ( rStyleSettings.GetOptions() & STYLE_OPTION_SCROLLARROW )
     711                 :            :         {
     712 [ #  # ][ #  # ]:          0 :             if ( GetStyle() & WB_HORZ )
     713                 :          0 :                 eSymbolType = SYMBOL_ARROW_LEFT;
     714                 :            :             else
     715                 :          0 :                 eSymbolType = SYMBOL_ARROW_UP;
     716                 :            :         }
     717                 :            :         else
     718                 :            :         {
     719 [ +  - ][ +  + ]:       4930 :             if ( GetStyle() & WB_HORZ )
     720                 :       2227 :                 eSymbolType = SYMBOL_SPIN_LEFT;
     721                 :            :             else
     722                 :       2703 :                 eSymbolType = SYMBOL_SPIN_UP;
     723                 :            :         }
     724         [ +  - ]:       4930 :         aDecoView.DrawSymbol( aTempRect, eSymbolType, rStyleSettings.GetButtonTextColor(), nStyle );
     725                 :            :     }
     726                 :            : 
     727 [ +  + ][ +  - ]:       5040 :     if ( (nDrawFlags & SCRBAR_DRAW_BTN2) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_BTN2 ) ) )
         [ +  - ][ +  - ]
                 [ +  + ]
     728                 :            :     {
     729                 :       4920 :         nStyle = BUTTON_DRAW_NOLIGHTBORDER;
     730         [ -  + ]:       4920 :         if ( mnStateFlags & SCRBAR_STATE_BTN2_DOWN )
     731                 :          0 :             nStyle |= BUTTON_DRAW_PRESSED;
     732         [ +  - ]:       4920 :         aTempRect = aDecoView.DrawButton(  maBtn2Rect, nStyle );
     733         [ +  - ]:       4920 :         ImplCalcSymbolRect( aTempRect );
     734                 :       4920 :         nStyle = 0;
     735 [ +  + ][ +  + ]:       4920 :         if ( (mnStateFlags & SCRBAR_STATE_BTN2_DISABLE) || !bEnabled )
     736                 :        231 :             nStyle |= SYMBOL_DRAW_DISABLE;
     737         [ -  + ]:       4920 :         if ( rStyleSettings.GetOptions() & STYLE_OPTION_SCROLLARROW )
     738                 :            :         {
     739 [ #  # ][ #  # ]:          0 :             if ( GetStyle() & WB_HORZ )
     740                 :          0 :                 eSymbolType = SYMBOL_ARROW_RIGHT;
     741                 :            :             else
     742                 :          0 :                 eSymbolType = SYMBOL_ARROW_DOWN;
     743                 :            :         }
     744                 :            :         else
     745                 :            :         {
     746 [ +  - ][ +  + ]:       4920 :             if ( GetStyle() & WB_HORZ )
     747                 :       2236 :                 eSymbolType = SYMBOL_SPIN_RIGHT;
     748                 :            :             else
     749                 :       2684 :                 eSymbolType = SYMBOL_SPIN_DOWN;
     750                 :            :         }
     751         [ +  - ]:       4920 :         aDecoView.DrawSymbol( aTempRect, eSymbolType, rStyleSettings.GetButtonTextColor(), nStyle );
     752                 :            :     }
     753                 :            : 
     754         [ +  - ]:       5040 :     pOutDev->SetLineColor();
     755                 :            : 
     756 [ +  + ][ +  - ]:       5040 :     if ( (nDrawFlags & SCRBAR_DRAW_THUMB) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_THUMB ) ) )
         [ +  - ][ +  - ]
                 [ +  + ]
     757                 :            :     {
     758 [ +  - ][ +  + ]:       5026 :         if ( !maThumbRect.IsEmpty() )
     759                 :            :         {
     760         [ +  + ]:       4993 :             if ( bEnabled )
     761                 :            :             {
     762                 :       4916 :                 nStyle = BUTTON_DRAW_NOLIGHTBORDER;
     763         [ +  - ]:       4916 :                 aTempRect = aDecoView.DrawButton( maThumbRect, nStyle );
     764                 :            :             }
     765                 :            :             else
     766                 :            :             {
     767         [ +  - ]:         77 :                 pOutDev->SetFillColor( rStyleSettings.GetCheckedColor() );
     768         [ +  - ]:         77 :                 pOutDev->DrawRect( maThumbRect );
     769                 :            :             }
     770                 :            :         }
     771                 :            :     }
     772                 :            : 
     773 [ +  + ][ +  - ]:       5040 :     if ( (nDrawFlags & SCRBAR_DRAW_PAGE1) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_PAGE1 ) ) )
         [ +  - ][ +  - ]
                 [ +  + ]
     774                 :            :     {
     775         [ -  + ]:       5015 :         if ( mnStateFlags & SCRBAR_STATE_PAGE1_DOWN )
     776         [ #  # ]:          0 :             pOutDev->SetFillColor( rStyleSettings.GetShadowColor() );
     777                 :            :         else
     778         [ +  - ]:       5015 :             pOutDev->SetFillColor( rStyleSettings.GetCheckedColor() );
     779         [ +  - ]:       5015 :         pOutDev->DrawRect( maPage1Rect );
     780                 :            :     }
     781 [ +  + ][ +  - ]:       5040 :     if ( (nDrawFlags & SCRBAR_DRAW_PAGE2) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_PAGE2 ) ) )
         [ +  - ][ +  - ]
                 [ +  + ]
     782                 :            :     {
     783         [ -  + ]:       5026 :         if ( mnStateFlags & SCRBAR_STATE_PAGE2_DOWN )
     784         [ #  # ]:          0 :             pOutDev->SetFillColor( rStyleSettings.GetShadowColor() );
     785                 :            :         else
     786         [ +  - ]:       5026 :             pOutDev->SetFillColor( rStyleSettings.GetCheckedColor() );
     787         [ +  - ]:       5040 :         pOutDev->DrawRect( maPage2Rect );
     788                 :            :     }
     789                 :            : }
     790                 :            : 
     791                 :            : // -----------------------------------------------------------------------
     792                 :            : 
     793                 :          4 : long ScrollBar::ImplScroll( long nNewPos, sal_Bool bCallEndScroll )
     794                 :            : {
     795                 :          4 :     long nOldPos = mnThumbPos;
     796                 :          4 :     SetThumbPos( nNewPos );
     797                 :          4 :     long nDelta = mnThumbPos-nOldPos;
     798         [ +  - ]:          4 :     if ( nDelta )
     799                 :            :     {
     800                 :          4 :         mnDelta = nDelta;
     801                 :          4 :         Scroll();
     802         [ +  - ]:          4 :         if ( bCallEndScroll )
     803                 :          4 :             EndScroll();
     804                 :          4 :         mnDelta = 0;
     805                 :            :     }
     806                 :          4 :     return nDelta;
     807                 :            : }
     808                 :            : 
     809                 :            : // -----------------------------------------------------------------------
     810                 :            : 
     811                 :          4 : long ScrollBar::ImplDoAction( sal_Bool bCallEndScroll )
     812                 :            : {
     813                 :          4 :     long nDelta = 0;
     814                 :            : 
     815   [ -  +  -  -  :          4 :     switch ( meScrollType )
                      - ]
     816                 :            :     {
     817                 :            :         case SCROLL_LINEUP:
     818                 :          0 :             nDelta = ImplScroll( mnThumbPos-mnLineSize, bCallEndScroll );
     819                 :          0 :             break;
     820                 :            : 
     821                 :            :         case SCROLL_LINEDOWN:
     822                 :          4 :             nDelta = ImplScroll( mnThumbPos+mnLineSize, bCallEndScroll );
     823                 :          4 :             break;
     824                 :            : 
     825                 :            :         case SCROLL_PAGEUP:
     826                 :          0 :             nDelta = ImplScroll( mnThumbPos-mnPageSize, bCallEndScroll );
     827                 :          0 :             break;
     828                 :            : 
     829                 :            :         case SCROLL_PAGEDOWN:
     830                 :          0 :             nDelta = ImplScroll( mnThumbPos+mnPageSize, bCallEndScroll );
     831                 :          0 :             break;
     832                 :            :         default:
     833                 :            :             ;
     834                 :            :     }
     835                 :            : 
     836                 :          4 :     return nDelta;
     837                 :            : }
     838                 :            : 
     839                 :            : // -----------------------------------------------------------------------
     840                 :            : 
     841                 :          0 : void ScrollBar::ImplDoMouseAction( const Point& rMousePos, sal_Bool bCallAction )
     842                 :            : {
     843                 :          0 :     sal_uInt16  nOldStateFlags = mnStateFlags;
     844                 :          0 :     sal_Bool    bAction = sal_False;
     845 [ #  # ][ #  # ]:          0 :     sal_Bool    bHorizontal = ( GetStyle() & WB_HORZ )? sal_True: sal_False;
     846                 :          0 :     sal_Bool    bIsInside = sal_False;
     847                 :            : 
     848                 :          0 :     Point aPoint( 0, 0 );
     849         [ #  # ]:          0 :     Rectangle aControlRegion( aPoint, GetOutputSizePixel() );
     850                 :            : 
     851   [ #  #  #  #  :          0 :     switch ( meScrollType )
                      # ]
     852                 :            :     {
     853                 :            :         case SCROLL_LINEUP:
     854         [ #  # ]:          0 :             if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_BUTTON_LEFT: PART_BUTTON_UP,
     855 [ #  # ][ #  # ]:          0 :                         aControlRegion, rMousePos, bIsInside )?
     856                 :            :                     bIsInside:
     857 [ #  # ][ #  # ]:          0 :                     maBtn1Rect.IsInside( rMousePos ) )
     858                 :            :             {
     859                 :          0 :                 bAction = bCallAction;
     860                 :          0 :                 mnStateFlags |= SCRBAR_STATE_BTN1_DOWN;
     861                 :            :             }
     862                 :            :             else
     863                 :          0 :                 mnStateFlags &= ~SCRBAR_STATE_BTN1_DOWN;
     864                 :          0 :             break;
     865                 :            : 
     866                 :            :         case SCROLL_LINEDOWN:
     867         [ #  # ]:          0 :             if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_BUTTON_RIGHT: PART_BUTTON_DOWN,
     868 [ #  # ][ #  # ]:          0 :                         aControlRegion, rMousePos, bIsInside )?
     869                 :            :                     bIsInside:
     870 [ #  # ][ #  # ]:          0 :                     maBtn2Rect.IsInside( rMousePos ) )
     871                 :            :             {
     872                 :          0 :                 bAction = bCallAction;
     873                 :          0 :                 mnStateFlags |= SCRBAR_STATE_BTN2_DOWN;
     874                 :            :             }
     875                 :            :             else
     876                 :          0 :                 mnStateFlags &= ~SCRBAR_STATE_BTN2_DOWN;
     877                 :          0 :             break;
     878                 :            : 
     879                 :            :         case SCROLL_PAGEUP:
     880                 :            :             // HitTestNativeControl, see remark at top of file
     881         [ #  # ]:          0 :             if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_TRACK_HORZ_LEFT: PART_TRACK_VERT_UPPER,
     882 [ #  # ][ #  # ]:          0 :                                        maPage1Rect, rMousePos, bIsInside )?
     883                 :            :                     bIsInside:
     884 [ #  # ][ #  # ]:          0 :                     maPage1Rect.IsInside( rMousePos ) )
     885                 :            :             {
     886                 :          0 :                 bAction = bCallAction;
     887                 :          0 :                 mnStateFlags |= SCRBAR_STATE_PAGE1_DOWN;
     888                 :            :             }
     889                 :            :             else
     890                 :          0 :                 mnStateFlags &= ~SCRBAR_STATE_PAGE1_DOWN;
     891                 :          0 :             break;
     892                 :            : 
     893                 :            :         case SCROLL_PAGEDOWN:
     894                 :            :             // HitTestNativeControl, see remark at top of file
     895         [ #  # ]:          0 :             if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_TRACK_HORZ_RIGHT: PART_TRACK_VERT_LOWER,
     896 [ #  # ][ #  # ]:          0 :                                        maPage2Rect, rMousePos, bIsInside )?
     897                 :            :                     bIsInside:
     898 [ #  # ][ #  # ]:          0 :                     maPage2Rect.IsInside( rMousePos ) )
     899                 :            :             {
     900                 :          0 :                 bAction = bCallAction;
     901                 :          0 :                 mnStateFlags |= SCRBAR_STATE_PAGE2_DOWN;
     902                 :            :             }
     903                 :            :             else
     904                 :          0 :                 mnStateFlags &= ~SCRBAR_STATE_PAGE2_DOWN;
     905                 :          0 :             break;
     906                 :            :         default:
     907                 :            :             ;
     908                 :            :     }
     909                 :            : 
     910         [ #  # ]:          0 :     if ( nOldStateFlags != mnStateFlags )
     911         [ #  # ]:          0 :         ImplDraw( mnDragDraw, this );
     912         [ #  # ]:          0 :     if ( bAction )
     913         [ #  # ]:          0 :         ImplDoAction( sal_False );
     914                 :          0 : }
     915                 :            : 
     916                 :            : // -----------------------------------------------------------------------
     917                 :            : 
     918                 :          0 : void ScrollBar::ImplDragThumb( const Point& rMousePos )
     919                 :            : {
     920                 :            :     long nMovePix;
     921         [ #  # ]:          0 :     if ( GetStyle() & WB_HORZ )
     922                 :          0 :         nMovePix = rMousePos.X()-(maThumbRect.Left()+mnMouseOff);
     923                 :            :     else
     924                 :          0 :         nMovePix = rMousePos.Y()-(maThumbRect.Top()+mnMouseOff);
     925                 :            : 
     926                 :            :     // move thumb if necessary
     927         [ #  # ]:          0 :     if ( nMovePix )
     928                 :            :     {
     929                 :          0 :         mnThumbPixPos += nMovePix;
     930         [ #  # ]:          0 :         if ( mnThumbPixPos < 0 )
     931                 :          0 :             mnThumbPixPos = 0;
     932         [ #  # ]:          0 :         if ( mnThumbPixPos > (mnThumbPixRange-mnThumbPixSize) )
     933                 :          0 :             mnThumbPixPos = mnThumbPixRange-mnThumbPixSize;
     934                 :          0 :         long nOldPos = mnThumbPos;
     935                 :          0 :         mnThumbPos = ImplCalcThumbPos( mnThumbPixPos );
     936                 :          0 :         ImplUpdateRects();
     937 [ #  # ][ #  # ]:          0 :         if ( mbFullDrag && (nOldPos != mnThumbPos) )
     938                 :            :         {
     939                 :          0 :             mnDelta = mnThumbPos-nOldPos;
     940                 :          0 :             Scroll();
     941                 :          0 :             mnDelta = 0;
     942                 :            :         }
     943                 :            :     }
     944                 :          0 : }
     945                 :            : 
     946                 :            : // -----------------------------------------------------------------------
     947                 :            : 
     948                 :          0 : void ScrollBar::MouseButtonDown( const MouseEvent& rMEvt )
     949                 :            : {
     950 [ #  # ][ #  # ]:          0 :     if ( rMEvt.IsLeft() || rMEvt.IsMiddle() )
                 [ #  # ]
     951                 :            :     {
     952                 :          0 :         const Point&    rMousePos = rMEvt.GetPosPixel();
     953                 :          0 :         sal_uInt16          nTrackFlags = 0;
     954 [ #  # ][ #  # ]:          0 :         sal_Bool            bHorizontal = ( GetStyle() & WB_HORZ )? sal_True: sal_False;
     955                 :          0 :         sal_Bool            bIsInside = sal_False;
     956                 :          0 :         sal_Bool            bDragToMouse = sal_False;
     957                 :            : 
     958                 :          0 :         Point aPoint( 0, 0 );
     959         [ #  # ]:          0 :         Rectangle aControlRegion( aPoint, GetOutputSizePixel() );
     960                 :            : 
     961         [ #  # ]:          0 :         if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_BUTTON_LEFT: PART_BUTTON_UP,
     962 [ #  # ][ #  # ]:          0 :                     aControlRegion, rMousePos, bIsInside )?
     963                 :            :                 bIsInside:
     964 [ #  # ][ #  # ]:          0 :                 maBtn1Rect.IsInside( rMousePos ) )
     965                 :            :         {
     966         [ #  # ]:          0 :             if ( !(mnStateFlags & SCRBAR_STATE_BTN1_DISABLE) )
     967                 :            :             {
     968                 :          0 :                 nTrackFlags     = STARTTRACK_BUTTONREPEAT;
     969                 :          0 :                 meScrollType    = SCROLL_LINEUP;
     970                 :          0 :                 mnDragDraw      = SCRBAR_DRAW_BTN1;
     971                 :            :             }
     972                 :            :         }
     973         [ #  # ]:          0 :         else if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_BUTTON_RIGHT: PART_BUTTON_DOWN,
     974 [ #  # ][ #  # ]:          0 :                     aControlRegion, rMousePos, bIsInside )?
     975                 :            :                 bIsInside:
     976 [ #  # ][ #  # ]:          0 :                 maBtn2Rect.IsInside( rMousePos ) )
     977                 :            :         {
     978         [ #  # ]:          0 :             if ( !(mnStateFlags & SCRBAR_STATE_BTN2_DISABLE) )
     979                 :            :             {
     980                 :          0 :                 nTrackFlags     = STARTTRACK_BUTTONREPEAT;
     981                 :          0 :                 meScrollType    = SCROLL_LINEDOWN;
     982                 :          0 :                 mnDragDraw      = SCRBAR_DRAW_BTN2;
     983                 :            :             }
     984                 :            :         }
     985                 :            :         else
     986                 :            :         {
     987                 :            :             bool bThumbHit = HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_THUMB_HORZ : PART_THUMB_VERT,
     988 [ #  # ][ #  # ]:          0 :                                                    maThumbRect, rMousePos, bIsInside )
     989 [ #  # ][ #  # ]:          0 :                              ? bIsInside : maThumbRect.IsInside( rMousePos );
     990 [ #  # ][ #  # ]:          0 :             bool bDragHandling = rMEvt.IsMiddle() || bThumbHit || ImplGetSVData()->maNWFData.mbScrollbarJumpPage;
         [ #  # ][ #  # ]
     991         [ #  # ]:          0 :             if( bDragHandling )
     992                 :            :             {
     993         [ #  # ]:          0 :                 if( mpData )
     994                 :            :                 {
     995                 :          0 :                     mpData->mbHide = sal_True;  // disable focus blinking
     996 [ #  # ][ #  # ]:          0 :                     if( HasFocus() )
     997         [ #  # ]:          0 :                         ImplDraw( SCRBAR_DRAW_THUMB, this ); // paint without focus
     998                 :            :                 }
     999                 :            : 
    1000         [ #  # ]:          0 :                 if ( mnVisibleSize < mnMaxRange-mnMinRange )
    1001                 :            :                 {
    1002                 :          0 :                     nTrackFlags     = 0;
    1003                 :          0 :                     meScrollType    = SCROLL_DRAG;
    1004                 :          0 :                     mnDragDraw      = SCRBAR_DRAW_THUMB;
    1005                 :            : 
    1006                 :            :                     // calculate mouse offset
    1007 [ #  # ][ #  # ]:          0 :                     if( rMEvt.IsMiddle() || (ImplGetSVData()->maNWFData.mbScrollbarJumpPage && !bThumbHit) )
         [ #  # ][ #  # ]
                 [ #  # ]
    1008                 :            :                     {
    1009                 :          0 :                         bDragToMouse = sal_True;
    1010 [ #  # ][ #  # ]:          0 :                         if ( GetStyle() & WB_HORZ )
    1011         [ #  # ]:          0 :                             mnMouseOff = maThumbRect.GetWidth()/2;
    1012                 :            :                         else
    1013         [ #  # ]:          0 :                             mnMouseOff = maThumbRect.GetHeight()/2;
    1014                 :            :                     }
    1015                 :            :                     else
    1016                 :            :                     {
    1017 [ #  # ][ #  # ]:          0 :                         if ( GetStyle() & WB_HORZ )
    1018                 :          0 :                             mnMouseOff = rMousePos.X()-maThumbRect.Left();
    1019                 :            :                         else
    1020                 :          0 :                             mnMouseOff = rMousePos.Y()-maThumbRect.Top();
    1021                 :            :                     }
    1022                 :            : 
    1023                 :          0 :                     mnStateFlags |= SCRBAR_STATE_THUMB_DOWN;
    1024         [ #  # ]:          0 :                     ImplDraw( mnDragDraw, this );
    1025                 :            :                 }
    1026                 :            :             }
    1027         [ #  # ]:          0 :             else if( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_TRACK_HORZ_AREA : PART_TRACK_VERT_AREA,
    1028 [ #  # ][ #  # ]:          0 :                                            aControlRegion, rMousePos, bIsInside )?
    1029 [ #  # ][ #  # ]:          0 :                 bIsInside : sal_True )
    1030                 :            :             {
    1031                 :          0 :                 nTrackFlags = STARTTRACK_BUTTONREPEAT;
    1032                 :            : 
    1033                 :            :                 // HitTestNativeControl, see remark at top of file
    1034         [ #  # ]:          0 :                 if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_TRACK_HORZ_LEFT : PART_TRACK_VERT_UPPER,
    1035 [ #  # ][ #  # ]:          0 :                                            maPage1Rect, rMousePos, bIsInside )?
    1036                 :            :                     bIsInside:
    1037 [ #  # ][ #  # ]:          0 :                     maPage1Rect.IsInside( rMousePos ) )
    1038                 :            :                 {
    1039                 :          0 :                     meScrollType    = SCROLL_PAGEUP;
    1040                 :          0 :                     mnDragDraw      = SCRBAR_DRAW_PAGE1;
    1041                 :            :                 }
    1042                 :            :                 else
    1043                 :            :                 {
    1044                 :          0 :                     meScrollType    = SCROLL_PAGEDOWN;
    1045                 :          0 :                     mnDragDraw      = SCRBAR_DRAW_PAGE2;
    1046                 :            :                 }
    1047                 :            :             }
    1048                 :            :         }
    1049                 :            : 
    1050                 :            :         // Soll Tracking gestartet werden
    1051         [ #  # ]:          0 :         if ( meScrollType != SCROLL_DONTKNOW )
    1052                 :            :         {
    1053                 :            :             // remember original position in case of abort or EndScroll-Delta
    1054                 :          0 :             mnStartPos = mnThumbPos;
    1055                 :            :             // #92906# Call StartTracking() before ImplDoMouseAction(), otherwise
    1056                 :            :             // MouseButtonUp() / EndTracking() may be called if somebody is spending
    1057                 :            :             // a lot of time in the scroll handler
    1058         [ #  # ]:          0 :             StartTracking( nTrackFlags );
    1059         [ #  # ]:          0 :             ImplDoMouseAction( rMousePos );
    1060                 :            : 
    1061         [ #  # ]:          0 :             if( bDragToMouse )
    1062         [ #  # ]:          0 :                 ImplDragThumb( rMousePos );
    1063                 :            :         }
    1064                 :            :     }
    1065                 :          0 : }
    1066                 :            : 
    1067                 :            : // -----------------------------------------------------------------------
    1068                 :            : 
    1069                 :          0 : void ScrollBar::Tracking( const TrackingEvent& rTEvt )
    1070                 :            : {
    1071         [ #  # ]:          0 :     if ( rTEvt.IsTrackingEnded() )
    1072                 :            :     {
    1073                 :            :         // Button und PageRect-Status wieder herstellen
    1074                 :          0 :         sal_uInt16 nOldStateFlags = mnStateFlags;
    1075                 :            :         mnStateFlags &= ~(SCRBAR_STATE_BTN1_DOWN | SCRBAR_STATE_BTN2_DOWN |
    1076                 :            :                           SCRBAR_STATE_PAGE1_DOWN | SCRBAR_STATE_PAGE2_DOWN |
    1077                 :          0 :                           SCRBAR_STATE_THUMB_DOWN);
    1078         [ #  # ]:          0 :         if ( nOldStateFlags != mnStateFlags )
    1079                 :          0 :             ImplDraw( mnDragDraw, this );
    1080                 :          0 :         mnDragDraw = 0;
    1081                 :            : 
    1082                 :            :         // Bei Abbruch, die alte ThumbPosition wieder herstellen
    1083         [ #  # ]:          0 :         if ( rTEvt.IsTrackingCanceled() )
    1084                 :            :         {
    1085                 :          0 :             long nOldPos = mnThumbPos;
    1086                 :          0 :             SetThumbPos( mnStartPos );
    1087                 :          0 :             mnDelta = mnThumbPos-nOldPos;
    1088                 :          0 :             Scroll();
    1089                 :            :         }
    1090                 :            : 
    1091         [ #  # ]:          0 :         if ( meScrollType == SCROLL_DRAG )
    1092                 :            :         {
    1093                 :            :             // Wenn gedragt wurde, berechnen wir den Thumb neu, damit
    1094                 :            :             // er wieder auf einer gerundeten ThumbPosition steht
    1095                 :          0 :             ImplCalc();
    1096                 :            : 
    1097 [ #  # ][ #  # ]:          0 :             if ( !mbFullDrag && (mnStartPos != mnThumbPos) )
    1098                 :            :             {
    1099                 :          0 :                 mnDelta = mnThumbPos-mnStartPos;
    1100                 :          0 :                 Scroll();
    1101                 :          0 :                 mnDelta = 0;
    1102                 :            :             }
    1103                 :            :         }
    1104                 :            : 
    1105                 :          0 :         mnDelta = mnThumbPos-mnStartPos;
    1106                 :          0 :         EndScroll();
    1107                 :          0 :         mnDelta = 0;
    1108                 :          0 :         meScrollType = SCROLL_DONTKNOW;
    1109                 :            : 
    1110         [ #  # ]:          0 :         if( mpData )
    1111                 :          0 :             mpData->mbHide = sal_False; // re-enable focus blinking
    1112                 :            :     }
    1113                 :            :     else
    1114                 :            :     {
    1115                 :          0 :         const Point rMousePos = rTEvt.GetMouseEvent().GetPosPixel();
    1116                 :            : 
    1117                 :            :         // Dragging wird speziell behandelt
    1118         [ #  # ]:          0 :         if ( meScrollType == SCROLL_DRAG )
    1119         [ #  # ]:          0 :             ImplDragThumb( rMousePos );
    1120                 :            :         else
    1121         [ #  # ]:          0 :             ImplDoMouseAction( rMousePos, rTEvt.IsTrackingRepeat() );
    1122                 :            : 
    1123                 :            :         // Wenn ScrollBar-Werte so umgesetzt wurden, das es nichts
    1124                 :            :         // mehr zum Tracking gibt, dann berechen wir hier ab
    1125 [ #  # ][ #  # ]:          0 :         if ( !IsVisible() || (mnVisibleSize >= (mnMaxRange-mnMinRange)) )
         [ #  # ][ #  # ]
    1126         [ #  # ]:          0 :             EndTracking();
    1127                 :            :     }
    1128                 :          0 : }
    1129                 :            : 
    1130                 :            : // -----------------------------------------------------------------------
    1131                 :            : 
    1132                 :          0 : void ScrollBar::KeyInput( const KeyEvent& rKEvt )
    1133                 :            : {
    1134         [ #  # ]:          0 :     if ( !rKEvt.GetKeyCode().GetModifier() )
    1135                 :            :     {
    1136   [ #  #  #  #  :          0 :         switch ( rKEvt.GetKeyCode().GetCode() )
                #  #  # ]
    1137                 :            :         {
    1138                 :            :             case KEY_HOME:
    1139                 :          0 :                 DoScroll( 0 );
    1140                 :          0 :                 break;
    1141                 :            : 
    1142                 :            :             case KEY_END:
    1143                 :          0 :                 DoScroll( GetRangeMax() );
    1144                 :          0 :                 break;
    1145                 :            : 
    1146                 :            :             case KEY_LEFT:
    1147                 :            :             case KEY_UP:
    1148                 :          0 :                 DoScrollAction( SCROLL_LINEUP );
    1149                 :          0 :                 break;
    1150                 :            : 
    1151                 :            :             case KEY_RIGHT:
    1152                 :            :             case KEY_DOWN:
    1153                 :          0 :                 DoScrollAction( SCROLL_LINEDOWN );
    1154                 :          0 :                 break;
    1155                 :            : 
    1156                 :            :             case KEY_PAGEUP:
    1157                 :          0 :                 DoScrollAction( SCROLL_PAGEUP );
    1158                 :          0 :                 break;
    1159                 :            : 
    1160                 :            :             case KEY_PAGEDOWN:
    1161                 :          0 :                 DoScrollAction( SCROLL_PAGEDOWN );
    1162                 :          0 :                 break;
    1163                 :            : 
    1164                 :            :             default:
    1165                 :          0 :                 Control::KeyInput( rKEvt );
    1166                 :          0 :                 break;
    1167                 :            :         }
    1168                 :            :     }
    1169                 :            :     else
    1170                 :          0 :         Control::KeyInput( rKEvt );
    1171                 :          0 : }
    1172                 :            : 
    1173                 :            : // -----------------------------------------------------------------------
    1174                 :            : 
    1175                 :       4908 : void ScrollBar::Paint( const Rectangle& )
    1176                 :            : {
    1177                 :       4908 :     ImplDraw( SCRBAR_DRAW_ALL, this );
    1178                 :       4908 : }
    1179                 :            : 
    1180                 :            : // -----------------------------------------------------------------------
    1181                 :            : 
    1182                 :       8963 : void ScrollBar::Resize()
    1183                 :            : {
    1184                 :       8963 :     Control::Resize();
    1185                 :       8963 :     mbCalcSize = sal_True;
    1186         [ +  + ]:       8963 :     if ( IsReallyVisible() )
    1187                 :       1127 :         ImplCalc( sal_False );
    1188                 :       8963 :     Invalidate();
    1189                 :       8963 : }
    1190                 :            : 
    1191                 :            : // -----------------------------------------------------------------------
    1192                 :            : 
    1193                 :          0 : IMPL_LINK_NOARG(ScrollBar, ImplAutoTimerHdl)
    1194                 :            : {
    1195 [ #  # ][ #  # ]:          0 :     if( mpData && mpData->mbHide )
    1196                 :          0 :         return 0;
    1197                 :          0 :     ImplInvert();
    1198                 :          0 :     return 0;
    1199                 :            : }
    1200                 :            : 
    1201                 :          0 : void ScrollBar::ImplInvert()
    1202                 :            : {
    1203                 :          0 :     Rectangle aRect( maThumbRect );
    1204         [ #  # ]:          0 :     if( aRect.getWidth() > 4 )
    1205                 :            :     {
    1206                 :          0 :         aRect.Left() += 2;
    1207                 :          0 :         aRect.Right() -= 2;
    1208                 :            :     }
    1209         [ #  # ]:          0 :     if( aRect.getHeight() > 4 )
    1210                 :            :     {
    1211                 :          0 :         aRect.Top() += 2;
    1212                 :          0 :         aRect.Bottom() -= 2;
    1213                 :            :     }
    1214                 :            : 
    1215         [ #  # ]:          0 :     Invert( aRect, 0 );
    1216                 :          0 : }
    1217                 :            : 
    1218                 :            : // -----------------------------------------------------------------------
    1219                 :            : 
    1220                 :          0 : void ScrollBar::GetFocus()
    1221                 :            : {
    1222         [ #  # ]:          0 :     if( !mpData )
    1223                 :            :     {
    1224         [ #  # ]:          0 :         mpData = new ImplScrollBarData;
    1225                 :          0 :         mpData->maTimer.SetTimeoutHdl( LINK( this, ScrollBar, ImplAutoTimerHdl ) );
    1226                 :          0 :         mpData->mbHide = sal_False;
    1227                 :            :     }
    1228                 :          0 :     ImplInvert();   // react immediately
    1229                 :          0 :     mpData->maTimer.SetTimeout( GetSettings().GetStyleSettings().GetCursorBlinkTime() );
    1230                 :          0 :     mpData->maTimer.Start();
    1231                 :          0 :     Control::GetFocus();
    1232                 :          0 : }
    1233                 :            : 
    1234                 :            : // -----------------------------------------------------------------------
    1235                 :            : 
    1236                 :          0 : void ScrollBar::LoseFocus()
    1237                 :            : {
    1238         [ #  # ]:          0 :     if( mpData )
    1239                 :          0 :         mpData->maTimer.Stop();
    1240                 :          0 :     ImplDraw( SCRBAR_DRAW_THUMB, this );
    1241                 :            : 
    1242                 :          0 :     Control::LoseFocus();
    1243                 :          0 : }
    1244                 :            : 
    1245                 :            : // -----------------------------------------------------------------------
    1246                 :            : 
    1247                 :      30661 : void ScrollBar::StateChanged( StateChangedType nType )
    1248                 :            : {
    1249                 :      30661 :     Control::StateChanged( nType );
    1250                 :            : 
    1251         [ +  + ]:      30661 :     if ( nType == STATE_CHANGE_INITSHOW )
    1252                 :       3932 :         ImplCalc( sal_False );
    1253         [ +  + ]:      26729 :     else if ( nType == STATE_CHANGE_DATA )
    1254                 :            :     {
    1255 [ +  + ][ +  - ]:      17971 :         if ( IsReallyVisible() && IsUpdateMode() )
                 [ +  + ]
    1256                 :       3007 :             ImplCalc( sal_True );
    1257                 :            :     }
    1258         [ -  + ]:       8758 :     else if ( nType == STATE_CHANGE_UPDATEMODE )
    1259                 :            :     {
    1260 [ #  # ][ #  # ]:          0 :         if ( IsReallyVisible() && IsUpdateMode() )
                 [ #  # ]
    1261                 :            :         {
    1262                 :          0 :             ImplCalc( sal_False );
    1263                 :          0 :             Invalidate();
    1264                 :            :         }
    1265                 :            :     }
    1266         [ +  + ]:       8758 :     else if ( nType == STATE_CHANGE_ENABLE )
    1267                 :            :     {
    1268 [ +  + ][ +  - ]:       1242 :         if ( IsReallyVisible() && IsUpdateMode() )
                 [ +  + ]
    1269                 :        656 :             Invalidate();
    1270                 :            :     }
    1271         [ +  + ]:       7516 :     else if ( nType == STATE_CHANGE_STYLE )
    1272                 :            :     {
    1273                 :          2 :         ImplInitStyle( GetStyle() );
    1274 [ #  # ][ -  + ]:          2 :         if ( IsReallyVisible() && IsUpdateMode() )
                 [ -  + ]
    1275                 :            :         {
    1276         [ #  # ]:          0 :             if ( (GetPrevStyle() & SCRBAR_VIEW_STYLE) !=
    1277                 :          0 :                  (GetStyle() & SCRBAR_VIEW_STYLE) )
    1278                 :            :             {
    1279                 :          0 :                 mbCalcSize = sal_True;
    1280                 :          0 :                 ImplCalc( sal_False );
    1281                 :          0 :                 Invalidate();
    1282                 :            :             }
    1283                 :            :         }
    1284                 :            :     }
    1285                 :      30661 : }
    1286                 :            : 
    1287                 :            : // -----------------------------------------------------------------------
    1288                 :            : 
    1289                 :        850 : void ScrollBar::DataChanged( const DataChangedEvent& rDCEvt )
    1290                 :            : {
    1291                 :        850 :     Control::DataChanged( rDCEvt );
    1292                 :            : 
    1293         [ +  + ]:       1700 :     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
           [ +  -  +  + ]
    1294                 :        850 :          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
    1295                 :            :     {
    1296                 :        736 :         mbCalcSize = sal_True;
    1297                 :        736 :         ImplCalc( sal_False );
    1298                 :        736 :         Invalidate();
    1299                 :            :     }
    1300                 :        850 : }
    1301                 :            : 
    1302                 :            : // -----------------------------------------------------------------------
    1303                 :            : 
    1304                 :          0 : Rectangle* ScrollBar::ImplFindPartRect( const Point& rPt )
    1305                 :            : {
    1306 [ #  # ][ #  # ]:          0 :     sal_Bool    bHorizontal = ( GetStyle() & WB_HORZ )? sal_True: sal_False;
    1307                 :          0 :     sal_Bool    bIsInside = sal_False;
    1308                 :            : 
    1309                 :          0 :     Point aPoint( 0, 0 );
    1310         [ #  # ]:          0 :     Rectangle aControlRegion( aPoint, GetOutputSizePixel() );
    1311                 :            : 
    1312         [ #  # ]:          0 :     if( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_BUTTON_LEFT: PART_BUTTON_UP,
    1313 [ #  # ][ #  # ]:          0 :                 aControlRegion, rPt, bIsInside )?
    1314                 :            :             bIsInside:
    1315 [ #  # ][ #  # ]:          0 :             maBtn1Rect.IsInside( rPt ) )
    1316                 :          0 :         return &maBtn1Rect;
    1317         [ #  # ]:          0 :     else if( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_BUTTON_RIGHT: PART_BUTTON_DOWN,
    1318 [ #  # ][ #  # ]:          0 :                 aControlRegion, rPt, bIsInside )?
    1319                 :            :             bIsInside:
    1320 [ #  # ][ #  # ]:          0 :             maBtn2Rect.IsInside( rPt ) )
    1321                 :          0 :         return &maBtn2Rect;
    1322                 :            :     // HitTestNativeControl, see remark at top of file
    1323         [ #  # ]:          0 :     else if( HitTestNativeControl( CTRL_SCROLLBAR,  bHorizontal ? PART_TRACK_HORZ_LEFT : PART_TRACK_VERT_UPPER,
    1324 [ #  # ][ #  # ]:          0 :                 maPage1Rect, rPt, bIsInside)?
    1325                 :            :             bIsInside:
    1326 [ #  # ][ #  # ]:          0 :             maPage1Rect.IsInside( rPt ) )
    1327                 :          0 :         return &maPage1Rect;
    1328                 :            :     // HitTestNativeControl, see remark at top of file
    1329         [ #  # ]:          0 :     else if( HitTestNativeControl( CTRL_SCROLLBAR,  bHorizontal ? PART_TRACK_HORZ_RIGHT : PART_TRACK_VERT_LOWER,
    1330 [ #  # ][ #  # ]:          0 :                 maPage2Rect, rPt, bIsInside)?
    1331                 :            :             bIsInside:
    1332 [ #  # ][ #  # ]:          0 :             maPage2Rect.IsInside( rPt ) )
    1333                 :          0 :         return &maPage2Rect;
    1334                 :            :     // HitTestNativeControl, see remark at top of file
    1335         [ #  # ]:          0 :     else if( HitTestNativeControl( CTRL_SCROLLBAR,  bHorizontal ? PART_THUMB_HORZ : PART_THUMB_VERT,
    1336 [ #  # ][ #  # ]:          0 :                 maThumbRect, rPt, bIsInside)?
    1337                 :            :              bIsInside:
    1338 [ #  # ][ #  # ]:          0 :              maThumbRect.IsInside( rPt ) )
    1339                 :          0 :         return &maThumbRect;
    1340                 :            :     else
    1341                 :          0 :         return NULL;
    1342                 :            : }
    1343                 :            : 
    1344                 :          0 : long ScrollBar::PreNotify( NotifyEvent& rNEvt )
    1345                 :            : {
    1346                 :          0 :     long nDone = 0;
    1347                 :          0 :     const MouseEvent* pMouseEvt = NULL;
    1348                 :            : 
    1349 [ #  # ][ #  # ]:          0 :     if( (rNEvt.GetType() == EVENT_MOUSEMOVE) && (pMouseEvt = rNEvt.GetMouseEvent()) != NULL )
                 [ #  # ]
    1350                 :            :     {
    1351 [ #  # ][ #  # ]:          0 :         if( !pMouseEvt->GetButtons() && !pMouseEvt->IsSynthetic() && !pMouseEvt->IsModifierChanged() )
         [ #  # ][ #  # ]
    1352                 :            :         {
    1353                 :            :             // trigger redraw if mouse over state has changed
    1354         [ #  # ]:          0 :             if( IsNativeControlSupported(CTRL_SCROLLBAR, PART_ENTIRE_CONTROL) )
    1355                 :            :             {
    1356         [ #  # ]:          0 :                 Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
    1357         [ #  # ]:          0 :                 Rectangle* pLastRect = ImplFindPartRect( GetLastPointerPosPixel() );
    1358 [ #  # ][ #  # ]:          0 :                 if( pRect != pLastRect || pMouseEvt->IsLeaveWindow() || pMouseEvt->IsEnterWindow() )
         [ #  # ][ #  # ]
    1359                 :            :                 {
    1360         [ #  # ]:          0 :                     Region aRgn( GetActiveClipRegion() );
    1361         [ #  # ]:          0 :                     Region aClipRegion;
    1362                 :            : 
    1363         [ #  # ]:          0 :                     if ( pRect )
    1364         [ #  # ]:          0 :                         aClipRegion.Union( *pRect );
    1365         [ #  # ]:          0 :                     if ( pLastRect )
    1366         [ #  # ]:          0 :                         aClipRegion.Union( *pLastRect );
    1367                 :            : 
    1368                 :            :                     // Support for 3-button scroll bars
    1369         [ #  # ]:          0 :                     sal_Bool bHas3Buttons = IsNativeControlSupported( CTRL_SCROLLBAR, HAS_THREE_BUTTONS );
    1370 [ #  # ][ #  # ]:          0 :                     if ( bHas3Buttons && ( pRect == &maBtn1Rect || pLastRect == &maBtn1Rect ) )
                 [ #  # ]
    1371                 :            :                     {
    1372         [ #  # ]:          0 :                         aClipRegion.Union( maBtn2Rect );
    1373                 :            :                     }
    1374                 :            : 
    1375         [ #  # ]:          0 :                     SetClipRegion( aClipRegion );
    1376 [ #  # ][ #  # ]:          0 :                     Paint( aClipRegion.GetBoundRect() );
    1377                 :            : 
    1378 [ #  # ][ #  # ]:          0 :                     SetClipRegion( aRgn );
                 [ #  # ]
    1379                 :            :                 }
    1380                 :            :             }
    1381                 :            :         }
    1382                 :            :     }
    1383                 :            : 
    1384         [ #  # ]:          0 :     return nDone ? nDone : Control::PreNotify(rNEvt);
    1385                 :            : }
    1386                 :            : 
    1387                 :            : // -----------------------------------------------------------------------
    1388                 :            : 
    1389                 :          4 : void ScrollBar::Scroll()
    1390                 :            : {
    1391                 :          4 :     ImplCallEventListenersAndHandler( VCLEVENT_SCROLLBAR_SCROLL, maScrollHdl, this );
    1392                 :          4 : }
    1393                 :            : 
    1394                 :            : // -----------------------------------------------------------------------
    1395                 :            : 
    1396                 :          4 : void ScrollBar::EndScroll()
    1397                 :            : {
    1398                 :          4 :     ImplCallEventListenersAndHandler( VCLEVENT_SCROLLBAR_ENDSCROLL, maEndScrollHdl, this );
    1399                 :          4 : }
    1400                 :            : 
    1401                 :            : // -----------------------------------------------------------------------
    1402                 :            : 
    1403                 :          0 : long ScrollBar::DoScroll( long nNewPos )
    1404                 :            : {
    1405         [ #  # ]:          0 :     if ( meScrollType != SCROLL_DONTKNOW )
    1406                 :          0 :         return 0;
    1407                 :            : 
    1408                 :          0 :     meScrollType = SCROLL_DRAG;
    1409                 :          0 :     long nDelta = ImplScroll( nNewPos, sal_True );
    1410                 :          0 :     meScrollType = SCROLL_DONTKNOW;
    1411                 :          0 :     return nDelta;
    1412                 :            : }
    1413                 :            : 
    1414                 :            : // -----------------------------------------------------------------------
    1415                 :            : 
    1416                 :          4 : long ScrollBar::DoScrollAction( ScrollType eScrollType )
    1417                 :            : {
    1418 [ +  - ][ +  - ]:          4 :     if ( (meScrollType != SCROLL_DONTKNOW) ||
                 [ -  + ]
    1419                 :            :          (eScrollType == SCROLL_DONTKNOW) ||
    1420                 :            :          (eScrollType == SCROLL_DRAG) )
    1421                 :          0 :         return 0;
    1422                 :            : 
    1423                 :          4 :     meScrollType = eScrollType;
    1424                 :          4 :     long nDelta = ImplDoAction( sal_True );
    1425                 :          4 :     meScrollType = SCROLL_DONTKNOW;
    1426                 :          4 :     return nDelta;
    1427                 :            : }
    1428                 :            : 
    1429                 :            : // -----------------------------------------------------------------------
    1430                 :            : 
    1431                 :         23 : void ScrollBar::SetRangeMin( long nNewRange )
    1432                 :            : {
    1433         [ +  - ]:         23 :     SetRange( Range( nNewRange, GetRangeMax() ) );
    1434                 :         23 : }
    1435                 :            : 
    1436                 :            : // -----------------------------------------------------------------------
    1437                 :            : 
    1438                 :        486 : void ScrollBar::SetRangeMax( long nNewRange )
    1439                 :            : {
    1440         [ +  - ]:        486 :     SetRange( Range( GetRangeMin(), nNewRange ) );
    1441                 :        486 : }
    1442                 :            : 
    1443                 :            : // -----------------------------------------------------------------------
    1444                 :            : 
    1445                 :      21095 : void ScrollBar::SetRange( const Range& rRange )
    1446                 :            : {
    1447                 :            :     // Range einpassen
    1448                 :      21095 :     Range aRange = rRange;
    1449                 :      21095 :     aRange.Justify();
    1450                 :      21095 :     long nNewMinRange = aRange.Min();
    1451                 :      21095 :     long nNewMaxRange = aRange.Max();
    1452                 :            : 
    1453                 :            :     // Wenn Range sich unterscheidet, dann neuen setzen
    1454 [ +  + ][ +  + ]:      21095 :     if ( (mnMinRange != nNewMinRange) ||
    1455                 :            :          (mnMaxRange != nNewMaxRange) )
    1456                 :            :     {
    1457                 :       7091 :         mnMinRange = nNewMinRange;
    1458                 :       7091 :         mnMaxRange = nNewMaxRange;
    1459                 :            : 
    1460                 :            :         // Thumb einpassen
    1461         [ +  + ]:       7091 :         if ( mnThumbPos > mnMaxRange-mnVisibleSize )
    1462                 :       1018 :             mnThumbPos = mnMaxRange-mnVisibleSize;
    1463         [ +  + ]:       7091 :         if ( mnThumbPos < mnMinRange )
    1464                 :       1012 :             mnThumbPos = mnMinRange;
    1465                 :            : 
    1466         [ +  - ]:       7091 :         StateChanged( STATE_CHANGE_DATA );
    1467                 :            :     }
    1468                 :      21095 : }
    1469                 :            : 
    1470                 :            : // -----------------------------------------------------------------------
    1471                 :            : 
    1472                 :      46031 : void ScrollBar::SetThumbPos( long nNewThumbPos )
    1473                 :            : {
    1474         [ +  + ]:      46031 :     if ( nNewThumbPos > mnMaxRange-mnVisibleSize )
    1475                 :        735 :         nNewThumbPos = mnMaxRange-mnVisibleSize;
    1476         [ +  + ]:      46031 :     if ( nNewThumbPos < mnMinRange )
    1477                 :        737 :         nNewThumbPos = mnMinRange;
    1478                 :            : 
    1479         [ +  + ]:      46031 :     if ( mnThumbPos != nNewThumbPos )
    1480                 :            :     {
    1481                 :       2962 :         mnThumbPos = nNewThumbPos;
    1482                 :       2962 :         StateChanged( STATE_CHANGE_DATA );
    1483                 :            :     }
    1484                 :      46031 : }
    1485                 :            : 
    1486                 :            : // -----------------------------------------------------------------------
    1487                 :            : 
    1488                 :      14679 : void ScrollBar::SetVisibleSize( long nNewSize )
    1489                 :            : {
    1490         [ +  + ]:      14679 :     if ( mnVisibleSize != nNewSize )
    1491                 :            :     {
    1492                 :       7918 :         mnVisibleSize = nNewSize;
    1493                 :            : 
    1494                 :            :         // Thumb einpassen
    1495         [ +  + ]:       7918 :         if ( mnThumbPos > mnMaxRange-mnVisibleSize )
    1496                 :        895 :             mnThumbPos = mnMaxRange-mnVisibleSize;
    1497         [ +  + ]:       7918 :         if ( mnThumbPos < mnMinRange )
    1498                 :        835 :             mnThumbPos = mnMinRange;
    1499                 :       7918 :         StateChanged( STATE_CHANGE_DATA );
    1500                 :            :     }
    1501                 :      14679 : }
    1502                 :            : 
    1503                 :            : // =======================================================================
    1504                 :            : 
    1505                 :       5959 : void ScrollBarBox::ImplInit( Window* pParent, WinBits nStyle )
    1506                 :            : {
    1507                 :       5959 :     Window::ImplInit( pParent, nStyle, NULL );
    1508                 :            : 
    1509                 :       5959 :     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
    1510                 :       5959 :     long nScrollSize = rStyleSettings.GetScrollBarSize();
    1511         [ +  - ]:       5959 :     SetSizePixel( Size( nScrollSize, nScrollSize ) );
    1512                 :       5959 :     ImplInitSettings();
    1513                 :       5959 : }
    1514                 :            : 
    1515                 :            : // -----------------------------------------------------------------------
    1516                 :            : 
    1517                 :       5959 : ScrollBarBox::ScrollBarBox( Window* pParent, WinBits nStyle ) :
    1518                 :       5959 :     Window( WINDOW_SCROLLBARBOX )
    1519                 :            : {
    1520         [ +  - ]:       5959 :     ImplInit( pParent, nStyle );
    1521                 :       5959 : }
    1522                 :            : 
    1523                 :            : // -----------------------------------------------------------------------
    1524                 :            : 
    1525                 :       6244 : void ScrollBarBox::ImplInitSettings()
    1526                 :            : {
    1527                 :            :     // Hack, damit man auch DockingWindows ohne Hintergrund bauen kann
    1528                 :            :     // und noch nicht alles umgestellt ist
    1529         [ +  - ]:       6244 :     if ( IsBackground() )
    1530                 :            :     {
    1531                 :       6244 :         Color aColor;
    1532 [ -  + ][ +  - ]:       6244 :         if ( IsControlBackground() )
    1533         [ #  # ]:          0 :             aColor = GetControlBackground();
    1534                 :            :         else
    1535                 :       6244 :             aColor = GetSettings().GetStyleSettings().GetFaceColor();
    1536 [ +  - ][ +  - ]:       6244 :         SetBackground( aColor );
                 [ +  - ]
    1537                 :            :     }
    1538                 :       6244 : }
    1539                 :            : 
    1540                 :            : // -----------------------------------------------------------------------
    1541                 :            : 
    1542                 :       4655 : void ScrollBarBox::StateChanged( StateChangedType nType )
    1543                 :            : {
    1544                 :       4655 :     Window::StateChanged( nType );
    1545                 :            : 
    1546         [ -  + ]:       4655 :     if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
    1547                 :            :     {
    1548                 :          0 :         ImplInitSettings();
    1549                 :          0 :         Invalidate();
    1550                 :            :     }
    1551                 :       4655 : }
    1552                 :            : 
    1553                 :            : // -----------------------------------------------------------------------
    1554                 :            : 
    1555                 :        341 : void ScrollBarBox::DataChanged( const DataChangedEvent& rDCEvt )
    1556                 :            : {
    1557                 :        341 :     Window::DataChanged( rDCEvt );
    1558                 :            : 
    1559         [ +  + ]:        682 :     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
           [ +  -  +  + ]
    1560                 :        341 :          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
    1561                 :            :     {
    1562                 :        285 :         ImplInitSettings();
    1563                 :        285 :         Invalidate();
    1564                 :            :     }
    1565                 :        341 : }
    1566                 :            : 
    1567                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10