cui/source/factory/dlgfact.cxx       |   19 +++++++++-
 cui/source/factory/dlgfact.hxx       |   15 +++++++-
 include/svx/svxdlg.hxx               |   11 +++++
 sc/inc/scabstdlg.hxx                 |   11 +++++
 sc/source/ui/attrdlg/scdlgfact.cxx   |   19 +++++++++-
 sc/source/ui/attrdlg/scdlgfact.hxx   |   15 +++++++-
 sc/source/ui/view/cellsh2.cxx        |   65 ++++++++---------------------------
 svx/source/table/tablecontroller.cxx |   63 ++++++++++++++++++---------------
 8 files changed, 131 insertions(+), 87 deletions(-)

New commits:
commit f5c74d4deecce1e0adc9fc0ac4545b880e3b2564
Author:     Szymon Kłos <szymon.k...@collabora.com>
AuthorDate: Wed Jul 22 16:17:37 2020 +0200
Commit:     Szymon Kłos <szymon.k...@collabora.com>
CommitDate: Thu Jul 23 10:39:09 2020 +0200

    Make Table Properties dialog async
    
    Change-Id: I0fb84ed3660f9a153ad89126a927299954360c2f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99228
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Szymon Kłos <szymon.k...@collabora.com>

diff --git a/cui/source/factory/dlgfact.cxx b/cui/source/factory/dlgfact.cxx
index 5c1979943ac3..46180fc4435c 100644
--- a/cui/source/factory/dlgfact.cxx
+++ b/cui/source/factory/dlgfact.cxx
@@ -385,6 +385,21 @@ OString CuiAbstractTabController_Impl::GetScreenshotId() 
const
     return m_xDlg->GetScreenshotId();
 }
 
+bool 
CuiAsyncAbstractTabController_Impl::StartExecuteAsync(VclAbstractDialog::AsyncContext
 &rCtx)
+{
+    return SfxTabDialogController::runAsync(m_xDlg, rCtx.maEndDialogFn);
+}
+
+void CuiAsyncAbstractTabController_Impl::SetCurPageId( const OString &rName )
+{
+    m_xDlg->SetCurPageId( rName );
+}
+
+const SfxItemSet* CuiAsyncAbstractTabController_Impl::GetOutputItemSet() const
+{
+    return m_xDlg->GetOutputItemSet();
+}
+
 const SfxItemSet* CuiAbstractSingleTabController_Impl::GetOutputItemSet() const
 {
     return m_xDlg->GetOutputItemSet();
@@ -1597,9 +1612,9 @@ VclPtr<SfxAbstractLinksDialog> 
AbstractDialogFactory_Impl::CreateLinksDialog(wel
     return VclPtr<AbstractLinksDialog_Impl>::Create(std::move(xLinkDlg));
 }
 
-VclPtr<SfxAbstractTabDialog> 
AbstractDialogFactory_Impl::CreateSvxFormatCellsDialog(weld::Window* pParent, 
const SfxItemSet* pAttr, const SdrModel& rModel)
+std::shared_ptr<AbstractTabController> 
AbstractDialogFactory_Impl::CreateSvxFormatCellsDialog(weld::Window* pParent, 
const SfxItemSet* pAttr, const SdrModel& rModel)
 {
-    return 
VclPtr<CuiAbstractTabController_Impl>::Create(std::make_unique<SvxFormatCellsDialog>(pParent,
 pAttr, rModel));
+    return 
std::make_shared<CuiAsyncAbstractTabController_Impl>(std::make_unique<SvxFormatCellsDialog>(pParent,
 pAttr, rModel));
 }
 
 VclPtr<SvxAbstractSplitTableDialog> 
AbstractDialogFactory_Impl::CreateSvxSplitTableDialog(weld::Window* pParent, 
bool bIsTableVertical, long nMaxVertical)
diff --git a/cui/source/factory/dlgfact.hxx b/cui/source/factory/dlgfact.hxx
index c7e66c44556d..27566e6a7224 100644
--- a/cui/source/factory/dlgfact.hxx
+++ b/cui/source/factory/dlgfact.hxx
@@ -161,6 +161,19 @@ public:
     virtual OString GetScreenshotId() const override;
 };
 
