diff options
author | Oliver Bolte <obo@openoffice.org> | 2005-07-07 12:38:29 +0000 |
---|---|---|
committer | Oliver Bolte <obo@openoffice.org> | 2005-07-07 12:38:29 +0000 |
commit | f3075ae864ebbdc61d231f1e9bddc92314b8bfd3 (patch) | |
tree | 91b3d9bb0bb4d89f6981d5129c2d8eb57e9bda8a /sd/source/ui/tools/EventMultiplexer.cxx | |
parent | a8955ee29ede777dd38d6c5b470264408633b8d8 (diff) |
INTEGRATION: CWS impress62 (1.4.54); FILE MERGED
2005/06/29 09:32:23 af 1.4.54.1: #i43497# Fixed the ConnectToController() and DisconnectFromController() methods to properly handle failed connects.
Diffstat (limited to 'sd/source/ui/tools/EventMultiplexer.cxx')
-rw-r--r-- | sd/source/ui/tools/EventMultiplexer.cxx | 129 |
1 files changed, 75 insertions, 54 deletions
diff --git a/sd/source/ui/tools/EventMultiplexer.cxx b/sd/source/ui/tools/EventMultiplexer.cxx index bde1d85388eb..f2daa331d680 100644 --- a/sd/source/ui/tools/EventMultiplexer.cxx +++ b/sd/source/ui/tools/EventMultiplexer.cxx @@ -2,9 +2,9 @@ * * $RCSfile: EventMultiplexer.cxx,v $ * - * $Revision: 1.4 $ + * $Revision: 1.5 $ * - * last change: $Author: obo $ $Date: 2005-05-02 13:18:54 $ + * last change: $Author: obo $ $Date: 2005-07-07 13:38:29 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -181,7 +181,7 @@ private: bool mbPaneManagerAvailable; ::com::sun::star::uno::WeakReference< - ::com::sun::star::beans::XPropertySet> mxControllerPropertySetWeak; + ::com::sun::star::frame::XController> mxControllerWeak; ::com::sun::star::uno::WeakReference< ::com::sun::star::frame::XFrame> mxFrameWeak; ::com::sun::star::uno::WeakReference< @@ -253,6 +253,7 @@ void EventMultiplexer::RemoveEventListener ( + void EventMultiplexer::MultiplexEvent( EventMultiplexerEvent::EventId eEventId, void* pUserData ) { EventType eEventType = ETS_FULL_SET; @@ -277,6 +278,9 @@ void EventMultiplexer::MultiplexEvent( EventMultiplexerEvent::EventId eEventId, mpImpl->CallListeners( eEventType, aEvent ); } + + + //===== EventMultiplexer::Implementation ====================================== EventMultiplexer::Implementation::Implementation (ViewShellBase& rBase) @@ -287,7 +291,7 @@ EventMultiplexer::Implementation::Implementation (ViewShellBase& rBase) mbListeningToController (false), mbListeningToFrame (false), mbPaneManagerAvailable(true), - mxControllerPropertySetWeak(NULL), + mxControllerWeak(NULL), mxFrameWeak(NULL), mxSlideSorterSelectionWeak(NULL) { @@ -327,6 +331,7 @@ EventMultiplexer::Implementation::~Implementation (void) + void EventMultiplexer::Implementation::ReleaseListeners (void) { if (mbListeningToFrame) @@ -355,6 +360,7 @@ void EventMultiplexer::Implementation::ReleaseListeners (void) + void EventMultiplexer::Implementation::AddEventListener ( Link& rCallback, EventTypeSet aEventTypes) @@ -408,45 +414,57 @@ void EventMultiplexer::Implementation::ConnectToController (void) // Register at the controller of the main view shell. - mxControllerPropertySetWeak = Reference<beans::XPropertySet> ( - mrBase.GetController(), - UNO_QUERY); + // We have to store a (weak) reference to the controller so that we can + // unregister without having to ask the mrBase member (which at that + // time may be destroyed.) + Reference<frame::XController> xController = mrBase.GetController(); + mxControllerWeak = mrBase.GetController(); + OSL_TRACE("EventMultiplexer %x connecting to controller %x", this,mxControllerWeak.get()); - // Listen to changes of certain properties. - Reference<beans::XPropertySet> xSet (mxControllerPropertySetWeak); try { - if (xSet.is()) + // Listen for disposing events. + Reference<lang::XComponent> xComponent (xController, UNO_QUERY); + if (xComponent.is()) { - xSet->addPropertyChangeListener ( - String::CreateFromAscii("CurrentPage"), - this); - xSet->addPropertyChangeListener ( - String::CreateFromAscii("IsMasterPageMode"), - this); + xComponent->addEventListener ( + Reference<lang::XEventListener>( + static_cast<XWeak*>(this), UNO_QUERY)); mbListeningToController = true; } - } - catch (beans::UnknownPropertyException aEvent) - { - OSL_TRACE ("caught exception in SlideSorterController::SetupListeners: %s", - ::rtl::OUStringToOString(aEvent.Message, - RTL_TEXTENCODING_UTF8).getStr()); - } - // Listen for selection change events. - Reference<view::XSelectionSupplier> xSelection (xSet, UNO_QUERY); - if (xSelection.is()) + // Listen to changes of certain properties. + Reference<beans::XPropertySet> xSet (xController, UNO_QUERY); + try + { + if (xSet.is()) + { + xSet->addPropertyChangeListener ( + String::CreateFromAscii("CurrentPage"), + this); + xSet->addPropertyChangeListener ( + String::CreateFromAscii("IsMasterPageMode"), + this); + } + } + catch (beans::UnknownPropertyException aEvent) + { + OSL_TRACE ("caught exception in SlideSorterController::SetupListeners: %s", + ::rtl::OUStringToOString(aEvent.Message, + RTL_TEXTENCODING_UTF8).getStr()); + } + + // Listen for selection change events. + Reference<view::XSelectionSupplier> xSelection (xController, UNO_QUERY); + if (xSelection.is()) + { + xSelection->addSelectionChangeListener(this); + } + } + catch (const lang::DisposedException aException) { - xSelection->addSelectionChangeListener(this); + mbListeningToController = false; } - - // Listen for disposing events. - Reference<lang::XComponent> xComponent (xSet, UNO_QUERY); - if (xComponent.is()) - xComponent->addEventListener ( - Reference<lang::XEventListener>( - static_cast<XWeak*>(this), UNO_QUERY)); } @@ -458,7 +476,10 @@ void EventMultiplexer::Implementation::DisconnectFromController (void) { mbListeningToController = false; - Reference<beans::XPropertySet> xSet (mxControllerPropertySetWeak); + OSL_TRACE("EventMultiplexer %x disconnecting from controller %x", this,mxControllerWeak.get()); + Reference<frame::XController> xController = mxControllerWeak; + + Reference<beans::XPropertySet> xSet (xController, UNO_QUERY); try { // Remove the property listener. @@ -473,7 +494,7 @@ void EventMultiplexer::Implementation::DisconnectFromController (void) } // Remove the dispose listener. - Reference<XComponent> xComponent (xSet, UNO_QUERY); + Reference<XComponent> xComponent (xController, UNO_QUERY); if (xComponent.is()) xComponent->removeEventListener ( Reference<lang::XEventListener>( @@ -487,14 +508,14 @@ void EventMultiplexer::Implementation::DisconnectFromController (void) } // Remove selection change listener. - Reference<view::XSelectionSupplier> xSelection (xSet, UNO_QUERY); + Reference<view::XSelectionSupplier> xSelection (xController, UNO_QUERY); if (xSelection.is()) { xSelection->removeSelectionChangeListener(this); } // Remove listener for disposing events. - Reference<lang::XComponent> xComponent (xSet, UNO_QUERY); + Reference<lang::XComponent> xComponent (xController, UNO_QUERY); if (xComponent.is()) xComponent->removeEventListener ( Reference<lang::XEventListener>( @@ -513,10 +534,8 @@ void SAL_CALL EventMultiplexer::Implementation::disposing ( { if (mbListeningToController) { - Reference<view::XSelectionSupplier> xSelectionSupplier ( - mrBase.GetController(), - uno::UNO_QUERY); - if (rEventObject.Source == xSelectionSupplier) + Reference<frame::XController> xController (mxControllerWeak); + if (rEventObject.Source == xController) { mbListeningToController = false; } @@ -566,20 +585,22 @@ void SAL_CALL EventMultiplexer::Implementation::frameAction ( const frame::FrameActionEvent& rEvent) throw (::com::sun::star::uno::RuntimeException) { - switch (rEvent.Action) - { - case frame::FrameAction_COMPONENT_DETACHING: - DisconnectFromController(); - break; + Reference<frame::XFrame> xFrame (mxFrameWeak); + if (rEvent.Frame == xFrame) + switch (rEvent.Action) + { + case frame::FrameAction_COMPONENT_DETACHING: + DisconnectFromController(); + break; - case frame::FrameAction_COMPONENT_REATTACHED: - case frame::FrameAction_COMPONENT_ATTACHED: - ConnectToController(); - break; + case frame::FrameAction_COMPONENT_REATTACHED: + case frame::FrameAction_COMPONENT_ATTACHED: + ConnectToController(); + break; - default: - break; - } + default: + break; + } } |