desktop/source/lib/init.cxx | 22 ---------- include/vcl/jsdialog/executor.hxx | 8 +++ include/vcl/salvtables.hxx | 2 include/vcl/weld.hxx | 4 + vcl/inc/jsdialog/jsdialogbuilder.hxx | 20 +++++++++ vcl/jsdialog/executor.cxx | 65 +++++++++++++++++++++++++++++ vcl/jsdialog/jsdialogbuilder.cxx | 76 +++++++++++++++++++++++++++++++++++ 7 files changed, 176 insertions(+), 21 deletions(-)
New commits: commit 26b45c96ca1b2c2214a88d24a08de94b712db584 Author: Szymon Kłos <szymon.k...@collabora.com> AuthorDate: Mon Nov 2 12:24:49 2020 +0100 Commit: Szymon Kłos <szymon.k...@collabora.com> CommitDate: Tue Dec 1 11:02:36 2020 +0100 jsdialog: execute checkbox action Change-Id: Ib19997f600404cc9555acbfaf87acac32f8aa5fc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106904 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Szymon Kłos <szymon.k...@collabora.com> diff --git a/include/vcl/jsdialog/executor.hxx b/include/vcl/jsdialog/executor.hxx index e49190f31e5f..5dde733a3823 100644 --- a/include/vcl/jsdialog/executor.hxx +++ b/include/vcl/jsdialog/executor.hxx @@ -22,6 +22,8 @@ public: static void trigger_changed(weld::ComboBox& rComboBox) { rComboBox.signal_changed(); } + static void trigger_toggled(weld::ToggleButton& rButton) { rButton.signal_toggled(); } + static void trigger_row_activated(weld::TreeView& rTreeView) { rTreeView.signal_row_activated(); diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index 289c68aa148e..6dcd91c97ccb 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -1126,6 +1126,8 @@ public: class VCL_DLLPUBLIC ToggleButton : virtual public Button { + friend class ::LOKTrigger; + protected: Link<ToggleButton&, void> m_aToggleHdl; TriState m_eSavedValue = TRISTATE_FALSE; diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx index dc98ba525458..a4fb7093b4bf 100644 --- a/vcl/jsdialog/executor.cxx +++ b/vcl/jsdialog/executor.cxx @@ -96,6 +96,20 @@ bool ExecuteAction(sal_uInt64 nWindowId, const OString& rWidget, StringMap& rDat } } } + else if (sControlType == "checkbox") + { + auto pCheckButton = dynamic_cast<weld::CheckButton*>(pWidget); + if (pCheckButton) + { + if (sAction == "change") + { + bool bChecked = rData["data"] == "true"; + pCheckButton->set_state(bChecked ? TRISTATE_TRUE : TRISTATE_FALSE); + LOKTrigger::trigger_toggled(*static_cast<weld::ToggleButton*>(pCheckButton)); + return true; + } + } + } else if (sControlType == "drawingarea") { auto pArea = dynamic_cast<weld::DrawingArea*>(pWidget); commit c191da8d670262db1631f98ad3c9885f8f05dc10 Author: Szymon Kłos <szymon.k...@collabora.com> AuthorDate: Fri Oct 30 10:51:08 2020 +0100 Commit: Szymon Kłos <szymon.k...@collabora.com> CommitDate: Tue Dec 1 11:02:22 2020 +0100 jsdialog: implement TreeView Change-Id: I7c1cc683e8c5d5bdc00c1e3d3d0a2c85846bbda0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106903 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Szymon Kłos <szymon.k...@collabora.com> diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index c9d5e7d1d489..4b043141e743 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -449,24 +449,6 @@ std::vector<beans::PropertyValue> desktop::jsonToPropertyValuesVector(const char } -static StringMap jsonToStringMap(const char* pJSON) -{ - StringMap aArgs; - if (pJSON && pJSON[0] != '\0') - { - std::stringstream aStream(pJSON); - boost::property_tree::ptree aTree; - boost::property_tree::read_json(aStream, aTree); - - for (const auto& rPair : aTree) - { - aArgs[OUString::fromUtf8(rPair.first.c_str())] = OUString::fromUtf8(rPair.second.get_value<std::string>(".").c_str()); - } - } - return aArgs; -} - - static boost::property_tree::ptree unoAnyToPropertyTree(const uno::Any& anyItem) { boost::property_tree::ptree aTree; @@ -3714,7 +3696,7 @@ static void doc_sendDialogEvent(LibreOfficeKitDocument* /*pThis*/, unsigned long { SolarMutexGuard aGuard; - StringMap aMap(jsonToStringMap(pArguments)); + StringMap aMap(jsdialog::jsonToStringMap(pArguments)); VclPtr<Window> pWindow = vcl::Window::FindLOKWindow(nWindowId); if (!pWindow && nWindowId >= 1000000000 /* why unsigned? */) @@ -5704,7 +5686,7 @@ static void doc_sendFormFieldEvent(LibreOfficeKitDocument* pThis, const char* pA if (doc_getDocumentType(pThis) != LOK_DOCTYPE_TEXT) return; - StringMap aMap(jsonToStringMap(pArguments)); + StringMap aMap(jsdialog::jsonToStringMap(pArguments)); ITiledRenderable* pDoc = getTiledRenderable(pThis); if (!pDoc) { diff --git a/include/vcl/jsdialog/executor.hxx b/include/vcl/jsdialog/executor.hxx index 1cfa24c28a8a..e49190f31e5f 100644 --- a/include/vcl/jsdialog/executor.hxx +++ b/include/vcl/jsdialog/executor.hxx @@ -22,6 +22,11 @@ public: static void trigger_changed(weld::ComboBox& rComboBox) { rComboBox.signal_changed(); } + static void trigger_row_activated(weld::TreeView& rTreeView) + { + rTreeView.signal_row_activated(); + } + static void trigger_clicked(weld::Toolbar& rToolbar, const OString& rIdent) { rToolbar.signal_clicked(rIdent); @@ -36,6 +41,7 @@ public: namespace jsdialog { VCL_DLLPUBLIC bool ExecuteAction(sal_uInt64 nWindowId, const OString& rWidget, StringMap& rData); +VCL_DLLPUBLIC StringMap jsonToStringMap(const char* pJSON); }; /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/include/vcl/salvtables.hxx b/include/vcl/salvtables.hxx index 7e98f133251b..ee55bb9fa081 100644 --- a/include/vcl/salvtables.hxx +++ b/include/vcl/salvtables.hxx @@ -1103,7 +1103,7 @@ public: class SalInstanceTreeView : public SalInstanceContainer, public virtual weld::TreeView { -private: +protected: // owner for UserData std::vector<std::unique_ptr<OUString>> m_aUserData; VclPtr<SvTabListBox> m_xTreeView; diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index 248bbfcd80ed..289c68aa148e 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -685,6 +685,8 @@ public: */ class VCL_DLLPUBLIC TreeView : virtual public Container { + friend class ::LOKTrigger; + public: typedef std::pair<const TreeIter&, int> iter_col; typedef std::pair<const TreeIter&, OUString> iter_string; diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 709030d0c931..86bc0020eaea 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -19,6 +19,7 @@ #include <vcl/combobox.hxx> #include <vcl/button.hxx> #include <vcl/fmtfield.hxx> +#include <vcl/svtabbx.hxx> class ToolBox; class SfxViewShell; @@ -122,6 +123,8 @@ public: bool bTakeOwnership = true) override; std::unique_ptr<weld::TextView> weld_text_view(const OString& id, bool bTakeOwnership = false) override; + std::unique_ptr<weld::TreeView> weld_tree_view(const OString& id, + bool bTakeOwnership = false) override; static weld::MessageDialog* CreateMessageDialog(weld::Widget* pParent, VclMessageType eMessageType, @@ -157,6 +160,7 @@ public: notifyDialogState(); } + using BaseInstanceClass::set_sensitive; virtual void set_sensitive(bool sensitive) override { BaseInstanceClass::set_sensitive(sensitive); @@ -303,4 +307,20 @@ public: virtual void set_text(const OUString& rText) override; }; +class JSTreeView : public JSWidget<SalInstanceTreeView, ::SvTabListBox> +{ +public: + JSTreeView(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, + ::SvTabListBox* pTextView, SalInstanceBuilder* pBuilder, bool bTakeOwnership, + std::string sTypeOfJSON); + + using SalInstanceTreeView::set_toggle; + /// pos is used differently here, it defines how many steps of iterator we need to perform to take entry + virtual void set_toggle(int pos, TriState eState, int col = -1) override; + + using SalInstanceTreeView::select; + /// pos is used differently here, it defines how many steps of iterator we need to perform to take entry + virtual void select(int pos) override; +}; + /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx index 27d61d65209a..dc98ba525458 100644 --- a/vcl/jsdialog/executor.cxx +++ b/vcl/jsdialog/executor.cxx @@ -11,9 +11,28 @@ #include <vcl/weld.hxx> #include <vcl/jsdialog/executor.hxx> #include <sal/log.hxx> +#include <rtl/uri.hxx> namespace jsdialog { +StringMap jsonToStringMap(const char* pJSON) +{ + StringMap aArgs; + if (pJSON && pJSON[0] != '\0') + { + std::stringstream aStream(pJSON); + boost::property_tree::ptree aTree; + boost::property_tree::read_json(aStream, aTree); + + for (const auto& rPair : aTree) + { + aArgs[OUString::fromUtf8(rPair.first.c_str())] + = OUString::fromUtf8(rPair.second.get_value<std::string>(".").c_str()); + } + } + return aArgs; +} + bool ExecuteAction(sal_uInt64 nWindowId, const OString& rWidget, StringMap& rData) { weld::Widget* pWidget = JSInstanceBuilder::FindWeldWidgetsMap(nWindowId, rWidget); @@ -143,6 +162,38 @@ bool ExecuteAction(sal_uInt64 nWindowId, const OString& rWidget, StringMap& rDat } } } + else if (sControlType == "treeview") + { + auto pTreeView = dynamic_cast<weld::TreeView*>(pWidget); + if (pTreeView) + { + if (sAction == "change") + { + OUString sDataJSON = rtl::Uri::decode( + rData["data"], rtl_UriDecodeMechanism::rtl_UriDecodeWithCharset, + RTL_TEXTENCODING_UTF8); + StringMap aMap(jsonToStringMap( + OUStringToOString(sDataJSON, RTL_TEXTENCODING_ASCII_US).getStr())); + + OString nRowString = OUStringToOString(aMap["row"], RTL_TEXTENCODING_ASCII_US); + int nRow = std::atoi(nRowString.getStr()); + bool bValue = aMap["value"] == "true"; + + pTreeView->set_toggle(nRow, bValue ? TRISTATE_TRUE : TRISTATE_FALSE); + + return true; + } + else if (sAction == "select") + { + OString nRowString + = OUStringToOString(rData["data"], RTL_TEXTENCODING_ASCII_US); + int nRow = std::atoi(nRowString.getStr()); + + pTreeView->select(nRow); + LOKTrigger::trigger_row_activated(*pTreeView); + } + } + } } return false; diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 827cb6aaa44d..877ebaf6e8db 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -15,6 +15,7 @@ #include <LibreOfficeKit/LibreOfficeKitEnums.h> #include <vcl/toolbox.hxx> #include <vcl/vclmedit.hxx> +#include <vcl/treelistentry.hxx> using namespace weld; @@ -46,6 +47,25 @@ void JSDialogNotifyIdle::Invoke() boost::property_tree::ptree aTree = m_aContentWindow->DumpAsPropertyTree(); aTree.put("id", m_aNotifierWindow->GetLOKWindowId()); aTree.put("jsontype", m_sTypeOfJSON); + + if (m_sTypeOfJSON == "autofilter") + { + vcl::Window* pWindow = m_aContentWindow.get(); + DockingWindow* pDockingWIndow = dynamic_cast<DockingWindow*>(pWindow); + while (pWindow && !pDockingWIndow) + { + pWindow = pWindow->GetParent(); + pDockingWIndow = dynamic_cast<DockingWindow*>(pWindow); + } + + if (pDockingWIndow) + { + Point aPos = pDockingWIndow->GetFloatingPos(); + aTree.put("posx", aPos.getX()); + aTree.put("posy", aPos.getY()); + } + } + boost::property_tree::write_json(aStream, aTree); const std::string message = aStream.str(); if (m_bForce || message != m_LastNotificationMessage) @@ -428,6 +448,21 @@ std::unique_ptr<weld::TextView> JSInstanceBuilder::weld_text_view(const OString& return pWeldWidget; } +std::unique_ptr<weld::TreeView> JSInstanceBuilder::weld_tree_view(const OString& id, + bool bTakeOwnership) +{ + SvTabListBox* pTreeView = m_xBuilder->get<SvTabListBox>(id); + auto pWeldWidget + = pTreeView ? std::make_unique<JSTreeView>(GetNotifierWindow(), GetContentWindow(), + pTreeView, this, bTakeOwnership, m_sTypeOfJSON) + : nullptr; + + if (pWeldWidget) + RememberWidget(id, pWeldWidget.get()); + + return pWeldWidget; +} + weld::MessageDialog* JSInstanceBuilder::CreateMessageDialog(weld::Widget* pParent, VclMessageType eMessageType, VclButtonsType eButtonType, @@ -710,4 +745,45 @@ void JSTextView::set_text(const OUString& rText) notifyDialogState(); } +JSTreeView::JSTreeView(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, + ::SvTabListBox* pTreeView, SalInstanceBuilder* pBuilder, bool bTakeOwnership, + std::string sTypeOfJSON) + : JSWidget<SalInstanceTreeView, ::SvTabListBox>(aNotifierWindow, aContentWindow, pTreeView, + pBuilder, bTakeOwnership, sTypeOfJSON) +{ +} + +void JSTreeView::set_toggle(int pos, TriState eState, int col) +{ + SvTreeListEntry* pEntry = m_xTreeView->GetEntry(nullptr, 0); + + while (pEntry && pos--) + pEntry = m_xTreeView->Next(pEntry); + + if (pEntry) + SalInstanceTreeView::set_toggle(pEntry, eState, col); +} + +void JSTreeView::select(int pos) +{ + assert(m_xTreeView->IsUpdateMode() && "don't select when frozen"); + disable_notify_events(); + if (pos == -1 || (pos == 0 && n_children() == 0)) + m_xTreeView->SelectAll(false); + else + { + SvTreeListEntry* pEntry = m_xTreeView->GetEntry(nullptr, 0); + + while (pEntry && pos--) + pEntry = m_xTreeView->Next(pEntry); + + if (pEntry) + { + m_xTreeView->Select(pEntry, true); + m_xTreeView->MakeVisible(pEntry); + } + } + enable_notify_events(); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits