From 7ba40c7d62c7c15f9c0e9cbc21b48f105454b885 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Tue, 19 Jul 2022 17:20:17 +0300 Subject: lok: Properly update sidebar context in Math Change-Id: I830c0d9bdeaa6340283eafc3e91251d02602d7aa Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137247 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- chart2/source/controller/main/ChartController.cxx | 4 +-- include/sfx2/sidebar/SidebarController.hxx | 5 ++-- sfx2/source/sidebar/SidebarController.cxx | 35 +++++++++++++++-------- starmath/source/view.cxx | 32 +-------------------- 4 files changed, 29 insertions(+), 47 deletions(-) diff --git a/chart2/source/controller/main/ChartController.cxx b/chart2/source/controller/main/ChartController.cxx index a4bd7a3972cc..54c91a6147dd 100644 --- a/chart2/source/controller/main/ChartController.cxx +++ b/chart2/source/controller/main/ChartController.cxx @@ -379,7 +379,7 @@ void SAL_CALL ChartController::attachFrame( { auto pSidebar = dynamic_cast(xSidebar.get()); assert(pSidebar); - sfx2::sidebar::SidebarController::registerSidebarForFrame(pSidebar, this); + pSidebar->registerSidebarForFrame(this); pSidebar->updateModel(getChartModel()); css::lang::EventObject aEvent; mpSelectionChangeHandler->selectionChanged(aEvent); @@ -745,7 +745,7 @@ void SAL_CALL ChartController::dispose() uno::Reference xSidebar = getSidebarFromModel(getChartModel()); if (sfx2::sidebar::SidebarController* pSidebar = dynamic_cast(xSidebar.get())) { - sfx2::sidebar::SidebarController::unregisterSidebarForFrame(pSidebar, this); + pSidebar->unregisterSidebarForFrame(this); } } diff --git a/include/sfx2/sidebar/SidebarController.hxx b/include/sfx2/sidebar/SidebarController.hxx index e996c853c5b0..208af98b2fc2 100644 --- a/include/sfx2/sidebar/SidebarController.hxx +++ b/include/sfx2/sidebar/SidebarController.hxx @@ -78,9 +78,9 @@ public: static SidebarController* GetSidebarControllerForFrame ( const css::uno::Reference& rxFrame); - static void registerSidebarForFrame(SidebarController* pController, const css::uno::Reference& xFrame); + void registerSidebarForFrame(const css::uno::Reference& xFrame); - static void unregisterSidebarForFrame(SidebarController* pController, const css::uno::Reference& xFrame); + void unregisterSidebarForFrame(const css::uno::Reference& xFrame); // ui::XContextChangeEventListener virtual void SAL_CALL notifyContextChangeEvent (const css::ui::ContextChangeEventObject& rEvent) override; @@ -170,6 +170,7 @@ public: void SyncUpdate(); + // Used to avoid wrong context update when an embedded object activation is in progress bool hasChartOrMathContextCurrently() const; static SidebarController* GetSidebarControllerForView(const SfxViewShell* pViewShell); diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx index 6909f5c19d62..4384482e6740 100644 --- a/sfx2/source/sidebar/SidebarController.cxx +++ b/sfx2/source/sidebar/SidebarController.cxx @@ -120,6 +120,7 @@ SidebarController::SidebarController ( const ::std::vector& rMenuData) { return this->ShowPopupMenu(rMainMenu, rSubMenu, rMenuData); }, this)), maCurrentContext(OUString(), OUString()), + maRequestedContext(OUString(), OUString()), mnRequestedForceFlags(SwitchFlag_NoForce), mbMinimumSidebarWidth(officecfg::Office::UI::Sidebar::General::MinimumWidth::get()), msCurrentDeckId(gsDefaultDeckId), @@ -143,7 +144,7 @@ rtl::Reference SidebarController::create(SidebarDockingWindow rtl::Reference instance(new SidebarController(pParentWindow, pViewFrame)); const css::uno::Reference& rxFrame = pViewFrame->GetFrame().GetFrameInterface(); - registerSidebarForFrame(instance.get(), rxFrame->getController()); + instance->registerSidebarForFrame(rxFrame->getController()); rxFrame->addFrameActionListener(instance); // Listen for window events. instance->mpParentWindow->AddEventListener(LINK(instance.get(), SidebarController, WindowEventHandler)); @@ -190,27 +191,27 @@ SidebarController* SidebarController::GetSidebarControllerForFrame ( return dynamic_cast(xListener.get()); } -void SidebarController::registerSidebarForFrame(SidebarController* pController, const css::uno::Reference& xController) +void SidebarController::registerSidebarForFrame(const css::uno::Reference& xController) { // Listen for context change events. css::uno::Reference xMultiplexer ( css::ui::ContextChangeEventMultiplexer::get( ::comphelper::getProcessComponentContext())); xMultiplexer->addContextChangeEventListener( - static_cast(pController), + static_cast(this), xController); } -void SidebarController::unregisterSidebarForFrame(SidebarController* pController, const css::uno::Reference& xController) +void SidebarController::unregisterSidebarForFrame(const css::uno::Reference& xController) { - pController->saveDeckState(); - pController->disposeDecks(); + saveDeckState(); + disposeDecks(); css::uno::Reference xMultiplexer ( css::ui::ContextChangeEventMultiplexer::get( ::comphelper::getProcessComponentContext())); xMultiplexer->removeContextChangeEventListener( - static_cast(pController), + static_cast(this), xController); } @@ -328,7 +329,7 @@ void SidebarController::disposing(std::unique_lock&) if (!xController.is()) xController = mxCurrentController; - unregisterSidebarForFrame(this, xController); + unregisterSidebarForFrame(xController); } void SAL_CALL SidebarController::notifyContextChangeEvent (const css::ui::ContextChangeEventObject& rEvent) @@ -548,6 +549,8 @@ void SidebarController::UpdateConfigurations() (maCurrentContext.msApplication != maRequestedContext.msApplication)) { OUString sLastActiveDeck = mpResourceManager->GetLastActiveDeck( maRequestedContext ); + if (comphelper::LibreOfficeKit::isActive() && sLastActiveDeck == "PropertyDeck" && maRequestedContext.msApplication == "com.sun.star.formula.FormulaProperties") + sLastActiveDeck = "ElementsDeck"; // Manual override for lok if (!sLastActiveDeck.isEmpty()) msCurrentDeckId = sLastActiveDeck; } @@ -1591,9 +1594,9 @@ void SidebarController::frameAction(const css::frame::FrameActionEvent& rEvent) if (rEvent.Frame == mxFrame) { if (rEvent.Action == css::frame::FrameAction_COMPONENT_DETACHING) - unregisterSidebarForFrame(this, mxFrame->getController()); + unregisterSidebarForFrame(mxFrame->getController()); else if (rEvent.Action == css::frame::FrameAction_COMPONENT_REATTACHED) - registerSidebarForFrame(this, mxFrame->getController()); + registerSidebarForFrame(mxFrame->getController()); } } @@ -1609,10 +1612,18 @@ void SidebarController::saveDeckState() } } +static bool isChartOrMathContext(const Context& context) +{ + return context.msApplication == "com.sun.star.chart2.ChartDocument" + || context.msApplication == "com.sun.star.formula.FormulaProperties"; +} + bool SidebarController::hasChartOrMathContextCurrently() const { - return GetCurrentContext().msApplication == "com.sun.star.chart2.ChartDocument" - || GetCurrentContext().msApplication == "com.sun.star.formula.FormulaProperties"; + if ((maRequestedContext != maCurrentContext) && isChartOrMathContext(maRequestedContext)) + return true; // We are not yet changed, but in the process + + return isChartOrMathContext(maCurrentContext); } sfx2::sidebar::SidebarController* SidebarController::GetSidebarControllerForView(const SfxViewShell* pViewShell) diff --git a/starmath/source/view.cxx b/starmath/source/view.cxx index 56896a030572..71dd3bc53946 100644 --- a/starmath/source/view.cxx +++ b/starmath/source/view.cxx @@ -2099,29 +2099,6 @@ void SmViewShell::GetState(SfxItemSet &rSet) namespace { -css::uno::Reference -getSidebarFromModel(const css::uno::Reference& xModel) -{ - css::uno::Reference xChild(xModel, css::uno::UNO_QUERY); - if (!xChild.is()) - return nullptr; - - css::uno::Reference xParent(xChild->getParent(), css::uno::UNO_QUERY); - if (!xParent.is()) - return nullptr; - - css::uno::Reference xController(xParent->getCurrentController(), - css::uno::UNO_QUERY); - if (!xController.is()) - return nullptr; - - css::uno::Reference xSidebarProvider = xController->getSidebar(); - if (!xSidebarProvider.is()) - return nullptr; - - return xSidebarProvider->getSidebar(); -} - class SmController : public SfxBaseController { public: @@ -2141,14 +2118,7 @@ public: SfxBaseController::attachFrame(xFrame); // No need to call mpSelectionChangeHandler->Connect() unless SmController implements XSelectionSupplier - if (auto xSidebar = getSidebarFromModel(getModel())) - { - auto pSidebar = dynamic_cast(xSidebar.get()); - assert(pSidebar); - sfx2::sidebar::SidebarController::registerSidebarForFrame(pSidebar, this); - pSidebar->updateModel(getModel()); - mpSelectionChangeHandler->selectionChanged({}); // Installs the correct context - } + mpSelectionChangeHandler->selectionChanged({}); // Installs the correct context } private: -- cgit v1.2.3