include/sfx2/sidebar/SidebarController.hxx | 7 ++++++- sfx2/source/sidebar/SidebarController.cxx | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-)
New commits: commit 9f031721d7b281ef11c93da78d68f7899816094c Author: Caolán McNamara <[email protected]> Date: Tue Jan 31 14:29:18 2017 +0000 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 <[email protected]> Tested-by: Caolán McNamara <[email protected]> (cherry picked from commit 3e27ba70ce212642026874ba73021930a06cdbbd) Change-Id: I141509d4a262307afd7dcfc3d77de6cdd6dbfa5f Reviewed-on: https://gerrit.libreoffice.org/33760 Reviewed-by: Michael Stahl <[email protected]> Tested-by: Michael Stahl <[email protected]> diff --git a/include/sfx2/sidebar/SidebarController.hxx b/include/sfx2/sidebar/SidebarController.hxx index d4cdd57..ca71500 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 98112eb..58117bd 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
_______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
