diff options
author | Ashod Nakashian <ashod.nakashian@collabora.co.uk> | 2019-10-30 06:12:26 -0400 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2020-05-27 21:53:01 +0100 |
commit | c6f93e65148f8eaf437ddfe97cffce4568911ead (patch) | |
tree | c68bc1d38484afc5dc40d196e9749c30ccbbe2f4 | |
parent | 8aa192de9a15d26810b5aa65048b2dc925cb0586 (diff) |
sidebars: add JSDialog support to sidebars
Currently the JSDialog path is only for mobile
and we use the passive notifications for desktop
Online.
Change-Id: I5d26fee9475ede665f269ca1f7b582455be08e50
Reviewed-on: https://gerrit.libreoffice.org/81754
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Ashod Nakashian <ashnakash@gmail.com>
-rw-r--r-- | include/sfx2/sidebar/SidebarDockingWindow.hxx | 4 | ||||
-rw-r--r-- | sfx2/source/sidebar/SidebarDockingWindow.cxx | 59 |
2 files changed, 57 insertions, 6 deletions
diff --git a/include/sfx2/sidebar/SidebarDockingWindow.hxx b/include/sfx2/sidebar/SidebarDockingWindow.hxx index d722f363e81b..c3fa3498d1fc 100644 --- a/include/sfx2/sidebar/SidebarDockingWindow.hxx +++ b/include/sfx2/sidebar/SidebarDockingWindow.hxx @@ -31,6 +31,7 @@ namespace sfx2 { namespace sidebar { class SidebarChildWindow; class SidebarController; +class SidebarNotifyIdle; class SFX2_DLLPUBLIC SidebarDockingWindow final : public SfxDockingWindow { @@ -68,6 +69,9 @@ private: void DoDispose(); const bool mbSidebarVisibleInLOK; + + const SfxViewShell* mpOldViewShell; + std::unique_ptr<SidebarNotifyIdle> mpIdleNotify; }; } } // end of namespace sfx2::sidebar diff --git a/sfx2/source/sidebar/SidebarDockingWindow.cxx b/sfx2/source/sidebar/SidebarDockingWindow.cxx index 8d5eb08b9d2b..ff0976b29ff4 100644 --- a/sfx2/source/sidebar/SidebarDockingWindow.cxx +++ b/sfx2/source/sidebar/SidebarDockingWindow.cxx @@ -31,18 +31,69 @@ #include <tools/gen.hxx> #include <vcl/event.hxx> #include <comphelper/lok.hxx> +#include <LibreOfficeKit/LibreOfficeKitEnums.h> + +#include <boost/property_tree/json_parser.hpp> using namespace css; using namespace css::uno; namespace sfx2 { namespace sidebar { +class SidebarNotifyIdle : public Idle +{ + SidebarDockingWindow &mrSidebarDockingWin; + +public: + SidebarNotifyIdle(SidebarDockingWindow &rSidebarDockingWin) : + Idle("Sidebar notify"), + mrSidebarDockingWin(rSidebarDockingWin) + { + SetPriority(TaskPriority::POST_PAINT); + } + + void Invoke() override + { + auto pNotifier = mrSidebarDockingWin.GetLOKNotifier(); + if (!pNotifier || !comphelper::LibreOfficeKit::isActive()) + return; + + try + { + if (comphelper::LibreOfficeKit::isMobile(SfxLokHelper::getView())) + { + // Mobile. + std::stringstream aStream; + boost::property_tree::write_json(aStream, mrSidebarDockingWin.DumpAsPropertyTree()); + pNotifier->libreOfficeKitViewCallback(LOK_CALLBACK_JSDIALOG, aStream.str().c_str()); + } + else + { + // On desktop use the classic notifications. + std::vector<vcl::LOKPayloadItem> aItems; + aItems.emplace_back("type", "deck"); + const Point pos = Point(mrSidebarDockingWin.GetOutOffXPixel(), + mrSidebarDockingWin.GetOutOffYPixel()); + aItems.emplace_back("position", pos.toString()); + aItems.emplace_back("size", mrSidebarDockingWin.GetSizePixel().toString()); + pNotifier->notifyWindow(mrSidebarDockingWin.GetLOKWindowId(), "created", aItems); + } + } + catch (boost::property_tree::json_parser::json_parser_error& rError) + { + SAL_WARN("sfx.sidebar", rError.message()); + } + } +}; + SidebarDockingWindow::SidebarDockingWindow(SfxBindings* pSfxBindings, SidebarChildWindow& rChildWindow, vcl::Window* pParentWindow, WinBits nBits) : SfxDockingWindow(pSfxBindings, &rChildWindow, pParentWindow, nBits) , mpSidebarController() , mbIsReadyToDrag(false) , mbSidebarVisibleInLOK(rChildWindow.IsSidebarVisibleInLOK()) + , mpOldViewShell(SfxViewShell::Current()) + , mpIdleNotify(new SidebarNotifyIdle(*this)) { // Get the XFrame from the bindings. if (pSfxBindings==nullptr || pSfxBindings->GetDispatcher()==nullptr) @@ -136,13 +187,9 @@ void SidebarDockingWindow::NotifyResize() if (mpSidebarController.is() && !GetLOKNotifier()) SetLOKNotifier(SfxViewShell::Current()); - if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier()) + if (GetLOKNotifier()) { - std::vector<vcl::LOKPayloadItem> aItems; - aItems.emplace_back("type", "deck"); - aItems.emplace_back(std::make_pair("position", Point(GetOutOffXPixel(), GetOutOffYPixel()).toString())); - aItems.emplace_back(std::make_pair("size", GetSizePixel().toString())); - pNotifier->notifyWindow(GetLOKWindowId(), "created", aItems); + mpIdleNotify->Start(); } } } |