include/vcl/toolkit/spinfld.hxx |    9 ++++++++-
 vcl/source/control/fmtfield.cxx |    7 +++++++
 vcl/source/control/spinfld.cxx  |   31 +++++++++++++++++++++++++++++--
 3 files changed, 44 insertions(+), 3 deletions(-)

New commits:
commit 2896c5dad1799addd72b626d93d7e89b1cf19ff6
Author:     Caolán McNamara <[email protected]>
AuthorDate: Sun May 29 21:25:09 2022 +0100
Commit:     Caolán McNamara <[email protected]>
CommitDate: Mon May 30 10:17:07 2022 +0200

    Related: tdf#89131 draw up/down spins disabled if value is at max/min
    
    if there is a max/min set.
    
    Change-Id: I2dc7ccccad9ec2aa7eb89d8b5fa137e077a846fd
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/135105
    Tested-by: Caolán McNamara <[email protected]>
    Reviewed-by: Caolán McNamara <[email protected]>

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)

Reply via email to