summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSzymon Kłos <szymon.klos@collabora.com>2020-05-20 18:53:39 +0200
committerSzymon Kłos <szymon.klos@collabora.com>2020-05-21 11:19:05 +0200
commitb516387cda854c93af29d270816b8acdb86d4d36 (patch)
tree438d661a5edb3d1fdae10fb9671013368436e8c9
parentc0f402da0f3ae8318103fc269e98c25617e83111 (diff)
Make Impress Insert Table dialog async
Change-Id: If8b48cfe983819387c066d3bd81a42dad8947489 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94591 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Szymon Kłos <szymon.klos@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94612 Tested-by: Jenkins
-rw-r--r--cui/source/dialogs/newtabledlg.cxx10
-rw-r--r--cui/source/factory/dlgfact.cxx4
-rw-r--r--cui/source/factory/dlgfact.hxx2
-rw-r--r--cui/source/inc/newtabledlg.hxx42
-rw-r--r--include/svx/svxdlg.hxx7
-rw-r--r--sd/source/ui/table/tablefunction.cxx196
6 files changed, 151 insertions, 110 deletions
diff --git a/cui/source/dialogs/newtabledlg.cxx b/cui/source/dialogs/newtabledlg.cxx
index af4d91f1b1c5..16e81f8d90ea 100644
--- a/cui/source/dialogs/newtabledlg.cxx
+++ b/cui/source/dialogs/newtabledlg.cxx
@@ -26,16 +26,6 @@ SvxNewTableDialog::SvxNewTableDialog(weld::Window* pWindow)
{
}
-SvxNewTableDialog::~SvxNewTableDialog()
-{
- disposeOnce();
-}
-
-short SvxNewTableDialog::Execute()
-{
- return m_xDialog->run();
-}
-
sal_Int32 SvxNewTableDialog::getRows() const
{
return sal::static_int_cast< sal_Int32 >( mxNumRows->get_value() );
diff --git a/cui/source/factory/dlgfact.cxx b/cui/source/factory/dlgfact.cxx
index b4d16c5a92d5..40102bae726a 100644
--- a/cui/source/factory/dlgfact.cxx
+++ b/cui/source/factory/dlgfact.cxx
@@ -1628,9 +1628,9 @@ VclPtr<SvxAbstractSplitTableDialog> AbstractDialogFactory_Impl::CreateSvxSplitTa
return VclPtr<SvxSplitTableDlg>::Create( pParent, bIsTableVertical, nMaxVertical, 99 );
}
-VclPtr<SvxAbstractNewTableDialog> AbstractDialogFactory_Impl::CreateSvxNewTableDialog(weld::Window* pParent)
+std::shared_ptr<SvxAbstractNewTableDialog> AbstractDialogFactory_Impl::CreateSvxNewTableDialog(weld::Window* pParent)
{
- return VclPtr<SvxNewTableDialog>::Create(pParent);
+ return std::make_shared<SvxNewTableDialogWrapper>(pParent);
}
VclPtr<VclAbstractDialog> AbstractDialogFactory_Impl::CreateOptionsDialog(weld::Window* pParent, const OUString& rExtensionId)
diff --git a/cui/source/factory/dlgfact.hxx b/cui/source/factory/dlgfact.hxx
index 38de7db093fc..4f54b03f91d4 100644
--- a/cui/source/factory/dlgfact.hxx
+++ b/cui/source/factory/dlgfact.hxx
@@ -944,7 +944,7 @@ public:
virtual VclPtr<SvxAbstractSplitTableDialog> CreateSvxSplitTableDialog(weld::Window* pParent, bool bIsTableVertical, long nMaxVertical) override;
- virtual VclPtr<SvxAbstractNewTableDialog> CreateSvxNewTableDialog(weld::Window* pParent) override ;
+ virtual std::shared_ptr<SvxAbstractNewTableDialog> CreateSvxNewTableDialog(weld::Window* pParent) override ;
virtual VclPtr<VclAbstractDialog> CreateOptionsDialog(
weld::Window* pParent, const OUString& rExtensionId ) override;
diff --git a/cui/source/inc/newtabledlg.hxx b/cui/source/inc/newtabledlg.hxx
index 320b319d315d..9ec717c70ab1 100644
--- a/cui/source/inc/newtabledlg.hxx
+++ b/cui/source/inc/newtabledlg.hxx
@@ -22,7 +22,7 @@
#include <svx/svxdlg.hxx>
#include <vcl/weld.hxx>
-class SvxNewTableDialog : public SvxAbstractNewTableDialog, public weld::GenericDialogController
+class SvxNewTableDialog : public weld::GenericDialogController
{
private:
std::unique_ptr<weld::SpinButton> mxNumColumns;
@@ -30,12 +30,44 @@ private:
public:
SvxNewTableDialog(weld::Window* pParent);
- virtual ~SvxNewTableDialog() override;
- virtual short Execute() override;
+ virtual sal_Int32 getRows() const;
+ virtual sal_Int32 getColumns() const;
+};
+
+class SvxNewTableDialogWrapper : public SvxAbstractNewTableDialog
+{
+private:
+ std::shared_ptr<weld::DialogController> m_xDlg;
+
+public:
+ SvxNewTableDialogWrapper(weld::Window* pParent)
+ : m_xDlg(std::make_shared<SvxNewTableDialog>(pParent))
+ {
+ }
+
+ virtual std::shared_ptr<weld::DialogController> getDialogController() override
+ {
+ return m_xDlg;
+ }
+
+ virtual sal_Int32 getRows() const override
+ {
+ SvxNewTableDialog* pDlg = dynamic_cast<SvxNewTableDialog*>(m_xDlg.get());
+ if (pDlg)
+ return pDlg->getRows();
+
+ return 0;
+ }
+
+ virtual sal_Int32 getColumns() const override
+ {
+ SvxNewTableDialog* pDlg = dynamic_cast<SvxNewTableDialog*>(m_xDlg.get());
+ if (pDlg)
+ return pDlg->getColumns();
- virtual sal_Int32 getRows() const override;
- virtual sal_Int32 getColumns() const override;
+ return 0;
+ }
};
#endif // INCLUDED_CUI_SOURCE_INC_NEWTABLEDLG_HXX
diff --git a/include/svx/svxdlg.hxx b/include/svx/svxdlg.hxx
index 76ef0d3c35cb..7fb3767ad742 100644
--- a/include/svx/svxdlg.hxx
+++ b/include/svx/svxdlg.hxx
@@ -300,13 +300,14 @@ public:
virtual void SetSplitVerticalByDefault() = 0;
};
-class SvxAbstractNewTableDialog : public VclAbstractDialog
+class SvxAbstractNewTableDialog
{
protected:
- virtual ~SvxAbstractNewTableDialog() override = default;
+ virtual ~SvxAbstractNewTableDialog() = default;
public:
virtual sal_Int32 getRows() const = 0;
virtual sal_Int32 getColumns() const = 0;
+ virtual std::shared_ptr<weld::DialogController> getDialogController() = 0;
};
class SvxAbstractInsRowColDlg : public VclAbstractDialog
@@ -453,7 +454,7 @@ public:
virtual VclPtr<SvxAbstractSplitTableDialog> CreateSvxSplitTableDialog(weld::Window* pParent, bool bIsTableVertical, long nMaxVertical) = 0;
- virtual VclPtr<SvxAbstractNewTableDialog> CreateSvxNewTableDialog(weld::Window* pParent) = 0;
+ virtual std::shared_ptr<SvxAbstractNewTableDialog> CreateSvxNewTableDialog(weld::Window* pParent) = 0;
virtual VclPtr<SvxAbstractInsRowColDlg> CreateSvxInsRowColDlg(weld::Window* pParent, bool bCol, const OString& rHelpId) = 0;
};
diff --git a/sd/source/ui/table/tablefunction.cxx b/sd/source/ui/table/tablefunction.cxx
index 2a031e525d32..1f49f5fc2fff 100644
--- a/sd/source/ui/table/tablefunction.cxx
+++ b/sd/source/ui/table/tablefunction.cxx
@@ -84,6 +84,98 @@ static void apply_table_style( SdrTableObj* pObj, SdrModel const * pModel, const
}
}
+static void InsertTableImpl(DrawViewShell* pShell,
+ ::sd::View* pView,
+ sal_Int32 nColumns,
+ sal_Int32 nRows,
+ const OUString& sTableStyle)
+{
+ ::tools::Rectangle aRect;
+
+ SdrObject* pPickObj = pView->GetEmptyPresentationObject( PresObjKind::Table );
+ if( pPickObj )
+ {
+ aRect = pPickObj->GetLogicRect();
+ aRect.setHeight( 200 );
+ }
+ else
+ {
+ Size aSize( 14100, 2000 );
+
+ Point aPos;
+ ::tools::Rectangle aWinRect(aPos, pShell->GetActiveWindow()->GetOutputSizePixel());
+ aWinRect = pShell->GetActiveWindow()->PixelToLogic(aWinRect);
+
+ // make sure that the default size of the table fits on the paper and is inside the viewing area.
+ // if zoomed in close, don't make the table bigger than the viewing window.
+ Size aMaxSize = pShell->getCurrentPage()->GetSize();
+
+ if (comphelper::LibreOfficeKit::isActive())
+ {
+ // aWinRect is nonsensical in the LOK case
+ aWinRect = ::tools::Rectangle(aPos, aMaxSize);
+ }
+ else
+ {
+ if( aMaxSize.Height() > aWinRect.getHeight() )
+ aMaxSize.setHeight( aWinRect.getHeight() );
+ if( aMaxSize.Width() > aWinRect.getWidth() )
+ aMaxSize.setWidth( aWinRect.getWidth() );
+ }
+
+ if( aSize.Width() > aMaxSize.getWidth() )
+ aSize.setWidth( aMaxSize.getWidth() );
+
+ // adjust height based on # of rows.
+ if( nRows > 0 )
+ {
+ aSize.setHeight( aSize.Height() * nRows );
+ if( aSize.Height() > aMaxSize.getHeight() )
+ aSize.setHeight( aMaxSize.getHeight() );
+ }
+
+ aPos = aWinRect.Center();
+ aPos.AdjustX( -(aSize.Width() / 2) );
+ aPos.AdjustY( -(aSize.Height() / 2) );
+ aRect = ::tools::Rectangle(aPos, aSize);
+ }
+
+ sdr::table::SdrTableObj* pObj = new sdr::table::SdrTableObj(
+ *pShell->GetDoc(), // TTTT should be reference
+ aRect,
+ nColumns,
+ nRows);
+ pObj->NbcSetStyleSheet( pShell->GetDoc()->GetDefaultStyleSheet(), true );
+ apply_table_style( pObj, pShell->GetDoc(), sTableStyle );
+ SdrPageView* pPV = pView->GetSdrPageView();
+
+ // #i123359# if an object is to be replaced/manipulated it may be that it is in text edit mode,
+ // so to be on the safe side call SdrEndTextEdit here
+ SdrTextObj* pCheckForTextEdit = dynamic_cast< SdrTextObj* >(pPickObj);
+
+ if(pCheckForTextEdit && pCheckForTextEdit->IsInEditMode())
+ {
+ pView->SdrEndTextEdit();
+ }
+
+ // if we have a pick obj we need to make this new ole a pres obj replacing the current pick obj
+ if( pPickObj )
+ {
+ SdPage* pPage = static_cast< SdPage* >(pPickObj->getSdrPageFromSdrObject());
+ if(pPage && pPage->IsPresObj(pPickObj))
+ {
+ pObj->SetUserCall( pPickObj->GetUserCall() );
+ pPage->InsertPresObj( pObj, PresObjKind::Table );
+ }
+ }
+
+ pShell->GetParentWindow()->GrabFocus();
+ if( pPickObj )
+ pView->ReplaceObjectAtView(pPickObj, *pPV, pObj );
+ else
+ pView->InsertObjectAtView(pObj, *pPV, SdrInsertFlags::SETDEFLAYER);
+}
+
void DrawViewShell::FuTable(SfxRequest& rReq)
{
switch( rReq.GetSlot() )
@@ -93,6 +185,8 @@ void DrawViewShell::FuTable(SfxRequest& rReq)
sal_Int32 nColumns = 0;
sal_Int32 nRows = 0;
OUString sTableStyle;
+ DrawViewShell* pShell = this;
+ ::sd::View* pView = mpView;
const SfxUInt16Item* pCols = rReq.GetArg<SfxUInt16Item>(SID_ATTR_TABLE_COLUMN);
const SfxUInt16Item* pRows = rReq.GetArg<SfxUInt16Item>(SID_ATTR_TABLE_ROW);
@@ -110,100 +204,24 @@ void DrawViewShell::FuTable(SfxRequest& rReq)
if( (nColumns == 0) || (nRows == 0) )
{
SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
- ScopedVclPtr<SvxAbstractNewTableDialog> pDlg( pFact->CreateSvxNewTableDialog(rReq.GetFrameWeld()) );
-
- if( pDlg->Execute() != RET_OK )
- break;
-
- nColumns = pDlg->getColumns();
- nRows = pDlg->getRows();
- }
-
- ::tools::Rectangle aRect;
-
- SdrObject* pPickObj = mpView->GetEmptyPresentationObject( PresObjKind::Table );
- if( pPickObj )
- {
- aRect = pPickObj->GetLogicRect();
- aRect.setHeight( 200 );
+ std::shared_ptr<SvxAbstractNewTableDialog> pDlg( pFact->CreateSvxNewTableDialog(rReq.GetFrameWeld()) );
+
+ weld::DialogController::runAsync(pDlg->getDialogController(),
+ [pDlg, pShell, pView, sTableStyle] (sal_Int32 nResult) {
+ if (nResult == RET_OK)
+ {
+ sal_Int32 nColumnsIn = pDlg->getColumns();
+ sal_Int32 nRowsIn = pDlg->getRows();
+
+ InsertTableImpl(pShell, pView, nColumnsIn, nRowsIn, sTableStyle);
+ }
+ });
}
else
{
- Size aSize( 14100, 2000 );
-
- Point aPos;
- ::tools::Rectangle aWinRect(aPos, GetActiveWindow()->GetOutputSizePixel());
- aWinRect = GetActiveWindow()->PixelToLogic(aWinRect);
-
- // make sure that the default size of the table fits on the paper and is inside the viewing area.
- // if zoomed in close, don't make the table bigger than the viewing window.
- Size aMaxSize = getCurrentPage()->GetSize();
-
- if (comphelper::LibreOfficeKit::isActive())
- {
- // aWinRect is nonsensical in the LOK case
- aWinRect = ::tools::Rectangle(aPos, aMaxSize);
- }
- else
- {
- if( aMaxSize.Height() > aWinRect.getHeight() )
- aMaxSize.setHeight( aWinRect.getHeight() );
- if( aMaxSize.Width() > aWinRect.getWidth() )
- aMaxSize.setWidth( aWinRect.getWidth() );
- }
-
- if( aSize.Width() > aMaxSize.getWidth() )
- aSize.setWidth( aMaxSize.getWidth() );
-
- // adjust height based on # of rows.
- if( nRows > 0 )
- {
- aSize.setHeight( aSize.Height() * nRows );
- if( aSize.Height() > aMaxSize.getHeight() )
- aSize.setHeight( aMaxSize.getHeight() );
- }
-
- aPos = aWinRect.Center();
- aPos.AdjustX( -(aSize.Width() / 2) );
- aPos.AdjustY( -(aSize.Height() / 2) );
- aRect = ::tools::Rectangle(aPos, aSize);
- }
-
- sdr::table::SdrTableObj* pObj = new sdr::table::SdrTableObj(
- *GetDoc(), // TTTT should be reference
- aRect,
- nColumns,
- nRows);
- pObj->NbcSetStyleSheet( GetDoc()->GetDefaultStyleSheet(), true );
- apply_table_style( pObj, GetDoc(), sTableStyle );
- SdrPageView* pPV = mpView->GetSdrPageView();
-
- // #i123359# if an object is to be replaced/manipulated it may be that it is in text edit mode,
- // so to be on the safe side call SdrEndTextEdit here
- SdrTextObj* pCheckForTextEdit = dynamic_cast< SdrTextObj* >(pPickObj);
-
- if(pCheckForTextEdit && pCheckForTextEdit->IsInEditMode())
- {
- mpView->SdrEndTextEdit();
- }
-
- // if we have a pick obj we need to make this new ole a pres obj replacing the current pick obj
- if( pPickObj )
- {
- SdPage* pPage = static_cast< SdPage* >(pPickObj->getSdrPageFromSdrObject());
- if(pPage && pPage->IsPresObj(pPickObj))
- {
- pObj->SetUserCall( pPickObj->GetUserCall() );
- pPage->InsertPresObj( pObj, PresObjKind::Table );
- }
+ InsertTableImpl(pShell, pView, nColumns, nRows, sTableStyle);
}
- GetParentWindow()->GrabFocus();
- if( pPickObj )
- mpView->ReplaceObjectAtView(pPickObj, *pPV, pObj );
- else
- mpView->InsertObjectAtView(pObj, *pPV, SdrInsertFlags::SETDEFLAYER);
-
rReq.Ignore();
SfxViewShell* pViewShell = GetViewShell();
OSL_ASSERT (pViewShell!=nullptr);