From 37e7ed49996ab22ecebc05b5e6ca58bc4ed3c43f Mon Sep 17 00:00:00 2001 From: Ashod Nakashian Date: Wed, 12 Dec 2018 03:01:31 -0500 Subject: sfx: LOK: notify clients of the sidebar state Change-Id: I35b174c3a5e302ce52ee4063fa71d47feffab624 --- include/sfx2/sidebar/SidebarController.hxx | 13 ++- sd/source/ui/view/drviewse.cxx | 5 + sfx2/source/sidebar/SidebarController.cxx | 136 ++++++++++++++++++++------- sfx2/source/sidebar/SidebarDockingWindow.cxx | 3 +- 4 files changed, 112 insertions(+), 45 deletions(-) diff --git a/include/sfx2/sidebar/SidebarController.hxx b/include/sfx2/sidebar/SidebarController.hxx index 32340fe2c017..21b68f0f136c 100644 --- a/include/sfx2/sidebar/SidebarController.hxx +++ b/include/sfx2/sidebar/SidebarController.hxx @@ -28,6 +28,7 @@ #include #include #include +#include #include @@ -67,9 +68,8 @@ class SFX2_DLLPUBLIC SidebarController public SidebarControllerInterfaceBase { public: - static rtl::Reference create( - SidebarDockingWindow* pParentWindow, - const css::uno::Reference& rxFrame); + static rtl::Reference create(SidebarDockingWindow* pParentWindow, + const SfxViewFrame* pViewFrame); virtual ~SidebarController() override; SidebarController(const SidebarController&) = delete; SidebarController& operator=( const SidebarController& ) = delete; @@ -163,14 +163,13 @@ public: void FadeOut(); private: - SidebarController( - SidebarDockingWindow* pParentWindow, - const css::uno::Reference& rxFrame); + SidebarController(SidebarDockingWindow* pParentWindow, const SfxViewFrame* pViewFrame); VclPtr mpCurrentDeck; VclPtr mpParentWindow; - VclPtr mpTabBar; + const SfxViewFrame* mpViewFrame; css::uno::Reference mxFrame; + VclPtr mpTabBar; Context maCurrentContext; Context maRequestedContext; css::uno::Reference mxCurrentController; diff --git a/sd/source/ui/view/drviewse.cxx b/sd/source/ui/view/drviewse.cxx index 3bfb5bed4ece..93c3b0f9cb16 100644 --- a/sd/source/ui/view/drviewse.cxx +++ b/sd/source/ui/view/drviewse.cxx @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -997,6 +998,10 @@ void DrawViewShell::FuSupport(SfxRequest& rReq) case SID_MASTERPAGE: // BASIC { + if (comphelper::LibreOfficeKit::isActive()) + GetViewShell()->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED, + ".uno:SlideMasterPage=true"); + // AutoLayouts needs to be finished GetDoc()->StopWorkStartupDelay(); diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx index fb1d3ae17b05..e41d794eb699 100644 --- a/sfx2/source/sidebar/SidebarController.cxx +++ b/sfx2/source/sidebar/SidebarController.cxx @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -63,6 +64,32 @@ namespace const static char gsReadOnlyCommandName[] = ".uno:EditDoc"; const static sal_Int32 gnWidthCloseThreshold (70); const static sal_Int32 gnWidthOpenThreshold (40); + + static std::string UnoNameFromDeckId(const OUString& rsDeckId) + { + if (rsDeckId == "SdCustomAnimationDeck") + return ".uno:CustomAnimation"; + + if (rsDeckId == "PropertyDeck") + return ".uno:ModifyPage"; + + if (rsDeckId == "SdLayoutsDeck") + return ".uno:ModifyPage"; + + if (rsDeckId == "SdSlideTransitionDeck") + return ".uno:SlideChangeWindow"; + + if (rsDeckId == "SdAllMasterPagesDeck") + return ".uno:MasterSlidesPanel"; + + if (rsDeckId == "SdMasterPagesDeck") + return ".uno:MasterSlidesPanel"; + + if (rsDeckId == "GalleryDeck") + return ".uno:Gallery"; + + return ""; + } } namespace sfx2 { namespace sidebar { @@ -84,47 +111,48 @@ namespace { static const char gsDefaultDeckId[] = "PropertyDeck"; } -SidebarController::SidebarController ( - SidebarDockingWindow* pParentWindow, - const css::uno::Reference& rxFrame) - : SidebarControllerInterfaceBase(m_aMutex), - mpCurrentDeck(), - mpParentWindow(pParentWindow), - mpTabBar(VclPtr::Create( - mpParentWindow, - rxFrame, - [this](const ::rtl::OUString& rsDeckId) { return this->OpenThenToggleDeck(rsDeckId); }, - [this](const tools::Rectangle& rButtonBox,const ::std::vector& rMenuData) { return this->ShowPopupMenu(rButtonBox,rMenuData); }, - this)), - mxFrame(rxFrame), - maCurrentContext(OUString(), OUString()), - maRequestedContext(), - mnRequestedForceFlags(SwitchFlag_NoForce), - msCurrentDeckId(gsDefaultDeckId), - maPropertyChangeForwarder([this](){ return this->BroadcastPropertyChange(); }), - maContextChangeUpdate([this](){ return this->UpdateConfigurations(); }), - maAsynchronousDeckSwitch(), - mbIsDeckRequestedOpen(), - mbIsDeckOpen(), - mnSavedSidebarWidth(pParentWindow->GetSizePixel().Width()), - maFocusManager([this](const Panel& rPanel){ return this->ShowPanel(rPanel); }), - mxReadOnlyModeDispatch(), - mbIsDocumentReadOnly(false), - mpSplitWindow(nullptr), - mnWidthOnSplitterButtonDown(0), - mpResourceManager() +SidebarController::SidebarController(SidebarDockingWindow* pParentWindow, + const SfxViewFrame* pViewFrame) + : SidebarControllerInterfaceBase(m_aMutex) + , mpCurrentDeck() + , mpParentWindow(pParentWindow) + , mpViewFrame(pViewFrame) + , mxFrame(pViewFrame->GetFrame().GetFrameInterface()) + , mpTabBar(VclPtr::Create( + mpParentWindow, mxFrame, + [this](const ::rtl::OUString& rsDeckId) { return this->OpenThenToggleDeck(rsDeckId); }, + [this](const tools::Rectangle& rButtonBox, + const ::std::vector& rMenuData) { + return this->ShowPopupMenu(rButtonBox, rMenuData); + }, + this)) + , maCurrentContext(OUString(), OUString()) + , maRequestedContext() + , mnRequestedForceFlags(SwitchFlag_NoForce) + , msCurrentDeckId(gsDefaultDeckId) + , maPropertyChangeForwarder([this]() { return this->BroadcastPropertyChange(); }) + , maContextChangeUpdate([this]() { return this->UpdateConfigurations(); }) + , maAsynchronousDeckSwitch() + , mbIsDeckRequestedOpen() + , mbIsDeckOpen() + , mnSavedSidebarWidth(pParentWindow->GetSizePixel().Width()) + , maFocusManager([this](const Panel& rPanel) { return this->ShowPanel(rPanel); }) + , mxReadOnlyModeDispatch() + , mbIsDocumentReadOnly(false) + , mpSplitWindow(nullptr) + , mnWidthOnSplitterButtonDown(0) + , mpResourceManager() { // Decks and panel collections for this sidebar mpResourceManager = o3tl::make_unique(); } -rtl::Reference SidebarController::create( - SidebarDockingWindow* pParentWindow, - const css::uno::Reference& rxFrame) +rtl::Reference SidebarController::create(SidebarDockingWindow* pParentWindow, + const SfxViewFrame* pViewFrame) { - rtl::Reference instance( - new SidebarController(pParentWindow, rxFrame)); + rtl::Reference instance(new SidebarController(pParentWindow, pViewFrame)); + const css::uno::Reference& rxFrame = pViewFrame->GetFrame().GetFrameInterface(); registerSidebarForFrame(instance.get(), rxFrame->getController()); rxFrame->addFrameActionListener(instance.get()); // Listen for window events. @@ -698,6 +726,22 @@ void SidebarController::SwitchToDeck ( if (mpCurrentDeck) mpCurrentDeck->Hide(); + if (comphelper::LibreOfficeKit::isActive()) + { + if (const SfxViewShell* pViewShell = mpViewFrame->GetViewShell()) + { + const std::string hide = UnoNameFromDeckId(msCurrentDeckId); + if (!hide.empty()) + pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED, + (hide + "=false").c_str()); + + const std::string show = UnoNameFromDeckId(rDeckDescriptor.msId); + if (!show.empty()) + pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED, + (show + "=true").c_str()); + } + } + msCurrentDeckId = rDeckDescriptor.msId; } mpTabBar->HighlightDeck(msCurrentDeckId); @@ -1173,9 +1217,19 @@ void SidebarController::UpdateDeckOpenState() mpParentWindow->GetFloatingWindow()->SetPosSizePixel(aNewPos, aNewSize); - // Sidebar wide enought to render the menu; enable it. if (comphelper::LibreOfficeKit::isActive()) + { + // Sidebar wide enought to render the menu; enable it. mpTabBar->EnableMenuButton(true); + + if (const SfxViewShell* pViewShell = mpViewFrame->GetViewShell()) + { + const std::string uno = UnoNameFromDeckId(msCurrentDeckId); + if (!uno.empty()) + pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED, + (uno + "=true").c_str()); + } + } } } else @@ -1201,9 +1255,19 @@ void SidebarController::UpdateDeckOpenState() mpParentWindow->GetFloatingWindow()->SetPosSizePixel(aNewPos, aNewSize); - // Sidebar too narrow to render the menu; disable it. if (comphelper::LibreOfficeKit::isActive()) + { + // Sidebar too narrow to render the menu; disable it. mpTabBar->EnableMenuButton(false); + + if (const SfxViewShell* pViewShell = mpViewFrame->GetViewShell()) + { + const std::string uno = UnoNameFromDeckId(msCurrentDeckId); + if (!uno.empty()) + pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED, + (uno + "=false").c_str()); + } + } } if (mnWidthOnSplitterButtonDown > nTabBarDefaultWidth) diff --git a/sfx2/source/sidebar/SidebarDockingWindow.cxx b/sfx2/source/sidebar/SidebarDockingWindow.cxx index e6f082e523b8..4264dbb234aa 100644 --- a/sfx2/source/sidebar/SidebarDockingWindow.cxx +++ b/sfx2/source/sidebar/SidebarDockingWindow.cxx @@ -47,8 +47,7 @@ SidebarDockingWindow::SidebarDockingWindow(SfxBindings* pSfxBindings, SidebarChi else { const SfxViewFrame* pViewFrame = pSfxBindings->GetDispatcher()->GetFrame(); - const SfxFrame& rFrame = pViewFrame->GetFrame(); - mpSidebarController.set(sfx2::sidebar::SidebarController::create(this, rFrame.GetFrameInterface()).get()); + mpSidebarController.set(sfx2::sidebar::SidebarController::create(this, pViewFrame).get()); } } -- cgit v1.2.3