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();
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 183 : 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() 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();
144 :
145 : void ConnectToController();
146 : void DisconnectFromController();
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()
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 127 : EventMultiplexer::EventMultiplexer (ViewShellBase& rBase)
167 127 : : mpImpl (new EventMultiplexer::Implementation(rBase))
168 : {
169 127 : mpImpl->acquire();
170 127 : }
171 :
172 254 : EventMultiplexer::~EventMultiplexer()
173 : {
174 : try
175 : {
176 127 : 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 127 : mpImpl->release();
182 127 : mpImpl.release();
183 : }
184 0 : catch (const RuntimeException&)
185 : {
186 : }
187 0 : catch (const Exception&)
188 : {
189 : }
190 127 : }
191 :
192 594 : void EventMultiplexer::AddEventListener (
193 : Link<>& rCallback,
194 : EventMultiplexerEvent::EventId aEventTypes)
195 : {
196 594 : mpImpl->AddEventListener (rCallback, aEventTypes);
197 594 : }
198 :
199 594 : void EventMultiplexer::RemoveEventListener (
200 : Link<>& rCallback,
201 : EventMultiplexerEvent::EventId aEventTypes)
202 : {
203 594 : mpImpl->RemoveEventListener (rCallback, aEventTypes);
204 594 : }
205 :
206 183 : void EventMultiplexer::MultiplexEvent(
207 : EventMultiplexerEvent::EventId eEventId,
208 : void* pUserData )
209 : {
210 183 : EventMultiplexerEvent aEvent (mpImpl->GetViewShellBase(), eEventId, pUserData);
211 183 : mpImpl->CallListeners(aEvent);
212 183 : }
213 :
214 : //===== EventMultiplexer::Implementation ======================================
215 :
216 127 : 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 127 : 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 127 : mrBase.GetFrame()->GetTopFrame().GetFrameInterface(),
233 127 : uno::UNO_QUERY);
234 127 : mxFrameWeak = xFrame;
235 127 : if (xFrame.is())
236 : {
237 127 : xFrame->addFrameActionListener (
238 : Reference<frame::XFrameActionListener>(
239 127 : static_cast<XWeak*>(this), UNO_QUERY));
240 127 : mbListeningToFrame = true;
241 : }
242 :
243 : // Connect to the current controller.
244 127 : ConnectToController ();
245 :
246 : // Listen for document changes.
247 127 : mpDocument = mrBase.GetDocument();
248 127 : if (mpDocument != NULL)
249 127 : StartListening (*mpDocument);
250 :
251 : // Listen for configuration changes.
252 : Reference<XControllerManager> xControllerManager (
253 254 : Reference<XWeak>(&mrBase.GetDrawController()), UNO_QUERY);
254 127 : if (xControllerManager.is())
255 : {
256 : Reference<XConfigurationController> xConfigurationController (
257 127 : xControllerManager->getConfigurationController());
258 127 : mxConfigurationControllerWeak = xConfigurationController;
259 127 : if (xConfigurationController.is())
260 : {
261 127 : Reference<XComponent> xComponent (xConfigurationController, UNO_QUERY);
262 127 : if (xComponent.is())
263 127 : xComponent->addEventListener(static_cast<beans::XPropertyChangeListener*>(this));
264 :
265 127 : xConfigurationController->addConfigurationChangeListener(
266 : this,
267 : FrameworkHelper::msResourceActivationEvent,
268 127 : makeAny(ResourceActivationEvent));
269 127 : xConfigurationController->addConfigurationChangeListener(
270 : this,
271 : FrameworkHelper::msResourceDeactivationEvent,
272 127 : makeAny(ResourceDeactivationEvent));
273 127 : xConfigurationController->addConfigurationChangeListener(
274 : this,
275 : FrameworkHelper::msConfigurationUpdateEndEvent,
276 127 : makeAny(ConfigurationUpdateEvent));
277 127 : }
278 127 : }
279 127 : }
280 :
281 254 : EventMultiplexer::Implementation::~Implementation()
282 : {
283 : DBG_ASSERT( !mbListeningToFrame,
284 : "sd::EventMultiplexer::Implementation::~Implementation(), disposing was not called!" );
285 254 : }
286 :
287 127 : void EventMultiplexer::Implementation::ReleaseListeners()
288 : {
289 127 : if (mbListeningToFrame)
290 : {
291 127 : mbListeningToFrame = false;
292 :
293 : // Stop listening for changes of certain properties.
294 127 : Reference<frame::XFrame> xFrame (mxFrameWeak);
295 127 : if (xFrame.is())
296 : {
297 127 : xFrame->removeFrameActionListener (
298 : Reference<frame::XFrameActionListener>(
299 127 : static_cast<XWeak*>(this), UNO_QUERY));
300 127 : }
301 : }
302 :
303 127 : DisconnectFromController ();
304 :
305 127 : if (mpDocument != NULL)
306 : {
307 127 : EndListening (*mpDocument);
308 127 : mpDocument = NULL;
309 : }
310 :
311 : // Stop listening for configuration changes.
312 127 : Reference<XConfigurationController> xConfigurationController (mxConfigurationControllerWeak);
313 127 : 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 127 : }
321 127 : }
322 :
323 594 : void EventMultiplexer::Implementation::AddEventListener (
324 : Link<>& rCallback,
325 : EventMultiplexerEvent::EventId aEventTypes)
326 : {
327 594 : ListenerList::iterator iListener (maListeners.begin());
328 594 : ListenerList::const_iterator iEnd (maListeners.end());
329 1748 : for (;iListener!=iEnd; ++iListener)
330 1154 : if (iListener->first == rCallback)
331 0 : break;
332 594 : if (iListener != maListeners.end())
333 : {
334 : // Listener exists. Update its event type set.
335 0 : iListener->second |= aEventTypes;
336 : }
337 : else
338 : {
339 594 : maListeners.push_back (ListenerDescriptor(rCallback,aEventTypes));
340 : }
341 594 : }
342 :
343 594 : void EventMultiplexer::Implementation::RemoveEventListener (
344 : Link<>& rCallback,
345 : EventMultiplexerEvent::EventId aEventTypes)
346 : {
347 594 : ListenerList::iterator iListener (maListeners.begin());
348 594 : ListenerList::const_iterator iEnd (maListeners.end());
349 1433 : for (;iListener!=iEnd; ++iListener)
350 1433 : if (iListener->first == rCallback)
351 594 : break;
352 594 : if (iListener != maListeners.end())
353 : {
354 : // Update the event type set.
355 594 : iListener->second &= ~aEventTypes;
356 : // When no events remain in the set then remove the listener.
357 594 : if (iListener->second == EID_EMPTY_SET)
358 594 : maListeners.erase (iListener);
359 : }
360 594 : }
361 :
362 261 : void EventMultiplexer::Implementation::ConnectToController()
363 : {
364 : // Just in case that we missed some event we now disconnect from the old
365 : // controller.
366 261 : 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 261 : Reference<frame::XController> xController = mrBase.GetController();
374 261 : mxControllerWeak = mrBase.GetController();
375 :
376 : try
377 : {
378 : // Listen for disposing events.
379 261 : Reference<lang::XComponent> xComponent (xController, UNO_QUERY);
380 261 : if (xComponent.is())
381 : {
382 261 : xComponent->addEventListener (
383 : Reference<lang::XEventListener>(
384 268 : static_cast<XWeak*>(this), UNO_QUERY));
385 254 : mbListeningToController = true;
386 : }
387 :
388 : // Listen to changes of certain properties.
389 508 : Reference<beans::XPropertySet> xSet (xController, UNO_QUERY);
390 254 : if (xSet.is())
391 : {
392 : try
393 : {
394 254 : 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 254 : 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 508 : Reference<view::XSelectionSupplier> xSelection (xController, UNO_QUERY);
413 254 : if (xSelection.is())
414 : {
415 254 : xSelection->addSelectionChangeListener(this);
416 261 : }
417 : }
418 14 : catch (const lang::DisposedException&)
419 : {
420 7 : mbListeningToController = false;
421 261 : }
422 261 : }
423 :
424 536 : void EventMultiplexer::Implementation::DisconnectFromController()
425 : {
426 536 : if (mbListeningToController)
427 : {
428 254 : mbListeningToController = false;
429 :
430 254 : Reference<frame::XController> xController = mxControllerWeak;
431 :
432 508 : Reference<beans::XPropertySet> xSet (xController, UNO_QUERY);
433 : // Remove the property listener.
434 254 : if (xSet.is())
435 : {
436 : try
437 : {
438 254 : 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 254 : 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 508 : Reference<view::XSelectionSupplier> xSelection (xController, UNO_QUERY);
457 254 : if (xSelection.is())
458 : {
459 254 : xSelection->removeSelectionChangeListener(this);
460 : }
461 :
462 : // Remove listener for disposing events.
463 508 : Reference<lang::XComponent> xComponent (xController, UNO_QUERY);
464 254 : if (xComponent.is())
465 : {
466 254 : xComponent->removeEventListener (
467 254 : Reference<lang::XEventListener>(static_cast<XWeak*>(this), UNO_QUERY));
468 254 : }
469 : }
470 536 : }
471 :
472 : //===== lang::XEventListener ================================================
473 :
474 254 : void SAL_CALL EventMultiplexer::Implementation::disposing (
475 : const lang::EventObject& rEventObject)
476 : throw (RuntimeException, std::exception)
477 : {
478 254 : 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 254 : mxConfigurationControllerWeak);
489 508 : if (xConfigurationController.is()
490 254 : && rEventObject.Source == xConfigurationController)
491 : {
492 127 : mxConfigurationControllerWeak.clear();
493 254 : }
494 254 : }
495 :
496 : //===== beans::XPropertySetListener =========================================
497 :
498 160 : void SAL_CALL EventMultiplexer::Implementation::propertyChange (
499 : const beans::PropertyChangeEvent& rEvent)
500 : throw (RuntimeException, std::exception)
501 : {
502 160 : ThrowIfDisposed();
503 :
504 160 : if ( rEvent.PropertyName == aCurrentPagePropertyName )
505 : {
506 150 : CallListeners(EventMultiplexerEvent::EID_CURRENT_PAGE);
507 : }
508 10 : else if ( rEvent.PropertyName == aEditModePropertyName )
509 : {
510 10 : bool bIsMasterPageMode (false);
511 10 : rEvent.NewValue >>= bIsMasterPageMode;
512 10 : if (bIsMasterPageMode)
513 5 : CallListeners(EventMultiplexerEvent::EID_EDIT_MODE_MASTER);
514 : else
515 5 : CallListeners(EventMultiplexerEvent::EID_EDIT_MODE_NORMAL);
516 : }
517 160 : }
518 :
519 : //===== frame::XFrameActionListener ==========================================
520 :
521 386 : void SAL_CALL EventMultiplexer::Implementation::frameAction (
522 : const frame::FrameActionEvent& rEvent)
523 : throw (::com::sun::star::uno::RuntimeException, std::exception)
524 : {
525 386 : Reference<frame::XFrame> xFrame (mxFrameWeak);
526 386 : if (rEvent.Frame == xFrame)
527 386 : switch (rEvent.Action)
528 : {
529 : case frame::FrameAction_COMPONENT_DETACHING:
530 134 : DisconnectFromController();
531 134 : CallListeners (EventMultiplexerEvent::EID_CONTROLLER_DETACHED);
532 134 : break;
533 :
534 : case frame::FrameAction_COMPONENT_REATTACHED:
535 14 : CallListeners (EventMultiplexerEvent::EID_CONTROLLER_DETACHED);
536 14 : DisconnectFromController();
537 14 : ConnectToController();
538 14 : CallListeners (EventMultiplexerEvent::EID_CONTROLLER_ATTACHED);
539 14 : break;
540 :
541 : case frame::FrameAction_COMPONENT_ATTACHED:
542 120 : ConnectToController();
543 120 : CallListeners (EventMultiplexerEvent::EID_CONTROLLER_ATTACHED);
544 120 : break;
545 :
546 : default:
547 118 : break;
548 386 : }
549 386 : }
550 :
551 : //===== view::XSelectionChangeListener ========================================
552 :
553 292 : void SAL_CALL EventMultiplexer::Implementation::selectionChanged (
554 : const lang::EventObject& )
555 : throw (::com::sun::star::uno::RuntimeException, std::exception)
556 : {
557 292 : CallListeners (EventMultiplexerEvent::EID_EDIT_VIEW_SELECTION);
558 292 : }
559 :
560 : //===== drawing::framework::XConfigurationChangeListener ==================
561 :
562 1473 : void SAL_CALL EventMultiplexer::Implementation::notifyConfigurationChange (
563 : const ConfigurationChangeEvent& rEvent)
564 : throw (RuntimeException, std::exception)
565 : {
566 1473 : sal_Int32 nEventType = 0;
567 1473 : rEvent.UserData >>= nEventType;
568 1473 : switch (nEventType)
569 : {
570 : case ResourceActivationEvent:
571 559 : if (rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix))
572 : {
573 199 : CallListeners (EventMultiplexerEvent::EID_VIEW_ADDED);
574 :
575 398 : if (rEvent.ResourceId->isBoundToURL(
576 199 : FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
577 : {
578 133 : CallListeners (EventMultiplexerEvent::EID_MAIN_VIEW_ADDED);
579 : }
580 :
581 : // Add selection change listener at slide sorter.
582 199 : if (rEvent.ResourceId->getResourceURL().equals(FrameworkHelper::msSlideSorterURL))
583 : {
584 : slidesorter::SlideSorterViewShell* pViewShell
585 : = dynamic_cast<slidesorter::SlideSorterViewShell*>(
586 : FrameworkHelper::GetViewShell(
587 66 : Reference<XView>(rEvent.ResourceObject,UNO_QUERY)).get());
588 66 : if (pViewShell != NULL)
589 : pViewShell->AddSelectionChangeListener (
590 : LINK(this,
591 : EventMultiplexer::Implementation,
592 66 : SlideSorterSelectionChangeListener));
593 : }
594 : }
595 559 : break;
596 :
597 : case ResourceDeactivationEvent:
598 559 : if (rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix))
599 : {
600 199 : CallListeners (EventMultiplexerEvent::EID_VIEW_REMOVED);
601 :
602 398 : if (rEvent.ResourceId->isBoundToURL(
603 199 : FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
604 : {
605 133 : 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 199 : if (rEvent.ResourceId->getResourceURL().equals(FrameworkHelper::msSlideSorterURL))
611 : {
612 : slidesorter::SlideSorterViewShell* pViewShell
613 : = dynamic_cast<slidesorter::SlideSorterViewShell*>(
614 : FrameworkHelper::GetViewShell(
615 66 : Reference<XView>(rEvent.ResourceObject, UNO_QUERY)).get());
616 66 : if (pViewShell != NULL)
617 : pViewShell->RemoveSelectionChangeListener (
618 : LINK(this,
619 : EventMultiplexer::Implementation,
620 66 : SlideSorterSelectionChangeListener));
621 : }
622 : }
623 559 : break;
624 :
625 : case ConfigurationUpdateEvent:
626 355 : CallListeners (EventMultiplexerEvent::EID_CONFIGURATION_UPDATED);
627 355 : break;
628 : }
629 :
630 1473 : }
631 :
632 127 : void SAL_CALL EventMultiplexer::Implementation::disposing()
633 : {
634 127 : CallListeners (EventMultiplexerEvent::EID_DISPOSING);
635 127 : ReleaseListeners();
636 127 : }
637 :
638 160 : void EventMultiplexer::Implementation::ThrowIfDisposed()
639 : throw (::com::sun::star::lang::DisposedException)
640 : {
641 160 : 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 160 : }
648 :
649 5314 : void EventMultiplexer::Implementation::Notify (
650 : SfxBroadcaster&,
651 : const SfxHint& rHint)
652 : {
653 5314 : const SdrHint* pSdrHint = dynamic_cast<const SdrHint*>(&rHint);
654 5314 : if (pSdrHint)
655 : {
656 5314 : switch (pSdrHint->GetKind())
657 : {
658 : case HINT_MODELCLEARED:
659 : case HINT_PAGEORDERCHG:
660 1031 : CallListeners (EventMultiplexerEvent::EID_PAGE_ORDER);
661 1031 : 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 1848 : const_cast<void*>(static_cast<const void*>(pSdrHint->GetPage())));
670 1848 : break;
671 :
672 : case HINT_OBJINSERTED:
673 : CallListeners(EventMultiplexerEvent::EID_SHAPE_INSERTED,
674 2279 : const_cast<void*>(static_cast<const void*>(pSdrHint->GetPage())));
675 2279 : break;
676 :
677 : case HINT_OBJREMOVED:
678 : CallListeners(EventMultiplexerEvent::EID_SHAPE_REMOVED,
679 134 : const_cast<void*>(static_cast<const void*>(pSdrHint->GetPage())));
680 134 : break;
681 : default:
682 22 : 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 5314 : }
692 :
693 7194 : void EventMultiplexer::Implementation::CallListeners (
694 : EventMultiplexerEvent::EventId eId,
695 : void* pUserData)
696 : {
697 7194 : EventMultiplexerEvent aEvent (mrBase, eId, pUserData);
698 7194 : CallListeners(aEvent);
699 7194 : }
700 :
701 7377 : void EventMultiplexer::Implementation::CallListeners (EventMultiplexerEvent& rEvent)
702 : {
703 7377 : ListenerList aCopyListeners( maListeners );
704 7377 : ListenerList::iterator iListener (aCopyListeners.begin());
705 7377 : ListenerList::const_iterator iListenerEnd (aCopyListeners.end());
706 34211 : for (; iListener!=iListenerEnd; ++iListener)
707 : {
708 26834 : if ((iListener->second && rEvent.meEventId))
709 26834 : iListener->first.Call(&rEvent);
710 7377 : }
711 7377 : }
712 :
713 44 : IMPL_LINK_NOARG(EventMultiplexer::Implementation, SlideSorterSelectionChangeListener)
714 : {
715 22 : CallListeners (EventMultiplexerEvent::EID_SLIDE_SORTER_SELECTION);
716 22 : return 0;
717 : }
718 :
719 : //===== EventMultiplexerEvent =================================================
720 :
721 7377 : EventMultiplexerEvent::EventMultiplexerEvent (
722 : const ViewShellBase& rBase,
723 : EventId eEventId,
724 : const void* pUserData)
725 : : mrBase(rBase),
726 : meEventId(eEventId),
727 7377 : mpUserData(pUserData)
728 :
729 : {
730 7377 : }
731 :
732 66 : } } // end of namespace ::sd::tools
733 :
734 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|