[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.2' - include/sfx2 sc/source sfx2/source

Tamás Zolnai (via logerrit) logerrit at kemper.freedesktop.org
Mon Jan 25 13:35:00 UTC 2021


 include/sfx2/sidebar/SidebarController.hxx |    2 +
 include/sfx2/sidebar/Tools.hxx             |    5 +++
 sc/source/ui/drawfunc/chartsh.cxx          |   45 +++++++++++++++++++++++++++++
 sc/source/ui/inc/chartsh.hxx               |    4 ++
 sc/source/ui/view/tabvwsh4.cxx             |   24 +++++++++++++--
 sfx2/source/sidebar/SidebarController.cxx  |    5 +++
 sfx2/source/sidebar/Tools.cxx              |   28 ++++++++++++++++++
 7 files changed, 110 insertions(+), 3 deletions(-)

New commits:
commit 5864fcba2d7d285cb0f8628b0c24d0f31deb2ab0
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Thu Jan 21 12:12:53 2021 +0100
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Mon Jan 25 14:34:26 2021 +0100

    tdf#139830: keep the right sidebar context for chart after view switch (calc).
    
    There is a general behavior to switch to the default sidebar context
    by view deactivation and switch back to the right context by view
    activation. See SfxShell::Activate() and SfxShell::Deactivate().
    By activation, we use the selection to find out the right sidebar
    context. See GetContextForSelection_SC() method for example. However,
    for charts, this does not work, because the chart window is a separate
    environment and the shell does not know what is selected inside the
    chart window. So let's avoid context switches when we have a chart
    window active. Let the chart controller handle sidebar context changes.
    
    Change-Id: I272ee5c35ac30221eed2930201c4710a9a5877c4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109790
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Tamás Zolnai <tamas.zolnai at collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109901

diff --git a/include/sfx2/sidebar/SidebarController.hxx b/include/sfx2/sidebar/SidebarController.hxx
index 92a063c9f403..36d1b7400bbb 100644
--- a/include/sfx2/sidebar/SidebarController.hxx
+++ b/include/sfx2/sidebar/SidebarController.hxx
@@ -173,6 +173,8 @@ public:
 
     void SyncUpdate();
 
+    bool hasChartContextCurrently() const;
+
 private:
     SidebarController(SidebarDockingWindow* pParentWindow, const SfxViewFrame* pViewFrame);
 
diff --git a/include/sfx2/sidebar/Tools.hxx b/include/sfx2/sidebar/Tools.hxx
index 854de39e62da..341ac90868ac 100644
--- a/include/sfx2/sidebar/Tools.hxx
+++ b/include/sfx2/sidebar/Tools.hxx
@@ -30,9 +30,12 @@
 #include <com/sun/star/frame/XFrame.hpp>
 #include <com/sun/star/util/URL.hpp>
 
+class SfxViewShell;
 
 namespace sfx2 { namespace sidebar {
 
+class SidebarController;
+
 class SFX2_DLLPUBLIC Tools
 {
 public:
@@ -55,6 +58,8 @@ public:
 
     static OUString GetModuleName (
         const css::uno::Reference<css::frame::XController>& rxFrame);
+
+    static sfx2::sidebar::SidebarController* GetSidebarController(SfxViewShell* pViewShell);
 };
 
 
diff --git a/sc/source/ui/drawfunc/chartsh.cxx b/sc/source/ui/drawfunc/chartsh.cxx
index 9ab065d3fa80..aef434988ccb 100644
--- a/sc/source/ui/drawfunc/chartsh.cxx
+++ b/sc/source/ui/drawfunc/chartsh.cxx
@@ -36,6 +36,9 @@
 #include <docpool.hxx>
 #include <drawview.hxx>
 #include <gridwin.hxx>
+#include <sfx2/sidebar/SidebarController.hxx>
+#include <sfx2/sidebar/Tools.hxx>
+#include <tabvwsh.hxx>
 
 #define ShellClass_ScChartShell
 #include <scslots.hxx>
@@ -44,6 +47,19 @@ using namespace css::uno;
 
 namespace drawing = com::sun::star::drawing;
 
+namespace {
+
+bool inChartContext(ScTabViewShell* pViewShell)
+{
+    sfx2::sidebar::SidebarController* pSidebar = sfx2::sidebar::Tools::GetSidebarController(pViewShell);
+    if (pSidebar)
+        return pSidebar->hasChartContextCurrently();
+
+    return false;
+}
+
+} // anonymous namespace
+
 SFX_IMPL_INTERFACE(ScChartShell, ScDrawShell)
 
 void ScChartShell::InitInterface_Impl()
@@ -55,6 +71,35 @@ void ScChartShell::InitInterface_Impl()
     GetStaticInterface()->RegisterPopupMenu("oleobject");
 }
 
+void ScChartShell::Activate(bool bMDI)
+{
+    if(!inChartContext(GetViewData()->GetViewShell()))
+        ScDrawShell::Activate(bMDI);
+    else
+    {
+        // Avoid context changes for chart during activation / deactivation.
+        const bool bIsContextBroadcasterEnabled (SfxShell::SetContextBroadcasterEnabled(false));
+
+        SfxShell::Activate(bMDI);
+
+        SfxShell::SetContextBroadcasterEnabled(bIsContextBroadcasterEnabled);
+    }
+}
+
+void ScChartShell::Deactivate(bool bMDI)
+{
+    if(!inChartContext(GetViewData()->GetViewShell()))
+        ScDrawShell::Deactivate(bMDI);
+    else
+    {
+        // Avoid context changes for chart during activation / deactivation.
+        const bool bIsContextBroadcasterEnabled (SfxShell::SetContextBroadcasterEnabled(false));
+
+        SfxShell::Deactivate(bMDI);
+
+        SfxShell::SetContextBroadcasterEnabled(bIsContextBroadcasterEnabled);
+    }
+}
 
 ScChartShell::ScChartShell(ScViewData* pData) :
     ScDrawShell(pData)
diff --git a/sc/source/ui/inc/chartsh.hxx b/sc/source/ui/inc/chartsh.hxx
index caa5a89f14f3..d0b007ba87d8 100644
--- a/sc/source/ui/inc/chartsh.hxx
+++ b/sc/source/ui/inc/chartsh.hxx
@@ -36,6 +36,10 @@ private:
     /// SfxInterface initializer.
     static void InitInterface_Impl();
 
+protected:
+    virtual void Activate(bool bMDI) override;
+    virtual void Deactivate(bool bMDI) override;
+
 public:
     ScChartShell(ScViewData* pData);
     virtual ~ScChartShell() override;
diff --git a/sc/source/ui/view/tabvwsh4.cxx b/sc/source/ui/view/tabvwsh4.cxx
index ec912c115848..6df7cdcc279e 100644
--- a/sc/source/ui/view/tabvwsh4.cxx
+++ b/sc/source/ui/view/tabvwsh4.cxx
@@ -101,9 +101,24 @@
 #include <comphelper/flagguard.hxx>
 #include <LibreOfficeKit/LibreOfficeKitEnums.h>
 #include <comphelper/lok.hxx>
+#include <sfx2/sidebar/SidebarController.hxx>
+#include <sfx2/sidebar/Tools.hxx>
 
 using namespace com::sun::star;
 
+namespace {
+
+bool inChartContext(ScTabViewShell* pViewShell)
+{
+    sfx2::sidebar::SidebarController* pSidebar = sfx2::sidebar::Tools::GetSidebarController(pViewShell);
+    if (pSidebar)
+        return pSidebar->hasChartContextCurrently();
+
+    return false;
+}
+
+} // anonymous namespace
+
 void ScTabViewShell::Activate(bool bMDI)
 {
     SfxViewShell::Activate(bMDI);
@@ -214,9 +229,12 @@ void ScTabViewShell::Activate(bool bMDI)
     //  don't call CheckSelectionTransfer here - activating a view should not change the
     //  primary selection (may be happening just because the mouse was moved over the window)
 
-    ContextChangeEventMultiplexer::NotifyContextChange(
-        GetController(),
-        vcl::EnumContext::Context::Default);
+    if (!inChartContext(this))
+    {
+        ContextChangeEventMultiplexer::NotifyContextChange(
+            GetController(),
+            vcl::EnumContext::Context::Default);
+    }
 }
 
 void ScTabViewShell::Deactivate(bool bMDI)
diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx
index ac3bd38f1743..e6a1cc2fb2c2 100644
--- a/sfx2/source/sidebar/SidebarController.cxx
+++ b/sfx2/source/sidebar/SidebarController.cxx
@@ -1600,6 +1600,11 @@ void SidebarController::frameAction(const css::frame::FrameActionEvent& rEvent)
     }
 }
 
