summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2022-07-19 17:20:17 +0300
committerMike Kaganski <mike.kaganski@collabora.com>2022-07-28 07:37:43 +0200
commit7ba40c7d62c7c15f9c0e9cbc21b48f105454b885 (patch)
tree5afb6c32a28f807d3181d183a5a6fe17737dc44d
parent30e08c83e502562966351f4236e9dd9230ffa435 (diff)
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 <mike.kaganski@collabora.com>
-rw-r--r--chart2/source/controller/main/ChartController.cxx4
-rw-r--r--include/sfx2/sidebar/SidebarController.hxx5
-rw-r--r--sfx2/source/sidebar/SidebarController.cxx35
-rw-r--r--starmath/source/view.cxx32
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<sfx2::sidebar::SidebarController*>(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<ui::XSidebar> xSidebar = getSidebarFromModel(getChartModel());
if (sfx2::sidebar::SidebarController* pSidebar = dynamic_cast<sfx2::sidebar::SidebarController*>(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<css::frame::XFrame>& rxFrame);
- static void registerSidebarForFrame(SidebarController* pController, const css::uno::Reference<css::frame::XController>& xFrame);
+ void registerSidebarForFrame(const css::uno::Reference<css::frame::XController>& xFrame);
- static void unregisterSidebarForFrame(SidebarController* pController, const css::uno::Reference<css::frame::XController>& xFrame);
+ void unregisterSidebarForFrame(const css::uno::Reference<css::frame::XController>& 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<TabBar::DeckMenuData>& 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> SidebarController::create(SidebarDockingWindow
rtl::Reference<SidebarController> instance(new SidebarController(pParentWindow, pViewFrame));
const css::uno::Reference<css::frame::XFrame>& 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<SidebarController*>(xListener.get());
}
-void SidebarController::registerSidebarForFrame(SidebarController* pController, const css::uno::Reference<css::frame::XController>& xController)
+void SidebarController::registerSidebarForFrame(const css::uno::Reference<css::frame::XController>& xController)
{
// Listen for context change events.
css::uno::Reference<css::ui::XContextChangeEventMultiplexer> xMultiplexer (
css::ui::ContextChangeEventMultiplexer::get(
::comphelper::getProcessComponentContext()));
xMultiplexer->addContextChangeEventListener(
- static_cast<css::ui::XContextChangeEventListener*>(pController),
+ static_cast<css::ui::XContextChangeEventListener*>(this),
xController);
}
-void SidebarController::unregisterSidebarForFrame(SidebarController* pController, const css::uno::Reference<css::frame::XController>& xController)
+void SidebarController::unregisterSidebarForFrame(const css::uno::Reference<css::frame::XController>& xController)
{
- pController->saveDeckState();
- pController->disposeDecks();
+ saveDeckState();
+ disposeDecks();
css::uno::Reference<css::ui::XContextChangeEventMultiplexer> xMultiplexer (
css::ui::ContextChangeEventMultiplexer::get(
::comphelper::getProcessComponentContext()));
xMultiplexer->removeContextChangeEventListener(
- static_cast<css::ui::XContextChangeEventListener*>(pController),
+ static_cast<css::ui::XContextChangeEventListener*>(this),
xController);
}
@@ -328,7 +329,7 @@ void SidebarController::disposing(std::unique_lock<std::mutex>&)
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<css::ui::XSidebar>
-getSidebarFromModel(const css::uno::Reference<css::frame::XModel>& xModel)
-{
- css::uno::Reference<css::container::XChild> xChild(xModel, css::uno::UNO_QUERY);
- if (!xChild.is())
- return nullptr;
-
- css::uno::Reference<css::frame::XModel> xParent(xChild->getParent(), css::uno::UNO_QUERY);
- if (!xParent.is())
- return nullptr;
-
- css::uno::Reference<css::frame::XController2> xController(xParent->getCurrentController(),
- css::uno::UNO_QUERY);
- if (!xController.is())
- return nullptr;
-
- css::uno::Reference<css::ui::XSidebarProvider> 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<sfx2::sidebar::SidebarController*>(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: