diff options
author | Michael Stahl <mstahl@redhat.com> | 2015-07-13 18:54:17 +0200 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2015-07-14 11:50:44 +0200 |
commit | 9be8c4f21200aeec5b334d9536b3b7a0b72c24fa (patch) | |
tree | 43df9f096d1c16a397e56460d458406d1b9cece3 /sfx2/source/sidebar | |
parent | a792aa2c48490e43f7460c7418048d32dc891a62 (diff) |
sfx2: remove the global SidebarController::maSidebarControllerContainer
This global was crashing on exit, unsurprising as it contains UNO
services that reference VCL objects.
It turns out that there is already a UNO singleton
framework::ContextChangeEventMultiplexer that effectively contains this
mapping already, so try to hook that up without creating a public API of
it, which is made quite a bit harder by framework's inexplicable
multitude of libraries.
Change-Id: I4baf67b42c630191fa8879d650eeb62520c331a5
Diffstat (limited to 'sfx2/source/sidebar')
-rw-r--r-- | sfx2/source/sidebar/SidebarController.cxx | 27 |
1 files changed, 7 insertions, 20 deletions
diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx index 403a40b443e3..38310235c7e1 100644 --- a/sfx2/source/sidebar/SidebarController.cxx +++ b/sfx2/source/sidebar/SidebarController.cxx @@ -35,6 +35,7 @@ #include <sfx2/sfxsids.hrc> #include <sfx2/titledockwin.hxx> #include "sfxlocal.hrc" +#include <framework/ContextChangeEventMultiplexerTunnel.hxx> #include <vcl/floatwin.hxx> #include <vcl/fixed.hxx> #include "splitwin.hxx" @@ -71,8 +72,6 @@ namespace namespace sfx2 { namespace sidebar { -SidebarController::SidebarControllerContainer SidebarController::maSidebarControllerContainer; - namespace { enum MenuId { @@ -150,15 +149,13 @@ SidebarController::~SidebarController() SidebarController* SidebarController::GetSidebarControllerForFrame ( const css::uno::Reference<css::frame::XFrame>& rxFrame) { - SidebarControllerContainer::iterator iEntry (maSidebarControllerContainer.find(rxFrame->getController())); - if (iEntry == maSidebarControllerContainer.end()) - return NULL; - - css::uno::Reference<XInterface> xController (iEntry->second.get()); - if ( ! xController.is()) - return NULL; + uno::Reference<ui::XContextChangeEventListener> const xListener( + framework::GetFirstListenerWith(rxFrame->getController(), + [] (uno::Reference<uno::XInterface> const& xRef) + { return nullptr != dynamic_cast<SidebarController*>(xRef.get()); } + )); - return dynamic_cast<SidebarController*>(xController.get()); + return dynamic_cast<SidebarController*>(xListener.get()); } void SidebarController::registerSidebarForFrame(SidebarController* pController, css::uno::Reference<css::frame::XController> xController) @@ -171,20 +168,10 @@ void SidebarController::registerSidebarForFrame(SidebarController* pController, xMultiplexer->addContextChangeEventListener( static_cast<css::ui::XContextChangeEventListener*>(pController), xController); - - WeakReference<SidebarController> xWeakController (pController); - maSidebarControllerContainer.insert( - SidebarControllerContainer::value_type( - xController, - xWeakController)); } void SidebarController::unregisterSidebarForFrame(SidebarController* pController, css::uno::Reference<css::frame::XController> xController) { - SidebarControllerContainer::iterator iEntry (maSidebarControllerContainer.find(xController)); - if (iEntry != maSidebarControllerContainer.end()) - maSidebarControllerContainer.erase(iEntry); - css::uno::Reference<css::ui::XContextChangeEventMultiplexer> xMultiplexer ( css::ui::ContextChangeEventMultiplexer::get( ::comphelper::getProcessComponentContext())); |