/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include using namespace com::sun::star; int SfxLokHelper::createView() { SfxViewFrame* pViewFrame = SfxViewFrame::GetFirst(); if (!pViewFrame) return -1; SfxRequest aRequest(pViewFrame, SID_NEWWINDOW); pViewFrame->ExecView_Impl(aRequest); SfxViewShell* pViewShell = SfxViewShell::Current(); if (!pViewShell) return -1; return pViewShell->GetViewShellId(); } void SfxLokHelper::destroyView(int nId) { unsigned nViewShellId = nId; SfxViewShellArr_Impl& rViewArr = SfxGetpApp()->GetViewShells_Impl(); for (SfxViewShell* pViewShell : rViewArr) { if (pViewShell->GetViewShellId() == nViewShellId) { SfxViewFrame* pViewFrame = pViewShell->GetViewFrame(); SfxRequest aRequest(pViewFrame, SID_CLOSEWIN); pViewFrame->Exec_Impl(aRequest); break; } } } void SfxLokHelper::setView(int nId) { unsigned nViewShellId = nId; SfxViewShellArr_Impl& rViewArr = SfxGetpApp()->GetViewShells_Impl(); for (SfxViewShell* pViewShell : rViewArr) { if (pViewShell->GetViewShellId() == nViewShellId) { // update the current LOK language for the dialog tunneling comphelper::LibreOfficeKit::setLanguageTag(pViewShell->GetLOKLanguageTag()); if (pViewShell == SfxViewShell::Current()) return; SfxViewFrame* pViewFrame = pViewShell->GetViewFrame(); pViewFrame->MakeActive_Impl(false); // Make comphelper::dispatchCommand() find the correct frame. uno::Reference xFrame = pViewFrame->GetFrame().GetFrameInterface(); uno::Reference xDesktop = frame::Desktop::create(comphelper::getProcessComponentContext()); xDesktop->setActiveFrame(xFrame); return; } } } int SfxLokHelper::getView(SfxViewShell* pViewShell) { if (!pViewShell) pViewShell = SfxViewShell::Current(); // Still no valid view shell? Then no idea. if (!pViewShell) return -1; return pViewShell->GetViewShellId(); } std::size_t SfxLokHelper::getViewsCount() { SfxViewShellArr_Impl& rViewArr = SfxGetpApp()->GetViewShells_Impl(); return rViewArr.size(); } bool SfxLokHelper::getViewIds(int* pArray, size_t nSize) { SfxViewShellArr_Impl& rViewArr = SfxGetpApp()->GetViewShells_Impl(); if (rViewArr.size() > nSize) return false; for (std::size_t i = 0; i < rViewArr.size(); ++i) { SfxViewShell* pViewShell = rViewArr[i]; pArray[i] = pViewShell->GetViewShellId(); } return true; } void SfxLokHelper::setViewLanguage(int nId, const OUString& rBcp47LanguageTag) { SfxViewShellArr_Impl& rViewArr = SfxGetpApp()->GetViewShells_Impl(); for (SfxViewShell* pViewShell : rViewArr) { if (pViewShell->GetViewShellId() == static_cast(nId)) { pViewShell->SetLOKLanguageTag(rBcp47LanguageTag); return; } } } void SfxLokHelper::notifyOtherView(SfxViewShell* pThisView, SfxViewShell* pOtherView, int nType, const OString& rKey, const OString& rPayload) { OString aPayload = OString("{ \"viewId\": \"") + OString::number(SfxLokHelper::getView(pThisView)) + "\", \"part\": \"" + OString::number(pThisView->getPart()) + "\", \"" + rKey + "\": \"" + rPayload + "\" }"; pOtherView->libreOfficeKitViewCallback(nType, aPayload.getStr()); } void SfxLokHelper::notifyOtherViews(SfxViewShell* pThisView, int nType, const OString& rKey, const OString& rPayload) { if (SfxLokHelper::getViewsCount() <= 1) return; SfxViewShell* pViewShell = SfxViewShell::GetFirst(); while (pViewShell) { if (pViewShell != pThisView) notifyOtherView(pThisView, pViewShell, nType, rKey, rPayload); pViewShell = SfxViewShell::GetNext(*pViewShell); } } void SfxLokHelper::notifyWindow(const SfxViewShell* pThisView, vcl::LOKWindowId nLOKWindowId, const OUString& rAction, const std::vector& rPayload) { assert(pThisView); if (SfxLokHelper::getViewsCount() <= 0 || nLOKWindowId == 0) return; OString aPayload = OString("{ \"id\": \"") + OString::number(nLOKWindowId) + OString("\""); aPayload += OString(", \"action\": \"") + OUStringToOString(rAction, RTL_TEXTENCODING_UTF8).getStr() + OString("\""); for (const auto& rItem: rPayload) { if (!rItem.first.isEmpty() && !rItem.second.isEmpty()) { aPayload += OString(", \"") + rItem.first + OString("\": \"") + rItem.second + OString("\""); } } aPayload += "}"; pThisView->libreOfficeKitViewCallback(LOK_CALLBACK_WINDOW, aPayload.getStr()); } void SfxLokHelper::notifyInvalidation(SfxViewShell* pThisView, const OString& rPayload) { std::stringstream ss; ss << rPayload.getStr(); if (comphelper::LibreOfficeKit::isPartInInvalidation()) ss << ", " << pThisView->getPart(); OString aPayload = ss.str().c_str(); pThisView->libreOfficeKitViewCallback(LOK_CALLBACK_INVALIDATE_TILES, aPayload.getStr()); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */