From 7741b21f98e22a654962a5fdae165508cc90a7df Mon Sep 17 00:00:00 2001 From: NickWingate Date: Tue, 15 Mar 2022 19:22:12 +0000 Subject: Make name dialog async MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Including making the warning subdialog async Signed-off-by: NickWingate Change-Id: If3560a86ac349f0f6a5bc0ac19ba405ac4f04b36 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131654 Tested-by: Jenkins CollaboraOffice Reviewed-by: Szymon Kłos --- cui/source/dialogs/dlgname.cxx | 12 +++++++ cui/source/factory/dlgfact.cxx | 26 +++++++++++++++- cui/source/factory/dlgfact.hxx | 9 ++++-- cui/source/inc/cuitabarea.hxx | 7 +++++ cui/source/inc/dlgname.hxx | 8 +++++ cui/source/tabpages/tpcolor.cxx | 55 +++++++++++++++++++++------------ cui/uiconfig/ui/queryduplicatedialog.ui | 2 +- include/svx/svxdlg.hxx | 2 ++ vcl/jsdialog/enabled.cxx | 4 ++- vcl/jsdialog/jsdialogbuilder.cxx | 1 + 10 files changed, 101 insertions(+), 25 deletions(-) diff --git a/cui/source/dialogs/dlgname.cxx b/cui/source/dialogs/dlgname.cxx index ffa540bbca5b..fd0e3953e98e 100644 --- a/cui/source/dialogs/dlgname.cxx +++ b/cui/source/dialogs/dlgname.cxx @@ -36,6 +36,18 @@ SvxNameDialog::SvxNameDialog(weld::Window* pParent, const OUString& rName, const m_xEdtName->select_region(0, -1); ModifyHdl(*m_xEdtName); m_xEdtName->connect_changed(LINK(this, SvxNameDialog, ModifyHdl)); + + m_xBtnOK->connect_clicked(LINK(this, SvxNameDialog, OkHdl)); +} + +IMPL_LINK_NOARG(SvxNameDialog, OkHdl, weld::Button&, void) +{ + if (m_aOkHdl.IsSet()) + { + m_aOkHdl.Call(*this); + return; + } + m_xDialog->response(RET_OK); } IMPL_LINK_NOARG(SvxNameDialog, ModifyHdl, weld::Entry&, void) diff --git a/cui/source/factory/dlgfact.cxx b/cui/source/factory/dlgfact.cxx index 7ee30c9b621a..ac715423dba3 100644 --- a/cui/source/factory/dlgfact.cxx +++ b/cui/source/factory/dlgfact.cxx @@ -221,6 +221,16 @@ short AbstractSvxNameDialog_Impl::Execute() return m_xDlg->run(); } +bool AbstractSvxNameDialog_Impl::StartExecuteAsync(AsyncContext &rCtx) +{ + return weld::DialogController::runAsync(m_xDlg, rCtx.maEndDialogFn); +} + +void AbstractSvxNameDialog_Impl::Response(int response) +{ + m_xDlg->response(response); +} + // #i68101# short AbstractSvxObjectNameDialog_Impl::Execute() { @@ -749,6 +759,15 @@ void AbstractSvxNameDialog_Impl::SetCheckNameHdl( const LinkSetCheckNameHdl( Link(), bCheckImmediately ); } +void AbstractSvxNameDialog_Impl::SetOkHdl(const Link& rLink) +{ + aOkHdl = rLink; + if( rLink.IsSet() ) + m_xDlg->SetOkHdl( LINK(this, AbstractSvxNameDialog_Impl, OkHdl) ); + else + m_xDlg->SetOkHdl( Link() ); +} + void AbstractSvxNameDialog_Impl::SetCheckNameTooltipHdl( const Link& rLink) { aCheckNameTooltipHdl = rLink; @@ -778,6 +797,11 @@ IMPL_LINK_NOARG(AbstractSvxNameDialog_Impl, CheckNameHdl, SvxNameDialog&, bool) return aCheckNameHdl.Call(*this); } +IMPL_LINK_NOARG(AbstractSvxNameDialog_Impl, OkHdl, SvxNameDialog&, void) +{ + aOkHdl.Call(*this); +} + IMPL_LINK_NOARG(AbstractSvxNameDialog_Impl, CheckNameTooltipHdl, SvxNameDialog&, OUString) { return aCheckNameTooltipHdl.Call(*this); @@ -1258,7 +1282,7 @@ VclPtr AbstractDialogFactory_Impl::CreateSvxEditDictionaryDia VclPtr AbstractDialogFactory_Impl::CreateSvxNameDialog(weld::Window* pParent, const OUString& rName, const OUString& rDesc) { - return VclPtr::Create(std::make_unique(pParent, rName, rDesc)); + return VclPtr::Create(std::make_shared(pParent, rName, rDesc)); } VclPtr AbstractDialogFactory_Impl::CreateSvxObjectNameDialog(weld::Window* pParent, const OUString& rName) diff --git a/cui/source/factory/dlgfact.hxx b/cui/source/factory/dlgfact.hxx index b39e29efe821..c4679ba7b7e1 100644 --- a/cui/source/factory/dlgfact.hxx +++ b/cui/source/factory/dlgfact.hxx @@ -436,23 +436,28 @@ class SvxNameDialog; class AbstractSvxNameDialog_Impl :public AbstractSvxNameDialog { public: - explicit AbstractSvxNameDialog_Impl(std::unique_ptr p) + explicit AbstractSvxNameDialog_Impl(std::shared_ptr p) : m_xDlg(std::move(p)) { } virtual short Execute() override; + virtual bool StartExecuteAsync(AsyncContext &rCtx) override; virtual void GetName( OUString& rName ) override ; virtual void SetCheckNameHdl( const Link& rLink, bool bCheckImmediately = false ) override ; + virtual void SetOkHdl( const Link& rLink ) override; + virtual void Response( int response ) override; virtual void SetCheckNameTooltipHdl( const Link& rLink ) override ; virtual void SetEditHelpId(const OString&) override ; //from class Window virtual void SetHelpId( const OString& ) override ; virtual void SetText( const OUString& rStr ) override ; private: - std::unique_ptr m_xDlg; + std::shared_ptr m_xDlg; Link aCheckNameHdl; + Link aOkHdl; Link aCheckNameTooltipHdl; DECL_LINK(CheckNameHdl, SvxNameDialog&, bool); + DECL_LINK(OkHdl, SvxNameDialog&, void); DECL_LINK(CheckNameTooltipHdl, SvxNameDialog&, OUString); }; diff --git a/cui/source/inc/cuitabarea.hxx b/cui/source/inc/cuitabarea.hxx index a1927624f20d..ae5cc80664a3 100644 --- a/cui/source/inc/cuitabarea.hxx +++ b/cui/source/inc/cuitabarea.hxx @@ -27,6 +27,8 @@ #include #include #include +#include +#include #define NO_BUTTON_SELECTED -1 @@ -647,6 +649,7 @@ private: PaletteManager maPaletteManager; SvxXRectPreview m_aCtlPreviewOld; SvxXRectPreview m_aCtlPreviewNew; + std::shared_ptr m_xWarnDialog; std::unique_ptr m_xValSetColorList; std::unique_ptr m_xValSetRecentList; std::unique_ptr m_xSelectPalette; @@ -680,6 +683,8 @@ private: std::unique_ptr m_xValSetColorListWin; std::unique_ptr m_xValSetRecentListWin; + VclPtr m_xNameDialog; + static void ConvertColorValues (Color& rColor, ColorModel eModell); static void RgbToCmyk_Impl( Color& rColor, sal_uInt16& rK ); static void CmykToRgb_Impl( Color& rColor, const sal_uInt16 nKey ); @@ -693,6 +698,8 @@ private: DECL_LINK(ClickWorkOnHdl_Impl, weld::Button&, void); DECL_LINK(ClickDeleteHdl_Impl, weld::Button&, void); + DECL_LINK(NameDialogOkHdl_Impl, AbstractSvxNameDialog&, void); + DECL_LINK(SelectPaletteLBHdl, weld::ComboBox&, void); DECL_LINK( SelectValSetHdl_Impl, ValueSet*, void ); DECL_LINK( SelectColorModeHdl_Impl, weld::ToggleButton&, void ); diff --git a/cui/source/inc/dlgname.hxx b/cui/source/inc/dlgname.hxx index 06e70562fc8d..ec6e361d8d55 100644 --- a/cui/source/inc/dlgname.hxx +++ b/cui/source/inc/dlgname.hxx @@ -27,11 +27,14 @@ private: std::unique_ptr m_xEdtName; std::unique_ptr m_xFtDescription; std::unique_ptr m_xBtnOK; + std::unique_ptr m_xBtnCancel; Link m_aCheckNameHdl; + Link m_aOkHdl; Link m_aCheckNameTooltipHdl; DECL_LINK(ModifyHdl, weld::Entry&, void); + DECL_LINK(OkHdl, weld::Button&, void); public: SvxNameDialog(weld::Window* pWindow, const OUString& rName, const OUString& rDesc); @@ -60,6 +63,11 @@ public: m_xBtnOK->set_sensitive(rLink.Call(*this)); } + void SetOkHdl(const Link& rLink) + { + m_aOkHdl = rLink; + } + void SetCheckNameTooltipHdl(const Link& rLink) { m_aCheckNameTooltipHdl = rLink; diff --git a/cui/source/tabpages/tpcolor.cxx b/cui/source/tabpages/tpcolor.cxx index c9a6060f8169..46ecfefb4c4b 100644 --- a/cui/source/tabpages/tpcolor.cxx +++ b/cui/source/tabpages/tpcolor.cxx @@ -149,6 +149,9 @@ SvxColorTabPage::~SvxColorTabPage() m_xValSetRecentList.reset(); m_xValSetColorListWin.reset(); m_xValSetColorList.reset(); + + if (m_xNameDialog) + m_xNameDialog->Response(RET_CLOSE); } void SvxColorTabPage::ImpColorCountChanged() @@ -311,6 +314,10 @@ IMPL_LINK_NOARG(SvxColorTabPage, ModifiedHdl_Impl, weld::Entry&, void) IMPL_LINK_NOARG(SvxColorTabPage, ClickAddHdl_Impl, weld::Button&, void) { + // don't allow multiple name dialogs + if (m_xNameDialog) + m_xNameDialog->Response(RET_CLOSE); + OUString aNewName( SvxResId( RID_SVXSTR_COLOR ) ); OUString aDesc( CuiResId( RID_SVXSTR_DESC_COLOR ) ); OUString aName; @@ -325,29 +332,36 @@ IMPL_LINK_NOARG(SvxColorTabPage, ClickAddHdl_Impl, weld::Button&, void) } SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); - ScopedVclPtr pDlg(pFact->CreateSvxNameDialog(GetFrameWeld(), aName, aDesc)); - sal_uInt16 nError = 1; - - while (pDlg->Execute() == RET_OK) - { - pDlg->GetName( aName ); - - bValidColorName = (FindInCustomColors(aName) == -1); - if (bValidColorName) + m_xNameDialog = VclPtr(pFact->CreateSvxNameDialog(GetFrameWeld(), aName, aDesc)); + m_xNameDialog->SetOkHdl( LINK(this, SvxColorTabPage, NameDialogOkHdl_Impl)); + m_xNameDialog->StartExecuteAsync([&](sal_Int32){ + if (m_xWarnDialog) { - nError = 0; - break; + m_xWarnDialog->response(RET_CLOSE); } + m_xNameDialog->disposeOnce(); + }); +} - std::unique_ptr xBuilder(Application::CreateBuilder(GetFrameWeld(), "cui/ui/queryduplicatedialog.ui")); - std::unique_ptr xWarnBox(xBuilder->weld_message_dialog("DuplicateNameDialog")); - if (xWarnBox->run() != RET_OK) - break; - } +IMPL_LINK(SvxColorTabPage, NameDialogOkHdl_Impl, AbstractSvxNameDialog&, rDialog, void) +{ + OUString aName; + rDialog.GetName(aName); + bool bValidColorName; - pDlg.disposeAndClear(); + bValidColorName = (FindInCustomColors(aName) == -1); - if (!nError) + if (!bValidColorName) + { + // close the old if already exists to bring it on top + if (m_xWarnDialog) + m_xWarnDialog->response(RET_CLOSE); + + m_xWarnDialog = std::make_shared( + GetFrameWeld(), "cui/ui/queryduplicatedialog.ui", "DuplicateNameDialog"); + weld::MessageDialogController::runAsync(m_xWarnDialog, [](sal_Int32) {}); + } + else { m_xSelectPalette->set_active(0); SelectPaletteLBHdl(*m_xSelectPalette); @@ -368,9 +382,10 @@ IMPL_LINK_NOARG(SvxColorTabPage, ClickAddHdl_Impl, weld::Button&, void) m_xBtnDelete->set_sensitive(false); m_xBtnDelete->set_tooltip_text( SvxResId(RID_SVXSTR_DELETEUSERCOLOR2) ); ImpColorCountChanged(); - } - UpdateModified(); + UpdateModified(); + rDialog.Response(RET_CLOSE); + } } IMPL_LINK_NOARG(SvxColorTabPage, ClickWorkOnHdl_Impl, weld::Button&, void) diff --git a/cui/uiconfig/ui/queryduplicatedialog.ui b/cui/uiconfig/ui/queryduplicatedialog.ui index 54dd9bde6daa..e2acd0fb3acf 100644 --- a/cui/uiconfig/ui/queryduplicatedialog.ui +++ b/cui/uiconfig/ui/queryduplicatedialog.ui @@ -32,4 +32,4 @@ - + \ No newline at end of file diff --git a/include/svx/svxdlg.hxx b/include/svx/svxdlg.hxx index 9d0b322a4374..a7dd0b30b20a 100644 --- a/include/svx/svxdlg.hxx +++ b/include/svx/svxdlg.hxx @@ -165,6 +165,8 @@ protected: public: virtual void GetName( OUString& rName ) = 0; virtual void SetCheckNameHdl( const Link& rLink, bool bCheckImmediately = false ) = 0; + virtual void SetOkHdl( const Link& rLink ) = 0; + virtual void Response( int response ) = 0; virtual void SetCheckNameTooltipHdl( const Link& rLink ) = 0; virtual void SetEditHelpId(const OString&) = 0; //from class Window diff --git a/vcl/jsdialog/enabled.cxx b/vcl/jsdialog/enabled.cxx index 64ce33400839..a9af4cfbecaa 100644 --- a/vcl/jsdialog/enabled.cxx +++ b/vcl/jsdialog/enabled.cxx @@ -59,7 +59,9 @@ bool isBuilderEnabled(const OUString& rUIFile, bool bMobile) || rUIFile == "xmlsec/ui/viewcertdialog.ui" || rUIFile == "xmlsec/ui/certgeneral.ui" || rUIFile == "xmlsec/ui/viewcertdialog.ui" || rUIFile == "xmlsec/ui/certpage.ui" || rUIFile == "svx/ui/accessibilitycheckdialog.ui" - || rUIFile == "svx/ui/accessibilitycheckentry.ui") + || rUIFile == "svx/ui/accessibilitycheckentry.ui" + || rUIFile == "cui/ui/namedialog.ui" + || rUIFile == "cui/ui/queryduplicatedialog.ui") { return true; } diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 7608d722f237..f99367d1f4b8 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -829,6 +829,7 @@ std::unique_ptr JSInstanceBuilder::weld_message_dialog(cons m_bHasTopLevelDialog = true; initializeSender(GetNotifierWindow(), GetContentWindow(), GetTypeOfJSON()); + sendFullUpdate(); } pRet.reset(pMessageDialog ? new JSMessageDialog(this, pMessageDialog, this, false) : nullptr); -- cgit