summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorTamás Zolnai <tamas.zolnai@collabora.com>2021-01-21 12:12:53 +0100
committerTamás Zolnai <tamas.zolnai@collabora.com>2021-01-22 15:45:02 +0100
commitf5097bfa60451f39b761c7d7b415937d560d52fa (patch)
tree98f46c33cdf6d4ff0ab7ff6bee63c16225b7c6dd /sc
parentbfe856e7cb191888b723e6bb115242dc6d73d334 (diff)
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@gmail.com> Reviewed-by: Tamás Zolnai <tamas.zolnai@collabora.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/source/ui/drawfunc/chartsh.cxx45
-rw-r--r--sc/source/ui/inc/chartsh.hxx4
-rw-r--r--sc/source/ui/view/tabvwsh4.cxx24
3 files changed, 70 insertions, 3 deletions
diff --git a/sc/source/ui/drawfunc/chartsh.cxx b/sc/source/ui/drawfunc/chartsh.cxx
index b70ce15e57c2..75cfad0a52c7 100644
--- a/sc/source/ui/drawfunc/chartsh.cxx
+++ b/sc/source/ui/drawfunc/chartsh.cxx
@@ -29,6 +29,9 @@
#include <viewdata.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>
@@ -37,6 +40,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()
@@ -48,6 +64,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 72e68c5e0514..ee279ceec064 100644
--- a/sc/source/ui/view/tabvwsh4.cxx
+++ b/sc/source/ui/view/tabvwsh4.cxx
@@ -86,9 +86,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);
@@ -204,9 +219,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)