+bool SidebarController::hasChartContextCurrently() const
+{
+    return GetCurrentContext().msApplication == "com.sun.star.chart2.ChartDocument";
+}
+
 } } // end of namespace sfx2::sidebar
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/sidebar/Tools.cxx b/sfx2/source/sidebar/Tools.cxx
index dcd90eb29d3b..da25f6dbfbd7 100644
--- a/sfx2/source/sidebar/Tools.cxx
+++ b/sfx2/source/sidebar/Tools.cxx
@@ -24,10 +24,14 @@
 #include <comphelper/processfactory.hxx>
 #include <vcl/commandinfoprovider.hxx>
 #include <vcl/gradient.hxx>
+#include <sfx2/viewsh.hxx>
 
 #include <com/sun/star/frame/XDispatchProvider.hpp>
 #include <com/sun/star/util/URLTransformer.hpp>
 #include <com/sun/star/frame/ModuleManager.hpp>
+#include <sfx2/sidebar/SidebarController.hxx>
+#include <com/sun/star/ui/XSidebarProvider.hpp>
+#include <com/sun/star/frame/XController2.hpp>
 
 #include <cstring>
 
@@ -135,6 +139,30 @@ OUString Tools::GetModuleName (
     return OUString();
 }
 
+sfx2::sidebar::SidebarController* Tools::GetSidebarController(SfxViewShell* pViewShell)
+{
+    if (!pViewShell)
+        return nullptr;
+
+    Reference<css::frame::XController2> xController(pViewShell->GetController(), UNO_QUERY);
+    if (!xController.is())
+        return nullptr;
+
+    // Make sure there is a model behind the controller, otherwise getSidebar() can crash.
+    if (!xController->getModel().is())
+        return nullptr;
+
+    Reference<css::ui::XSidebarProvider> xSidebarProvider = xController->getSidebar();
+    if (!xSidebarProvider.is())
+        return nullptr;
+
+    Reference<css::ui::XSidebar> xSidebar = xSidebarProvider->getSidebar();
+    if (!xSidebar.is())
+        return nullptr;
+
+    return dynamic_cast<sfx2::sidebar::SidebarController*>(xSidebar.get());
+}
+
 } } // end of namespace sfx2::sidebar
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list