From 80eb913d5944e88297b0734991bcf6c1cfb34463 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 Reviewed-on: https://gerrit.libreoffice.org/73520 Tested-by: Jenkins Reviewed-by: Noel Grandin --- sfx2/source/sidebar/SidebarController.cxx | 86 ++++++++++++++++++++++++---- sfx2/source/sidebar/SidebarDockingWindow.cxx | 3 +- 2 files changed, 77 insertions(+), 12 deletions(-) (limited to 'sfx2/source') diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx index 83ff4c5354c6..a0f9cbd1dae4 100644 --- a/sfx2/source/sidebar/SidebarController.cxx +++ b/sfx2/source/sidebar/SidebarController.cxx @@ -52,6 +52,7 @@ #include #include #include +#include #include #include @@ -72,6 +73,32 @@ namespace const static char gsReadOnlyCommandName[] = ".uno:EditDoc"; const static sal_Int32 gnWidthCloseThreshold (70); const static sal_Int32 gnWidthOpenThreshold (40); + + 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 { @@ -95,17 +122,18 @@ namespace { SidebarController::SidebarController ( SidebarDockingWindow* pParentWindow, - const css::uno::Reference& rxFrame) + const SfxViewFrame* pViewFrame) : SidebarControllerInterfaceBase(m_aMutex), mpCurrentDeck(), mpParentWindow(pParentWindow), + mpViewFrame(pViewFrame), + mxFrame(pViewFrame->GetFrame().GetFrameInterface()), mpTabBar(VclPtr::Create( mpParentWindow, - rxFrame, + mxFrame, [this](const 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), @@ -130,13 +158,12 @@ SidebarController::SidebarController ( mpResourceManager = std::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. @@ -710,6 +737,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->Invalidate(); @@ -1202,9 +1245,20 @@ void SidebarController::UpdateDeckOpenState() aNewSize.setWidth(mnSavedSidebarWidth); 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 @@ -1229,10 +1283,22 @@ void SidebarController::UpdateDeckOpenState() aNewSize.setWidth(nTabBarDefaultWidth); 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) mnSavedSidebarWidth = mnWidthOnSplitterButtonDown; mpParentWindow->SetStyle(mpParentWindow->GetStyle() & ~WB_SIZEABLE); diff --git a/sfx2/source/sidebar/SidebarDockingWindow.cxx b/sfx2/source/sidebar/SidebarDockingWindow.cxx index f76e71fc2d45..08b1040f523e 100644 --- a/sfx2/source/sidebar/SidebarDockingWindow.cxx +++ b/sfx2/source/sidebar/SidebarDockingWindow.cxx @@ -54,8 +54,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