summaryrefslogtreecommitdiff
path: root/framework
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2020-06-25 21:24:03 +0100
committerCaolán McNamara <caolanm@redhat.com>2020-06-26 15:44:11 +0200
commit07875e36f7f8aab16e5a1e5e78c189e572d57bf8 (patch)
tree2d1a0dc5cdaa893b90f3e0da410f8e53c480acc4 /framework
parentbda370031e669d4a9b19d0a8247da0db230ebf00 (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.hxx4
-rw-r--r--framework/source/uielement/spinfieldtoolbarcontroller.cxx249
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() )
{