LCOV - code coverage report
Current view: top level - vcl/source/control - spinbtn.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 267 0.0 %
Date: 2014-04-14 Functions: 0 26 0.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 <tools/rcid.h>
      21             : #include <vcl/spin.h>
      22             : #include <vcl/event.hxx>
      23             : #include <vcl/spin.hxx>
      24             : #include <vcl/settings.hxx>
      25             : 
      26           0 : void SpinButton::ImplInit( Window* pParent, WinBits nStyle )
      27             : {
      28           0 :     mbUpperIn     = false;
      29           0 :     mbLowerIn     = false;
      30           0 :     mbInitialUp   = false;
      31           0 :     mbInitialDown = false;
      32             : 
      33           0 :     mnMinRange  = 0;
      34           0 :     mnMaxRange  = 100;
      35           0 :     mnValue     = 0;
      36           0 :     mnValueStep = 1;
      37             : 
      38           0 :     maRepeatTimer.SetTimeout( GetSettings().GetMouseSettings().GetButtonStartRepeat() );
      39           0 :     maRepeatTimer.SetTimeoutHdl( LINK( this, SpinButton, ImplTimeout ) );
      40             : 
      41           0 :     mbRepeat = 0 != ( nStyle & WB_REPEAT );
      42             : 
      43           0 :     if ( nStyle & WB_HSCROLL )
      44           0 :         mbHorz = true;
      45             :     else
      46           0 :         mbHorz = false;
      47             : 
      48           0 :     Control::ImplInit( pParent, nStyle, NULL );
      49           0 : }
      50             : 
      51           0 : SpinButton::SpinButton( Window* pParent, WinBits nStyle )
      52             :     :Control( WINDOW_SPINBUTTON )
      53           0 :     ,mbUpperIsFocused( false )
      54             : {
      55           0 :     ImplInit( pParent, nStyle );
      56           0 : }
      57             : 
      58           0 : SpinButton::~SpinButton()
      59             : {
      60           0 : }
      61             : 
      62           0 : IMPL_LINK( SpinButton, ImplTimeout, Timer*, pTimer )
      63             : {
      64           0 :     if ( pTimer->GetTimeout() == GetSettings().GetMouseSettings().GetButtonStartRepeat() )
      65             :     {
      66           0 :         pTimer->SetTimeout( GetSettings().GetMouseSettings().GetButtonRepeat() );
      67           0 :         pTimer->Start();
      68             :     }
      69             :     else
      70             :     {
      71           0 :         if ( mbInitialUp )
      72           0 :             Up();
      73             :         else
      74           0 :             Down();
      75             :     }
      76             : 
      77           0 :     return 0;
      78             : }
      79             : 
      80           0 : void SpinButton::Up()
      81             : {
      82           0 :     if ( ImplIsUpperEnabled() )
      83             :     {
      84           0 :         mnValue += mnValueStep;
      85           0 :         StateChanged( STATE_CHANGE_DATA );
      86             : 
      87           0 :         ImplMoveFocus( true );
      88             :     }
      89             : 
      90           0 :     ImplCallEventListenersAndHandler( VCLEVENT_SPINBUTTON_UP, maUpHdlLink, this );
      91           0 : }
      92             : 
      93           0 : void SpinButton::Down()
      94             : {
      95           0 :     if ( ImplIsLowerEnabled() )
      96             :     {
      97           0 :         mnValue -= mnValueStep;
      98           0 :         StateChanged( STATE_CHANGE_DATA );
      99             : 
     100           0 :         ImplMoveFocus( false );
     101             :     }
     102             : 
     103           0 :     ImplCallEventListenersAndHandler( VCLEVENT_SPINBUTTON_DOWN, maDownHdlLink, this );
     104           0 : }
     105             : 
     106           0 : void SpinButton::Resize()
     107             : {
     108           0 :     Control::Resize();
     109             : 
     110           0 :     Size aSize( GetOutputSizePixel() );
     111           0 :     Point aTmpPoint;
     112           0 :     Rectangle aRect( aTmpPoint, aSize );
     113           0 :     if ( mbHorz )
     114             :     {
     115           0 :         maLowerRect = Rectangle( 0, 0, aSize.Width()/2, aSize.Height()-1 );
     116           0 :         maUpperRect = Rectangle( maLowerRect.TopRight(), aRect.BottomRight() );
     117             :     }
     118             :     else
     119             :     {
     120           0 :         maUpperRect = Rectangle( 0, 0, aSize.Width()-1, aSize.Height()/2 );
     121           0 :         maLowerRect = Rectangle( maUpperRect.BottomLeft(), aRect.BottomRight() );
     122             :     }
     123             : 
     124           0 :     ImplCalcFocusRect( ImplIsUpperEnabled() || !ImplIsLowerEnabled() );
     125             : 
     126           0 :     Invalidate();
     127           0 : }
     128             : 
     129           0 : void SpinButton::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags )
     130             : {
     131           0 :     Point       aPos  = pDev->LogicToPixel( rPos );
     132           0 :     Size        aSize = pDev->LogicToPixel( rSize );
     133             : 
     134           0 :     pDev->Push();
     135           0 :     pDev->SetMapMode();
     136           0 :     if ( !(nFlags & WINDOW_DRAW_MONO) )
     137             :     {
     138             :         // DecoView uses the FaceColor...
     139           0 :         AllSettings aSettings = pDev->GetSettings();
     140           0 :         StyleSettings aStyleSettings = aSettings.GetStyleSettings();
     141           0 :         if ( IsControlBackground() )
     142           0 :             aStyleSettings.SetFaceColor( GetControlBackground() );
     143             :         else
     144           0 :             aStyleSettings.SetFaceColor( GetSettings().GetStyleSettings().GetFaceColor() );
     145             : 
     146           0 :         aSettings.SetStyleSettings( aStyleSettings );
     147           0 :         pDev->SetSettings( aSettings );
     148             :     }
     149             : 
     150           0 :     Rectangle   aRect( Point( 0, 0 ), aSize );
     151           0 :     Rectangle aLowerRect, aUpperRect;
     152           0 :     if ( mbHorz )
     153             :     {
     154           0 :         aLowerRect = Rectangle( 0, 0, aSize.Width()/2, aSize.Height()-1 );
     155           0 :         aUpperRect = Rectangle( aLowerRect.TopRight(), aRect.BottomRight() );
     156             :     }
     157             :     else
     158             :     {
     159           0 :         aUpperRect = Rectangle( 0, 0, aSize.Width()-1, aSize.Height()/2 );
     160           0 :         aLowerRect = Rectangle( aUpperRect.BottomLeft(), aRect.BottomRight() );
     161             :     }
     162             : 
     163           0 :     aUpperRect += aPos;
     164           0 :     aLowerRect += aPos;
     165             : 
     166             :     ImplDrawSpinButton( pDev, aUpperRect, aLowerRect, false, false,
     167           0 :                         IsEnabled() && ImplIsUpperEnabled(),
     168           0 :                         IsEnabled() && ImplIsLowerEnabled(), mbHorz, true );
     169           0 :     pDev->Pop();
     170           0 : }
     171             : 
     172           0 : void SpinButton::Paint( const Rectangle& )
     173             : {
     174           0 :     HideFocus();
     175             : 
     176           0 :     bool bEnable = IsEnabled();
     177             :     ImplDrawSpinButton( this, maUpperRect, maLowerRect, mbUpperIn, mbLowerIn,
     178           0 :                         bEnable && ImplIsUpperEnabled(),
     179           0 :                         bEnable && ImplIsLowerEnabled(), mbHorz, true );
     180             : 
     181           0 :     if ( HasFocus() )
     182           0 :         ShowFocus( maFocusRect );
     183           0 : }
     184             : 
     185           0 : void SpinButton::MouseButtonDown( const MouseEvent& rMEvt )
     186             : {
     187           0 :     if ( maUpperRect.IsInside( rMEvt.GetPosPixel() ) && ( ImplIsUpperEnabled() ) )
     188             :     {
     189           0 :         mbUpperIn   = true;
     190           0 :         mbInitialUp = true;
     191           0 :         Invalidate( maUpperRect );
     192             :     }
     193           0 :     else if ( maLowerRect.IsInside( rMEvt.GetPosPixel() ) && ( ImplIsLowerEnabled() ) )
     194             :     {
     195           0 :         mbLowerIn     = true;
     196           0 :         mbInitialDown = true;
     197           0 :         Invalidate( maLowerRect );
     198             :     }
     199             : 
     200           0 :     if ( mbUpperIn || mbLowerIn )
     201             :     {
     202           0 :         Update();
     203           0 :         CaptureMouse();
     204           0 :         if ( mbRepeat )
     205           0 :             maRepeatTimer.Start();
     206             :     }
     207           0 : }
     208             : 
     209           0 : void SpinButton::MouseButtonUp( const MouseEvent& )
     210             : {
     211           0 :     ReleaseMouse();
     212           0 :     if ( mbRepeat )
     213             :     {
     214           0 :         maRepeatTimer.Stop();
     215           0 :         maRepeatTimer.SetTimeout(GetSettings().GetMouseSettings().GetButtonStartRepeat() );
     216             :     }
     217             : 
     218           0 :     if ( mbUpperIn )
     219             :     {
     220           0 :         mbUpperIn   = false;
     221           0 :         Invalidate( maUpperRect );
     222           0 :         Update();
     223           0 :         Up();
     224             :     }
     225           0 :     else if ( mbLowerIn )
     226             :     {
     227           0 :         mbLowerIn = false;
     228           0 :         Invalidate( maLowerRect );
     229           0 :         Update();
     230           0 :         Down();
     231             :     }
     232             : 
     233           0 :     mbInitialUp = mbInitialDown = false;
     234           0 : }
     235             : 
     236           0 : void SpinButton::MouseMove( const MouseEvent& rMEvt )
     237             : {
     238           0 :     if ( !rMEvt.IsLeft() || (!mbInitialUp && !mbInitialDown) )
     239           0 :         return;
     240             : 
     241           0 :     if ( !maUpperRect.IsInside( rMEvt.GetPosPixel() ) &&
     242           0 :          mbUpperIn && mbInitialUp )
     243             :     {
     244           0 :         mbUpperIn = false;
     245           0 :         maRepeatTimer.Stop();
     246           0 :         Invalidate( maUpperRect );
     247           0 :         Update();
     248             :     }
     249           0 :     else if ( !maLowerRect.IsInside( rMEvt.GetPosPixel() ) &&
     250           0 :               mbLowerIn && mbInitialDown )
     251             :     {
     252           0 :         mbLowerIn = false;
     253           0 :         maRepeatTimer.Stop();
     254           0 :         Invalidate( maLowerRect );
     255           0 :         Update();
     256             :     }
     257           0 :     else if ( maUpperRect.IsInside( rMEvt.GetPosPixel() ) &&
     258           0 :               !mbUpperIn && mbInitialUp )
     259             :     {
     260           0 :         mbUpperIn = true;
     261           0 :         if ( mbRepeat )
     262           0 :             maRepeatTimer.Start();
     263           0 :         Invalidate( maUpperRect );
     264           0 :         Update();
     265             :     }
     266           0 :     else if ( maLowerRect.IsInside( rMEvt.GetPosPixel() ) &&
     267           0 :               !mbLowerIn && mbInitialDown )
     268             :     {
     269           0 :         mbLowerIn = true;
     270           0 :         if ( mbRepeat )
     271           0 :             maRepeatTimer.Start();
     272           0 :         Invalidate( maLowerRect );
     273           0 :         Update();
     274             :     }
     275             : }
     276             : 
     277           0 : void SpinButton::KeyInput( const KeyEvent& rKEvt )
     278             : {
     279           0 :     if ( !rKEvt.GetKeyCode().GetModifier() )
     280             :     {
     281           0 :         switch ( rKEvt.GetKeyCode().GetCode() )
     282             :         {
     283             :         case KEY_LEFT:
     284             :         case KEY_RIGHT:
     285             :         {
     286           0 :             bool bUp = KEY_RIGHT == rKEvt.GetKeyCode().GetCode();
     287           0 :             if ( mbHorz && !ImplMoveFocus( bUp ) )
     288           0 :                 bUp ? Up() : Down();
     289             :         }
     290           0 :         break;
     291             : 
     292             :         case KEY_UP:
     293             :         case KEY_DOWN:
     294             :         {
     295           0 :             bool bUp = KEY_UP == rKEvt.GetKeyCode().GetCode();
     296           0 :             if ( !mbHorz && !ImplMoveFocus( KEY_UP == rKEvt.GetKeyCode().GetCode() ) )
     297           0 :                 bUp ? Up() : Down();
     298             :         }
     299           0 :         break;
     300             : 
     301             :         case KEY_SPACE:
     302           0 :             mbUpperIsFocused ? Up() : Down();
     303           0 :             break;
     304             : 
     305             :         default:
     306           0 :             Control::KeyInput( rKEvt );
     307           0 :             break;
     308             :         }
     309             :     }
     310             :     else
     311           0 :         Control::KeyInput( rKEvt );
     312           0 : }
     313             : 
     314           0 : void SpinButton::StateChanged( StateChangedType nType )
     315             : {
     316           0 :     switch ( nType )
     317             :     {
     318             :     case STATE_CHANGE_DATA:
     319             :     case STATE_CHANGE_ENABLE:
     320           0 :         Invalidate();
     321           0 :         break;
     322             : 
     323             :     case STATE_CHANGE_STYLE:
     324             :     {
     325           0 :         bool bNewRepeat = 0 != ( GetStyle() & WB_REPEAT );
     326           0 :         if ( bNewRepeat != mbRepeat )
     327             :         {
     328           0 :             if ( maRepeatTimer.IsActive() )
     329             :             {
     330           0 :                 maRepeatTimer.Stop();
     331           0 :                 maRepeatTimer.SetTimeout( GetSettings().GetMouseSettings().GetButtonStartRepeat() );
     332             :             }
     333           0 :             mbRepeat = bNewRepeat;
     334             :         }
     335             : 
     336           0 :         bool bNewHorz = 0 != ( GetStyle() & WB_HSCROLL );
     337           0 :         if ( bNewHorz != mbHorz )
     338             :         {
     339           0 :             mbHorz = bNewHorz;
     340           0 :             Resize();
     341             :         }
     342             :     }
     343           0 :     break;
     344             :     }
     345             : 
     346           0 :     Control::StateChanged( nType );
     347           0 : }
     348             : 
     349           0 : void SpinButton::SetRangeMin( long nNewRange )
     350             : {
     351           0 :     SetRange( Range( nNewRange, GetRangeMax() ) );
     352           0 : }
     353             : 
     354           0 : void SpinButton::SetRangeMax( long nNewRange )
     355             : {
     356           0 :     SetRange( Range( GetRangeMin(), nNewRange ) );
     357           0 : }
     358             : 
     359           0 : void SpinButton::SetRange( const Range& rRange )
     360             : {
     361             :     // adjust rage
     362           0 :     Range aRange = rRange;
     363           0 :     aRange.Justify();
     364           0 :     long nNewMinRange = aRange.Min();
     365           0 :     long nNewMaxRange = aRange.Max();
     366             : 
     367             :     // do something only if old and new range differ
     368           0 :     if ( (mnMinRange != nNewMinRange) ||
     369           0 :          (mnMaxRange != nNewMaxRange) )
     370             :     {
     371           0 :         mnMinRange = nNewMinRange;
     372           0 :         mnMaxRange = nNewMaxRange;
     373             : 
     374             :         // adjust value to new range, if necessary
     375           0 :         if ( mnValue > mnMaxRange )
     376           0 :             mnValue = mnMaxRange;
     377           0 :         if ( mnValue < mnMinRange )
     378           0 :             mnValue = mnMinRange;
     379             : 
     380           0 :         StateChanged( STATE_CHANGE_DATA );
     381             :     }
     382           0 : }
     383             : 
     384           0 : void SpinButton::SetValue( long nValue )
     385             : {
     386             :     // adjust, if necessary
     387           0 :     if ( nValue > mnMaxRange )
     388           0 :         nValue = mnMaxRange;
     389           0 :     if ( nValue < mnMinRange )
     390           0 :         nValue = mnMinRange;
     391             : 
     392           0 :     if ( mnValue != nValue )
     393             :     {
     394           0 :         mnValue = nValue;
     395           0 :         StateChanged( STATE_CHANGE_DATA );
     396             :     }
     397           0 : }
     398             : 
     399           0 : void SpinButton::GetFocus()
     400             : {
     401           0 :     ShowFocus( maFocusRect );
     402           0 :     Control::GetFocus();
     403           0 : }
     404             : 
     405           0 : void SpinButton::LoseFocus()
     406             : {
     407           0 :     HideFocus();
     408           0 :     Control::LoseFocus();
     409           0 : }
     410             : 
     411           0 : bool SpinButton::ImplMoveFocus( bool _bUpper )
     412             : {
     413           0 :     if ( _bUpper == mbUpperIsFocused )
     414           0 :         return false;
     415             : 
     416           0 :     HideFocus();
     417           0 :     ImplCalcFocusRect( _bUpper );
     418           0 :     if ( HasFocus() )
     419           0 :         ShowFocus( maFocusRect );
     420           0 :     return true;
     421             : }
     422             : 
     423           0 : void SpinButton::ImplCalcFocusRect( bool _bUpper )
     424             : {
     425           0 :     maFocusRect = _bUpper ? maUpperRect : maLowerRect;
     426             :     // inflate by some pixels
     427           0 :     maFocusRect.Left() += 2;
     428           0 :     maFocusRect.Top() += 2;
     429           0 :     maFocusRect.Right() -= 2;
     430           0 :     maFocusRect.Bottom() -= 2;
     431           0 :     mbUpperIsFocused = _bUpper;
     432           0 : }
     433             : 
     434           0 : Rectangle* SpinButton::ImplFindPartRect( const Point& rPt )
     435             : {
     436           0 :     if( maUpperRect.IsInside( rPt ) )
     437           0 :         return &maUpperRect;
     438           0 :     else if( maLowerRect.IsInside( rPt ) )
     439           0 :         return &maLowerRect;
     440             :     else
     441           0 :         return NULL;
     442             : }
     443             : 
     444           0 : bool SpinButton::PreNotify( NotifyEvent& rNEvt )
     445             : {
     446           0 :     const MouseEvent* pMouseEvt = NULL;
     447             : 
     448           0 :     if( (rNEvt.GetType() == EVENT_MOUSEMOVE) && (pMouseEvt = rNEvt.GetMouseEvent()) != NULL )
     449             :     {
     450           0 :         if( !pMouseEvt->GetButtons() && !pMouseEvt->IsSynthetic() && !pMouseEvt->IsModifierChanged() )
     451             :         {
     452             :             // trigger redraw if mouse over state has changed
     453           0 :             if( IsNativeControlSupported(CTRL_SPINBOX, PART_ENTIRE_CONTROL) ||
     454           0 :                 IsNativeControlSupported(CTRL_SPINBOX, PART_ALL_BUTTONS) )
     455             :             {
     456           0 :                 Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
     457           0 :                 Rectangle* pLastRect = ImplFindPartRect( GetLastPointerPosPixel() );
     458           0 :                 if( pRect != pLastRect || (pMouseEvt->IsLeaveWindow() || pMouseEvt->IsEnterWindow()) )
     459             :                 {
     460           0 :                     Region aRgn( GetActiveClipRegion() );
     461           0 :                     if( pLastRect )
     462             :                     {
     463           0 :                         SetClipRegion(Region(*pLastRect));
     464           0 :                         Paint( *pLastRect );
     465           0 :                         SetClipRegion( aRgn );
     466             :                     }
     467           0 :                     if( pRect )
     468             :                     {
     469           0 :                         SetClipRegion(Region(*pRect));
     470           0 :                         Paint( *pRect );
     471           0 :                         SetClipRegion( aRgn );
     472           0 :                     }
     473             :                 }
     474             :             }
     475             :         }
     476             :     }
     477             : 
     478           0 :     return Control::PreNotify(rNEvt);
     479             : }
     480             : 
     481             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10