dbaccess/source/ui/control/RelationControl.cxx | 2 +- include/svtools/editbrowsebox.hxx | 25 +++++++++++++++++++++++-- svtools/source/brwbox/ebbcontrols.cxx | 8 ++++---- svtools/source/brwbox/editbrowsebox.cxx | 13 ++++++++++--- svtools/source/brwbox/editbrowsebox2.cxx | 2 +- 5 files changed, 39 insertions(+), 11 deletions(-)
New commits: commit 9d30d3bb93171a12655dc89066fe065e2c2af658 Author: Caolán McNamara <[email protected]> AuthorDate: Sun Sep 27 20:06:17 2020 +0100 Commit: Miklos Vajna <[email protected]> CommitDate: Thu Oct 1 09:55:35 2020 +0200 Related: tdf#137016 check if subcontrol has the focus backport some required pieces from master to support that Change-Id: I632188bc0512c9d8935bd0898c96e066881ebeb1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103524 Tested-by: Jenkins Reviewed-by: Julien Nabet <[email protected]> Reviewed-by: Miklos Vajna <[email protected]> diff --git a/dbaccess/source/ui/control/RelationControl.cxx b/dbaccess/source/ui/control/RelationControl.cxx index d9de91ba494b..69f0a00cae2d 100644 --- a/dbaccess/source/ui/control/RelationControl.cxx +++ b/dbaccess/source/ui/control/RelationControl.cxx @@ -184,7 +184,7 @@ namespace dbaui bool ORelationControl::PreNotify(NotifyEvent& rNEvt) { - if (rNEvt.GetType() == MouseNotifyEvent::LOSEFOCUS && !HasChildPathFocus() ) + if (rNEvt.GetType() == MouseNotifyEvent::LOSEFOCUS && !HasChildPathFocus() && !ControlHasFocus()) PostUserEvent(LINK(this, ORelationControl, AsynchDeactivate), nullptr, true); else if (rNEvt.GetType() == MouseNotifyEvent::GETFOCUS) PostUserEvent(LINK(this, ORelationControl, AsynchActivate), nullptr, true); diff --git a/include/svtools/editbrowsebox.hxx b/include/svtools/editbrowsebox.hxx index ebd968d254ad..5614659d0756 100644 --- a/include/svtools/editbrowsebox.hxx +++ b/include/svtools/editbrowsebox.hxx @@ -316,8 +316,18 @@ namespace svt DECL_LINK(ModifyHdl, LinkParamNone*, void); }; + class SVT_DLLPUBLIC ControlBase : public InterimItemWindow + { + public: + ControlBase(vcl::Window* pParent, const OUString& rUIXMLDescription, const OString& rID) + : InterimItemWindow(pParent, rUIXMLDescription, rID) + { + } + virtual bool ControlHasFocus() const = 0; + }; + //= ComboBoxControl - class SVT_DLLPUBLIC ComboBoxControl final : public InterimItemWindow + class SVT_DLLPUBLIC ComboBoxControl final : public ControlBase { private: std::unique_ptr<weld::ComboBox> m_xWidget; @@ -343,6 +353,11 @@ namespace svt m_aModify2Hdl = rLink; } + virtual bool ControlHasFocus() const override + { + return m_xWidget && m_xWidget->has_focus(); + } + virtual void dispose() override; private: @@ -373,7 +388,7 @@ namespace svt }; //= ListBoxControl - class SVT_DLLPUBLIC ListBoxControl final : public InterimItemWindow + class SVT_DLLPUBLIC ListBoxControl final : public ControlBase { private: std::unique_ptr<weld::ComboBox> m_xWidget; @@ -399,6 +414,11 @@ namespace svt m_aModify2Hdl = rLink; } + virtual bool ControlHasFocus() const override + { + return m_xWidget && m_xWidget->has_focus(); + } + virtual void dispose() override; private: DECL_LINK(SelectHdl, weld::ComboBox&, void); @@ -655,6 +675,7 @@ namespace svt virtual sal_Int32 GetFieldIndexAtPoint(sal_Int32 _nRow,sal_Int32 _nColumnPos,const Point& _rPoint) override; css::uno::Reference< css::accessibility::XAccessible > CreateAccessibleCheckBoxCell(long _nRow, sal_uInt16 _nColumnPos,const TriState& eState); + bool ControlHasFocus() const; protected: // creates the accessible which wraps the active cell void implCreateActiveAccessible( ); diff --git a/svtools/source/brwbox/ebbcontrols.cxx b/svtools/source/brwbox/ebbcontrols.cxx index 1e0272aeeea9..e402f0a42a40 100644 --- a/svtools/source/brwbox/ebbcontrols.cxx +++ b/svtools/source/brwbox/ebbcontrols.cxx @@ -28,7 +28,7 @@ namespace svt //= ComboBoxControl ComboBoxControl::ComboBoxControl(vcl::Window* pParent) - : InterimItemWindow(pParent, "svt/ui/combocontrol.ui", "ComboControl") + : ControlBase(pParent, "svt/ui/combocontrol.ui", "ComboControl") , m_xWidget(m_xBuilder->weld_combo_box("combobox")) { m_xWidget->set_entry_width_chars(1); // so a smaller than default width can be used @@ -38,7 +38,7 @@ namespace svt void ComboBoxControl::dispose() { m_xWidget.reset(); - InterimItemWindow::dispose(); + ControlBase::dispose(); } IMPL_LINK_NOARG(ComboBoxControl, SelectHdl, weld::ComboBox&, void) @@ -111,7 +111,7 @@ namespace svt //= ListBoxControl ListBoxControl::ListBoxControl(vcl::Window* pParent) - : InterimItemWindow(pParent, "svt/ui/listcontrol.ui", "ListControl") + : ControlBase(pParent, "svt/ui/listcontrol.ui", "ListControl") , m_xWidget(m_xBuilder->weld_combo_box("listbox")) { m_xWidget->set_size_request(42, -1); // so a later narrow size request can stick @@ -121,7 +121,7 @@ namespace svt void ListBoxControl::dispose() { m_xWidget.reset(); - InterimItemWindow::dispose(); + ControlBase::dispose(); } IMPL_LINK_NOARG(ListBoxControl, SelectHdl, weld::ComboBox&, void) diff --git a/svtools/source/brwbox/editbrowsebox.cxx b/svtools/source/brwbox/editbrowsebox.cxx index 0105082cea5c..12ef6d6fd181 100644 --- a/svtools/source/brwbox/editbrowsebox.cxx +++ b/svtools/source/brwbox/editbrowsebox.cxx @@ -211,7 +211,7 @@ namespace svt if (IsEditing()) { EnableAndShow(); - if (!aController->GetWindow().HasFocus() && (m_pFocusWhileRequest.get() == Application::GetFocusWindow())) + if (!ControlHasFocus() && (m_pFocusWhileRequest.get() == Application::GetFocusWindow())) aController->GetWindow().GrabFocus(); } } @@ -467,6 +467,13 @@ namespace svt implActivateCellOnMouseEvent(rEvt, true); } + bool EditBrowseBox::ControlHasFocus() const + { + Window* pControlWindow = aController ? &aController->GetWindow() : nullptr; + if (ControlBase* pControlBase = dynamic_cast<ControlBase*>(pControlWindow)) + return pControlBase->ControlHasFocus(); + return pControlWindow && pControlWindow->HasChildPathFocus(); + } void EditBrowseBox::implActivateCellOnMouseEvent(const BrowserMouseEvent& _rEvt, bool _bUp) { @@ -474,7 +481,7 @@ namespace svt ActivateCell(); else if (IsEditing() && !aController->GetWindow().IsEnabled()) DeactivateCell(); - else if (IsEditing() && !aController->GetWindow().HasChildPathFocus()) + else if (IsEditing() && !ControlHasFocus()) AsynchGetFocus(); if (!(IsEditing() && aController->GetWindow().IsEnabled() && aController->WantMouseEvent())) @@ -546,7 +553,7 @@ namespace svt { if (rEvt.GetType() == MouseNotifyEvent::KEYINPUT) { - if ( (IsEditing() && Controller()->GetWindow().HasChildPathFocus()) + if ( (IsEditing() && ControlHasFocus()) || rEvt.GetWindow() == &GetDataWindow() || (!IsEditing() && HasChildPathFocus()) ) diff --git a/svtools/source/brwbox/editbrowsebox2.cxx b/svtools/source/brwbox/editbrowsebox2.cxx index 3544979e725b..7c84cf5eb805 100644 --- a/svtools/source/brwbox/editbrowsebox2.cxx +++ b/svtools/source/brwbox/editbrowsebox2.cxx @@ -124,7 +124,7 @@ void EditBrowseBox::GrabTableFocus() void EditBrowseBox::DetermineFocus( const GetFocusFlags _nGetFocusFlags ) { - bool bFocus = false; + bool bFocus = ControlHasFocus(); for (vcl::Window* pWindow = Application::GetFocusWindow(); pWindow && !bFocus; pWindow = pWindow->GetParent()) _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
