diff options
author | Caolán McNamara <caolanm@redhat.com> | 2017-01-31 14:29:18 +0000 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2017-02-01 19:33:34 +0000 |
commit | 9f031721d7b281ef11c93da78d68f7899816094c (patch) | |
tree | 60e7a4cd791e1f320991ad3fec638da16b85aaca | |
parent | 27d641761cff82ed34987ac1f70b838f1028bc6e (diff) |
Resolves: tdf#104884 print preview replaces the frame controller
so the sidebar is listening to the old controller which has been disposed[1] so
when print preview exits and yet another controller replaces the print preview
one then the sidebar still doesn't listen to the current one.
framework broadcasts COMPONENT_DETACHING/COMPONENT_REATTACHED around these
changes, so if we listen to them we can keep attached to whatever is the
current component
[1] note that ContextChangeEventMultipler doesn't inform clients that the
controller has been disposed, this remains unchanged here
Reviewed-on: https://gerrit.libreoffice.org/33758
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
(cherry picked from commit 3e27ba70ce212642026874ba73021930a06cdbbd)
Change-Id: I141509d4a262307afd7dcfc3d77de6cdd6dbfa5f
Reviewed-on: https://gerrit.libreoffice.org/33760
Reviewed-by: Michael Stahl <mstahl@redhat.com>
Tested-by: Michael Stahl <mstahl@redhat.com>
-rw-r--r-- | include/sfx2/sidebar/SidebarController.hxx | 7 | ||||
-rw-r--r-- | sfx2/source/sidebar/SidebarController.cxx | 14 |
2 files changed, 20 insertions, 1 deletions
diff --git a/include/sfx2/sidebar/SidebarController.hxx b/include/sfx2/sidebar/SidebarController.hxx index d4cdd574191d..ca71500069e4 100644 --- a/include/sfx2/sidebar/SidebarController.hxx +++ b/include/sfx2/sidebar/SidebarController.hxx @@ -48,7 +48,8 @@ namespace css::ui::XContextChangeEventListener, css::beans::XPropertyChangeListener, css::ui::XSidebar, - css::frame::XStatusListener + css::frame::XStatusListener, + css::frame::XFrameActionListener > SidebarControllerInterfaceBase; } @@ -105,6 +106,10 @@ public: virtual void SAL_CALL statusChanged (const css::frame::FeatureStateEvent& rEvent) throw(css::uno::RuntimeException, std::exception) override; + // frame::XFrameActionListener + virtual void SAL_CALL frameAction (const css::frame::FrameActionEvent& rEvent) + throw (com::sun::star::uno::RuntimeException, std::exception) override; + // ui::XSidebar virtual void SAL_CALL requestLayout() throw(css::uno::RuntimeException, std::exception) override; diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx index 98112eb0028e..58117bd336db 100644 --- a/sfx2/source/sidebar/SidebarController.cxx +++ b/sfx2/source/sidebar/SidebarController.cxx @@ -118,6 +118,7 @@ SidebarController::SidebarController ( mpResourceManager = o3tl::make_unique<ResourceManager>(); registerSidebarForFrame(this, mxFrame->getController()); + rxFrame->addFrameActionListener(this); // Listen for window events. mpParentWindow->AddEventListener(LINK(this, SidebarController, WindowEventHandler)); @@ -184,6 +185,7 @@ void SidebarController::unregisterSidebarForFrame(SidebarController* pController void SidebarController::disposeDecks() { + SolarMutexGuard aSolarMutexGuard; mpCurrentDeck.clear(); maFocusManager.Clear(); mpResourceManager->disposeDecks(); @@ -228,6 +230,7 @@ void SAL_CALL SidebarController::disposing() if (!xController.is()) xController = mxCurrentController; + mxFrame->removeFrameActionListener(this); unregisterSidebarForFrame(this, xController); if (mxReadOnlyModeDispatch.is()) @@ -1311,6 +1314,17 @@ void SidebarController::FadeIn() mpSplitWindow->FadeIn(); } +void SidebarController::frameAction(const css::frame::FrameActionEvent& rEvent) + throw (com::sun::star::uno::RuntimeException, std::exception) +{ + if (rEvent.Frame == mxFrame) + { + if (rEvent.Action == css::frame::FrameAction_COMPONENT_DETACHING) + unregisterSidebarForFrame(this, mxFrame->getController()); + else if (rEvent.Action == css::frame::FrameAction_COMPONENT_REATTACHED) + registerSidebarForFrame(this, mxFrame->getController()); + } +} } } // end of namespace sfx2::sidebar |