vcl/inc/jsdialog/jsdialogbuilder.hxx |    2 
 vcl/jsdialog/executor.cxx            |    7 +++
 vcl/jsdialog/jsdialogbuilder.cxx     |   75 +++++++++++++++++++++++------------
 3 files changed, 59 insertions(+), 25 deletions(-)

New commits:
commit af0f610f90b315c20773c39579b70fb6e456412b
Author:     Szymon Kłos <szymon.k...@collabora.com>
AuthorDate: Tue Aug 8 06:56:14 2023 +0200
Commit:     Szymon Kłos <szymon.k...@collabora.com>
CommitDate: Tue Aug 29 13:51:45 2023 +0200

    jsdialog: rendering of custom entries in combobox
    
    Change-Id: I22cca2e89c38d927a21a39886b795f42c1546afc
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155854
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>
    Reviewed-by: Szymon Kłos <szymon.k...@collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/156243
    Tested-by: Jenkins

diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx 
b/vcl/inc/jsdialog/jsdialogbuilder.hxx
index e4aa60558438..dc6e04c3eb4e 100644
--- a/vcl/inc/jsdialog/jsdialogbuilder.hxx
+++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx
@@ -620,6 +620,8 @@ public:
     virtual void set_entry_text(const OUString& rText) override;
     virtual void set_active(int pos) override;
     virtual bool changed_by_direct_pick() const override;
+
+    void render_entry(int pos);
 };
 
 class JSNotebook final : public JSWidget<SalInstanceNotebook, ::TabControl>
diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx
index 25e1af80b324..57a1c4db22d8 100644
--- a/vcl/jsdialog/executor.cxx
+++ b/vcl/jsdialog/executor.cxx
@@ -129,6 +129,13 @@ bool ExecuteAction(const OUString& nWindowId, const 
OUString& rWidget, StringMap
                     LOKTrigger::trigger_changed(*pCombobox);
                     return true;
                 }
+                else if (sAction == "render_entry")
+                {
+                    auto pJSCombobox = dynamic_cast<JSComboBox*>(pWidget);
+                    if (pJSCombobox)
+                        
pJSCombobox->render_entry(o3tl::toInt32(rData["data"]));
+                    return true;
+                }
             }
         }
         else if (sControlType == "pushbutton")
diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx
index 34b28184cc16..40f014d7cdc5 100644
--- a/vcl/jsdialog/jsdialogbuilder.cxx
+++ b/vcl/jsdialog/jsdialogbuilder.cxx
@@ -7,25 +7,35 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  */
 
+#include <boost/property_tree/json_parser.hpp>
+
+#include <comphelper/base64.hxx>
+#include <comphelper/lok.hxx>
+#include <cppuhelper/supportsservice.hxx>
+
 #include <jsdialog/jsdialogbuilder.hxx>
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+#include <memory>
+#include <messagedialog.hxx>
+#include <o3tl/deleter.hxx>
 #include <sal/log.hxx>
-#include <comphelper/lok.hxx>
+
+#include <tools/json_writer.hxx>
+#include <tools/stream.hxx>
+
 #include <utility>
+
+#include <vcl/cvtgrf.hxx>
+#include <vcl/jsdialog/executor.hxx>
 #include <vcl/tabpage.hxx>
+#include <vcl/toolbox.hxx>
 #include <vcl/toolkit/button.hxx>
-#include <vcl/toolkit/dialog.hxx>
-#include <LibreOfficeKit/LibreOfficeKitEnums.h>
 #include <vcl/toolkit/combobox.hxx>
-#include <messagedialog.hxx>
-#include <tools/json_writer.hxx>
-#include <o3tl/deleter.hxx>
-#include <memory>
-#include <vcl/toolbox.hxx>
-#include <vcl/toolkit/vclmedit.hxx>
-#include <boost/property_tree/json_parser.hpp>
+#include <vcl/toolkit/dialog.hxx>
 #include <vcl/toolkit/treelistentry.hxx>
-#include <vcl/jsdialog/executor.hxx>
-#include <cppuhelper/supportsservice.hxx>
+#include <vcl/toolkit/vclmedit.hxx>
+
+#include <verticaltabctrl.hxx>
 #include <wizdlg.hxx>
 
 static std::map<OUString, vcl::Window*>& GetLOKPopupsMap()
@@ -95,17 +105,6 @@ void JSDialogNotifyIdle::send(tools::JsonWriter& 
aJsonWriter)
     }
 }
 
-namespace
-{
-OUString extractActionType(const jsdialog::ActionDataMap& rData)
-{
-    auto it = rData.find(ACTION_TYPE);
-    if (it != rData.end())
-        return it->second;
-    return "";
-}
-};
-
 void JSDialogNotifyIdle::sendMessage(jsdialog::MessageType eType, 
VclPtr<vcl::Window> pWindow,
                                      std::unique_ptr<jsdialog::ActionDataMap> 
pData)
 {
@@ -119,8 +118,8 @@ void JSDialogNotifyIdle::sendMessage(jsdialog::MessageType 
eType, VclPtr<vcl::Wi
     {
         if (it->m_eType == eType && it->m_pWindow == pWindow)
         {
-            if (it->m_pData && pData
-                && extractActionType(*it->m_pData) != 
extractActionType(*pData))
+            // actions should be always sent, eg. renrering of custom entries 
in combobox
+            if (eType == jsdialog::MessageType::Action)
             {
                 it++;
                 continue;
@@ -1662,6 +1661,32 @@ void JSComboBox::set_active(int pos)
 
 bool JSComboBox::changed_by_direct_pick() const { return true; }
 
+void JSComboBox::render_entry(int pos)
+{
+    ScopedVclPtrInstance<VirtualDevice> pDevice;
+    Size aRenderSize = signal_custom_get_size(*pDevice);
+    pDevice->SetOutputSize(aRenderSize);
+
+    signal_custom_render(*pDevice, tools::Rectangle(Point(0, 0), aRenderSize), 
false, get_id(pos));
+
+    BitmapEx aImage = pDevice->GetBitmapEx(Point(0, 0), aRenderSize);
+
+    SvMemoryStream aOStm(65535, 65535);
+    if (GraphicConverter::Export(aOStm, aImage, ConvertDataFormat::PNG) == 
ERRCODE_NONE)
+    {
+        css::uno::Sequence<sal_Int8> aSeq(static_cast<sal_Int8 
const*>(aOStm.GetData()),
+                                          aOStm.Tell());
+        OUStringBuffer aBuffer("data:image/png;base64,");
+        ::comphelper::Base64::encode(aBuffer, aSeq);
+
+        std::unique_ptr<jsdialog::ActionDataMap> pMap = 
std::make_unique<jsdialog::ActionDataMap>();
+        (*pMap)[ACTION_TYPE] = "rendered_combobox_entry";
+        (*pMap)["pos"] = OUString::number(pos);
+        (*pMap)["image"] = aBuffer;
+        sendAction(std::move(pMap));
+    }
+}
+
 JSNotebook::JSNotebook(JSDialogSender* pSender, ::TabControl* pControl,
                        SalInstanceBuilder* pBuilder, bool bTakeOwnership)
     : JSWidget<SalInstanceNotebook, ::TabControl>(pSender, pControl, pBuilder, 
bTakeOwnership)

Reply via email to