LCOV - code coverage report
Current view: top level - usr/local/src/libreoffice/vcl/source/control - scrbar.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 375 838 44.7 %
Date: 2013-07-09 Functions: 34 52 65.4 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10