diff options
author | Caolán McNamara <caolanm@redhat.com> | 2020-06-25 21:24:03 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2020-06-26 15:44:11 +0200 |
commit | 07875e36f7f8aab16e5a1e5e78c189e572d57bf8 (patch) | |
tree | 2d1a0dc5cdaa893b90f3e0da410f8e53c480acc4 /framework | |
parent | bda370031e669d4a9b19d0a8247da0db230ebf00 (diff) |
weld SpinfieldControl
Change-Id: I1696105ead648c86076f05f50f6286e9a3a932d4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97218
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'framework')
-rw-r--r-- | framework/inc/uielement/spinfieldtoolbarcontroller.hxx | 4 | ||||
-rw-r--r-- | framework/source/uielement/spinfieldtoolbarcontroller.cxx | 249 |
2 files changed, 115 insertions, 138 deletions
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() ) { |