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