diff options
Diffstat (limited to 'slideshow/source/inc/eventmultiplexer.hxx')
-rw-r--r-- | slideshow/source/inc/eventmultiplexer.hxx | 1330 |
1 files changed, 643 insertions, 687 deletions
diff --git a/slideshow/source/inc/eventmultiplexer.hxx b/slideshow/source/inc/eventmultiplexer.hxx index d76ab72544ed..49d863bf4f70 100644 --- a/slideshow/source/inc/eventmultiplexer.hxx +++ b/slideshow/source/inc/eventmultiplexer.hxx @@ -4,9 +4,9 @@ * * $RCSfile: eventmultiplexer.hxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.6 $ * - * last change: $Author: rt $ $Date: 2005-09-07 21:11:26 $ + * last change: $Author: obo $ $Date: 2005-10-11 08:50:28 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -32,696 +32,652 @@ * MA 02111-1307 USA * ************************************************************************/ - -#ifndef _SLIDESHOW_EVENTMULTIPLEXER_HXX -#define _SLIDESHOW_EVENTMULTIPLEXER_HXX - -#ifndef _OSL_MUTEX_HXX_ -#include <osl/mutex.hxx> -#endif -#ifndef _RTL_REF_HXX_ -#include <rtl/ref.hxx> -#endif - -#ifndef _COM_SUN_STAR_UNO_REFERENCE_HXX_ -#include <com/sun/star/uno/Reference.hxx> -#endif -#ifndef _COM_SUN_STAR_AWT_XMOUSELISTENER_HPP_ -#include <com/sun/star/awt/XMouseListener.hpp> -#endif -#ifndef _COM_SUN_STAR_AWT_XMOUSEMOTIONLISTENER_HPP_ -#include <com/sun/star/awt/XMouseMotionListener.hpp> -#endif -#ifndef _CPPUHELPER_COMPBASE2_HXX_ -#include <cppuhelper/compbase2.hxx> -#endif -#ifndef _COMPHELPER_BROADCASTHELPER_HXX_ -#include <comphelper/broadcasthelper.hxx> -#endif - -#include <eventhandler.hxx> -#include <mouseeventhandler.hxx> -#include <animationeventhandler.hxx> -#include <pauseeventhandler.hxx> - -#include <layermanager.hxx> -#include <animationnode.hxx> -#include <eventqueue.hxx> -#include <unoview.hxx> - -#include <boost/weak_ptr.hpp> -#include <vector> - - -namespace com { namespace sun { namespace star { namespace awt +#if ! defined(INCLUDED_SLIDESHOW_EVENTMULTIPLEXER_HXX) +#define INCLUDED_SLIDESHOW_EVENTMULTIPLEXER_HXX + +#include "cppuhelper/compbase2.hxx" +#include "comphelper/broadcasthelper.hxx" +#include "eventhandler.hxx" +#include "mouseeventhandler.hxx" +#include "animationeventhandler.hxx" +#include "pauseeventhandler.hxx" +#include "layermanager.hxx" +#include "animationnode.hxx" +#include "eventqueue.hxx" +#include "unoview.hxx" +#include "com/sun/star/awt/XMouseListener.hpp" +#include "com/sun/star/awt/XMouseMotionListener.hpp" +#include "rtl/ref.hxx" +#include "boost/weak_ptr.hpp" +#include "boost/function.hpp" +#include "boost/noncopyable.hpp" + +namespace presentation { +namespace internal { + +typedef cppu::WeakComponentImplHelper2< + ::com::sun::star::awt::XMouseListener, + ::com::sun::star::awt::XMouseMotionListener > Listener_UnoBase; + +/** This class multiplexes user-activated and + slide-show-global events. + + This class listens at the XSlideShowView and fires events + registered for certain user actions. Furthermore, global + slide show state changes (such as start or end of a slide) + are handled as well. Note that registered events which + have a non-zero timeout (i.e. events that return non-zero + from getActivationTime()) will not be fired immediately + after the user action occured, but only after the given + timeout. Which is actually a feature. +*/ +class EventMultiplexer : private comphelper::OBaseMutex, + public Listener_UnoBase, + private ::boost::noncopyable { - struct MouseEvent; -} } } } +public: + /** Create an event multiplexer + + @param rEventQueue + Reference to the main event queue. Since we hold this + object by plain reference, it must live longer than we + do. On the other hand, that queue must not fire events + after this object is destroyed, since we might + schedule events there which itself contain plain + references to this object. Basically, EventQueue and + EventMultiplexer should have the same lifetime, and since + this is not possible, both must be destructed in a + phased mode: first clear both of any remaining events, + then destruct them. + */ + static ::rtl::Reference<EventMultiplexer> create( EventQueue& rEventQueue ); + + // Management methods + // ========================================================= + + /** Add a view the show is displayed upon. + + This method adds another view, which the show is + displayed on. On every added view, the EventMultiplexer + registers mouse and motion event listeners. + */ + bool addView( const UnoViewSharedPtr& rView ); + + /** Remove a view the show was displayed upon. + + This method removes a view. Registered mouse and + motion event listeners are revoked. + */ + bool removeView( const UnoViewSharedPtr& rView ); + + /** Clear all registered handlers. + */ + void clear(); + + // TODO(Q3): This is a wart. Remove from this class! + // Probably, there should exist a separate ViewContainer, + // which would expose such a method. + /** + */ + void setMouseCursor( sal_Int16 ); + + // TODO(Q3): This is a wart. Remove from this class! + // Probably, there should exist a separate ViewContainer, + // which would expose such a method. + /** Set volatile mouse cursor. + + A volatile mouse cursor only stays in effect, as long + as the mouse has not moved. As soon as the mouse + moves, the mouse cursor is set back to the value set + by setMouseCursor(). + */ + void setVolatileMouseCursor( sal_Int16 ); + + /** Set a LayerManager for update() calls. + + A LayerManager set via this method will receive an + update() call whenever updateScreen() is called on the + EventMultiplexer. This is handy to avoid multiple + redraws. Note that every setLayerManager() call will + overwrite any previously set. + */ + void setLayerManager( const LayerManagerSharedPtr& rMgr ); + + /** Update screen content + + This method updates the screen content, by first + updating all layers (if setLayerManager() was called + with a valid layer manager previously), and then + calling updateScreen() on all registered views. + + @param bForceUpdate + Force updateScreen() call, even if layer manager has + no updates pending. Set this parameter to true, if you + changed screen content or sprites and bypassed the + layer manager. + */ + void updateScreenContent( bool bForceUpdate ); + + // Automatic mode methods + // ========================================================= + + /** Change automatic mode. + + @param bIsAuto + When true, events will be fired automatically, not + only triggered by UI events. When false, auto events + will quit. + */ + void setAutomaticMode( bool bIsAuto ); + + /** Get automatic mode setting. + */ + bool getAutomaticMode() const; + + /** Set the timeout for automatic mode. + + @param nTimeout + Timeout, between end of effect until start of next + effect. + */ + void setAutomaticTimeout( double nTimeout ); + + /** Get automatic mode timeout value. + */ + double getAutomaticTimeout() const; + + // Handler registration methods + // ========================================================= + + /** Register an event handler that will be called when the + user requests the next effect. + + For every nextEffect event, only one of the handlers + registered here is called. The handlers are considered + with decreasing priority, i.e. the handler with the + currently highest priority will be called. + + @param rHandler + Handler to call when the next effect should start + + @param nPriority + Priority with which the handlers are called. The + higher the priority, the earlier this handler will be + tried. + */ + void addNextEffectHandler( const EventHandlerSharedPtr& rHandler, + double nPriority ); + void removeNextEffectHandler( const EventHandlerSharedPtr& rHandler ); + + /** Register an event handler that will be called when the + slide is just shown. + + Note that <em>all</em> registered handlers will be called + when the slide start occurs. This is in contrast to + the mouse events below. + + @param rHandler + Handler to call when the next slide starts + */ + void addSlideStartHandler( const EventHandlerSharedPtr& rHandler ); + void removeSlideStartHandler( const EventHandlerSharedPtr& rHandler ); + + /** Register an event handler that will be called when the + slide is about to vanish. + + Note that <em>all</em> registered handlers will be + called when the slide end occurs. This is in contrast + to the mouse events below. + + @param rHandler + Handler to call when the current slide ends + */ + void addSlideEndHandler( const EventHandlerSharedPtr& rHandler ); + void removeSlideEndHandler( const EventHandlerSharedPtr& rHandler ); + + /** Register an event handler that will be called when an + XAnimationNode starts its active duration. + + Note that <em>all</em> registered handlers will be called + when the animation start occurs. This is in contrast to + the mouse events below. + + @param rHandler + Handler to call when the animation start + */ + void addAnimationStartHandler( + const AnimationEventHandlerSharedPtr& rHandler ); + void removeAnimationStartHandler( + const AnimationEventHandlerSharedPtr& rHandler ); + + /** Register an event handler that will be called when an + XAnimationNode ends its active duration. + + Note that <em>all</em> registered handlers will be called + when the animation end occurs. This is in contrast to + the mouse events below. + + @param rHandler + Handler to call when the animation ends + */ + void addAnimationEndHandler( + const AnimationEventHandlerSharedPtr& rHandler ); + void removeAnimationEndHandler( + const AnimationEventHandlerSharedPtr& rHandler ); + + /** Register an event handler that will be called when the + main animation sequence of a slide ends its active + duration. + + Note that <em>all</em> registered handlers will be + called when the animation end occurs. This is in + contrast to the mouse events below. + + @param rHandler + Handler to call when the animation ends + */ + void addSlideAnimationsEndHandler( + const EventHandlerSharedPtr& rHandler ); + void removeSlideAnimationsEndHandler( + const EventHandlerSharedPtr& rHandler ); + + /** Register an event handler that will be called when an + XAudio node's sound stops playing. + + Note that <em>all</em> registered handlers will be + called when the audio stops. This is in contrast to + the mouse events below. + + @param rHandler + Handler to call when the audio stops + */ + void addAudioStoppedHandler( + const AnimationEventHandlerSharedPtr& rHandler ); + void removeAudioStoppedHandler( + const AnimationEventHandlerSharedPtr& rHandler ); + + /** Register an event handler that will be called when an + XCommand node's with the command STOPAUDIO is activated. + + Note that <em>all</em> registered handlers will be + called when the audio stops. This is in contrast to + the mouse events below. + + @param rHandler + Handler to call when command is activated + */ + void addCommandStopAudioHandler( + const AnimationEventHandlerSharedPtr& rHandler ); + void removeCommandStopAudioHandler( + const AnimationEventHandlerSharedPtr& rHandler ); + + /** Register a handler that is called when the show enters + or exits pause mode. + */ + void addPauseHandler( const PauseEventHandlerSharedPtr& rHandler ); + void removePauseHandler( const PauseEventHandlerSharedPtr& rHandler ); + + /** Register a mouse handler that is called on mouse click + + For every mouse click, only one of the handlers + registered here is called. The handlers are considered + with decreasing priority, i.e. the handler with the + currently highest priority will be called. + + Since the handlers can reject down and up events + individually, handlers should expect to be called with + non-matching down and up-press counts. If your handler + cannot cope with that, it must have the highest + priority of all added handlers. + */ + void addClickHandler( const MouseEventHandlerSharedPtr& rHandler, + double nPriority ); + void removeClickHandler( const MouseEventHandlerSharedPtr& rHandler ); + + /** Register a mouse handler that is called on a double + mouse click + + For every mouse double click, only one of the handlers + registered here is called. The handlers are considered + with decreasing priority, i.e. the handler with the + currently highest priority will be called. + + Since the handlers can reject down and up events + individually, handlers should expect to be called with + non-matching down and up-press counts. If your handler + cannot cope with that, it must have the highest + priority of all added handlers. + */ + void addDoubleClickHandler( const MouseEventHandlerSharedPtr& rHandler, + double nPriority ); + void removeDoubleClickHandler( const MouseEventHandlerSharedPtr& rHandler ); + + /** Register a mouse handler that is called for mouse moves. + + For every mouse move, only one of the handlers + registered here is called. The handlers are considered + with decreasing priority, i.e. the handler with the + currently highest priority will be called. + */ + void addMouseMoveHandler( const MouseEventHandlerSharedPtr& rHandler, + double nPriority ); + void removeMouseMoveHandler( const MouseEventHandlerSharedPtr& rHandler ); + + + // Hyperlink notifications + // ======================= + + typedef ::boost::function1< + bool /* whether event has been consumed */, + ::rtl::OUString /* actual hyperlink */ > HyperLinkHandlerFunc; + + /// HandlerId: usually _this_ pointer of handler instance + typedef void const* HandlerId; + + /** Registers a hyperlink click handler. + @param func handler function + @param id identifier for registration + */ + void addHyperlinkHandler( HyperLinkHandlerFunc const& func, HandlerId id ); + + /** Removes a hyperlink click handler. + @param id identifier for registration + */ + void removeHyperlinkHandler( HandlerId id ); + + + // External event notifications + // ========================================================= + + /** Notify that the user requested the next effect. + + This requests the slideshow to display the next + effect, or move to the next slide, if none are left. + + @return true, if this event was processed by + anybody. If false is returned, no handler processed + this event (and probably, nothing will happen at all) + */ + bool notifyNextEffect(); + + /** Notify that a new slide has started + + This method is to be used from the Presentation object + to signal that a new slide is starting now. This will + invoke all registered slide start handlers. + + @return true, if this event was processed by + anybody. If false is returned, no handler processed + this event (and probably, nothing will happen at all) + */ + bool notifySlideStartEvent(); + + /** Notify that a slide has ended + + This method is to be used from the Presentation object + to signal that a slide is ending now. This will invoke + all registered slide end handlers. + + @return true, if this event was processed by + anybody. If false is returned, no handler processed + this event (and probably, nothing will happen at all) + */ + bool notifySlideEndEvent(); + + /** Notify that the given node enters its active duration. + + This method is to be used from the AnimationNode + objects to signal that the active duration + begins. This will invoke all registered animation + start handlers. + + @param rNode + Node which enters active duration. + + @return true, if this event was processed by + anybody. If false is returned, no handler processed + this event (and probably, nothing will happen at all) + */ + bool notifyAnimationStart( const AnimationNodeSharedPtr& rNode ); + + /** Notify that the given node leaves its active duration. + + This method is to be used from the AnimationNode + objects to signal that the active duration + ends now. This will invoke all registered animation + end handlers. + + @param rNode + Node which leaves active duration. + + @return true, if this event was processed by + anybody. If false is returned, no handler processed + this event (and probably, nothing will happen at all) + */ + bool notifyAnimationEnd( const AnimationNodeSharedPtr& rNode ); + + /** Notify that the slide animations sequence leaves its + active duration. + + @return true, if this event was processed by + anybody. If false is returned, no handler processed + this event (and probably, nothing will happen at all) + */ + bool notifySlideAnimationsEnd(); + + /** Notify that for the given node, audio output has stopped. + + This method is to be used from the AnimationNode + objects to signal that audio playback has just + stopped. This will invoke all registered audio + stopped andlers. + + @param rNode + Node for which audio has stopped. + + @return true, if this event was processed by + anybody. If false is returned, no handler processed + this event (and probably, nothing will happen at all) + */ + bool notifyAudioStopped( const AnimationNodeSharedPtr& rNode ); + + /** Notify that the show has entered or exited pause mode + + This method is to be used from the Presentation object + to signal that a slide is entering (bPauseShow=true) + or exiting (bPauseShow=false) pause mode. This will + invoke all registered slide end handlers. + + @return true, if this event was processed by + anybody. If false is returned, no handler processed + this event (and probably, nothing will happen at all) + */ + bool notifyPauseMode( bool bPauseShow ); + + /** Notify that all audio has to be stoped. + + This method is used by XCommand nodes and all sound + playing nodes should listen for this command and + stop theire sounds when its fired. + + @return true, if this event was processed by + anybody. If false is returned, no handler processed + this event (and probably, nothing will happen at all) + */ + bool notifyCommandStopAudio( const AnimationNodeSharedPtr& rNode ); + + /** Botifies that a hyperlink has been clicked. + + @return true, if this event was processed by + anybody. If false is returned, no handler processed + this event (and probably, nothing will happen at all) + */ + bool notifyHyperlinkClicked( ::rtl::OUString const& hyperLink ); + +private: + EventMultiplexer( EventQueue& ); + virtual ~EventMultiplexer(); + +private: + // XMouseListener implementation + virtual void SAL_CALL disposing( + const ::com::sun::star::lang::EventObject& Source ) + throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL mousePressed( + const ::com::sun::star::awt::MouseEvent& e ) + throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL mouseReleased( + const ::com::sun::star::awt::MouseEvent& e ) + throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL mouseEntered( + const ::com::sun::star::awt::MouseEvent& e ) + throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL mouseExited( + const ::com::sun::star::awt::MouseEvent& e ) + throw (::com::sun::star::uno::RuntimeException); + + // XMouseMotionListener implementation + virtual void SAL_CALL mouseDragged( + const ::com::sun::star::awt::MouseEvent& e ) + throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL mouseMoved( + const ::com::sun::star::awt::MouseEvent& e ) + throw (::com::sun::star::uno::RuntimeException); + + // WeakComponentImplHelperBase::disposing + virtual void SAL_CALL disposing(); + +private: + // actual handler implementations (the UNO interface + // overrides above are only stubs) + void implMousePressed( const ::com::sun::star::awt::MouseEvent& e ); + void implMouseReleased( const ::com::sun::star::awt::MouseEvent& e ); + void implMouseDragged( const ::com::sun::star::awt::MouseEvent& e ); + void implMouseMoved( const ::com::sun::star::awt::MouseEvent& e ); + + bool isMouseListenerRegistered() const; + + template <typename HandlerT> + class PrioritizedHandlerEntry; + + typedef std::vector< + PrioritizedHandlerEntry<EventHandler> > ImplNextEffectHandlers; + typedef std::vector< + PrioritizedHandlerEntry<MouseEventHandler> > ImplMouseHandlers; + + typedef std::vector<EventHandlerSharedPtr> ImplEventHandlers; + typedef std::vector<AnimationEventHandlerSharedPtr> ImplAnimationHandlers; + typedef std::vector<PauseEventHandlerSharedPtr> ImplPauseHandlers; + + template <typename ContainerT, typename HandlerT> + void addHandler( ContainerT & rContainer, + boost::shared_ptr<HandlerT> const& pHandler ); + + template <typename ContainerT, typename HandlerT> + void addPrioritizedHandler( ContainerT & rContainer, + boost::shared_ptr<HandlerT> const& pHandler, + double nPriority ); + + template< typename Container, typename Handler > + void removeHandler( Container& rContainer, + const ::boost::shared_ptr< Handler >& rHandler ); + + template <typename XSlideShowViewFunc> + void forEachView( XSlideShowViewFunc pViewMethod ); + + template< typename RegisterFunction > + void addMouseHandler( ImplMouseHandlers& rHandlerContainer, + const MouseEventHandlerSharedPtr& rHandler, + double nPriority, + RegisterFunction pRegisterListener ); + + /** @return true: one handler returned true (iterating from begin to end) + false: no handler at all returned true + */ + template <typename ContainerT, typename FuncT> + bool notifySingleHandler( ContainerT const& rContainer, FuncT const& func, + bool bOperateOnCopy = true ); + + /** @return true: at least one handler returned true + false: not a single handler returned true + */ + template <typename ContainerT, typename FuncT> + bool notifyAllHandlers( ContainerT const& rContainer, FuncT const& func, + bool bOperateOnCopy = true ); + + bool notifyAllEventHandlers( ImplEventHandlers const& rContainer ) { + return notifyAllHandlers( rContainer, + boost::mem_fn(&EventHandler::handleEvent) ); + } -/* Definition of EventMultiplexer class */ + bool notifyAllAnimationHandlers( ImplAnimationHandlers const& rContainer, + AnimationNodeSharedPtr const& rNode ) { + return notifyAllHandlers( + rContainer, + boost::bind( &AnimationEventHandler::handleAnimationEvent, + _1, boost::cref(rNode) ) ); + } -namespace presentation -{ - namespace internal - { - /** This class multiplexes user-activated and - slide-show-global events. - - This class listens at the XSlideShowView and fires events - registered for certain user actions. Furthermore, global - slide show state changes (such as start or end of a slide) - are handled as well. Note that registered events which - have a non-zero timeout (i.e. events that return non-zero - from getActivationTime()) will not be fired immediately - after the user action occured, but only after the given - timeout. Which is actually a feature. - */ - class EventMultiplexer - { - public: - /** Create an event multiplexer - - @param rEventQueue - Reference to the main event queue. Since we hold this - object by plain reference, it must live longer than we - do. On the other hand, that queue must not fire events - after this object is destroyed, since we might - schedule events there which itself contain plain - references to this object. Basically, EventQueue and - EventMultiplexer should have the same lifetime, and since - this is not possible, both must be destructed in a - phased mode: first clear both of any remaining events, - then destruct them. - */ - EventMultiplexer( EventQueue& ); - ~EventMultiplexer(); - - - // Management methods - // ========================================================= - - /** Add a view the show is displayed upon. - - This method adds another view, which the show is - displayed on. On every added view, the EventMultiplexer - registers mouse and motion event listeners. - */ - bool addView( const UnoViewSharedPtr& rView ); - - /** Remove a view the show was displayed upon. - - This method removes a view. Registered mouse and - motion event listeners are revoked. - */ - bool removeView( const UnoViewSharedPtr& rView ); - - /** Clear all registered handlers. - */ - void clear(); - - // TODO(Q3): This is a wart. Remove from this class! - // Probably, there should exist a separate ViewContainer, - // which would expose such a method. - /** - */ - void setMouseCursor( sal_Int16 ); - - // TODO(Q3): This is a wart. Remove from this class! - // Probably, there should exist a separate ViewContainer, - // which would expose such a method. - /** Set volatile mouse cursor. - - A volatile mouse cursor only stays in effect, as long - as the mouse has not moved. As soon as the mouse - moves, the mouse cursor is set back to the value set - by setMouseCursor(). - */ - void setVolatileMouseCursor( sal_Int16 ); - - /** Set a LayerManager for update() calls. - - A LayerManager set via this method will receive an - update() call whenever updateScreen() is called on the - EventMultiplexer. This is handy to avoid multiple - redraws. Note that every setLayerManager() call will - overwrite any previously set. - */ - void setLayerManager( const LayerManagerSharedPtr& rMgr ); - - /** Update screen content - - This method updates the screen content, by first - updating all layers (if setLayerManager() was called - with a valid layer manager previously), and then - calling updateScreen() on all registered views. - - @param bForceUpdate - Force updateScreen() call, even if layer manager has - no updates pending. Set this parameter to true, if you - changed screen content or sprites and bypassed the - layer manager. - */ - void updateScreenContent( bool bForceUpdate ); - - - // Automatic mode methods - // ========================================================= - - /** Change automatic mode. - - @param bIsAuto - When true, events will be fired automatically, not - only triggered by UI events. When false, auto events - will quit. - */ - void setAutomaticMode( bool bIsAuto ); - - /** Get automatic mode setting. - */ - bool getAutomaticMode() const; - - /** Set the timeout for automatic mode. - - @param nTimeout - Timeout, between end of effect until start of next - effect. - */ - void setAutomaticTimeout( double nTimeout ); - - /** Get automatic mode timeout value. - */ - double getAutomaticTimeout() const; - - - - // Handler registration methods - // ========================================================= - - /** Register an event handler that will be called when the - user requests the next effect. - - For every nextEffect event, only one of the handlers - registered here is called. The handlers are considered - with decreasing priority, i.e. the handler with the - currently highest priority will be called. - - @param rHandler - Handler to call when the next slide starts - - @param nPriority - Priority with which the handlers are called. The - higher the priority, the earlier this handler will be - tried. - */ - void addNextEffectHandler( const EventHandlerSharedPtr& rHandler, - double nPriority ); - void removeNextEffectHandler( const EventHandlerSharedPtr& rHandler ); - - /** Register an event handler that will be called when the - slide is just shown. - - Note that <em>all</em> registered handlers will be called - when the slide start occurs. This is in contrast to - the mouse events below. - - @param rHandler - Handler to call when the next slide starts - */ - void addSlideStartHandler( const EventHandlerSharedPtr& rHandler ); - void removeSlideStartHandler( const EventHandlerSharedPtr& rHandler ); - - /** Register an event handler that will be called when the - slide is about to vanish. - - Note that <em>all</em> registered handlers will be - called when the slide end occurs. This is in contrast - to the mouse events below. - - @param rHandler - Handler to call when the current slide ends - */ - void addSlideEndHandler( const EventHandlerSharedPtr& rHandler ); - void removeSlideEndHandler( const EventHandlerSharedPtr& rHandler ); - - /** Register an event handler that will be called when an - XAnimationNode starts its active duration. - - Note that <em>all</em> registered handlers will be called - when the animation start occurs. This is in contrast to - the mouse events below. - - @param rHandler - Handler to call when the animation start - */ - void addAnimationStartHandler( const AnimationEventHandlerSharedPtr& rHandler ); - void removeAnimationStartHandler( const AnimationEventHandlerSharedPtr& rHandler ); - - /** Register an event handler that will be called when an - XAnimationNode ends its active duration. - - Note that <em>all</em> registered handlers will be called - when the animation end occurs. This is in contrast to - the mouse events below. - - @param rHandler - Handler to call when the animation ends - */ - void addAnimationEndHandler( const AnimationEventHandlerSharedPtr& rHandler ); - void removeAnimationEndHandler( const AnimationEventHandlerSharedPtr& rHandler ); - - /** Register an event handler that will be called when the - main animation sequence of a slide ends its active - duration. - - Note that <em>all</em> registered handlers will be - called when the animation end occurs. This is in - contrast to the mouse events below. - - @param rHandler - Handler to call when the animation ends - */ - void addSlideAnimationsEndHandler( const EventHandlerSharedPtr& rHandler ); - void removeSlideAnimationsEndHandler( const EventHandlerSharedPtr& rHandler ); - - /** Register an event handler that will be called when an - XAudio node's sound stops playing. - - Note that <em>all</em> registered handlers will be - called when the audio stops. This is in contrast to - the mouse events below. - - @param rHandler - Handler to call when the audio stops - */ - void addAudioStoppedHandler( const AnimationEventHandlerSharedPtr& rHandler ); - void removeAudioStoppedHandler( const AnimationEventHandlerSharedPtr& rHandler ); - - /** Register an event handler that will be called when an - XCommand node's with the command STOPAUDIO is activated. - - Note that <em>all</em> registered handlers will be - called when the audio stops. This is in contrast to - the mouse events below. - - @param rHandler - Handler to call when command is activated - */ - void addCommandStopAudioHandler( const AnimationEventHandlerSharedPtr& rHandler ); - void removeCommandStopAudioHandler( const AnimationEventHandlerSharedPtr& rHandler ); - - /** Register a handler that is called when the show enters - or exits pause mode. - */ - void addPauseHandler( const PauseEventHandlerSharedPtr& rHandler ); - void removePauseHandler( const PauseEventHandlerSharedPtr& rHandler ); - - /** Register a mouse handler that is called on mouse click - - For every mouse click, only one of the handlers - registered here is called. The handlers are considered - with decreasing priority, i.e. the handler with the - currently highest priority will be called. - - Since the handlers can reject down and up events - individually, handlers should expect to be called with - non-matching down and up-press counts. If your handler - cannot cope with that, it must have the highest - priority of all added handlers. - */ - void addClickHandler( const MouseEventHandlerSharedPtr& rHandler, - double nPriority ); - void removeClickHandler( const MouseEventHandlerSharedPtr& rHandler ); - - /** Register a mouse handler that is called on a double - mouse click - - For every mouse double click, only one of the handlers - registered here is called. The handlers are considered - with decreasing priority, i.e. the handler with the - currently highest priority will be called. - - Since the handlers can reject down and up events - individually, handlers should expect to be called with - non-matching down and up-press counts. If your handler - cannot cope with that, it must have the highest - priority of all added handlers. - */ - void addDoubleClickHandler( const MouseEventHandlerSharedPtr& rHandler, - double nPriority ); - void removeDoubleClickHandler( const MouseEventHandlerSharedPtr& rHandler ); - - /** Register a mouse handler that is called for mouse moves. - - For every mouse move, only one of the handlers - registered here is called. The handlers are considered - with decreasing priority, i.e. the handler with the - currently highest priority will be called. - */ - void addMouseMoveHandler( const MouseEventHandlerSharedPtr& rHandler, - double nPriority ); - void removeMouseMoveHandler( const MouseEventHandlerSharedPtr& rHandler ); - - - // External event notifications - // ========================================================= - - /** Notify that the user requested the next effect. - - This requests the slideshow to display the next - effect, or move to the next slide, if none are left. - - @return true, if this event was processed by - anybody. If false is returned, no handler processed - this event (and probably, nothing will happen at all) - */ - bool notifyNextEffect(); - - /** Notify that a new slide has started - - This method is to be used from the Presentation object - to signal that a new slide is starting now. This will - invoke all registered slide start handlers. - - @return true, if this event was processed by - anybody. If false is returned, no handler processed - this event (and probably, nothing will happen at all) - */ - bool notifySlideStartEvent(); - - /** Notify that a slide has ended - - This method is to be used from the Presentation object - to signal that a slide is ending now. This will invoke - all registered slide end handlers. - - @return true, if this event was processed by - anybody. If false is returned, no handler processed - this event (and probably, nothing will happen at all) - */ - bool notifySlideEndEvent(); - - /** Notify that the given node enters its active duration. - - This method is to be used from the AnimationNode - objects to signal that the active duration - begins. This will invoke all registered animation - start handlers. - - @param rNode - Node which enters active duration. - - @return true, if this event was processed by - anybody. If false is returned, no handler processed - this event (and probably, nothing will happen at all) - */ - bool notifyAnimationStart( const AnimationNodeSharedPtr& rNode ); - - /** Notify that the given node leaves its active duration. - - This method is to be used from the AnimationNode - objects to signal that the active duration - ends now. This will invoke all registered animation - end handlers. - - @param rNode - Node which leaves active duration. - - @return true, if this event was processed by - anybody. If false is returned, no handler processed - this event (and probably, nothing will happen at all) - */ - bool notifyAnimationEnd( const AnimationNodeSharedPtr& rNode ); - - /** Notify that the slide animations sequence leaves its - active duration. - - @return true, if this event was processed by - anybody. If false is returned, no handler processed - this event (and probably, nothing will happen at all) - */ - bool notifySlideAnimationsEnd(); - - /** Notify that for the given node, audio output has stopped. - - This method is to be used from the AnimationNode - objects to signal that audio playback has just - stopped. This will invoke all registered audio - stopped andlers. - - @param rNode - Node for which audio has stopped. - - @return true, if this event was processed by - anybody. If false is returned, no handler processed - this event (and probably, nothing will happen at all) - */ - bool notifyAudioStopped( const AnimationNodeSharedPtr& rNode ); - - /** Notify that the show has entered or exited pause mode - - This method is to be used from the Presentation object - to signal that a slide is entering (bPauseShow=true) - or exiting (bPauseShow=false) pause mode. This will - invoke all registered slide end handlers. - - @return true, if this event was processed by - anybody. If false is returned, no handler processed - this event (and probably, nothing will happen at all) - */ - bool notifyPauseMode( bool bPauseShow ); - - /** Notify that all audio has to be stoped. - - This method is used by XCommand nodes and all sound - playing nodes should listen for this command and - stop theire sounds when its fired. */ - void notifyCommandStopAudio( const AnimationNodeSharedPtr& rNode ); - - public: - typedef ::cppu::WeakComponentImplHelper2< ::com::sun::star::awt::XMouseListener, - ::com::sun::star::awt::XMouseMotionListener > Listener_UnoBase; - - /** Listener class - - Since EventMultiplexer is held by value from clients, - had to factor out the UNO interface listener - functionality (since UNO is ref-counted only) - - All methods are forwarded to from EventMultiplexer. See - docs there. - */ - class Listener : public ::comphelper::OBaseMutex, - public Listener_UnoBase - { - public: - Listener( EventQueue& ); - - // parent method implementations - bool addView( const UnoViewSharedPtr& rView ); - bool removeView( const UnoViewSharedPtr& rView ); - void clear(); - - void setMouseCursor( sal_Int16 ); - void setVolatileMouseCursor( sal_Int16 ); - - void setLayerManager( const LayerManagerSharedPtr& rMgr ); - void updateScreenContent( bool bForceUpdate ); - - void setAutomaticMode( bool bIsAuto ); - bool getAutomaticMode() const; - void setAutomaticTimeout( double nTimeout ); - double getAutomaticTimeout() const; - - void addNextEffectHandler ( const EventHandlerSharedPtr& rHandler, - double nPriority ); - void removeNextEffectHandler ( const EventHandlerSharedPtr& rHandler ); - void addSlideStartHandler ( const EventHandlerSharedPtr& rEvent ); - void removeSlideStartHandler ( const EventHandlerSharedPtr& rEvent ); - void addSlideEndHandler ( const EventHandlerSharedPtr& rEvent ); - void removeSlideEndHandler ( const EventHandlerSharedPtr& rEvent ); - void addAnimationStartHandler ( const AnimationEventHandlerSharedPtr& rHandler ); - void removeAnimationStartHandler( const AnimationEventHandlerSharedPtr& rHandler ); - void addAnimationEndHandler ( const AnimationEventHandlerSharedPtr& rHandler ); - void removeAnimationEndHandler ( const AnimationEventHandlerSharedPtr& rHandler ); - void addSlideAnimationsEndHandler ( const EventHandlerSharedPtr& rHandler ); - void removeSlideAnimationsEndHandler( const EventHandlerSharedPtr& rHandler ); - void addAudioStoppedHandler ( const AnimationEventHandlerSharedPtr& rHandler ); - void removeAudioStoppedHandler ( const AnimationEventHandlerSharedPtr& rHandler ); - void addCommandStopAudioHandler ( const AnimationEventHandlerSharedPtr& rHandler ); - void removeCommandStopAudioHandler ( const AnimationEventHandlerSharedPtr& rHandler ); - void addPauseHandler ( const PauseEventHandlerSharedPtr& rHandler ); - void removePauseHandler ( const PauseEventHandlerSharedPtr& rHandler ); - void addClickHandler ( const MouseEventHandlerSharedPtr& rHandler, - double nPriority ); - void removeClickHandler ( const MouseEventHandlerSharedPtr& rHandler ); - void addDoubleClickHandler ( const MouseEventHandlerSharedPtr& rHandler, - double nPriority ); - void removeDoubleClickHandler ( const MouseEventHandlerSharedPtr& rHandler ); - void addMouseMoveHandler ( const MouseEventHandlerSharedPtr& rHandler, - double nPriority ); - void removeMouseMoveHandler ( const MouseEventHandlerSharedPtr& rHandler ); - - bool notifyNextEffect (); - bool notifySlideStartEvent (); - bool notifySlideEndEvent (); - bool notifyAnimationStart ( const AnimationNodeSharedPtr& rNode ); - bool notifyAnimationEnd ( const AnimationNodeSharedPtr& rNode ); - bool notifySlideAnimationsEnd (); - bool notifyAudioStopped ( const AnimationNodeSharedPtr& rNode ); - bool notifyPauseMode ( bool bPauseShow ); - void notifyCommandStopAudio ( const AnimationNodeSharedPtr& rNode ); - - // internal method implementations - virtual void SAL_CALL dispose() throw (::com::sun::star::uno::RuntimeException); - - // XMouseListener implementation - virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL mousePressed( const ::com::sun::star::awt::MouseEvent& e ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL mouseReleased( const ::com::sun::star::awt::MouseEvent& e ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL mouseEntered( const ::com::sun::star::awt::MouseEvent& e ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL mouseExited( const ::com::sun::star::awt::MouseEvent& e ) throw (::com::sun::star::uno::RuntimeException); - - // XMouseMotionListener implementation - virtual void SAL_CALL mouseDragged( const ::com::sun::star::awt::MouseEvent& e ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL mouseMoved( const ::com::sun::star::awt::MouseEvent& e ) throw (::com::sun::star::uno::RuntimeException); - - private: - // actual handler implementations (the UNO interface - // overrides above are only stubs) - void implMousePressed( const ::com::sun::star::awt::MouseEvent& e ); - void implMouseReleased( const ::com::sun::star::awt::MouseEvent& e ); - void implMouseDragged( const ::com::sun::star::awt::MouseEvent& e ); - void implMouseMoved( const ::com::sun::star::awt::MouseEvent& e ); - - bool isMouseListenerRegistered() const; - - struct MouseEventHandlerEntry - { - MouseEventHandlerEntry( const MouseEventHandlerSharedPtr& rHandler, - double nPriority ) : - mpHandler( rHandler ), - mnPriority( nPriority ) - { - } - - MouseEventHandlerSharedPtr mpHandler; - double mnPriority; - - /** To facilitate bind access. - - Note: though this should normally be a return - by value, current gcc chokes on that in the - nested bind case (see EventMultiplexer.cxx, - last statement in the processHandlers method - */ - const MouseEventHandlerSharedPtr& getHandler() const - { - return mpHandler; - } - - /// To sort according to priority - bool operator<( const MouseEventHandlerEntry& rRHS ) const - { - // reversed order - high prioritized entries - // should be at the beginning of the queue - return mnPriority > rRHS.mnPriority; - } - - /// To permit ::std::remove in removeHandler template - bool operator==( const MouseEventHandlerSharedPtr& rRHS ) const - { - return mpHandler == rRHS; - } - }; - - typedef ::std::vector< EventHandlerSharedPtr > ImplEventHandlers; - typedef ::std::vector< AnimationEventHandlerSharedPtr > ImplAnimationHandlers; - typedef ::std::vector< PauseEventHandlerSharedPtr > ImplPauseHandlers; - typedef ::std::vector< MouseEventHandlerEntry > ImplMouseHandlers; - - template< typename Container, typename Handler > - void addHandler( Container& rContainer, - const ::boost::shared_ptr< Handler >& rHandler ); - - template< typename Container, typename Handler > - void removeHandler( Container& rContainer, - const ::boost::shared_ptr< Handler >& rHandler ); - - template< typename Function > void forEachView( Function pViewMethod ); - - template< typename RegisterFunction > - void addMouseHandler( ImplMouseHandlers& rHandlerContainer, - const MouseEventHandlerSharedPtr& rHandler, - double nPriority, - RegisterFunction pRegisterListener ); - - bool notifyHandlers( const EventMultiplexer::Listener::ImplEventHandlers& rHandlerContainer ); - - bool notifyHandlers( const EventMultiplexer::Listener::ImplAnimationHandlers& rHandlerContainer, - const AnimationNodeSharedPtr& rNode ); - - bool notifyHandlers( const EventMultiplexer::Listener::ImplMouseHandlers& rQueue, - bool (MouseEventHandler::*pHandlerMethod)( const ::com::sun::star::awt::MouseEvent& ), - const ::com::sun::star::awt::MouseEvent& e ); - - /// Called for automatic nextEffect - void tick(); - - /// Schedules a tick event - void scheduleTick(); - - /// Schedules tick events, if mbIsAutoMode is true - void handleTicks(); - - void implSetMouseCursor( sal_Int16 ) const; - - EventQueue& mrEventQueue; - UnoViewVector maViews; - - ImplEventHandlers maNextEffectHandlers; - ImplEventHandlers maSlideStartHandlers; - ImplEventHandlers maSlideEndHandlers; - ImplAnimationHandlers maAnimationStartHandlers; - ImplAnimationHandlers maAnimationEndHandlers; - ImplEventHandlers maSlideAnimationsEndHandlers; - ImplAnimationHandlers maAudioStoppedHandlers; - ImplAnimationHandlers maCommandStopAudioHandlers; - ImplPauseHandlers maPauseHandlers; - ImplMouseHandlers maMouseClickHandlers; - ImplMouseHandlers maMouseDoubleClickHandlers; - ImplMouseHandlers maMouseMoveHandlers; - - LayerManagerSharedPtr mpLayerManager; // for screen updates - - 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 notifyMouseHandlers( + const ImplMouseHandlers& rQueue, + bool (MouseEventHandler::*pHandlerMethod)( + const ::com::sun::star::awt::MouseEvent& ), + const ::com::sun::star::awt::MouseEvent& e ); - sal_Int16 mnMouseCursor; - sal_Int16 mnVolatileMouseCursor; - sal_Int16 mnLastVolatileMouseCursor; + /// Called for automatic nextEffect + void tick(); - bool mbIsAutoMode; - }; - - - private: - // default: disabled copy/assignment - EventMultiplexer(const EventMultiplexer&); - EventMultiplexer& operator=( const EventMultiplexer& ); + /// Schedules a tick event + void scheduleTick(); - typedef ::rtl::Reference< Listener > ListenerRef; + /// Schedules tick events, if mbIsAutoMode is true + void handleTicks(); - // Ref-counted Listener - ListenerRef mpListener; - }; - } -} + void implSetMouseCursor( sal_Int16 ) const; + + EventQueue& mrEventQueue; + UnoViewVector maViews; + + ImplNextEffectHandlers maNextEffectHandlers; + ImplEventHandlers maSlideStartHandlers; + ImplEventHandlers maSlideEndHandlers; + ImplAnimationHandlers maAnimationStartHandlers; + ImplAnimationHandlers maAnimationEndHandlers; + ImplEventHandlers maSlideAnimationsEndHandlers; + ImplAnimationHandlers maAudioStoppedHandlers; + ImplAnimationHandlers maCommandStopAudioHandlers; + ImplPauseHandlers maPauseHandlers; + ImplMouseHandlers maMouseClickHandlers; + ImplMouseHandlers maMouseDoubleClickHandlers; + ImplMouseHandlers maMouseMoveHandlers; + + typedef std::hash_map<HandlerId, HyperLinkHandlerFunc, + hash<HandlerId> > ImplHyperLinkHandlers; + ImplHyperLinkHandlers maHyperlinkHandlers; + struct HyperLinkNotifier; + friend struct HyperLinkNotifier; + + LayerManagerSharedPtr mpLayerManager; // for screen updates + + 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; + + sal_Int16 mnMouseCursor; + sal_Int16 mnVolatileMouseCursor; + sal_Int16 mnLastVolatileMouseCursor; + + bool mbIsAutoMode; +}; + +} // namespace internal +} // namespace Presentation + +#endif /* INCLUDED_SLIDESHOW_EVENTMULTIPLEXER_HXX */ -#endif /* _SLIDESHOW_EVENTMULTIPLEXER_HXX */ |