diff options
author | Tamás Zolnai <tamas.zolnai@collabora.com> | 2021-01-21 12:12:53 +0100 |
---|---|---|
committer | Tamás Zolnai <tamas.zolnai@collabora.com> | 2021-01-25 14:57:16 +0100 |
commit | ce95ce5d871f06da490bbd47e91ce48073128e79 (patch) | |
tree | cdd241e218e3de5866a7856197b8d0b3535ac968 /sc | |
parent | ec7ea311671928d0b66989aaa0542be902d85c3c (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>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109897
Tested-by: Jenkins
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/ui/drawfunc/chartsh.cxx | 45 | ||||
-rw-r--r-- | sc/source/ui/inc/chartsh.hxx | 4 | ||||
-rw-r--r-- | sc/source/ui/view/tabvwsh4.cxx | 24 |
3 files changed, 70 insertions, 3 deletions
diff --git a/sc/source/ui/drawfunc/chartsh.cxx b/sc/source/ui/drawfunc/chartsh.cxx index 25b66b0fb7e2..95b06385335e 100644 --- a/sc/source/ui/drawfunc/chartsh.cxx +++ b/sc/source/ui/drawfunc/chartsh.cxx @@ -29,14 +29,30 @@ #include <viewdata.hxx> #include <drawview.hxx> #include <gridwin.hxx> +#include <sfx2/sidebar/SidebarController.hxx> +#include <tabvwsh.hxx> #define ShellClass_ScChartShell #include <scslots.hxx> using namespace css::uno; +using namespace sfx2::sidebar; namespace drawing = com::sun::star::drawing; +namespace { + +bool inChartContext(ScTabViewShell* pViewShell) +{ + SidebarController* pSidebar = SidebarController::GetSidebarControllerForView(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& rData) : ScDrawShell(rData) diff --git a/sc/source/ui/inc/chartsh.hxx b/sc/source/ui/inc/chartsh.hxx index fc2ee32b0d0e..44000af245da 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& rData); virtual ~ScChartShell() override; diff --git a/sc/source/ui/view/tabvwsh4.cxx b/sc/source/ui/view/tabvwsh4.cxx index bb7ba06e840a..cb13072d0edc 100644 --- a/sc/source/ui/view/tabvwsh4.cxx +++ b/sc/source/ui/view/tabvwsh4.cxx @@ -83,8 +83,23 @@ #include <comphelper/flagguard.hxx> #include <LibreOfficeKit/LibreOfficeKitEnums.h> #include <comphelper/lok.hxx> +#include <sfx2/sidebar/SidebarController.hxx> using namespace com::sun::star; +using namespace sfx2::sidebar; + +namespace { + +bool inChartContext(ScTabViewShell* pViewShell) +{ + SidebarController* pSidebar = SidebarController::GetSidebarControllerForView(pViewShell); + if (pSidebar) + return pSidebar->hasChartContextCurrently(); + + return false; +} + +} // anonymous namespace void ScTabViewShell::Activate(bool bMDI) { @@ -201,9 +216,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) |