tdf#138271 send value-changed on FormattedSpinButton losing focus

Change-Id: Iaa6882f41ee756b0645818694f6942d90243ba13
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106049
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index caf7a5f..e866997 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -5486,6 +5486,10 @@ class SalInstanceFormattedSpinButton : public SalInstanceEntry,
private:
    VclPtr<FormattedField> m_xButton;
    weld::EntryFormatter* m_pFormatter;
    Link<weld::Widget&, void> m_aLoseFocusHdl;

    DECL_LINK(UpDownHdl, SpinField&, void);
    DECL_LINK(LoseFocusHdl, Control&, void);

public:
    SalInstanceFormattedSpinButton(FormattedField* pButton, SalInstanceBuilder* pBuilder,
@@ -5494,6 +5498,9 @@ public:
        , m_xButton(pButton)
        , m_pFormatter(nullptr)
    {
        m_xButton->SetUpHdl(LINK(this, SalInstanceFormattedSpinButton, UpDownHdl));
        m_xButton->SetDownHdl(LINK(this, SalInstanceFormattedSpinButton, UpDownHdl));
        m_xButton->SetLoseFocusHdl(LINK(this, SalInstanceFormattedSpinButton, LoseFocusHdl));
    }

    virtual void set_text(const OUString& rText) override
@@ -5517,7 +5524,7 @@ public:
    {
        if (!m_pFormatter) // once a formatter is set, it takes over "focus-out"
        {
            SalInstanceEntry::connect_focus_out(rLink);
            m_aLoseFocusHdl = rLink;
            return;
        }
        m_pFormatter->connect_focus_out(rLink);
@@ -5548,8 +5555,23 @@ public:
    {
        return m_xButton->GetFormatter();
    }

    virtual ~SalInstanceFormattedSpinButton() override
    {
        m_xButton->SetLoseFocusHdl(Link<Control&, void>());
        m_xButton->SetDownHdl(Link<SpinField&, void>());
        m_xButton->SetUpHdl(Link<SpinField&, void>());
    }
};

IMPL_LINK_NOARG(SalInstanceFormattedSpinButton, UpDownHdl, SpinField&, void) { signal_value_changed(); }

IMPL_LINK_NOARG(SalInstanceFormattedSpinButton, LoseFocusHdl, Control&, void)
{
    signal_value_changed();
    m_aLoseFocusHdl.Call(*this);
}

}

SalInstanceLabel::SalInstanceLabel(Control* pLabel, SalInstanceBuilder* pBuilder,