[Libreoffice-commits] core.git: include/svtools svtools/source svx/source
Caolán McNamara (via logerrit)
logerrit at kemper.freedesktop.org
Wed Aug 4 14:51:14 UTC 2021
include/svtools/editbrowsebox.hxx | 7 +++
svtools/source/brwbox/ebbcontrols.cxx | 1
svx/source/fmcomp/gridcell.cxx | 68 ++++++++++++++--------------------
svx/source/inc/gridcell.hxx | 4 +-
4 files changed, 39 insertions(+), 41 deletions(-)
New commits:
commit ee04805e513b0f804408697fc4b93e3c025d2329
Author: Caolán McNamara <caolanm at redhat.com>
AuthorDate: Wed Aug 4 14:22:37 2021 +0100
Commit: Caolán McNamara <caolanm at redhat.com>
CommitDate: Wed Aug 4 16:50:39 2021 +0200
Resolves: tdf#143023 explicitly connect to ControlBase focus-[in/out]
instead of listening to the generic vcl::Window/Control focus events.
The thing which really gets/loses focus is now a Widget hosted inside
the ControlBase.
Change-Id: I012d0bea687aa6d5965a4e2f6ce3899bfc629f1b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120003
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
diff --git a/include/svtools/editbrowsebox.hxx b/include/svtools/editbrowsebox.hxx
index fd111dbef4a9..159e2cedb367 100644
--- a/include/svtools/editbrowsebox.hxx
+++ b/include/svtools/editbrowsebox.hxx
@@ -178,12 +178,19 @@ namespace svt
m_aFocusInHdl = rHdl;
}
+ // chain after the FocusOutHdl
+ void SetFocusOutHdl(const Link<LinkParamNone*,void>& rHdl)
+ {
+ m_aFocusOutHdl = rHdl;
+ }
+
protected:
DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
DECL_LINK(FocusInHdl, weld::Widget&, void);
DECL_LINK(FocusOutHdl, weld::Widget&, void);
private:
Link<LinkParamNone*,void> m_aFocusInHdl;
+ Link<LinkParamNone*,void> m_aFocusOutHdl;
};
class SVT_DLLPUBLIC EditControlBase : public ControlBase
diff --git a/svtools/source/brwbox/ebbcontrols.cxx b/svtools/source/brwbox/ebbcontrols.cxx
index 3b1819e94923..32ad1e52c748 100644
--- a/svtools/source/brwbox/ebbcontrols.cxx
+++ b/svtools/source/brwbox/ebbcontrols.cxx
@@ -362,6 +362,7 @@ namespace svt
IMPL_LINK_NOARG(ControlBase, FocusOutHdl, weld::Widget&, void)
{
+ m_aFocusOutHdl.Call(nullptr);
static_cast<BrowserDataWin*>(GetParent())->GetParent()->ChildFocusOut();
}
diff --git a/svx/source/fmcomp/gridcell.cxx b/svx/source/fmcomp/gridcell.cxx
index 1a2b06311e32..4fb6d1d7f983 100644
--- a/svx/source/fmcomp/gridcell.cxx
+++ b/svx/source/fmcomp/gridcell.cxx
@@ -3098,7 +3098,11 @@ void FmXGridCell::init()
{
svt::ControlBase* pEventWindow( getEventWindow() );
if ( pEventWindow )
+ {
pEventWindow->AddEventListener( LINK( this, FmXGridCell, OnWindowEvent ) );
+ pEventWindow->SetFocusInHdl(LINK( this, FmXGridCell, OnFocusGained));
+ pEventWindow->SetFocusOutHdl(LINK( this, FmXGridCell, OnFocusLost));
+ }
}
svt::ControlBase* FmXGridCell::getEventWindow() const
@@ -3319,78 +3323,62 @@ void SAL_CALL FmXGridCell::removeMouseMotionListener( const Reference< awt::XMou
m_aMouseMotionListeners.removeInterface( _rxListener );
}
-
void SAL_CALL FmXGridCell::addPaintListener( const Reference< awt::XPaintListener >& )
{
OSL_FAIL( "FmXGridCell::addPaintListener: not implemented" );
}
-
void SAL_CALL FmXGridCell::removePaintListener( const Reference< awt::XPaintListener >& )
{
OSL_FAIL( "FmXGridCell::removePaintListener: not implemented" );
}
-
IMPL_LINK( FmXGridCell, OnWindowEvent, VclWindowEvent&, _rEvent, void )
{
ENSURE_OR_THROW( _rEvent.GetWindow(), "illegal window" );
- onWindowEvent( _rEvent.GetId(), *_rEvent.GetWindow(), _rEvent.GetData() );
+ onWindowEvent(_rEvent.GetId(), _rEvent.GetData());
}
-
void FmXGridCell::onFocusGained( const awt::FocusEvent& _rEvent )
{
checkDisposed(OComponentHelper::rBHelper.bDisposed);
m_aFocusListeners.notifyEach( &awt::XFocusListener::focusGained, _rEvent );
}
-
void FmXGridCell::onFocusLost( const awt::FocusEvent& _rEvent )
{
checkDisposed(OComponentHelper::rBHelper.bDisposed);
m_aFocusListeners.notifyEach( &awt::XFocusListener::focusLost, _rEvent );
}
+IMPL_LINK_NOARG(FmXGridCell, OnFocusGained, LinkParamNone*, void)
+{
+ if (!m_aFocusListeners.getLength())
+ return;
+
+ awt::FocusEvent aEvent;
+ aEvent.Source = *this;
+ aEvent.Temporary = false;
-void FmXGridCell::onWindowEvent( const VclEventId _nEventId, const vcl::Window& _rWindow, const void* _pEventData )
+ onFocusGained(aEvent);
+}
+
+IMPL_LINK_NOARG(FmXGridCell, OnFocusLost, LinkParamNone*, void)
{
- switch ( _nEventId )
- {
- case VclEventId::ControlGetFocus:
- case VclEventId::WindowGetFocus:
- case VclEventId::ControlLoseFocus:
- case VclEventId::WindowLoseFocus:
- {
- if ( ( _rWindow.IsCompoundControl()
- && ( _nEventId == VclEventId::ControlGetFocus
- || _nEventId == VclEventId::ControlLoseFocus
- )
- )
- || ( !_rWindow.IsCompoundControl()
- && ( _nEventId == VclEventId::WindowGetFocus
- || _nEventId == VclEventId::WindowLoseFocus
- )
- )
- )
- {
- if ( !m_aFocusListeners.getLength() )
- break;
+ if (!m_aFocusListeners.getLength())
+ return;
- bool bFocusGained = ( _nEventId == VclEventId::ControlGetFocus ) || ( _nEventId == VclEventId::WindowGetFocus );
+ awt::FocusEvent aEvent;
+ aEvent.Source = *this;
+ aEvent.Temporary = false;
- awt::FocusEvent aEvent;
- aEvent.Source = *this;
- aEvent.FocusFlags = static_cast<sal_Int16>(_rWindow.GetGetFocusFlags());
- aEvent.Temporary = false;
+ onFocusLost(aEvent);
+}
- if ( bFocusGained )
- onFocusGained( aEvent );
- else
- onFocusLost( aEvent );
- }
- }
- break;
+void FmXGridCell::onWindowEvent(const VclEventId _nEventId, const void* _pEventData)
+{
+ switch ( _nEventId )
+ {
case VclEventId::WindowMouseButtonDown:
case VclEventId::WindowMouseButtonUp:
{
diff --git a/svx/source/inc/gridcell.hxx b/svx/source/inc/gridcell.hxx
index 355c39ea1ead..306dc5764ca1 100644
--- a/svx/source/inc/gridcell.hxx
+++ b/svx/source/inc/gridcell.hxx
@@ -772,7 +772,7 @@ public:
{ m_pCellControl->AlignControl(nAlignment);}
protected:
- void onWindowEvent( const VclEventId _nEventId, const vcl::Window& _rWindow, const void* _pEventData );
+ void onWindowEvent(const VclEventId _nEventId, const void* _pEventData);
// default implementations call our focus listeners, don't forget to call them if you override this
virtual void onFocusGained( const css::awt::FocusEvent& _rEvent );
@@ -780,6 +780,8 @@ protected:
private:
svt::ControlBase* getEventWindow() const;
+ DECL_LINK(OnFocusGained, LinkParamNone*, void);
+ DECL_LINK(OnFocusLost, LinkParamNone*, void);
DECL_LINK( OnWindowEvent, VclWindowEvent&, void );
};
More information about the Libreoffice-commits
mailing list