+class CuiAsyncAbstractTabController_Impl : public AbstractTabController
+{
+    std::shared_ptr<SfxTabDialogController> m_xDlg;
+public:
+    explicit 
CuiAsyncAbstractTabController_Impl(std::unique_ptr<SfxTabDialogController> p)
+        : m_xDlg(std::move(p))
+    {
+    }
+    virtual bool StartExecuteAsync(VclAbstractDialog::AsyncContext &rCtx) 
override;
+    virtual void                SetCurPageId( const OString &rName ) override;
+    virtual const SfxItemSet*   GetOutputItemSet() const override;
+};
+
 class SvxDistributeDialog;
 class AbstractSvxDistributeDialog_Impl: public AbstractSvxDistributeDialog
 {
@@ -922,7 +935,7 @@ public:
                 const sal_uInt16 _nInitiallySelectedEvent
             ) override;
 
-    virtual VclPtr<SfxAbstractTabDialog> 
CreateSvxFormatCellsDialog(weld::Window* pParent, const SfxItemSet* pAttr, 
const SdrModel& rModel) override;
+    virtual std::shared_ptr<AbstractTabController> 
CreateSvxFormatCellsDialog(weld::Window* pParent, const SfxItemSet* pAttr, 
const SdrModel& rModel) override;
 
     virtual VclPtr<SvxAbstractSplitTableDialog> 
CreateSvxSplitTableDialog(weld::Window* pParent, bool bIsTableVertical, long 
nMaxVertical) override;
 
diff --git a/include/svx/svxdlg.hxx b/include/svx/svxdlg.hxx
index b0be803adbd7..f81a8d983539 100644
--- a/include/svx/svxdlg.hxx
+++ b/include/svx/svxdlg.hxx
@@ -67,6 +67,15 @@ namespace weld{
     class Window;
 }
 
+class AbstractTabController
+{
+public:
+    virtual ~AbstractTabController() = default;
+    virtual bool StartExecuteAsync(VclAbstractDialog::AsyncContext &rCtx) = 0;
+    virtual void                SetCurPageId( const OString &rName ) = 0;
+    virtual const SfxItemSet*   GetOutputItemSet() const = 0;
+};
+
 class AbstractSvxDistributeDialog :public VclAbstractDialog
 {
 protected:
@@ -461,7 +470,7 @@ public:
                 const sal_uInt16 _nInitiallySelectedEvent
             ) = 0;
 
-    virtual VclPtr<SfxAbstractTabDialog> 
CreateSvxFormatCellsDialog(weld::Window* pParent, const SfxItemSet* pAttr, 
const SdrModel& rModel )=0;
+    virtual std::shared_ptr<AbstractTabController> 
CreateSvxFormatCellsDialog(weld::Window* pParent, const SfxItemSet* pAttr, 
const SdrModel& rModel )=0;
 
     virtual VclPtr<SvxAbstractSplitTableDialog> 
CreateSvxSplitTableDialog(weld::Window* pParent, bool bIsTableVertical, long 
nMaxVertical) = 0;
 
diff --git a/svx/source/table/tablecontroller.cxx 
b/svx/source/table/tablecontroller.cxx
index a153c2b6db62..d5d0468c530f 100644
--- a/svx/source/table/tablecontroller.cxx
+++ b/svx/source/table/tablecontroller.cxx
@@ -910,46 +910,51 @@ void SvxTableController::onFormatTable(const SfxRequest& 
rReq)
         aNewAttr.Put( aBoxInfoItem );
 
         SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
-        ScopedVclPtr<SfxAbstractTabDialog> xDlg( 
pFact->CreateSvxFormatCellsDialog(
+        std::shared_ptr<AbstractTabController> xDlg( 
pFact->CreateSvxFormatCellsDialog(
             rReq.GetFrameWeld(),
             &aNewAttr,
             rModel) );
 
-        // Even Cancel Button is returning positive(101) value,
-        if (xDlg->Execute() == RET_OK)
-        {
-            SfxItemSet aNewSet(*(xDlg->GetOutputItemSet()));
-
-            //Only properties that were unchanged by the dialog appear in this
-            //itemset.  We had constructed these two properties from other
-            //ones, so if they were not changed, then forcible set them back to
-            //their originals in the new result set so we can decompose that
-            //unchanged state back to their input properties
-            if (aNewSet.GetItemState(SDRATTR_TABLE_BORDER, false) != 
SfxItemState::SET)
-            {
-                aNewSet.Put(aBoxItem);
-            }
-            if (aNewSet.GetItemState(SDRATTR_TABLE_BORDER_INNER, false) != 
SfxItemState::SET)
+        SvxTableController* pThis = this;
+        VclAbstractDialog::AsyncContext aContext;
+        aContext.maEndDialogFn = [xDlg, pThis, aBoxItem, aBoxInfoItem](int 
nResult){
+            if (nResult == RET_OK)
             {
-                aNewSet.Put(aBoxInfoItem);
-            }
+                SfxItemSet aNewSet(*(xDlg->GetOutputItemSet()));
+
+                //Only properties that were unchanged by the dialog appear in 
this
+                //itemset.  We had constructed these two properties from other
+                //ones, so if they were not changed, then forcible set them 
back to
+                //their originals in the new result set so we can decompose 
that
+                //unchanged state back to their input properties
+                if (aNewSet.GetItemState(SDRATTR_TABLE_BORDER, false) != 
SfxItemState::SET)
+                {
+                    aNewSet.Put(aBoxItem);
+                }
+                if (aNewSet.GetItemState(SDRATTR_TABLE_BORDER_INNER, false) != 
SfxItemState::SET)
+                {
+                    aNewSet.Put(aBoxInfoItem);
+                }
 
-            SvxBoxItem aNewBoxItem( aNewSet.Get( SDRATTR_TABLE_BORDER ) );
+                SvxBoxItem aNewBoxItem( aNewSet.Get( SDRATTR_TABLE_BORDER ) );
 
-            if( aNewBoxItem.GetDistance( SvxBoxItemLine::LEFT ) != 
aBoxItem.GetDistance( SvxBoxItemLine::LEFT ) )
-                aNewSet.Put(makeSdrTextLeftDistItem( aNewBoxItem.GetDistance( 
SvxBoxItemLine::LEFT ) ) );
+                if( aNewBoxItem.GetDistance( SvxBoxItemLine::LEFT ) != 
aBoxItem.GetDistance( SvxBoxItemLine::LEFT ) )
+                    aNewSet.Put(makeSdrTextLeftDistItem( 
aNewBoxItem.GetDistance( SvxBoxItemLine::LEFT ) ) );
 
-            if( aNewBoxItem.GetDistance( SvxBoxItemLine::RIGHT ) != 
aBoxItem.GetDistance( SvxBoxItemLine::RIGHT ) )
-                aNewSet.Put(makeSdrTextRightDistItem( aNewBoxItem.GetDistance( 
SvxBoxItemLine::RIGHT ) ) );
+                if( aNewBoxItem.GetDistance( SvxBoxItemLine::RIGHT ) != 
aBoxItem.GetDistance( SvxBoxItemLine::RIGHT ) )
+                    aNewSet.Put(makeSdrTextRightDistItem( 
aNewBoxItem.GetDistance( SvxBoxItemLine::RIGHT ) ) );
 
-            if( aNewBoxItem.GetDistance( SvxBoxItemLine::TOP ) != 
aBoxItem.GetDistance( SvxBoxItemLine::TOP ) )
-                aNewSet.Put(makeSdrTextUpperDistItem( aNewBoxItem.GetDistance( 
SvxBoxItemLine::TOP ) ) );
+                if( aNewBoxItem.GetDistance( SvxBoxItemLine::TOP ) != 
aBoxItem.GetDistance( SvxBoxItemLine::TOP ) )
+                    aNewSet.Put(makeSdrTextUpperDistItem( 
aNewBoxItem.GetDistance( SvxBoxItemLine::TOP ) ) );
 
-            if( aNewBoxItem.GetDistance( SvxBoxItemLine::BOTTOM ) != 
aBoxItem.GetDistance( SvxBoxItemLine::BOTTOM ) )
-                aNewSet.Put(makeSdrTextLowerDistItem( aNewBoxItem.GetDistance( 
SvxBoxItemLine::BOTTOM ) ) );
+                if( aNewBoxItem.GetDistance( SvxBoxItemLine::BOTTOM ) != 
aBoxItem.GetDistance( SvxBoxItemLine::BOTTOM ) )
+                    aNewSet.Put(makeSdrTextLowerDistItem( 
aNewBoxItem.GetDistance( SvxBoxItemLine::BOTTOM ) ) );
 
-            SetAttrToSelectedCells(aNewSet, false);
-        }
+                pThis->SetAttrToSelectedCells(aNewSet, false);
+            }
+        };
+
+        xDlg->StartExecuteAsync(aContext);
     }
 }
 
commit 353a093c508562c14dada49c2e1d937e5e02e642
Author:     Szymon Kłos <szymon.k...@collabora.com>
AuthorDate: Tue Jul 21 11:40:22 2020 +0200
Commit:     Szymon Kłos <szymon.k...@collabora.com>
CommitDate: Thu Jul 23 10:38:53 2020 +0200

    Make Sort dialog async
    
    Change-Id: I914e09e59561e261dc2807ad00615d3b58afa541
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99127
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Szymon Kłos <szymon.k...@collabora.com>

diff --git a/sc/inc/scabstdlg.hxx b/sc/inc/scabstdlg.hxx
index 16690afefcc0..2991a224f3ea 100644
--- a/sc/inc/scabstdlg.hxx
+++ b/sc/inc/scabstdlg.hxx
@@ -52,6 +52,15 @@ namespace com { namespace sun { namespace star { namespace 
sheet {
     struct DataPilotFieldReference;
 } } } }
 
+class ScAsyncTabController
+{
+public:
+    virtual ~ScAsyncTabController() = default;
+    virtual bool  StartExecuteAsync(VclAbstractDialog::AsyncContext &rCtx) = 0;
+    virtual const SfxItemSet*   GetOutputItemSet() const = 0;
+    virtual void                SetCurPageId( const OString &rName ) = 0;
+};
+
 class AbstractScImportAsciiDlg : public VclAbstractDialog
 {
 protected:
@@ -537,7 +546,7 @@ public:
     virtual VclPtr<SfxAbstractTabDialog> CreateScParagraphDlg(weld::Window* 
pParent,
         const SfxItemSet* pAttr) = 0;
 
-    virtual VclPtr<SfxAbstractTabDialog> CreateScSortDlg(weld::Window* 
pParent, const SfxItemSet* pArgSet) = 0;
+    virtual std::shared_ptr<ScAsyncTabController> 
CreateScSortDlg(weld::Window* pParent, const SfxItemSet* pArgSet) = 0;
 
     // for tabpage
     virtual CreateTabPage                GetTabPageCreatorFunc( sal_uInt16 nId 
) = 0;
diff --git a/sc/source/ui/attrdlg/scdlgfact.cxx 
b/sc/source/ui/attrdlg/scdlgfact.cxx
index af0bcfdef27e..238a46fb725e 100644
--- a/sc/source/ui/attrdlg/scdlgfact.cxx
+++ b/sc/source/ui/attrdlg/scdlgfact.cxx
@@ -935,6 +935,21 @@ OString ScAbstractTabController_Impl::GetScreenshotId() 
const
     return m_xDlg->GetScreenshotId();
 }
 
+bool 
ScAsyncTabController_Impl::StartExecuteAsync(VclAbstractDialog::AsyncContext 
&rCtx)
+{
+    return SfxTabDialogController::runAsync(m_xDlg, rCtx.maEndDialogFn);
+}
+
+void ScAsyncTabController_Impl::SetCurPageId( const OString &rName )
+{
+    m_xDlg->SetCurPageId( rName );
+}
+
+const SfxItemSet* ScAsyncTabController_Impl::GetOutputItemSet() const
+{
+    return m_xDlg->GetOutputItemSet();
+}
+
 // =========================Factories  for createdialog ===================
 VclPtr<AbstractScImportAsciiDlg> 
