Kaydet (Commit) ef934abf authored tarafından Tomaž Vajngerl's avatar Tomaž Vajngerl

support linking a Slider with a NumericField

Change-Id: I5cfd28d278cc21884eb9bf1b0e5a619c871f6bd2
üst 60ef5920
......@@ -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; }
......
......@@ -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 );
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment