summaryrefslogtreecommitdiff
path: root/toolkit
diff options
context:
space:
mode:
authorFrank Schoenheit [fs] <frank.schoenheit@sun.com>2010-05-06 14:21:12 +0200
committerFrank Schoenheit [fs] <frank.schoenheit@sun.com>2010-05-06 14:21:12 +0200
commitef87f256df12b618d410182c6b70cf5302e92c31 (patch)
treea01754745a20ac5ab220b563b82e502014468069 /toolkit
parent1678607abe3925444f6d0d282180ab34893e2c0f (diff)
os141: notify mouse events without a locked SolarMutex
Diffstat (limited to 'toolkit')
-rw-r--r--toolkit/source/awt/vclxwindow.cxx195
1 files changed, 55 insertions, 140 deletions
diff --git a/toolkit/source/awt/vclxwindow.cxx b/toolkit/source/awt/vclxwindow.cxx
index bb880fe68b66..d1fb12f2cf6f 100644
--- a/toolkit/source/awt/vclxwindow.cxx
+++ b/toolkit/source/awt/vclxwindow.cxx
@@ -67,6 +67,8 @@
#include <toolkit/helper/unopropertyarrayhelper.hxx>
+#include <boost/bind.hpp>
+
using namespace ::com::sun::star;
using ::com::sun::star::uno::Reference;
@@ -111,104 +113,38 @@ namespace
};
//................................................................
- //. MouseEventType
+ //. EventType
//................................................................
- enum MouseEventType
+ enum EventType
{
- META_FIRST_MOUSE_EVENT = 0,
-
- EVENT_MOUSE_PRESSED = 0,
- EVENT_MOUSE_RELEASED = 1,
- EVENT_MOUSE_ENTERED = 2,
- EVENT_MOUSE_EXITED = 3,
-
- META_LAST_MOUSE_EVENT = 3
+ EVENT_WINDOW_ENABLED = 1,
+ EVENT_WINDOW_DISABLED = 2,
};
//................................................................
- //. PlainEventType
- //................................................................
- enum PlainEventType
- {
- META_FIRST_PLAIN_EVENT = 4,
-
- EVENT_WINDOW_ENABLED = 4,
- EVENT_WINDOW_DISABLED = 5,
-
- META_LAST_PLAIN_EVENT = 5
- };
-
-#if OSL_DEBUG_LEVEL > 0
- static void checkEventDefinitions()
- {
- OSL_ENSURE( (int)META_LAST_MOUSE_EVENT < (int)META_FIRST_PLAIN_EVENT, "checkEventDefinitions: invalid event definitions!" );
- }
- #define DBG_CHECK_EVENTS() checkEventDefinitions()
-#else
- #define DBG_CHECK_EVENTS()
-#endif
-
- //................................................................
//. AnyWindowEvent
//................................................................
struct AnyWindowEvent : public ::comphelper::AnyEvent
{
private:
- awt::MouseEvent m_aMouseEvent;
- lang::EventObject m_aPlainEvent;
-
- sal_Int32 m_nEventType;
+ lang::EventObject m_aEvent;
+ EventType m_nEventType;
public:
- AnyWindowEvent( const awt::MouseEvent& _rEvent, MouseEventType _nType )
+ AnyWindowEvent( const lang::EventObject& _rEvent, EventType _nType )
:comphelper::AnyEvent()
- ,m_aMouseEvent( _rEvent )
- ,m_nEventType( static_cast< sal_Int32 >( _nType ) )
+ ,m_aEvent( _rEvent )
+ ,m_nEventType( _nType )
{
- DBG_CHECK_EVENTS();
}
- AnyWindowEvent( const lang::EventObject& _rEvent, PlainEventType _nType )
- :comphelper::AnyEvent()
- ,m_aPlainEvent( _rEvent )
- ,m_nEventType( static_cast< sal_Int32 >( _nType ) )
+ const lang::EventObject& getEvent() const
{
- DBG_CHECK_EVENTS();
+ return m_aEvent;
}
- bool isMouseEvent() const
- {
- return ( META_FIRST_MOUSE_EVENT <= m_nEventType ) && ( m_nEventType <= META_LAST_MOUSE_EVENT );
- }
+ EventType getEventType() const { return m_nEventType; }
- bool isPlainEvent() const
- {
- return ( META_FIRST_PLAIN_EVENT <= m_nEventType ) && ( m_nEventType <= META_LAST_PLAIN_EVENT );
- }
-
- const awt::MouseEvent& getMouseEvent() const
- {
- OSL_ENSURE( isMouseEvent(), "AnyWindowEvent::getMouseEvent: no mouse event!" );
- return m_aMouseEvent;
- }
-
- MouseEventType getMouseEventType() const
- {
- OSL_ENSURE( isMouseEvent(), "AnyWindowEvent::getMouseEventType: no mouse event!" );
- return static_cast< MouseEventType >( m_nEventType );
- }
-
- const lang::EventObject& getPlainEvent() const
- {
- OSL_ENSURE( isPlainEvent(), "AnyWindowEvent::getPlainEvent: no plain event!" );
- return m_aPlainEvent;
- }
-
- PlainEventType getPlainEventType() const
- {
- OSL_ENSURE( isPlainEvent(), "AnyWindowEvent::getPlainEventType: no mouse event!" );
- return static_cast< PlainEventType >( m_nEventType );
- }
};
}
@@ -288,13 +224,9 @@ public:
void setDirectVisible( sal_Bool bDirectVisible ) { mbDirectVisible = bDirectVisible; }
sal_Bool isDirectVisible() { return mbDirectVisible; }
- /** asynchronously notifies a mouse event to the VCLXWindow's XMouseListeners
- */
- void notifyMouseEvent( const awt::MouseEvent& _rMouseEvent, MouseEventType _nType );
-
/** asynchronously notifies an event described by an EventObject to the respective listeners
*/
- void notifyPlainEvent( const lang::EventObject& _rPlainEvent, PlainEventType _nType );
+ void notifyEvent( const lang::EventObject& _rEvent, EventType _nType );
/** impl-version of VCLXWindow::ImplExecuteAsyncWithoutSolarLock
*/
@@ -437,19 +369,11 @@ void VCLXWindowImpl::impl_notifyAnyEvent( const ::rtl::Reference< ::comphelper::
}
//--------------------------------------------------------------------
-void VCLXWindowImpl::notifyMouseEvent( const awt::MouseEvent& _rMouseEvent, MouseEventType _nType )
-{
- ::vos::OClearableGuard aGuard( mrMutex );
- if ( maMouseListeners.getLength() )
- impl_notifyAnyEvent( new AnyWindowEvent( _rMouseEvent, _nType ) );
-}
-
-//--------------------------------------------------------------------
-void VCLXWindowImpl::notifyPlainEvent( const lang::EventObject& _rPlainEvent, PlainEventType _nType )
+void VCLXWindowImpl::notifyEvent( const lang::EventObject& _rEvent, EventType _nType )
{
::vos::OClearableGuard aGuard( mrMutex );
if ( maWindow2Listeners.getLength() )
- impl_notifyAnyEvent( new AnyWindowEvent( _rPlainEvent, _nType ) );
+ impl_notifyAnyEvent( new AnyWindowEvent( _rEvent, _nType ) );
}
//--------------------------------------------------------------------
@@ -492,47 +416,19 @@ void VCLXWindowImpl::processEvent( const ::comphelper::AnyEvent& _rEvent )
return;
const AnyWindowEvent& rEventDescriptor( static_cast< const AnyWindowEvent& >( _rEvent ) );
- if ( rEventDescriptor.isMouseEvent() )
- {
- const awt::MouseEvent& rEvent( rEventDescriptor.getMouseEvent() );
- switch ( rEventDescriptor.getMouseEventType() )
- {
- case EVENT_MOUSE_PRESSED:
- maMouseListeners.mousePressed( rEvent );
- break;
- case EVENT_MOUSE_RELEASED:
- maMouseListeners.mouseReleased( rEvent );
- break;
- case EVENT_MOUSE_ENTERED:
- maMouseListeners.mouseEntered( rEvent );
- break;
- case EVENT_MOUSE_EXITED:
- maMouseListeners.mouseExited( rEvent );
- break;
- default:
- DBG_ERROR( "VCLXWindowImpl::processEvent: what kind of event *is* this (1)?" );
- break;
- }
- }
- else if ( rEventDescriptor.isPlainEvent() )
- {
- const lang::EventObject& rEvent( rEventDescriptor.getPlainEvent() );
- switch ( rEventDescriptor.getPlainEventType() )
- {
- case EVENT_WINDOW_ENABLED:
- maWindow2Listeners.notifyEach( &XWindowListener2::windowEnabled, rEvent );
- break;
- case EVENT_WINDOW_DISABLED:
- maWindow2Listeners.notifyEach( &XWindowListener2::windowDisabled, rEvent );
- break;
- default:
- DBG_ERROR( "VCLXWindowImpl::processEvent: what kind of event *is* this (2)?" );
- break;
- }
- }
- else
+
+ const lang::EventObject& rEvent( rEventDescriptor.getEvent() );
+ switch ( rEventDescriptor.getEventType() )
{
- DBG_ERROR( "VCLXWindowImpl::processEvent: what kind of event *is* this (3)?" );
+ case EVENT_WINDOW_ENABLED:
+ maWindow2Listeners.notifyEach( &XWindowListener2::windowEnabled, rEvent );
+ break;
+ case EVENT_WINDOW_DISABLED:
+ maWindow2Listeners.notifyEach( &XWindowListener2::windowDisabled, rEvent );
+ break;
+ default:
+ DBG_ERROR( "VCLXWindowImpl::processEvent: what kind of event *is* this (2)?" );
+ break;
}
}
@@ -713,7 +609,7 @@ void VCLXWindow::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
{
bool bEnabled = ( VCLEVENT_WINDOW_ENABLED == rVclWindowEvent.GetId() );
EventObject aEvent( *this );
- mpImpl->notifyPlainEvent( aEvent,
+ mpImpl->notifyEvent( aEvent,
bEnabled ? EVENT_WINDOW_ENABLED : EVENT_WINDOW_DISABLED );
}
break;
@@ -945,7 +841,13 @@ void VCLXWindow::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
MouseEvent aMEvt( aWhere, 1, MOUSE_SIMPLECLICK, MOUSE_LEFT, 0 );
awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( aMEvt, *this ) );
aEvent.PopupTrigger = sal_True;
- mpImpl->notifyMouseEvent( aEvent, EVENT_MOUSE_PRESSED );
+
+ Callback aCallback = ::boost::bind(
+ &MouseListenerMultiplexer::mousePressed,
+ &mpImpl->getMouseListeners(),
+ aEvent
+ );
+ ImplExecuteAsyncWithoutSolarLock( aCallback );
}
}
break;
@@ -955,10 +857,13 @@ void VCLXWindow::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
if ( mpImpl->getMouseListeners().getLength() && ( pMouseEvt->IsEnterWindow() || pMouseEvt->IsLeaveWindow() ) )
{
awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( *pMouseEvt, *this ) );
- mpImpl->notifyMouseEvent(
- aEvent,
- pMouseEvt->IsEnterWindow() ? EVENT_MOUSE_ENTERED : EVENT_MOUSE_EXITED
+
+ Callback aCallback = ::boost::bind(
+ pMouseEvt->IsEnterWindow() ? &MouseListenerMultiplexer::mouseEntered : &MouseListenerMultiplexer::mouseExited,
+ &mpImpl->getMouseListeners(),
+ aEvent
);
+ ImplExecuteAsyncWithoutSolarLock( aCallback );
}
if ( mpImpl->getMouseMotionListeners().getLength() && !pMouseEvt->IsEnterWindow() && !pMouseEvt->IsLeaveWindow() )
@@ -977,7 +882,12 @@ void VCLXWindow::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
if ( mpImpl->getMouseListeners().getLength() )
{
awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( *(MouseEvent*)rVclWindowEvent.GetData(), *this ) );
- mpImpl->notifyMouseEvent( aEvent, EVENT_MOUSE_PRESSED );
+ Callback aCallback = ::boost::bind(
+ &MouseListenerMultiplexer::mousePressed,
+ &mpImpl->getMouseListeners(),
+ aEvent
+ );
+ ImplExecuteAsyncWithoutSolarLock( aCallback );
}
}
break;
@@ -986,7 +896,12 @@ void VCLXWindow::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
if ( mpImpl->getMouseListeners().getLength() )
{
awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( *(MouseEvent*)rVclWindowEvent.GetData(), *this ) );
- mpImpl->notifyMouseEvent( aEvent, EVENT_MOUSE_RELEASED );
+ Callback aCallback = ::boost::bind(
+ &MouseListenerMultiplexer::mouseReleased,
+ &mpImpl->getMouseListeners(),
+ aEvent
+ );
+ ImplExecuteAsyncWithoutSolarLock( aCallback );
}
}
break;