[Libreoffice-commits] core.git: framework/inc framework/source solenv/sanitizers svtools/uiconfig svtools/UIConfig_svt.mk

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Fri Jun 26 13:44:48 UTC 2020


 framework/inc/uielement/spinfieldtoolbarcontroller.hxx    |    4 
 framework/source/uielement/spinfieldtoolbarcontroller.cxx |  249 ++++++--------
 solenv/sanitizers/ui/svt.suppr                            |    1 
 svtools/UIConfig_svt.mk                                   |    1 
 svtools/uiconfig/ui/spinfieldcontrol.ui                   |   29 +
 5 files changed, 146 insertions(+), 138 deletions(-)

New commits:
commit 07875e36f7f8aab16e5a1e5e78c189e572d57bf8
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Thu Jun 25 21:24:03 2020 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Fri Jun 26 15:44:11 2020 +0200

    weld SpinfieldControl
    
    Change-Id: I1696105ead648c86076f05f50f6286e9a3a932d4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97218
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/framework/inc/uielement/spinfieldtoolbarcontroller.hxx b/framework/inc/uielement/spinfieldtoolbarcontroller.hxx
index 8445110b896b..3e2af6c78719 100644
--- a/framework/inc/uielement/spinfieldtoolbarcontroller.hxx
+++ b/framework/inc/uielement/spinfieldtoolbarcontroller.hxx
@@ -56,14 +56,14 @@ class SpinfieldToolbarController final : public ComplexToolbarController
         void Modify();
         void GetFocus();
         void LoseFocus();
-        bool PreNotify( NotifyEvent const & rNEvt );
+        void Activate();
 
+        OUString FormatOutputString(double fValue);
     private:
         virtual void executeControlCommand( const css::frame::ControlCommand& rControlCommand ) override;
         virtual css::uno::Sequence< css::beans::PropertyValue> getExecuteArgs(sal_Int16 KeyModifier) const override;
 
         bool impl_getValue( const css::uno::Any& rAny, sal_Int32& nValue, double& fValue, bool& bFloat );
-        OUString impl_formatOutputString( double fValue );
 
         bool              m_bFloat,
                           m_bMaxSet,
diff --git a/framework/source/uielement/spinfieldtoolbarcontroller.cxx b/framework/source/uielement/spinfieldtoolbarcontroller.cxx
index db3f9d67781c..1dad7b918683 100644
--- a/framework/source/uielement/spinfieldtoolbarcontroller.cxx
+++ b/framework/source/uielement/spinfieldtoolbarcontroller.cxx
@@ -26,8 +26,8 @@
 #include <com/sun/star/beans/PropertyValue.hpp>
 
 #include <svtools/toolboxcontroller.hxx>
+#include <vcl/InterimItemWindow.hxx>
 #include <vcl/event.hxx>
-#include <vcl/spinfld.hxx>
 #include <vcl/svapp.hxx>
 #include <vcl/toolbox.hxx>
 #include <o3tl/char16_t2wchar_t.hxx>
@@ -46,101 +46,135 @@ namespace framework
 // Unfortunaltly the events are notified through virtual methods instead
 // of Listeners.
 
-class SpinfieldControl : public SpinField
+class SpinfieldControl final : public InterimItemWindow
 {
-    public:
-        SpinfieldControl( vcl::Window* pParent, WinBits nStyle, SpinfieldToolbarController* pSpinfieldToolbarController );
-        virtual ~SpinfieldControl() override;
-        virtual void dispose() override;
-
-        virtual void Up() override;
-        virtual void Down() override;
-        virtual void First() override;
-        virtual void Last() override;
-        virtual void Modify() override;
-        virtual void GetFocus() override;
-        virtual void LoseFocus() override;
-        virtual bool PreNotify( NotifyEvent& rNEvt ) override;
-
-    private:
-        SpinfieldToolbarController* m_pSpinfieldToolbarController;
-};
+public:
+    SpinfieldControl(vcl::Window* pParent, SpinfieldToolbarController* pSpinfieldToolbarController);
+    virtual ~SpinfieldControl() override;
+    virtual void dispose() override;
 
-SpinfieldControl::SpinfieldControl( vcl::Window* pParent, WinBits nStyle, SpinfieldToolbarController* pSpinfieldToolbarController ) :
-    SpinField( pParent, nStyle )
-    , m_pSpinfieldToolbarController( pSpinfieldToolbarController )
-{
-}
+    void set_value(double fValue);
 
-SpinfieldControl::~SpinfieldControl()
+    void set_digits(int nDigits)
+    {
+        m_xWidget->set_digits(nDigits);
+    }
+
+    void set_min(double fMin)
+    {
+        m_xWidget->set_min(fMin);
+    }
+
+    void set_max(double fMax)
+    {
+        m_xWidget->set_max(fMax);
+    }
+
+    void set_step(double fStep)
+    {
+        m_xWidget->set_increments(fStep, fStep * 10);
+    }
+
+    OUString get_entry_text() const { return m_xWidget->get_text(); }
+
+    DECL_LINK(ValueChangedHdl, weld::FormattedSpinButton&, void);
+    DECL_LINK(FormatOutputHdl, weld::FormattedSpinButton&, void);
+    DECL_LINK(ParseInputHdl, double*, bool);
+    DECL_LINK(ModifyHdl, weld::Entry&, void);
+    DECL_LINK(ActivateHdl, weld::Entry&, bool);
+    DECL_LINK(FocusInHdl, weld::Widget&, void);
+    DECL_LINK(FocusOutHdl, weld::Widget&, void);
+
+private:
+    std::unique_ptr<weld::FormattedSpinButton> m_xWidget;
+    SpinfieldToolbarController* m_pSpinfieldToolbarController;
+};
+
+SpinfieldControl::SpinfieldControl(vcl::Window* pParent, SpinfieldToolbarController* pSpinfieldToolbarController)
+    : InterimItemWindow(pParent, "svt/ui/spinfieldcontrol.ui", "SpinFieldControl")
+    , m_xWidget(m_xBuilder->weld_formatted_spin_button("spinbutton"))
+    , m_pSpinfieldToolbarController(pSpinfieldToolbarController)
 {
-    disposeOnce();
+    m_xWidget->connect_focus_in(LINK(this, SpinfieldControl, FocusInHdl));
+    m_xWidget->connect_focus_out(LINK(this, SpinfieldControl, FocusOutHdl));
+    m_xWidget->connect_value_changed(LINK(this, SpinfieldControl, ValueChangedHdl));
+    m_xWidget->connect_output(LINK(this, SpinfieldControl, FormatOutputHdl));
+    m_xWidget->connect_input(LINK(this, SpinfieldControl, ParseInputHdl));
+    m_xWidget->connect_changed(LINK(this, SpinfieldControl, ModifyHdl));
+    m_xWidget->connect_activate(LINK(this, SpinfieldControl, ActivateHdl));
+
+    // so a later narrow size request can stick
+    m_xWidget->set_width_chars(3);
+    m_xWidget->set_size_request(42, -1);
+
+    SetSizePixel(get_preferred_size());
 }
 
-void SpinfieldControl::dispose()
+void SpinfieldControl::set_value(double fValue)
 {
-    m_pSpinfieldToolbarController = nullptr;
-    SpinField::dispose();
+    OUString aOutString = m_pSpinfieldToolbarController->FormatOutputString(fValue);
+    m_xWidget->set_value(fValue);
+    m_xWidget->set_text(aOutString);
+    m_pSpinfieldToolbarController->Modify();
 }
 
