include/vcl/svapp.hxx                |    2 
 include/vcl/weld.hxx                 |    2 
 sfx2/source/dialog/basedlgs.cxx      |    7 ++-
 vcl/Library_vcl.mk                   |    1 
 vcl/inc/jsdialog/jsdialogbuilder.hxx |   31 +++++++++++++++
 vcl/inc/salvtables.hxx               |    4 -
 vcl/jsdialog/jsdialogbuilder.cxx     |   72 +++++++++++++++++++++++++++++++++++
 vcl/source/app/weldutils.cxx         |    4 -
 vcl/source/window/builder.cxx        |   17 +++++++-
 9 files changed, 131 insertions(+), 9 deletions(-)

New commits:
commit a76116c867380836080adc86bc37c2248778825d
Author:     Szymon Kłos <szymon.k...@collabora.com>
AuthorDate: Tue Feb 18 15:41:56 2020 +0100
Commit:     Szymon Kłos <szymon.k...@collabora.com>
CommitDate: Mon May 18 22:08:05 2020 +0200

    Create weld::Builder implementation for JSDialog
    
    and use for WordCountDialog on mobile
    
    Change-Id: I12c3455ff9b16c30918067f9282b72f49141a308
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94041
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Szymon Kłos <szymon.k...@collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94055
    Tested-by: Jenkins

diff --git a/include/vcl/svapp.hxx b/include/vcl/svapp.hxx
index b450043767f7..48a764b80125 100644
--- a/include/vcl/svapp.hxx
+++ b/include/vcl/svapp.hxx
@@ -1328,7 +1328,7 @@ public:
     // For vclbootstrapprotector:
     static void setDeInitHook(Link<LinkParamNone*,void> const & hook);
 
-    static weld::Builder* CreateBuilder(weld::Widget* pParent, const OUString 
&rUIFile);
+    static weld::Builder* CreateBuilder(weld::Widget* pParent, const OUString 
&rUIFile, bool bMobile = false);
     static weld::Builder* CreateInterimBuilder(vcl::Window* pParent, const 
OUString &rUIFile); //for the duration of vcl parent windows
 
     static weld::MessageDialog* CreateMessageDialog(weld::Widget* pParent, 
VclMessageType eMessageType,
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 684c70885231..fd734309d6a9 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -2305,7 +2305,7 @@ protected:
 
 public:
     GenericDialogController(weld::Widget* pParent, const OUString& rUIFile,
-                            const OString& rDialogId);
+                            const OString& rDialogId, bool bMobile = false);
     virtual Dialog* getDialog() override;
     virtual ~GenericDialogController() COVERITY_NOEXCEPT_FALSE override;
 };
diff --git a/sfx2/source/dialog/basedlgs.cxx b/sfx2/source/dialog/basedlgs.cxx
index 4bf16c55927e..d0cafa6926e2 100644
--- a/sfx2/source/dialog/basedlgs.cxx
+++ b/sfx2/source/dialog/basedlgs.cxx
@@ -29,6 +29,8 @@
 #include <sfx2/childwin.hxx>
 #include <sfx2/viewsh.hxx>
 #include <workwin.hxx>
+#include <sfx2/lokhelper.hxx>
+#include <comphelper/lok.hxx>
 
 using namespace ::com::sun::star::uno;
 
@@ -200,7 +202,10 @@ void SfxModelessDialogController::Close()
 
 SfxDialogController::SfxDialogController(weld::Widget* pParent, const 
OUString& rUIFile,
                                          const OString& rDialogId)
