compilerplugins/clang/badstatics.cxx | 1 desktop/source/lib/init.cxx | 126 +++++++++++++++++++++--------- include/vcl/jsdialog/jsdialogbuilder.hxx | 33 +++++++ include/vcl/salvtables.hxx | 2 include/vcl/weld.hxx | 2 vcl/jsdialog/jsdialogbuilder.cxx | 130 ++++++++++++++++++++++++++++--- vcl/source/app/salvtables.cxx | 2 vcl/source/window/builder.cxx | 2 8 files changed, 246 insertions(+), 52 deletions(-)
New commits: commit ca9fb8ca376b14bf64397f0e80b05d129b00b4be Author: Szymon Kłos <szymon.k...@collabora.com> AuthorDate: Fri Mar 6 11:11:57 2020 +0100 Commit: Szymon Kłos <eszka...@gmail.com> CommitDate: Mon May 18 17:52:21 2020 +0200 jsdialog: remember weld instances Change-Id: Ie55e0fcd2307679aee52751b2d2e434393850418 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94302 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 d4050c4def8d..bd5cdc9a937b 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -3552,7 +3552,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(); @@ -3574,18 +3573,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") @@ -3601,7 +3602,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") @@ -3615,6 +3616,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 b26b2ac2ff16..e0d4bc2dcdc1 100644 --- a/include/vcl/jsdialog/jsdialogbuilder.hxx +++ b/include/vcl/jsdialog/jsdialogbuilder.hxx @@ -10,6 +10,8 @@ #include <vcl/combobox.hxx> #include <vcl/button.hxx> +typedef std::map<OString, weld::Widget*> WidgetMap; + class JSDialogSender { VclPtr<vcl::Window> m_aOwnedToplevel; @@ -27,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; @@ -43,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 6e719fd23239..5e63e7bd9804 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -576,10 +576,10 @@ protected: Link<ComboBox&, bool> m_aEntryActivateHdl; Link<OUString&, bool> m_aEntryInsertTextHdl; +public: void signal_changed() { m_aChangeHdl.Call(*this); } virtual void signal_popup_toggled() { m_aPopupToggledHdl.Call(*this); } -public: 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 901f92aac109..da9f04fe4044 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, commit 425d861812d218df35619624af949fde00a6ad50 Author: Szymon Kłos <szymon.k...@collabora.com> AuthorDate: Thu Mar 5 12:24:27 2020 +0100 Commit: Szymon Kłos <eszka...@gmail.com> CommitDate: Mon May 18 17:52:21 2020 +0200 jsdialog: execute actions using weld wrapper Change-Id: Ib9e1b52742b489e812e0756b364a7f7ac62f84ad Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94300 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 7fbd42371fc6..d4050c4def8d 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -154,6 +154,7 @@ #include <vcl/abstdlg.hxx> #include <tools/diagnose_ex.h> #include <vcl/uitest/uiobject.hxx> +#include <vcl/jsdialog/jsdialogbuilder.hxx> // Needed for getUndoManager() #include <com/sun/star/document/XUndoManager.hpp> @@ -3551,6 +3552,7 @@ 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(); @@ -3572,53 +3574,101 @@ static void doc_sendDialogEvent(LibreOfficeKitDocument* /*pThis*/, unsigned nWin try { - WindowUIObject aUIObject(pWindow); - std::unique_ptr<UIObject> pUIWindow(aUIObject.get_child(aMap["id"])); - if (pUIWindow) { - bool bIsClickAction = false; + bool bIsWeldedDialog = pBuilder != nullptr; + bool bContinueWithLOKWindow = false; - if (aMap.find("cmd") != aMap.end()) { - if (aMap["cmd"] == "selected") - { - aMap["POS"] = aMap["data"]; - aMap["TEXT"] = aMap["data"]; + if (bIsWeldedDialog) + { + OString sControlId = OUStringToOString(aMap["id"], RTL_TEXTENCODING_ASCII_US); + OUString sControlType = aMap["type"]; + OUString sAction = aMap["cmd"]; - pUIWindow->execute(sSelectAction, aMap); - } - else if (aMap["cmd"] == "plus") - { - pUIWindow->execute(sUpAction, aMap); - } - else if (aMap["cmd"] == "minus") - { - pUIWindow->execute(sDownAction, aMap); - } - else if (aMap["cmd"] == "set") + if (sControlType == "tabcontrol") + { + auto pNotebook = pBuilder->weld_notebook(sControlId, false); + if (pNotebook) { - aMap["TEXT"] = aMap["data"]; + if (sAction == "selecttab") + { + OString pageId = OUStringToOString(aMap["data"], RTL_TEXTENCODING_ASCII_US); + int page = std::atoi(pageId.getStr()); - pUIWindow->execute(sClearAction, aMap); - pUIWindow->execute(sTypeAction, aMap); + pNotebook->set_current_page(page); + } + else + bContinueWithLOKWindow = true; } - else if (aMap["cmd"] == "value") + } + else if (sControlType == "combobox") + { + auto pCombobox = pBuilder->weld_combo_box(sControlId, false); + if (pCombobox) { - aMap["VALUE"] = aMap["data"]; - pUIWindow->execute(sValue, aMap); + if (sAction == "selected") + { + int separatorPos = aMap["data"].indexOf(';'); + if (separatorPos) + { + OUString entryPos = aMap["data"].copy(0, separatorPos); + OString posString = OUStringToOString(entryPos, RTL_TEXTENCODING_ASCII_US); + int pos = std::atoi(posString.getStr()); + pCombobox->set_active(pos); + } + } + else + bContinueWithLOKWindow = true; } - else if (aMap["cmd"] == "selecttab") - { - aMap["POS"] = aMap["data"]; + } + else + { + bContinueWithLOKWindow = true; + } + } + + if (!bIsWeldedDialog || bContinueWithLOKWindow) + { + WindowUIObject aUIObject(pWindow); + std::unique_ptr<UIObject> pUIWindow(aUIObject.get_child(aMap["id"])); + if (pUIWindow) { + bool bIsClickAction = false; + + if (aMap.find("cmd") != aMap.end()) { + if (aMap["cmd"] == "selected") + { + aMap["POS"] = aMap["data"]; + aMap["TEXT"] = aMap["data"]; + + pUIWindow->execute(sSelectAction, aMap); + } + else if (aMap["cmd"] == "plus") + { + pUIWindow->execute(sUpAction, aMap); + } + else if (aMap["cmd"] == "minus") + { + pUIWindow->execute(sDownAction, aMap); + } + else if (aMap["cmd"] == "set") + { + aMap["TEXT"] = aMap["data"]; - pUIWindow->execute(sSelectAction, aMap); + pUIWindow->execute(sClearAction, aMap); + pUIWindow->execute(sTypeAction, aMap); + } + else if (aMap["cmd"] == "value") + { + aMap["VALUE"] = aMap["data"]; + pUIWindow->execute(sValue, aMap); + } + else + bIsClickAction = true; } else bIsClickAction = true; - } - else - bIsClickAction = true; - if (bIsClickAction) - pUIWindow->execute(sClickAction, aMap); + if (bIsClickAction) + pUIWindow->execute(sClickAction, aMap); + } } } catch(...) {} commit 4134777711854ed68a7c2ffbd42cc118efd62184 Author: Szymon Kłos <szymon.k...@collabora.com> AuthorDate: Thu Mar 5 12:18:38 2020 +0100 Commit: Szymon Kłos <eszka...@gmail.com> CommitDate: Mon May 18 17:52:21 2020 +0200 jsdialog: Remember builder connected with LOK window id Change-Id: I9e38fe570b2296341c1694fe8128da30ba209494 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94184 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Szymon Kłos <szymon.k...@collabora.com> diff --git a/compilerplugins/clang/badstatics.cxx b/compilerplugins/clang/badstatics.cxx index 737330dd10c0..7c595f77207a 100644 --- a/compilerplugins/clang/badstatics.cxx +++ b/compilerplugins/clang/badstatics.cxx @@ -205,6 +205,7 @@ public: || (loplugin::DeclCheck(pVarDecl).Var("maThreadSpecific") .Class("ScDocument").GlobalNamespace()) // not owning || name == "s_aLOKWindowsMap" // LOK only, guarded by assert, and LOK never tries to perform a VCL cleanup + || name == "s_aLOKWeldBuildersMap" // LOK only, similar case as above || name == "gStaticManager" // vcl/source/graphic/Manager.cxx - stores non-owning pointers || name == "aThreadedInterpreterPool" // ScInterpreterContext(Pool), not owning || name == "aNonThreadedInterpreterPool" // ScInterpreterContext(Pool), not owning diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/include/vcl/jsdialog/jsdialogbuilder.hxx similarity index 92% rename from vcl/inc/jsdialog/jsdialogbuilder.hxx rename to include/vcl/jsdialog/jsdialogbuilder.hxx index 0104756b7b55..b26b2ac2ff16 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/include/vcl/jsdialog/jsdialogbuilder.hxx @@ -6,7 +6,7 @@ #include <vcl/sysdata.hxx> #include <vcl/virdev.hxx> #include <vcl/builder.hxx> -#include <salvtables.hxx> +#include <vcl/salvtables.hxx> #include <vcl/combobox.hxx> #include <vcl/button.hxx> @@ -25,8 +25,11 @@ public: class VCL_DLLPUBLIC JSInstanceBuilder : public SalInstanceBuilder { + vcl::LOKWindowId m_nWindowId; + public: JSInstanceBuilder(weld::Widget* pParent, const OUString& rUIRoot, const OUString& rUIFile); + virtual ~JSInstanceBuilder() override; 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, @@ -39,10 +42,13 @@ public: bool bTakeOwnership = false) override; 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); }; template <class BaseInstanceClass, class VclClass> -class JSWidget : public BaseInstanceClass, public JSDialogSender +class VCL_DLLPUBLIC JSWidget : public BaseInstanceClass, public JSDialogSender { public: JSWidget(VclPtr<vcl::Window> aOwnedToplevel, VclClass* pObject, SalInstanceBuilder* pBuilder, @@ -130,4 +136,4 @@ public: virtual void append_page(const OString& rIdent, const OUString& rLabel) override; }; -#endif \ No newline at end of file +#endif diff --git a/vcl/inc/salvtables.hxx b/include/vcl/salvtables.hxx similarity index 100% rename from vcl/inc/salvtables.hxx rename to include/vcl/salvtables.hxx diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 64f78c295bed..901f92aac109 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -1,4 +1,4 @@ -#include <jsdialog/jsdialogbuilder.hxx> +#include <vcl/jsdialog/jsdialogbuilder.hxx> #include <sal/log.hxx> #include <boost/property_tree/json_parser.hpp> #include <comphelper/lok.hxx> @@ -30,12 +30,41 @@ JSInstanceBuilder::JSInstanceBuilder(weld::Widget* pParent, const OUString& rUIR ? dynamic_cast<SalInstanceWidget*>(pParent)->getWidget() : nullptr, rUIRoot, rUIFile) + , m_nWindowId(0) { } +JSInstanceBuilder::~JSInstanceBuilder() +{ + if (m_nWindowId) + GetLOKWeldBuilderMap().erase(m_nWindowId); +} + +std::map<vcl::LOKWindowId, JSInstanceBuilder*>& JSInstanceBuilder::GetLOKWeldBuilderMap() +{ + // Map to remember the LOKWindowId <-> Builder binding. + static std::map<vcl::LOKWindowId, JSInstanceBuilder*> s_aLOKWeldBuildersMap; + + return s_aLOKWeldBuildersMap; +} + +JSInstanceBuilder* JSInstanceBuilder::FindLOKWeldBuilder(vcl::LOKWindowId nWindowId) +{ + const auto it = GetLOKWeldBuilderMap().find(nWindowId); + if (it != GetLOKWeldBuilderMap().end()) + return it->second; + + return nullptr; +} + 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)); + std::unique_ptr<weld::Dialog> pRet(pDialog ? new SalInstanceDialog(pDialog, this, false) : nullptr); if (bTakeOwnership && pDialog) diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 77334c1cc90d..e4f576201514 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -71,7 +71,7 @@ #include <aboutdialog.hxx> #include <bitmaps.hlst> #include <wizdlg.hxx> -#include <salvtables.hxx> +#include <vcl/salvtables.hxx> SalFrame::SalFrame() : m_pWindow(nullptr) diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 184313b8c12c..eb87ea7403f2 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -65,7 +65,7 @@ #include <wizdlg.hxx> #include <tools/svlibrary.h> #include <comphelper/lok.hxx> -#include <jsdialog/jsdialogbuilder.hxx> +#include <vcl/jsdialog/jsdialogbuilder.hxx> #if defined(DISABLE_DYNLOADING) || defined(LINUX) #include <dlfcn.h> commit 3d2be32a12708e43158f2a490bde24aae8f11f9e Author: Szymon Kłos <szymon.k...@collabora.com> AuthorDate: Wed Mar 4 16:05:10 2020 +0100 Commit: Szymon Kłos <eszka...@gmail.com> CommitDate: Mon May 18 17:52:21 2020 +0200 jsdialog: refresh on notebook changes Change-Id: I81159d043add3d8bdd1b81f26f642f99c1430f73 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94183 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Szymon Kłos <szymon.k...@collabora.com> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 24b1ef7808c1..0104756b7b55 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -37,6 +37,8 @@ public: bool bTakeOwnership = false) override; virtual std::unique_ptr<weld::ComboBox> weld_combo_box(const OString& id, bool bTakeOwnership = false) override; + virtual std::unique_ptr<weld::Notebook> weld_notebook(const OString& id, + bool bTakeOwnership = false) override; }; template <class BaseInstanceClass, class VclClass> @@ -113,4 +115,19 @@ public: virtual void set_entry_text(const OUString& rText) override; }; +class VCL_DLLPUBLIC JSNotebook : public JSWidget<SalInstanceNotebook, ::TabControl> +{ +public: + JSNotebook(VclPtr<vcl::Window> aOwnedToplevel, ::TabControl* pControl, + SalInstanceBuilder* pBuilder, bool bTakeOwnership); + + virtual void set_current_page(int nPage) override; + + virtual void set_current_page(const OString& rIdent) override; + + virtual void remove_page(const OString& rIdent) override; + + virtual void append_page(const OString& rIdent, const OUString& rLabel) override; +}; + #endif \ No newline at end of file diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx index b308f5f8bc8c..6222423551bc 100644 --- a/vcl/inc/salvtables.hxx +++ b/vcl/inc/salvtables.hxx @@ -869,7 +869,7 @@ class SalInstanceNotebook : public SalInstanceContainer, public virtual weld::No { private: VclPtr<TabControl> m_xNotebook; - mutable std::vector<std::unique_ptr<SalInstanceContainer>> m_aPages; + mutable std::vector<std::shared_ptr<SalInstanceContainer>> m_aPages; std::vector<VclPtr<TabPage>> m_aAddedPages; std::vector<VclPtr<VclGrid>> m_aAddedGrids; diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index a9465a4de5bb..64f78c295bed 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -91,6 +91,15 @@ std::unique_ptr<weld::ComboBox> JSInstanceBuilder::weld_combo_box(const OString& : nullptr; } +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; +} + JSLabel::JSLabel(VclPtr<vcl::Window> aOwnedToplevel, FixedText* pLabel, SalInstanceBuilder* pBuilder, bool bTakeOwnership) : JSWidget<SalInstanceLabel, FixedText>(aOwnedToplevel, pLabel, pBuilder, bTakeOwnership) @@ -166,3 +175,34 @@ void JSComboBox::set_entry_text(const OUString& rText) SalInstanceComboBoxWithEdit::set_entry_text(rText); notifyDialogState(); } + +JSNotebook::JSNotebook(VclPtr<vcl::Window> aOwnedToplevel, ::TabControl* pControl, + SalInstanceBuilder* pBuilder, bool bTakeOwnership) + : JSWidget<SalInstanceNotebook, ::TabControl>(aOwnedToplevel, pControl, pBuilder, + bTakeOwnership) +{ +} + +void JSNotebook::set_current_page(int nPage) +{ + SalInstanceNotebook::set_current_page(nPage); + notifyDialogState(); +} + +void JSNotebook::set_current_page(const OString& rIdent) +{ + SalInstanceNotebook::set_current_page(rIdent); + notifyDialogState(); +} + +void JSNotebook::remove_page(const OString& rIdent) +{ + SalInstanceNotebook::remove_page(rIdent); + notifyDialogState(); +} + +void JSNotebook::append_page(const OString& rIdent, const OUString& rLabel) +{ + SalInstanceNotebook::append_page(rIdent, rLabel); + notifyDialogState(); +} _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits