LCOV - code coverage report
Current view: top level - sd/source/ui/tools - EventMultiplexer.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 233 256 91.0 %
Date: 2015-06-13 12:38:46 Functions: 29 29 100.0 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11