Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include "EventMultiplexer.hxx"
22 :
23 : #include "MutexOwner.hxx"
24 : #include "ViewShellBase.hxx"
25 : #include "drawdoc.hxx"
26 : #include "DrawController.hxx"
27 : #include "SlideSorterViewShell.hxx"
28 : #include "framework/FrameworkHelper.hxx"
29 :
30 : #include <com/sun/star/beans/XPropertySet.hpp>
31 : #include <com/sun/star/frame/XFrame.hpp>
32 : #include <com/sun/star/lang/DisposedException.hpp>
33 : #include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp>
34 : #include <cppuhelper/weak.hxx>
35 : #include <cppuhelper/compbase4.hxx>
36 : #include <sfx2/viewfrm.hxx>
37 :
38 : using namespace ::com::sun::star;
39 : using namespace ::com::sun::star::lang;
40 : using namespace ::com::sun::star::uno;
41 : using namespace ::com::sun::star::drawing::framework;
42 :
43 : using ::sd::framework::FrameworkHelper;
44 :
45 : class SdDrawDocument;
46 :
47 : namespace {
48 : static const sal_Int32 ResourceActivationEvent = 0;
49 : static const sal_Int32 ResourceDeactivationEvent = 1;
50 : static const sal_Int32 ConfigurationUpdateEvent = 2;
51 : }
52 :
53 : namespace sd { namespace tools {
54 :
55 : typedef cppu::WeakComponentImplHelper4<
56 : ::com::sun::star::beans::XPropertyChangeListener,
57 : ::com::sun::star::frame::XFrameActionListener,
58 : ::com::sun::star::view::XSelectionChangeListener,
59 : ::com::sun::star::drawing::framework::XConfigurationChangeListener
60 : > EventMultiplexerImplementationInterfaceBase;
61 :
62 : class EventMultiplexer::Implementation
63 : : protected MutexOwner,
64 : public EventMultiplexerImplementationInterfaceBase,
65 : public SfxListener
66 : {
67 : public:
68 : Implementation (ViewShellBase& rBase);
69 : virtual ~Implementation (void);
70 :
71 : void AddEventListener (
72 : Link& rCallback,
73 : EventMultiplexerEvent::EventId aEventTypes);
74 :
75 : void RemoveEventListener (
76 : Link& rCallback,
77 : EventMultiplexerEvent::EventId aEventTypes);
78 :
79 : void CallListeners (EventMultiplexerEvent& rEvent);
80 :
81 0 : ViewShellBase& GetViewShellBase() const { return mrBase; }
82 :
83 : //===== lang::XEventListener ==============================================
84 : virtual void SAL_CALL
85 : disposing (const ::com::sun::star::lang::EventObject& rEventObject)
86 : throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
87 :
88 :
89 : //===== beans::XPropertySetListener =======================================
90 : virtual void SAL_CALL
91 : propertyChange (
92 : const com::sun::star::beans::PropertyChangeEvent& rEvent)
93 : throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
94 :
95 : //===== view::XSelectionChangeListener ====================================
96 : virtual void SAL_CALL
97 : selectionChanged (
98 : const com::sun::star::lang::EventObject& rEvent)
99 : throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
100 :
101 : //===== frame::XFrameActionListener ======================================
102 : /** For certain actions the listener connects to a new controller of the
103 : frame it is listening to. This usually happens when the view shell
104 : in the center pane is replaced by another view shell.
105 : */
106 : virtual void SAL_CALL
107 : frameAction (const ::com::sun::star::frame::FrameActionEvent& rEvent)
108 : throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
109 :
110 : //===== drawing::framework::XConfigurationChangeListener ==================
111 : virtual void SAL_CALL
112 : notifyConfigurationChange (
113 : const ::com::sun::star::drawing::framework::ConfigurationChangeEvent& rEvent)
114 : throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
115 :
116 :
117 : virtual void SAL_CALL disposing (void) SAL_OVERRIDE;
118 :
119 : protected:
120 : virtual void Notify (
121 : SfxBroadcaster& rBroadcaster,
122 : const SfxHint& rHint) SAL_OVERRIDE;
123 :
124 : private:
125 : ViewShellBase& mrBase;
126 : typedef ::std::pair<Link,EventMultiplexerEvent::EventId> ListenerDescriptor;
127 : typedef ::std::vector<ListenerDescriptor> ListenerList;
128 : ListenerList maListeners;
129 :
130 : /// Remember whether we are listening to the UNO controller.
131 : bool mbListeningToController;
132 : /// Remember whether we are listening to the frame.
133 : bool mbListeningToFrame;
134 :
135 : ::com::sun::star::uno::WeakReference<
136 : ::com::sun::star::frame::XController> mxControllerWeak;
137 : ::com::sun::star::uno::WeakReference<
138 : ::com::sun::star::frame::XFrame> mxFrameWeak;
139 : ::com::sun::star::uno::WeakReference<
140 : ::com::sun::star::view::XSelectionSupplier> mxSlideSorterSelectionWeak;
141 : SdDrawDocument* mpDocument;
142 : ::com::sun::star::uno::WeakReference<
143 : ::com::sun::star::drawing::framework::XConfigurationController>
144 : mxConfigurationControllerWeak;
145 :
146 : void ReleaseListeners (void);
147 :
148 : void ConnectToController (void);
149 : void DisconnectFromController (void);
150 :
151 : void CallListeners (
152 : EventMultiplexerEvent::EventId eId,
153 : void* pUserData = NULL);
154 :
155 : /** This method throws a DisposedException when the object has already been
156 : disposed.
157 : */
158 : void ThrowIfDisposed (void)
159 : throw (::com::sun::star::lang::DisposedException);
160 :
161 : DECL_LINK(SlideSorterSelectionChangeListener, void*);
162 : };
163 :
164 :
165 : const char aCurrentPagePropertyName[] = "CurrentPage";
166 : const char aEditModePropertyName[] = "IsMasterPageMode";
167 :
168 :
169 : //===== EventMultiplexer ======================================================
170 :
171 0 : EventMultiplexer::EventMultiplexer (ViewShellBase& rBase)
172 0 : : mpImpl (new EventMultiplexer::Implementation(rBase))
173 : {
174 0 : mpImpl->acquire();
175 0 : }
176 :
177 :
178 :
179 :
180 0 : EventMultiplexer::~EventMultiplexer (void)
181 : {
182 : try
183 : {
184 0 : mpImpl->dispose();
185 : // Now we call release twice. One decreases the use count of the
186 : // implementation object (if all goes well to zero and thus deletes
187 : // it.) The other releases the auto_ptr and prevents the
188 : // implementation object from being deleted a second time.
189 0 : mpImpl->release();
190 0 : mpImpl.release();
191 : }
192 0 : catch (const RuntimeException&)
193 : {
194 : }
195 0 : catch (const Exception&)
196 : {
197 : }
198 0 : }
199 :
200 :
201 :
202 :
203 0 : void EventMultiplexer::AddEventListener (
204 : Link& rCallback,
205 : EventMultiplexerEvent::EventId aEventTypes)
206 : {
207 0 : mpImpl->AddEventListener (rCallback, aEventTypes);
208 0 : }
209 :
210 :
211 :
212 :
213 0 : void EventMultiplexer::RemoveEventListener (
214 : Link& rCallback,
215 : EventMultiplexerEvent::EventId aEventTypes)
216 : {
217 0 : mpImpl->RemoveEventListener (rCallback, aEventTypes);
218 0 : }
219 :
220 :
221 :
222 :
223 0 : void EventMultiplexer::MultiplexEvent(
224 : EventMultiplexerEvent::EventId eEventId,
225 : void* pUserData )
226 : {
227 0 : EventMultiplexerEvent aEvent (mpImpl->GetViewShellBase(), eEventId, pUserData);
228 0 : mpImpl->CallListeners(aEvent);
229 0 : }
230 :
231 :
232 :
233 :
234 : //===== EventMultiplexer::Implementation ======================================
235 :
236 0 : EventMultiplexer::Implementation::Implementation (ViewShellBase& rBase)
237 : : MutexOwner(),
238 : EventMultiplexerImplementationInterfaceBase(maMutex),
239 : SfxListener(),
240 : mrBase (rBase),
241 : mbListeningToController (false),
242 : mbListeningToFrame (false),
243 : mxControllerWeak(NULL),
244 : mxFrameWeak(NULL),
245 : mxSlideSorterSelectionWeak(NULL),
246 : mpDocument(NULL),
247 0 : mxConfigurationControllerWeak()
248 : {
249 : // Connect to the frame to listen for controllers being exchanged.
250 : // Listen to changes of certain properties.
251 : Reference<frame::XFrame> xFrame (
252 0 : mrBase.GetFrame()->GetTopFrame().GetFrameInterface(),
253 0 : uno::UNO_QUERY);
254 0 : mxFrameWeak = xFrame;
255 0 : if (xFrame.is())
256 : {
257 0 : xFrame->addFrameActionListener (
258 : Reference<frame::XFrameActionListener>(
259 0 : static_cast<XWeak*>(this), UNO_QUERY));
260 0 : mbListeningToFrame = true;
261 : }
262 :
263 : // Connect to the current controller.
264 0 : ConnectToController ();
265 :
266 : // Listen for document changes.
267 0 : mpDocument = mrBase.GetDocument();
268 0 : if (mpDocument != NULL)
269 0 : StartListening (*mpDocument);
270 :
271 : // Listen for configuration changes.
272 : Reference<XControllerManager> xControllerManager (
273 0 : Reference<XWeak>(&mrBase.GetDrawController()), UNO_QUERY);
274 0 : if (xControllerManager.is())
275 : {
276 : Reference<XConfigurationController> xConfigurationController (
277 0 : xControllerManager->getConfigurationController());
278 0 : mxConfigurationControllerWeak = xConfigurationController;
279 0 : if (xConfigurationController.is())
280 : {
281 0 : Reference<XComponent> xComponent (xConfigurationController, UNO_QUERY);
282 0 : if (xComponent.is())
283 0 : xComponent->addEventListener(static_cast<beans::XPropertyChangeListener*>(this));
284 :
285 0 : xConfigurationController->addConfigurationChangeListener(
286 : this,
287 : FrameworkHelper::msResourceActivationEvent,
288 0 : makeAny(ResourceActivationEvent));
289 0 : xConfigurationController->addConfigurationChangeListener(
290 : this,
291 : FrameworkHelper::msResourceDeactivationEvent,
292 0 : makeAny(ResourceDeactivationEvent));
293 0 : xConfigurationController->addConfigurationChangeListener(
294 : this,
295 : FrameworkHelper::msConfigurationUpdateEndEvent,
296 0 : makeAny(ConfigurationUpdateEvent));
297 0 : }
298 0 : }
299 0 : }
300 :
301 :
302 :
303 :
304 0 : EventMultiplexer::Implementation::~Implementation (void)
305 : {
306 : DBG_ASSERT( !mbListeningToFrame,
307 : "sd::EventMultiplexer::Implementation::~Implementation(), disposing was not called!" );
308 0 : }
309 :
310 :
311 :
312 :
313 0 : void EventMultiplexer::Implementation::ReleaseListeners (void)
314 : {
315 0 : if (mbListeningToFrame)
316 : {
317 0 : mbListeningToFrame = false;
318 :
319 : // Stop listening for changes of certain properties.
320 0 : Reference<frame::XFrame> xFrame (mxFrameWeak);
321 0 : if (xFrame.is())
322 : {
323 0 : xFrame->removeFrameActionListener (
324 : Reference<frame::XFrameActionListener>(
325 0 : static_cast<XWeak*>(this), UNO_QUERY));
326 0 : }
327 : }
328 :
329 0 : DisconnectFromController ();
330 :
331 0 : if (mpDocument != NULL)
332 : {
333 0 : EndListening (*mpDocument);
334 0 : mpDocument = NULL;
335 : }
336 :
337 : // Stop listening for configuration changes.
338 0 : Reference<XConfigurationController> xConfigurationController (mxConfigurationControllerWeak);
339 0 : if (xConfigurationController.is())
340 : {
341 0 : Reference<XComponent> xComponent (xConfigurationController, UNO_QUERY);
342 0 : if (xComponent.is())
343 0 : xComponent->removeEventListener(static_cast<beans::XPropertyChangeListener*>(this));
344 :
345 0 : xConfigurationController->removeConfigurationChangeListener(this);
346 0 : }
347 0 : }
348 :
349 :
350 :
351 :
352 0 : void EventMultiplexer::Implementation::AddEventListener (
353 : Link& rCallback,
354 : EventMultiplexerEvent::EventId aEventTypes)
355 : {
356 0 : ListenerList::iterator iListener (maListeners.begin());
357 0 : ListenerList::const_iterator iEnd (maListeners.end());
358 0 : for (;iListener!=iEnd; ++iListener)
359 0 : if (iListener->first == rCallback)
360 0 : break;
361 0 : if (iListener != maListeners.end())
362 : {
363 : // Listener exists. Update its event type set.
364 0 : iListener->second |= aEventTypes;
365 : }
366 : else
367 : {
368 0 : maListeners.push_back (ListenerDescriptor(rCallback,aEventTypes));
369 : }
370 0 : }
371 :
372 :
373 :
374 :
375 0 : void EventMultiplexer::Implementation::RemoveEventListener (
376 : Link& rCallback,
377 : EventMultiplexerEvent::EventId aEventTypes)
378 : {
379 0 : ListenerList::iterator iListener (maListeners.begin());
380 0 : ListenerList::const_iterator iEnd (maListeners.end());
381 0 : for (;iListener!=iEnd; ++iListener)
382 0 : if (iListener->first == rCallback)
383 0 : break;
384 0 : if (iListener != maListeners.end())
385 : {
386 : // Update the event type set.
387 0 : iListener->second &= ~aEventTypes;
388 : // When no events remain in the set then remove the listener.
389 0 : if (iListener->second == EID_EMPTY_SET)
390 0 : maListeners.erase (iListener);
391 : }
392 0 : }
393 :
394 :
395 :
396 :
397 0 : void EventMultiplexer::Implementation::ConnectToController (void)
398 : {
399 : // Just in case that we missed some event we now disconnect from the old
400 : // controller.
401 0 : DisconnectFromController ();
402 :
403 : // Register at the controller of the main view shell.
404 :
405 : // We have to store a (weak) reference to the controller so that we can
406 : // unregister without having to ask the mrBase member (which at that
407 : // time may be destroyed.)
408 0 : Reference<frame::XController> xController = mrBase.GetController();
409 0 : mxControllerWeak = mrBase.GetController();
410 :
411 : try
412 : {
413 : // Listen for disposing events.
414 0 : Reference<lang::XComponent> xComponent (xController, UNO_QUERY);
415 0 : if (xComponent.is())
416 : {
417 0 : xComponent->addEventListener (
418 : Reference<lang::XEventListener>(
419 0 : static_cast<XWeak*>(this), UNO_QUERY));
420 0 : mbListeningToController = true;
421 : }
422 :
423 : // Listen to changes of certain properties.
424 0 : Reference<beans::XPropertySet> xSet (xController, UNO_QUERY);
425 0 : if (xSet.is())
426 : {
427 : try
428 : {
429 0 : xSet->addPropertyChangeListener(OUString(aCurrentPagePropertyName), this);
430 : }
431 0 : catch (const beans::UnknownPropertyException&)
432 : {
433 : OSL_TRACE("EventMultiplexer::ConnectToController: CurrentPage unknown");
434 : }
435 :
436 : try
437 : {
438 0 : xSet->addPropertyChangeListener(OUString(aEditModePropertyName), this);
439 : }
440 0 : catch (const beans::UnknownPropertyException&)
441 : {
442 : OSL_TRACE("EventMultiplexer::ConnectToController: IsMasterPageMode unknown");
443 : }
444 : }
445 :
446 : // Listen for selection change events.
447 0 : Reference<view::XSelectionSupplier> xSelection (xController, UNO_QUERY);
448 0 : if (xSelection.is())
449 : {
450 0 : xSelection->addSelectionChangeListener(this);
451 0 : }
452 : }
453 0 : catch (const lang::DisposedException&)
454 : {
455 0 : mbListeningToController = false;
456 0 : }
457 0 : }
458 :
459 :
460 :
461 :
462 0 : void EventMultiplexer::Implementation::DisconnectFromController (void)
463 : {
464 0 : if (mbListeningToController)
465 : {
466 0 : mbListeningToController = false;
467 :
468 0 : Reference<frame::XController> xController = mxControllerWeak;
469 :
470 0 : Reference<beans::XPropertySet> xSet (xController, UNO_QUERY);
471 : // Remove the property listener.
472 0 : if (xSet.is())
473 : {
474 : try
475 : {
476 0 : xSet->removePropertyChangeListener(OUString(aCurrentPagePropertyName), this);
477 : }
478 0 : catch (const beans::UnknownPropertyException&)
479 : {
480 : OSL_TRACE ("DisconnectFromController: CurrentPage unknown");
481 : }
482 :
483 : try
484 : {
485 0 : xSet->removePropertyChangeListener(OUString(aEditModePropertyName), this);
486 : }
487 0 : catch (const beans::UnknownPropertyException&)
488 : {
489 : OSL_TRACE ("DisconnectFromController: IsMasterPageMode unknown");
490 : }
491 : }
492 :
493 : // Remove selection change listener.
494 0 : Reference<view::XSelectionSupplier> xSelection (xController, UNO_QUERY);
495 0 : if (xSelection.is())
496 : {
497 0 : xSelection->removeSelectionChangeListener(this);
498 : }
499 :
500 : // Remove listener for disposing events.
501 0 : Reference<lang::XComponent> xComponent (xController, UNO_QUERY);
502 0 : if (xComponent.is())
503 : {
504 0 : xComponent->removeEventListener (
505 0 : Reference<lang::XEventListener>(static_cast<XWeak*>(this), UNO_QUERY));
506 0 : }
507 : }
508 0 : }
509 :
510 :
511 :
512 :
513 : //===== lang::XEventListener ================================================
514 :
515 0 : void SAL_CALL EventMultiplexer::Implementation::disposing (
516 : const lang::EventObject& rEventObject)
517 : throw (RuntimeException, std::exception)
518 : {
519 0 : if (mbListeningToController)
520 : {
521 0 : Reference<frame::XController> xController (mxControllerWeak);
522 0 : if (rEventObject.Source == xController)
523 : {
524 0 : mbListeningToController = false;
525 0 : }
526 : }
527 :
528 : Reference<XConfigurationController> xConfigurationController (
529 0 : mxConfigurationControllerWeak);
530 0 : if (xConfigurationController.is()
531 0 : && rEventObject.Source == xConfigurationController)
532 : {
533 0 : mxConfigurationControllerWeak.clear();
534 0 : }
535 0 : }
536 :
537 :
538 :
539 :
540 : //===== beans::XPropertySetListener =========================================
541 :
542 0 : void SAL_CALL EventMultiplexer::Implementation::propertyChange (
543 : const beans::PropertyChangeEvent& rEvent)
544 : throw (RuntimeException, std::exception)
545 : {
546 0 : ThrowIfDisposed();
547 :
548 0 : if ( rEvent.PropertyName == aCurrentPagePropertyName )
549 : {
550 0 : CallListeners(EventMultiplexerEvent::EID_CURRENT_PAGE);
551 : }
552 0 : else if ( rEvent.PropertyName == aEditModePropertyName )
553 : {
554 0 : bool bIsMasterPageMode (false);
555 0 : rEvent.NewValue >>= bIsMasterPageMode;
556 0 : if (bIsMasterPageMode)
557 0 : CallListeners(EventMultiplexerEvent::EID_EDIT_MODE_MASTER);
558 : else
559 0 : CallListeners(EventMultiplexerEvent::EID_EDIT_MODE_NORMAL);
560 : }
561 0 : }
562 :
563 :
564 :
565 :
566 : //===== frame::XFrameActionListener ==========================================
567 :
568 0 : void SAL_CALL EventMultiplexer::Implementation::frameAction (
569 : const frame::FrameActionEvent& rEvent)
570 : throw (::com::sun::star::uno::RuntimeException, std::exception)
571 : {
572 0 : Reference<frame::XFrame> xFrame (mxFrameWeak);
573 0 : if (rEvent.Frame == xFrame)
574 0 : switch (rEvent.Action)
575 : {
576 : case frame::FrameAction_COMPONENT_DETACHING:
577 0 : DisconnectFromController();
578 0 : CallListeners (EventMultiplexerEvent::EID_CONTROLLER_DETACHED);
579 0 : break;
580 :
581 : case frame::FrameAction_COMPONENT_REATTACHED:
582 0 : CallListeners (EventMultiplexerEvent::EID_CONTROLLER_DETACHED);
583 0 : DisconnectFromController();
584 0 : ConnectToController();
585 0 : CallListeners (EventMultiplexerEvent::EID_CONTROLLER_ATTACHED);
586 0 : break;
587 :
588 : case frame::FrameAction_COMPONENT_ATTACHED:
589 0 : ConnectToController();
590 0 : CallListeners (EventMultiplexerEvent::EID_CONTROLLER_ATTACHED);
591 0 : break;
592 :
593 : default:
594 0 : break;
595 0 : }
596 0 : }
597 :
598 :
599 :
600 :
601 : //===== view::XSelectionChangeListener ========================================
602 :
603 0 : void SAL_CALL EventMultiplexer::Implementation::selectionChanged (
604 : const lang::EventObject& )
605 : throw (::com::sun::star::uno::RuntimeException, std::exception)
606 : {
607 0 : CallListeners (EventMultiplexerEvent::EID_EDIT_VIEW_SELECTION);
608 0 : }
609 :
610 :
611 :
612 :
613 : //===== drawing::framework::XConfigurationChangeListener ==================
614 :
615 0 : void SAL_CALL EventMultiplexer::Implementation::notifyConfigurationChange (
616 : const ConfigurationChangeEvent& rEvent)
617 : throw (RuntimeException, std::exception)
618 : {
619 0 : sal_Int32 nEventType = 0;
620 0 : rEvent.UserData >>= nEventType;
621 0 : switch (nEventType)
622 : {
623 : case ResourceActivationEvent:
624 0 : if (rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix))
625 : {
626 0 : CallListeners (EventMultiplexerEvent::EID_VIEW_ADDED);
627 :
628 0 : if (rEvent.ResourceId->isBoundToURL(
629 0 : FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
630 : {
631 0 : CallListeners (EventMultiplexerEvent::EID_MAIN_VIEW_ADDED);
632 : }
633 :
634 : // Add selection change listener at slide sorter.
635 0 : if (rEvent.ResourceId->getResourceURL().equals(FrameworkHelper::msSlideSorterURL))
636 : {
637 : slidesorter::SlideSorterViewShell* pViewShell
638 : = dynamic_cast<slidesorter::SlideSorterViewShell*>(
639 : FrameworkHelper::GetViewShell(
640 0 : Reference<XView>(rEvent.ResourceObject,UNO_QUERY)).get());
641 0 : if (pViewShell != NULL)
642 : pViewShell->AddSelectionChangeListener (
643 : LINK(this,
644 : EventMultiplexer::Implementation,
645 0 : SlideSorterSelectionChangeListener));
646 : }
647 : }
648 0 : break;
649 :
650 : case ResourceDeactivationEvent:
651 0 : if (rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix))
652 : {
653 0 : CallListeners (EventMultiplexerEvent::EID_VIEW_REMOVED);
654 :
655 0 : if (rEvent.ResourceId->isBoundToURL(
656 0 : FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
657 : {
658 0 : CallListeners (EventMultiplexerEvent::EID_MAIN_VIEW_REMOVED);
659 : }
660 :
661 : // Remove selection change listener from slide sorter. Add
662 : // selection change listener at slide sorter.
663 0 : if (rEvent.ResourceId->getResourceURL().equals(FrameworkHelper::msSlideSorterURL))
664 : {
665 : slidesorter::SlideSorterViewShell* pViewShell
666 : = dynamic_cast<slidesorter::SlideSorterViewShell*>(
667 : FrameworkHelper::GetViewShell(
668 0 : Reference<XView>(rEvent.ResourceObject, UNO_QUERY)).get());
669 0 : if (pViewShell != NULL)
670 : pViewShell->RemoveSelectionChangeListener (
671 : LINK(this,
672 : EventMultiplexer::Implementation,
673 0 : SlideSorterSelectionChangeListener));
674 : }
675 : }
676 0 : break;
677 :
678 : case ConfigurationUpdateEvent:
679 0 : CallListeners (EventMultiplexerEvent::EID_CONFIGURATION_UPDATED);
680 0 : break;
681 : }
682 :
683 0 : }
684 :
685 :
686 :
687 :
688 0 : void SAL_CALL EventMultiplexer::Implementation::disposing (void)
689 : {
690 0 : CallListeners (EventMultiplexerEvent::EID_DISPOSING);
691 0 : ReleaseListeners();
692 0 : }
693 :
694 :
695 :
696 :
697 0 : void EventMultiplexer::Implementation::ThrowIfDisposed (void)
698 : throw (::com::sun::star::lang::DisposedException)
699 : {
700 0 : if (rBHelper.bDisposed || rBHelper.bInDispose)
701 : {
702 : throw lang::DisposedException (
703 : "SlideSorterController object has already been disposed",
704 0 : static_cast<uno::XWeak*>(this));
705 : }
706 0 : }
707 :
708 :
709 :
710 :
711 0 : void EventMultiplexer::Implementation::Notify (
712 : SfxBroadcaster&,
713 : const SfxHint& rHint)
714 : {
715 0 : if (rHint.ISA(SdrHint))
716 : {
717 0 : SdrHint& rSdrHint (*PTR_CAST(SdrHint,&rHint));
718 0 : switch (rSdrHint.GetKind())
719 : {
720 : case HINT_MODELCLEARED:
721 : case HINT_PAGEORDERCHG:
722 0 : CallListeners (EventMultiplexerEvent::EID_PAGE_ORDER);
723 0 : break;
724 :
725 : case HINT_SWITCHTOPAGE:
726 0 : CallListeners (EventMultiplexerEvent::EID_CURRENT_PAGE);
727 0 : break;
728 :
729 : case HINT_OBJCHG:
730 : CallListeners(EventMultiplexerEvent::EID_SHAPE_CHANGED,
731 0 : const_cast<void*>(static_cast<const void*>(rSdrHint.GetPage())));
732 0 : break;
733 :
734 : case HINT_OBJINSERTED:
735 : CallListeners(EventMultiplexerEvent::EID_SHAPE_INSERTED,
736 0 : const_cast<void*>(static_cast<const void*>(rSdrHint.GetPage())));
737 0 : break;
738 :
739 : case HINT_OBJREMOVED:
740 : CallListeners(EventMultiplexerEvent::EID_SHAPE_REMOVED,
741 0 : const_cast<void*>(static_cast<const void*>(rSdrHint.GetPage())));
742 0 : break;
743 : default:
744 0 : break;
745 : }
746 : }
747 0 : else if (rHint.ISA(SfxSimpleHint))
748 : {
749 0 : SfxSimpleHint& rSimpleHint (*PTR_CAST(SfxSimpleHint, &rHint));
750 0 : if (rSimpleHint.GetId() == SFX_HINT_DYING)
751 0 : mpDocument = NULL;
752 : }
753 0 : }
754 :
755 :
756 :
757 :
758 0 : void EventMultiplexer::Implementation::CallListeners (
759 : EventMultiplexerEvent::EventId eId,
760 : void* pUserData)
761 : {
762 0 : EventMultiplexerEvent aEvent (mrBase, eId, pUserData);
763 0 : CallListeners(aEvent);
764 0 : }
765 :
766 :
767 :
768 :
769 0 : void EventMultiplexer::Implementation::CallListeners (EventMultiplexerEvent& rEvent)
770 : {
771 0 : ListenerList aCopyListeners( maListeners );
772 0 : ListenerList::iterator iListener (aCopyListeners.begin());
773 0 : ListenerList::const_iterator iListenerEnd (aCopyListeners.end());
774 0 : for (; iListener!=iListenerEnd; ++iListener)
775 : {
776 0 : if ((iListener->second && rEvent.meEventId))
777 0 : iListener->first.Call(&rEvent);
778 0 : }
779 0 : }
780 :
781 :
782 :
783 :
784 0 : IMPL_LINK_NOARG(EventMultiplexer::Implementation, SlideSorterSelectionChangeListener)
785 : {
786 0 : CallListeners (EventMultiplexerEvent::EID_SLIDE_SORTER_SELECTION);
787 0 : return 0;
788 : }
789 :
790 :
791 :
792 :
793 : //===== EventMultiplexerEvent =================================================
794 :
795 0 : EventMultiplexerEvent::EventMultiplexerEvent (
796 : const ViewShellBase& rBase,
797 : EventId eEventId,
798 : const void* pUserData)
799 : : mrBase(rBase),
800 : meEventId(eEventId),
801 0 : mpUserData(pUserData)
802 :
803 : {
804 0 : }
805 :
806 : } } // end of namespace ::sd::tools
807 :
808 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|