Kaydet (Commit) 9e3820ac authored tarafından Noel Grandin's avatar Noel Grandin

convert Link<> to typed

Change-Id: I70d7c7ae4fc68d2f36a00d7c1b6eba71f63872d7
üst 71a83295
...@@ -778,7 +778,7 @@ public: ...@@ -778,7 +778,7 @@ public:
@see AddEventListener, RemoveEventListener, RemoveKeyListener @see AddEventListener, RemoveEventListener, RemoveKeyListener
*/ */
static void AddKeyListener( const Link<>& rKeyListener ); static void AddKeyListener( const Link<VclWindowEvent&,bool>& rKeyListener );
/** Remove a keypress listener from the application. /** Remove a keypress listener from the application.
...@@ -786,7 +786,7 @@ public: ...@@ -786,7 +786,7 @@ public:
@see AddEventListener, RemoveEventListener, AddKeyListener @see AddEventListener, RemoveEventListener, AddKeyListener
*/ */
static void RemoveKeyListener( const Link<>& rKeyListener ); static void RemoveKeyListener( const Link<VclWindowEvent&,bool>& rKeyListener );
/** Send event to all VCL application event listeners /** Send event to all VCL application event listeners
......
...@@ -256,11 +256,6 @@ class VCL_DLLPUBLIC VclEventListeners ...@@ -256,11 +256,6 @@ class VCL_DLLPUBLIC VclEventListeners
{ {
public: public:
void Call( VclSimpleEvent* pEvent ) const; void Call( VclSimpleEvent* pEvent ) const;
// stops notifying when any handler has processed the event
// and returns true in that case
// a handler must return true to signal that it has processed the event
bool Process( VclSimpleEvent* pEvent ) const;
void addListener( const Link<>& rListener ); void addListener( const Link<>& rListener );
void removeListener( const Link<>& rListener ); void removeListener( const Link<>& rListener );
private: private:
......
...@@ -161,20 +161,20 @@ class VCLXToolkit : public VCLXToolkit_Impl, ...@@ -161,20 +161,20 @@ class VCLXToolkit : public VCLXToolkit_Impl,
::cppu::OInterfaceContainerHelper m_aKeyHandlers; ::cppu::OInterfaceContainerHelper m_aKeyHandlers;
::cppu::OInterfaceContainerHelper m_aFocusListeners; ::cppu::OInterfaceContainerHelper m_aFocusListeners;
::Link<> m_aEventListenerLink; ::Link<> m_aEventListenerLink;
::Link<> m_aKeyListenerLink; ::Link<VclWindowEvent&,bool> m_aKeyListenerLink;
bool m_bEventListener; bool m_bEventListener;
bool m_bKeyListener; bool m_bKeyListener;
DECL_LINK(eventListenerHandler, ::VclSimpleEvent const *); DECL_LINK(eventListenerHandler, ::VclSimpleEvent const *);
DECL_LINK(keyListenerHandler, ::VclSimpleEvent const *); DECL_LINK_TYPED(keyListenerHandler, ::VclWindowEvent&, bool);
void callTopWindowListeners( void callTopWindowListeners(
::VclSimpleEvent const * pEvent, ::VclSimpleEvent const * pEvent,
void (SAL_CALL css::awt::XTopWindowListener::* pFn)( void (SAL_CALL css::awt::XTopWindowListener::* pFn)(
css::lang::EventObject const &)); css::lang::EventObject const &));
long callKeyHandlers(::VclSimpleEvent const * pEvent, bool bPressed); bool callKeyHandlers(::VclSimpleEvent const * pEvent, bool bPressed);
void callFocusListeners(::VclSimpleEvent const * pEvent, bool bGained); void callFocusListeners(::VclSimpleEvent const * pEvent, bool bGained);
...@@ -1737,16 +1737,16 @@ IMPL_LINK(VCLXToolkit, eventListenerHandler, ::VclSimpleEvent const *, pEvent) ...@@ -1737,16 +1737,16 @@ IMPL_LINK(VCLXToolkit, eventListenerHandler, ::VclSimpleEvent const *, pEvent)
return 0; return 0;
} }
IMPL_LINK(VCLXToolkit, keyListenerHandler, ::VclSimpleEvent const *, pEvent) IMPL_LINK_TYPED(VCLXToolkit, keyListenerHandler, ::VclWindowEvent&, rEvent, bool)
{ {
switch (pEvent->GetId()) switch (rEvent.GetId())
{ {
case VCLEVENT_WINDOW_KEYINPUT: case VCLEVENT_WINDOW_KEYINPUT:
return callKeyHandlers(pEvent, true); return callKeyHandlers(&rEvent, true);
case VCLEVENT_WINDOW_KEYUP: case VCLEVENT_WINDOW_KEYUP:
return callKeyHandlers(pEvent, false); return callKeyHandlers(&rEvent, false);
} }
return 0; return false;
} }
void VCLXToolkit::callTopWindowListeners( void VCLXToolkit::callTopWindowListeners(
...@@ -1784,7 +1784,7 @@ void VCLXToolkit::callTopWindowListeners( ...@@ -1784,7 +1784,7 @@ void VCLXToolkit::callTopWindowListeners(
} }
} }
long VCLXToolkit::callKeyHandlers(::VclSimpleEvent const * pEvent, bool VCLXToolkit::callKeyHandlers(::VclSimpleEvent const * pEvent,
bool bPressed) bool bPressed)
{ {
css::uno::Sequence< css::uno::Reference< css::uno::XInterface > > css::uno::Sequence< css::uno::Reference< css::uno::XInterface > >
...@@ -1818,7 +1818,7 @@ long VCLXToolkit::callKeyHandlers(::VclSimpleEvent const * pEvent, ...@@ -1818,7 +1818,7 @@ long VCLXToolkit::callKeyHandlers(::VclSimpleEvent const * pEvent,
{ {
if ((bPressed ? xHandler->keyPressed(aAwtEvent) if ((bPressed ? xHandler->keyPressed(aAwtEvent)
: xHandler->keyReleased(aAwtEvent))) : xHandler->keyReleased(aAwtEvent)))
return 1; return true;
} }
catch (const css::uno::RuntimeException & rEx) catch (const css::uno::RuntimeException & rEx)
{ {
...@@ -1829,7 +1829,7 @@ long VCLXToolkit::callKeyHandlers(::VclSimpleEvent const * pEvent, ...@@ -1829,7 +1829,7 @@ long VCLXToolkit::callKeyHandlers(::VclSimpleEvent const * pEvent,
} }
} }
} }
return 0; return false;
} }
void VCLXToolkit::callFocusListeners(::VclSimpleEvent const * pEvent, void VCLXToolkit::callFocusListeners(::VclSimpleEvent const * pEvent,
......
...@@ -101,6 +101,8 @@ public: ...@@ -101,6 +101,8 @@ public:
virtual void ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 ) SAL_OVERRIDE; virtual void ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 ) SAL_OVERRIDE;
}; };
typedef std::list<Link<VclWindowEvent&,bool> > SVAppKeyListeners;
struct ImplSVAppData struct ImplSVAppData
{ {
enum ImeStatusWindowMode enum ImeStatusWindowMode
...@@ -113,7 +115,7 @@ struct ImplSVAppData ...@@ -113,7 +115,7 @@ struct ImplSVAppData
AllSettings* mpSettings; // Application settings AllSettings* mpSettings; // Application settings
LocaleConfigurationListener* mpCfgListener; LocaleConfigurationListener* mpCfgListener;
VclEventListeners* mpEventListeners; // listeners for vcl events (eg, extended toolkit) VclEventListeners* mpEventListeners; // listeners for vcl events (eg, extended toolkit)
VclEventListeners* mpKeyListeners; // listeners for key events only (eg, extended toolkit) SVAppKeyListeners* mpKeyListeners; // listeners for key events only (eg, extended toolkit)
ImplAccelManager* mpAccelMgr; // Accelerator Manager ImplAccelManager* mpAccelMgr; // Accelerator Manager
OUString* mpAppName; // Application name OUString* mpAppName; // Application name
OUString* mpAppFileName; // Abs. Application FileName OUString* mpAppFileName; // Abs. Application FileName
......
...@@ -688,19 +688,19 @@ void Application::RemoveEventListener( const Link<>& rEventListener ) ...@@ -688,19 +688,19 @@ void Application::RemoveEventListener( const Link<>& rEventListener )
pSVData->maAppData.mpEventListeners->removeListener( rEventListener ); pSVData->maAppData.mpEventListeners->removeListener( rEventListener );
} }
void Application::AddKeyListener( const Link<>& rKeyListener ) void Application::AddKeyListener( const Link<VclWindowEvent&,bool>& rKeyListener )
{ {
ImplSVData* pSVData = ImplGetSVData(); ImplSVData* pSVData = ImplGetSVData();
if( !pSVData->maAppData.mpKeyListeners ) if( !pSVData->maAppData.mpKeyListeners )
pSVData->maAppData.mpKeyListeners = new VclEventListeners; pSVData->maAppData.mpKeyListeners = new SVAppKeyListeners;
pSVData->maAppData.mpKeyListeners->addListener( rKeyListener ); pSVData->maAppData.mpKeyListeners->push_back( rKeyListener );
} }
void Application::RemoveKeyListener( const Link<>& rKeyListener ) void Application::RemoveKeyListener( const Link<VclWindowEvent&,bool>& rKeyListener )
{ {
ImplSVData* pSVData = ImplGetSVData(); ImplSVData* pSVData = ImplGetSVData();
if( pSVData->maAppData.mpKeyListeners ) if( pSVData->maAppData.mpKeyListeners )
pSVData->maAppData.mpKeyListeners->removeListener( rKeyListener ); pSVData->maAppData.mpKeyListeners->remove( rKeyListener );
} }
bool Application::HandleKey( sal_uLong nEvent, vcl::Window *pWin, KeyEvent* pKeyEvent ) bool Application::HandleKey( sal_uLong nEvent, vcl::Window *pWin, KeyEvent* pKeyEvent )
...@@ -709,11 +709,24 @@ bool Application::HandleKey( sal_uLong nEvent, vcl::Window *pWin, KeyEvent* pKey ...@@ -709,11 +709,24 @@ bool Application::HandleKey( sal_uLong nEvent, vcl::Window *pWin, KeyEvent* pKey
VclWindowEvent aEvent( pWin, nEvent, static_cast<void *>(pKeyEvent) ); VclWindowEvent aEvent( pWin, nEvent, static_cast<void *>(pKeyEvent) );
ImplSVData* pSVData = ImplGetSVData(); ImplSVData* pSVData = ImplGetSVData();
bool bProcessed = false;
if ( pSVData->maAppData.mpKeyListeners ) if ( !pSVData->maAppData.mpKeyListeners )
bProcessed = pSVData->maAppData.mpKeyListeners->Process( &aEvent ); return false;
if ( pSVData->maAppData.mpKeyListeners->empty() )
return false;
bool bProcessed = false;
// Copy the list, because this can be destroyed when calling a Link...
std::list<Link<VclWindowEvent&,bool>> aCopy( *pSVData->maAppData.mpKeyListeners );
for ( Link<VclWindowEvent&,bool>& rLink : aCopy )
{
if( rLink.Call( aEvent ) )
{
bProcessed = true;
break;
}
}
return bProcessed; return bProcessed;
} }
......
...@@ -76,28 +76,6 @@ void VclEventListeners::Call( VclSimpleEvent* pEvent ) const ...@@ -76,28 +76,6 @@ void VclEventListeners::Call( VclSimpleEvent* pEvent ) const
} }
} }
bool VclEventListeners::Process( VclSimpleEvent* pEvent ) const
{
if ( m_aListeners.empty() )
return false;
bool bProcessed = false;
// Copy the list, because this can be destroyed when calling a Link...
std::list<Link<>> aCopy( m_aListeners );
std::list<Link<>>::iterator aIter( aCopy.begin() );
std::list<Link<>>::const_iterator aEnd( aCopy.end() );
while ( aIter != aEnd )
{
if( (*aIter).Call( pEvent ) != 0 )
{
bProcessed = true;
break;
}
++aIter;
}
return bProcessed;
}
void VclEventListeners::addListener( const Link<>& rListener ) void VclEventListeners::addListener( const Link<>& rListener )
{ {
m_aListeners.push_back( rListener ); m_aListeners.push_back( rListener );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment