cui/source/dialogs/insrc.cxx          |   19 +++++++++-
 cui/source/factory/dlgfact.cxx        |    2 -
 cui/source/inc/insrc.hxx              |   17 ++++++++-
 sd/source/ui/table/tableobjectbar.cxx |   62 +++++++++++++++++++---------------
 sw/source/uibase/shells/tabsh.cxx     |   33 +++++++++++-------
 5 files changed, 90 insertions(+), 43 deletions(-)

New commits:
commit e5d6133283bacb6bced8cdbedaeae6b3bd2f179e
Author:     Noel Grandin <[email protected]>
AuthorDate: Thu Jan 25 10:19:00 2024 +0200
Commit:     Noel Grandin <[email protected]>
CommitDate: Thu Jan 25 10:33:21 2024 +0100

    make insert row dialog async
    
    Change-Id: Icb6c2fafe2b47989ff2692956890c87780b117e0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162552
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <[email protected]>

diff --git a/cui/source/dialogs/insrc.cxx b/cui/source/dialogs/insrc.cxx
index 1ff1a14411cb..6c09c8ce4560 100644
--- a/cui/source/dialogs/insrc.cxx
+++ b/cui/source/dialogs/insrc.cxx
@@ -51,9 +51,24 @@ SvxInsRowColDlg::SvxInsRowColDlg(weld::Window* pParent, bool 
bColumn, const OUSt
     m_xDialog->set_help_id(rHelpId);
 }
 
-short SvxInsRowColDlg::Execute()
+short SvxAbstractInsRowColDlg_Impl::Execute()
 {
-    return run();
+    return m_xDlg->run();
+}
+
+bool SvxAbstractInsRowColDlg_Impl::StartExecuteAsync(AsyncContext &rCtx)
+{
+    return weld::GenericDialogController::runAsync(m_xDlg, rCtx.maEndDialogFn);
+}
+
+bool SvxAbstractInsRowColDlg_Impl::isInsertBefore() const
+{
+    return m_xDlg->isInsertBefore();
+}
+
+sal_uInt16 SvxAbstractInsRowColDlg_Impl::getInsertCount() const
+{
+    return m_xDlg->getInsertCount();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cui/source/factory/dlgfact.cxx b/cui/source/factory/dlgfact.cxx
index 6979167de569..2392fa46edc6 100644
--- a/cui/source/factory/dlgfact.cxx
+++ b/cui/source/factory/dlgfact.cxx
@@ -1475,7 +1475,7 @@ VclPtr<VclAbstractDialog> 
AbstractDialogFactory_Impl::CreateOptionsDialog(weld::
 
 VclPtr<SvxAbstractInsRowColDlg> 
AbstractDialogFactory_Impl::CreateSvxInsRowColDlg(weld::Window* pParent, bool 
bCol, const OUString& rHelpId)
 {
-    return VclPtr<SvxInsRowColDlg>::Create(pParent, bCol, rHelpId);
+    return 
VclPtr<SvxAbstractInsRowColDlg_Impl>::Create(std::make_shared<SvxInsRowColDlg>(pParent,
 bCol, rHelpId));
 }
 
 VclPtr<AbstractPasswordToOpenModifyDialog> 
AbstractDialogFactory_Impl::CreatePasswordToOpenModifyDialog(
diff --git a/cui/source/inc/insrc.hxx b/cui/source/inc/insrc.hxx
index 597ef172c3e9..9ab7f0fed466 100644
--- a/cui/source/inc/insrc.hxx
+++ b/cui/source/inc/insrc.hxx
@@ -22,7 +22,7 @@
 #include <svx/svxdlg.hxx>
 #include <vcl/weld.hxx>
 
-class SvxInsRowColDlg : public SvxAbstractInsRowColDlg, public 
weld::GenericDialogController
+class SvxInsRowColDlg : public weld::GenericDialogController
 {
 private:
     std::unique_ptr<weld::SpinButton> m_xCountEdit;
@@ -32,8 +32,21 @@ private:
 public:
     SvxInsRowColDlg(weld::Window* pParent, bool bCol, const OUString& rHelpId);
 
-    virtual short Execute() override;
+    bool isInsertBefore() const;
+    sal_uInt16 getInsertCount() const;
+};
+
+class SvxAbstractInsRowColDlg_Impl final : public SvxAbstractInsRowColDlg
+{
+    std::shared_ptr<SvxInsRowColDlg> m_xDlg;
 
+public:
+    explicit SvxAbstractInsRowColDlg_Impl(std::shared_ptr<SvxInsRowColDlg> p)
+        : m_xDlg(std::move(p))
+    {
+    }
+    virtual short Execute() override;
+    virtual bool StartExecuteAsync(AsyncContext& rCtx) override;
     virtual bool isInsertBefore() const override;
     virtual sal_uInt16 getInsertCount() const override;
 };
diff --git a/sd/source/ui/table/tableobjectbar.cxx 
b/sd/source/ui/table/tableobjectbar.cxx
index 6dfd86928530..bd19915692e8 100644
--- a/sd/source/ui/table/tableobjectbar.cxx
+++ b/sd/source/ui/table/tableobjectbar.cxx
@@ -122,40 +122,50 @@ void TableObjectBar::Execute( SfxRequest& rReq )
         switch( nSlotId )
         {
         case SID_TABLE_INSERT_ROW_DLG:
+        case SID_TABLE_INSERT_COL_DLG:
+        {
+            auto xRequest = std::make_shared<SfxRequest>(rReq);
+            rReq.Ignore(); // the 'old' request is not relevant any more
+            SvxAbstractDialogFactory* pFact = 
SvxAbstractDialogFactory::Create();
+            vcl::Window* pWin = mpView->GetViewShell()->GetParentWindow();
+            VclPtr<SvxAbstractInsRowColDlg> pDlg( 
pFact->CreateSvxInsRowColDlg(pWin ? pWin->GetFrameWeld() : nullptr,
+                                                               nSlotId == 
SID_TABLE_INSERT_COL_DLG,
+                                                               
SD_MOD()->GetSlotPool()->GetSlot(nSlotId)->GetCommand()) );
+            pDlg->StartExecuteAsync(
+                [pDlg, xRequest, nSlotId, xController, pBindings] (sal_Int32 
nResult) mutable ->void
+                {
+                    if (nResult == RET_OK)
+                    {
+                        sal_uInt16 nCount = pDlg->getInsertCount();
+                        bool bInsertAfter = !pDlg->isInsertBefore();
+
+                        if (nSlotId == SID_TABLE_INSERT_ROW_DLG)
+                            nSlotId = SID_TABLE_INSERT_ROW;
+                        else
+                            nSlotId = SID_TABLE_INSERT_COL;
+
+                        xRequest->AppendItem(SfxInt16Item(nSlotId, nCount));
+                        
xRequest->AppendItem(SfxBoolItem(SID_TABLE_PARAM_INSERT_AFTER, bInsertAfter));
+
+                        xRequest->SetSlot( nSlotId );
+                    }
+                    pDlg->disposeOnce();
+                    xController->Execute( *xRequest );
+                    pBindings->Invalidate( SID_UNDO );
+                    pBindings->Invalidate( SID_REDO );
+                }
+            );
+            return;
+        }
         case SID_TABLE_INSERT_ROW_BEFORE:
         case SID_TABLE_INSERT_ROW_AFTER:
-        case SID_TABLE_INSERT_COL_DLG:
         case SID_TABLE_INSERT_COL_BEFORE:
         case SID_TABLE_INSERT_COL_AFTER:
         {
-            ScopedVclPtr<SvxAbstractInsRowColDlg> pDlg;
-            if (nSlotId == SID_TABLE_INSERT_ROW_DLG || nSlotId == 
SID_TABLE_INSERT_COL_DLG)
-            {
-                SvxAbstractDialogFactory* pFact = 
SvxAbstractDialogFactory::Create();
-                vcl::Window* pWin = mpView->GetViewShell()->GetParentWindow();
-                pDlg.disposeAndReset( pFact->CreateSvxInsRowColDlg(pWin ? 
pWin->GetFrameWeld() : nullptr,
-                                                                   nSlotId == 
SID_TABLE_INSERT_COL_DLG,
-                                                                   
SD_MOD()->GetSlotPool()->GetSlot(nSlotId)->GetCommand()) );
-
-                if (pDlg->Execute() != 1)
-                    break;
-            }
-
             sal_uInt16 nCount = 1;
             bool bInsertAfter = (nSlotId == SID_TABLE_INSERT_ROW_AFTER) || 
(nSlotId == SID_TABLE_INSERT_COL_AFTER);
 
-            if (nSlotId == SID_TABLE_INSERT_ROW_DLG)
-            {
-                nCount = pDlg->getInsertCount();
-                bInsertAfter = !pDlg->isInsertBefore();
-            }
-            else if (nSlotId == SID_TABLE_INSERT_COL_DLG)
-            {
-                nCount = pDlg->getInsertCount();
-                bInsertAfter = !pDlg->isInsertBefore();
-            }
-
-            if (nSlotId == SID_TABLE_INSERT_ROW_DLG || nSlotId == 
SID_TABLE_INSERT_ROW_BEFORE || nSlotId == SID_TABLE_INSERT_ROW_AFTER)
+            if ( nSlotId == SID_TABLE_INSERT_ROW_BEFORE || nSlotId == 
SID_TABLE_INSERT_ROW_AFTER)
                 nSlotId = SID_TABLE_INSERT_ROW;
             else
                 nSlotId = SID_TABLE_INSERT_COL;
diff --git a/sw/source/uibase/shells/tabsh.cxx 
b/sw/source/uibase/shells/tabsh.cxx
index 736c70f20d79..4e17153d166f 100644
--- a/sw/source/uibase/shells/tabsh.cxx
+++ b/sw/source/uibase/shells/tabsh.cxx
@@ -990,20 +990,29 @@ void SwTableShell::Execute(SfxRequest &rReq)
             const SfxSlot* pSlot = GetStaticInterface()->GetSlot(nSlot);
             if ( FN_TABLE_INSERT_ROW_DLG != nSlot || 
!rSh.IsInRepeatedHeadline())
             {
+                auto xRequest = std::make_shared<SfxRequest>(rReq);
+                rReq.Ignore(); // the 'old' request is not relevant any more
                 SvxAbstractDialogFactory* pFact = 
SvxAbstractDialogFactory::Create();
-                ScopedVclPtr<SvxAbstractInsRowColDlg> 
pDlg(pFact->CreateSvxInsRowColDlg(GetView().GetFrameWeld(),
+                VclPtr<SvxAbstractInsRowColDlg> 
pDlg(pFact->CreateSvxInsRowColDlg(GetView().GetFrameWeld(),
                                                                                
         nSlot == FN_TABLE_INSERT_COL_DLG, pSlot->GetCommand()));
-                if( pDlg->Execute() == 1 )
-                {
-                    const TypedWhichId<SfxUInt16Item> nDispatchSlot = (nSlot 
== FN_TABLE_INSERT_COL_DLG)
-                        ? FN_TABLE_INSERT_COL_AFTER : 
FN_TABLE_INSERT_ROW_AFTER;
-                    SfxUInt16Item aCountItem( nDispatchSlot, 
pDlg->getInsertCount() );
-                    SfxBoolItem  aAfter( FN_PARAM_INSERT_AFTER, 
!pDlg->isInsertBefore() );
-                    SfxViewFrame& rVFrame = GetView().GetViewFrame();
-                    rVFrame.GetDispatcher()->ExecuteList(nDispatchSlot,
-                        SfxCallMode::SYNCHRON|SfxCallMode::RECORD,
-                        { &aCountItem, &aAfter });
-                }
+                pDlg->StartExecuteAsync(
+                    [this, pDlg, xRequest, nSlot] (sal_Int32 nResult)->void
+                    {
+                        if (nResult == RET_OK)
+                        {
+                            const TypedWhichId<SfxUInt16Item> nDispatchSlot = 
(nSlot == FN_TABLE_INSERT_COL_DLG)
+                                ? FN_TABLE_INSERT_COL_AFTER : 
FN_TABLE_INSERT_ROW_AFTER;
+                            SfxUInt16Item aCountItem( nDispatchSlot, 
pDlg->getInsertCount() );
+                            SfxBoolItem  aAfter( FN_PARAM_INSERT_AFTER, 
!pDlg->isInsertBefore() );
+                            SfxViewFrame& rVFrame = GetView().GetViewFrame();
+                            rVFrame.GetDispatcher()->ExecuteList(nDispatchSlot,
+                                SfxCallMode::SYNCHRON|SfxCallMode::RECORD,
+                                { &aCountItem, &aAfter });
+                        }
+                        pDlg->disposeOnce();
+                        xRequest->Done();
+                    }
+                );
             }
             break;
         }

Reply via email to