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(-)

New commits:
commit 7741b21f98e22a654962a5fdae165508cc90a7df
Author:     NickWingate <nick.wing...@collabora.com>
AuthorDate: Tue Mar 15 19:22:12 2022 +0000
Commit:     Gökay ŞATIR <gokaysa...@collabora.com>
CommitDate: Wed Apr 20 10:23:22 2022 +0200

    Make name dialog async
    
    Including making the warning subdialog async
    
    Signed-off-by: NickWingate <nick.wing...@collabora.com>
    Change-Id: If3560a86ac349f0f6a5bc0ac19ba405ac4f04b36
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131654
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Szymon Kłos <szymon.k...@collabora.com>

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 
Link<AbstractSvxNameDial
         m_xDlg->SetCheckNameHdl( Link<SvxNameDialog&,bool>(), 
bCheckImmediately );
 }
 
+void AbstractSvxNameDialog_Impl::SetOkHdl(const Link<AbstractSvxNameDialog&, 
void>& rLink)
+{
+    aOkHdl = rLink;
+    if( rLink.IsSet() )
+        m_xDlg->SetOkHdl( LINK(this, AbstractSvxNameDialog_Impl, OkHdl) );
+    else
+        m_xDlg->SetOkHdl( Link<SvxNameDialog&, void>() );
+}
+
 void AbstractSvxNameDialog_Impl::SetCheckNameTooltipHdl( const 
Link<AbstractSvxNameDialog&,OUString>& 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<VclAbstractDialog> 
AbstractDialogFactory_Impl::CreateSvxEditDictionaryDia
 VclPtr<AbstractSvxNameDialog> 
AbstractDialogFactory_Impl::CreateSvxNameDialog(weld::Window* pParent,
                                     const OUString& rName, const OUString& 
rDesc)
 {
-    return 
VclPtr<AbstractSvxNameDialog_Impl>::Create(std::make_unique<SvxNameDialog>(pParent,
 rName, rDesc));
+    return 
VclPtr<AbstractSvxNameDialog_Impl>::Create(std::make_shared<SvxNameDialog>(pParent,
 rName, rDesc));
 }
 
 VclPtr<AbstractSvxObjectNameDialog> 
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<SvxNameDialog> p)
+    explicit AbstractSvxNameDialog_Impl(std::shared_ptr<SvxNameDialog> 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<AbstractSvxNameDialog&,bool>& 
rLink, bool bCheckImmediately = false ) override ;
+    virtual void    SetOkHdl( const Link<AbstractSvxNameDialog&,void>& rLink ) 
override;
+    virtual void    Response( int response ) override;
     virtual void    SetCheckNameTooltipHdl( const Link<AbstractSvxNameDialog&, 
OUString>& 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<SvxNameDialog> m_xDlg;
+    std::shared_ptr<SvxNameDialog> m_xDlg;
     Link<AbstractSvxNameDialog&,bool> aCheckNameHdl;
+    Link<AbstractSvxNameDialog&,void> aOkHdl;
     Link<AbstractSvxNameDialog&,OUString> 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 <svx/SvxPresetListBox.hxx>
 #include <svx/PaletteManager.hxx>
 #include <svx/svdview.hxx>
+#include <svx/svxdlg.hxx>
+#include <dlgname.hxx>
 
 #define NO_BUTTON_SELECTED -1
 
@@ -647,6 +649,7 @@ private:
     PaletteManager maPaletteManager;
     SvxXRectPreview m_aCtlPreviewOld;
     SvxXRectPreview m_aCtlPreviewNew;
+    std::shared_ptr<weld::MessageDialogController> m_xWarnDialog;
     std::unique_ptr<SvxColorValueSet> m_xValSetColorList;
     std::unique_ptr<SvxColorValueSet> m_xValSetRecentList;
     std::unique_ptr<weld::ComboBox> m_xSelectPalette;
@@ -680,6 +683,8 @@ private:
     std::unique_ptr<weld::CustomWeld> m_xValSetColorListWin;
     std::unique_ptr<weld::CustomWeld> m_xValSetRecentListWin;
 
+    VclPtr<AbstractSvxNameDialog> 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<weld::Entry> m_xEdtName;
     std::unique_ptr<weld::Label> m_xFtDescription;
     std::unique_ptr<weld::Button> m_xBtnOK;
+    std::unique_ptr<weld::Button> m_xBtnCancel;
 
     Link<SvxNameDialog&, bool> m_aCheckNameHdl;
+    Link<SvxNameDialog&, void> m_aOkHdl;
     Link<SvxNameDialog&, OUString> 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<SvxNameDialog&, void>& rLink)
+    {
+        m_aOkHdl = rLink;
+    }
+
     void SetCheckNameTooltipHdl(const Link<SvxNameDialog&, OUString>& 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<AbstractSvxNameDialog> 
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<AbstractSvxNameDialog>(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<weld::Builder> 
xBuilder(Application::CreateBuilder(GetFrameWeld(), 
"cui/ui/queryduplicatedialog.ui"));
-        std::unique_ptr<weld::MessageDialog> 
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<weld::MessageDialogController>(
+            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 @@
       </object>
     </child>
   </object>
-</interface>
+</interface>
\ 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<AbstractSvxNameDialog&,bool>& 
rLink, bool bCheckImmediately = false ) = 0;
+    virtual void    SetOkHdl( const Link<AbstractSvxNameDialog&,void>& rLink ) 
= 0;
+    virtual void    Response( int response ) = 0;
     virtual void    SetCheckNameTooltipHdl( const 
Link<AbstractSvxNameDialog&,OUString>& 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<weld::MessageDialog> 
JSInstanceBuilder::weld_message_dialog(cons
         m_bHasTopLevelDialog = true;
 
         initializeSender(GetNotifierWindow(), GetContentWindow(), 
GetTypeOfJSON());
+        sendFullUpdate();
     }
 
     pRet.reset(pMessageDialog ? new JSMessageDialog(this, pMessageDialog, 
this, false) : nullptr);

Reply via email to