1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef INCLUDED_SLIDESHOW_USEREVENTQUEUE_HXX 25*b1cdbd2cSJim Jagielski #define INCLUDED_SLIDESHOW_USEREVENTQUEUE_HXX 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/XAnimationNode.hpp> 28*b1cdbd2cSJim Jagielski 29*b1cdbd2cSJim Jagielski #include "eventmultiplexer.hxx" 30*b1cdbd2cSJim Jagielski #include "eventqueue.hxx" 31*b1cdbd2cSJim Jagielski #include "shape.hxx" 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski #include <boost/noncopyable.hpp> 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski /* Definition of UserEventQueue class */ 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski namespace slideshow { 38*b1cdbd2cSJim Jagielski namespace internal { 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielski class PlainEventHandler; 41*b1cdbd2cSJim Jagielski class AllAnimationEventHandler; 42*b1cdbd2cSJim Jagielski class ShapeClickEventHandler; 43*b1cdbd2cSJim Jagielski class ClickEventHandler; 44*b1cdbd2cSJim Jagielski class CursorManager; 45*b1cdbd2cSJim Jagielski class SkipEffectEventHandler; 46*b1cdbd2cSJim Jagielski class RewindEffectEventHandler; 47*b1cdbd2cSJim Jagielski class MouseEnterHandler; 48*b1cdbd2cSJim Jagielski class MouseLeaveHandler; 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski /** This class schedules user-activated events. 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski This class registeres at the EventMultiplexer and fires 53*b1cdbd2cSJim Jagielski events registered for certain user actions. Note that all 54*b1cdbd2cSJim Jagielski events will not be fired immediately after the user action 55*b1cdbd2cSJim Jagielski occured, but always added to the EventQueue (and fired the 56*b1cdbd2cSJim Jagielski next time that queue is processed). Which is actually a 57*b1cdbd2cSJim Jagielski feature. 58*b1cdbd2cSJim Jagielski 59*b1cdbd2cSJim Jagielski Conceptually, an event is an object that typically is 60*b1cdbd2cSJim Jagielski fired only once. After that, the event is exhausted, and 61*b1cdbd2cSJim Jagielski should be discarded. Therefore, all events registered on 62*b1cdbd2cSJim Jagielski this object are fired and then all references to them are 63*b1cdbd2cSJim Jagielski removed. 64*b1cdbd2cSJim Jagielski */ 65*b1cdbd2cSJim Jagielski class UserEventQueue : private ::boost::noncopyable 66*b1cdbd2cSJim Jagielski { 67*b1cdbd2cSJim Jagielski public: 68*b1cdbd2cSJim Jagielski /** Create a user event queue 69*b1cdbd2cSJim Jagielski 70*b1cdbd2cSJim Jagielski @param rEventMultiplexer 71*b1cdbd2cSJim Jagielski The slideshow-global event source, where this class 72*b1cdbd2cSJim Jagielski registeres its event handlers. 73*b1cdbd2cSJim Jagielski 74*b1cdbd2cSJim Jagielski @param rEventQueue 75*b1cdbd2cSJim Jagielski Reference to the main event queue. Since we hold this 76*b1cdbd2cSJim Jagielski object by plain reference, it must live longer than we 77*b1cdbd2cSJim Jagielski do. On the other hand, that queue must not fire events 78*b1cdbd2cSJim Jagielski after this object is destroyed, since we might 79*b1cdbd2cSJim Jagielski schedule events there which itself contain plain 80*b1cdbd2cSJim Jagielski references to this object. Basically, EventQueue and 81*b1cdbd2cSJim Jagielski UserEventQueue should have the same lifetime, and since 82*b1cdbd2cSJim Jagielski this is not possible, both must be destructed in a 83*b1cdbd2cSJim Jagielski phased mode: first clear both of any remaining events, 84*b1cdbd2cSJim Jagielski then destruct them. 85*b1cdbd2cSJim Jagielski */ 86*b1cdbd2cSJim Jagielski UserEventQueue( EventMultiplexer& rMultiplexer, 87*b1cdbd2cSJim Jagielski EventQueue& rEventQueue, 88*b1cdbd2cSJim Jagielski CursorManager& rCursorManager ); 89*b1cdbd2cSJim Jagielski ~UserEventQueue(); 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski /** Query whether there are any events still pending. 92*b1cdbd2cSJim Jagielski */ 93*b1cdbd2cSJim Jagielski bool isEmpty() const; 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski /** Clear all registered events. 96*b1cdbd2cSJim Jagielski 97*b1cdbd2cSJim Jagielski This method clears all registered, but 98*b1cdbd2cSJim Jagielski not-yet-executed events. This comes in handy when 99*b1cdbd2cSJim Jagielski force-ending a slide, to avoid interference with the 100*b1cdbd2cSJim Jagielski next slide's event registration. 101*b1cdbd2cSJim Jagielski */ 102*b1cdbd2cSJim Jagielski void clear(); 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski /** Set advance on click behaviour. 105*b1cdbd2cSJim Jagielski 106*b1cdbd2cSJim Jagielski @param bAdvanceOnClick 107*b1cdbd2cSJim Jagielski When true, a click somewhere on the slide will also 108*b1cdbd2cSJim Jagielski generate next effect event. In this case, it is 109*b1cdbd2cSJim Jagielski irrelevant where on the slide the mouse is clicked, 110*b1cdbd2cSJim Jagielski i.e. the shape need not be hit by the mouse. 111*b1cdbd2cSJim Jagielski */ 112*b1cdbd2cSJim Jagielski void setAdvanceOnClick( bool bAdvanceOnClick ); 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski /** Register an event that will be fired when the slide is 115*b1cdbd2cSJim Jagielski just shown. 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski Note that <em>all</em> registered events will be fired 118*b1cdbd2cSJim Jagielski when the slide start occurs. This is in contrast to 119*b1cdbd2cSJim Jagielski the mouse events below. 120*b1cdbd2cSJim Jagielski */ 121*b1cdbd2cSJim Jagielski void registerSlideStartEvent( const EventSharedPtr& rEvent ); 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielski /** Register an event that will be fired when the slide is 124*b1cdbd2cSJim Jagielski about to vanish. 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski Note that <em>all</em> registered events will be fired 127*b1cdbd2cSJim Jagielski when the slide end occurs. This is in contrast to 128*b1cdbd2cSJim Jagielski the mouse events below. 129*b1cdbd2cSJim Jagielski */ 130*b1cdbd2cSJim Jagielski void registerSlideEndEvent( const EventSharedPtr& rEvent ); 131*b1cdbd2cSJim Jagielski 132*b1cdbd2cSJim Jagielski /** Register an event that will be fired when the given 133*b1cdbd2cSJim Jagielski animation node starts. 134*b1cdbd2cSJim Jagielski 135*b1cdbd2cSJim Jagielski Note that <em>all</em> registered events will be fired 136*b1cdbd2cSJim Jagielski when the animation start occurs. This is in contrast to 137*b1cdbd2cSJim Jagielski the mouse events below. 138*b1cdbd2cSJim Jagielski */ 139*b1cdbd2cSJim Jagielski void registerAnimationStartEvent( 140*b1cdbd2cSJim Jagielski const EventSharedPtr& rEvent, 141*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< 142*b1cdbd2cSJim Jagielski ::com::sun::star::animations::XAnimationNode>& xNode ); 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski /** Register an event that will be fired when the given 145*b1cdbd2cSJim Jagielski animation node ends its active duration. 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski Note that <em>all</em> registered events will be fired 148*b1cdbd2cSJim Jagielski when the animation end occurs. This is in contrast to 149*b1cdbd2cSJim Jagielski the mouse events below. 150*b1cdbd2cSJim Jagielski */ 151*b1cdbd2cSJim Jagielski void registerAnimationEndEvent( 152*b1cdbd2cSJim Jagielski const EventSharedPtr& rEvent, 153*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< 154*b1cdbd2cSJim Jagielski ::com::sun::star::animations::XAnimationNode>& xNode ); 155*b1cdbd2cSJim Jagielski 156*b1cdbd2cSJim Jagielski /** Register an event that will be fired when audio output 157*b1cdbd2cSJim Jagielski stopped for the given animation node. 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski Note that <em>all</em> registered events will be fired 160*b1cdbd2cSJim Jagielski when the audio stopping occurs. This is in contrast to 161*b1cdbd2cSJim Jagielski the mouse events below. 162*b1cdbd2cSJim Jagielski */ 163*b1cdbd2cSJim Jagielski void registerAudioStoppedEvent( 164*b1cdbd2cSJim Jagielski const EventSharedPtr& rEvent, 165*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< 166*b1cdbd2cSJim Jagielski ::com::sun::star::animations::XAnimationNode>& xNode ); 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski /** Register an event that is fired when a shape is clicked 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski For every mouse click, only one of the events 171*b1cdbd2cSJim Jagielski registered here is fired. The order of fired events is 172*b1cdbd2cSJim Jagielski the order of registration, i.e. the first event 173*b1cdbd2cSJim Jagielski registered will be the one fired for the first mouse 174*b1cdbd2cSJim Jagielski click on the given shape. 175*b1cdbd2cSJim Jagielski */ 176*b1cdbd2cSJim Jagielski void registerShapeClickEvent( const EventSharedPtr& rEvent, 177*b1cdbd2cSJim Jagielski const ShapeSharedPtr& rShape ); 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski /** Registes an event that is fired when the current effects(s) 180*b1cdbd2cSJim Jagielski are skipped, .e.g. when the left mouse button is pressed. 181*b1cdbd2cSJim Jagielski Then, all registered events are fired and removed from this 182*b1cdbd2cSJim Jagielski queue. After firing, a next effect event is issued to this 183*b1cdbd2cSJim Jagielski queue to start the next effect. 184*b1cdbd2cSJim Jagielski @param pEvent 185*b1cdbd2cSJim Jagielski The event to execute when skipping the current effect. 186*b1cdbd2cSJim Jagielski @param bSkipTriggersNextEffect 187*b1cdbd2cSJim Jagielski When <TRUE/> then after skipping the current effect the next 188*b1cdbd2cSJim Jagielski effect is triggered. When <FALSE/> then the next effect is not 189*b1cdbd2cSJim Jagielski triggered. 190*b1cdbd2cSJim Jagielski */ 191*b1cdbd2cSJim Jagielski void registerSkipEffectEvent( 192*b1cdbd2cSJim Jagielski EventSharedPtr const& pEvent, 193*b1cdbd2cSJim Jagielski const bool bSkipTriggersNextEffect); 194*b1cdbd2cSJim Jagielski 195*b1cdbd2cSJim Jagielski /** Registes an event that is fired when the current effects(s) 196*b1cdbd2cSJim Jagielski are rewound, .e.g. when the right mouse button is pressed. 197*b1cdbd2cSJim Jagielski Then, all registered events are fired and removed from this 198*b1cdbd2cSJim Jagielski queue. 199*b1cdbd2cSJim Jagielski */ 200*b1cdbd2cSJim Jagielski void registerRewindEffectEvent( EventSharedPtr const& rEvent ); 201*b1cdbd2cSJim Jagielski 202*b1cdbd2cSJim Jagielski /** Register an event that is fired to show the next event 203*b1cdbd2cSJim Jagielski 204*b1cdbd2cSJim Jagielski For every next effect event, only one of the events 205*b1cdbd2cSJim Jagielski registered here is fired. The order of fired events is 206*b1cdbd2cSJim Jagielski the order of registration, i.e. the first event 207*b1cdbd2cSJim Jagielski registered will be the one fired for the first mouse 208*b1cdbd2cSJim Jagielski click. When advance-on-click (see method 209*b1cdbd2cSJim Jagielski setAdvanceOnClick()) is enabled, a mouse click 210*b1cdbd2cSJim Jagielski somewhere on the slide will also generate a next 211*b1cdbd2cSJim Jagielski effect event. In this case, it is irrelevant where on 212*b1cdbd2cSJim Jagielski the slide the mouse is clicked, i.e. the shape need 213*b1cdbd2cSJim Jagielski not be hit by the mouse. 214*b1cdbd2cSJim Jagielski */ 215*b1cdbd2cSJim Jagielski void registerNextEffectEvent( const EventSharedPtr& rEvent ); 216*b1cdbd2cSJim Jagielski 217*b1cdbd2cSJim Jagielski /** Register an event that is fired on a double mouse 218*b1cdbd2cSJim Jagielski click on a shape 219*b1cdbd2cSJim Jagielski 220*b1cdbd2cSJim Jagielski For every mouse double click, only one of the events 221*b1cdbd2cSJim Jagielski registered here is fired. The order of fired events is 222*b1cdbd2cSJim Jagielski the order of registration, i.e. the first event 223*b1cdbd2cSJim Jagielski registered will be the one fired for the first mouse 224*b1cdbd2cSJim Jagielski double click. It is irrelevant where on the slide the 225*b1cdbd2cSJim Jagielski mouse is clicked, i.e. the shape need not be hit by 226*b1cdbd2cSJim Jagielski the mouse. 227*b1cdbd2cSJim Jagielski */ 228*b1cdbd2cSJim Jagielski void registerShapeDoubleClickEvent( const EventSharedPtr& rEvent, 229*b1cdbd2cSJim Jagielski const ShapeSharedPtr& rShape ); 230*b1cdbd2cSJim Jagielski 231*b1cdbd2cSJim Jagielski /** Register an event that is fired on a double mouse click 232*b1cdbd2cSJim Jagielski 233*b1cdbd2cSJim Jagielski For every mouse double click, only one of the events 234*b1cdbd2cSJim Jagielski registered here is fired. The order of fired events is 235*b1cdbd2cSJim Jagielski the order of registration, i.e. the first event 236*b1cdbd2cSJim Jagielski registered will be the one fired for the first mouse 237*b1cdbd2cSJim Jagielski double click. It is irrelevant where on the slide the 238*b1cdbd2cSJim Jagielski mouse is clicked, i.e. the shape need not be hit by 239*b1cdbd2cSJim Jagielski the mouse. 240*b1cdbd2cSJim Jagielski */ 241*b1cdbd2cSJim Jagielski void registerDoubleClickEvent( const EventSharedPtr& rEvent ); 242*b1cdbd2cSJim Jagielski 243*b1cdbd2cSJim Jagielski /** Register an event that is fired when the mouse enters 244*b1cdbd2cSJim Jagielski the area of the given shape 245*b1cdbd2cSJim Jagielski 246*b1cdbd2cSJim Jagielski For every enter, only one of the events registered 247*b1cdbd2cSJim Jagielski here is fired. The order of fired events is the order 248*b1cdbd2cSJim Jagielski of registration, i.e. the first event registered will 249*b1cdbd2cSJim Jagielski be the one fired for the first time the mouse enters 250*b1cdbd2cSJim Jagielski the given shape. 251*b1cdbd2cSJim Jagielski */ 252*b1cdbd2cSJim Jagielski void registerMouseEnterEvent( const EventSharedPtr& rEvent, 253*b1cdbd2cSJim Jagielski const ShapeSharedPtr& rShape ); 254*b1cdbd2cSJim Jagielski 255*b1cdbd2cSJim Jagielski /** Register an event that is fired when the mouse leaves 256*b1cdbd2cSJim Jagielski the area of the given shape 257*b1cdbd2cSJim Jagielski 258*b1cdbd2cSJim Jagielski For every leave, only one of the events registered 259*b1cdbd2cSJim Jagielski here is fired. The order of fired events is the order 260*b1cdbd2cSJim Jagielski of registration, i.e. the first event registered will 261*b1cdbd2cSJim Jagielski be the one fired for the first time the mouse leaves 262*b1cdbd2cSJim Jagielski the given shape area. 263*b1cdbd2cSJim Jagielski */ 264*b1cdbd2cSJim Jagielski void registerMouseLeaveEvent( const EventSharedPtr& rEvent, 265*b1cdbd2cSJim Jagielski const ShapeSharedPtr& rShape ); 266*b1cdbd2cSJim Jagielski 267*b1cdbd2cSJim Jagielski /** Typically skipping the current effect is triggered by mouse clicks 268*b1cdbd2cSJim Jagielski or key presses that trigger the next effect. This method allows the 269*b1cdbd2cSJim Jagielski skipping of effects to be triggered programatically. 270*b1cdbd2cSJim Jagielski */ 271*b1cdbd2cSJim Jagielski void callSkipEffectEventHandler (void); 272*b1cdbd2cSJim Jagielski 273*b1cdbd2cSJim Jagielski private: 274*b1cdbd2cSJim Jagielski /** Generically register an event on one of the handlers. 275*b1cdbd2cSJim Jagielski 276*b1cdbd2cSJim Jagielski If the handler is not yet created, do that and 277*b1cdbd2cSJim Jagielski register it via the Functor 278*b1cdbd2cSJim Jagielski */ 279*b1cdbd2cSJim Jagielski template< typename Handler, typename Functor > 280*b1cdbd2cSJim Jagielski void registerEvent( ::boost::shared_ptr< Handler >& rHandler, 281*b1cdbd2cSJim Jagielski const EventSharedPtr& rEvent, 282*b1cdbd2cSJim Jagielski const Functor& rRegistrationFunctor ); 283*b1cdbd2cSJim Jagielski 284*b1cdbd2cSJim Jagielski /** Generically register an event on one of the handlers. 285*b1cdbd2cSJim Jagielski 286*b1cdbd2cSJim Jagielski If the handler is not yet created, do that and 287*b1cdbd2cSJim Jagielski register it via the Functor. This version of the 288*b1cdbd2cSJim Jagielski registerEvent method takes an additional parameter 289*b1cdbd2cSJim Jagielski rArg, which is passed as the second argument to 290*b1cdbd2cSJim Jagielski rHandler's addEvent() method. 291*b1cdbd2cSJim Jagielski */ 292*b1cdbd2cSJim Jagielski template< typename Handler, typename Arg, typename Functor > 293*b1cdbd2cSJim Jagielski void registerEvent( ::boost::shared_ptr< Handler >& rHandler, 294*b1cdbd2cSJim Jagielski const EventSharedPtr& rEvent, 295*b1cdbd2cSJim Jagielski const Arg& rArg, 296*b1cdbd2cSJim Jagielski const Functor& rRegistrationFunctor ); 297*b1cdbd2cSJim Jagielski 298*b1cdbd2cSJim Jagielski EventMultiplexer& mrMultiplexer; 299*b1cdbd2cSJim Jagielski EventQueue& mrEventQueue; 300*b1cdbd2cSJim Jagielski CursorManager& mrCursorManager; 301*b1cdbd2cSJim Jagielski 302*b1cdbd2cSJim Jagielski ::boost::shared_ptr<PlainEventHandler> mpStartEventHandler; 303*b1cdbd2cSJim Jagielski ::boost::shared_ptr<PlainEventHandler> mpEndEventHandler; 304*b1cdbd2cSJim Jagielski ::boost::shared_ptr<AllAnimationEventHandler> mpAnimationStartEventHandler; 305*b1cdbd2cSJim Jagielski ::boost::shared_ptr<AllAnimationEventHandler> mpAnimationEndEventHandler; 306*b1cdbd2cSJim Jagielski ::boost::shared_ptr<AllAnimationEventHandler> mpAudioStoppedEventHandler; 307*b1cdbd2cSJim Jagielski ::boost::shared_ptr<ShapeClickEventHandler> mpShapeClickEventHandler; 308*b1cdbd2cSJim Jagielski ::boost::shared_ptr<ClickEventHandler> mpClickEventHandler; 309*b1cdbd2cSJim Jagielski ::boost::shared_ptr<SkipEffectEventHandler> mpSkipEffectEventHandler; 310*b1cdbd2cSJim Jagielski ::boost::shared_ptr<RewindEffectEventHandler> mpRewindEffectEventHandler; 311*b1cdbd2cSJim Jagielski ::boost::shared_ptr<ShapeClickEventHandler> mpShapeDoubleClickEventHandler; 312*b1cdbd2cSJim Jagielski ::boost::shared_ptr<ClickEventHandler> mpDoubleClickEventHandler; 313*b1cdbd2cSJim Jagielski ::boost::shared_ptr<MouseEnterHandler> mpMouseEnterHandler; 314*b1cdbd2cSJim Jagielski ::boost::shared_ptr<MouseLeaveHandler> mpMouseLeaveHandler; 315*b1cdbd2cSJim Jagielski 316*b1cdbd2cSJim Jagielski bool mbAdvanceOnClick; 317*b1cdbd2cSJim Jagielski }; 318*b1cdbd2cSJim Jagielski 319*b1cdbd2cSJim Jagielski } // namespace internal 320*b1cdbd2cSJim Jagielski } // namespace presentation 321*b1cdbd2cSJim Jagielski 322*b1cdbd2cSJim Jagielski #endif /* INCLUDED_SLIDESHOW_USEREVENTQUEUE_HXX */ 323*b1cdbd2cSJim Jagielski 324