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 <serval2412@yahoo.fr>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
diff --git a/dbaccess/source/ui/control/RelationControl.cxx b/dbaccess/source/ui/control/RelationControl.cxx
index d9de91b..69f0a00 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 ebd968d..5614659 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 1e0272a..e402f0a 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 0105082..12ef6d6 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 3544979..7c84cf5 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())