ScAbstractDialogFactory_Impl::CreateScImportAsciiDlg(weld::Window* pParent,
                                                     const OUString& aDatName,
@@ -1236,9 +1251,9 @@ VclPtr<SfxAbstractTabDialog> 
ScAbstractDialogFactory_Impl::CreateScParagraphDlg(
     return 
VclPtr<ScAbstractTabController_Impl>::Create(std::make_unique<ScParagraphDlg>(pParent,
 pAttr));
 }
 
-VclPtr<SfxAbstractTabDialog> 
ScAbstractDialogFactory_Impl::CreateScSortDlg(weld::Window* pParent, const 
SfxItemSet* pArgSet)
+std::shared_ptr<ScAsyncTabController> 
ScAbstractDialogFactory_Impl::CreateScSortDlg(weld::Window* pParent, const 
SfxItemSet* pArgSet)
 {
-    return 
VclPtr<ScAbstractTabController_Impl>::Create(std::make_unique<ScSortDlg>(pParent,
 pArgSet));
+    return 
std::make_shared<ScAsyncTabController_Impl>(std::make_unique<ScSortDlg>(pParent,
 pArgSet));
 }
 
 //------------------ Factories for TabPages--------------------
diff --git a/sc/source/ui/attrdlg/scdlgfact.hxx 
b/sc/source/ui/attrdlg/scdlgfact.hxx
index 60e5a6bc35d8..aa9c28a35ebb 100644
--- a/sc/source/ui/attrdlg/scdlgfact.hxx
+++ b/sc/source/ui/attrdlg/scdlgfact.hxx
@@ -652,6 +652,19 @@ public:
     virtual OString GetScreenshotId() const override;
 };
 
+class ScAsyncTabController_Impl : public ScAsyncTabController
+{
+    std::shared_ptr<SfxTabDialogController> m_xDlg;
+public:
+    explicit ScAsyncTabController_Impl(std::unique_ptr<SfxTabDialogController> 
p)
+        : m_xDlg(std::move(p))
+    {
+    }
+    virtual bool  StartExecuteAsync(VclAbstractDialog::AsyncContext &rCtx) 
override;
+    virtual const SfxItemSet*   GetOutputItemSet() const override;
+    virtual void                SetCurPageId( const OString &rName ) override;
+};
+
 //AbstractDialogFactory_Impl implementations
 class ScAbstractDialogFactory_Impl : public ScAbstractDialogFactory
 {
@@ -801,7 +814,7 @@ public:
     virtual VclPtr<SfxAbstractTabDialog> CreateScParagraphDlg(weld::Window* 
pParent,
         const SfxItemSet* pAttr) override;
 
-    virtual VclPtr<SfxAbstractTabDialog> CreateScSortDlg(weld::Window* 
pParent, const SfxItemSet* pArgSet) override;
+    virtual std::shared_ptr<ScAsyncTabController> 
CreateScSortDlg(weld::Window* pParent, const SfxItemSet* pArgSet) override;
 
     // For TabPage
     virtual CreateTabPage                GetTabPageCreatorFunc( sal_uInt16 nId 
) override;
diff --git a/sc/source/ui/view/cellsh2.cxx b/sc/source/ui/view/cellsh2.cxx
index 8be53409fb9b..805212fae00f 100644
--- a/sc/source/ui/view/cellsh2.cxx
+++ b/sc/source/ui/view/cellsh2.cxx
@@ -514,64 +514,29 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq )
                         aArgSet.Put( ScSortItem( SCITEM_SORTDATA, 
GetViewData(), &aSortParam ) );
 
                         ScAbstractDialogFactory* pFact = 
ScAbstractDialogFactory::Create();
-                        ScopedVclPtr<SfxAbstractTabDialog> 
pDlg(pFact->CreateScSortDlg(pTabViewShell->GetFrameWeld(),  &aArgSet));
+                        std::shared_ptr<ScAsyncTabController> 
pDlg(pFact->CreateScSortDlg(pTabViewShell->GetFrameWeld(),  &aArgSet));
                         pDlg->SetCurPageId("criteria");  // 1=sort field tab  
2=sort options tab
 
-                        if ( pDlg->Execute() == RET_OK )
-                        {
-                            const SfxItemSet* pOutSet = 
pDlg->GetOutputItemSet();
-                            const ScSortParam& rOutParam = static_cast<const 
ScSortItem&>(
-                                pOutSet->Get( SCITEM_SORTDATA )).GetSortData();
-
-                            // subtotal when needed new
-
-                            pTabViewShell->UISort( rOutParam );
-
-                            if ( rOutParam.bInplace )
+                        VclAbstractDialog::AsyncContext aContext;
+                        aContext.maEndDialogFn = [pDlg, pData, 
pTabViewShell](sal_Int32 nResult)
                             {
-                                rReq.AppendItem( SfxBoolItem( SID_SORT_BYROW,
-                                    rOutParam.bByRow ) );
-                                rReq.AppendItem( SfxBoolItem( 
SID_SORT_HASHEADER,
-                                    rOutParam.bHasHeader ) );
-                                rReq.AppendItem( SfxBoolItem( 
SID_SORT_CASESENS,
-                                    rOutParam.bCaseSens ) );
-                                rReq.AppendItem( SfxBoolItem( 
SID_SORT_NATURALSORT,
-                                            rOutParam.bNaturalSort ) );
-                                rReq.AppendItem( SfxBoolItem( 
SID_SORT_INCCOMMENTS,
-                                            rOutParam.bIncludeComments ) );
-                                rReq.AppendItem( SfxBoolItem( 
SID_SORT_INCIMAGES,
-                                            rOutParam.bIncludeGraphicObjects ) 
);
-                                rReq.AppendItem( SfxBoolItem( SID_SORT_ATTRIBS,
-                                    rOutParam.bIncludePattern ) );
-                                sal_uInt16 nUser = rOutParam.bUserDef ? ( 
rOutParam.nUserIndex + 1 ) : 0;
-                                rReq.AppendItem( SfxUInt16Item( 
SID_SORT_USERDEF, nUser ) );
-                                if ( rOutParam.maKeyState[0].bDoSort )
-                                {
-                                    rReq.AppendItem( SfxInt32Item( FN_PARAM_1,
-                                        rOutParam.maKeyState[0].nField + 1 ) );
-                                    rReq.AppendItem( SfxBoolItem( FN_PARAM_2,
-                                        rOutParam.maKeyState[0].bAscending ) );
-                                }
-                                if ( rOutParam.maKeyState[1].bDoSort )
+                                if ( nResult == RET_OK )
                                 {
-                                    rReq.AppendItem( SfxInt32Item( FN_PARAM_3,
-                                        rOutParam.maKeyState[1].nField + 1 ) );
-                                    rReq.AppendItem( SfxBoolItem( FN_PARAM_4,
-                                        rOutParam.maKeyState[1].bAscending ) );
+                                    const SfxItemSet* pOutSet = 
pDlg->GetOutputItemSet();
+                                    const ScSortParam& rOutParam = 
static_cast<const ScSortItem&>(
+                                        pOutSet->Get( SCITEM_SORTDATA 
)).GetSortData();
+
+                                    // subtotal when needed new
+
+                                    pTabViewShell->UISort( rOutParam );
                                 }
-                                if ( rOutParam.maKeyState[2].bDoSort )
+                                else
                                 {
-                                    rReq.AppendItem( SfxInt32Item( FN_PARAM_5,
-                                        rOutParam.maKeyState[2].nField + 1 ) );
-                                    rReq.AppendItem( SfxBoolItem( FN_PARAM_6,
-                                        rOutParam.maKeyState[2].bAscending ) );
+                                    pData->GetDocShell()->CancelAutoDBRange();
                                 }
-                            }
+                            };
 
-                            rReq.Done();
-                        }
-                        else
-                            GetViewData()->GetDocShell()->CancelAutoDBRange();
+                        pDlg->StartExecuteAsync(aContext);
                     }
                 }
             }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to