23#include <com/sun/star/awt/SystemPointer.hpp>
24#include <com/sun/star/awt/MouseButton.hpp>
25#include <com/sun/star/awt/MouseEvent.hpp>
45typedef std::vector<EventSharedPtr> ImpEventVector;
46typedef std::queue<EventSharedPtr> ImpEventQueue;
47typedef std::map<uno::Reference<animations::XAnimationNode>,
48 ImpEventVector> ImpAnimationEventMap;
50 Shape::lessThanShape> ImpShapeEventMap;
53class MouseEventHandler_ :
public MouseEventHandler
56 virtual bool handleMousePressed( awt::MouseEvent
const& )
override {
return false;}
57 virtual bool handleMouseReleased( awt::MouseEvent
const& )
override {
return false;}
58 virtual bool handleMouseDragged( awt::MouseEvent
const& )
override {
return false;}
59 virtual bool handleMouseMoved( awt::MouseEvent
const& )
override {
return false; }
64template <
typename ContainerT>
65bool fireSingleEvent( ContainerT & rQueue, EventQueue & rEventQueue )
68 while (! rQueue.empty())
78 if(pEvent->isCharged())
79 return rEventQueue.addEvent( pEvent );
86template <
typename ContainerT>
87bool fireAllEvents( ContainerT & rQueue, EventQueue & rEventQueue )
89 bool bFiredAny =
false;
90 while (fireSingleEvent( rQueue, rEventQueue ))
125 "AllAnimationEventHandler::handleAnimationEvent(): Invalid node" );
129 ImpAnimationEventMap::iterator aIter;
133 ImpEventVector& rVec( aIter->second );
135 bRet = !rVec.empty();
138 for(
const auto& pEvent : rVec )
150 ImpAnimationEventMap::iterator aIter;
159 aIter->second.push_back( rEvent );
169 public EventContainer
194 if(evt.Buttons != awt::MouseButton::LEFT)
260 },
"EventMultiplexer::notifyNextEffect") );
282class MouseHandlerBase :
public MouseEventHandler_
285 explicit MouseHandlerBase(
EventQueue& rEventQueue ) :
293 ImpShapeEventMap::iterator aIter;
301 aIter->second.push( rEvent );
305 bool hitTest(
const awt::MouseEvent& e,
306 ImpShapeEventMap::reverse_iterator& o_rHitShape )
314 [&aPosition](
const ImpShapeEventMap::value_type& rShape) {
318 return rShape.first->getBounds().isInside( aPosition )
319 && rShape.first->isVisible();
325 o_rHitShape = aCurrShape;
332 bool sendEvent( ImpShapeEventMap::reverse_iterator
const & io_rHitShape )
335 const bool bRet( fireSingleEvent( io_rHitShape->second,
343 if( io_rHitShape->second.empty() )
357 bool processEvent(
const awt::MouseEvent& e )
359 ImpShapeEventMap::reverse_iterator aCurrShape;
361 if( hitTest( e, aCurrShape ) )
362 return sendEvent( aCurrShape );
379 MouseHandlerBase( rEventQueue ),
385 if(e.Buttons != awt::MouseButton::LEFT)
387 return processEvent( e );
396 ImpShapeEventMap::reverse_iterator aDummy;
397 if( hitTest( e, aDummy ) )
412 : MouseHandlerBase( rEventQueue ),
420 ImpShapeEventMap::reverse_iterator aCurr;
421 if( hitTest( e, aCurr ) )
450 : MouseHandlerBase( rEventQueue ),
458 ImpShapeEventMap::reverse_iterator aCurr;
459 if( hitTest( e, aCurr ) )
475 maLastIter = ImpShapeEventMap::reverse_iterator();
486template<
typename Handler,
typename Functor >
488 std::shared_ptr< Handler >& rHandler,
490 const Functor& rRegistrationFunctor )
493 "UserEventQueue::registerEvent(): Invalid event" );
499 rRegistrationFunctor( rHandler );
502 rHandler->addEvent( rEvent );
505template<
typename Handler,
typename Arg,
typename Functor >
507 std::shared_ptr< Handler >& rHandler,
510 const Functor& rRegistrationFunctor )
513 "UserEventQueue::registerEvent(): Invalid event" );
520 rRegistrationFunctor( rHandler );
523 rHandler->addEvent( rEvent, rArg );
529 CursorManager& rCursorManager )
533 mpAnimationStartEventHandler(),
534 mpAnimationEndEventHandler(),
535 mpAudioStoppedEventHandler(),
536 mpClickEventHandler(),
537 mpSkipEffectEventHandler(),
538 mpMouseEnterHandler(),
539 mpMouseLeaveHandler(),
551 catch (
const uno::Exception&)
651 "UserEventQueue::registerShapeClickEvent(): Invalid event" );
669class ClickEventRegistrationFunctor
674 bool bAdvanceOnClick )
679 void operator()(
const std::shared_ptr<ClickEventHandler>& rHandler )
const
715 const bool bSkipTriggersNextEffect)
742 "UserEventQueue::registerShapeDoubleClickEvent(): Invalid event" );
783 ::std::shared_ptr<SkipEffectEventHandler> pHandler (
786 pHandler->skipEffect();
EventQueue & mrEventQueue
ImpAnimationEventMap maAnimationEventMap
virtual bool handleAnimationEvent(const AnimationNodeSharedPtr &rNode) override
Handle the event.
void addEvent(const EventSharedPtr &rEvent, const uno::Reference< animations::XAnimationNode > &xNode)
AllAnimationEventHandler(EventQueue &rEventQueue)
Interface for handling animation events.
void setAdvanceOnClick(bool bAdvanceOnClick)
virtual bool handleEvent() override
Handle the event.
virtual bool handleMouseReleased(const awt::MouseEvent &evt) override
ClickEventHandler(EventQueue &rEventQueue)
EventQueue & mrEventQueue
virtual bool handleEvent_impl()
Interface for event handling objects.
This class multiplexes user-activated and slide-show global events.
void removeClickHandler(const MouseEventHandlerSharedPtr &rHandler)
void addAnimationStartHandler(const AnimationEventHandlerSharedPtr &rHandler)
Register an event handler that will be called when an XAnimationNode starts its active duration.
void removeMouseMoveHandler(const MouseEventHandlerSharedPtr &rHandler)
void addClickHandler(const MouseEventHandlerSharedPtr &rHandler, double nPriority)
Register a mouse handler that is called on mouse click.
void addMouseMoveHandler(const MouseEventHandlerSharedPtr &rHandler, double nPriority)
Register a mouse handler that is called for mouse moves.
void removeAnimationEndHandler(const AnimationEventHandlerSharedPtr &rHandler)
void removeAudioStoppedHandler(const AnimationEventHandlerSharedPtr &rHandler)
void removeDoubleClickHandler(const MouseEventHandlerSharedPtr &rHandler)
void addNextEffectHandler(const EventHandlerSharedPtr &rHandler, double nPriority)
Register an event handler that will be called when the user requests the next effect.
bool notifyNextEffect()
Notify that the user requested the next effect.
void addDoubleClickHandler(const MouseEventHandlerSharedPtr &rHandler, double nPriority)
Register a mouse handler that is called on a double mouse click.
void removeNextEffectHandler(const EventHandlerSharedPtr &rHandler)
void addAnimationEndHandler(const AnimationEventHandlerSharedPtr &rHandler)
Register an event handler that will be called when an XAnimationNode ends its active duration.
void removeAnimationStartHandler(const AnimationEventHandlerSharedPtr &rHandler)
void addAudioStoppedHandler(const AnimationEventHandlerSharedPtr &rHandler)
Register an event handler that will be called when an XAudio node's sound stops playing.
This class handles events in a presentation.
bool addEvent(const EventSharedPtr &event)
Add the given event to the queue.
bool addEventWhenQueueIsEmpty(const EventSharedPtr &rpEvent)
Another way to control the order of asynchronous event execution.
virtual bool handleMouseMoved(const awt::MouseEvent &e) override
MouseEnterHandler(EventQueue &rEventQueue)
ShapeSharedPtr mpLastShape
virtual bool handleMouseMoved(const awt::MouseEvent &e) override
MouseLeaveHandler(EventQueue &rEventQueue)
ImpShapeEventMap::reverse_iterator maLastIter
virtual bool handleMouseMoved(const awt::MouseEvent &e) override
virtual bool handleMouseReleased(const awt::MouseEvent &e) override
CursorManager & mrCursorManager
ShapeClickEventHandler(CursorManager &rCursorManager, EventQueue &rEventQueue)
EventQueue & mrEventQueue
SkipEffectEventHandler(EventQueue &rEventQueue, EventMultiplexer &rEventMultiplexer)
virtual bool handleEvent_impl() override
bool handleEvent_impl(bool bNotifyNextEffect)
void setSkipTriggersNextEffect(const bool bSkipTriggersNextEffect)
Remember to trigger (or not to trigger) the next effect after the current effect is skipped.
EventMultiplexer & mrEventMultiplexer
void skipEffect()
Skip the current effect but do not trigger the next effect.
bool mbSkipTriggersNextEffect
void clear()
Clear all registered events.
UserEventQueue(EventMultiplexer &rMultiplexer, EventQueue &rEventQueue, CursorManager &rCursorManager)
Create a user event queue.
::std::shared_ptr< ShapeClickEventHandler > mpShapeClickEventHandler
void registerSkipEffectEvent(EventSharedPtr const &pEvent, const bool bSkipTriggersNextEffect)
Registers an event that is fired when the current effects(s) are skipped, .e.g.
::std::shared_ptr< AllAnimationEventHandler > mpAnimationEndEventHandler
void registerNextEffectEvent(const EventSharedPtr &rEvent)
Register an event that is fired to show the next event.
void registerShapeClickEvent(const EventSharedPtr &rEvent, const ShapeSharedPtr &rShape)
Register an event that is fired when a shape is clicked.
::std::shared_ptr< AllAnimationEventHandler > mpAnimationStartEventHandler
void registerAnimationStartEvent(const EventSharedPtr &rEvent, const css::uno::Reference< css::animations::XAnimationNode > &xNode)
Register an event that will be fired when the given animation node starts.
::std::shared_ptr< SkipEffectEventHandler > mpSkipEffectEventHandler
void callSkipEffectEventHandler()
Typically skipping the current effect is triggered by mouse clicks or key presses that trigger the ne...
::std::shared_ptr< AllAnimationEventHandler > mpAudioStoppedEventHandler
EventMultiplexer & mrMultiplexer
EventQueue & mrEventQueue
void registerMouseLeaveEvent(const EventSharedPtr &rEvent, const ShapeSharedPtr &rShape)
Register an event that is fired when the mouse leaves the area of the given shape.
void registerShapeDoubleClickEvent(const EventSharedPtr &rEvent, const ShapeSharedPtr &rShape)
Register an event that is fired on a double mouse click on a shape.
void registerAudioStoppedEvent(const EventSharedPtr &rEvent, const css::uno::Reference< css::animations::XAnimationNode > &xNode)
Register an event that will be fired when audio output stopped for the given animation node.
::std::shared_ptr< ClickEventHandler > mpClickEventHandler
void registerMouseEnterEvent(const EventSharedPtr &rEvent, const ShapeSharedPtr &rShape)
Register an event that is fired when the mouse enters the area of the given shape.
::std::shared_ptr< MouseEnterHandler > mpMouseEnterHandler
::std::shared_ptr< ShapeClickEventHandler > mpShapeDoubleClickEventHandler
void registerAnimationEndEvent(const EventSharedPtr &rEvent, const css::uno::Reference< css::animations::XAnimationNode > &xNode)
Register an event that will be fired when the given animation node ends its active duration.
CursorManager & mrCursorManager
::std::shared_ptr< MouseLeaveHandler > mpMouseLeaveHandler
void setAdvanceOnClick(bool bAdvanceOnClick)
Set advance on click behaviour.
void registerEvent(::std::shared_ptr< Handler > &rHandler, const EventSharedPtr &rEvent, const Functor &rRegistrationFunctor)
Generically register an event on one of the handlers.
#define TOOLS_WARN_EXCEPTION(area, stream)
#define ENSURE_OR_RETURN_FALSE(c, m)
#define ENSURE_OR_THROW(c, m)
::std::shared_ptr< MouseEventHandler > MouseEventHandlerSharedPtr
::std::shared_ptr< AnimationNode > AnimationNodeSharedPtr
::std::shared_ptr< Event > EventSharedPtr
::std::shared_ptr< AnimationEventHandler > AnimationEventHandlerSharedPtr
::std::shared_ptr< Shape > ShapeSharedPtr
CursorManager & mrCursorManager
parent cursor manager
EventMultiplexer & mrMultiplexer
ImpShapeEventMap maShapeEventMap
EventQueue & mrEventQueue
bool const mbAdvanceOnClick