-void SpinfieldControl::Up()
+IMPL_LINK(SpinfieldControl, ParseInputHdl, double*, result, bool)
 {
-    SpinField::Up();
-    if ( m_pSpinfieldToolbarController )
-        m_pSpinfieldToolbarController->Up();
+    *result = m_xWidget->get_text().toDouble();
+    return true;
 }
 
-void SpinfieldControl::Down()
+SpinfieldControl::~SpinfieldControl()
 {
-    SpinField::Down();
-    if ( m_pSpinfieldToolbarController )
-        m_pSpinfieldToolbarController->Down();
+    disposeOnce();
 }
 
-void SpinfieldControl::First()
+void SpinfieldControl::dispose()
 {
-    SpinField::First();
-    if ( m_pSpinfieldToolbarController )
-        m_pSpinfieldToolbarController->First();
+    m_pSpinfieldToolbarController = nullptr;
+    m_xWidget.reset();
+    InterimItemWindow::dispose();
 }
 
-void SpinfieldControl::Last()
+IMPL_LINK_NOARG(SpinfieldControl, ValueChangedHdl, weld::FormattedSpinButton&, void)
 {
-    SpinField::First();
-    if ( m_pSpinfieldToolbarController )
-        m_pSpinfieldToolbarController->Last();
+    if (m_pSpinfieldToolbarController)
+        m_pSpinfieldToolbarController->execute(0);
 }
 
-void SpinfieldControl::Modify()
+IMPL_LINK_NOARG(SpinfieldControl, ModifyHdl, weld::Entry&, void)
 {
-    SpinField::Modify();
-    if ( m_pSpinfieldToolbarController )
+    if (m_pSpinfieldToolbarController)
         m_pSpinfieldToolbarController->Modify();
 }
 
-void SpinfieldControl::GetFocus()
+IMPL_LINK_NOARG(SpinfieldControl, FocusInHdl, weld::Widget&, void)
 {
-    SpinField::GetFocus();
-    if ( m_pSpinfieldToolbarController )
+    if (m_pSpinfieldToolbarController)
         m_pSpinfieldToolbarController->GetFocus();
 }
 
-void SpinfieldControl::LoseFocus()
+IMPL_LINK_NOARG(SpinfieldControl, FocusOutHdl, weld::Widget&, void)
 {
-    SpinField::LoseFocus();
-    if ( m_pSpinfieldToolbarController )
+    if (m_pSpinfieldToolbarController)
         m_pSpinfieldToolbarController->LoseFocus();
 }
 
-bool SpinfieldControl::PreNotify( NotifyEvent& rNEvt )
+IMPL_LINK_NOARG(SpinfieldControl, ActivateHdl, weld::Entry&, bool)
 {
-    bool bRet = false;
-    if ( m_pSpinfieldToolbarController )
-        bRet = m_pSpinfieldToolbarController->PreNotify( rNEvt );
-    if ( !bRet )
-        bRet = SpinField::PreNotify( rNEvt );
+    bool bConsumed = false;
+    if (m_pSpinfieldToolbarController)
+    {
+        m_pSpinfieldToolbarController->Activate();
+        bConsumed = true;
+    }
+    return bConsumed;
+}
 
-    return bRet;
+IMPL_LINK_NOARG(SpinfieldControl, FormatOutputHdl, weld::FormattedSpinButton&, void)
+{
+    OUString aText = m_pSpinfieldToolbarController->FormatOutputString(m_xWidget->get_value());
+    m_xWidget->set_text(aText);
 }
 
 SpinfieldToolbarController::SpinfieldToolbarController(
@@ -160,12 +194,12 @@ SpinfieldToolbarController::SpinfieldToolbarController(
     ,   m_nStep( 0.0 )
     ,   m_pSpinfieldControl( nullptr )
 {
-    m_pSpinfieldControl = VclPtr<SpinfieldControl>::Create( m_xToolbar, WB_SPIN|WB_BORDER, this );
+    m_pSpinfieldControl = VclPtr<SpinfieldControl>::Create(m_xToolbar, this);
     if ( nWidth == 0 )
         nWidth = 100;
 
-    // Calculate height of the spin field according to the application font height
-    sal_Int32 nHeight = getFontSizePixel( m_pSpinfieldControl ) + 5 + 1;
+    // SpinFieldControl ctor has set a suitable height already
+    auto nHeight = m_pSpinfieldControl->GetSizePixel().Height();
 
     m_pSpinfieldControl->SetSizePixel( ::Size( nWidth, nHeight ));
     m_xToolbar->SetItemWindow( m_nID, m_pSpinfieldControl );
@@ -188,7 +222,7 @@ void SAL_CALL SpinfieldToolbarController::dispose()
 Sequence<PropertyValue> SpinfieldToolbarController::getExecuteArgs(sal_Int16 KeyModifier) const
 {
     Sequence<PropertyValue> aArgs( 2 );
-    OUString aSpinfieldText = m_pSpinfieldControl->GetText();
+    OUString aSpinfieldText = m_pSpinfieldControl->get_entry_text();
 
     // Add key modifier to argument list
     aArgs[0].Name = "KeyModifier";
@@ -201,59 +235,9 @@ Sequence<PropertyValue> SpinfieldToolbarController::getExecuteArgs(sal_Int16 Key
     return aArgs;
 }
 
-void SpinfieldToolbarController::Up()
-{
-    double nValue = m_nValue + m_nStep;
-    if ( m_bMaxSet && nValue > m_nMax )
-        return;
-
-    m_nValue = nValue;
-
-    OUString aText = impl_formatOutputString( m_nValue );
-    m_pSpinfieldControl->SetText( aText );
-    execute( 0 );
-}
-
-void SpinfieldToolbarController::Down()
-{
-    double nValue = m_nValue - m_nStep;
-    if ( m_bMinSet && nValue < m_nMin )
-        return;
-
-    m_nValue = nValue;
-
-    OUString aText = impl_formatOutputString( m_nValue );
-    m_pSpinfieldControl->SetText( aText );
-    execute( 0 );
-}
-
-void SpinfieldToolbarController::First()
-{
-    if ( m_bMinSet )
-    {
-        m_nValue = m_nMin;
-
-        OUString aText = impl_formatOutputString( m_nValue );
-        m_pSpinfieldControl->SetText( aText );
-        execute( 0 );
-    }
-}
-
-void SpinfieldToolbarController::Last()
-{
-    if ( m_bMaxSet )
-    {
-        m_nValue = m_nMax;
-
-        OUString aText = impl_formatOutputString( m_nValue );
-        m_pSpinfieldControl->SetText( aText );
-        execute( 0 );
-    }
-}
-
 void SpinfieldToolbarController::Modify()
 {
-    notifyTextChanged( m_pSpinfieldControl->GetText() );
+    notifyTextChanged(m_pSpinfieldControl->get_entry_text());
 }
 
 void SpinfieldToolbarController::GetFocus()
@@ -266,22 +250,11 @@ void SpinfieldToolbarController::LoseFocus()
     notifyFocusLost();
 }
 
-bool SpinfieldToolbarController::PreNotify( NotifyEvent const & rNEvt )
+void SpinfieldToolbarController::Activate()
 {
-    if( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
-    {
-        const ::KeyEvent* pKeyEvent = rNEvt.GetKeyEvent();
-        const vcl::KeyCode& rKeyCode = pKeyEvent->GetKeyCode();
-        if(( rKeyCode.GetModifier() | rKeyCode.GetCode()) == KEY_RETURN )
-        {
-            // Call execute only with non-empty text
-            if ( !m_pSpinfieldControl->GetText().isEmpty() )
-                execute( rKeyCode.GetModifier() );
-            return true;
-        }
-    }
-
-    return false;
+    // Call execute only with non-empty text
+    if (!m_pSpinfieldControl->get_entry_text().isEmpty())
+        execute(0);
 }
 
 void SpinfieldToolbarController::executeControlCommand( const css::frame::ControlCommand& rControlCommand )
@@ -404,27 +377,31 @@ void SpinfieldToolbarController::executeControlCommand( const css::frame::Contro
     }
 
     // Check values and set members
+    if (bFloatValue)
+        m_pSpinfieldControl->set_digits(2);
     if ( !aValue.isEmpty() )
     {
         m_bFloat = bFloatValue;
         m_nValue = aValue.toDouble();
-
-        OUString aOutString = impl_formatOutputString( m_nValue );
-        m_pSpinfieldControl->SetText( aOutString );
-        notifyTextChanged( aOutString );
+        m_pSpinfieldControl->set_value(m_nValue);
     }
     if ( !aMax.isEmpty() )
     {
         m_nMax = aMax.toDouble();
+        m_pSpinfieldControl->set_max(m_nMax);
         m_bMaxSet = true;
     }
     if ( !aMin.isEmpty() )
     {
         m_nMin = aMin.toDouble();
+        m_pSpinfieldControl->set_min(m_nMin);
         m_bMinSet = true;
     }
     if ( !aStep.isEmpty() )
+    {
         m_nStep = aStep.toDouble();
+        m_pSpinfieldControl->set_step(m_nStep);
+    }
 }
 
 bool SpinfieldToolbarController::impl_getValue(
@@ -450,7 +427,7 @@ bool SpinfieldToolbarController::impl_getValue(
     return bValueValid;
 }
 
-OUString SpinfieldToolbarController::impl_formatOutputString( double fValue )
+OUString SpinfieldToolbarController::FormatOutputString( double fValue )
 {
     if ( m_aOutFormat.isEmpty() )
     {
diff --git a/solenv/sanitizers/ui/svt.suppr b/solenv/sanitizers/ui/svt.suppr
index cf9087586f97..13660186f664 100644
--- a/solenv/sanitizers/ui/svt.suppr
+++ b/solenv/sanitizers/ui/svt.suppr
@@ -26,3 +26,4 @@ svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_extension_install']
 svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_opengl'] orphan-label
 svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_skia'] orphan-label
 svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='label'] orphan-label
+svtools/uiconfig/ui/spinfieldcontrol.ui://GtkSpinButton[@id='spinbutton'] no-labelled-by
diff --git a/svtools/UIConfig_svt.mk b/svtools/UIConfig_svt.mk
index 9cf052bbc0da..46fd24e6a4c2 100644
--- a/svtools/UIConfig_svt.mk
+++ b/svtools/UIConfig_svt.mk
@@ -26,6 +26,7 @@ $(eval $(call gb_UIConfig_add_uifiles,svt,\
 	svtools/uiconfig/ui/printersetupdialog \
 	svtools/uiconfig/ui/querydeletedialog \
 	svtools/uiconfig/ui/restartdialog \
+	svtools/uiconfig/ui/spinfieldcontrol \
 ))
 
 # vim: set noet sw=4 ts=4:
diff --git a/svtools/uiconfig/ui/spinfieldcontrol.ui b/svtools/uiconfig/ui/spinfieldcontrol.ui
new file mode 100644
index 000000000000..c2ef659926ae
--- /dev/null
+++ b/svtools/uiconfig/ui/spinfieldcontrol.ui
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.2 -->
+<interface domain="svt">
+  <requires lib="gtk+" version="3.18"/>
+  <object class="GtkAdjustment" id="adjustment1">
+    <property name="lower">-1000000000</property>
+    <property name="upper">1000000000</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkBox" id="SpinFieldControl">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkSpinButton" id="spinbutton">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="hexpand">True</property>
+        <property name="adjustment">adjustment1</property>
+      </object>
+      <packing>
+        <property name="expand">True</property>
+        <property name="fill">True</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+  </object>
+</interface>


More information about the Libreoffice-commits mailing list