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