1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_slideshow.hxx"
26
27 // must be first
28 #include <canvas/debug.hxx>
29 #include <tools/diagnose_ex.h>
30
31 #include <rtl/ref.hxx>
32 #include <cppuhelper/compbase2.hxx>
33 #include <cppuhelper/basemutex.hxx>
34
35 #include <com/sun/star/awt/XMouseListener.hpp>
36 #include <com/sun/star/awt/XMouseMotionListener.hpp>
37 #include <com/sun/star/awt/SystemPointer.hpp>
38 #include <com/sun/star/awt/XWindow.hpp>
39 #include <com/sun/star/awt/MouseButton.hpp>
40 #include <com/sun/star/presentation/XSlideShowView.hpp>
41
42 #include <basegfx/matrix/b2dhommatrix.hxx>
43 #include <basegfx/numeric/ftools.hxx>
44
45 #include "tools.hxx"
46 #include "eventqueue.hxx"
47 #include "eventmultiplexer.hxx"
48 #include "listenercontainer.hxx"
49 #include "delayevent.hxx"
50 #include "unoview.hxx"
51 #include "unoviewcontainer.hxx"
52
53 #include <boost/shared_ptr.hpp>
54 #include <boost/weak_ptr.hpp>
55 #include <boost/function.hpp>
56 #include <boost/noncopyable.hpp>
57 #include <boost/bind.hpp>
58
59 #include <vector>
60 #include <hash_map>
61 #include <algorithm>
62
63 using namespace ::com::sun::star;
64
65 namespace boost
66 {
67 // add operator== for weak_ptr
operator ==(weak_ptr<T> const & rLHS,weak_ptr<T> const & rRHS)68 template<typename T> bool operator==( weak_ptr<T> const& rLHS,
69 weak_ptr<T> const& rRHS )
70 {
71 return !(rLHS<rRHS) && !(rRHS<rLHS);
72 }
73 }
74
75 namespace slideshow {
76 namespace internal {
77
78 template <typename HandlerT>
79 class PrioritizedHandlerEntry
80 {
81 typedef boost::shared_ptr<HandlerT> HandlerSharedPtrT;
82 HandlerSharedPtrT mpHandler;
83 double mnPrio;
84
85 public:
PrioritizedHandlerEntry(HandlerSharedPtrT const & pHandler,double nPrio)86 PrioritizedHandlerEntry( HandlerSharedPtrT const& pHandler,
87 double nPrio ) :
88 mpHandler(pHandler),
89 mnPrio(nPrio)
90 {}
91
getHandler() const92 HandlerSharedPtrT const& getHandler() const { return mpHandler; }
93
94 /// To sort according to priority
operator <(PrioritizedHandlerEntry const & rRHS) const95 bool operator<( PrioritizedHandlerEntry const& rRHS ) const
96 {
97 // reversed order - high prioritized entries
98 // should be at the beginning of the queue
99 return mnPrio > rRHS.mnPrio;
100 }
101
102 /// To permit std::remove in removeHandler template
operator ==(PrioritizedHandlerEntry const & rRHS) const103 bool operator==( PrioritizedHandlerEntry const& rRHS ) const
104 {
105 // ignore prio, for removal, only the handler ptr matters
106 return mpHandler == rRHS.mpHandler;
107 }
108 };
109
get_pointer(PrioritizedHandlerEntry<T> const & handler)110 template<typename T> inline T* get_pointer(PrioritizedHandlerEntry<T> const& handler)
111 {
112 return handler.getHandler().get();
113 }
114
115
116
117 ////////////////////////////////////////////////////////////////////////////
118
119
120 typedef cppu::WeakComponentImplHelper2<
121 awt::XMouseListener,
122 awt::XMouseMotionListener > Listener_UnoBase;
123
124 /** Listener class, to decouple UNO lifetime from EventMultiplexer
125
126 This class gets registered as the XMouse(Motion)Listener on the
127 XSlideViews, and passes on the events to the EventMultiplexer (via
128 EventQueue indirection, to force the events into the main thread)
129 */
130 class EventMultiplexerListener : private cppu::BaseMutex,
131 public Listener_UnoBase,
132 private ::boost::noncopyable
133 {
134 public:
EventMultiplexerListener(EventQueue & rEventQueue,EventMultiplexerImpl & rEventMultiplexer)135 EventMultiplexerListener( EventQueue& rEventQueue,
136 EventMultiplexerImpl& rEventMultiplexer ) :
137 Listener_UnoBase( m_aMutex ),
138 mpEventQueue( &rEventQueue ),
139 mpEventMultiplexer( &rEventMultiplexer )
140 {
141 }
142
143 // WeakComponentImplHelperBase::disposing
144 virtual void SAL_CALL disposing();
145
146 private:
147 virtual void SAL_CALL disposing( const lang::EventObject& Source )
148 throw (uno::RuntimeException);
149
150 // XMouseListener implementation
151 virtual void SAL_CALL mousePressed( const awt::MouseEvent& e )
152 throw (uno::RuntimeException);
153 virtual void SAL_CALL mouseReleased( const awt::MouseEvent& e )
154 throw (uno::RuntimeException);
155 virtual void SAL_CALL mouseEntered( const awt::MouseEvent& e )
156 throw (uno::RuntimeException);
157 virtual void SAL_CALL mouseExited( const awt::MouseEvent& e )
158 throw (uno::RuntimeException);
159
160 // XMouseMotionListener implementation
161 virtual void SAL_CALL mouseDragged( const awt::MouseEvent& e )
162 throw (uno::RuntimeException);
163 virtual void SAL_CALL mouseMoved( const awt::MouseEvent& e )
164 throw (uno::RuntimeException);
165
166
167 EventQueue* mpEventQueue;
168 EventMultiplexerImpl* mpEventMultiplexer;
169 };
170
171
172 ////////////////////////////////////////////////////////////////////////////
173
174
175 struct EventMultiplexerImpl
176 {
EventMultiplexerImplslideshow::internal::EventMultiplexerImpl177 EventMultiplexerImpl( EventQueue& rEventQueue,
178 UnoViewContainer const& rViewContainer ) :
179 mrEventQueue(rEventQueue),
180 mrViewContainer(rViewContainer),
181 mxListener( new EventMultiplexerListener(rEventQueue,
182 *this) ),
183 maNextEffectHandlers(),
184 maSlideStartHandlers(),
185 maSlideEndHandlers(),
186 maAnimationStartHandlers(),
187 maAnimationEndHandlers(),
188 maSlideAnimationsEndHandlers(),
189 maAudioStoppedHandlers(),
190 maCommandStopAudioHandlers(),
191 maPauseHandlers(),
192 maViewHandlers(),
193 maViewRepaintHandlers(),
194 maShapeListenerHandlers(),
195 maUserPaintEventHandlers(),
196 maShapeCursorHandlers(),
197 maMouseClickHandlers(),
198 maMouseDoubleClickHandlers(),
199 maMouseMoveHandlers(),
200 maHyperlinkHandlers(),
201 mnTimeout(0.0),
202 mpTickEvent(),
203 mbIsAutoMode(false)
204 {}
205
~EventMultiplexerImplslideshow::internal::EventMultiplexerImpl206 ~EventMultiplexerImpl()
207 {
208 if( mxListener.is() )
209 mxListener->dispose();
210 }
211
212 /// Remove all handlers
213 void clear();
214
215 // actual handler callbacks (get called from the UNO interface
216 // listeners via event queue)
217 void mousePressed( const awt::MouseEvent& e );
218 void mouseReleased( const awt::MouseEvent& e );
219 void mouseDragged( const awt::MouseEvent& e );
220 void mouseMoved( const awt::MouseEvent& e );
221
222 bool isMouseListenerRegistered() const;
223
224 typedef ThreadUnsafeListenerContainer<
225 PrioritizedHandlerEntry<EventHandler>,
226 std::vector<
227 PrioritizedHandlerEntry<EventHandler> > > ImplNextEffectHandlers;
228 typedef PrioritizedHandlerEntry<MouseEventHandler> ImplMouseHandlerEntry;
229 typedef ThreadUnsafeListenerContainer<
230 ImplMouseHandlerEntry,
231 std::vector<ImplMouseHandlerEntry> > ImplMouseHandlers;
232 typedef ThreadUnsafeListenerContainer<
233 EventHandlerSharedPtr,
234 std::vector<EventHandlerSharedPtr> > ImplEventHandlers;
235 typedef ThreadUnsafeListenerContainer<
236 AnimationEventHandlerSharedPtr,
237 std::vector<AnimationEventHandlerSharedPtr> > ImplAnimationHandlers;
238 typedef ThreadUnsafeListenerContainer<
239 PauseEventHandlerSharedPtr,
240 std::vector<PauseEventHandlerSharedPtr> > ImplPauseHandlers;
241 typedef ThreadUnsafeListenerContainer<
242 ViewEventHandlerWeakPtr,
243 std::vector<ViewEventHandlerWeakPtr> > ImplViewHandlers;
244 typedef ThreadUnsafeListenerContainer<
245 ViewRepaintHandlerSharedPtr,
246 std::vector<ViewRepaintHandlerSharedPtr> > ImplRepaintHandlers;
247 typedef ThreadUnsafeListenerContainer<
248 ShapeListenerEventHandlerSharedPtr,
249 std::vector<ShapeListenerEventHandlerSharedPtr> > ImplShapeListenerHandlers;
250 typedef ThreadUnsafeListenerContainer<
251 UserPaintEventHandlerSharedPtr,
252 std::vector<UserPaintEventHandlerSharedPtr> > ImplUserPaintEventHandlers;
253 typedef ThreadUnsafeListenerContainer<
254 ShapeCursorEventHandlerSharedPtr,
255 std::vector<ShapeCursorEventHandlerSharedPtr> > ImplShapeCursorHandlers;
256 typedef ThreadUnsafeListenerContainer<
257 PrioritizedHandlerEntry<HyperlinkHandler>,
258 std::vector<PrioritizedHandlerEntry<HyperlinkHandler> > > ImplHyperLinkHandlers;
259
260 template <typename XSlideShowViewFunc>
261 void forEachView( XSlideShowViewFunc pViewMethod );
262
263 UnoViewSharedPtr findUnoView(const uno::Reference<
264 presentation::XSlideShowView>& xView) const;
265
266 template< typename RegisterFunction >
267 void addMouseHandler( ImplMouseHandlers& rHandlerContainer,
268 const MouseEventHandlerSharedPtr& rHandler,
269 double nPriority,
270 RegisterFunction pRegisterListener );
271
272 bool notifyAllAnimationHandlers( ImplAnimationHandlers const& rContainer,
273 AnimationNodeSharedPtr const& rNode );
274
275 bool notifyMouseHandlers(
276 const ImplMouseHandlers& rQueue,
277 bool (MouseEventHandler::*pHandlerMethod)(
278 const awt::MouseEvent& ),
279 const awt::MouseEvent& e );
280
281 bool notifyNextEffect();
282
283 /// Called for automatic nextEffect
284 void tick();
285
286 /// Schedules a tick event
287 void scheduleTick();
288
289 /// Schedules tick events, if mbIsAutoMode is true
290 void handleTicks();
291
292
293 EventQueue& mrEventQueue;
294 UnoViewContainer const& mrViewContainer;
295 ::rtl::Reference<
296 EventMultiplexerListener> mxListener;
297
298 ImplNextEffectHandlers maNextEffectHandlers;
299 ImplEventHandlers maSlideStartHandlers;
300 ImplEventHandlers maSlideEndHandlers;
301 ImplAnimationHandlers maAnimationStartHandlers;
302 ImplAnimationHandlers maAnimationEndHandlers;
303 ImplEventHandlers maSlideAnimationsEndHandlers;
304 ImplAnimationHandlers maAudioStoppedHandlers;
305 ImplAnimationHandlers maCommandStopAudioHandlers;
306 ImplPauseHandlers maPauseHandlers;
307 ImplViewHandlers maViewHandlers;
308 ImplRepaintHandlers maViewRepaintHandlers;
309 ImplShapeListenerHandlers maShapeListenerHandlers;
310 ImplUserPaintEventHandlers maUserPaintEventHandlers;
311 ImplShapeCursorHandlers maShapeCursorHandlers;
312 ImplMouseHandlers maMouseClickHandlers;
313 ImplMouseHandlers maMouseDoubleClickHandlers;
314 ImplMouseHandlers maMouseMoveHandlers;
315 ImplHyperLinkHandlers maHyperlinkHandlers;
316
317 /// automatic next effect mode timeout
318 double mnTimeout;
319
320 /** Holds ptr to optional tick event weakly
321
322 When event queue is cleansed, the next
323 setAutomaticMode(true) call is then able to
324 regenerate the event.
325 */
326 ::boost::weak_ptr< Event > mpTickEvent;
327 bool mbIsAutoMode;
328 };
329
330
331 ///////////////////////////////////////////////////////////////////////////
332
333
disposing()334 void SAL_CALL EventMultiplexerListener::disposing()
335 {
336 osl::MutexGuard const guard( m_aMutex );
337 mpEventQueue = NULL;
338 mpEventMultiplexer = NULL;
339 }
340
disposing(const lang::EventObject &)341 void SAL_CALL EventMultiplexerListener::disposing(
342 const lang::EventObject& /*rSource*/ ) throw (uno::RuntimeException)
343 {
344 // there's no real point in acting on this message - after all,
345 // the event sources are the XSlideShowViews, which must be
346 // explicitely removed from the slideshow via
347 // XSlideShow::removeView(). thus, if a XSlideShowView has
348 // properly removed itself from the slideshow, it will not be
349 // found here. and if it hasn't, there'll be other references at
350 // other places within the slideshow, anyway...
351 }
352
mousePressed(const awt::MouseEvent & e)353 void SAL_CALL EventMultiplexerListener::mousePressed(
354 const awt::MouseEvent& e ) throw (uno::RuntimeException)
355 {
356 osl::MutexGuard const guard( m_aMutex );
357
358 // notify mouse press. Don't call handlers directly, this
359 // might not be the main thread!
360 if( mpEventQueue )
361 mpEventQueue->addEvent(
362 makeEvent( boost::bind( &EventMultiplexerImpl::mousePressed,
363 mpEventMultiplexer,
364 e ),
365 "EventMultiplexerImpl::mousePressed") );
366 }
367
mouseReleased(const awt::MouseEvent & e)368 void SAL_CALL EventMultiplexerListener::mouseReleased(
369 const awt::MouseEvent& e ) throw (uno::RuntimeException)
370 {
371 osl::MutexGuard const guard( m_aMutex );
372
373 // notify mouse release. Don't call handlers directly,
374 // this might not be the main thread!
375 if( mpEventQueue )
376 mpEventQueue->addEvent(
377 makeEvent( boost::bind( &EventMultiplexerImpl::mouseReleased,
378 mpEventMultiplexer,
379 e ),
380 "EventMultiplexerImpl::mouseReleased") );
381 }
382
mouseEntered(const awt::MouseEvent &)383 void SAL_CALL EventMultiplexerListener::mouseEntered(
384 const awt::MouseEvent& /*e*/ ) throw (uno::RuntimeException)
385 {
386 // not used here
387 }
388
mouseExited(const awt::MouseEvent &)389 void SAL_CALL EventMultiplexerListener::mouseExited(
390 const awt::MouseEvent& /*e*/ ) throw (uno::RuntimeException)
391 {
392 // not used here
393 }
394
395 // XMouseMotionListener implementation
mouseDragged(const awt::MouseEvent & e)396 void SAL_CALL EventMultiplexerListener::mouseDragged(
397 const awt::MouseEvent& e ) throw (uno::RuntimeException)
398 {
399 osl::MutexGuard const guard( m_aMutex );
400
401 // notify mouse drag. Don't call handlers directly, this
402 // might not be the main thread!
403 if( mpEventQueue )
404 mpEventQueue->addEvent(
405 makeEvent( boost::bind( &EventMultiplexerImpl::mouseDragged,
406 mpEventMultiplexer,
407 e ),
408 "EventMultiplexerImpl::mouseDragged") );
409 }
410
mouseMoved(const awt::MouseEvent & e)411 void SAL_CALL EventMultiplexerListener::mouseMoved(
412 const awt::MouseEvent& e ) throw (uno::RuntimeException)
413 {
414 osl::MutexGuard const guard( m_aMutex );
415
416 // notify mouse move. Don't call handlers directly, this
417 // might not be the main thread!
418 if( mpEventQueue )
419 mpEventQueue->addEvent(
420 makeEvent( boost::bind( &EventMultiplexerImpl::mouseMoved,
421 mpEventMultiplexer,
422 e ),
423 "EventMultiplexerImpl::mouseMoved") );
424 }
425
426
427 ///////////////////////////////////////////////////////////////////////////
428
429
notifyAllAnimationHandlers(ImplAnimationHandlers const & rContainer,AnimationNodeSharedPtr const & rNode)430 bool EventMultiplexerImpl::notifyAllAnimationHandlers( ImplAnimationHandlers const& rContainer,
431 AnimationNodeSharedPtr const& rNode )
432 {
433 return rContainer.applyAll(
434 boost::bind( &AnimationEventHandler::handleAnimationEvent,
435 _1, boost::cref(rNode) ) );
436 }
437
438 template <typename XSlideShowViewFunc>
forEachView(XSlideShowViewFunc pViewMethod)439 void EventMultiplexerImpl::forEachView( XSlideShowViewFunc pViewMethod )
440 {
441 if( pViewMethod )
442 {
443 // (un)register mouse listener on all views
444 for( UnoViewVector::const_iterator aIter( mrViewContainer.begin() ),
445 aEnd( mrViewContainer.end() ); aIter != aEnd; ++aIter )
446 {
447 uno::Reference<presentation::XSlideShowView> xView ((*aIter)->getUnoView());
448 if (xView.is())
449 {
450 (xView.get()->*pViewMethod)( mxListener.get() );
451 }
452 else
453 {
454 OSL_ASSERT(xView.is());
455 }
456 }
457 }
458 }
459
findUnoView(const uno::Reference<presentation::XSlideShowView> & xView) const460 UnoViewSharedPtr EventMultiplexerImpl::findUnoView(
461 const uno::Reference<presentation::XSlideShowView>& xView) const
462 {
463 // find view from which the change originated
464 UnoViewVector::const_iterator aIter;
465 const UnoViewVector::const_iterator aEnd ( mrViewContainer.end() );
466 if( (aIter=std::find_if( mrViewContainer.begin(),
467 aEnd,
468 boost::bind(
469 std::equal_to<uno::Reference<presentation::XSlideShowView> >(),
470 boost::cref( xView ),
471 boost::bind( &UnoView::getUnoView, _1 )))) == aEnd )
472 {
473 OSL_ENSURE(false, "EventMultiplexer::findUnoView(): unexpected message source" );
474 return UnoViewSharedPtr();
475 }
476
477 return *aIter;
478 }
479
480 template< typename RegisterFunction >
addMouseHandler(ImplMouseHandlers & rHandlerContainer,const MouseEventHandlerSharedPtr & rHandler,double nPriority,RegisterFunction pRegisterListener)481 void EventMultiplexerImpl::addMouseHandler(
482 ImplMouseHandlers& rHandlerContainer,
483 const MouseEventHandlerSharedPtr& rHandler,
484 double nPriority,
485 RegisterFunction pRegisterListener )
486 {
487 ENSURE_OR_THROW(
488 rHandler,
489 "EventMultiplexer::addMouseHandler(): Invalid handler" );
490
491 // register mouse listener on all views
492 forEachView( pRegisterListener );
493
494 // add into sorted container:
495 rHandlerContainer.addSorted(
496 typename ImplMouseHandlers::container_type::value_type(
497 rHandler,
498 nPriority ));
499 }
500
isMouseListenerRegistered() const501 bool EventMultiplexerImpl::isMouseListenerRegistered() const
502 {
503 return !(maMouseClickHandlers.isEmpty() &&
504 maMouseDoubleClickHandlers.isEmpty());
505 }
506
tick()507 void EventMultiplexerImpl::tick()
508 {
509 if( !mbIsAutoMode )
510 return; // this event is just a left-over, ignore
511
512 notifyNextEffect();
513
514 if( !maNextEffectHandlers.isEmpty() )
515 {
516 // still handlers left, schedule next timeout
517 // event. Will also set mbIsTickEventOn back to true
518 scheduleTick();
519 }
520 }
521
scheduleTick()522 void EventMultiplexerImpl::scheduleTick()
523 {
524 EventSharedPtr pEvent(
525 makeDelay( boost::bind( &EventMultiplexerImpl::tick,
526 this ),
527 mnTimeout,
528 "EventMultiplexerImpl::tick with delay"));
529
530 // store weak reference to generated event, to notice when
531 // the event queue gets cleansed (we then have to
532 // regenerate the tick event!)
533 mpTickEvent = pEvent;
534
535 // enabled auto mode: simply schedule a timeout event,
536 // which will eventually call our tick() method
537 mrEventQueue.addEventForNextRound( pEvent );
538 }
539
handleTicks()540 void EventMultiplexerImpl::handleTicks()
541 {
542 if( !mbIsAutoMode )
543 return; // nothing to do, don't need no ticks
544
545 EventSharedPtr pTickEvent( mpTickEvent.lock() );
546 if( pTickEvent )
547 return; // nothing to do, there's already a tick
548 // pending
549
550 // schedule initial tick (which reschedules itself
551 // after that, all by itself)
552 scheduleTick();
553 }
554
555
clear()556 void EventMultiplexerImpl::clear()
557 {
558 // deregister from all views.
559 if( isMouseListenerRegistered() )
560 {
561 for( UnoViewVector::const_iterator aIter=mrViewContainer.begin(),
562 aEnd=mrViewContainer.end();
563 aIter!=aEnd;
564 ++aIter )
565 {
566 if( (*aIter)->getUnoView().is() )
567 (*aIter)->getUnoView()->removeMouseListener( mxListener.get() );
568 }
569 }
570
571 if( !maMouseMoveHandlers.isEmpty() )
572 {
573 for( UnoViewVector::const_iterator aIter=mrViewContainer.begin(),
574 aEnd=mrViewContainer.end();
575 aIter!=aEnd;
576 ++aIter )
577 {
578 if( (*aIter)->getUnoView().is() )
579 (*aIter)->getUnoView()->removeMouseMotionListener( mxListener.get() );
580 }
581 }
582
583 // clear all handlers (releases all references)
584 maNextEffectHandlers.clear();
585 maSlideStartHandlers.clear();
586 maSlideEndHandlers.clear();
587 maAnimationStartHandlers.clear();
588 maAnimationEndHandlers.clear();
589 maSlideAnimationsEndHandlers.clear();
590 maAudioStoppedHandlers.clear();
591 maCommandStopAudioHandlers.clear();
592 maPauseHandlers.clear();
593 maViewHandlers.clear();
594 maViewRepaintHandlers.clear();
595 maMouseClickHandlers.clear();
596 maMouseDoubleClickHandlers.clear();
597 maMouseMoveHandlers.clear();
598 maHyperlinkHandlers.clear();
599 mpTickEvent.reset();
600 }
601
602 // XMouseListener implementation
notifyMouseHandlers(const ImplMouseHandlers & rQueue,bool (MouseEventHandler::* pHandlerMethod)(const awt::MouseEvent &),const awt::MouseEvent & e)603 bool EventMultiplexerImpl::notifyMouseHandlers(
604 const ImplMouseHandlers& rQueue,
605 bool (MouseEventHandler::*pHandlerMethod)( const awt::MouseEvent& ),
606 const awt::MouseEvent& e )
607 {
608 uno::Reference<presentation::XSlideShowView> xView(
609 e.Source, uno::UNO_QUERY );
610
611 ENSURE_OR_RETURN_FALSE( xView.is(), "EventMultiplexer::notifyHandlers(): "
612 "event source is not an XSlideShowView" );
613
614 // find corresponding view (to map mouse position into user
615 // coordinate space)
616 UnoViewVector::const_iterator aIter;
617 const UnoViewVector::const_iterator aBegin( mrViewContainer.begin() );
618 const UnoViewVector::const_iterator aEnd ( mrViewContainer.end() );
619 if( (aIter=::std::find_if(
620 aBegin, aEnd,
621 boost::bind( std::equal_to< uno::Reference<
622 presentation::XSlideShowView > >(),
623 boost::cref( xView ),
624 boost::bind( &UnoView::getUnoView, _1 ) ) ) ) == aEnd)
625 {
626 ENSURE_OR_RETURN_FALSE(
627 false, "EventMultiplexer::notifyHandlers(): "
628 "event source not found under registered views" );
629 }
630
631 // convert mouse position to user coordinate space
632 ::basegfx::B2DPoint aPosition( e.X, e.Y );
633 ::basegfx::B2DHomMatrix aMatrix( (*aIter)->getTransformation() );
634 if( !aMatrix.invert() )
635 ENSURE_OR_THROW( false, "EventMultiplexer::notifyHandlers():"
636 " view matrix singular" );
637 aPosition *= aMatrix;
638
639 awt::MouseEvent aEvent( e );
640 aEvent.X = ::basegfx::fround( aPosition.getX() );
641 aEvent.Y = ::basegfx::fround( aPosition.getY() );
642
643 // fire event on handlers, try in order of precedence. If
644 // one high-priority handler rejects the event
645 // (i.e. returns false), try next handler.
646 return rQueue.apply(
647 boost::bind(
648 pHandlerMethod,
649 boost::bind(
650 &ImplMouseHandlers::container_type::value_type::getHandler,
651 _1 ),
652 aEvent ));
653 }
654
mousePressed(const awt::MouseEvent & e)655 void EventMultiplexerImpl::mousePressed( const awt::MouseEvent& e )
656 {
657 // fire double-click events for every second click
658 sal_Int32 nCurrClickCount = e.ClickCount;
659 while( nCurrClickCount > 1 &&
660 notifyMouseHandlers( maMouseDoubleClickHandlers,
661 &MouseEventHandler::handleMousePressed,
662 e ))
663 {
664 nCurrClickCount -= 2;
665 }
666
667 // fire single-click events for all remaining clicks
668 while( nCurrClickCount > 0 &&
669 notifyMouseHandlers( maMouseClickHandlers,
670 &MouseEventHandler::handleMousePressed,
671 e ))
672 {
673 --nCurrClickCount;
674 }
675 }
676
mouseReleased(const awt::MouseEvent & e)677 void EventMultiplexerImpl::mouseReleased( const awt::MouseEvent& e )
678 {
679 // fire double-click events for every second click
680 sal_Int32 nCurrClickCount = e.ClickCount;
681 while( nCurrClickCount > 1 &&
682 notifyMouseHandlers( maMouseDoubleClickHandlers,
683 &MouseEventHandler::handleMouseReleased,
684 e ))
685 {
686 nCurrClickCount -= 2;
687 }
688
689 // fire single-click events for all remaining clicks
690 while( nCurrClickCount > 0 &&
691 notifyMouseHandlers( maMouseClickHandlers,
692 &MouseEventHandler::handleMouseReleased,
693 e ))
694 {
695 --nCurrClickCount;
696 }
697 }
698
mouseDragged(const awt::MouseEvent & e)699 void EventMultiplexerImpl::mouseDragged( const awt::MouseEvent& e )
700 {
701 notifyMouseHandlers( maMouseMoveHandlers,
702 &MouseEventHandler::handleMouseDragged,
703 e );
704 }
705
mouseMoved(const awt::MouseEvent & e)706 void EventMultiplexerImpl::mouseMoved( const awt::MouseEvent& e )
707 {
708 notifyMouseHandlers( maMouseMoveHandlers,
709 &MouseEventHandler::handleMouseMoved,
710 e );
711 }
712
notifyNextEffect()713 bool EventMultiplexerImpl::notifyNextEffect()
714 {
715 // fire event on handlers, try in order of precedence. If one
716 // high-priority handler rejects the event (i.e. returns false),
717 // try next handler.
718 return maNextEffectHandlers.apply(
719 boost::bind(
720 &EventHandler::handleEvent,
721 boost::bind(
722 &ImplNextEffectHandlers::container_type::value_type::getHandler,
723 _1 )) );
724 }
725
726 //////////////////////////////////////////////////////////////////////////
727
728
EventMultiplexer(EventQueue & rEventQueue,UnoViewContainer const & rViewContainer)729 EventMultiplexer::EventMultiplexer( EventQueue& rEventQueue,
730 UnoViewContainer const& rViewContainer ) :
731 mpImpl( new EventMultiplexerImpl(rEventQueue, rViewContainer) )
732 {
733 }
734
~EventMultiplexer()735 EventMultiplexer::~EventMultiplexer()
736 {
737 // outline because of EventMultiplexerImpl's incomplete type
738 }
739
clear()740 void EventMultiplexer::clear()
741 {
742 mpImpl->clear();
743 }
744
setAutomaticMode(bool bIsAuto)745 void EventMultiplexer::setAutomaticMode( bool bIsAuto )
746 {
747 if( bIsAuto == mpImpl->mbIsAutoMode )
748 return; // no change, nothing to do
749
750 mpImpl->mbIsAutoMode = bIsAuto;
751
752 mpImpl->handleTicks();
753 }
754
getAutomaticMode() const755 bool EventMultiplexer::getAutomaticMode() const
756 {
757 return mpImpl->mbIsAutoMode;
758 }
759
setAutomaticTimeout(double nTimeout)760 void EventMultiplexer::setAutomaticTimeout( double nTimeout )
761 {
762 mpImpl->mnTimeout = nTimeout;
763 }
764
getAutomaticTimeout() const765 double EventMultiplexer::getAutomaticTimeout() const
766 {
767 return mpImpl->mnTimeout;
768 }
769
addNextEffectHandler(EventHandlerSharedPtr const & rHandler,double nPriority)770 void EventMultiplexer::addNextEffectHandler(
771 EventHandlerSharedPtr const& rHandler,
772 double nPriority )
773 {
774 mpImpl->maNextEffectHandlers.addSorted(
775 EventMultiplexerImpl::ImplNextEffectHandlers::container_type::value_type(
776 rHandler,
777 nPriority) );
778
779 // Enable tick events, if not done already
780 mpImpl->handleTicks();
781 }
782
removeNextEffectHandler(const EventHandlerSharedPtr & rHandler)783 void EventMultiplexer::removeNextEffectHandler(
784 const EventHandlerSharedPtr& rHandler )
785 {
786 mpImpl->maNextEffectHandlers.remove(
787 EventMultiplexerImpl::ImplNextEffectHandlers::container_type::value_type(
788 rHandler,
789 0.0) );
790 }
791
addSlideStartHandler(const EventHandlerSharedPtr & rHandler)792 void EventMultiplexer::addSlideStartHandler(
793 const EventHandlerSharedPtr& rHandler )
794 {
795 mpImpl->maSlideStartHandlers.add( rHandler );
796 }
797
removeSlideStartHandler(const EventHandlerSharedPtr & rHandler)798 void EventMultiplexer::removeSlideStartHandler(
799 const EventHandlerSharedPtr& rHandler )
800 {
801 mpImpl->maSlideStartHandlers.remove( rHandler );
802 }
803
addSlideEndHandler(const EventHandlerSharedPtr & rHandler)804 void EventMultiplexer::addSlideEndHandler(
805 const EventHandlerSharedPtr& rHandler )
806 {
807 mpImpl->maSlideEndHandlers.add( rHandler );
808 }
809
removeSlideEndHandler(const EventHandlerSharedPtr & rHandler)810 void EventMultiplexer::removeSlideEndHandler(
811 const EventHandlerSharedPtr& rHandler )
812 {
813 mpImpl->maSlideEndHandlers.remove( rHandler );
814 }
815
addAnimationStartHandler(const AnimationEventHandlerSharedPtr & rHandler)816 void EventMultiplexer::addAnimationStartHandler(
817 const AnimationEventHandlerSharedPtr& rHandler )
818 {
819 mpImpl->maAnimationStartHandlers.add( rHandler );
820 }
821
removeAnimationStartHandler(const AnimationEventHandlerSharedPtr & rHandler)822 void EventMultiplexer::removeAnimationStartHandler(
823 const AnimationEventHandlerSharedPtr& rHandler )
824 {
825 mpImpl->maAnimationStartHandlers.remove( rHandler );
826 }
827
addAnimationEndHandler(const AnimationEventHandlerSharedPtr & rHandler)828 void EventMultiplexer::addAnimationEndHandler(
829 const AnimationEventHandlerSharedPtr& rHandler )
830 {
831 mpImpl->maAnimationEndHandlers.add( rHandler );
832 }
833
removeAnimationEndHandler(const AnimationEventHandlerSharedPtr & rHandler)834 void EventMultiplexer::removeAnimationEndHandler(
835 const AnimationEventHandlerSharedPtr& rHandler )
836 {
837 mpImpl->maAnimationEndHandlers.remove( rHandler );
838 }
839
addSlideAnimationsEndHandler(const EventHandlerSharedPtr & rHandler)840 void EventMultiplexer::addSlideAnimationsEndHandler(
841 const EventHandlerSharedPtr& rHandler )
842 {
843 mpImpl->maSlideAnimationsEndHandlers.add( rHandler );
844 }
845
removeSlideAnimationsEndHandler(const EventHandlerSharedPtr & rHandler)846 void EventMultiplexer::removeSlideAnimationsEndHandler(
847 const EventHandlerSharedPtr& rHandler )
848 {
849 mpImpl->maSlideAnimationsEndHandlers.remove( rHandler );
850 }
851
addAudioStoppedHandler(const AnimationEventHandlerSharedPtr & rHandler)852 void EventMultiplexer::addAudioStoppedHandler(
853 const AnimationEventHandlerSharedPtr& rHandler )
854 {
855 mpImpl->maAudioStoppedHandlers.add( rHandler );
856 }
857
removeAudioStoppedHandler(const AnimationEventHandlerSharedPtr & rHandler)858 void EventMultiplexer::removeAudioStoppedHandler(
859 const AnimationEventHandlerSharedPtr& rHandler )
860 {
861 mpImpl->maAudioStoppedHandlers.remove( rHandler );
862 }
863
addCommandStopAudioHandler(const AnimationEventHandlerSharedPtr & rHandler)864 void EventMultiplexer::addCommandStopAudioHandler(
865 const AnimationEventHandlerSharedPtr& rHandler )
866 {
867 mpImpl->maCommandStopAudioHandlers.add( rHandler );
868 }
869
removeCommandStopAudioHandler(const AnimationEventHandlerSharedPtr & rHandler)870 void EventMultiplexer::removeCommandStopAudioHandler(
871 const AnimationEventHandlerSharedPtr& rHandler )
872 {
873 mpImpl->maCommandStopAudioHandlers.remove( rHandler );
874 }
875
addPauseHandler(const PauseEventHandlerSharedPtr & rHandler)876 void EventMultiplexer::addPauseHandler(
877 const PauseEventHandlerSharedPtr& rHandler )
878 {
879 mpImpl->maPauseHandlers.add( rHandler );
880 }
881
removePauseHandler(const PauseEventHandlerSharedPtr & rHandler)882 void EventMultiplexer::removePauseHandler(
883 const PauseEventHandlerSharedPtr& rHandler )
884 {
885 mpImpl->maPauseHandlers.remove( rHandler );
886 }
887
addViewHandler(const ViewEventHandlerWeakPtr & rHandler)888 void EventMultiplexer::addViewHandler(
889 const ViewEventHandlerWeakPtr& rHandler )
890 {
891 mpImpl->maViewHandlers.add( rHandler );
892 }
893
removeViewHandler(const ViewEventHandlerWeakPtr & rHandler)894 void EventMultiplexer::removeViewHandler( const ViewEventHandlerWeakPtr& rHandler )
895 {
896 mpImpl->maViewHandlers.remove( rHandler );
897 }
898
addViewRepaintHandler(const ViewRepaintHandlerSharedPtr & rHandler)899 void EventMultiplexer::addViewRepaintHandler( const ViewRepaintHandlerSharedPtr& rHandler )
900 {
901 mpImpl->maViewRepaintHandlers.add( rHandler );
902 }
903
removeViewRepaintHandler(const ViewRepaintHandlerSharedPtr & rHandler)904 void EventMultiplexer::removeViewRepaintHandler( const ViewRepaintHandlerSharedPtr& rHandler )
905 {
906 mpImpl->maViewRepaintHandlers.remove( rHandler );
907 }
908
addShapeListenerHandler(const ShapeListenerEventHandlerSharedPtr & rHandler)909 void EventMultiplexer::addShapeListenerHandler( const ShapeListenerEventHandlerSharedPtr& rHandler )
910 {
911 mpImpl->maShapeListenerHandlers.add( rHandler );
912 }
913
removeShapeListenerHandler(const ShapeListenerEventHandlerSharedPtr & rHandler)914 void EventMultiplexer::removeShapeListenerHandler( const ShapeListenerEventHandlerSharedPtr& rHandler )
915 {
916 mpImpl->maShapeListenerHandlers.remove( rHandler );
917 }
918
addUserPaintHandler(const UserPaintEventHandlerSharedPtr & rHandler)919 void EventMultiplexer::addUserPaintHandler( const UserPaintEventHandlerSharedPtr& rHandler )
920 {
921 mpImpl->maUserPaintEventHandlers.add( rHandler );
922 }
923
removeUserPaintHandler(const UserPaintEventHandlerSharedPtr & rHandler)924 void EventMultiplexer::removeUserPaintHandler( const UserPaintEventHandlerSharedPtr& rHandler )
925 {
926 mpImpl->maUserPaintEventHandlers.remove( rHandler );
927 }
928
addShapeCursorHandler(const ShapeCursorEventHandlerSharedPtr & rHandler)929 void EventMultiplexer::addShapeCursorHandler( const ShapeCursorEventHandlerSharedPtr& rHandler )
930 {
931 mpImpl->maShapeCursorHandlers.add( rHandler );
932 }
933
removeShapeCursorHandler(const ShapeCursorEventHandlerSharedPtr & rHandler)934 void EventMultiplexer::removeShapeCursorHandler( const ShapeCursorEventHandlerSharedPtr& rHandler )
935 {
936 mpImpl->maShapeCursorHandlers.remove( rHandler );
937 }
938
addClickHandler(const MouseEventHandlerSharedPtr & rHandler,double nPriority)939 void EventMultiplexer::addClickHandler(
940 const MouseEventHandlerSharedPtr& rHandler,
941 double nPriority )
942 {
943 mpImpl->addMouseHandler(
944 mpImpl->maMouseClickHandlers,
945 rHandler,
946 nPriority,
947 mpImpl->isMouseListenerRegistered()
948 ? NULL
949 : &presentation::XSlideShowView::addMouseListener );
950 }
951
removeClickHandler(const MouseEventHandlerSharedPtr & rHandler)952 void EventMultiplexer::removeClickHandler(
953 const MouseEventHandlerSharedPtr& rHandler )
954 {
955 mpImpl->maMouseClickHandlers.remove(
956 EventMultiplexerImpl::ImplMouseHandlers::container_type::value_type(
957 rHandler,
958 0.0) );
959
960 if( !mpImpl->isMouseListenerRegistered() )
961 mpImpl->forEachView( &presentation::XSlideShowView::removeMouseListener );
962 }
963
addDoubleClickHandler(const MouseEventHandlerSharedPtr & rHandler,double nPriority)964 void EventMultiplexer::addDoubleClickHandler(
965 const MouseEventHandlerSharedPtr& rHandler,
966 double nPriority )
967 {
968 mpImpl->addMouseHandler(
969 mpImpl->maMouseDoubleClickHandlers,
970 rHandler,
971 nPriority,
972 mpImpl->isMouseListenerRegistered()
973 ? NULL
974 : &presentation::XSlideShowView::addMouseListener );
975 }
976
removeDoubleClickHandler(const MouseEventHandlerSharedPtr & rHandler)977 void EventMultiplexer::removeDoubleClickHandler(
978 const MouseEventHandlerSharedPtr& rHandler )
979 {
980 mpImpl->maMouseDoubleClickHandlers.remove(
981 EventMultiplexerImpl::ImplMouseHandlers::container_type::value_type(
982 rHandler,
983 0.0) );
984
985 if( !mpImpl->isMouseListenerRegistered() )
986 mpImpl->forEachView( &presentation::XSlideShowView::removeMouseListener );
987 }
988
addMouseMoveHandler(const MouseEventHandlerSharedPtr & rHandler,double nPriority)989 void EventMultiplexer::addMouseMoveHandler(
990 const MouseEventHandlerSharedPtr& rHandler,
991 double nPriority )
992 {
993 mpImpl->addMouseHandler(
994 mpImpl->maMouseMoveHandlers,
995 rHandler,
996 nPriority,
997 mpImpl->maMouseMoveHandlers.isEmpty()
998 ? &presentation::XSlideShowView::addMouseMotionListener
999 : NULL );
1000 }
1001
removeMouseMoveHandler(const MouseEventHandlerSharedPtr & rHandler)1002 void EventMultiplexer::removeMouseMoveHandler(
1003 const MouseEventHandlerSharedPtr& rHandler )
1004 {
1005 mpImpl->maMouseMoveHandlers.remove(
1006 EventMultiplexerImpl::ImplMouseHandlers::container_type::value_type(
1007 rHandler,
1008 0.0) );
1009
1010 if( mpImpl->maMouseMoveHandlers.isEmpty() )
1011 mpImpl->forEachView(
1012 &presentation::XSlideShowView::removeMouseMotionListener );
1013 }
1014
addHyperlinkHandler(const HyperlinkHandlerSharedPtr & rHandler,double nPriority)1015 void EventMultiplexer::addHyperlinkHandler( const HyperlinkHandlerSharedPtr& rHandler,
1016 double nPriority )
1017 {
1018 mpImpl->maHyperlinkHandlers.addSorted(
1019 EventMultiplexerImpl::ImplHyperLinkHandlers::container_type::value_type(
1020 rHandler,
1021 nPriority) );
1022 }
1023
removeHyperlinkHandler(const HyperlinkHandlerSharedPtr & rHandler)1024 void EventMultiplexer::removeHyperlinkHandler( const HyperlinkHandlerSharedPtr& rHandler )
1025 {
1026 mpImpl->maHyperlinkHandlers.remove(
1027 EventMultiplexerImpl::ImplHyperLinkHandlers::container_type::value_type(
1028 rHandler,
1029 0.0) );
1030 }
1031
notifyShapeListenerAdded(const uno::Reference<presentation::XShapeEventListener> & xListener,const uno::Reference<drawing::XShape> & xShape)1032 bool EventMultiplexer::notifyShapeListenerAdded(
1033 const uno::Reference<presentation::XShapeEventListener>& xListener,
1034 const uno::Reference<drawing::XShape>& xShape )
1035 {
1036 return mpImpl->maShapeListenerHandlers.applyAll(
1037 boost::bind(&ShapeListenerEventHandler::listenerAdded,
1038 _1,
1039 boost::cref(xListener),
1040 boost::cref(xShape)) );
1041 }
1042
notifyShapeListenerRemoved(const uno::Reference<presentation::XShapeEventListener> & xListener,const uno::Reference<drawing::XShape> & xShape)1043 bool EventMultiplexer::notifyShapeListenerRemoved(
1044 const uno::Reference<presentation::XShapeEventListener>& xListener,
1045 const uno::Reference<drawing::XShape>& xShape )
1046 {
1047 return mpImpl->maShapeListenerHandlers.applyAll(
1048 boost::bind(&ShapeListenerEventHandler::listenerRemoved,
1049 _1,
1050 boost::cref(xListener),
1051 boost::cref(xShape)) );
1052 }
1053
notifyShapeCursorChange(const uno::Reference<drawing::XShape> & xShape,sal_Int16 nPointerShape)1054 bool EventMultiplexer::notifyShapeCursorChange(
1055 const uno::Reference<drawing::XShape>& xShape,
1056 sal_Int16 nPointerShape )
1057 {
1058 return mpImpl->maShapeCursorHandlers.applyAll(
1059 boost::bind(&ShapeCursorEventHandler::cursorChanged,
1060 _1,
1061 boost::cref(xShape),
1062 nPointerShape));
1063 }
1064
notifyUserPaintColor(RGBColor const & rUserColor)1065 bool EventMultiplexer::notifyUserPaintColor( RGBColor const& rUserColor )
1066 {
1067 return mpImpl->maUserPaintEventHandlers.applyAll(
1068 boost::bind(&UserPaintEventHandler::colorChanged,
1069 _1,
1070 boost::cref(rUserColor)));
1071 }
1072
notifyUserPaintStrokeWidth(double rUserStrokeWidth)1073 bool EventMultiplexer::notifyUserPaintStrokeWidth( double rUserStrokeWidth )
1074 {
1075 return mpImpl->maUserPaintEventHandlers.applyAll(
1076 boost::bind(&UserPaintEventHandler::widthChanged,
1077 _1,
1078 rUserStrokeWidth));
1079 }
1080
notifyUserPaintDisabled()1081 bool EventMultiplexer::notifyUserPaintDisabled()
1082 {
1083 return mpImpl->maUserPaintEventHandlers.applyAll(
1084 boost::mem_fn(&UserPaintEventHandler::disable));
1085 }
1086
notifySwitchPenMode()1087 bool EventMultiplexer::notifySwitchPenMode(){
1088 return mpImpl->maUserPaintEventHandlers.applyAll(
1089 boost::mem_fn(&UserPaintEventHandler::switchPenMode));
1090 }
1091
notifySwitchEraserMode()1092 bool EventMultiplexer::notifySwitchEraserMode(){
1093 return mpImpl->maUserPaintEventHandlers.applyAll(
1094 boost::mem_fn(&UserPaintEventHandler::switchEraserMode));
1095 }
1096
1097 //adding erasing all ink features with UserPaintOverlay
notifyEraseAllInk(bool const & rEraseAllInk)1098 bool EventMultiplexer::notifyEraseAllInk( bool const& rEraseAllInk )
1099 {
1100 return mpImpl->maUserPaintEventHandlers.applyAll(
1101 boost::bind(&UserPaintEventHandler::eraseAllInkChanged,
1102 _1,
1103 boost::cref(rEraseAllInk)));
1104 }
1105
1106 //adding erasing features with UserPaintOverlay
notifyEraseInkWidth(sal_Int32 rEraseInkSize)1107 bool EventMultiplexer::notifyEraseInkWidth( sal_Int32 rEraseInkSize )
1108 {
1109 return mpImpl->maUserPaintEventHandlers.applyAll(
1110 boost::bind(&UserPaintEventHandler::eraseInkWidthChanged,
1111 _1,
1112 boost::cref(rEraseInkSize)));
1113 }
1114
notifyNextEffect()1115 bool EventMultiplexer::notifyNextEffect()
1116 {
1117 return mpImpl->notifyNextEffect();
1118 }
1119
notifySlideStartEvent()1120 bool EventMultiplexer::notifySlideStartEvent()
1121 {
1122 return mpImpl->maSlideStartHandlers.applyAll(
1123 boost::mem_fn(&EventHandler::handleEvent) );
1124 }
1125
notifySlideEndEvent()1126 bool EventMultiplexer::notifySlideEndEvent()
1127 {
1128 return mpImpl->maSlideEndHandlers.applyAll(
1129 boost::mem_fn(&EventHandler::handleEvent) );
1130 }
1131
notifyAnimationStart(const AnimationNodeSharedPtr & rNode)1132 bool EventMultiplexer::notifyAnimationStart(
1133 const AnimationNodeSharedPtr& rNode )
1134 {
1135 return mpImpl->notifyAllAnimationHandlers( mpImpl->maAnimationStartHandlers,
1136 rNode );
1137 }
1138
notifyAnimationEnd(const AnimationNodeSharedPtr & rNode)1139 bool EventMultiplexer::notifyAnimationEnd(
1140 const AnimationNodeSharedPtr& rNode )
1141 {
1142 return mpImpl->notifyAllAnimationHandlers( mpImpl->maAnimationEndHandlers,
1143 rNode );
1144 }
1145
notifySlideAnimationsEnd()1146 bool EventMultiplexer::notifySlideAnimationsEnd()
1147 {
1148 return mpImpl->maSlideAnimationsEndHandlers.applyAll(
1149 boost::mem_fn(&EventHandler::handleEvent));
1150 }
1151
notifyAudioStopped(const AnimationNodeSharedPtr & rNode)1152 bool EventMultiplexer::notifyAudioStopped(
1153 const AnimationNodeSharedPtr& rNode )
1154 {
1155 return mpImpl->notifyAllAnimationHandlers(
1156 mpImpl->maAudioStoppedHandlers,
1157 rNode );
1158 }
1159
notifyCommandStopAudio(const AnimationNodeSharedPtr & rNode)1160 bool EventMultiplexer::notifyCommandStopAudio(
1161 const AnimationNodeSharedPtr& rNode )
1162 {
1163 return mpImpl->notifyAllAnimationHandlers(
1164 mpImpl->maCommandStopAudioHandlers,
1165 rNode );
1166 }
1167
notifyPauseMode(bool bPauseShow)1168 bool EventMultiplexer::notifyPauseMode( bool bPauseShow )
1169 {
1170 return mpImpl->maPauseHandlers.applyAll(
1171 boost::bind( &PauseEventHandler::handlePause,
1172 _1, bPauseShow ));
1173 }
1174
notifyViewAdded(const UnoViewSharedPtr & rView)1175 bool EventMultiplexer::notifyViewAdded( const UnoViewSharedPtr& rView )
1176 {
1177 ENSURE_OR_THROW( rView, "EventMultiplexer::notifyViewAdded(): Invalid view");
1178
1179 // register event listener
1180 uno::Reference<presentation::XSlideShowView> const rUnoView(
1181 rView->getUnoView() );
1182
1183 if( mpImpl->isMouseListenerRegistered() )
1184 rUnoView->addMouseListener(
1185 mpImpl->mxListener.get() );
1186
1187 if( !mpImpl->maMouseMoveHandlers.isEmpty() )
1188 rUnoView->addMouseMotionListener(
1189 mpImpl->mxListener.get() );
1190
1191 return mpImpl->maViewHandlers.applyAll(
1192 boost::bind( &ViewEventHandler::viewAdded,
1193 _1,
1194 boost::cref(rView) ));
1195 }
1196
notifyViewRemoved(const UnoViewSharedPtr & rView)1197 bool EventMultiplexer::notifyViewRemoved( const UnoViewSharedPtr& rView )
1198 {
1199 ENSURE_OR_THROW( rView,
1200 "EventMultiplexer::removeView(): Invalid view" );
1201
1202 // revoke event listeners
1203 uno::Reference<presentation::XSlideShowView> const rUnoView(
1204 rView->getUnoView() );
1205
1206 if( mpImpl->isMouseListenerRegistered() )
1207 rUnoView->removeMouseListener(
1208 mpImpl->mxListener.get() );
1209
1210 if( !mpImpl->maMouseMoveHandlers.isEmpty() )
1211 rUnoView->removeMouseMotionListener(
1212 mpImpl->mxListener.get() );
1213
1214 return mpImpl->maViewHandlers.applyAll(
1215 boost::bind( &ViewEventHandler::viewRemoved,
1216 _1,
1217 boost::cref(rView) ));
1218 }
1219
notifyViewChanged(const UnoViewSharedPtr & rView)1220 bool EventMultiplexer::notifyViewChanged( const UnoViewSharedPtr& rView )
1221 {
1222 return mpImpl->maViewHandlers.applyAll(
1223 boost::bind( &ViewEventHandler::viewChanged,
1224 _1,
1225 boost::cref(rView) ));
1226 }
1227
notifyViewChanged(const uno::Reference<presentation::XSlideShowView> & xView)1228 bool EventMultiplexer::notifyViewChanged( const uno::Reference<presentation::XSlideShowView>& xView )
1229 {
1230 UnoViewSharedPtr pView( mpImpl->findUnoView(xView) );
1231
1232 if( !pView )
1233 return false; // view not registered here
1234
1235 return notifyViewChanged( pView );
1236 }
1237
notifyViewsChanged()1238 bool EventMultiplexer::notifyViewsChanged()
1239 {
1240 return mpImpl->maViewHandlers.applyAll(
1241 boost::mem_fn( &ViewEventHandler::viewsChanged ));
1242 }
1243
notifyViewClobbered(const uno::Reference<presentation::XSlideShowView> & xView)1244 bool EventMultiplexer::notifyViewClobbered(
1245 const uno::Reference<presentation::XSlideShowView>& xView )
1246 {
1247 UnoViewSharedPtr pView( mpImpl->findUnoView(xView) );
1248
1249 if( !pView )
1250 return false; // view not registered here
1251
1252 return mpImpl->maViewRepaintHandlers.applyAll(
1253 boost::bind( &ViewRepaintHandler::viewClobbered,
1254 _1,
1255 boost::cref(pView) ));
1256 }
1257
notifyHyperlinkClicked(rtl::OUString const & hyperLink)1258 bool EventMultiplexer::notifyHyperlinkClicked(
1259 rtl::OUString const& hyperLink )
1260 {
1261 return mpImpl->maHyperlinkHandlers.apply(
1262 boost::bind(&HyperlinkHandler::handleHyperlink,
1263 _1,
1264 boost::cref(hyperLink)) );
1265 }
1266
notifySlideTransitionStarted()1267 bool EventMultiplexer::notifySlideTransitionStarted()
1268 {
1269 return true;
1270 }
1271
1272 } // namespace internal
1273 } // namespace presentation
1274
1275