summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAshod Nakashian <ashod.nakashian@collabora.co.uk>2019-10-30 06:12:26 -0400
committerMichael Meeks <michael.meeks@collabora.com>2020-05-27 21:53:01 +0100
commitc6f93e65148f8eaf437ddfe97cffce4568911ead (patch)
treec68bc1d38484afc5dc40d196e9749c30ccbbe2f4
parent8aa192de9a15d26810b5aa65048b2dc925cb0586 (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.hxx4
-rw-r--r--sfx2/source/sidebar/SidebarDockingWindow.cxx59
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();
}
}
}