diff options
-rw-r--r-- | include/vcl/toolkit/spinfld.hxx | 9 | ||||
-rw-r--r-- | vcl/source/control/fmtfield.cxx | 7 | ||||
-rw-r--r-- | vcl/source/control/spinfld.cxx | 31 |
3 files changed, 44 insertions, 3 deletions
diff --git a/include/vcl/toolkit/spinfld.hxx b/include/vcl/toolkit/spinfld.hxx index f6de1202a45d..d82348bd44bb 100644 --- a/include/vcl/toolkit/spinfld.hxx +++ b/include/vcl/toolkit/spinfld.hxx @@ -61,6 +61,11 @@ public: virtual FactoryFunction GetUITestFactory() const override; + SAL_DLLPRIVATE void SetUpperEnabled(bool bEnabled); + SAL_DLLPRIVATE void SetLowerEnabled(bool bEnabled); + SAL_DLLPRIVATE bool IsUpperEnabled() const { return mbUpperEnabled; } + SAL_DLLPRIVATE bool IsLowerEnabled() const { return mbLowerEnabled; } + protected: tools::Rectangle maUpperRect; tools::Rectangle maLowerRect; @@ -91,7 +96,9 @@ private: mbInitialDown:1, mbUpperIn:1, mbLowerIn:1, - mbInDropDown:1; + mbInDropDown:1, + mbUpperEnabled:1, + mbLowerEnabled:1; }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/control/fmtfield.cxx b/vcl/source/control/fmtfield.cxx index c07b7e3ab3c5..3aee3317c829 100644 --- a/vcl/source/control/fmtfield.cxx +++ b/vcl/source/control/fmtfield.cxx @@ -922,6 +922,13 @@ namespace { m_rSpinButton.SpinField::Modify(); } + + virtual void UpdateCurrentValue(double dCurrentValue) override + { + Formatter::UpdateCurrentValue(dCurrentValue); + m_rSpinButton.SetUpperEnabled(!m_bHasMax || dCurrentValue < m_dMaxValue); + m_rSpinButton.SetLowerEnabled(!m_bHasMin || dCurrentValue > m_dMinValue); + } }; class DoubleNumericFormatter : public FieldFormatter diff --git a/vcl/source/control/spinfld.cxx b/vcl/source/control/spinfld.cxx index 8db25dfbc699..6bc1fac297a9 100644 --- a/vcl/source/control/spinfld.cxx +++ b/vcl/source/control/spinfld.cxx @@ -298,6 +298,8 @@ void SpinField::ImplInitSpinFieldData() mbInitialUp = false; mbInitialDown = false; mbInDropDown = false; + mbUpperEnabled = true; + mbLowerEnabled = true; } void SpinField::ImplInit(vcl::Window* pParent, WinBits nWinStyle) @@ -578,13 +580,38 @@ void SpinField::FillLayoutData() const Edit::FillLayoutData(); } +void SpinField::SetUpperEnabled(bool bEnabled) +{ + if (mbUpperEnabled == bEnabled) + return; + + mbUpperEnabled = bEnabled; + + if (mbSpin) + Invalidate(maUpperRect); +} + +void SpinField::SetLowerEnabled(bool bEnabled) +{ + if (mbLowerEnabled == bEnabled) + return; + + mbLowerEnabled = bEnabled; + + if (mbSpin) + Invalidate(maLowerRect); +} + void SpinField::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) { if (mbSpin) { - bool bEnable = IsEnabled(); + bool bEnabled = IsEnabled(); + bool bUpperEnabled = bEnabled && IsUpperEnabled(); + bool bLowerEnabled = bEnabled && IsLowerEnabled(); ImplDrawSpinButton(rRenderContext, this, maUpperRect, maLowerRect, - mbUpperIn, mbLowerIn, bEnable, bEnable); + mbUpperIn && bUpperEnabled, mbLowerIn && bLowerEnabled, + bUpperEnabled, bLowerEnabled); } if (GetStyle() & WB_DROPDOWN) |