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)