tdf#155241 keep current MetricSpinButton value if unparseable junk input

Change-Id: I0f13c9ae25c1788924fd81ed77307e96400f6220
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151677
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/include/vcl/formatter.hxx b/include/vcl/formatter.hxx
index 2049d1e..4aa81ea 100644
--- a/include/vcl/formatter.hxx
+++ b/include/vcl/formatter.hxx
@@ -117,6 +117,7 @@ protected:
    bool                m_bAutoColor : 1;
    bool                m_bEnableNaN : 1;
    bool                m_bDisableRemainderFactor : 1;
    bool                m_bDefaultValueSet : 1;
    enum valueState { valueDirty, valueString, valueDouble };
    valueState          m_ValueState;
    double              m_dCurrentValue;
@@ -181,7 +182,7 @@ public:
    void    EnableEmptyField(bool bEnable);
    // If disabled, the value will be reset to the last valid value on leave

    void    SetDefaultValue(double dDefault)    { m_dDefaultValue = dDefault; m_ValueState = valueDirty; }
    void    SetDefaultValue(double dDefault)    { m_dDefaultValue = dDefault; m_ValueState = valueDirty; m_bDefaultValueSet = true; }
    // If the current String is invalid, GetValue() returns this value
    double  GetDefaultValue() const             { return m_dDefaultValue; }

diff --git a/vcl/source/control/fmtfield.cxx b/vcl/source/control/fmtfield.cxx
index ed73acc..de57132 100644
--- a/vcl/source/control/fmtfield.cxx
+++ b/vcl/source/control/fmtfield.cxx
@@ -266,6 +266,7 @@ Formatter::Formatter()
    ,m_bAutoColor(false)
    ,m_bEnableNaN(false)
    ,m_bDisableRemainderFactor(false)
    ,m_bDefaultValueSet(false)
    ,m_ValueState(valueDirty)
    ,m_dCurrentValue(0)
    ,m_dDefaultValue(0)
@@ -791,7 +792,11 @@ bool Formatter::ImplGetValue(double& dNewVal)
    if (m_ValueState == valueDouble)
        return true;

    dNewVal = m_dDefaultValue;
    // tdf#155241 default to m_dDefaultValue only if explicitly set
    // otherwise default to m_dCurrentValue
    if (m_bDefaultValueSet)
        dNewVal = m_dDefaultValue;

    OUString sText(GetEntryText());
    if (sText.isEmpty())
        return true;
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 0106507..adea2d9 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -17494,6 +17494,11 @@ public:
        m_aCustomFont.use_custom_font(&rFont, u"spinbutton");
    }

    void set_update_policy_if_valid()
    {
        gtk_spin_button_set_update_policy(m_pButton, GTK_UPDATE_IF_VALID);
    }

    virtual void disable_notify_events() override
    {
        g_signal_handler_block(m_pButton, m_nValueChangedSignalId);
@@ -24323,7 +24328,13 @@ public:

    virtual std::unique_ptr<weld::MetricSpinButton> weld_metric_spin_button(const OUString& id, FieldUnit eUnit) override
    {
        return std::make_unique<weld::MetricSpinButton>(weld_spin_button(id), eUnit);
        std::unique_ptr<weld::SpinButton> xButton(weld_spin_button(id));
        if (xButton)
        {
            GtkInstanceSpinButton& rButton = dynamic_cast<GtkInstanceSpinButton&>(*xButton);
            rButton.set_update_policy_if_valid();
        }
        return std::make_unique<weld::MetricSpinButton>(std::move(xButton), eUnit);
    }

    virtual std::unique_ptr<weld::FormattedSpinButton> weld_formatted_spin_button(const OUString &id) override