diff options
author | Caolán McNamara <caolanm@redhat.com> | 2020-06-26 12:37:39 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2020-06-26 15:44:28 +0200 |
commit | d1e8831e06ef1fda6f0319f07601dd98abdc3fd1 (patch) | |
tree | 95ab905a76b858793fbfc19e26e0c376c3043c27 /framework | |
parent | 07875e36f7f8aab16e5a1e5e78c189e572d57bf8 (diff) |
improve tab traversal in addons with native widgets
Change-Id: I55d0390522122cc4409ea14274e756881315df0a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97219
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'framework')
4 files changed, 52 insertions, 0 deletions
diff --git a/framework/source/uielement/comboboxtoolbarcontroller.cxx b/framework/source/uielement/comboboxtoolbarcontroller.cxx index 1d73f3fc526d..9f200b2cd838 100644 --- a/framework/source/uielement/comboboxtoolbarcontroller.cxx +++ b/framework/source/uielement/comboboxtoolbarcontroller.cxx @@ -47,6 +47,12 @@ public: ComboBoxControl(vcl::Window* pParent, ComboboxToolbarController* pComboboxToolbarController); virtual ~ComboBoxControl() override; virtual void dispose() override; + virtual void GetFocus() override + { + if (m_xWidget) + m_xWidget->grab_focus(); + InterimItemWindow::GetFocus(); + } void set_active_or_entry_text(const OUString& rText); OUString get_active_text() const { return m_xWidget->get_active_text(); } @@ -62,6 +68,7 @@ public: DECL_LINK(FocusOutHdl, weld::Widget&, void); DECL_LINK(ModifyHdl, weld::ComboBox&, void); DECL_LINK(ActivateHdl, weld::ComboBox&, bool); + DECL_LINK(KeyInputHdl, const ::KeyEvent&, bool); private: std::unique_ptr<weld::ComboBox> m_xWidget; @@ -77,11 +84,17 @@ ComboBoxControl::ComboBoxControl(vcl::Window* pParent, ComboboxToolbarController m_xWidget->connect_focus_out(LINK(this, ComboBoxControl, FocusOutHdl)); m_xWidget->connect_changed(LINK(this, ComboBoxControl, ModifyHdl)); m_xWidget->connect_entry_activate(LINK(this, ComboBoxControl, ActivateHdl)); + m_xWidget->connect_key_press(LINK(this, ComboBoxControl, KeyInputHdl)); m_xWidget->set_entry_width_chars(1); // so a smaller than default width can be used by ComboboxToolbarController SetSizePixel(get_preferred_size()); } +IMPL_LINK(ComboBoxControl, KeyInputHdl, const ::KeyEvent&, rKEvt, bool) +{ + return ChildKeyInput(rKEvt); +} + void ComboBoxControl::set_active_or_entry_text(const OUString& rText) { const int nFound = m_xWidget->find_text(rText); diff --git a/framework/source/uielement/dropdownboxtoolbarcontroller.cxx b/framework/source/uielement/dropdownboxtoolbarcontroller.cxx index 1603ab6b3185..8c50d7229232 100644 --- a/framework/source/uielement/dropdownboxtoolbarcontroller.cxx +++ b/framework/source/uielement/dropdownboxtoolbarcontroller.cxx @@ -47,6 +47,12 @@ public: ListBoxControl(vcl::Window* pParent, DropdownToolbarController* pListBoxListener); virtual ~ListBoxControl() override; virtual void dispose() override; + virtual void GetFocus() override + { + if (m_xWidget) + m_xWidget->grab_focus(); + InterimItemWindow::GetFocus(); + } void set_active(int nPos) { m_xWidget->set_active(nPos); } void append_text(const OUString& rStr) { m_xWidget->append_text(rStr); } @@ -60,6 +66,7 @@ public: DECL_LINK(FocusInHdl, weld::Widget&, void); DECL_LINK(FocusOutHdl, weld::Widget&, void); DECL_LINK(ModifyHdl, weld::ComboBox&, void); + DECL_LINK(KeyInputHdl, const ::KeyEvent&, bool); private: std::unique_ptr<weld::ComboBox> m_xWidget; @@ -74,11 +81,17 @@ ListBoxControl::ListBoxControl(vcl::Window* pParent, DropdownToolbarController* m_xWidget->connect_focus_in(LINK(this, ListBoxControl, FocusInHdl)); m_xWidget->connect_focus_out(LINK(this, ListBoxControl, FocusOutHdl)); m_xWidget->connect_changed(LINK(this, ListBoxControl, ModifyHdl)); + m_xWidget->connect_key_press(LINK(this, ListBoxControl, KeyInputHdl)); m_xWidget->set_size_request(42, -1); // so a later narrow size request can stick SetSizePixel(get_preferred_size()); } +IMPL_LINK(ListBoxControl, KeyInputHdl, const ::KeyEvent&, rKEvt, bool) +{ + return ChildKeyInput(rKEvt); +} + ListBoxControl::~ListBoxControl() { disposeOnce(); diff --git a/framework/source/uielement/edittoolbarcontroller.cxx b/framework/source/uielement/edittoolbarcontroller.cxx index 76988f88f7a9..89ff08598fce 100644 --- a/framework/source/uielement/edittoolbarcontroller.cxx +++ b/framework/source/uielement/edittoolbarcontroller.cxx @@ -46,6 +46,12 @@ public: EditControl(vcl::Window* pParent, EditToolbarController* pEditToolbarController); virtual ~EditControl() override; virtual void dispose() override; + virtual void GetFocus() override + { + if (m_xWidget) + m_xWidget->grab_focus(); + InterimItemWindow::GetFocus(); + } OUString get_text() const { return m_xWidget->get_text(); } void set_text(const OUString& rText) { m_xWidget->set_text(rText); } @@ -58,6 +64,7 @@ private: DECL_LINK(FocusOutHdl, weld::Widget&, void); DECL_LINK(ModifyHdl, weld::Entry&, void); DECL_LINK(ActivateHdl, weld::Entry&, bool); + DECL_LINK(KeyInputHdl, const ::KeyEvent&, bool); }; EditControl::EditControl(vcl::Window* pParent, EditToolbarController* pEditToolbarController) @@ -69,10 +76,16 @@ EditControl::EditControl(vcl::Window* pParent, EditToolbarController* pEditToolb m_xWidget->connect_focus_out(LINK(this, EditControl, FocusOutHdl)); m_xWidget->connect_changed(LINK(this, EditControl, ModifyHdl)); m_xWidget->connect_activate(LINK(this, EditControl, ActivateHdl)); + m_xWidget->connect_key_press(LINK(this, EditControl, KeyInputHdl)); SetSizePixel(get_preferred_size()); } +IMPL_LINK(EditControl, KeyInputHdl, const ::KeyEvent&, rKEvt, bool) +{ + return ChildKeyInput(rKEvt); +} + EditControl::~EditControl() { disposeOnce(); diff --git a/framework/source/uielement/spinfieldtoolbarcontroller.cxx b/framework/source/uielement/spinfieldtoolbarcontroller.cxx index 1dad7b918683..6747b21ece89 100644 --- a/framework/source/uielement/spinfieldtoolbarcontroller.cxx +++ b/framework/source/uielement/spinfieldtoolbarcontroller.cxx @@ -52,6 +52,12 @@ public: SpinfieldControl(vcl::Window* pParent, SpinfieldToolbarController* pSpinfieldToolbarController); virtual ~SpinfieldControl() override; virtual void dispose() override; + virtual void GetFocus() override + { + if (m_xWidget) + m_xWidget->grab_focus(); + InterimItemWindow::GetFocus(); + } void set_value(double fValue); @@ -84,6 +90,7 @@ public: DECL_LINK(ActivateHdl, weld::Entry&, bool); DECL_LINK(FocusInHdl, weld::Widget&, void); DECL_LINK(FocusOutHdl, weld::Widget&, void); + DECL_LINK(KeyInputHdl, const ::KeyEvent&, bool); private: std::unique_ptr<weld::FormattedSpinButton> m_xWidget; @@ -102,6 +109,7 @@ SpinfieldControl::SpinfieldControl(vcl::Window* pParent, SpinfieldToolbarControl m_xWidget->connect_input(LINK(this, SpinfieldControl, ParseInputHdl)); m_xWidget->connect_changed(LINK(this, SpinfieldControl, ModifyHdl)); m_xWidget->connect_activate(LINK(this, SpinfieldControl, ActivateHdl)); + m_xWidget->connect_key_press(LINK(this, SpinfieldControl, KeyInputHdl)); // so a later narrow size request can stick m_xWidget->set_width_chars(3); @@ -118,6 +126,11 @@ void SpinfieldControl::set_value(double fValue) m_pSpinfieldToolbarController->Modify(); } +IMPL_LINK(SpinfieldControl, KeyInputHdl, const ::KeyEvent&, rKEvt, bool) +{ + return ChildKeyInput(rKEvt); +} + IMPL_LINK(SpinfieldControl, ParseInputHdl, double*, result, bool) { *result = m_xWidget->get_text().toDouble(); |