summaryrefslogtreecommitdiff
path: root/slideshow/source/engine/eventmultiplexer.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'slideshow/source/engine/eventmultiplexer.cxx')
-rw-r--r--slideshow/source/engine/eventmultiplexer.cxx1280
1 files changed, 0 insertions, 1280 deletions
diff --git a/slideshow/source/engine/eventmultiplexer.cxx b/slideshow/source/engine/eventmultiplexer.cxx
deleted file mode 100644
index 28ca27443..000000000
--- a/slideshow/source/engine/eventmultiplexer.cxx
+++ /dev/null
@@ -1,1280 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_slideshow.hxx"
-
-// must be first
-#include <canvas/debug.hxx>
-#include <tools/diagnose_ex.h>
-
-#include <rtl/ref.hxx>
-#include <cppuhelper/compbase2.hxx>
-#include <cppuhelper/basemutex.hxx>
-
-#include <com/sun/star/awt/XMouseListener.hpp>
-#include <com/sun/star/awt/XMouseMotionListener.hpp>
-#include <com/sun/star/awt/SystemPointer.hpp>
-#include <com/sun/star/awt/XWindow.hpp>
-#include <com/sun/star/awt/MouseButton.hpp>
-#include <com/sun/star/presentation/XSlideShowView.hpp>
-
-#include <basegfx/matrix/b2dhommatrix.hxx>
-#include <basegfx/numeric/ftools.hxx>
-
-#include "tools.hxx"
-#include "eventqueue.hxx"
-#include "eventmultiplexer.hxx"
-#include "listenercontainer.hxx"
-#include "delayevent.hxx"
-#include "unoview.hxx"
-#include "unoviewcontainer.hxx"
-
-#include <boost/shared_ptr.hpp>
-#include <boost/weak_ptr.hpp>
-#include <boost/function.hpp>
-#include <boost/noncopyable.hpp>
-#include <boost/bind.hpp>
-
-#include <vector>
-#include <boost/unordered_map.hpp>
-#include <algorithm>
-
-using namespace ::com::sun::star;
-
-namespace boost
-{
- // add operator== for weak_ptr
- template<typename T> bool operator==( weak_ptr<T> const& rLHS,
- weak_ptr<T> const& rRHS )
- {
- return !(rLHS<rRHS) && !(rRHS<rLHS);
- }
-}
-
-namespace slideshow {
-namespace internal {
-
-template <typename HandlerT>
-class PrioritizedHandlerEntry
-{
- typedef boost::shared_ptr<HandlerT> HandlerSharedPtrT;
- HandlerSharedPtrT mpHandler;
- double mnPrio;
-
-public:
- PrioritizedHandlerEntry( HandlerSharedPtrT const& pHandler,
- double nPrio ) :
- mpHandler(pHandler),
- mnPrio(nPrio)
- {}
-
- HandlerSharedPtrT const& getHandler() const { return mpHandler; }
-
- /// To sort according to priority
- bool operator<( PrioritizedHandlerEntry const& rRHS ) const
- {
- // reversed order - high prioritized entries
- // should be at the beginning of the queue
- return mnPrio > rRHS.mnPrio;
- }
-
- /// To permit std::remove in removeHandler template
- bool operator==( PrioritizedHandlerEntry const& rRHS ) const
- {
- // ignore prio, for removal, only the handler ptr matters
- return mpHandler == rRHS.mpHandler;
- }
-};
-
-template<typename T> inline T* get_pointer(PrioritizedHandlerEntry<T> const& handler)
-{
- return handler.getHandler().get();
-}
-
-
-
-////////////////////////////////////////////////////////////////////////////
-
-
-typedef cppu::WeakComponentImplHelper2<
- awt::XMouseListener,
- awt::XMouseMotionListener > Listener_UnoBase;
-
-/** Listener class, to decouple UNO lifetime from EventMultiplexer
-
- This class gets registered as the XMouse(Motion)Listener on the
- XSlideViews, and passes on the events to the EventMultiplexer (via
- EventQueue indirection, to force the events into the main thread)
- */
-class EventMultiplexerListener : private cppu::BaseMutex,
- public Listener_UnoBase,
- private ::boost::noncopyable
-{
-public:
- EventMultiplexerListener( EventQueue& rEventQueue,
- EventMultiplexerImpl& rEventMultiplexer ) :
- Listener_UnoBase( m_aMutex ),
- mpEventQueue( &rEventQueue ),
- mpEventMultiplexer( &rEventMultiplexer )
- {
- }
-
- // WeakComponentImplHelperBase::disposing
- virtual void SAL_CALL disposing();
-
-private:
- virtual void SAL_CALL disposing( const lang::EventObject& Source )
- throw (uno::RuntimeException);
-
- // XMouseListener implementation
- virtual void SAL_CALL mousePressed( const awt::MouseEvent& e )
- throw (uno::RuntimeException);
- virtual void SAL_CALL mouseReleased( const awt::MouseEvent& e )
- throw (uno::RuntimeException);
- virtual void SAL_CALL mouseEntered( const awt::MouseEvent& e )
- throw (uno::RuntimeException);
- virtual void SAL_CALL mouseExited( const awt::MouseEvent& e )
- throw (uno::RuntimeException);
-
- // XMouseMotionListener implementation
- virtual void SAL_CALL mouseDragged( const awt::MouseEvent& e )
- throw (uno::RuntimeException);
- virtual void SAL_CALL mouseMoved( const awt::MouseEvent& e )
- throw (uno::RuntimeException);
-
-
- EventQueue* mpEventQueue;
- EventMultiplexerImpl* mpEventMultiplexer;
-};
-
-
-////////////////////////////////////////////////////////////////////////////
-
-
-struct EventMultiplexerImpl
-{
- EventMultiplexerImpl( EventQueue& rEventQueue,
- UnoViewContainer const& rViewContainer ) :
- mrEventQueue(rEventQueue),
- mrViewContainer(rViewContainer),
- mxListener( new EventMultiplexerListener(rEventQueue,
- *this) ),
- maNextEffectHandlers(),
- maSlideStartHandlers(),
- maSlideEndHandlers(),
- maAnimationStartHandlers(),
- maAnimationEndHandlers(),
- maSlideAnimationsEndHandlers(),
- maAudioStoppedHandlers(),
- maCommandStopAudioHandlers(),
- maPauseHandlers(),
- maViewHandlers(),
- maViewRepaintHandlers(),
- maShapeListenerHandlers(),
- maUserPaintEventHandlers(),
- maShapeCursorHandlers(),
- maMouseClickHandlers(),
- maMouseDoubleClickHandlers(),
- maMouseMoveHandlers(),
- maHyperlinkHandlers(),
- mnTimeout(0.0),
- mpTickEvent(),
- mbIsAutoMode(false)
- {}
-
- ~EventMultiplexerImpl()
- {
- if( mxListener.is() )
- mxListener->dispose();
- }
-
- /// Remove all handlers
- void clear();
-
- // actual handler callbacks (get called from the UNO interface
- // listeners via event queue)
- void mousePressed( const awt::MouseEvent& e );
- void mouseReleased( const awt::MouseEvent& e );
- void mouseDragged( const awt::MouseEvent& e );
- void mouseMoved( const awt::MouseEvent& e );
-
- bool isMouseListenerRegistered() const;
-
- typedef ThreadUnsafeListenerContainer<
- PrioritizedHandlerEntry<EventHandler>,
- std::vector<
- PrioritizedHandlerEntry<EventHandler> > > ImplNextEffectHandlers;
- typedef PrioritizedHandlerEntry<MouseEventHandler> ImplMouseHandlerEntry;
- typedef ThreadUnsafeListenerContainer<
- ImplMouseHandlerEntry,
- std::vector<ImplMouseHandlerEntry> > ImplMouseHandlers;
- typedef ThreadUnsafeListenerContainer<
- EventHandlerSharedPtr,
- std::vector<EventHandlerSharedPtr> > ImplEventHandlers;
- typedef ThreadUnsafeListenerContainer<
- AnimationEventHandlerSharedPtr,
- std::vector<AnimationEventHandlerSharedPtr> > ImplAnimationHandlers;
- typedef ThreadUnsafeListenerContainer<
- PauseEventHandlerSharedPtr,
- std::vector<PauseEventHandlerSharedPtr> > ImplPauseHandlers;
- typedef ThreadUnsafeListenerContainer<
- ViewEventHandlerWeakPtr,
- std::vector<ViewEventHandlerWeakPtr> > ImplViewHandlers;
- typedef ThreadUnsafeListenerContainer<
- ViewRepaintHandlerSharedPtr,
- std::vector<ViewRepaintHandlerSharedPtr> > ImplRepaintHandlers;
- typedef ThreadUnsafeListenerContainer<
- ShapeListenerEventHandlerSharedPtr,
- std::vector<ShapeListenerEventHandlerSharedPtr> > ImplShapeListenerHandlers;
- typedef ThreadUnsafeListenerContainer<
- UserPaintEventHandlerSharedPtr,
- std::vector<UserPaintEventHandlerSharedPtr> > ImplUserPaintEventHandlers;
- typedef ThreadUnsafeListenerContainer<
- ShapeCursorEventHandlerSharedPtr,
- std::vector<ShapeCursorEventHandlerSharedPtr> > ImplShapeCursorHandlers;
- typedef ThreadUnsafeListenerContainer<
- PrioritizedHandlerEntry<HyperlinkHandler>,
- std::vector<PrioritizedHandlerEntry<HyperlinkHandler> > > ImplHyperLinkHandlers;
-
- template <typename XSlideShowViewFunc>
- void forEachView( XSlideShowViewFunc pViewMethod );
-
- UnoViewSharedPtr findUnoView(const uno::Reference<
- presentation::XSlideShowView>& xView) const;
-
- template< typename RegisterFunction >
- void addMouseHandler( ImplMouseHandlers& rHandlerContainer,
- const MouseEventHandlerSharedPtr& rHandler,
- double nPriority,
- RegisterFunction pRegisterListener );
-
- bool notifyAllAnimationHandlers( ImplAnimationHandlers const& rContainer,
- AnimationNodeSharedPtr const& rNode );
-
- bool notifyMouseHandlers(
- const ImplMouseHandlers& rQueue,
- bool (MouseEventHandler::*pHandlerMethod)(
- const awt::MouseEvent& ),
- const awt::MouseEvent& e );
-
- bool notifyNextEffect();
-
- /// Called for automatic nextEffect
- void tick();
-
- /// Schedules a tick event
- void scheduleTick();
-
- /// Schedules tick events, if mbIsAutoMode is true
- void handleTicks();
-
-
- EventQueue& mrEventQueue;
- UnoViewContainer const& mrViewContainer;
- ::rtl::Reference<
- EventMultiplexerListener> mxListener;
-
- ImplNextEffectHandlers maNextEffectHandlers;
- ImplEventHandlers maSlideStartHandlers;
- ImplEventHandlers maSlideEndHandlers;
- ImplAnimationHandlers maAnimationStartHandlers;
- ImplAnimationHandlers maAnimationEndHandlers;
- ImplEventHandlers maSlideAnimationsEndHandlers;
- ImplAnimationHandlers maAudioStoppedHandlers;
- ImplAnimationHandlers maCommandStopAudioHandlers;
- ImplPauseHandlers maPauseHandlers;
- ImplViewHandlers maViewHandlers;
- ImplRepaintHandlers maViewRepaintHandlers;
- ImplShapeListenerHandlers maShapeListenerHandlers;
- ImplUserPaintEventHandlers maUserPaintEventHandlers;
- ImplShapeCursorHandlers maShapeCursorHandlers;
- ImplMouseHandlers maMouseClickHandlers;
- ImplMouseHandlers maMouseDoubleClickHandlers;
- ImplMouseHandlers maMouseMoveHandlers;
- ImplHyperLinkHandlers maHyperlinkHandlers;
-
- /// automatic next effect mode timeout
- double mnTimeout;
-
- /** Holds ptr to optional tick event weakly
-
- When event queue is cleansed, the next
- setAutomaticMode(true) call is then able to
- regenerate the event.
- */
- ::boost::weak_ptr< Event > mpTickEvent;
- bool mbIsAutoMode;
-};
-
-
-///////////////////////////////////////////////////////////////////////////
-
-
-void SAL_CALL EventMultiplexerListener::disposing()
-{
- osl::MutexGuard const guard( m_aMutex );
- mpEventQueue = NULL;
- mpEventMultiplexer = NULL;
-}
-
-void SAL_CALL EventMultiplexerListener::disposing(
- const lang::EventObject& /*rSource*/ ) throw (uno::RuntimeException)
-{
- // there's no real point in acting on this message - after all,
- // the event sources are the XSlideShowViews, which must be
- // explicitely removed from the slideshow via
- // XSlideShow::removeView(). thus, if a XSlideShowView has
- // properly removed itself from the slideshow, it will not be
- // found here. and if it hasn't, there'll be other references at
- // other places within the slideshow, anyway...
-}
-
-void SAL_CALL EventMultiplexerListener::mousePressed(
- const awt::MouseEvent& e ) throw (uno::RuntimeException)
-{
- osl::MutexGuard const guard( m_aMutex );
-
- // notify mouse press. Don't call handlers directly, this
- // might not be the main thread!
- if( mpEventQueue )
- mpEventQueue->addEvent(
- makeEvent( boost::bind( &EventMultiplexerImpl::mousePressed,
- mpEventMultiplexer,
- e ),
- "EventMultiplexerImpl::mousePressed") );
-}
-
-void SAL_CALL EventMultiplexerListener::mouseReleased(
- const awt::MouseEvent& e ) throw (uno::RuntimeException)
-{
- osl::MutexGuard const guard( m_aMutex );
-
- // notify mouse release. Don't call handlers directly,
- // this might not be the main thread!
- if( mpEventQueue )
- mpEventQueue->addEvent(
- makeEvent( boost::bind( &EventMultiplexerImpl::mouseReleased,
- mpEventMultiplexer,
- e ),
- "EventMultiplexerImpl::mouseReleased") );
-}
-
-void SAL_CALL EventMultiplexerListener::mouseEntered(
- const awt::MouseEvent& /*e*/ ) throw (uno::RuntimeException)
-{
- // not used here
-}
-
-void SAL_CALL EventMultiplexerListener::mouseExited(
- const awt::MouseEvent& /*e*/ ) throw (uno::RuntimeException)
-{
- // not used here
-}
-
-// XMouseMotionListener implementation
-void SAL_CALL EventMultiplexerListener::mouseDragged(
- const awt::MouseEvent& e ) throw (uno::RuntimeException)
-{
- osl::MutexGuard const guard( m_aMutex );
-
- // notify mouse drag. Don't call handlers directly, this
- // might not be the main thread!
- if( mpEventQueue )
- mpEventQueue->addEvent(
- makeEvent( boost::bind( &EventMultiplexerImpl::mouseDragged,
- mpEventMultiplexer,
- e ),
- "EventMultiplexerImpl::mouseDragged") );
-}
-
-void SAL_CALL EventMultiplexerListener::mouseMoved(
- const awt::MouseEvent& e ) throw (uno::RuntimeException)
-{
- osl::MutexGuard const guard( m_aMutex );
-
- // notify mouse move. Don't call handlers directly, this
- // might not be the main thread!
- if( mpEventQueue )
- mpEventQueue->addEvent(
- makeEvent( boost::bind( &EventMultiplexerImpl::mouseMoved,
- mpEventMultiplexer,
- e ),
- "EventMultiplexerImpl::mouseMoved") );
-}
-
-
-///////////////////////////////////////////////////////////////////////////
-
-
-bool EventMultiplexerImpl::notifyAllAnimationHandlers( ImplAnimationHandlers const& rContainer,
- AnimationNodeSharedPtr const& rNode )
-{
- return rContainer.applyAll(
- boost::bind( &AnimationEventHandler::handleAnimationEvent,
- _1, boost::cref(rNode) ) );
-}
-
-template <typename XSlideShowViewFunc>
-void EventMultiplexerImpl::forEachView( XSlideShowViewFunc pViewMethod )
-{
- if( pViewMethod )
- {
- // (un)register mouse listener on all views
- for( UnoViewVector::const_iterator aIter( mrViewContainer.begin() ),
- aEnd( mrViewContainer.end() ); aIter != aEnd; ++aIter )
- {
- uno::Reference<presentation::XSlideShowView> xView ((*aIter)->getUnoView());
- if (xView.is())
- {
- (xView.get()->*pViewMethod)( mxListener.get() );
- }
- else
- {
- OSL_ASSERT(xView.is());
- }
- }
- }
-}
-
-UnoViewSharedPtr EventMultiplexerImpl::findUnoView(
- const uno::Reference<presentation::XSlideShowView>& xView) const
-{
- // find view from which the change originated
- UnoViewVector::const_iterator aIter;
- const UnoViewVector::const_iterator aEnd ( mrViewContainer.end() );
- if( (aIter=std::find_if( mrViewContainer.begin(),
- aEnd,
- boost::bind(
- std::equal_to<uno::Reference<presentation::XSlideShowView> >(),
- boost::cref( xView ),
- boost::bind( &UnoView::getUnoView, _1 )))) == aEnd )
- {
- OSL_FAIL("EventMultiplexer::findUnoView(): unexpected message source" );
- return UnoViewSharedPtr();
- }
-
- return *aIter;
-}
-
-template< typename RegisterFunction >
-void EventMultiplexerImpl::addMouseHandler(
- ImplMouseHandlers& rHandlerContainer,
- const MouseEventHandlerSharedPtr& rHandler,
- double nPriority,
- RegisterFunction pRegisterListener )
-{
- ENSURE_OR_THROW(
- rHandler,
- "EventMultiplexer::addMouseHandler(): Invalid handler" );
-
- // register mouse listener on all views
- forEachView( pRegisterListener );
-
- // add into sorted container:
- rHandlerContainer.addSorted(
- typename ImplMouseHandlers::container_type::value_type(
- rHandler,
- nPriority ));
-}
-
-bool EventMultiplexerImpl::isMouseListenerRegistered() const
-{
- return !(maMouseClickHandlers.isEmpty() &&
- maMouseDoubleClickHandlers.isEmpty());
-}
-
-void EventMultiplexerImpl::tick()
-{
- if( !mbIsAutoMode )
- return; // this event is just a left-over, ignore
-
- notifyNextEffect();
-
- if( !maNextEffectHandlers.isEmpty() )
- {
- // still handlers left, schedule next timeout
- // event. Will also set mbIsTickEventOn back to true
- scheduleTick();
- }
-}
-
-void EventMultiplexerImpl::scheduleTick()
-{
- EventSharedPtr pEvent(
- makeDelay( boost::bind( &EventMultiplexerImpl::tick,
- this ),
- mnTimeout,
- "EventMultiplexerImpl::tick with delay"));
-
- // store weak reference to generated event, to notice when
- // the event queue gets cleansed (we then have to
- // regenerate the tick event!)
- mpTickEvent = pEvent;
-
- // enabled auto mode: simply schedule a timeout event,
- // which will eventually call our tick() method
- mrEventQueue.addEventForNextRound( pEvent );
-}
-
-void EventMultiplexerImpl::handleTicks()
-{
- if( !mbIsAutoMode )
- return; // nothing to do, don't need no ticks
-
- EventSharedPtr pTickEvent( mpTickEvent.lock() );
- if( pTickEvent )
- return; // nothing to do, there's already a tick
- // pending
-
- // schedule initial tick (which reschedules itself
- // after that, all by itself)
- scheduleTick();
-}
-
-
-void EventMultiplexerImpl::clear()
-{
- // deregister from all views.
- if( isMouseListenerRegistered() )
- {
- for( UnoViewVector::const_iterator aIter=mrViewContainer.begin(),
- aEnd=mrViewContainer.end();
- aIter!=aEnd;
- ++aIter )
- {
- if( (*aIter)->getUnoView().is() )
- (*aIter)->getUnoView()->removeMouseListener( mxListener.get() );
- }
- }
-
- if( !maMouseMoveHandlers.isEmpty() )
- {
- for( UnoViewVector::const_iterator aIter=mrViewContainer.begin(),
- aEnd=mrViewContainer.end();
- aIter!=aEnd;
- ++aIter )
- {
- if( (*aIter)->getUnoView().is() )
- (*aIter)->getUnoView()->removeMouseMotionListener( mxListener.get() );
- }
- }
-
- // clear all handlers (releases all references)
- maNextEffectHandlers.clear();
- maSlideStartHandlers.clear();
- maSlideEndHandlers.clear();
- maAnimationStartHandlers.clear();
- maAnimationEndHandlers.clear();
- maSlideAnimationsEndHandlers.clear();
- maAudioStoppedHandlers.clear();
- maCommandStopAudioHandlers.clear();
- maPauseHandlers.clear();
- maViewHandlers.clear();
- maViewRepaintHandlers.clear();
- maMouseClickHandlers.clear();
- maMouseDoubleClickHandlers.clear();
- maMouseMoveHandlers.clear();
- maHyperlinkHandlers.clear();
- mpTickEvent.reset();
-}
-
-// XMouseListener implementation
-bool EventMultiplexerImpl::notifyMouseHandlers(
- const ImplMouseHandlers& rQueue,
- bool (MouseEventHandler::*pHandlerMethod)( const awt::MouseEvent& ),
- const awt::MouseEvent& e )
-{
- uno::Reference<presentation::XSlideShowView> xView(
- e.Source, uno::UNO_QUERY );
-
- ENSURE_OR_RETURN_FALSE( xView.is(), "EventMultiplexer::notifyHandlers(): "
- "event source is not an XSlideShowView" );
-
- // find corresponding view (to map mouse position into user
- // coordinate space)
- UnoViewVector::const_iterator aIter;
- const UnoViewVector::const_iterator aBegin( mrViewContainer.begin() );
- const UnoViewVector::const_iterator aEnd ( mrViewContainer.end() );
- if( (aIter=::std::find_if(
- aBegin, aEnd,
- boost::bind( std::equal_to< uno::Reference<
- presentation::XSlideShowView > >(),
- boost::cref( xView ),
- boost::bind( &UnoView::getUnoView, _1 ) ) ) ) == aEnd)
- {
- ENSURE_OR_RETURN_FALSE(
- false, "EventMultiplexer::notifyHandlers(): "
- "event source not found under registered views" );
- }
-
- // convert mouse position to user coordinate space
- ::basegfx::B2DPoint aPosition( e.X, e.Y );
- ::basegfx::B2DHomMatrix aMatrix( (*aIter)->getTransformation() );
- if( !aMatrix.invert() )
- ENSURE_OR_THROW( false, "EventMultiplexer::notifyHandlers():"
- " view matrix singular" );
- aPosition *= aMatrix;
-
- awt::MouseEvent aEvent( e );
- aEvent.X = ::basegfx::fround( aPosition.getX() );
- aEvent.Y = ::basegfx::fround( aPosition.getY() );
-
- // fire event on handlers, try in order of precedence. If
- // one high-priority handler rejects the event
- // (i.e. returns false), try next handler.
- return rQueue.apply(
- boost::bind(
- pHandlerMethod,
- boost::bind(
- &ImplMouseHandlers::container_type::value_type::getHandler,
- _1 ),
- aEvent ));
-}
-
-void EventMultiplexerImpl::mousePressed( const awt::MouseEvent& e )
-{
- // fire double-click events for every second click
- sal_Int32 nCurrClickCount = e.ClickCount;
- while( nCurrClickCount > 1 &&
- notifyMouseHandlers( maMouseDoubleClickHandlers,
- &MouseEventHandler::handleMousePressed,
- e ))
- {
- nCurrClickCount -= 2;
- }
-
- // fire single-click events for all remaining clicks
- while( nCurrClickCount > 0 &&
- notifyMouseHandlers( maMouseClickHandlers,
- &MouseEventHandler::handleMousePressed,
- e ))
- {
- --nCurrClickCount;
- }
-}
-
-void EventMultiplexerImpl::mouseReleased( const awt::MouseEvent& e )
-{
- // fire double-click events for every second click
- sal_Int32 nCurrClickCount = e.ClickCount;
- while( nCurrClickCount > 1 &&
- notifyMouseHandlers( maMouseDoubleClickHandlers,
- &MouseEventHandler::handleMouseReleased,
- e ))
- {
- nCurrClickCount -= 2;
- }
-
- // fire single-click events for all remaining clicks
- while( nCurrClickCount > 0 &&
- notifyMouseHandlers( maMouseClickHandlers,
- &MouseEventHandler::handleMouseReleased,
- e ))
- {
- --nCurrClickCount;
- }
-}
-
-void EventMultiplexerImpl::mouseDragged( const awt::MouseEvent& e )
-{
- notifyMouseHandlers( maMouseMoveHandlers,
- &MouseEventHandler::handleMouseDragged,
- e );
-}
-
-void EventMultiplexerImpl::mouseMoved( const awt::MouseEvent& e )
-{
- notifyMouseHandlers( maMouseMoveHandlers,
- &MouseEventHandler::handleMouseMoved,
- e );
-}
-
-bool EventMultiplexerImpl::notifyNextEffect()
-{
- // fire event on handlers, try in order of precedence. If one
- // high-priority handler rejects the event (i.e. returns false),
- // try next handler.
- return maNextEffectHandlers.apply(
- boost::bind(
- &EventHandler::handleEvent,
- boost::bind(
- &ImplNextEffectHandlers::container_type::value_type::getHandler,
- _1 )) );
-}
-
-//////////////////////////////////////////////////////////////////////////
-
-
-EventMultiplexer::EventMultiplexer( EventQueue& rEventQueue,
- UnoViewContainer const& rViewContainer ) :
- mpImpl( new EventMultiplexerImpl(rEventQueue, rViewContainer) )
-{
-}
-
-EventMultiplexer::~EventMultiplexer()
-{
- // outline because of EventMultiplexerImpl's incomplete type
-}
-
-void EventMultiplexer::clear()
-{
- mpImpl->clear();
-}
-
-void EventMultiplexer::setAutomaticMode( bool bIsAuto )
-{
- if( bIsAuto == mpImpl->mbIsAutoMode )
- return; // no change, nothing to do
-
- mpImpl->mbIsAutoMode = bIsAuto;
-
- mpImpl->handleTicks();
-}
-
-bool EventMultiplexer::getAutomaticMode() const
-{
- return mpImpl->mbIsAutoMode;
-}
-
-void EventMultiplexer::setAutomaticTimeout( double nTimeout )
-{
- mpImpl->mnTimeout = nTimeout;
-}
-
-double EventMultiplexer::getAutomaticTimeout() const
-{
- return mpImpl->mnTimeout;
-}
-
-void EventMultiplexer::addNextEffectHandler(
- EventHandlerSharedPtr const& rHandler,
- double nPriority )
-{
- mpImpl->maNextEffectHandlers.addSorted(
- EventMultiplexerImpl::ImplNextEffectHandlers::container_type::value_type(
- rHandler,
- nPriority) );
-
- // Enable tick events, if not done already
- mpImpl->handleTicks();
-}
-
-void EventMultiplexer::removeNextEffectHandler(
- const EventHandlerSharedPtr& rHandler )
-{
- mpImpl->maNextEffectHandlers.remove(
- EventMultiplexerImpl::ImplNextEffectHandlers::container_type::value_type(
- rHandler,
- 0.0) );
-}
-
-void EventMultiplexer::addSlideStartHandler(
- const EventHandlerSharedPtr& rHandler )
-{
- mpImpl->maSlideStartHandlers.add( rHandler );
-}
-
-void EventMultiplexer::removeSlideStartHandler(
- const EventHandlerSharedPtr& rHandler )
-{
- mpImpl->maSlideStartHandlers.remove( rHandler );
-}
-
-void EventMultiplexer::addSlideEndHandler(
- const EventHandlerSharedPtr& rHandler )
-{
- mpImpl->maSlideEndHandlers.add( rHandler );
-}
-
-void EventMultiplexer::removeSlideEndHandler(
- const EventHandlerSharedPtr& rHandler )
-{
- mpImpl->maSlideEndHandlers.remove( rHandler );
-}
-
-void EventMultiplexer::addAnimationStartHandler(
- const AnimationEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maAnimationStartHandlers.add( rHandler );
-}
-
-void EventMultiplexer::removeAnimationStartHandler(
- const AnimationEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maAnimationStartHandlers.remove( rHandler );
-}
-
-void EventMultiplexer::addAnimationEndHandler(
- const AnimationEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maAnimationEndHandlers.add( rHandler );
-}
-
-void EventMultiplexer::removeAnimationEndHandler(
- const AnimationEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maAnimationEndHandlers.remove( rHandler );
-}
-
-void EventMultiplexer::addSlideAnimationsEndHandler(
- const EventHandlerSharedPtr& rHandler )
-{
- mpImpl->maSlideAnimationsEndHandlers.add( rHandler );
-}
-
-void EventMultiplexer::removeSlideAnimationsEndHandler(
- const EventHandlerSharedPtr& rHandler )
-{
- mpImpl->maSlideAnimationsEndHandlers.remove( rHandler );
-}
-
-void EventMultiplexer::addAudioStoppedHandler(
- const AnimationEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maAudioStoppedHandlers.add( rHandler );
-}
-
-void EventMultiplexer::removeAudioStoppedHandler(
- const AnimationEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maAudioStoppedHandlers.remove( rHandler );
-}
-
-void EventMultiplexer::addCommandStopAudioHandler(
- const AnimationEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maCommandStopAudioHandlers.add( rHandler );
-}
-
-void EventMultiplexer::removeCommandStopAudioHandler(
- const AnimationEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maCommandStopAudioHandlers.remove( rHandler );
-}
-
-void EventMultiplexer::addPauseHandler(
- const PauseEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maPauseHandlers.add( rHandler );
-}
-
-void EventMultiplexer::removePauseHandler(
- const PauseEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maPauseHandlers.remove( rHandler );
-}
-
-void EventMultiplexer::addViewHandler(
- const ViewEventHandlerWeakPtr& rHandler )
-{
- mpImpl->maViewHandlers.add( rHandler );
-}
-
-void EventMultiplexer::removeViewHandler( const ViewEventHandlerWeakPtr& rHandler )
-{
- mpImpl->maViewHandlers.remove( rHandler );
-}
-
-void EventMultiplexer::addViewRepaintHandler( const ViewRepaintHandlerSharedPtr& rHandler )
-{
- mpImpl->maViewRepaintHandlers.add( rHandler );
-}
-
-void EventMultiplexer::removeViewRepaintHandler( const ViewRepaintHandlerSharedPtr& rHandler )
-{
- mpImpl->maViewRepaintHandlers.remove( rHandler );
-}
-
-void EventMultiplexer::addShapeListenerHandler( const ShapeListenerEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maShapeListenerHandlers.add( rHandler );
-}
-
-void EventMultiplexer::removeShapeListenerHandler( const ShapeListenerEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maShapeListenerHandlers.remove( rHandler );
-}
-
-void EventMultiplexer::addUserPaintHandler( const UserPaintEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maUserPaintEventHandlers.add( rHandler );
-}
-
-void EventMultiplexer::removeUserPaintHandler( const UserPaintEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maUserPaintEventHandlers.remove( rHandler );
-}
-
-void EventMultiplexer::addShapeCursorHandler( const ShapeCursorEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maShapeCursorHandlers.add( rHandler );
-}
-
-void EventMultiplexer::removeShapeCursorHandler( const ShapeCursorEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maShapeCursorHandlers.remove( rHandler );
-}
-
-void EventMultiplexer::addClickHandler(
- const MouseEventHandlerSharedPtr& rHandler,
- double nPriority )
-{
- mpImpl->addMouseHandler(
- mpImpl->maMouseClickHandlers,
- rHandler,
- nPriority,
- mpImpl->isMouseListenerRegistered()
- ? NULL
- : &presentation::XSlideShowView::addMouseListener );
-}
-
-void EventMultiplexer::removeClickHandler(
- const MouseEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maMouseClickHandlers.remove(
- EventMultiplexerImpl::ImplMouseHandlers::container_type::value_type(
- rHandler,
- 0.0) );
-
- if( !mpImpl->isMouseListenerRegistered() )
- mpImpl->forEachView( &presentation::XSlideShowView::removeMouseListener );
-}
-
-void EventMultiplexer::addDoubleClickHandler(
- const MouseEventHandlerSharedPtr& rHandler,
- double nPriority )
-{
- mpImpl->addMouseHandler(
- mpImpl->maMouseDoubleClickHandlers,
- rHandler,
- nPriority,
- mpImpl->isMouseListenerRegistered()
- ? NULL
- : &presentation::XSlideShowView::addMouseListener );
-}
-
-void EventMultiplexer::removeDoubleClickHandler(
- const MouseEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maMouseDoubleClickHandlers.remove(
- EventMultiplexerImpl::ImplMouseHandlers::container_type::value_type(
- rHandler,
- 0.0) );
-
- if( !mpImpl->isMouseListenerRegistered() )
- mpImpl->forEachView( &presentation::XSlideShowView::removeMouseListener );
-}
-
-void EventMultiplexer::addMouseMoveHandler(
- const MouseEventHandlerSharedPtr& rHandler,
- double nPriority )
-{
- mpImpl->addMouseHandler(
- mpImpl->maMouseMoveHandlers,
- rHandler,
- nPriority,
- mpImpl->maMouseMoveHandlers.isEmpty()
- ? &presentation::XSlideShowView::addMouseMotionListener
- : NULL );
-}
-
-void EventMultiplexer::removeMouseMoveHandler(
- const MouseEventHandlerSharedPtr& rHandler )
-{
- mpImpl->maMouseMoveHandlers.remove(
- EventMultiplexerImpl::ImplMouseHandlers::container_type::value_type(
- rHandler,
- 0.0) );
-
- if( mpImpl->maMouseMoveHandlers.isEmpty() )
- mpImpl->forEachView(
- &presentation::XSlideShowView::removeMouseMotionListener );
-}
-
-void EventMultiplexer::addHyperlinkHandler( const HyperlinkHandlerSharedPtr& rHandler,
- double nPriority )
-{
- mpImpl->maHyperlinkHandlers.addSorted(
- EventMultiplexerImpl::ImplHyperLinkHandlers::container_type::value_type(
- rHandler,
- nPriority) );
-}
-
-void EventMultiplexer::removeHyperlinkHandler( const HyperlinkHandlerSharedPtr& rHandler )
-{
- mpImpl->maHyperlinkHandlers.remove(
- EventMultiplexerImpl::ImplHyperLinkHandlers::container_type::value_type(
- rHandler,
- 0.0) );
-}
-
-bool EventMultiplexer::notifyShapeListenerAdded(
- const uno::Reference<presentation::XShapeEventListener>& xListener,
- const uno::Reference<drawing::XShape>& xShape )
-{
- return mpImpl->maShapeListenerHandlers.applyAll(
- boost::bind(&ShapeListenerEventHandler::listenerAdded,
- _1,
- boost::cref(xListener),
- boost::cref(xShape)) );
-}
-
-bool EventMultiplexer::notifyShapeListenerRemoved(
- const uno::Reference<presentation::XShapeEventListener>& xListener,
- const uno::Reference<drawing::XShape>& xShape )
-{
- return mpImpl->maShapeListenerHandlers.applyAll(
- boost::bind(&ShapeListenerEventHandler::listenerRemoved,
- _1,
- boost::cref(xListener),
- boost::cref(xShape)) );
-}
-
-bool EventMultiplexer::notifyShapeCursorChange(
- const uno::Reference<drawing::XShape>& xShape,
- sal_Int16 nPointerShape )
-{
- return mpImpl->maShapeCursorHandlers.applyAll(
- boost::bind(&ShapeCursorEventHandler::cursorChanged,
- _1,
- boost::cref(xShape),
- nPointerShape));
-}
-
-bool EventMultiplexer::notifyUserPaintColor( RGBColor const& rUserColor )
-{
- return mpImpl->maUserPaintEventHandlers.applyAll(
- boost::bind(&UserPaintEventHandler::colorChanged,
- _1,
- boost::cref(rUserColor)));
-}
-
-bool EventMultiplexer::notifyUserPaintStrokeWidth( double rUserStrokeWidth )
-{
- return mpImpl->maUserPaintEventHandlers.applyAll(
- boost::bind(&UserPaintEventHandler::widthChanged,
- _1,
- rUserStrokeWidth));
-}
-
-bool EventMultiplexer::notifyUserPaintDisabled()
-{
- return mpImpl->maUserPaintEventHandlers.applyAll(
- boost::mem_fn(&UserPaintEventHandler::disable));
-}
-
-bool EventMultiplexer::notifySwitchPenMode(){
- return mpImpl->maUserPaintEventHandlers.applyAll(
- boost::mem_fn(&UserPaintEventHandler::switchPenMode));
-}
-
-bool EventMultiplexer::notifySwitchEraserMode(){
- return mpImpl->maUserPaintEventHandlers.applyAll(
- boost::mem_fn(&UserPaintEventHandler::switchEraserMode));
-}
-
-//adding erasing all ink features with UserPaintOverlay
-bool EventMultiplexer::notifyEraseAllInk( bool const& rEraseAllInk )
-{
- return mpImpl->maUserPaintEventHandlers.applyAll(
- boost::bind(&UserPaintEventHandler::eraseAllInkChanged,
- _1,
- boost::cref(rEraseAllInk)));
-}
-
-//adding erasing features with UserPaintOverlay
-bool EventMultiplexer::notifyEraseInkWidth( sal_Int32 rEraseInkSize )
-{
- return mpImpl->maUserPaintEventHandlers.applyAll(
- boost::bind(&UserPaintEventHandler::eraseInkWidthChanged,
- _1,
- boost::cref(rEraseInkSize)));
-}
-
-bool EventMultiplexer::notifyNextEffect()
-{
- return mpImpl->notifyNextEffect();
-}
-
-bool EventMultiplexer::notifySlideStartEvent()
-{
- return mpImpl->maSlideStartHandlers.applyAll(
- boost::mem_fn(&EventHandler::handleEvent) );
-}
-
-bool EventMultiplexer::notifySlideEndEvent()
-{
- return mpImpl->maSlideEndHandlers.applyAll(
- boost::mem_fn(&EventHandler::handleEvent) );
-}
-
-bool EventMultiplexer::notifyAnimationStart(
- const AnimationNodeSharedPtr& rNode )
-{
- return mpImpl->notifyAllAnimationHandlers( mpImpl->maAnimationStartHandlers,
- rNode );
-}
-
-bool EventMultiplexer::notifyAnimationEnd(
- const AnimationNodeSharedPtr& rNode )
-{
- return mpImpl->notifyAllAnimationHandlers( mpImpl->maAnimationEndHandlers,
- rNode );
-}
-
-bool EventMultiplexer::notifySlideAnimationsEnd()
-{
- return mpImpl->maSlideAnimationsEndHandlers.applyAll(
- boost::mem_fn(&EventHandler::handleEvent));
-}
-
-bool EventMultiplexer::notifyAudioStopped(
- const AnimationNodeSharedPtr& rNode )
-{
- return mpImpl->notifyAllAnimationHandlers(
- mpImpl->maAudioStoppedHandlers,
- rNode );
-}
-
-bool EventMultiplexer::notifyCommandStopAudio(
- const AnimationNodeSharedPtr& rNode )
-{
- return mpImpl->notifyAllAnimationHandlers(
- mpImpl->maCommandStopAudioHandlers,
- rNode );
-}
-
-bool EventMultiplexer::notifyPauseMode( bool bPauseShow )
-{
- return mpImpl->maPauseHandlers.applyAll(
- boost::bind( &PauseEventHandler::handlePause,
- _1, bPauseShow ));
-}
-
-bool EventMultiplexer::notifyViewAdded( const UnoViewSharedPtr& rView )
-{
- ENSURE_OR_THROW( rView, "EventMultiplexer::notifyViewAdded(): Invalid view");
-
- // register event listener
- uno::Reference<presentation::XSlideShowView> const rUnoView(
- rView->getUnoView() );
-
- if( mpImpl->isMouseListenerRegistered() )
- rUnoView->addMouseListener(
- mpImpl->mxListener.get() );
-
- if( !mpImpl->maMouseMoveHandlers.isEmpty() )
- rUnoView->addMouseMotionListener(
- mpImpl->mxListener.get() );
-
- return mpImpl->maViewHandlers.applyAll(
- boost::bind( &ViewEventHandler::viewAdded,
- _1,
- boost::cref(rView) ));
-}
-
-bool EventMultiplexer::notifyViewRemoved( const UnoViewSharedPtr& rView )
-{
- ENSURE_OR_THROW( rView,
- "EventMultiplexer::removeView(): Invalid view" );
-
- // revoke event listeners
- uno::Reference<presentation::XSlideShowView> const rUnoView(
- rView->getUnoView() );
-
- if( mpImpl->isMouseListenerRegistered() )
- rUnoView->removeMouseListener(
- mpImpl->mxListener.get() );
-
- if( !mpImpl->maMouseMoveHandlers.isEmpty() )
- rUnoView->removeMouseMotionListener(
- mpImpl->mxListener.get() );
-
- return mpImpl->maViewHandlers.applyAll(
- boost::bind( &ViewEventHandler::viewRemoved,
- _1,
- boost::cref(rView) ));
-}
-
-bool EventMultiplexer::notifyViewChanged( const UnoViewSharedPtr& rView )
-{
- return mpImpl->maViewHandlers.applyAll(
- boost::bind( &ViewEventHandler::viewChanged,
- _1,
- boost::cref(rView) ));
-}
-
-bool EventMultiplexer::notifyViewChanged( const uno::Reference<presentation::XSlideShowView>& xView )
-{
- UnoViewSharedPtr pView( mpImpl->findUnoView(xView) );
-
- if( !pView )
- return false; // view not registered here
-
- return notifyViewChanged( pView );
-}
-
-bool EventMultiplexer::notifyViewsChanged()
-{
- return mpImpl->maViewHandlers.applyAll(
- boost::mem_fn( &ViewEventHandler::viewsChanged ));
-}
-
-bool EventMultiplexer::notifyViewClobbered(
- const uno::Reference<presentation::XSlideShowView>& xView )
-{
- UnoViewSharedPtr pView( mpImpl->findUnoView(xView) );
-
- if( !pView )
- return false; // view not registered here
-
- return mpImpl->maViewRepaintHandlers.applyAll(
- boost::bind( &ViewRepaintHandler::viewClobbered,
- _1,
- boost::cref(pView) ));
-}
-
-bool EventMultiplexer::notifyHyperlinkClicked(
- rtl::OUString const& hyperLink )
-{
- return mpImpl->maHyperlinkHandlers.apply(
- boost::bind(&HyperlinkHandler::handleHyperlink,
- _1,
- boost::cref(hyperLink)) );
-}
-
-bool EventMultiplexer::notifySlideTransitionStarted()
-{
- return true;
-}
-
-} // namespace internal
-} // namespace presentation
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */