summaryrefslogtreecommitdiff
path: root/slideshow/source/inc/eventmultiplexer.hxx
blob: 0fb73fbdcb0d768252682fb809cab0807bcf2dfa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
/*************************************************************************
 *
 *  OpenOffice.org - a multi-platform office productivity suite
 *
 *  $RCSfile: eventmultiplexer.hxx,v $
 *
 *  $Revision: 1.7 $
 *
 *  last change: $Author: kz $ $Date: 2006-12-13 15:56:27 $
 *
 *  The Contents of this file are made available subject to
 *  the terms of GNU Lesser General Public License Version 2.1.
 *
 *
 *    GNU Lesser General Public License Version 2.1
 *    =============================================
 *    Copyright 2005 by Sun Microsystems, Inc.
 *    901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *    This library is free software; you can redistribute it and/or
 *    modify it under the terms of the GNU Lesser General Public
 *    License version 2.1, as published by the Free Software Foundation.
 *
 *    This library 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 for more details.
 *
 *    You should have received a copy of the GNU Lesser General Public
 *    License along with this library; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *    MA  02111-1307  USA
 *
 ************************************************************************/
#if ! defined(INCLUDED_SLIDESHOW_EVENTMULTIPLEXER_HXX)
#define INCLUDED_SLIDESHOW_EVENTMULTIPLEXER_HXX

#include <rtl/ref.hxx>
#include <com/sun/star/awt/XMouseListener.hpp>
#include <com/sun/star/awt/XMouseMotionListener.hpp>
#include <cppuhelper/compbase2.hxx>
#include <comphelper/broadcasthelper.hxx>

#include "eventhandler.hxx"
#include "unoviewcontainer.hxx"
#include "mouseeventhandler.hxx"
#include "animationeventhandler.hxx"
#include "pauseeventhandler.hxx"
#include "vieweventhandler.hxx"
#include "layermanager.hxx"
#include "animationnode.hxx"
#include "eventqueue.hxx"
#include "unoview.hxx"

#include <boost/weak_ptr.hpp>
#include <boost/function.hpp>
#include <boost/noncopyable.hpp>

namespace slideshow {
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
{
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,
                                                      const UnoViewContainer& rViews );

    // Management methods
    // =========================================================

    /** 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 for the given view, by
        first updating all layers (if setLayerManager() was called
        with a valid layer manager previously), and then calling
        updateScreen() on the view.

        @param rView
        The view to update

        @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( const UnoViewSharedPtr& rView,
                              bool                    bForceUpdate );

    /** 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 views are
        changed.

        For each view added, viewAdded() will be called on the
        handler. For each view removed, viewRemoved() will be
        called. Each modified view will cause a viewChanged() call on
        each handler.

        You don't need to deregister the handler, it will be
        automatically removed, once the pointee becomes stale.

        @param rHandler
        Handler to call.
    */
    void addViewHandler( const ViewEventHandlerWeakPtr& rHandler );

    /** 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
    // =========================================================

    /** View added.

        This method adds another view, which the show is
        displayed on. On every added view, the EventMultiplexer
        registers mouse and motion event listeners.
    */
    bool notifyViewAdded( const UnoViewSharedPtr& rView );

    /** View removed

        This method removes a view. Registered mouse and
        motion event listeners are revoked.
    */
    bool notifyViewRemoved( const UnoViewSharedPtr& rView );

    /** View changed

        This method announces a changed view to all view
        listeners. View changes include size and transformation.
    */
    bool notifyViewChanged( const UnoViewSharedPtr& rView );

    /** All Views changed

        This method announces to all view listeners that
        <em>every</em> known view has changed. View changes include
        size and transformation.
    */
    bool notifyViewsChanged();

    /** 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&,
                      const UnoViewContainer& );
    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;
    typedef std::vector<ViewEventHandlerWeakPtr>        ImplViewHandlers;

    template <typename ContainerT, typename HandlerT>
    void addHandler( ContainerT & rContainer,
                     boost::shared_ptr<HandlerT> const& pHandler );

    template <typename ContainerT, typename HandlerT>
    void addHandler( ContainerT & rContainer,
                     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 Container, typename Handler >
    void removeHandler( Container&                              rContainer,
                        const 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 T, typename FuncT>
    bool notifyAllHandlers( std::vector< boost::shared_ptr<T> > const& rContainer, FuncT const& func );

    /** @return true: at least one handler returned true
                false: not a single handler returned true
    */
    template <typename FuncT> bool notifyAllViewHandlers( FuncT const& func );

    bool notifyAllEventHandlers( ImplEventHandlers const& rContainer ) {
        return notifyAllHandlers( rContainer,
                                  boost::mem_fn(&EventHandler::handleEvent) );
    }

    bool notifyAllAnimationHandlers( ImplAnimationHandlers const& rContainer,
                                     AnimationNodeSharedPtr const& rNode ) {
        return notifyAllHandlers(
            rContainer,
            boost::bind( &AnimationEventHandler::handleAnimationEvent,
                         _1, boost::cref(rNode) ) );
    }

    bool notifyMouseHandlers(
        const 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               maViewContainer;

    ImplNextEffectHandlers      maNextEffectHandlers;
    ImplEventHandlers           maSlideStartHandlers;
    ImplEventHandlers           maSlideEndHandlers;
    ImplAnimationHandlers       maAnimationStartHandlers;
    ImplAnimationHandlers       maAnimationEndHandlers;
    ImplEventHandlers           maSlideAnimationsEndHandlers;
    ImplAnimationHandlers       maAudioStoppedHandlers;
    ImplAnimationHandlers       maCommandStopAudioHandlers;
    ImplPauseHandlers           maPauseHandlers;
    ImplViewHandlers            maViewHandlers;
    ImplMouseHandlers           maMouseClickHandlers;
    ImplMouseHandlers           maMouseDoubleClickHandlers;
    ImplMouseHandlers           maMouseMoveHandlers;

    struct AllViewNotifier;
    friend struct AllViewNotifier;

    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 */