LibreOffice Module slideshow (master) 1
usereventqueue.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20
22
23#include <com/sun/star/awt/SystemPointer.hpp>
24#include <com/sun/star/awt/MouseButton.hpp>
25#include <com/sun/star/awt/MouseEvent.hpp>
26
27#include <delayevent.hxx>
28#include <usereventqueue.hxx>
29#include <cursormanager.hxx>
30
31#include <vector>
32#include <queue>
33#include <map>
34#include <algorithm>
35
36
37using namespace com::sun::star;
38
39/* Implementation of UserEventQueue class */
40
41namespace slideshow::internal {
42
43namespace {
44
45typedef std::vector<EventSharedPtr> ImpEventVector;
46typedef std::queue<EventSharedPtr> ImpEventQueue;
47typedef std::map<uno::Reference<animations::XAnimationNode>,
48 ImpEventVector> ImpAnimationEventMap;
49typedef std::map<ShapeSharedPtr, ImpEventQueue,
50 Shape::lessThanShape> ImpShapeEventMap;
51
52// MouseEventHandler base class, not consuming any event:
53class MouseEventHandler_ : public MouseEventHandler
54{
55public:
56 virtual bool handleMousePressed( awt::MouseEvent const& /*e*/ ) override { return false;}
57 virtual bool handleMouseReleased( awt::MouseEvent const& /*e*/) override { return false;}
58 virtual bool handleMouseDragged( awt::MouseEvent const& /*e*/ ) override { return false;}
59 virtual bool handleMouseMoved( awt::MouseEvent const& /*e*/ ) override { return false; }
60};
61
64template <typename ContainerT>
65bool fireSingleEvent( ContainerT & rQueue, EventQueue & rEventQueue )
66{
67 // post next event in given queue:
68 while (! rQueue.empty())
69 {
70 EventSharedPtr const pEvent(rQueue.front());
71 rQueue.pop();
72
73 // skip all inactive events (as the purpose of
74 // nextEventFromQueue() is to activate the next
75 // event, and events which return false on
76 // isCharged() will never be activated by the
77 // EventQueue)
78 if(pEvent->isCharged())
79 return rEventQueue.addEvent( pEvent );
80 }
81 return false; // no more (active) events in queue
82}
83
86template <typename ContainerT>
87bool fireAllEvents( ContainerT & rQueue, EventQueue & rEventQueue )
88{
89 bool bFiredAny = false;
90 while (fireSingleEvent( rQueue, rEventQueue ))
91 bFiredAny = true;
92 return bFiredAny;
93}
94
95class EventContainer
96{
97public:
98 EventContainer() :
99 maEvents()
100 {}
101
102 void addEvent( const EventSharedPtr& rEvent )
103 {
104 maEvents.push( rEvent );
105 }
106
107protected:
108 ImpEventQueue maEvents;
109};
110
111} // anon namespace
112
114{
115public:
116 explicit AllAnimationEventHandler( EventQueue& rEventQueue ) :
117 mrEventQueue( rEventQueue ),
119 {}
120
121 virtual bool handleAnimationEvent( const AnimationNodeSharedPtr& rNode ) override
122 {
124 rNode,
125 "AllAnimationEventHandler::handleAnimationEvent(): Invalid node" );
126
127 bool bRet( false );
128
129 ImpAnimationEventMap::iterator aIter;
130 if( (aIter=maAnimationEventMap.find(
131 rNode->getXAnimationNode() )) != maAnimationEventMap.end() )
132 {
133 ImpEventVector& rVec( aIter->second );
134
135 bRet = !rVec.empty();
136
137 // registered node found -> fire all events in the vector
138 for( const auto& pEvent : rVec )
139 mrEventQueue.addEvent( pEvent );
140
141 rVec.clear();
142 }
143
144 return bRet;
145 }
146
147 void addEvent( const EventSharedPtr& rEvent,
149 {
150 ImpAnimationEventMap::iterator aIter;
151 if( (aIter=maAnimationEventMap.find( xNode )) ==
152 maAnimationEventMap.end() )
153 {
154 // no entry for this animation -> create one
155 aIter = maAnimationEventMap.emplace( xNode, ImpEventVector() ).first;
156 }
157
158 // add new event to queue
159 aIter->second.push_back( rEvent );
160 }
161
162private:
164 ImpAnimationEventMap maAnimationEventMap;
165};
166
167class ClickEventHandler : public MouseEventHandler_,
168 public EventHandler,
169 public EventContainer
170{
171public:
172 explicit ClickEventHandler( EventQueue& rEventQueue ) :
173 EventContainer(),
174 mrEventQueue( rEventQueue ),
175 mbAdvanceOnClick( true )
176 {}
177
178 void setAdvanceOnClick( bool bAdvanceOnClick )
179 {
180 mbAdvanceOnClick = bAdvanceOnClick;
181 }
182
183private:
184
185 // triggered by API calls, e.g. space bar
186 virtual bool handleEvent() override
187 {
188 return handleEvent_impl();
189 }
190
191 // triggered by mouse release:
192 virtual bool handleMouseReleased( const awt::MouseEvent& evt ) override
193 {
194 if(evt.Buttons != awt::MouseButton::LEFT)
195 return false;
196
197 if( mbAdvanceOnClick ) {
198 // fire next event
199 return handleEvent_impl();
200 }
201 else {
202 return false; // advance-on-click disabled
203 }
204 }
205
206 // triggered by both:
207 virtual bool handleEvent_impl()
208 {
209 // fire next event:
210 return fireSingleEvent( maEvents, mrEventQueue );
211 }
212
213private:
216};
217
219{
220public:
222 EventMultiplexer & rEventMultiplexer )
223 : ClickEventHandler(rEventQueue),
224 mrEventQueue(rEventQueue),
225 mrEventMultiplexer(rEventMultiplexer),
227
231 void setSkipTriggersNextEffect (const bool bSkipTriggersNextEffect)
232 { mbSkipTriggersNextEffect = bSkipTriggersNextEffect; }
233
235 void skipEffect() { handleEvent_impl(false); }
236
237private:
238 virtual bool handleEvent_impl() override
239 {
240 return handleEvent_impl(true);
241 }
242
243 bool handleEvent_impl (bool bNotifyNextEffect)
244 {
245 // fire all events, so animation nodes can register their
246 // next effect listeners:
247 if(fireAllEvents( maEvents, mrEventQueue ))
248 {
249 if (mbSkipTriggersNextEffect && bNotifyNextEffect)
250 {
251 // then simulate a next effect event: this skip effect
252 // handler is triggered upon next effect events (multiplexer
253 // prio=-1)! Posting a notifyNextEffect() here is only safe
254 // (we don't run into busy loop), because we assume that
255 // someone has registered above for next effects
256 // (multiplexer prio=0) at the user event queue.
258 makeEvent( [this] () {
260 }, "EventMultiplexer::notifyNextEffect") );
261 }
262 else
263 return true;
264 }
265 return false;
266 }
267
268private:
272};
273
274namespace {
275
282class MouseHandlerBase : public MouseEventHandler_
283{
284public:
285 explicit MouseHandlerBase( EventQueue& rEventQueue ) :
286 mrEventQueue( rEventQueue ),
288 {}
289
290 void addEvent( const EventSharedPtr& rEvent,
291 const ShapeSharedPtr& rShape )
292 {
293 ImpShapeEventMap::iterator aIter;
294 if( (aIter=maShapeEventMap.find( rShape )) == maShapeEventMap.end() )
295 {
296 // no entry for this shape -> create one
297 aIter = maShapeEventMap.emplace(rShape, ImpEventQueue()).first;
298 }
299
300 // add new event to queue
301 aIter->second.push( rEvent );
302 }
303
304protected:
305 bool hitTest( const awt::MouseEvent& e,
306 ImpShapeEventMap::reverse_iterator& o_rHitShape )
307 {
308 // find hit shape in map
309 const basegfx::B2DPoint aPosition( e.X, e.Y );
310
311 // find matching shape (scan reversely, to coarsely match
312 // paint order)
313 auto aCurrShape = std::find_if(maShapeEventMap.rbegin(), maShapeEventMap.rend(),
314 [&aPosition](const ImpShapeEventMap::value_type& rShape) {
315 // TODO(F2): Get proper geometry polygon from the
316 // shape, to avoid having areas outside the shape
317 // react on the mouse
318 return rShape.first->getBounds().isInside( aPosition )
319 && rShape.first->isVisible();
320 });
321 if (aCurrShape != maShapeEventMap.rend())
322 {
323 // shape hit, and shape is visible - report a
324 // hit
325 o_rHitShape = aCurrShape;
326 return true;
327 }
328
329 return false; // nothing hit
330 }
331
332 bool sendEvent( ImpShapeEventMap::reverse_iterator const & io_rHitShape )
333 {
334 // take next event from queue
335 const bool bRet( fireSingleEvent( io_rHitShape->second,
336 mrEventQueue ) );
337
338 // clear shape entry, if its queue is
339 // empty. This is important, since the shapes
340 // are held by shared ptr, and might otherwise
341 // not get released, even after their owning
342 // slide is long gone.
343 if( io_rHitShape->second.empty() )
344 {
345 // this looks funny, since ::std::map does
346 // provide an erase( iterator )
347 // method. Unfortunately, C++ does not
348 // declare the obvious erase(
349 // reverse_iterator ) needed here (missing
350 // orthogonality, eh?)
351 maShapeEventMap.erase( io_rHitShape->first );
352 }
353
354 return bRet;
355 }
356
357 bool processEvent( const awt::MouseEvent& e )
358 {
359 ImpShapeEventMap::reverse_iterator aCurrShape;
360
361 if( hitTest( e, aCurrShape ) )
362 return sendEvent( aCurrShape );
363
364 return false; // did not handle the event
365 }
366
367private:
368 EventQueue& mrEventQueue;
369 ImpShapeEventMap maShapeEventMap;
370};
371
372}
373
374class ShapeClickEventHandler : public MouseHandlerBase
375{
376public:
377 ShapeClickEventHandler( CursorManager& rCursorManager,
378 EventQueue& rEventQueue ) :
379 MouseHandlerBase( rEventQueue ),
380 mrCursorManager( rCursorManager )
381 {}
382
383 virtual bool handleMouseReleased( const awt::MouseEvent& e ) override
384 {
385 if(e.Buttons != awt::MouseButton::LEFT)
386 return false;
387 return processEvent( e );
388 }
389
390 virtual bool handleMouseMoved( const awt::MouseEvent& e ) override
391 {
392 // TODO(P2): Maybe buffer last shape touched
393
394 // if we have a shape click event, and the mouse
395 // hovers over this shape, change cursor to hand
396 ImpShapeEventMap::reverse_iterator aDummy;
397 if( hitTest( e, aDummy ) )
398 mrCursorManager.requestCursor( awt::SystemPointer::REFHAND );
399
400 return false; // we don't /eat/ this event. Lower prio
401 // handler should see it, too.
402 }
403
404private:
405 CursorManager& mrCursorManager;
406};
407
408class MouseEnterHandler : public MouseHandlerBase
409{
410public:
411 explicit MouseEnterHandler( EventQueue& rEventQueue )
412 : MouseHandlerBase( rEventQueue ),
413 mpLastShape() {}
414
415 virtual bool handleMouseMoved( const awt::MouseEvent& e ) override
416 {
417 // TODO(P2): Maybe buffer last shape touched, and
418 // check against that _first_
419
420 ImpShapeEventMap::reverse_iterator aCurr;
421 if( hitTest( e, aCurr ) )
422 {
423 if( aCurr->first != mpLastShape )
424 {
425 // we actually hit a shape, and it's different
426 // from the previous one - thus we just
427 // entered it, raise event
428 sendEvent( aCurr );
429 mpLastShape = aCurr->first;
430 }
431 }
432 else
433 {
434 // don't hit no shape - thus, last shape is NULL
435 mpLastShape.reset();
436 }
437
438 return false; // we don't /eat/ this event. Lower prio
439 // handler should see it, too.
440 }
441
442private:
444};
445
446class MouseLeaveHandler : public MouseHandlerBase
447{
448public:
449 explicit MouseLeaveHandler( EventQueue& rEventQueue )
450 : MouseHandlerBase( rEventQueue ),
451 maLastIter() {}
452
453 virtual bool handleMouseMoved( const awt::MouseEvent& e ) override
454 {
455 // TODO(P2): Maybe buffer last shape touched, and
456 // check against that _first_
457
458 ImpShapeEventMap::reverse_iterator aCurr;
459 if( hitTest( e, aCurr ) )
460 {
461 maLastIter = aCurr;
462 }
463 else
464 {
465 if( maLastIter->first )
466 {
467 // last time, we were over a shape, now we're
468 // not - we thus just left that shape, raise
469 // event
470 sendEvent( maLastIter );
471 }
472
473 // in any case, when we hit this else-branch: no
474 // shape hit, thus have to clear maLastIter
475 maLastIter = ImpShapeEventMap::reverse_iterator();
476 }
477
478 return false; // we don't /eat/ this event. Lower prio
479 // handler should see it, too.
480 }
481
482private:
483 ImpShapeEventMap::reverse_iterator maLastIter;
484};
485
486template< typename Handler, typename Functor >
488 std::shared_ptr< Handler >& rHandler,
489 const EventSharedPtr& rEvent,
490 const Functor& rRegistrationFunctor )
491{
492 ENSURE_OR_THROW( rEvent,
493 "UserEventQueue::registerEvent(): Invalid event" );
494
495 if( !rHandler ) {
496 // create handler
497 rHandler = std::make_shared<Handler>( mrEventQueue );
498 // register handler on EventMultiplexer
499 rRegistrationFunctor( rHandler );
500 }
501
502 rHandler->addEvent( rEvent );
503}
504
505template< typename Handler, typename Arg, typename Functor >
507 std::shared_ptr< Handler >& rHandler,
508 const EventSharedPtr& rEvent,
509 const Arg& rArg,
510 const Functor& rRegistrationFunctor )
511{
512 ENSURE_OR_THROW( rEvent,
513 "UserEventQueue::registerEvent(): Invalid event" );
514
515 if( !rHandler ) {
516 // create handler
517 rHandler = std::make_shared<Handler>( mrEventQueue );
518
519 // register handler on EventMultiplexer
520 rRegistrationFunctor( rHandler );
521 }
522
523 rHandler->addEvent( rEvent, rArg );
524}
525
526
528 EventQueue& rEventQueue,
529 CursorManager& rCursorManager )
530 : mrMultiplexer( rMultiplexer ),
531 mrEventQueue( rEventQueue ),
532 mrCursorManager( rCursorManager ),
533 mpAnimationStartEventHandler(),
534 mpAnimationEndEventHandler(),
535 mpAudioStoppedEventHandler(),
536 mpClickEventHandler(),
537 mpSkipEffectEventHandler(),
538 mpMouseEnterHandler(),
539 mpMouseLeaveHandler(),
540 mbAdvanceOnClick( true )
541{
542}
543
545{
546 try
547 {
548 // unregister all handlers
549 clear();
550 }
551 catch (const uno::Exception&)
552 {
553 TOOLS_WARN_EXCEPTION("slideshow", "");
554 }
555}
556
558{
559 // unregister and delete all handlers
564 }
568 }
572 }
577 }
578 if( mpClickEventHandler ) {
581 mpClickEventHandler.reset();
582 }
587 }
592 }
593 if( mpMouseEnterHandler ) {
595 mpMouseEnterHandler.reset();
596 }
597 if( mpMouseLeaveHandler ) {
599 mpMouseLeaveHandler.reset();
600 }
601}
602
603void UserEventQueue::setAdvanceOnClick( bool bAdvanceOnClick )
604{
605 mbAdvanceOnClick = bAdvanceOnClick;
606
607 // forward to handler, if existing. Otherwise, the handler
608 // creation will do the forwarding.
610 mpClickEventHandler->setAdvanceOnClick( bAdvanceOnClick );
611}
612
614 const EventSharedPtr& rEvent,
616{
618 rEvent,
619 xNode,
620 [this]( const AnimationEventHandlerSharedPtr& rHandler )
621 { return this->mrMultiplexer.addAnimationStartHandler( rHandler ); } );
622}
623
625 const EventSharedPtr& rEvent,
627{
629 rEvent,
630 xNode,
631 [this]( const AnimationEventHandlerSharedPtr& rHandler )
632 { return this->mrMultiplexer.addAnimationEndHandler( rHandler ); } );
633}
634
636 const EventSharedPtr& rEvent,
638{
640 rEvent,
641 xNode,
642 [this]( const AnimationEventHandlerSharedPtr& rHandler )
643 { return this->mrMultiplexer.addAudioStoppedHandler( rHandler ); } );
644}
645
647 const ShapeSharedPtr& rShape )
648{
650 rEvent,
651 "UserEventQueue::registerShapeClickEvent(): Invalid event" );
652
654 {
655 // create handler
657 std::make_shared<ShapeClickEventHandler>(mrCursorManager,
659
660 // register handler on EventMultiplexer
663 }
664
665 mpShapeClickEventHandler->addEvent( rEvent, rShape );
666}
667
668namespace {
669class ClickEventRegistrationFunctor
670{
671public:
672 ClickEventRegistrationFunctor( EventMultiplexer& rMultiplexer,
673 double nPrio,
674 bool bAdvanceOnClick )
675 : mrMultiplexer( rMultiplexer ),
676 mnPrio(nPrio),
677 mbAdvanceOnClick( bAdvanceOnClick ) {}
678
679 void operator()( const std::shared_ptr<ClickEventHandler>& rHandler )const
680 {
681 // register the handler on _two_ sources: we want the
682 // nextEffect events, e.g. space bar, to trigger clicks, as well!
683 mrMultiplexer.addClickHandler( rHandler, mnPrio );
684 mrMultiplexer.addNextEffectHandler( rHandler, mnPrio );
685
686 // forward advance-on-click state to newly
687 // generated handler (that's the only reason why
688 // we're called here)
689 rHandler->setAdvanceOnClick( mbAdvanceOnClick );
690 }
691
692private:
693 EventMultiplexer& mrMultiplexer;
694 double const mnPrio;
696};
697} // anon namespace
698
700{
701 // TODO: better name may be mpNextEffectEventHandler? then we have
702 // next effect (=> waiting to be started)
703 // skip effect (skipping the currently running one)
704 // rewind effect (rewinding back running one and waiting (again)
705 // to be started)
707 rEvent,
708 ClickEventRegistrationFunctor( mrMultiplexer,
709 0.0 /* default prio */,
711}
712
714 EventSharedPtr const & pEvent,
715 const bool bSkipTriggersNextEffect)
716{
718 {
720 std::make_shared<SkipEffectEventHandler>( mrEventQueue, mrMultiplexer );
721 // register the handler on _two_ sources: we want the
722 // nextEffect events, e.g. space bar, to trigger clicks, as well!
724 -1.0 /* prio below default */ );
726 -1.0 /* prio below default */ );
727 // forward advance-on-click state to newly
728 // generated handler (that's the only reason why
729 // we're called here)
730 mpSkipEffectEventHandler->setAdvanceOnClick( mbAdvanceOnClick );
731 }
732 mpSkipEffectEventHandler->setSkipTriggersNextEffect(bSkipTriggersNextEffect);
733 mpSkipEffectEventHandler->addEvent( pEvent );
734}
735
737 const EventSharedPtr& rEvent,
738 const ShapeSharedPtr& rShape )
739{
741 rEvent,
742 "UserEventQueue::registerShapeDoubleClickEvent(): Invalid event" );
743
745 {
746 // create handler
748 std::make_shared<ShapeClickEventHandler>(mrCursorManager,
750
751 // register handler on EventMultiplexer
753 1.0 );
755 1.0 );
756 }
757
758 mpShapeDoubleClickEventHandler->addEvent( rEvent, rShape );
759}
760
762 const ShapeSharedPtr& rShape )
763{
765 rEvent,
766 rShape,
767 [this]( const MouseEventHandlerSharedPtr& rHandler )
768 { return this->mrMultiplexer.addMouseMoveHandler( rHandler, 0.0 ); } );
769}
770
772 const ShapeSharedPtr& rShape )
773{
775 rEvent,
776 rShape,
777 [this]( const MouseEventHandlerSharedPtr& rHandler )
778 { return this->mrMultiplexer.addMouseMoveHandler( rHandler, 0.0 ); } );
779}
780
782{
783 ::std::shared_ptr<SkipEffectEventHandler> pHandler (
784 ::std::dynamic_pointer_cast<SkipEffectEventHandler>(mpSkipEffectEventHandler));
785 if (pHandler)
786 pHandler->skipEffect();
787}
788
789} // namespace presentation
790
791/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
virtual bool handleAnimationEvent(const AnimationNodeSharedPtr &rNode) override
Handle the event.
void addEvent(const EventSharedPtr &rEvent, const uno::Reference< animations::XAnimationNode > &xNode)
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)
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.
Definition: eventqueue.hxx:41
bool addEvent(const EventSharedPtr &event)
Add the given event to the queue.
Definition: eventqueue.cxx:79
bool addEventWhenQueueIsEmpty(const EventSharedPtr &rpEvent)
Another way to control the order of asynchronous event execution.
Definition: eventqueue.cxx:122
virtual bool handleMouseMoved(const awt::MouseEvent &e) override
MouseEnterHandler(EventQueue &rEventQueue)
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
ShapeClickEventHandler(CursorManager &rCursorManager, EventQueue &rEventQueue)
SkipEffectEventHandler(EventQueue &rEventQueue, EventMultiplexer &rEventMultiplexer)
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.
void skipEffect()
Skip the current effect but do not trigger the next effect.
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
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.
::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 makeEvent(f, d)
Definition: delayevent.hxx:131
#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
Definition: event.hxx:76
::std::shared_ptr< AnimationEventHandler > AnimationEventHandlerSharedPtr
::std::shared_ptr< Shape > ShapeSharedPtr
CursorManager & mrCursorManager
parent cursor manager
Definition: slideimpl.cxx:206
double const mnPrio
EventMultiplexer & mrMultiplexer
ImpEventQueue maEvents
ImpShapeEventMap maShapeEventMap
EventQueue & mrEventQueue
bool const mbAdvanceOnClick