LCOV - code coverage report
Current view: top level - vcl/source/control - scrbar.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 374 817 45.8 %
Date: 2014-11-03 Functions: 34 50 68.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "vcl/event.hxx"
      21             : #include "vcl/decoview.hxx"
      22             : #include "vcl/scrbar.hxx"
      23             : #include "vcl/timer.hxx"
      24             : #include "vcl/settings.hxx"
      25             : 
      26             : #include "svdata.hxx"
      27             : 
      28             : #include "rtl/string.hxx"
      29             : #include "tools/rc.h"
      30             : 
      31             : /*  #i77549#
      32             :     HACK: for scrollbars in case of thumb rect, page up and page down rect we
      33             :     abuse the HitTestNativeControl interface. All theming engines but OS X
      34             :     are actually able to draw the thumb according to our internal representation.
      35             :     However OS X draws a little outside. The canonical way would be to enhance the
      36             :     HitTestNativeControl passing a ScrollbarValue additionally so all necessary
      37             :     information is available in the call.
      38             :     .
      39             :     However since there is only this one small exception we will deviate a little and
      40             :     instead pass the respective rect as control region to allow for a small correction.
      41             : 
      42             :     So all places using HitTestNativeControl on PART_THUMB_HORZ, PART_THUMB_VERT,
      43             :     PART_TRACK_HORZ_LEFT, PART_TRACK_HORZ_RIGHT, PART_TRACK_VERT_UPPER, PART_TRACK_VERT_LOWER
      44             :     do not use the control rectangle as region but the actuall part rectangle, making
      45             :     only small deviations feasible.
      46             : */
      47             : 
      48             : #include "thumbpos.hxx"
      49             : 
      50             : #define SCRBAR_DRAW_BTN1            ((sal_uInt16)0x0001)
      51             : #define SCRBAR_DRAW_BTN2            ((sal_uInt16)0x0002)
      52             : #define SCRBAR_DRAW_PAGE1           ((sal_uInt16)0x0004)
      53             : #define SCRBAR_DRAW_PAGE2           ((sal_uInt16)0x0008)
      54             : #define SCRBAR_DRAW_THUMB           ((sal_uInt16)0x0010)
      55             : #define SCRBAR_DRAW_BACKGROUND      ((sal_uInt16)0x0020)
      56             : #define SCRBAR_DRAW_ALL             (SCRBAR_DRAW_BTN1 | SCRBAR_DRAW_BTN2 |  \
      57             :                                      SCRBAR_DRAW_PAGE1 | SCRBAR_DRAW_PAGE2 |\
      58             :                                      SCRBAR_DRAW_THUMB | SCRBAR_DRAW_BACKGROUND )
      59             : 
      60             : #define SCRBAR_STATE_BTN1_DOWN      ((sal_uInt16)0x0001)
      61             : #define SCRBAR_STATE_BTN1_DISABLE   ((sal_uInt16)0x0002)
      62             : #define SCRBAR_STATE_BTN2_DOWN      ((sal_uInt16)0x0004)
      63             : #define SCRBAR_STATE_BTN2_DISABLE   ((sal_uInt16)0x0008)
      64             : #define SCRBAR_STATE_PAGE1_DOWN     ((sal_uInt16)0x0010)
      65             : #define SCRBAR_STATE_PAGE2_DOWN     ((sal_uInt16)0x0020)
      66             : #define SCRBAR_STATE_THUMB_DOWN     ((sal_uInt16)0x0040)
      67             : 
      68             : #define SCRBAR_VIEW_STYLE           (WB_3DLOOK | WB_HORZ | WB_VERT)
      69             : 
      70       62730 : struct ImplScrollBarData
      71             : {
      72             :     AutoTimer       maTimer; // Timer
      73             :     bool            mbHide;
      74             :     Rectangle       maTrackRect; // TODO: move to ScrollBar class when binary incompatibility of ScrollBar class is no longer problematic
      75             : };
      76             : 
      77       31377 : void ScrollBar::ImplInit( vcl::Window* pParent, WinBits nStyle )
      78             : {
      79       31377 :     mpData              = NULL;
      80       31377 :     mnThumbPixRange     = 0;
      81       31377 :     mnThumbPixPos       = 0;
      82       31377 :     mnThumbPixSize      = 0;
      83       31377 :     mnMinRange          = 0;
      84       31377 :     mnMaxRange          = 100;
      85       31377 :     mnThumbPos          = 0;
      86       31377 :     mnVisibleSize       = 0;
      87       31377 :     mnLineSize          = 1;
      88       31377 :     mnPageSize          = 1;
      89       31377 :     mnDelta             = 0;
      90       31377 :     mnDragDraw          = 0;
      91       31377 :     mnStateFlags        = 0;
      92       31377 :     meScrollType        = SCROLL_DONTKNOW;
      93       31377 :     meDDScrollType      = SCROLL_DONTKNOW;
      94       31377 :     mbCalcSize          = true;
      95       31377 :     mbFullDrag          = false;
      96             : 
      97       31377 :     if( !mpData )  // TODO: remove when maTrackRect is no longer in mpData
      98             :     {
      99       31377 :         mpData = new ImplScrollBarData;
     100       31377 :         mpData->maTimer.SetTimeoutHdl( LINK( this, ScrollBar, ImplAutoTimerHdl ) );
     101       31377 :         mpData->mbHide = false;
     102             :     }
     103             : 
     104       31377 :     ImplInitStyle( nStyle );
     105       31377 :     Control::ImplInit( pParent, nStyle, NULL );
     106             : 
     107       31377 :     long nScrollSize = GetSettings().GetStyleSettings().GetScrollBarSize();
     108       31377 :     SetSizePixel( Size( nScrollSize, nScrollSize ) );
     109       31377 :     SetBackground();
     110       31377 : }
     111             : 
     112       31379 : void ScrollBar::ImplInitStyle( WinBits nStyle )
     113             : {
     114       31379 :     if ( nStyle & WB_DRAG )
     115       16926 :         mbFullDrag = true;
     116             :     else
     117       14453 :         mbFullDrag = (GetSettings().GetStyleSettings().GetDragFullOptions() & DRAGFULL_OPTION_SCROLL) != 0;
     118       31379 : }
     119             : 
     120       31377 : ScrollBar::ScrollBar( vcl::Window* pParent, WinBits nStyle ) :
     121       31377 :     Control( WINDOW_SCROLLBAR )
     122             : {
     123       31377 :     ImplInit( pParent, nStyle );
     124       31377 : }
     125             : 
     126       81096 : ScrollBar::~ScrollBar()
     127             : {
     128       31353 :     delete mpData;
     129       49743 : }
     130             : 
     131       51217 : void ScrollBar::ImplUpdateRects( bool bUpdate )
     132             : {
     133       51217 :     sal_uInt16      nOldStateFlags  = mnStateFlags;
     134       51217 :     Rectangle   aOldPage1Rect = maPage1Rect;
     135       51217 :     Rectangle   aOldPage2Rect = maPage2Rect;
     136       51217 :     Rectangle   aOldThumbRect = maThumbRect;
     137             : 
     138       51217 :     mnStateFlags  &= ~SCRBAR_STATE_BTN1_DISABLE;
     139       51217 :     mnStateFlags  &= ~SCRBAR_STATE_BTN2_DISABLE;
     140             : 
     141       51217 :     Rectangle& maTrackRect = mpData->maTrackRect; // TODO: remove when maTrackRect is no longer in mpData
     142       51217 :     if ( mnThumbPixRange )
     143             :     {
     144       48676 :         if ( GetStyle() & WB_HORZ )
     145             :         {
     146       24026 :             maThumbRect.Left()      = maTrackRect.Left()+mnThumbPixPos;
     147       24026 :             maThumbRect.Right()     = maThumbRect.Left()+mnThumbPixSize-1;
     148       24026 :             if ( !mnThumbPixPos )
     149       21633 :                 maPage1Rect.Right()     = RECT_EMPTY;
     150             :             else
     151        2393 :                 maPage1Rect.Right()     = maThumbRect.Left()-1;
     152       24026 :             if ( mnThumbPixPos >= (mnThumbPixRange-mnThumbPixSize) )
     153         318 :                 maPage2Rect.Right()     = RECT_EMPTY;
     154             :             else
     155             :             {
     156       23708 :                 maPage2Rect.Left()      = maThumbRect.Right()+1;
     157       23708 :                 maPage2Rect.Right()     = maTrackRect.Right();
     158             :             }
     159             :         }
     160             :         else
     161             :         {
     162       24650 :             maThumbRect.Top()       = maTrackRect.Top()+mnThumbPixPos;
     163       24650 :             maThumbRect.Bottom()    = maThumbRect.Top()+mnThumbPixSize-1;
     164       24650 :             if ( !mnThumbPixPos )
     165       22958 :                 maPage1Rect.Bottom()    = RECT_EMPTY;
     166             :             else
     167        1692 :                 maPage1Rect.Bottom()    = maThumbRect.Top()-1;
     168       24650 :             if ( mnThumbPixPos >= (mnThumbPixRange-mnThumbPixSize) )
     169         264 :                 maPage2Rect.Bottom()    = RECT_EMPTY;
     170             :             else
     171             :             {
     172       24386 :                 maPage2Rect.Top()       = maThumbRect.Bottom()+1;
     173       24386 :                 maPage2Rect.Bottom()    = maTrackRect.Bottom();
     174             :             }
     175             :         }
     176             :     }
     177             :     else
     178             :     {
     179        2541 :         if ( GetStyle() & WB_HORZ )
     180             :         {
     181        1227 :             const long nSpace = maTrackRect.Right() - maTrackRect.Left();
     182        1227 :             if ( nSpace > 0 )
     183             :             {
     184           0 :                 maPage1Rect.Left()   = maTrackRect.Left();
     185           0 :                 maPage1Rect.Right()  = maTrackRect.Left() + (nSpace/2);
     186           0 :                 maPage2Rect.Left()   = maPage1Rect.Right() + 1;
     187           0 :                 maPage2Rect.Right()  = maTrackRect.Right();
     188             :             }
     189             :         }
     190             :         else
     191             :         {
     192        1314 :             const long nSpace = maTrackRect.Bottom() - maTrackRect.Top();
     193        1314 :             if ( nSpace > 0 )
     194             :             {
     195           0 :                 maPage1Rect.Top()    = maTrackRect.Top();
     196           0 :                 maPage1Rect.Bottom() = maTrackRect.Top() + (nSpace/2);
     197           0 :                 maPage2Rect.Top()    = maPage1Rect.Bottom() + 1;
     198           0 :                 maPage2Rect.Bottom() = maTrackRect.Bottom();
     199             :             }
     200             :         }
     201             :     }
     202             : 
     203       51217 :     if( !IsNativeControlSupported(CTRL_SCROLLBAR, PART_ENTIRE_CONTROL) )
     204             :     {
     205             :         // disable scrollbar buttons only in VCL's own 'theme'
     206             :         // as it is uncommon on other platforms
     207       51217 :         if ( mnThumbPos == mnMinRange )
     208       47108 :             mnStateFlags |= SCRBAR_STATE_BTN1_DISABLE;
     209       51217 :         if ( mnThumbPos >= (mnMaxRange-mnVisibleSize) )
     210         688 :             mnStateFlags |= SCRBAR_STATE_BTN2_DISABLE;
     211             :     }
     212             : 
     213       51217 :     if ( bUpdate )
     214             :     {
     215         570 :         sal_uInt16 nDraw = 0;
     216         570 :         if ( (nOldStateFlags & SCRBAR_STATE_BTN1_DISABLE) !=
     217             :              (mnStateFlags & SCRBAR_STATE_BTN1_DISABLE) )
     218          37 :             nDraw |= SCRBAR_DRAW_BTN1;
     219         570 :         if ( (nOldStateFlags & SCRBAR_STATE_BTN2_DISABLE) !=
     220             :              (mnStateFlags & SCRBAR_STATE_BTN2_DISABLE) )
     221           2 :             nDraw |= SCRBAR_DRAW_BTN2;
     222         570 :         if ( aOldPage1Rect != maPage1Rect )
     223         560 :             nDraw |= SCRBAR_DRAW_PAGE1;
     224         570 :         if ( aOldPage2Rect != maPage2Rect )
     225         568 :             nDraw |= SCRBAR_DRAW_PAGE2;
     226         570 :         if ( aOldThumbRect != maThumbRect )
     227         568 :             nDraw |= SCRBAR_DRAW_THUMB;
     228         570 :         ImplDraw( nDraw, this );
     229             :     }
     230       51217 : }
     231             : 
     232           0 : long ScrollBar::ImplCalcThumbPos( long nPixPos )
     233             : {
     234             :     // Calculate position
     235             :     long nCalcThumbPos;
     236           0 :     nCalcThumbPos = ImplMulDiv( nPixPos, mnMaxRange-mnVisibleSize-mnMinRange,
     237           0 :                                 mnThumbPixRange-mnThumbPixSize );
     238           0 :     nCalcThumbPos += mnMinRange;
     239           0 :     return nCalcThumbPos;
     240             : }
     241             : 
     242       48188 : long ScrollBar::ImplCalcThumbPosPix( long nPos )
     243             : {
     244             :     long nCalcThumbPos;
     245             : 
     246             :     // Calculate position
     247             :     nCalcThumbPos = ImplMulDiv( nPos-mnMinRange, mnThumbPixRange-mnThumbPixSize,
     248       48188 :                                 mnMaxRange-mnVisibleSize-mnMinRange );
     249             : 
     250             :     // At the start and end of the ScrollBar, we try to show the display correctly
     251       48188 :     if ( !nCalcThumbPos && (mnThumbPos > mnMinRange) )
     252           0 :         nCalcThumbPos = 1;
     253       52273 :     if ( nCalcThumbPos &&
     254        4123 :          ((nCalcThumbPos+mnThumbPixSize) >= mnThumbPixRange) &&
     255          38 :          (mnThumbPos < (mnMaxRange-mnVisibleSize)) )
     256           0 :         nCalcThumbPos--;
     257             : 
     258       48188 :     return nCalcThumbPos;
     259             : }
     260             : 
     261       51217 : void ScrollBar::ImplCalc( bool bUpdate )
     262             : {
     263       51217 :     const Size aSize = GetOutputSizePixel();
     264       51217 :     const long nMinThumbSize = GetSettings().GetStyleSettings().GetMinThumbSize();
     265             : 
     266       51217 :     Rectangle& maTrackRect = mpData->maTrackRect;  // TODO: remove when maTrackRect is no longer in mpData
     267       51217 :     if ( mbCalcSize )
     268             :     {
     269       28335 :         Size aOldSize = getCurrentCalcSize();
     270             : 
     271       28335 :         const Rectangle aControlRegion( Point(0,0), aSize );
     272       28335 :         Rectangle aBtn1Region, aBtn2Region, aTrackRegion, aBoundingRegion;
     273             : 
     274       28335 :         if ( GetStyle() & WB_HORZ )
     275             :         {
     276       41574 :             if ( GetNativeControlRegion( CTRL_SCROLLBAR, IsRTLEnabled()? PART_BUTTON_RIGHT: PART_BUTTON_LEFT,
     277       55432 :                         aControlRegion, 0, ImplControlValue(), OUString(), aBoundingRegion, aBtn1Region ) &&
     278           0 :                  GetNativeControlRegion( CTRL_SCROLLBAR, IsRTLEnabled()? PART_BUTTON_LEFT: PART_BUTTON_RIGHT,
     279       13858 :                         aControlRegion, 0, ImplControlValue(), OUString(), aBoundingRegion, aBtn2Region ) )
     280             :             {
     281           0 :                 maBtn1Rect = aBtn1Region;
     282           0 :                 maBtn2Rect = aBtn2Region;
     283             :             }
     284             :             else
     285             :             {
     286       13858 :                 Size aBtnSize( aSize.Height(), aSize.Height() );
     287       13858 :                 maBtn2Rect.Top()    = maBtn1Rect.Top();
     288       13858 :                 maBtn2Rect.Left()   = aSize.Width()-aSize.Height();
     289       13858 :                 maBtn1Rect.SetSize( aBtnSize );
     290       13858 :                 maBtn2Rect.SetSize( aBtnSize );
     291             :             }
     292             : 
     293       27716 :             if ( GetNativeControlRegion( CTRL_SCROLLBAR, PART_TRACK_HORZ_AREA,
     294       27716 :                      aControlRegion, 0, ImplControlValue(), OUString(), aBoundingRegion, aTrackRegion ) )
     295           0 :                 maTrackRect = aTrackRegion;
     296             :             else
     297       13858 :                 maTrackRect = Rectangle( maBtn1Rect.TopRight(), maBtn2Rect.BottomLeft() );
     298             : 
     299             :             // Check if available space is big enough for thumb ( min thumb size = ScrBar width/height )
     300       13858 :             mnThumbPixRange = maTrackRect.Right() - maTrackRect.Left();
     301       13858 :             if( mnThumbPixRange > 0 )
     302             :             {
     303       12777 :                 maPage1Rect.Left()      = maTrackRect.Left();
     304       12777 :                 maPage1Rect.Bottom()    =
     305       12777 :                 maPage2Rect.Bottom()    =
     306       12777 :                 maThumbRect.Bottom()    = maTrackRect.Bottom();
     307             :             }
     308             :             else
     309             :             {
     310        1081 :                 mnThumbPixRange = 0;
     311        1081 :                 maPage1Rect.SetEmpty();
     312        1081 :                 maPage2Rect.SetEmpty();
     313             :             }
     314             :         }
     315             :         else
     316             :         {
     317       28954 :             if ( GetNativeControlRegion( CTRL_SCROLLBAR, PART_BUTTON_UP,
     318       43431 :                         aControlRegion, 0, ImplControlValue(), OUString(), aBoundingRegion, aBtn1Region ) &&
     319             :                  GetNativeControlRegion( CTRL_SCROLLBAR, PART_BUTTON_DOWN,
     320       14477 :                         aControlRegion, 0, ImplControlValue(), OUString(), aBoundingRegion, aBtn2Region ) )
     321             :             {
     322           0 :                 maBtn1Rect = aBtn1Region;
     323           0 :                 maBtn2Rect = aBtn2Region;
     324             :             }
     325             :             else
     326             :             {
     327       14477 :                 const Size aBtnSize( aSize.Width(), aSize.Width() );
     328       14477 :                 maBtn2Rect.Left()   = maBtn1Rect.Left();
     329       14477 :                 maBtn2Rect.Top()    = aSize.Height()-aSize.Width();
     330       14477 :                 maBtn1Rect.SetSize( aBtnSize );
     331       14477 :                 maBtn2Rect.SetSize( aBtnSize );
     332             :             }
     333             : 
     334       28954 :             if ( GetNativeControlRegion( CTRL_SCROLLBAR, PART_TRACK_VERT_AREA,
     335       28954 :                      aControlRegion, 0, ImplControlValue(), OUString(), aBoundingRegion, aTrackRegion ) )
     336           0 :                 maTrackRect = aTrackRegion;
     337             :             else
     338       14477 :                 maTrackRect = Rectangle( maBtn1Rect.BottomLeft()+Point(0,1), maBtn2Rect.TopRight() );
     339             : 
     340             :             // Check if available space is big enough for thumb
     341       14477 :             mnThumbPixRange = maTrackRect.Bottom() - maTrackRect.Top();
     342       14477 :             if( mnThumbPixRange > 0 )
     343             :             {
     344       13176 :                 maPage1Rect.Top()       = maTrackRect.Top();
     345       13176 :                 maPage1Rect.Right()     =
     346       13176 :                 maPage2Rect.Right()     =
     347       13176 :                 maThumbRect.Right()     = maTrackRect.Right();
     348             :             }
     349             :             else
     350             :             {
     351        1301 :                 mnThumbPixRange = 0;
     352        1301 :                 maPage1Rect.SetEmpty();
     353        1301 :                 maPage2Rect.SetEmpty();
     354             :             }
     355             :         }
     356             : 
     357       28335 :         if ( !mnThumbPixRange )
     358        2382 :             maThumbRect.SetEmpty();
     359             : 
     360       28335 :         mbCalcSize = false;
     361             : 
     362       28335 :         Size aNewSize = getCurrentCalcSize();
     363       28335 :         if (aOldSize != aNewSize)
     364             :         {
     365       27842 :             queue_resize();
     366             :         }
     367             :     }
     368             : 
     369       51217 :     if ( mnThumbPixRange )
     370             :     {
     371             :         // Calculate values
     372       96866 :         if ( (mnVisibleSize >= (mnMaxRange-mnMinRange)) ||
     373       48190 :              ((mnMaxRange-mnMinRange) <= 0) )
     374             :         {
     375         488 :             mnThumbPos      = mnMinRange;
     376         488 :             mnThumbPixPos   = 0;
     377         488 :             mnThumbPixSize  = mnThumbPixRange;
     378             :         }
     379             :         else
     380             :         {
     381       48188 :             if ( mnVisibleSize )
     382       48054 :                 mnThumbPixSize = ImplMulDiv( mnThumbPixRange, mnVisibleSize, mnMaxRange-mnMinRange );
     383             :             else
     384             :             {
     385         134 :                 if ( GetStyle() & WB_HORZ )
     386          36 :                     mnThumbPixSize = maThumbRect.GetWidth();
     387             :                 else
     388          98 :                     mnThumbPixSize = maThumbRect.GetHeight();
     389             :             }
     390       48188 :             if ( mnThumbPixSize < nMinThumbSize )
     391         434 :                 mnThumbPixSize = nMinThumbSize;
     392       48188 :             if ( mnThumbPixSize > mnThumbPixRange )
     393          56 :                 mnThumbPixSize = mnThumbPixRange;
     394       48188 :             mnThumbPixPos = ImplCalcThumbPosPix( mnThumbPos );
     395             :         }
     396             :     }
     397             : 
     398             :     // If we're ought to ouput again and we have been triggered
     399             :     // a Paint event via an Action, we don't output directly,
     400             :     // but invalidate everything
     401       51217 :     if ( bUpdate && HasPaintEvent() )
     402             :     {
     403       22436 :         Invalidate();
     404       22436 :         bUpdate = false;
     405             :     }
     406       51217 :     ImplUpdateRects( bUpdate );
     407       51217 : }
     408             : 
     409           0 : void ScrollBar::Draw( OutputDevice* pDev, const Point& rPos, const Size& /* rSize */, sal_uLong nFlags )
     410             : {
     411           0 :     Point aPos  = pDev->LogicToPixel( rPos );
     412             : 
     413           0 :     pDev->Push();
     414           0 :     pDev->SetMapMode();
     415           0 :     if ( !(nFlags & WINDOW_DRAW_MONO) )
     416             :     {
     417             :         // DecoView uses the FaceColor...
     418           0 :         AllSettings aSettings = pDev->GetSettings();
     419           0 :         StyleSettings aStyleSettings = aSettings.GetStyleSettings();
     420           0 :         if ( IsControlBackground() )
     421           0 :             aStyleSettings.SetFaceColor( GetControlBackground() );
     422             :         else
     423           0 :             aStyleSettings.SetFaceColor( GetSettings().GetStyleSettings().GetFaceColor() );
     424             : 
     425           0 :         aSettings.SetStyleSettings( aStyleSettings );
     426           0 :         pDev->SetSettings( aSettings );
     427             :     }
     428             : 
     429             :     // For printing:
     430             :     // - calculate the size of the rects
     431             :     // - because this is zero-based add the correct offset
     432             :     // - print
     433             :     // - force recalculate
     434             : 
     435           0 :     if ( mbCalcSize )
     436           0 :         ImplCalc( false );
     437             : 
     438           0 :     maBtn1Rect+=aPos;
     439           0 :     maBtn2Rect+=aPos;
     440           0 :     maThumbRect+=aPos;
     441           0 :     mpData->maTrackRect+=aPos; // TODO: update when maTrackRect is no longer in mpData
     442           0 :     maPage1Rect+=aPos;
     443           0 :     maPage2Rect+=aPos;
     444             : 
     445           0 :     ImplDraw( SCRBAR_DRAW_ALL, pDev );
     446           0 :     pDev->Pop();
     447             : 
     448           0 :     mbCalcSize = true;
     449           0 : }
     450             : 
     451      146735 : bool ScrollBar::ImplDrawNative( sal_uInt16 nDrawFlags )
     452             : {
     453      146735 :     ScrollbarValue scrValue;
     454             : 
     455      146735 :     bool bNativeOK = IsNativeControlSupported(CTRL_SCROLLBAR, PART_ENTIRE_CONTROL);
     456      146735 :     if( !bNativeOK )
     457      146735 :         return false;
     458             : 
     459           0 :     bool bHorz = (GetStyle() & WB_HORZ) ? true : false;
     460             : 
     461             :     // Draw the entire background if the control supports it
     462           0 :     if( IsNativeControlSupported(CTRL_SCROLLBAR, bHorz ? PART_DRAW_BACKGROUND_HORZ : PART_DRAW_BACKGROUND_VERT) )
     463             :     {
     464           0 :         ControlState        nState = ( IsEnabled() ? CTRL_STATE_ENABLED : 0 ) | ( HasFocus() ? CTRL_STATE_FOCUSED : 0 );
     465             : 
     466           0 :         scrValue.mnMin = mnMinRange;
     467           0 :         scrValue.mnMax = mnMaxRange;
     468           0 :         scrValue.mnCur = mnThumbPos;
     469           0 :         scrValue.mnVisibleSize = mnVisibleSize;
     470           0 :         scrValue.maThumbRect = maThumbRect;
     471           0 :         scrValue.maButton1Rect = maBtn1Rect;
     472           0 :         scrValue.maButton2Rect = maBtn2Rect;
     473           0 :         scrValue.mnButton1State = ((mnStateFlags & SCRBAR_STATE_BTN1_DOWN) ? CTRL_STATE_PRESSED : 0) |
     474           0 :                             ((!(mnStateFlags & SCRBAR_STATE_BTN1_DISABLE)) ? CTRL_STATE_ENABLED : 0);
     475           0 :         scrValue.mnButton2State = ((mnStateFlags & SCRBAR_STATE_BTN2_DOWN) ? CTRL_STATE_PRESSED : 0) |
     476           0 :                             ((!(mnStateFlags & SCRBAR_STATE_BTN2_DISABLE)) ? CTRL_STATE_ENABLED : 0);
     477           0 :         scrValue.mnThumbState = nState | ((mnStateFlags & SCRBAR_STATE_THUMB_DOWN) ? CTRL_STATE_PRESSED : 0);
     478           0 :         scrValue.mnPage1State = nState | ((mnStateFlags & SCRBAR_STATE_PAGE1_DOWN) ? CTRL_STATE_PRESSED : 0);
     479           0 :         scrValue.mnPage2State = nState | ((mnStateFlags & SCRBAR_STATE_PAGE2_DOWN) ? CTRL_STATE_PRESSED : 0);
     480             : 
     481           0 :         if( IsMouseOver() )
     482             :         {
     483           0 :             Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
     484           0 :             if( pRect )
     485             :             {
     486           0 :                 if( pRect == &maThumbRect )
     487           0 :                     scrValue.mnThumbState |= CTRL_STATE_ROLLOVER;
     488           0 :                 else if( pRect == &maBtn1Rect )
     489           0 :                     scrValue.mnButton1State |= CTRL_STATE_ROLLOVER;
     490           0 :                 else if( pRect == &maBtn2Rect )
     491           0 :                     scrValue.mnButton2State |= CTRL_STATE_ROLLOVER;
     492           0 :                 else if( pRect == &maPage1Rect )
     493           0 :                     scrValue.mnPage1State |= CTRL_STATE_ROLLOVER;
     494           0 :                 else if( pRect == &maPage2Rect )
     495           0 :                     scrValue.mnPage2State |= CTRL_STATE_ROLLOVER;
     496             :             }
     497             :         }
     498             : 
     499           0 :         Rectangle aCtrlRegion;
     500           0 :         aCtrlRegion.Union( maBtn1Rect );
     501           0 :         aCtrlRegion.Union( maBtn2Rect );
     502           0 :         aCtrlRegion.Union( maPage1Rect );
     503           0 :         aCtrlRegion.Union( maPage2Rect );
     504           0 :         aCtrlRegion.Union( maThumbRect );
     505             :         bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, (bHorz ? PART_DRAW_BACKGROUND_HORZ : PART_DRAW_BACKGROUND_VERT),
     506           0 :                         aCtrlRegion, nState, scrValue, OUString() );
     507             :     }
     508             :     else
     509             :     {
     510           0 :         if ( (nDrawFlags & SCRBAR_DRAW_PAGE1) || (nDrawFlags & SCRBAR_DRAW_PAGE2) )
     511             :         {
     512           0 :             sal_uInt32  part1 = bHorz ? PART_TRACK_HORZ_LEFT : PART_TRACK_VERT_UPPER;
     513           0 :             sal_uInt32  part2 = bHorz ? PART_TRACK_HORZ_RIGHT : PART_TRACK_VERT_LOWER;
     514           0 :             Rectangle   aCtrlRegion1( maPage1Rect );
     515           0 :             Rectangle   aCtrlRegion2( maPage2Rect );
     516           0 :             ControlState nState1 = (IsEnabled() ? CTRL_STATE_ENABLED : 0) | (HasFocus() ? CTRL_STATE_FOCUSED : 0);
     517           0 :             ControlState nState2 = nState1;
     518             : 
     519           0 :             nState1 |= ((mnStateFlags & SCRBAR_STATE_PAGE1_DOWN) ? CTRL_STATE_PRESSED : 0);
     520           0 :             nState2 |= ((mnStateFlags & SCRBAR_STATE_PAGE2_DOWN) ? CTRL_STATE_PRESSED : 0);
     521             : 
     522           0 :             if( IsMouseOver() )
     523             :             {
     524           0 :                 Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
     525           0 :                 if( pRect )
     526             :                 {
     527           0 :                     if( pRect == &maPage1Rect )
     528           0 :                         nState1 |= CTRL_STATE_ROLLOVER;
     529           0 :                     else if( pRect == &maPage2Rect )
     530           0 :                         nState2 |= CTRL_STATE_ROLLOVER;
     531             :                 }
     532             :             }
     533             : 
     534           0 :             if ( nDrawFlags & SCRBAR_DRAW_PAGE1 )
     535             :                 bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, part1, aCtrlRegion1, nState1,
     536           0 :                                 scrValue, OUString() );
     537             : 
     538           0 :             if ( nDrawFlags & SCRBAR_DRAW_PAGE2 )
     539             :                 bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, part2, aCtrlRegion2, nState2,
     540           0 :                                 scrValue, OUString() );
     541             :         }
     542           0 :         if ( (nDrawFlags & SCRBAR_DRAW_BTN1) || (nDrawFlags & SCRBAR_DRAW_BTN2) )
     543             :         {
     544           0 :             sal_uInt32  part1 = bHorz ? PART_BUTTON_LEFT : PART_BUTTON_UP;
     545           0 :             sal_uInt32  part2 = bHorz ? PART_BUTTON_RIGHT : PART_BUTTON_DOWN;
     546           0 :             Rectangle   aCtrlRegion1( maBtn1Rect );
     547           0 :             Rectangle   aCtrlRegion2( maBtn2Rect );
     548           0 :             ControlState nState1 = HasFocus() ? CTRL_STATE_FOCUSED : 0;
     549           0 :             ControlState nState2 = nState1;
     550             : 
     551           0 :             if ( !Window::IsEnabled() || !IsEnabled() )
     552           0 :                 nState1 = (nState2 &= ~CTRL_STATE_ENABLED);
     553             :             else
     554           0 :                 nState1 = (nState2 |= CTRL_STATE_ENABLED);
     555             : 
     556           0 :             nState1 |= ((mnStateFlags & SCRBAR_STATE_BTN1_DOWN) ? CTRL_STATE_PRESSED : 0);
     557           0 :             nState2 |= ((mnStateFlags & SCRBAR_STATE_BTN2_DOWN) ? CTRL_STATE_PRESSED : 0);
     558             : 
     559           0 :             if(mnStateFlags & SCRBAR_STATE_BTN1_DISABLE)
     560           0 :                 nState1 &= ~CTRL_STATE_ENABLED;
     561           0 :             if(mnStateFlags & SCRBAR_STATE_BTN2_DISABLE)
     562           0 :                 nState2 &= ~CTRL_STATE_ENABLED;
     563             : 
     564           0 :             if( IsMouseOver() )
     565             :             {
     566           0 :                 Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
     567           0 :                 if( pRect )
     568             :                 {
     569           0 :                     if( pRect == &maBtn1Rect )
     570           0 :                         nState1 |= CTRL_STATE_ROLLOVER;
     571           0 :                     else if( pRect == &maBtn2Rect )
     572           0 :                         nState2 |= CTRL_STATE_ROLLOVER;
     573             :                 }
     574             :             }
     575             : 
     576           0 :             if ( nDrawFlags & SCRBAR_DRAW_BTN1 )
     577             :                 bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, part1, aCtrlRegion1, nState1,
     578           0 :                                 scrValue, OUString() );
     579             : 
     580           0 :             if ( nDrawFlags & SCRBAR_DRAW_BTN2 )
     581             :                 bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, part2, aCtrlRegion2, nState2,
     582           0 :                                 scrValue, OUString() );
     583             :         }
     584           0 :         if ( (nDrawFlags & SCRBAR_DRAW_THUMB) && !maThumbRect.IsEmpty() )
     585             :         {
     586           0 :             ControlState    nState = IsEnabled() ? CTRL_STATE_ENABLED : 0;
     587           0 :             Rectangle       aCtrlRegion( maThumbRect );
     588             : 
     589           0 :             if ( mnStateFlags & SCRBAR_STATE_THUMB_DOWN )
     590           0 :                 nState |= CTRL_STATE_PRESSED;
     591             : 
     592           0 :             if ( HasFocus() )
     593           0 :                 nState |= CTRL_STATE_FOCUSED;
     594             : 
     595           0 :             if( IsMouseOver() )
     596             :             {
     597           0 :                 Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
     598           0 :                 if( pRect )
     599             :                 {
     600           0 :                     if( pRect == &maThumbRect )
     601           0 :                         nState |= CTRL_STATE_ROLLOVER;
     602             :                 }
     603             :             }
     604             : 
     605             :             bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, (bHorz ? PART_THUMB_HORZ : PART_THUMB_VERT),
     606           0 :                     aCtrlRegion, nState, scrValue, OUString() );
     607             :         }
     608             :     }
     609           0 :     return bNativeOK;
     610             : }
     611             : 
     612       29570 : void ScrollBar::ImplDraw( sal_uInt16 nDrawFlags, OutputDevice* pOutDev )
     613             : {
     614       29570 :     DecorationView          aDecoView( pOutDev );
     615       29570 :     Rectangle               aTempRect;
     616             :     sal_uInt16                  nStyle;
     617       29570 :     const StyleSettings&    rStyleSettings = pOutDev->GetSettings().GetStyleSettings();
     618             :     SymbolType              eSymbolType;
     619       29570 :     bool                    bEnabled = IsEnabled();
     620             : 
     621             :     // Finish some open calculations (if any)
     622       29570 :     if ( mbCalcSize )
     623         595 :         ImplCalc( false );
     624             : 
     625       29570 :     vcl::Window *pWin = NULL;
     626       29570 :     if( pOutDev->GetOutDevType() == OUTDEV_WINDOW )
     627       29570 :         pWin = static_cast<vcl::Window*>(pOutDev);
     628             : 
     629             :     // Draw the entire control if the native theme engine needs it
     630       29570 :     if ( nDrawFlags && pWin && pWin->IsNativeControlSupported(CTRL_SCROLLBAR, PART_DRAW_BACKGROUND_HORZ) )
     631             :     {
     632           0 :         ImplDrawNative( SCRBAR_DRAW_BACKGROUND );
     633       29570 :         return;
     634             :     }
     635             : 
     636       29570 :     if( (nDrawFlags & SCRBAR_DRAW_BTN1) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_BTN1 ) ) )
     637             :     {
     638       29037 :         nStyle = BUTTON_DRAW_NOLIGHTBORDER;
     639       29037 :         if ( mnStateFlags & SCRBAR_STATE_BTN1_DOWN )
     640           0 :             nStyle |= BUTTON_DRAW_PRESSED;
     641       29037 :         aTempRect = aDecoView.DrawButton( maBtn1Rect, nStyle );
     642       29037 :         ImplCalcSymbolRect( aTempRect );
     643       29037 :         nStyle = 0;
     644       29037 :         if ( (mnStateFlags & SCRBAR_STATE_BTN1_DISABLE) || !bEnabled )
     645       27927 :             nStyle |= SYMBOL_DRAW_DISABLE;
     646       29037 :         if ( rStyleSettings.GetOptions() & STYLE_OPTION_SCROLLARROW )
     647             :         {
     648           0 :             if ( GetStyle() & WB_HORZ )
     649           0 :                 eSymbolType = SymbolType::ARROW_LEFT;
     650             :             else
     651           0 :                 eSymbolType = SymbolType::ARROW_UP;
     652             :         }
     653             :         else
     654             :         {
     655       29037 :             if ( GetStyle() & WB_HORZ )
     656       10887 :                 eSymbolType = SymbolType::SPIN_LEFT;
     657             :             else
     658       18150 :                 eSymbolType = SymbolType::SPIN_UP;
     659             :         }
     660       29037 :         aDecoView.DrawSymbol( aTempRect, eSymbolType, rStyleSettings.GetButtonTextColor(), nStyle );
     661             :     }
     662             : 
     663       29570 :     if ( (nDrawFlags & SCRBAR_DRAW_BTN2) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_BTN2 ) ) )
     664             :     {
     665       29002 :         nStyle = BUTTON_DRAW_NOLIGHTBORDER;
     666       29002 :         if ( mnStateFlags & SCRBAR_STATE_BTN2_DOWN )
     667           0 :             nStyle |= BUTTON_DRAW_PRESSED;
     668       29002 :         aTempRect = aDecoView.DrawButton(  maBtn2Rect, nStyle );
     669       29002 :         ImplCalcSymbolRect( aTempRect );
     670       29002 :         nStyle = 0;
     671       29002 :         if ( (mnStateFlags & SCRBAR_STATE_BTN2_DISABLE) || !bEnabled )
     672         186 :             nStyle |= SYMBOL_DRAW_DISABLE;
     673       29002 :         if ( rStyleSettings.GetOptions() & STYLE_OPTION_SCROLLARROW )
     674             :         {
     675           0 :             if ( GetStyle() & WB_HORZ )
     676           0 :                 eSymbolType = SymbolType::ARROW_RIGHT;
     677             :             else
     678           0 :                 eSymbolType = SymbolType::ARROW_DOWN;
     679             :         }
     680             :         else
     681             :         {
     682       29002 :             if ( GetStyle() & WB_HORZ )
     683       10869 :                 eSymbolType = SymbolType::SPIN_RIGHT;
     684             :             else
     685       18133 :                 eSymbolType = SymbolType::SPIN_DOWN;
     686             :         }
     687       29002 :         aDecoView.DrawSymbol( aTempRect, eSymbolType, rStyleSettings.GetButtonTextColor(), nStyle );
     688             :     }
     689             : 
     690       29570 :     pOutDev->SetLineColor();
     691             : 
     692       29570 :     if ( (nDrawFlags & SCRBAR_DRAW_THUMB) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_THUMB ) ) )
     693             :     {
     694       29568 :         if ( !maThumbRect.IsEmpty() )
     695             :         {
     696       29548 :             if ( bEnabled )
     697             :             {
     698       29464 :                 nStyle = BUTTON_DRAW_NOLIGHTBORDER;
     699       29464 :                 aTempRect = aDecoView.DrawButton( maThumbRect, nStyle );
     700             :             }
     701             :             else
     702             :             {
     703          84 :                 pOutDev->SetFillColor( rStyleSettings.GetCheckedColor() );
     704          84 :                 pOutDev->DrawRect( maThumbRect );
     705             :             }
     706             :         }
     707             :     }
     708             : 
     709       29570 :     if ( (nDrawFlags & SCRBAR_DRAW_PAGE1) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_PAGE1 ) ) )
     710             :     {
     711       29560 :         if ( mnStateFlags & SCRBAR_STATE_PAGE1_DOWN )
     712           0 :             pOutDev->SetFillColor( rStyleSettings.GetShadowColor() );
     713             :         else
     714       29560 :             pOutDev->SetFillColor( rStyleSettings.GetCheckedColor() );
     715       29560 :         pOutDev->DrawRect( maPage1Rect );
     716             :     }
     717       29570 :     if ( (nDrawFlags & SCRBAR_DRAW_PAGE2) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_PAGE2 ) ) )
     718             :     {
     719       29568 :         if ( mnStateFlags & SCRBAR_STATE_PAGE2_DOWN )
     720           0 :             pOutDev->SetFillColor( rStyleSettings.GetShadowColor() );
     721             :         else
     722       29568 :             pOutDev->SetFillColor( rStyleSettings.GetCheckedColor() );
     723       29568 :         pOutDev->DrawRect( maPage2Rect );
     724             :     }
     725             : }
     726             : 
     727           4 : long ScrollBar::ImplScroll( long nNewPos, bool bCallEndScroll )
     728             : {
     729           4 :     long nOldPos = mnThumbPos;
     730           4 :     SetThumbPos( nNewPos );
     731           4 :     long nDelta = mnThumbPos-nOldPos;
     732           4 :     if ( nDelta )
     733             :     {
     734           4 :         mnDelta = nDelta;
     735           4 :         Scroll();
     736           4 :         if ( bCallEndScroll )
     737           4 :             EndScroll();
     738           4 :         mnDelta = 0;
     739             :     }
     740           4 :     return nDelta;
     741             : }
     742             : 
     743           4 : long ScrollBar::ImplDoAction( bool bCallEndScroll )
     744             : {
     745           4 :     long nDelta = 0;
     746             : 
     747           4 :     switch ( meScrollType )
     748             :     {
     749             :         case SCROLL_LINEUP:
     750           0 :             nDelta = ImplScroll( mnThumbPos-mnLineSize, bCallEndScroll );
     751           0 :             break;
     752             : 
     753             :         case SCROLL_LINEDOWN:
     754           4 :             nDelta = ImplScroll( mnThumbPos+mnLineSize, bCallEndScroll );
     755           4 :             break;
     756             : 
     757             :         case SCROLL_PAGEUP:
     758           0 :             nDelta = ImplScroll( mnThumbPos-mnPageSize, bCallEndScroll );
     759           0 :             break;
     760             : 
     761             :         case SCROLL_PAGEDOWN:
     762           0 :             nDelta = ImplScroll( mnThumbPos+mnPageSize, bCallEndScroll );
     763           0 :             break;
     764             :         default:
     765             :             ;
     766             :     }
     767             : 
     768           4 :     return nDelta;
     769             : }
     770             : 
     771           0 : void ScrollBar::ImplDoMouseAction( const Point& rMousePos, bool bCallAction )
     772             : {
     773           0 :     sal_uInt16  nOldStateFlags = mnStateFlags;
     774           0 :     bool    bAction = false;
     775           0 :     bool        bHorizontal = ( GetStyle() & WB_HORZ ) ? true: false;
     776           0 :     bool        bIsInside = false;
     777             : 
     778           0 :     Point aPoint( 0, 0 );
     779           0 :     Rectangle aControlRegion( aPoint, GetOutputSizePixel() );
     780             : 
     781           0 :     switch ( meScrollType )
     782             :     {
     783             :         case SCROLL_LINEUP:
     784           0 :             if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? (IsRTLEnabled()? PART_BUTTON_RIGHT: PART_BUTTON_LEFT): PART_BUTTON_UP,
     785           0 :                         aControlRegion, rMousePos, bIsInside )?
     786             :                     bIsInside:
     787           0 :                     maBtn1Rect.IsInside( rMousePos ) )
     788             :             {
     789           0 :                 bAction = bCallAction;
     790           0 :                 mnStateFlags |= SCRBAR_STATE_BTN1_DOWN;
     791             :             }
     792             :             else
     793           0 :                 mnStateFlags &= ~SCRBAR_STATE_BTN1_DOWN;
     794           0 :             break;
     795             : 
     796             :         case SCROLL_LINEDOWN:
     797           0 :             if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? (IsRTLEnabled()? PART_BUTTON_LEFT: PART_BUTTON_RIGHT): PART_BUTTON_DOWN,
     798           0 :                         aControlRegion, rMousePos, bIsInside )?
     799             :                     bIsInside:
     800           0 :                     maBtn2Rect.IsInside( rMousePos ) )
     801             :             {
     802           0 :                 bAction = bCallAction;
     803           0 :                 mnStateFlags |= SCRBAR_STATE_BTN2_DOWN;
     804             :             }
     805             :             else
     806           0 :                 mnStateFlags &= ~SCRBAR_STATE_BTN2_DOWN;
     807           0 :             break;
     808             : 
     809             :         case SCROLL_PAGEUP:
     810             :             // HitTestNativeControl, see remark at top of file
     811           0 :             if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_TRACK_HORZ_LEFT: PART_TRACK_VERT_UPPER,
     812           0 :                                        maPage1Rect, rMousePos, bIsInside )?
     813             :                     bIsInside:
     814           0 :                     maPage1Rect.IsInside( rMousePos ) )
     815             :             {
     816           0 :                 bAction = bCallAction;
     817           0 :                 mnStateFlags |= SCRBAR_STATE_PAGE1_DOWN;
     818             :             }
     819             :             else
     820           0 :                 mnStateFlags &= ~SCRBAR_STATE_PAGE1_DOWN;
     821           0 :             break;
     822             : 
     823             :         case SCROLL_PAGEDOWN:
     824             :             // HitTestNativeControl, see remark at top of file
     825           0 :             if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_TRACK_HORZ_RIGHT: PART_TRACK_VERT_LOWER,
     826           0 :                                        maPage2Rect, rMousePos, bIsInside )?
     827             :                     bIsInside:
     828           0 :                     maPage2Rect.IsInside( rMousePos ) )
     829             :             {
     830           0 :                 bAction = bCallAction;
     831           0 :                 mnStateFlags |= SCRBAR_STATE_PAGE2_DOWN;
     832             :             }
     833             :             else
     834           0 :                 mnStateFlags &= ~SCRBAR_STATE_PAGE2_DOWN;
     835           0 :             break;
     836             :         default:
     837             :             ;
     838             :     }
     839             : 
     840           0 :     if ( nOldStateFlags != mnStateFlags )
     841           0 :         ImplDraw( mnDragDraw, this );
     842           0 :     if ( bAction )
     843           0 :         ImplDoAction( false );
     844           0 : }
     845             : 
     846           0 : void ScrollBar::ImplDragThumb( const Point& rMousePos )
     847             : {
     848             :     long nMovePix;
     849           0 :     if ( GetStyle() & WB_HORZ )
     850           0 :         nMovePix = rMousePos.X()-(maThumbRect.Left()+mnMouseOff);
     851             :     else
     852           0 :         nMovePix = rMousePos.Y()-(maThumbRect.Top()+mnMouseOff);
     853             : 
     854             :     // Move thumb if necessary
     855           0 :     if ( nMovePix )
     856             :     {
     857           0 :         mnThumbPixPos += nMovePix;
     858           0 :         if ( mnThumbPixPos < 0 )
     859           0 :             mnThumbPixPos = 0;
     860           0 :         if ( mnThumbPixPos > (mnThumbPixRange-mnThumbPixSize) )
     861           0 :             mnThumbPixPos = mnThumbPixRange-mnThumbPixSize;
     862           0 :         long nOldPos = mnThumbPos;
     863           0 :         mnThumbPos = ImplCalcThumbPos( mnThumbPixPos );
     864           0 :         ImplUpdateRects();
     865           0 :         if ( mbFullDrag && (nOldPos != mnThumbPos) )
     866             :         {
     867           0 :             mnDelta = mnThumbPos-nOldPos;
     868           0 :             Scroll();
     869           0 :             mnDelta = 0;
     870             :         }
     871             :     }
     872           0 : }
     873             : 
     874           0 : void ScrollBar::MouseButtonDown( const MouseEvent& rMEvt )
     875             : {
     876           0 :     bool bPrimaryWarps = GetSettings().GetStyleSettings().GetPrimaryButtonWarpsSlider();
     877           0 :     bool bWarp = bPrimaryWarps ? rMEvt.IsLeft() : rMEvt.IsMiddle();
     878           0 :     bool bPrimaryWarping = bWarp && rMEvt.IsLeft();
     879           0 :     bool bPage = bPrimaryWarps ? rMEvt.IsRight() : rMEvt.IsLeft();
     880             : 
     881           0 :     if (rMEvt.IsLeft() || rMEvt.IsMiddle() || rMEvt.IsRight())
     882             :     {
     883           0 :         const Point&        rMousePos = rMEvt.GetPosPixel();
     884           0 :         sal_uInt16          nTrackFlags = 0;
     885           0 :         bool                bHorizontal = ( GetStyle() & WB_HORZ ) ? true: false;
     886           0 :         bool                bIsInside = false;
     887           0 :         bool                bDragToMouse = false;
     888             : 
     889           0 :         Point aPoint( 0, 0 );
     890           0 :         Rectangle aControlRegion( aPoint, GetOutputSizePixel() );
     891             : 
     892           0 :         if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? (IsRTLEnabled()? PART_BUTTON_RIGHT: PART_BUTTON_LEFT): PART_BUTTON_UP,
     893           0 :                     aControlRegion, rMousePos, bIsInside )?
     894             :                 bIsInside:
     895           0 :                 maBtn1Rect.IsInside( rMousePos ) )
     896             :         {
     897           0 :             if (rMEvt.IsLeft() && !(mnStateFlags & SCRBAR_STATE_BTN1_DISABLE) )
     898             :             {
     899           0 :                 nTrackFlags     = STARTTRACK_BUTTONREPEAT;
     900           0 :                 meScrollType    = SCROLL_LINEUP;
     901           0 :                 mnDragDraw      = SCRBAR_DRAW_BTN1;
     902             :             }
     903             :         }
     904           0 :         else if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? (IsRTLEnabled()? PART_BUTTON_LEFT: PART_BUTTON_RIGHT): PART_BUTTON_DOWN,
     905           0 :                     aControlRegion, rMousePos, bIsInside )?
     906             :                 bIsInside:
     907           0 :                 maBtn2Rect.IsInside( rMousePos ) )
     908             :         {
     909           0 :             if (rMEvt.IsLeft() && !(mnStateFlags & SCRBAR_STATE_BTN2_DISABLE) )
     910             :             {
     911           0 :                 nTrackFlags     = STARTTRACK_BUTTONREPEAT;
     912           0 :                 meScrollType    = SCROLL_LINEDOWN;
     913           0 :                 mnDragDraw      = SCRBAR_DRAW_BTN2;
     914             :             }
     915             :         }
     916             :         else
     917             :         {
     918             :             bool bThumbHit = HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_THUMB_HORZ : PART_THUMB_VERT,
     919           0 :                                                    maThumbRect, rMousePos, bIsInside )
     920           0 :                              ? bIsInside : maThumbRect.IsInside( rMousePos );
     921             : 
     922           0 :             bool bThumbAction = bWarp || bPage;
     923             : 
     924           0 :             bool bDragHandling = bWarp || (bThumbHit && bThumbAction);
     925           0 :             if( bDragHandling )
     926             :             {
     927           0 :                 if( mpData )
     928             :                 {
     929           0 :                     mpData->mbHide = true; // disable focus blinking
     930           0 :                     if( HasFocus() )
     931           0 :                         ImplDraw( SCRBAR_DRAW_THUMB, this ); // paint without focus
     932             :                 }
     933             : 
     934           0 :                 if ( mnVisibleSize < mnMaxRange-mnMinRange )
     935             :                 {
     936           0 :                     nTrackFlags     = 0;
     937           0 :                     meScrollType    = SCROLL_DRAG;
     938           0 :                     mnDragDraw      = SCRBAR_DRAW_THUMB;
     939             : 
     940             :                     // calculate mouse offset
     941           0 :                     if (bWarp && (!bThumbHit || !bPrimaryWarping))
     942             :                     {
     943           0 :                         bDragToMouse = true;
     944           0 :                         if ( GetStyle() & WB_HORZ )
     945           0 :                             mnMouseOff = maThumbRect.GetWidth()/2;
     946             :                         else
     947           0 :                             mnMouseOff = maThumbRect.GetHeight()/2;
     948             :                     }
     949             :                     else
     950             :                     {
     951           0 :                         if ( GetStyle() & WB_HORZ )
     952           0 :                             mnMouseOff = rMousePos.X()-maThumbRect.Left();
     953             :                         else
     954           0 :                             mnMouseOff = rMousePos.Y()-maThumbRect.Top();
     955             :                     }
     956             : 
     957           0 :                     mnStateFlags |= SCRBAR_STATE_THUMB_DOWN;
     958           0 :                     ImplDraw( mnDragDraw, this );
     959             :                 }
     960             :             }
     961           0 :             else if(bPage && (HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_TRACK_HORZ_AREA : PART_TRACK_VERT_AREA,
     962           0 :                                            aControlRegion, rMousePos, bIsInside ) ?
     963             :                 bIsInside : true) )
     964             :             {
     965           0 :                 nTrackFlags = STARTTRACK_BUTTONREPEAT;
     966             : 
     967             :                 // HitTestNativeControl, see remark at top of file
     968           0 :                 if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_TRACK_HORZ_LEFT : PART_TRACK_VERT_UPPER,
     969           0 :                                            maPage1Rect, rMousePos, bIsInside )?
     970             :                     bIsInside:
     971           0 :                     maPage1Rect.IsInside( rMousePos ) )
     972             :                 {
     973           0 :                     meScrollType    = SCROLL_PAGEUP;
     974           0 :                     mnDragDraw      = SCRBAR_DRAW_PAGE1;
     975             :                 }
     976             :                 else
     977             :                 {
     978           0 :                     meScrollType    = SCROLL_PAGEDOWN;
     979           0 :                     mnDragDraw      = SCRBAR_DRAW_PAGE2;
     980             :                 }
     981             :             }
     982             :         }
     983             : 
     984             :         // Should we start Tracking?
     985           0 :         if ( meScrollType != SCROLL_DONTKNOW )
     986             :         {
     987             :             // store original position for cancel and EndScroll delta
     988           0 :             mnStartPos = mnThumbPos;
     989             :             // #92906# Call StartTracking() before ImplDoMouseAction(), otherwise
     990             :             // MouseButtonUp() / EndTracking() may be called if somebody is spending
     991             :             // a lot of time in the scroll handler
     992           0 :             StartTracking( nTrackFlags );
     993           0 :             ImplDoMouseAction( rMousePos );
     994             : 
     995           0 :             if( bDragToMouse )
     996           0 :                 ImplDragThumb( rMousePos );
     997             :         }
     998             :     }
     999           0 : }
    1000             : 
    1001           0 : void ScrollBar::Tracking( const TrackingEvent& rTEvt )
    1002             : {
    1003           0 :     if ( rTEvt.IsTrackingEnded() )
    1004             :     {
    1005             :         // Restore Button and PageRect status
    1006           0 :         sal_uInt16 nOldStateFlags = mnStateFlags;
    1007             :         mnStateFlags &= ~(SCRBAR_STATE_BTN1_DOWN | SCRBAR_STATE_BTN2_DOWN |
    1008             :                           SCRBAR_STATE_PAGE1_DOWN | SCRBAR_STATE_PAGE2_DOWN |
    1009           0 :                           SCRBAR_STATE_THUMB_DOWN);
    1010           0 :         if ( nOldStateFlags != mnStateFlags )
    1011           0 :             ImplDraw( mnDragDraw, this );
    1012           0 :         mnDragDraw = 0;
    1013             : 
    1014             :         // Restore the old ThumbPosition when canceled
    1015           0 :         if ( rTEvt.IsTrackingCanceled() )
    1016             :         {
    1017           0 :             long nOldPos = mnThumbPos;
    1018           0 :             SetThumbPos( mnStartPos );
    1019           0 :             mnDelta = mnThumbPos-nOldPos;
    1020           0 :             Scroll();
    1021             :         }
    1022             : 
    1023           0 :         if ( meScrollType == SCROLL_DRAG )
    1024             :         {
    1025             :             // On a SCROLLDRAG we recalculate the Thumb, so that it's back to a
    1026             :             // rounded ThumbPosition
    1027           0 :             ImplCalc();
    1028             : 
    1029           0 :             if ( !mbFullDrag && (mnStartPos != mnThumbPos) )
    1030             :             {
    1031           0 :                 mnDelta = mnThumbPos-mnStartPos;
    1032           0 :                 Scroll();
    1033           0 :                 mnDelta = 0;
    1034             :             }
    1035             :         }
    1036             : 
    1037           0 :         mnDelta = mnThumbPos-mnStartPos;
    1038           0 :         EndScroll();
    1039           0 :         mnDelta = 0;
    1040           0 :         meScrollType = SCROLL_DONTKNOW;
    1041             : 
    1042           0 :         if( mpData )
    1043           0 :             mpData->mbHide = false; // re-enable focus blinking
    1044             :     }
    1045             :     else
    1046             :     {
    1047           0 :         const Point rMousePos = rTEvt.GetMouseEvent().GetPosPixel();
    1048             : 
    1049             :         // Dragging is treated in a special way
    1050           0 :         if ( meScrollType == SCROLL_DRAG )
    1051           0 :             ImplDragThumb( rMousePos );
    1052             :         else
    1053           0 :             ImplDoMouseAction( rMousePos, rTEvt.IsTrackingRepeat() );
    1054             : 
    1055             :         // If ScrollBar values are translated in a way that there's
    1056             :         // nothing left to track, we cancel here
    1057           0 :         if ( !IsVisible() || (mnVisibleSize >= (mnMaxRange-mnMinRange)) )
    1058           0 :             EndTracking();
    1059             :     }
    1060           0 : }
    1061             : 
    1062           0 : void ScrollBar::KeyInput( const KeyEvent& rKEvt )
    1063             : {
    1064           0 :     if ( !rKEvt.GetKeyCode().GetModifier() )
    1065             :     {
    1066           0 :         switch ( rKEvt.GetKeyCode().GetCode() )
    1067             :         {
    1068             :             case KEY_HOME:
    1069           0 :                 DoScroll( 0 );
    1070           0 :                 break;
    1071             : 
    1072             :             case KEY_END:
    1073           0 :                 DoScroll( GetRangeMax() );
    1074           0 :                 break;
    1075             : 
    1076             :             case KEY_LEFT:
    1077             :             case KEY_UP:
    1078           0 :                 DoScrollAction( SCROLL_LINEUP );
    1079           0 :                 break;
    1080             : 
    1081             :             case KEY_RIGHT:
    1082             :             case KEY_DOWN:
    1083           0 :                 DoScrollAction( SCROLL_LINEDOWN );
    1084           0 :                 break;
    1085             : 
    1086             :             case KEY_PAGEUP:
    1087           0 :                 DoScrollAction( SCROLL_PAGEUP );
    1088           0 :                 break;
    1089             : 
    1090             :             case KEY_PAGEDOWN:
    1091           0 :                 DoScrollAction( SCROLL_PAGEDOWN );
    1092           0 :                 break;
    1093             : 
    1094             :             default:
    1095           0 :                 Control::KeyInput( rKEvt );
    1096           0 :                 break;
    1097             :         }
    1098             :     }
    1099             :     else
    1100           0 :         Control::KeyInput( rKEvt );
    1101           0 : }
    1102             : 
    1103       29000 : void ScrollBar::Paint( const Rectangle& )
    1104             : {
    1105       29000 :     ImplDraw( SCRBAR_DRAW_ALL, this );
    1106       29000 : }
    1107             : 
    1108       40731 : void ScrollBar::Resize()
    1109             : {
    1110       40731 :     Control::Resize();
    1111       40731 :     mbCalcSize = true;
    1112       40731 :     if ( IsReallyVisible() )
    1113       15181 :         ImplCalc( false );
    1114       40731 :     Invalidate();
    1115       40731 : }
    1116             : 
    1117           0 : IMPL_LINK_NOARG(ScrollBar, ImplAutoTimerHdl)
    1118             : {
    1119           0 :     if( mpData && mpData->mbHide )
    1120           0 :         return 0;
    1121           0 :     ImplInvert();
    1122           0 :     return 0;
    1123             : }
    1124             : 
    1125           0 : void ScrollBar::ImplInvert()
    1126             : {
    1127           0 :     Rectangle aRect( maThumbRect );
    1128           0 :     if( aRect.getWidth() > 4 )
    1129             :     {
    1130           0 :         aRect.Left() += 2;
    1131           0 :         aRect.Right() -= 2;
    1132             :     }
    1133           0 :     if( aRect.getHeight() > 4 )
    1134             :     {
    1135           0 :         aRect.Top() += 2;
    1136           0 :         aRect.Bottom() -= 2;
    1137             :     }
    1138             : 
    1139           0 :     Invert( aRect, 0 );
    1140           0 : }
    1141             : 
    1142           0 : void ScrollBar::GetFocus()
    1143             : {
    1144           0 :     if( !mpData )
    1145             :     {
    1146           0 :         mpData = new ImplScrollBarData;
    1147           0 :         mpData->maTimer.SetTimeoutHdl( LINK( this, ScrollBar, ImplAutoTimerHdl ) );
    1148           0 :         mpData->mbHide = false;
    1149             :     }
    1150           0 :     ImplInvert(); // react immediately
    1151           0 :     mpData->maTimer.SetTimeout( GetSettings().GetStyleSettings().GetCursorBlinkTime() );
    1152           0 :     mpData->maTimer.Start();
    1153           0 :     Control::GetFocus();
    1154           0 : }
    1155             : 
    1156           0 : void ScrollBar::LoseFocus()
    1157             : {
    1158           0 :     if( mpData )
    1159           0 :         mpData->maTimer.Stop();
    1160           0 :     ImplDraw( SCRBAR_DRAW_THUMB, this );
    1161             : 
    1162           0 :     Control::LoseFocus();
    1163           0 : }
    1164             : 
    1165      124882 : void ScrollBar::StateChanged( StateChangedType nType )
    1166             : {
    1167      124882 :     Control::StateChanged( nType );
    1168             : 
    1169      124882 :     if ( nType == StateChangedType::INITSHOW )
    1170       11457 :         ImplCalc( false );
    1171      113425 :     else if ( nType == StateChangedType::DATA )
    1172             :     {
    1173       74793 :         if ( IsReallyVisible() && IsUpdateMode() )
    1174       23006 :             ImplCalc( true );
    1175             :     }
    1176       38632 :     else if ( nType == StateChangedType::UPDATEMODE )
    1177             :     {
    1178           0 :         if ( IsReallyVisible() && IsUpdateMode() )
    1179             :         {
    1180           0 :             ImplCalc( false );
    1181           0 :             Invalidate();
    1182             :         }
    1183             :     }
    1184       38632 :     else if ( nType == StateChangedType::ENABLE )
    1185             :     {
    1186        7382 :         if ( IsReallyVisible() && IsUpdateMode() )
    1187        4308 :             Invalidate();
    1188             :     }
    1189       31250 :     else if ( nType == StateChangedType::STYLE )
    1190             :     {
    1191           2 :         ImplInitStyle( GetStyle() );
    1192           2 :         if ( IsReallyVisible() && IsUpdateMode() )
    1193             :         {
    1194           0 :             if ( (GetPrevStyle() & SCRBAR_VIEW_STYLE) !=
    1195           0 :                  (GetStyle() & SCRBAR_VIEW_STYLE) )
    1196             :             {
    1197           0 :                 mbCalcSize = true;
    1198           0 :                 ImplCalc( false );
    1199           0 :                 Invalidate();
    1200             :             }
    1201             :         }
    1202             :     }
    1203      124882 : }
    1204             : 
    1205        1096 : void ScrollBar::DataChanged( const DataChangedEvent& rDCEvt )
    1206             : {
    1207        1096 :     Control::DataChanged( rDCEvt );
    1208             : 
    1209        2192 :     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
    1210        1096 :          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
    1211             :     {
    1212         978 :         mbCalcSize = true;
    1213         978 :         ImplCalc( false );
    1214         978 :         Invalidate();
    1215             :     }
    1216        1096 : }
    1217             : 
    1218           0 : Rectangle* ScrollBar::ImplFindPartRect( const Point& rPt )
    1219             : {
    1220           0 :     bool    bHorizontal = ( GetStyle() & WB_HORZ ) ? true: false;
    1221           0 :     bool    bIsInside = false;
    1222             : 
    1223           0 :     Point aPoint( 0, 0 );
    1224           0 :     Rectangle aControlRegion( aPoint, GetOutputSizePixel() );
    1225             : 
    1226           0 :     if( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? (IsRTLEnabled()? PART_BUTTON_RIGHT: PART_BUTTON_LEFT): PART_BUTTON_UP,
    1227           0 :                 aControlRegion, rPt, bIsInside )?
    1228             :             bIsInside:
    1229           0 :             maBtn1Rect.IsInside( rPt ) )
    1230           0 :         return &maBtn1Rect;
    1231           0 :     else if( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? (IsRTLEnabled()? PART_BUTTON_LEFT: PART_BUTTON_RIGHT): PART_BUTTON_DOWN,
    1232           0 :                 aControlRegion, rPt, bIsInside )?
    1233             :             bIsInside:
    1234           0 :             maBtn2Rect.IsInside( rPt ) )
    1235           0 :         return &maBtn2Rect;
    1236             :     // HitTestNativeControl, see remark at top of file
    1237           0 :     else if( HitTestNativeControl( CTRL_SCROLLBAR,  bHorizontal ? PART_TRACK_HORZ_LEFT : PART_TRACK_VERT_UPPER,
    1238           0 :                 maPage1Rect, rPt, bIsInside)?
    1239             :             bIsInside:
    1240           0 :             maPage1Rect.IsInside( rPt ) )
    1241           0 :         return &maPage1Rect;
    1242             :     // HitTestNativeControl, see remark at top of file
    1243           0 :     else if( HitTestNativeControl( CTRL_SCROLLBAR,  bHorizontal ? PART_TRACK_HORZ_RIGHT : PART_TRACK_VERT_LOWER,
    1244           0 :                 maPage2Rect, rPt, bIsInside)?
    1245             :             bIsInside:
    1246           0 :             maPage2Rect.IsInside( rPt ) )
    1247           0 :         return &maPage2Rect;
    1248             :     // HitTestNativeControl, see remark at top of file
    1249           0 :     else if( HitTestNativeControl( CTRL_SCROLLBAR,  bHorizontal ? PART_THUMB_HORZ : PART_THUMB_VERT,
    1250           0 :                 maThumbRect, rPt, bIsInside)?
    1251             :              bIsInside:
    1252           0 :              maThumbRect.IsInside( rPt ) )
    1253           0 :         return &maThumbRect;
    1254             :     else
    1255           0 :         return NULL;
    1256             : }
    1257             : 
    1258           0 : bool ScrollBar::PreNotify( NotifyEvent& rNEvt )
    1259             : {
    1260           0 :     const MouseEvent* pMouseEvt = NULL;
    1261             : 
    1262           0 :     if( (rNEvt.GetType() == EVENT_MOUSEMOVE) && (pMouseEvt = rNEvt.GetMouseEvent()) != NULL )
    1263             :     {
    1264           0 :         if( !pMouseEvt->GetButtons() && !pMouseEvt->IsSynthetic() && !pMouseEvt->IsModifierChanged() )
    1265             :         {
    1266             :             // Trigger a redraw if mouse over state has changed
    1267           0 :             if( IsNativeControlSupported(CTRL_SCROLLBAR, PART_ENTIRE_CONTROL) )
    1268             :             {
    1269           0 :                 Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
    1270           0 :                 Rectangle* pLastRect = ImplFindPartRect( GetLastPointerPosPixel() );
    1271           0 :                 if( pRect != pLastRect || pMouseEvt->IsLeaveWindow() || pMouseEvt->IsEnterWindow() )
    1272             :                 {
    1273           0 :                     vcl::Region aRgn( GetActiveClipRegion() );
    1274           0 :                     vcl::Region aClipRegion;
    1275             : 
    1276           0 :                     if ( pRect )
    1277           0 :                         aClipRegion.Union( *pRect );
    1278           0 :                     if ( pLastRect )
    1279           0 :                         aClipRegion.Union( *pLastRect );
    1280             : 
    1281             :                     // Support for 3-button scroll bars
    1282           0 :                     bool bHas3Buttons = IsNativeControlSupported( CTRL_SCROLLBAR, HAS_THREE_BUTTONS );
    1283           0 :                     if ( bHas3Buttons && ( pRect == &maBtn1Rect || pLastRect == &maBtn1Rect ) )
    1284             :                     {
    1285           0 :                         aClipRegion.Union( maBtn2Rect );
    1286             :                     }
    1287             : 
    1288           0 :                     SetClipRegion( aClipRegion );
    1289           0 :                     Paint( aClipRegion.GetBoundRect() );
    1290             : 
    1291           0 :                     SetClipRegion( aRgn );
    1292             :                 }
    1293             :             }
    1294             :         }
    1295             :     }
    1296             : 
    1297           0 :     return Control::PreNotify(rNEvt);
    1298             : }
    1299             : 
    1300           4 : void ScrollBar::Scroll()
    1301             : {
    1302           4 :     ImplCallEventListenersAndHandler( VCLEVENT_SCROLLBAR_SCROLL, maScrollHdl, this );
    1303           4 : }
    1304             : 
    1305           4 : void ScrollBar::EndScroll()
    1306             : {
    1307           4 :     ImplCallEventListenersAndHandler( VCLEVENT_SCROLLBAR_ENDSCROLL, maEndScrollHdl, this );
    1308           4 : }
    1309             : 
    1310           0 : long ScrollBar::DoScroll( long nNewPos )
    1311             : {
    1312           0 :     if ( meScrollType != SCROLL_DONTKNOW )
    1313           0 :         return 0;
    1314             : 
    1315             :     SAL_INFO("vcl.scrollbar", "DoScroll(" << nNewPos << ")");
    1316           0 :     meScrollType = SCROLL_DRAG;
    1317           0 :     long nDelta = ImplScroll( nNewPos, true );
    1318           0 :     meScrollType = SCROLL_DONTKNOW;
    1319           0 :     return nDelta;
    1320             : }
    1321             : 
    1322           4 : long ScrollBar::DoScrollAction( ScrollType eScrollType )
    1323             : {
    1324           4 :     if ( (meScrollType != SCROLL_DONTKNOW) ||
    1325           4 :          (eScrollType == SCROLL_DONTKNOW) ||
    1326             :          (eScrollType == SCROLL_DRAG) )
    1327           0 :         return 0;
    1328             : 
    1329           4 :     meScrollType = eScrollType;
    1330           4 :     long nDelta = ImplDoAction( true );
    1331           4 :     meScrollType = SCROLL_DONTKNOW;
    1332           4 :     return nDelta;
    1333             : }
    1334             : 
    1335          76 : void ScrollBar::SetRangeMin( long nNewRange )
    1336             : {
    1337          76 :     SetRange( Range( nNewRange, GetRangeMax() ) );
    1338          76 : }
    1339             : 
    1340        9337 : void ScrollBar::SetRangeMax( long nNewRange )
    1341             : {
    1342        9337 :     SetRange( Range( GetRangeMin(), nNewRange ) );
    1343        9337 : }
    1344             : 
    1345      136175 : void ScrollBar::SetRange( const Range& rRange )
    1346             : {
    1347             :     // Adapt Range
    1348      136175 :     Range aRange = rRange;
    1349      136175 :     aRange.Justify();
    1350      136175 :     long nNewMinRange = aRange.Min();
    1351      136175 :     long nNewMaxRange = aRange.Max();
    1352             : 
    1353             :     // If Range differs, set a new one
    1354      270856 :     if ( (mnMinRange != nNewMinRange) ||
    1355      134681 :          (mnMaxRange != nNewMaxRange) )
    1356             :     {
    1357       24311 :         mnMinRange = nNewMinRange;
    1358       24311 :         mnMaxRange = nNewMaxRange;
    1359             : 
    1360             :         // Adapt Thumb
    1361       24311 :         if ( mnThumbPos > mnMaxRange-mnVisibleSize )
    1362        4630 :             mnThumbPos = mnMaxRange-mnVisibleSize;
    1363       24311 :         if ( mnThumbPos < mnMinRange )
    1364        4669 :             mnThumbPos = mnMinRange;
    1365             : 
    1366       24311 :         StateChanged( StateChangedType::DATA );
    1367             :     }
    1368      136175 : }
    1369             : 
    1370      121341 : void ScrollBar::SetThumbPos( long nNewThumbPos )
    1371             : {
    1372      121341 :     if ( nNewThumbPos > mnMaxRange-mnVisibleSize )
    1373        4395 :         nNewThumbPos = mnMaxRange-mnVisibleSize;
    1374      121341 :     if ( nNewThumbPos < mnMinRange )
    1375        4407 :         nNewThumbPos = mnMinRange;
    1376             : 
    1377      121341 :     if ( mnThumbPos != nNewThumbPos )
    1378             :     {
    1379       11538 :         mnThumbPos = nNewThumbPos;
    1380       11538 :         StateChanged( StateChangedType::DATA );
    1381             :     }
    1382      121341 : }
    1383             : 
    1384       82171 : void ScrollBar::SetVisibleSize( long nNewSize )
    1385             : {
    1386       82171 :     if ( mnVisibleSize != nNewSize )
    1387             :     {
    1388       38944 :         mnVisibleSize = nNewSize;
    1389             : 
    1390             :         // Adapt Thumb
    1391       38944 :         if ( mnThumbPos > mnMaxRange-mnVisibleSize )
    1392        2275 :             mnThumbPos = mnMaxRange-mnVisibleSize;
    1393       38944 :         if ( mnThumbPos < mnMinRange )
    1394        2070 :             mnThumbPos = mnMinRange;
    1395       38944 :         StateChanged( StateChangedType::DATA );
    1396             :     }
    1397       82171 : }
    1398             : 
    1399           0 : Size ScrollBar::GetOptimalSize() const
    1400             : {
    1401           0 :     if (mbCalcSize)
    1402           0 :         const_cast<ScrollBar*>(this)->ImplCalc(false);
    1403             : 
    1404           0 :     Size aRet = getCurrentCalcSize();
    1405             : 
    1406           0 :     const long nMinThumbSize = GetSettings().GetStyleSettings().GetMinThumbSize();
    1407             : 
    1408           0 :     if (GetStyle() & WB_HORZ)
    1409             :     {
    1410           0 :         aRet.Width() = maBtn1Rect.GetWidth() + nMinThumbSize + maBtn2Rect.GetWidth();
    1411             :     }
    1412             :     else
    1413             :     {
    1414           0 :         aRet.Height() = maBtn1Rect.GetHeight() + nMinThumbSize + maBtn2Rect.GetHeight();
    1415             :     }
    1416             : 
    1417           0 :     return aRet;
    1418             : }
    1419             : 
    1420       56670 : Size ScrollBar::getCurrentCalcSize() const
    1421             : {
    1422       56670 :     Rectangle aCtrlRegion;
    1423       56670 :     aCtrlRegion.Union(maBtn1Rect);
    1424       56670 :     aCtrlRegion.Union(maBtn2Rect);
    1425       56670 :     aCtrlRegion.Union(maPage1Rect);
    1426       56670 :     aCtrlRegion.Union(maPage2Rect);
    1427       56670 :     aCtrlRegion.Union(maThumbRect);
    1428       56670 :     return aCtrlRegion.GetSize();
    1429             : }
    1430             : 
    1431       12356 : void ScrollBarBox::ImplInit( vcl::Window* pParent, WinBits nStyle )
    1432             : {
    1433       12356 :     Window::ImplInit( pParent, nStyle, NULL );
    1434             : 
    1435       12356 :     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
    1436       12356 :     long nScrollSize = rStyleSettings.GetScrollBarSize();
    1437       12356 :     SetSizePixel( Size( nScrollSize, nScrollSize ) );
    1438       12356 :     ImplInitSettings();
    1439       12356 : }
    1440             : 
    1441       12356 : ScrollBarBox::ScrollBarBox( vcl::Window* pParent, WinBits nStyle ) :
    1442       12356 :     Window( WINDOW_SCROLLBARBOX )
    1443             : {
    1444       12356 :     ImplInit( pParent, nStyle );
    1445       12356 : }
    1446             : 
    1447       12628 : void ScrollBarBox::ImplInitSettings()
    1448             : {
    1449             :     // FIXME: Hack so that we can build DockingWindows even without background
    1450             :     // and not everything has been switched over yet
    1451       12628 :     if ( IsBackground() )
    1452             :     {
    1453       12628 :         Color aColor;
    1454       12628 :         if ( IsControlBackground() )
    1455           0 :             aColor = GetControlBackground();
    1456             :         else
    1457       12628 :             aColor = GetSettings().GetStyleSettings().GetFaceColor();
    1458       12628 :         SetBackground( aColor );
    1459             :     }
    1460       12628 : }
    1461             : 
    1462       14035 : void ScrollBarBox::StateChanged( StateChangedType nType )
    1463             : {
    1464       14035 :     Window::StateChanged( nType );
    1465             : 
    1466       14035 :     if ( nType == StateChangedType::CONTROLBACKGROUND )
    1467             :     {
    1468           0 :         ImplInitSettings();
    1469           0 :         Invalidate();
    1470             :     }
    1471       14035 : }
    1472             : 
    1473         328 : void ScrollBarBox::DataChanged( const DataChangedEvent& rDCEvt )
    1474             : {
    1475         328 :     Window::DataChanged( rDCEvt );
    1476             : 
    1477         656 :     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
    1478         328 :          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
    1479             :     {
    1480         272 :         ImplInitSettings();
    1481         272 :         Invalidate();
    1482             :     }
    1483        1561 : }
    1484             : 
    1485             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10