diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2015-05-23 18:50:55 +0900 |
---|---|---|
committer | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2015-05-23 18:55:40 +0900 |
commit | ef934abf7d222035e4261474c322de603bd001da (patch) | |
tree | a84b2295ebbc97ccc0a8c0a2d273f31366afa1c8 | |
parent | 60ef5920d3ad89e0839f26488481ded8157ebbe9 (diff) |
support linking a Slider with a NumericField
Change-Id: I5cfd28d278cc21884eb9bf1b0e5a619c871f6bd2
-rw-r--r-- | include/vcl/slider.hxx | 10 | ||||
-rw-r--r-- | vcl/source/control/slider.cxx | 43 |
2 files changed, 51 insertions, 2 deletions
diff --git a/include/vcl/slider.hxx b/include/vcl/slider.hxx index a3d3fdbea427..9a96f3a4462e 100644 --- a/include/vcl/slider.hxx +++ b/include/vcl/slider.hxx @@ -23,6 +23,7 @@ #include <vcl/dllapi.h> #include <vcl/ctrl.hxx> #include <vcl/scrbar.hxx> +#include <vcl/field.hxx> class VCL_DLLPUBLIC Slider : public Control { @@ -51,9 +52,14 @@ private: ScrollType meScrollType; bool mbCalcSize; bool mbFullDrag; + + NumericField* mpLinkedField; + Link<> maSlideHdl; Link<> maEndSlideHdl; + DECL_LINK(LinkedFieldModifyHdl, NumericField*); + using Control::ImplInitSettings; using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( vcl::Window* pParent, WinBits nStyle ); @@ -70,6 +76,8 @@ private: SAL_DLLPRIVATE void ImplDoMouseAction( const Point& rPos, bool bCallAction = true ); SAL_DLLPRIVATE long ImplDoSlide( long nNewPos ); SAL_DLLPRIVATE long ImplDoSlideAction( ScrollType eScrollType ); + SAL_DLLPRIVATE void ImplSetFieldLink(const Link<>& rLink); + SAL_DLLPRIVATE void ImplUpdateLinkedField(); public: Slider( vcl::Window* pParent, WinBits nStyle = WB_HORZ ); @@ -108,6 +116,8 @@ public: Size CalcWindowSizePixel(); + void SetLinkedField(NumericField* pField); + void SetSlideHdl( const Link<>& rLink ) { maSlideHdl = rLink; } const Link<>& GetSlideHdl() const { return maSlideHdl; } void SetEndSlideHdl( const Link<>& rLink ) { maEndSlideHdl = rLink; } diff --git a/vcl/source/control/slider.cxx b/vcl/source/control/slider.cxx index fb566e892cd9..4aa94ad8b427 100644 --- a/vcl/source/control/slider.cxx +++ b/vcl/source/control/slider.cxx @@ -68,6 +68,8 @@ void Slider::ImplInit( vcl::Window* pParent, WinBits nStyle ) mbCalcSize = true; mbFullDrag = true; + mpLinkedField = nullptr; + Control::ImplInit( pParent, nStyle, NULL ); ImplInitSettings(); @@ -75,7 +77,7 @@ void Slider::ImplInit( vcl::Window* pParent, WinBits nStyle ) } Slider::Slider( vcl::Window* pParent, WinBits nStyle ) : - Control( WINDOW_SLIDER ) + Control(WINDOW_SLIDER) { ImplInit( pParent, nStyle ); } @@ -211,6 +213,34 @@ void Slider::ImplUpdateRects( bool bUpdate ) } } +void Slider::ImplSetFieldLink(const Link<>& rLink) +{ + if (mpLinkedField != nullptr) + { + mpLinkedField->SetModifyHdl(rLink); + mpLinkedField->SetUpHdl(rLink); + mpLinkedField->SetDownHdl(rLink); + mpLinkedField->SetFirstHdl(rLink); + mpLinkedField->SetLastHdl(rLink); + mpLinkedField->SetLoseFocusHdl(rLink); + } +} + +void Slider::ImplUpdateLinkedField() +{ + if (mpLinkedField) + mpLinkedField->SetValue(mnThumbPos); +} + +IMPL_LINK(Slider, LinkedFieldModifyHdl, NumericField*, pField) +{ + if (pField) + { + SetThumbPos(pField->GetValue()); + } + return 0; +} + long Slider::ImplCalcThumbPos( long nPixPos ) { // calculate position @@ -762,6 +792,7 @@ void Slider::Tracking( const TrackingEvent& rTEvt ) { ImplUpdateRects(); Update(); + ImplUpdateLinkedField(); if ( mbFullDrag && (nOldPos != mnThumbPos) ) { mnDelta = mnThumbPos-nOldPos; @@ -839,6 +870,13 @@ void Slider::Resize() Invalidate(); } +void Slider::SetLinkedField(NumericField* pField) +{ + ImplSetFieldLink(Link<>()); + mpLinkedField = pField; + ImplSetFieldLink(LINK(this, Slider, LinkedFieldModifyHdl)); +} + void Slider::RequestHelp( const HelpEvent& rHEvt ) { Control::RequestHelp( rHEvt ); @@ -947,7 +985,7 @@ void Slider::SetRange( const Range& rRange ) mnThumbPos = mnMaxRange; if ( mnThumbPos < mnMinRange ) mnThumbPos = mnMinRange; - + ImplUpdateLinkedField(); StateChanged( StateChangedType::Data ); } } @@ -962,6 +1000,7 @@ void Slider::SetThumbPos( long nNewThumbPos ) if ( mnThumbPos != nNewThumbPos ) { mnThumbPos = nNewThumbPos; + ImplUpdateLinkedField(); StateChanged( StateChangedType::Data ); } } |