vcl/inc/jsdialog/jsdialogbuilder.hxx | 21 +- vcl/inc/salvtables.hxx | 42 +++++ vcl/jsdialog/jsdialogbuilder.cxx | 68 +++++++- vcl/source/app/salvtables.cxx | 292 ++++++++++++++++------------------- 4 files changed, 257 insertions(+), 166 deletions(-)
New commits: commit 04aad5692dd17444f23895bc03784701657c3346 Author: Szymon Kłos <[email protected]> AuthorDate: Wed Mar 1 18:11:44 2023 +0100 Commit: Szymon Kłos <[email protected]> CommitDate: Tue Mar 7 09:10:15 2023 +0000 jsdialog: add wrapper for weld:Assistant Signed-off-by: Szymon Kłos <[email protected]> Change-Id: I82d045cbcc7fc4682c251ac51b19b3bd33f813f8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148068 diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index c99b3c19f4f0..97bab23c809a 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -278,6 +278,7 @@ public: virtual ~JSInstanceBuilder() override; virtual std::unique_ptr<weld::MessageDialog> weld_message_dialog(const OString& id) override; virtual std::unique_ptr<weld::Dialog> weld_dialog(const OString& id) override; + virtual std::unique_ptr<weld::Assistant> weld_assistant(const OString& id) override; virtual std::unique_ptr<weld::Container> weld_container(const OString& id) override; virtual std::unique_ptr<weld::Label> weld_label(const OString& id) override; virtual std::unique_ptr<weld::Button> weld_button(const OString& id) override; @@ -303,11 +304,10 @@ public: virtual std::unique_ptr<weld::Widget> weld_widget(const OString& id) override; virtual std::unique_ptr<weld::Image> weld_image(const OString& id) override; - static weld::MessageDialog* CreateMessageDialog(weld::Widget* pParent, - VclMessageType eMessageType, - VclButtonsType eButtonType, - const OUString& rPrimaryMessage, - const vcl::ILibreOfficeKitNotifier* pNotifier = nullptr); + static weld::MessageDialog* + CreateMessageDialog(weld::Widget* pParent, VclMessageType eMessageType, + VclButtonsType eButtonType, const OUString& rPrimaryMessage, + const vcl::ILibreOfficeKitNotifier* pNotifier = nullptr); static void AddChildWidget(const std::string& nWindowId, const OString& id, weld::Widget* pWidget); @@ -482,6 +482,17 @@ public: virtual void response(int response) override; }; +class JSAssistant final : public JSWidget<SalInstanceAssistant, vcl::RoadmapWizard> +{ +public: + JSAssistant(JSDialogSender* pSender, vcl::RoadmapWizard* pDialog, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual void set_current_page(int nPage) override; + virtual void set_current_page(const OString& rIdent) override; + virtual void response(int response) override; +}; + class JSContainer final : public JSWidget<SalInstanceContainer, vcl::Window> { public: diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index abb53f8c6a05..ff562358abdc 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -26,6 +26,7 @@ #include <vcl/toolkit/treelistentry.hxx> #include <vcl/jsdialog/executor.hxx> #include <cppuhelper/supportsservice.hxx> +#include <wizdlg.hxx> static std::map<std::string, vcl::Window*>& GetLOKPopupsMap() { @@ -843,6 +844,34 @@ std::unique_ptr<weld::Dialog> JSInstanceBuilder::weld_dialog(const OString& id) return pRet; } +std::unique_ptr<weld::Assistant> JSInstanceBuilder::weld_assistant(const OString& id) +{ + vcl::RoadmapWizard* pDialog = m_xBuilder->get<vcl::RoadmapWizard>(id); + std::unique_ptr<JSAssistant> pRet(pDialog ? new JSAssistant(this, pDialog, this, false) + : nullptr); + if (pDialog) + { + m_nWindowId = pDialog->GetLOKWindowId(); + pDialog->SetLOKTunnelingState(false); + + InsertWindowToMap(getMapIdFromWindowId()); + + assert(!m_aOwnedToplevel && "only one toplevel per .ui allowed"); + m_aOwnedToplevel.set(pDialog); + m_xBuilder->drop_ownership(pDialog); + m_bHasTopLevelDialog = true; + + pRet.reset(new JSAssistant(this, pDialog, this, false)); + + RememberWidget("__DIALOG__", pRet.get()); + + initializeSender(GetNotifierWindow(), GetContentWindow(), GetTypeOfJSON()); + sendFullUpdate(); + } + + return pRet; +} + std::unique_ptr<weld::MessageDialog> JSInstanceBuilder::weld_message_dialog(const OString& id) { std::unique_ptr<weld::MessageDialog> pRet; @@ -1153,11 +1182,10 @@ std::unique_ptr<weld::Image> JSInstanceBuilder::weld_image(const OString& id) return pWeldWidget; } -weld::MessageDialog* JSInstanceBuilder::CreateMessageDialog(weld::Widget* pParent, - VclMessageType eMessageType, - VclButtonsType eButtonType, - const OUString& rPrimaryMessage, - const vcl::ILibreOfficeKitNotifier* pNotifier) +weld::MessageDialog* +JSInstanceBuilder::CreateMessageDialog(weld::Widget* pParent, VclMessageType eMessageType, + VclButtonsType eButtonType, const OUString& rPrimaryMessage, + const vcl::ILibreOfficeKitNotifier* pNotifier) { SalInstanceWidget* pParentInstance = dynamic_cast<SalInstanceWidget*>(pParent); SystemWindow* pParentWidget = pParentInstance ? pParentInstance->getSystemWindow() : nullptr; @@ -1219,6 +1247,36 @@ void JSDialog::response(int response) SalInstanceDialog::response(response); } +void JSAssistant::response(int response) +{ + if (response == RET_HELP) + { + response_help(m_xWidget.get()); + return; + } + + sendClose(); + SalInstanceAssistant::response(response); +} + +JSAssistant::JSAssistant(JSDialogSender* pSender, vcl::RoadmapWizard* pDialog, + SalInstanceBuilder* pBuilder, bool bTakeOwnership) + : JSWidget<SalInstanceAssistant, vcl::RoadmapWizard>(pSender, pDialog, pBuilder, bTakeOwnership) +{ +} + +void JSAssistant::set_current_page(int nPage) +{ + SalInstanceAssistant::set_current_page(nPage); + sendFullUpdate(); +} + +void JSAssistant::set_current_page(const OString& rIdent) +{ + SalInstanceAssistant::set_current_page(rIdent); + sendFullUpdate(); +} + JSContainer::JSContainer(JSDialogSender* pSender, vcl::Window* pContainer, SalInstanceBuilder* pBuilder, bool bTakeOwnership) : JSWidget<SalInstanceContainer, vcl::Window>(pSender, pContainer, pBuilder, bTakeOwnership) commit 7974cef3b4a590133fee4d95b7744b73f4aa174f Author: Szymon Kłos <[email protected]> AuthorDate: Wed Mar 1 16:51:02 2023 +0100 Commit: Szymon Kłos <[email protected]> CommitDate: Tue Mar 7 09:10:01 2023 +0000 Move SalInstanceAssistant declaration to header file Change-Id: I3407893c878fd37fe0968c2990c92d5d16213ed3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148067 Tested-by: Szymon Kłos <[email protected]> Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx index 36416deb5910..f0f79d1f58eb 100644 --- a/vcl/inc/salvtables.hxx +++ b/vcl/inc/salvtables.hxx @@ -30,6 +30,11 @@ #include "listbox.hxx" #include "messagedialog.hxx" +namespace vcl +{ +class RoadmapWizard; +}; + class SalInstanceBuilder : public weld::Builder { protected: @@ -543,6 +548,43 @@ public: virtual weld::Container* weld_content_area() override; }; +class SalInstanceAssistant : public SalInstanceDialog, public virtual weld::Assistant +{ +private: + VclPtr<vcl::RoadmapWizard> m_xWizard; + std::vector<std::unique_ptr<SalInstanceContainer>> m_aPages; + std::vector<VclPtr<TabPage>> m_aAddedPages; + std::vector<int> m_aIds; + std::vector<VclPtr<VclGrid>> m_aAddedGrids; + Idle m_aUpdateRoadmapIdle; + + int find_page(std::string_view rIdent) const; + int find_id(int nId) const; + + DECL_LINK(OnRoadmapItemSelected, LinkParamNone*, void); + DECL_LINK(UpdateRoadmap_Hdl, Timer*, void); + +public: + SalInstanceAssistant(vcl::RoadmapWizard* pDialog, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + virtual int get_current_page() const override; + virtual int get_n_pages() const override; + virtual OString get_page_ident(int nPage) const override; + virtual OString get_current_page_ident() const override; + virtual void set_current_page(int nPage) override; + virtual void set_current_page(const OString& rIdent) override; + virtual void set_page_index(const OString& rIdent, int nNewIndex) override; + virtual weld::Container* append_page(const OString& rIdent) override; + virtual OUString get_page_title(const OString& rIdent) const override; + virtual void set_page_title(const OString& rIdent, const OUString& rTitle) override; + virtual void set_page_sensitive(const OString& rIdent, bool bSensitive) override; + virtual void set_page_side_help_id(const OString& rHelpId) override; + virtual void set_page_side_image(const OUString& rImage) override; + weld::Button* weld_widget_for_response(int nResponse) override; + + virtual ~SalInstanceAssistant() override; +}; + class WeldTextFilter final : public TextFilter { private: diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 482b5a59e145..12f00597bb02 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -1986,203 +1986,183 @@ weld::Container* SalInstanceMessageDialog::weld_message_area() return new SalInstanceContainer(m_xMessageDialog->get_message_area(), m_pBuilder, false); } -namespace -{ -class SalInstanceAssistant : public SalInstanceDialog, public virtual weld::Assistant +int SalInstanceAssistant::find_page(std::string_view rIdent) const { -private: - VclPtr<vcl::RoadmapWizard> m_xWizard; - std::vector<std::unique_ptr<SalInstanceContainer>> m_aPages; - std::vector<VclPtr<TabPage>> m_aAddedPages; - std::vector<int> m_aIds; - std::vector<VclPtr<VclGrid>> m_aAddedGrids; - Idle m_aUpdateRoadmapIdle; - - int find_page(std::string_view rIdent) const + for (size_t i = 0; i < m_aAddedPages.size(); ++i) { - for (size_t i = 0; i < m_aAddedPages.size(); ++i) - { - if (m_aAddedPages[i]->get_id().toUtf8() == rIdent) - return i; - } - return -1; + if (m_aAddedPages[i]->get_id().toUtf8() == rIdent) + return i; } + return -1; +} - int find_id(int nId) const +int SalInstanceAssistant::find_id(int nId) const +{ + for (size_t i = 0; i < m_aIds.size(); ++i) { - for (size_t i = 0; i < m_aIds.size(); ++i) - { - if (nId == m_aIds[i]) - return i; - } - return -1; + if (nId == m_aIds[i]) + return i; } + return -1; +} - DECL_LINK(OnRoadmapItemSelected, LinkParamNone*, void); - DECL_LINK(UpdateRoadmap_Hdl, Timer*, void); +SalInstanceAssistant::SalInstanceAssistant(vcl::RoadmapWizard* pDialog, + SalInstanceBuilder* pBuilder, bool bTakeOwnership) + : SalInstanceDialog(pDialog, pBuilder, bTakeOwnership) + , m_xWizard(pDialog) + , m_aUpdateRoadmapIdle("SalInstanceAssistant m_aUpdateRoadmapIdle") +{ + m_xWizard->SetItemSelectHdl(LINK(this, SalInstanceAssistant, OnRoadmapItemSelected)); -public: - SalInstanceAssistant(vcl::RoadmapWizard* pDialog, SalInstanceBuilder* pBuilder, - bool bTakeOwnership) - : SalInstanceDialog(pDialog, pBuilder, bTakeOwnership) - , m_xWizard(pDialog) - , m_aUpdateRoadmapIdle("SalInstanceAssistant m_aUpdateRoadmapIdle") - { - m_xWizard->SetItemSelectHdl(LINK(this, SalInstanceAssistant, OnRoadmapItemSelected)); + m_aUpdateRoadmapIdle.SetInvokeHandler(LINK(this, SalInstanceAssistant, UpdateRoadmap_Hdl)); + m_aUpdateRoadmapIdle.SetPriority(TaskPriority::HIGHEST); +} - m_aUpdateRoadmapIdle.SetInvokeHandler(LINK(this, SalInstanceAssistant, UpdateRoadmap_Hdl)); - m_aUpdateRoadmapIdle.SetPriority(TaskPriority::HIGHEST); - } +int SalInstanceAssistant::get_current_page() const { return find_id(m_xWizard->GetCurLevel()); } - virtual int get_current_page() const override { return find_id(m_xWizard->GetCurLevel()); } +int SalInstanceAssistant::get_n_pages() const { return m_aAddedPages.size(); } - virtual int get_n_pages() const override { return m_aAddedPages.size(); } +OString SalInstanceAssistant::get_page_ident(int nPage) const +{ + return m_aAddedPages[nPage]->get_id().toUtf8(); +} - virtual OString get_page_ident(int nPage) const override - { - return m_aAddedPages[nPage]->get_id().toUtf8(); - } +OString SalInstanceAssistant::get_current_page_ident() const +{ + return get_page_ident(get_current_page()); +} - virtual OString get_current_page_ident() const override - { - return get_page_ident(get_current_page()); - } +void SalInstanceAssistant::set_current_page(int nPage) +{ + disable_notify_events(); - virtual void set_current_page(int nPage) override + // take the first shown page as the size for all pages + if (m_xWizard->GetPageSizePixel().Width() == 0) { - disable_notify_events(); - - // take the first shown page as the size for all pages - if (m_xWizard->GetPageSizePixel().Width() == 0) + Size aFinalSize; + for (int i = 0, nPages = get_n_pages(); i < nPages; ++i) { - Size aFinalSize; - for (int i = 0, nPages = get_n_pages(); i < nPages; ++i) - { - TabPage* pPage = m_xWizard->GetPage(m_aIds[i]); - assert(pPage); - Size aPageSize(pPage->get_preferred_size()); - if (aPageSize.Width() > aFinalSize.Width()) - aFinalSize.setWidth(aPageSize.Width()); - if (aPageSize.Height() > aFinalSize.Height()) - aFinalSize.setHeight(aPageSize.Height()); - } - m_xWizard->SetPageSizePixel(aFinalSize); + TabPage* pPage = m_xWizard->GetPage(m_aIds[i]); + assert(pPage); + Size aPageSize(pPage->get_preferred_size()); + if (aPageSize.Width() > aFinalSize.Width()) + aFinalSize.setWidth(aPageSize.Width()); + if (aPageSize.Height() > aFinalSize.Height()) + aFinalSize.setHeight(aPageSize.Height()); } - - (void)m_xWizard->ShowPage(m_aIds[nPage]); - enable_notify_events(); + m_xWizard->SetPageSizePixel(aFinalSize); } - virtual void set_current_page(const OString& rIdent) override - { - int nIndex = find_page(rIdent); - if (nIndex == -1) - return; - set_current_page(nIndex); - } + (void)m_xWizard->ShowPage(m_aIds[nPage]); + enable_notify_events(); +} - virtual void set_page_index(const OString& rIdent, int nNewIndex) override - { - int nOldIndex = find_page(rIdent); +void SalInstanceAssistant::set_current_page(const OString& rIdent) +{ + int nIndex = find_page(rIdent); + if (nIndex == -1) + return; + set_current_page(nIndex); +} - if (nOldIndex == -1) - return; +void SalInstanceAssistant::set_page_index(const OString& rIdent, int nNewIndex) +{ + int nOldIndex = find_page(rIdent); - if (nOldIndex == nNewIndex) - return; + if (nOldIndex == -1) + return; - disable_notify_events(); + if (nOldIndex == nNewIndex) + return; - auto entry = std::move(m_aAddedPages[nOldIndex]); - m_aAddedPages.erase(m_aAddedPages.begin() + nOldIndex); - m_aAddedPages.insert(m_aAddedPages.begin() + nNewIndex, std::move(entry)); + disable_notify_events(); - int nId = m_aIds[nOldIndex]; - m_aIds.erase(m_aIds.begin() + nOldIndex); - m_aIds.insert(m_aIds.begin() + nNewIndex, nId); + auto entry = std::move(m_aAddedPages[nOldIndex]); + m_aAddedPages.erase(m_aAddedPages.begin() + nOldIndex); + m_aAddedPages.insert(m_aAddedPages.begin() + nNewIndex, std::move(entry)); - m_aUpdateRoadmapIdle.Start(); + int nId = m_aIds[nOldIndex]; + m_aIds.erase(m_aIds.begin() + nOldIndex); + m_aIds.insert(m_aIds.begin() + nNewIndex, nId); - enable_notify_events(); - } + m_aUpdateRoadmapIdle.Start(); - virtual weld::Container* append_page(const OString& rIdent) override - { - VclPtrInstance<TabPage> xPage(m_xWizard); - VclPtrInstance<VclGrid> xGrid(xPage); - xPage->set_id(OUString::fromUtf8(rIdent)); - xPage->Show(); - xGrid->set_hexpand(true); - xGrid->set_vexpand(true); - xGrid->Show(); - m_xWizard->AddPage(xPage); - m_aIds.push_back(m_aAddedPages.size()); - m_xWizard->SetPage(m_aIds.back(), xPage); - m_aAddedPages.push_back(xPage); - m_aAddedGrids.push_back(xGrid); + enable_notify_events(); +} - m_aUpdateRoadmapIdle.Start(); +weld::Container* SalInstanceAssistant::append_page(const OString& rIdent) +{ + VclPtrInstance<TabPage> xPage(m_xWizard); + VclPtrInstance<VclGrid> xGrid(xPage); + xPage->set_id(OUString::fromUtf8(rIdent)); + xPage->Show(); + xGrid->set_hexpand(true); + xGrid->set_vexpand(true); + xGrid->Show(); + m_xWizard->AddPage(xPage); + m_aIds.push_back(m_aAddedPages.size()); + m_xWizard->SetPage(m_aIds.back(), xPage); + m_aAddedPages.push_back(xPage); + m_aAddedGrids.push_back(xGrid); - m_aPages.emplace_back(new SalInstanceContainer(xGrid, m_pBuilder, false)); - return m_aPages.back().get(); - } + m_aUpdateRoadmapIdle.Start(); - virtual OUString get_page_title(const OString& rIdent) const override - { - int nIndex = find_page(rIdent); - if (nIndex == -1) - return OUString(); - return m_aAddedPages[nIndex]->GetText(); - } + m_aPages.emplace_back(new SalInstanceContainer(xGrid, m_pBuilder, false)); + return m_aPages.back().get(); +} - virtual void set_page_title(const OString& rIdent, const OUString& rTitle) override - { - int nIndex = find_page(rIdent); - if (nIndex == -1) - return; - if (m_aAddedPages[nIndex]->GetText() != rTitle) - { - disable_notify_events(); - m_aAddedPages[nIndex]->SetText(rTitle); - m_aUpdateRoadmapIdle.Start(); - enable_notify_events(); - } - } +OUString SalInstanceAssistant::get_page_title(const OString& rIdent) const +{ + int nIndex = find_page(rIdent); + if (nIndex == -1) + return OUString(); + return m_aAddedPages[nIndex]->GetText(); +} - virtual void set_page_sensitive(const OString& rIdent, bool bSensitive) override +void SalInstanceAssistant::set_page_title(const OString& rIdent, const OUString& rTitle) +{ + int nIndex = find_page(rIdent); + if (nIndex == -1) + return; + if (m_aAddedPages[nIndex]->GetText() != rTitle) { - int nIndex = find_page(rIdent); - if (nIndex == -1) - return; - if (m_aAddedPages[nIndex]->IsEnabled() != bSensitive) - { - disable_notify_events(); - m_aAddedPages[nIndex]->Enable(bSensitive); - m_aUpdateRoadmapIdle.Start(); - enable_notify_events(); - } + disable_notify_events(); + m_aAddedPages[nIndex]->SetText(rTitle); + m_aUpdateRoadmapIdle.Start(); + enable_notify_events(); } +} - virtual void set_page_side_help_id(const OString& rHelpId) override +void SalInstanceAssistant::set_page_sensitive(const OString& rIdent, bool bSensitive) +{ + int nIndex = find_page(rIdent); + if (nIndex == -1) + return; + if (m_aAddedPages[nIndex]->IsEnabled() != bSensitive) { - m_xWizard->SetRoadmapHelpId(rHelpId); + disable_notify_events(); + m_aAddedPages[nIndex]->Enable(bSensitive); + m_aUpdateRoadmapIdle.Start(); + enable_notify_events(); } +} - virtual void set_page_side_image(const OUString& rImage) override - { - m_xWizard->SetRoadmapBitmap(createImage(rImage).GetBitmapEx()); - } +void SalInstanceAssistant::set_page_side_help_id(const OString& rHelpId) +{ + m_xWizard->SetRoadmapHelpId(rHelpId); +} - weld::Button* weld_widget_for_response(int nResponse) override; +void SalInstanceAssistant::set_page_side_image(const OUString& rImage) +{ + m_xWizard->SetRoadmapBitmap(createImage(rImage).GetBitmapEx()); +} - virtual ~SalInstanceAssistant() override - { - for (auto& rGrid : m_aAddedGrids) - rGrid.disposeAndClear(); - for (auto& rPage : m_aAddedPages) - rPage.disposeAndClear(); - } -}; +SalInstanceAssistant::~SalInstanceAssistant() +{ + for (auto& rGrid : m_aAddedGrids) + rGrid.disposeAndClear(); + for (auto& rPage : m_aAddedPages) + rPage.disposeAndClear(); } IMPL_LINK_NOARG(SalInstanceAssistant, OnRoadmapItemSelected, LinkParamNone*, void)
