diff options
author | Szymon Kłos <szymon.klos@collabora.com> | 2020-03-06 11:11:57 +0100 |
---|---|---|
committer | Szymon Kłos <szymon.klos@collabora.com> | 2020-06-20 20:36:25 +0200 |
commit | 292d9519bd368db69920cf0f8b94e0e51c3d14a1 (patch) | |
tree | 4d4220e44833022ee72e36d85b9ce93f603fa1c7 | |
parent | 5c44f1ef779bf196f874f47c14d2d0c7f58fbb2e (diff) |
jsdialog: remember weld instances
Change-Id: Ie55e0fcd2307679aee52751b2d2e434393850418
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94302
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96735
Tested-by: Jenkins
-rw-r--r-- | desktop/source/lib/init.cxx | 16 | ||||
-rw-r--r-- | include/vcl/jsdialog/jsdialogbuilder.hxx | 7 | ||||
-rw-r--r-- | include/vcl/weld.hxx | 3 | ||||
-rw-r--r-- | vcl/jsdialog/jsdialogbuilder.cxx | 85 |
4 files changed, 81 insertions, 30 deletions
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 8bbec959b44f..357111d220af 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -3588,7 +3588,6 @@ static void doc_sendDialogEvent(LibreOfficeKitDocument* /*pThis*/, unsigned nWin StringMap aMap(jsonToStringMap(pArguments)); VclPtr<Window> pWindow = vcl::Window::FindLOKWindow(nWindowId); - JSInstanceBuilder* pBuilder = JSInstanceBuilder::FindLOKWeldBuilder(nWindowId); if (!pWindow && nWindowId >= 1000000000 /* why unsigned? */) pWindow = getSidebarWindow(); @@ -3610,18 +3609,20 @@ static void doc_sendDialogEvent(LibreOfficeKitDocument* /*pThis*/, unsigned nWin try { - bool bIsWeldedDialog = pBuilder != nullptr; + OString sControlId = OUStringToOString(aMap["id"], RTL_TEXTENCODING_ASCII_US); + weld::Widget* pWidget = JSInstanceBuilder::FindWeldWidgetsMap(nWindowId, sControlId); + + bool bIsWeldedDialog = pWidget != nullptr; bool bContinueWithLOKWindow = false; if (bIsWeldedDialog) { - OString sControlId = OUStringToOString(aMap["id"], RTL_TEXTENCODING_ASCII_US); OUString sControlType = aMap["type"]; OUString sAction = aMap["cmd"]; if (sControlType == "tabcontrol") { - auto pNotebook = pBuilder->weld_notebook(sControlId, false); + auto pNotebook = dynamic_cast<weld::Notebook*>(pWidget); if (pNotebook) { if (sAction == "selecttab") @@ -3637,7 +3638,7 @@ static void doc_sendDialogEvent(LibreOfficeKitDocument* /*pThis*/, unsigned nWin } else if (sControlType == "combobox") { - auto pCombobox = pBuilder->weld_combo_box(sControlId, false); + auto pCombobox = dynamic_cast<weld::ComboBox*>(pWidget); if (pCombobox) { if (sAction == "selected") @@ -3651,6 +3652,11 @@ static void doc_sendDialogEvent(LibreOfficeKitDocument* /*pThis*/, unsigned nWin pCombobox->set_active(pos); } } + else if (sAction == "change") + { + pCombobox->set_entry_text(aMap["data"]); + pCombobox->signal_changed(); + } else bContinueWithLOKWindow = true; } diff --git a/include/vcl/jsdialog/jsdialogbuilder.hxx b/include/vcl/jsdialog/jsdialogbuilder.hxx index 382623a83da6..f57d3da7ec7f 100644 --- a/include/vcl/jsdialog/jsdialogbuilder.hxx +++ b/include/vcl/jsdialog/jsdialogbuilder.hxx @@ -10,6 +10,7 @@ #include <vcl/button.hxx> class ComboBox; +typedef std::map<OString, weld::Widget*> WidgetMap; class JSDialogSender { @@ -28,6 +29,9 @@ class VCL_DLLPUBLIC JSInstanceBuilder : public SalInstanceBuilder { vcl::LOKWindowId m_nWindowId; + static std::map<vcl::LOKWindowId, WidgetMap>& GetLOKWeldWidgetsMap(); + void RememberWidget(const OString& id, weld::Widget* pWidget); + public: JSInstanceBuilder(weld::Widget* pParent, const OUString& rUIRoot, const OUString& rUIFile); virtual ~JSInstanceBuilder() override; @@ -44,8 +48,7 @@ public: virtual std::unique_ptr<weld::Notebook> weld_notebook(const OString& id, bool bTakeOwnership = false) override; - static std::map<vcl::LOKWindowId, JSInstanceBuilder*>& GetLOKWeldBuilderMap(); - static JSInstanceBuilder* FindLOKWeldBuilder(vcl::LOKWindowId nWindowId); + static weld::Widget* FindWeldWidgetsMap(vcl::LOKWindowId nWindowId, const OString& rWidget); }; template <class BaseInstanceClass, class VclClass> diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index dc73addd0c10..e14c2c0d5ed3 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -613,7 +613,6 @@ protected: Link<ComboBox&, bool> m_aEntryActivateHdl; Link<OUString&, bool> m_aEntryInsertTextHdl; - void signal_changed() { m_aChangeHdl.Call(*this); } virtual void signal_popup_toggled() { m_aPopupToggledHdl.Call(*this); } Link<render_args, void> m_aRenderHdl; @@ -627,6 +626,8 @@ protected: Size signal_custom_get_size(vcl::RenderContext& rDevice) { return m_aGetSizeHdl.Call(rDevice); } public: + void signal_changed() { m_aChangeHdl.Call(*this); } + virtual void insert(int pos, const OUString& rStr, const OUString* pId, const OUString* pIconName, VirtualDevice* pImageSurface) = 0; diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 5cb4132fc8f8..21c678739d88 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -37,33 +37,48 @@ JSInstanceBuilder::JSInstanceBuilder(weld::Widget* pParent, const OUString& rUIR JSInstanceBuilder::~JSInstanceBuilder() { if (m_nWindowId) - GetLOKWeldBuilderMap().erase(m_nWindowId); + GetLOKWeldWidgetsMap().erase(m_nWindowId); } -std::map<vcl::LOKWindowId, JSInstanceBuilder*>& JSInstanceBuilder::GetLOKWeldBuilderMap() +std::map<vcl::LOKWindowId, WidgetMap>& JSInstanceBuilder::GetLOKWeldWidgetsMap() { - // Map to remember the LOKWindowId <-> Builder binding. - static std::map<vcl::LOKWindowId, JSInstanceBuilder*> s_aLOKWeldBuildersMap; + // Map to remember the LOKWindowId <-> weld widgets binding. + static std::map<vcl::LOKWindowId, WidgetMap> s_aLOKWeldBuildersMap; return s_aLOKWeldBuildersMap; } -JSInstanceBuilder* JSInstanceBuilder::FindLOKWeldBuilder(vcl::LOKWindowId nWindowId) +weld::Widget* JSInstanceBuilder::FindWeldWidgetsMap(vcl::LOKWindowId nWindowId, + const OString& rWidget) { - const auto it = GetLOKWeldBuilderMap().find(nWindowId); - if (it != GetLOKWeldBuilderMap().end()) - return it->second; + const auto it = GetLOKWeldWidgetsMap().find(nWindowId); + if (it != GetLOKWeldWidgetsMap().end()) + { + auto widgetIt = it->second.find(rWidget); + if (widgetIt != it->second.end()) + return widgetIt->second; + } return nullptr; } +void JSInstanceBuilder::RememberWidget(const OString& id, weld::Widget* pWidget) +{ + auto it = GetLOKWeldWidgetsMap().find(m_nWindowId); + if (it != GetLOKWeldWidgetsMap().end()) + { + it->second.insert(WidgetMap::value_type(id, pWidget)); + } +} + std::unique_ptr<weld::Dialog> JSInstanceBuilder::weld_dialog(const OString& id, bool bTakeOwnership) { ::Dialog* pDialog = m_xBuilder->get<::Dialog>(id); m_nWindowId = pDialog->GetLOKWindowId(); - GetLOKWeldBuilderMap().insert( - std::map<vcl::LOKWindowId, JSInstanceBuilder*>::value_type(m_nWindowId, this)); + WidgetMap map; + GetLOKWeldWidgetsMap().insert( + std::map<vcl::LOKWindowId, WidgetMap>::value_type(m_nWindowId, map)); std::unique_ptr<weld::Dialog> pRet(pDialog ? new SalInstanceDialog(pDialog, this, false) : nullptr); @@ -91,21 +106,32 @@ std::unique_ptr<weld::Dialog> JSInstanceBuilder::weld_dialog(const OString& id, 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); + auto pWeldWidget = std::make_unique<JSLabel>(m_aOwnedToplevel, pLabel, this, bTakeOwnership); + + RememberWidget(id, pWeldWidget.get()); + return pWeldWidget; } std::unique_ptr<weld::Button> JSInstanceBuilder::weld_button(const OString& id, bool bTakeOwnership) { ::Button* pButton = m_xBuilder->get<::Button>(id); - return pButton ? std::make_unique<JSButton>(m_aOwnedToplevel, pButton, this, bTakeOwnership) - : nullptr; + auto pWeldWidget + = pButton ? std::make_unique<JSButton>(m_aOwnedToplevel, pButton, this, bTakeOwnership) + : nullptr; + + RememberWidget(id, pWeldWidget.get()); + return pWeldWidget; } std::unique_ptr<weld::Entry> JSInstanceBuilder::weld_entry(const OString& id, bool bTakeOwnership) { Edit* pEntry = m_xBuilder->get<Edit>(id); - return pEntry ? std::make_unique<JSEntry>(m_aOwnedToplevel, pEntry, this, bTakeOwnership) - : nullptr; + auto pWeldWidget + = pEntry ? std::make_unique<JSEntry>(m_aOwnedToplevel, pEntry, this, bTakeOwnership) + : nullptr; + + RememberWidget(id, pWeldWidget.get()); + return pWeldWidget; } std::unique_ptr<weld::ComboBox> JSInstanceBuilder::weld_combo_box(const OString& id, @@ -113,20 +139,35 @@ std::unique_ptr<weld::ComboBox> JSInstanceBuilder::weld_combo_box(const OString& { vcl::Window* pWidget = m_xBuilder->get<vcl::Window>(id); ::ComboBox* pComboBox = dynamic_cast<::ComboBox*>(pWidget); + std::unique_ptr<weld::ComboBox> pWeldWidget; + if (pComboBox) - return std::make_unique<JSComboBox>(m_aOwnedToplevel, pComboBox, this, bTakeOwnership); - ListBox* pListBox = dynamic_cast<ListBox*>(pWidget); - return pListBox ? std::make_unique<JSListBox>(m_aOwnedToplevel, pListBox, this, bTakeOwnership) - : nullptr; + { + pWeldWidget + = std::make_unique<JSComboBox>(m_aOwnedToplevel, pComboBox, this, bTakeOwnership); + } + else + { + ListBox* pListBox = dynamic_cast<ListBox*>(pWidget); + pWeldWidget = pListBox ? std::make_unique<JSListBox>(m_aOwnedToplevel, pListBox, this, + bTakeOwnership) + : nullptr; + } + + RememberWidget(id, pWeldWidget.get()); + return pWeldWidget; } std::unique_ptr<weld::Notebook> JSInstanceBuilder::weld_notebook(const OString& id, bool bTakeOwnership) { TabControl* pNotebook = m_xBuilder->get<TabControl>(id); - return pNotebook - ? std::make_unique<JSNotebook>(m_aOwnedToplevel, pNotebook, this, bTakeOwnership) - : nullptr; + auto pWeldWidget = pNotebook ? std::make_unique<JSNotebook>(m_aOwnedToplevel, pNotebook, this, + bTakeOwnership) + : nullptr; + + RememberWidget(id, pWeldWidget.get()); + return pWeldWidget; } JSLabel::JSLabel(VclPtr<vcl::Window> aOwnedToplevel, FixedText* pLabel, |