-    : GenericDialogController(pParent, rUIFile, rDialogId)
+    : GenericDialogController(pParent, rUIFile, rDialogId,
+                                    comphelper::LibreOfficeKit::isActive()
+                                    && SfxViewShell::Current()
+                                    && 
SfxViewShell::Current()->isLOKMobilePhone())
 {
     m_xDialog->SetInstallLOKNotifierHdl(LINK(this, SfxDialogController, 
InstallLOKNotifierHdl));
     m_xDialog->connect_toplevel_focus_changed(LINK(this, SfxDialogController, 
FocusChangeHdl));
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index 65f65b525f4c..35590174946e 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -472,6 +472,7 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\
     vcl/backendtest/outputdevice/polyline \
     vcl/backendtest/outputdevice/polyline_b2d \
     vcl/backendtest/outputdevice/rectangle \
+    vcl/jsdialog/jsdialogbuilder \
 ))
 
 $(eval $(call gb_Library_add_cobjects,vcl,\
diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx 
b/vcl/inc/jsdialog/jsdialogbuilder.hxx
new file mode 100644
index 000000000000..9d8c68516320
--- /dev/null
+++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx
@@ -0,0 +1,31 @@
+#ifndef INCLUDED_VCL_INC_JSDIALOG_JSDIALOG_HXX
+#define INCLUDED_VCL_INC_JSDIALOG_JSDIALOG_HXX
+
+#include <vcl/weld.hxx>
+#include <comphelper/string.hxx>
+#include <vcl/sysdata.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/builder.hxx>
+#include <salvtables.hxx>
+
+class VCL_DLLPUBLIC JSInstanceBuilder : public SalInstanceBuilder
+{
+public:
+    JSInstanceBuilder(weld::Widget* pParent, const OUString& rUIRoot, const 
OUString& rUIFile);
+    virtual std::unique_ptr<weld::Dialog> weld_dialog(const OString& id,
+                                                      bool bTakeOwnership = 
true) override;
+    virtual std::unique_ptr<weld::Label> weld_label(const OString& id,
+                                                    bool bTakeOwnership = 
false) override;
+};
+
+class VCL_DLLPUBLIC JSLabel : public SalInstanceLabel
+{
+    VclPtr<vcl::Window> m_aOwnedToplevel;
+
+public:
+    JSLabel(VclPtr<vcl::Window> aOwnedToplevel, FixedText* pLabel, 
SalInstanceBuilder* pBuilder,
+            bool bTakeOwnership);
+    virtual void set_label(const OUString& rText) override;
+};
+
+#endif
\ No newline at end of file
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx
index 628b4b707c34..c95f093c898f 100644
--- a/vcl/inc/salvtables.hxx
+++ b/vcl/inc/salvtables.hxx
@@ -26,7 +26,7 @@
 
 class SalInstanceBuilder : public weld::Builder
 {
-private:
+protected:
     std::unique_ptr<VclBuilder> m_xBuilder;
     VclPtr<vcl::Window> m_aOwnedToplevel;
 
@@ -393,7 +393,7 @@ public:
     SystemWindow* getSystemWindow();
 };
 
-class SalInstanceLabel final : public SalInstanceWidget, public virtual 
weld::Label
+class SalInstanceLabel : public SalInstanceWidget, public virtual weld::Label
 {
 private:
     // Control instead of FixedText so we can also use this for
diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx
new file mode 100644
index 000000000000..1d751ea42847
--- /dev/null
+++ b/vcl/jsdialog/jsdialogbuilder.cxx
@@ -0,0 +1,72 @@
+#include <jsdialog/jsdialogbuilder.hxx>
+#include <sal/log.hxx>
+#include <boost/property_tree/json_parser.hpp>
+#include <comphelper/lok.hxx>
+#include <vcl/toolkit/dialog.hxx>
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+
+using namespace weld;
+
+JSInstanceBuilder::JSInstanceBuilder(weld::Widget* pParent, const OUString& 
rUIRoot,
+                                     const OUString& rUIFile)
+    : SalInstanceBuilder(dynamic_cast<SalInstanceWidget*>(pParent)
+                             ? 
dynamic_cast<SalInstanceWidget*>(pParent)->getWidget()
+                             : nullptr,
+                         rUIRoot, rUIFile)
+{
+}
+
+std::unique_ptr<weld::Dialog> JSInstanceBuilder::weld_dialog(const OString& 
id, bool bTakeOwnership)
+{
+    ::Dialog* pDialog = m_xBuilder->get<::Dialog>(id);
+    std::unique_ptr<weld::Dialog> pRet(pDialog ? new 
SalInstanceDialog(pDialog, this, false)
+                                               : nullptr);
+    if (bTakeOwnership && pDialog)
+    {
+        assert(!m_aOwnedToplevel && "only one toplevel per .ui allowed");
+        m_aOwnedToplevel.set(pDialog);
+        m_xBuilder->drop_ownership(pDialog);
+    }
+
+    const vcl::ILibreOfficeKitNotifier* pNotifier = pDialog->GetLOKNotifier();
+    if (pNotifier)
+    {
+        std::stringstream aStream;
+        boost::property_tree::ptree aTree = 
m_aOwnedToplevel->DumpAsPropertyTree();
+        aTree.put("id", m_aOwnedToplevel->GetLOKWindowId());
+        boost::property_tree::write_json(aStream, aTree);
+        const std::string message = aStream.str();
+        pNotifier->libreOfficeKitViewCallback(LOK_CALLBACK_JSDIALOG, 
message.c_str());
+    }
+
+    return pRet;
+}
+
+std::unique_ptr<weld::Label> JSInstanceBuilder::weld_label(const OString& id, 
bool bTakeOwnership)
+{
+    ::FixedText* pLabel = m_xBuilder->get<FixedText>(id);
+    return std::make_unique<JSLabel>(m_aOwnedToplevel, pLabel, this, 
bTakeOwnership);
+}
+
+JSLabel::JSLabel(VclPtr<vcl::Window> aOwnedToplevel, FixedText* pLabel,
+                 SalInstanceBuilder* pBuilder, bool bTakeOwnership)
+    : SalInstanceLabel(pLabel, pBuilder, bTakeOwnership)
+    , m_aOwnedToplevel(aOwnedToplevel)
+{
+}
+
+void JSLabel::set_label(const OUString& rText)
+{
+    SalInstanceLabel::set_label(rText);
+
+    const vcl::ILibreOfficeKitNotifier* pNotifier = 
m_aOwnedToplevel->GetLOKNotifier();
+    if (pNotifier)
+    {
+        std::stringstream aStream;
+        boost::property_tree::ptree aTree = 
m_aOwnedToplevel->DumpAsPropertyTree();
+        aTree.put("id", m_aOwnedToplevel->GetLOKWindowId());
+        boost::property_tree::write_json(aStream, aTree);
+        const std::string message = aStream.str();
+        pNotifier->libreOfficeKitViewCallback(LOK_CALLBACK_JSDIALOG, 
message.c_str());
+    }
+};
diff --git a/vcl/source/app/weldutils.cxx b/vcl/source/app/weldutils.cxx
index 19f6464052d6..69562cf0d8c7 100644
--- a/vcl/source/app/weldutils.cxx
+++ b/vcl/source/app/weldutils.cxx
@@ -40,8 +40,8 @@ DialogController::~DialogController() COVERITY_NOEXCEPT_FALSE 
{}
 Dialog* GenericDialogController::getDialog() { return m_xDialog.get(); }
 
 GenericDialogController::GenericDialogController(weld::Widget* pParent, const 
OUString& rUIFile,
-                                                 const OString& rDialogId)
-    : m_xBuilder(Application::CreateBuilder(pParent, rUIFile))
+                                                 const OString& rDialogId, 
bool bMobile)
+    : m_xBuilder(Application::CreateBuilder(pParent, rUIFile, bMobile))
     , m_xDialog(m_xBuilder->weld_dialog(rDialogId))
 {
 }
diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx
index 6189412ac8b9..03f9de9926bd 100644
--- a/vcl/source/window/builder.cxx
+++ b/vcl/source/window/builder.cxx
@@ -68,6 +68,8 @@
 #include <tools/diagnose_ex.h>
 #include <wizdlg.hxx>
 #include <tools/svlibrary.h>
+#include <comphelper/lok.hxx>
+#include <jsdialog/jsdialogbuilder.hxx>
 
 #if defined(DISABLE_DYNLOADING) || defined(LINUX)
 #include <dlfcn.h>
@@ -151,9 +153,20 @@ namespace
 }
 #endif
 
-weld::Builder* Application::CreateBuilder(weld::Widget* pParent, const 
OUString &rUIFile)
+weld::Builder* Application::CreateBuilder(weld::Widget* pParent, const 
OUString &rUIFile, bool bMobile)
 {
-    return ImplGetSVData()->mpDefInst->CreateBuilder(pParent, 
VclBuilderContainer::getUIRootDir(), rUIFile);
+    bool bUseJSBuilder = false;
+
+    if (bMobile)
+    {
+        if (rUIFile == "modules/swriter/ui/wordcount-mobile.ui")
+            bUseJSBuilder = true;
+    }
+
+    if (bUseJSBuilder)
+        return new JSInstanceBuilder(pParent, 
VclBuilderContainer::getUIRootDir(), rUIFile);
+    else
+        return ImplGetSVData()->mpDefInst->CreateBuilder(pParent, 
VclBuilderContainer::getUIRootDir(), rUIFile);
 }
 
 weld::Builder* Application::CreateInterimBuilder(vcl::Window* pParent, const 
OUString &rUIFile)
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to