summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorSzymon Kłos <szymon.klos@collabora.com>2019-04-17 17:33:10 +0200
committerMichael Meeks <michael.meeks@collabora.com>2019-09-28 11:00:00 +0200
commitcb01bb34713f39b55b5994c7a756d95db4a81231 (patch)
tree3dbc2eec4f64fb88e84bdc5386e574b7101e8bda /sc
parentf5308a09498cde2fc6ab039e17649c5b3ea33e54 (diff)
Make Chart Creation Wizard async
* FuInsertChart as a memeber in ScTabViewShell stores instance is needed to react on the dialog's result * CreationWizardUnoDlg converted to XAsynchronousExecutableDialog added dialog close handler which notifies listeners In the Online dialog become dead after closing, additional PostUserEvent was needed to kill the dialog after real close (without it user needed to select any cell to close dialog) * Reuse in Writer Change-Id: I9fe123d5c189d568f0edb4d36173a224a820a8a3 Reviewed-on: https://gerrit.libreoffice.org/79654 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/source/ui/drawfunc/fuins2.cxx130
-rw-r--r--sc/source/ui/inc/fuinsert.hxx14
-rw-r--r--sc/source/ui/inc/tabvwsh.hxx3
-rw-r--r--sc/source/ui/view/tabvwsh4.cxx1
-rw-r--r--sc/source/ui/view/tabvwshb.cxx2
5 files changed, 87 insertions, 63 deletions
diff --git a/sc/source/ui/drawfunc/fuins2.cxx b/sc/source/ui/drawfunc/fuins2.cxx
index dc01065c8942..5a34fc7a6917 100644
--- a/sc/source/ui/drawfunc/fuins2.cxx
+++ b/sc/source/ui/drawfunc/fuins2.cxx
@@ -56,10 +56,12 @@
#include <com/sun/star/chart2/XChartDocument.hpp>
#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
+#include <com/sun/star/ui/dialogs/XDialogClosedListener.hpp>
#include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/frame/XModel.hpp>
#include <com/sun/star/chart/ChartDataRowSource.hpp>
#include <cppuhelper/bootstrap.hxx>
+#include <svtools/dialogclosedlistener.hxx>
#include <PivotTableDataProvider.hxx>
#include <chart2uno.hxx>
@@ -405,8 +407,58 @@ FuInsertOLE::FuInsertOLE(ScTabViewShell& rViewSh, vcl::Window* pWin, ScDrawView*
rReq.Ignore();
}
+IMPL_LINK( FuInsertChart, DialogClosedHdl, css::ui::dialogs::DialogClosedEvent*, pEvent, void )
+{
+ bool bAddUndo = true;
+
+ if( pEvent->DialogResult == ui::dialogs::ExecutableDialogResults::CANCEL )
+ {
+ // leave OLE inplace mode and unmark
+ OSL_ASSERT( pView );
+ rViewShell.DeactivateOle();
+ pView->UnMarkAll();
+
+ // old page view pointer is invalid after switching sheets
+ SdrPageView* pPV = pView->GetSdrPageView();
+
+ // remove the chart
+ OSL_ASSERT( pPV );
+ SdrPage * pPage( pPV->GetPage());
+ OSL_ASSERT( pPage );
+ OSL_ASSERT( m_pInsertedObject );
+ if( pPage )
+ {
+ // Remove the OLE2 object from the sdr page.
+ SdrObject* pRemoved = pPage->RemoveObject( m_pInsertedObject->GetOrdNum() );
+ OSL_ASSERT( pRemoved == m_pInsertedObject );
+ SdrObject::Free( pRemoved );
+ }
+
+ bAddUndo = false;
+
+ // leave the draw shell
+ rViewShell.SetDrawShell( false );
+
+ // reset marked cell area
+ ScMarkData aMark = rViewShell.GetViewData().GetMarkData();
+ rViewShell.GetViewData().GetViewShell()->SetMarkData(aMark);
+ }
+ else
+ {
+ OSL_ASSERT( pEvent->DialogResult == ui::dialogs::ExecutableDialogResults::OK );
+ //@todo maybe move chart to different table
+ }
+
+ if ( bAddUndo )
+ {
+ // add undo action the same way as in SdrEditView::InsertObjectAtView
+ // (using UndoActionHdl etc.)
+ pView->AddUndo(o3tl::make_unique<SdrUndoNewObj>(*m_pInsertedObject));
+ }
+}
+
FuInsertChart::FuInsertChart(ScTabViewShell& rViewSh, vcl::Window* pWin, ScDrawView* pViewP,
- SdrModel* pDoc, SfxRequest& rReq)
+ SdrModel* pDoc, SfxRequest& rReq)
: FuPoor(rViewSh, pWin, pViewP, pDoc, rReq)
{
const SfxItemSet* pReqArgs = rReq.GetArgs();
@@ -591,7 +643,7 @@ FuInsertChart::FuInsertChart(ScTabViewShell& rViewSh, vcl::Window* pWin, ScDrawV
Point aStart = rViewSh.GetChartInsertPos( aSize, aPositionRange );
tools::Rectangle aRect (aStart, aSize);
- SdrOle2Obj* pObj = new SdrOle2Obj(
+ m_pInsertedObject = new SdrOle2Obj(
*pDoc, // TTTT should be reference
svt::EmbeddedObjectRef(xObj, nAspect),
aName,
@@ -605,11 +657,10 @@ FuInsertChart::FuInsertChart(ScTabViewShell& rViewSh, vcl::Window* pWin, ScDrawV
// pView->InsertObjectAtView(pObj, *pPV);//this call leads to an immediate redraw and asks the chart for a visual representation
// use the page instead of the view to insert, so no undo action is created yet
- SdrPage* pInsPage = pPV->GetPage();
- pInsPage->InsertObject( pObj );
+ SdrPage* m_pPage = pPV->GetPage();
+ m_pPage->InsertObject( m_pInsertedObject );
pView->UnmarkAllObj();
- pView->MarkObj( pObj, pPV );
- bool bAddUndo = true; // add undo action later, unless the dialog is canceled
+ pView->MarkObj( m_pInsertedObject, pPV );
if (rReq.IsAPI())
{
@@ -621,7 +672,7 @@ FuInsertChart::FuInsertChart(ScTabViewShell& rViewSh, vcl::Window* pWin, ScDrawV
//the controller will be unlocked by the dialog when the dialog is told to do so
// only activate object if not called via API (e.g. macro)
- rViewShell.ActivateObject(pObj, embed::EmbedVerbs::MS_OLEVERB_SHOW);
+ rViewShell.ActivateObject( m_pInsertedObject, embed::EmbedVerbs::MS_OLEVERB_SHOW );
//open wizard
//@todo get context from calc if that has one
@@ -632,11 +683,11 @@ FuInsertChart::FuInsertChart(ScTabViewShell& rViewSh, vcl::Window* pWin, ScDrawV
uno::Reference< lang::XMultiComponentFactory > xMCF( xContext->getServiceManager() );
if(xMCF.is())
{
- uno::Reference< ui::dialogs::XExecutableDialog > xDialog(
+ m_xDialog = uno::Reference< ui::dialogs::XAsynchronousExecutableDialog >(
xMCF->createInstanceWithContext(
"com.sun.star.comp.chart2.WizardDialog"
, xContext), uno::UNO_QUERY);
- uno::Reference< lang::XInitialization > xInit( xDialog, uno::UNO_QUERY );
+ uno::Reference< lang::XInitialization > xInit( m_xDialog, uno::UNO_QUERY );
if( xChartModel.is() && xInit.is() )
{
uno::Sequence<uno::Any> aSeq(comphelper::InitAnyPropertySequence(
@@ -647,7 +698,7 @@ FuInsertChart::FuInsertChart(ScTabViewShell& rViewSh, vcl::Window* pWin, ScDrawV
xInit->initialize( aSeq );
// try to set the dialog's position so it doesn't hide the chart
- uno::Reference < beans::XPropertySet > xDialogProps( xDialog, uno::UNO_QUERY );
+ uno::Reference < beans::XPropertySet > xDialogProps( m_xDialog, uno::UNO_QUERY );
if ( xDialogProps.is() )
{
try
@@ -677,60 +728,21 @@ FuInsertChart::FuInsertChart(ScTabViewShell& rViewSh, vcl::Window* pWin, ScDrawV
}
}
- sal_Int16 nDialogRet = xDialog->execute();
- if( nDialogRet == ui::dialogs::ExecutableDialogResults::CANCEL )
- {
- // leave OLE inplace mode and unmark
- OSL_ASSERT( pView );
- rViewShell.DeactivateOle();
- pView->UnmarkAll();
-
- // old page view pointer is invalid after switching sheets
- pPV = pView->GetSdrPageView();
-
- // remove the chart
- OSL_ASSERT( pPV );
- SdrPage * pPage( pPV->GetPage());
- OSL_ASSERT( pPage );
- OSL_ASSERT( pObj );
- if( pPage )
- {
- // Remove the OLE2 object from the sdr page.
- SdrObject* pRemoved = pPage->RemoveObject(pObj->GetOrdNum());
- OSL_ASSERT(pRemoved == pObj);
- SdrObject::Free(pRemoved); // Don't forget to free it.
- }
-
- bAddUndo = false; // don't create the undo action for inserting
-
- // leave the draw shell
- rViewShell.SetDrawShell( false );
+ ::svt::DialogClosedListener* pListener = new ::svt::DialogClosedListener();
+ pListener->SetDialogClosedLink( LINK( this, FuInsertChart, DialogClosedHdl ) );
+ css::uno::Reference<css::ui::dialogs::XDialogClosedListener> xListener( pListener );
- // reset marked cell area
-
- rViewSh.GetViewData().GetViewShell()->SetMarkData(aMark);
- }
- else
- {
- OSL_ASSERT( nDialogRet == ui::dialogs::ExecutableDialogResults::OK );
- //@todo maybe move chart to different table
- }
+ m_xDialog->startExecuteModal( xListener );
+ }
+ else
+ {
+ uno::Reference< lang::XComponent > xComponent( m_xDialog, uno::UNO_QUERY );
+ if( xComponent.is())
+ xComponent->dispose();
}
- uno::Reference< lang::XComponent > xComponent( xDialog, uno::UNO_QUERY );
- if( xComponent.is())
- xComponent->dispose();
}
}
}
-
- if ( bAddUndo )
- {
- // add undo action the same way as in SdrEditView::InsertObjectAtView
- // (using UndoActionHdl etc.)
- pView->AddUndo(o3tl::make_unique<SdrUndoNewObj>(*pObj));
- }
-
- // BM/IHA --
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/inc/fuinsert.hxx b/sc/source/ui/inc/fuinsert.hxx
index 863aa6d88cb1..cfad23933836 100644
--- a/sc/source/ui/inc/fuinsert.hxx
+++ b/sc/source/ui/inc/fuinsert.hxx
@@ -22,6 +22,9 @@
#include "fupoor.hxx"
#include <scdllapi.h>
+#include <svx/svdoole2.hxx>
+#include <com/sun/star/ui/dialogs/DialogClosedEvent.hpp>
+#include <com/sun/star/ui/dialogs/XAsynchronousExecutableDialog.hpp>
class FuInsertGraphic : public FuPoor
{
@@ -40,9 +43,14 @@ public:
class FuInsertChart : public FuPoor
{
-public:
- FuInsertChart(ScTabViewShell& rViewSh, vcl::Window* pWin, ScDrawView* pView,
- SdrModel* pDoc, SfxRequest& rReq);
+ css::uno::Reference<css::ui::dialogs::XAsynchronousExecutableDialog> m_xDialog;
+ SdrOle2Obj* m_pInsertedObject;
+
+ DECL_LINK( DialogClosedHdl, css::ui::dialogs::DialogClosedEvent*, void );
+
+ public:
+ FuInsertChart( ScTabViewShell& pViewSh, vcl::Window* pWin, ScDrawView* pView,
+ SdrModel* pDoc, SfxRequest& rReq);
};
class FuInsertMedia : public FuPoor
diff --git a/sc/source/ui/inc/tabvwsh.hxx b/sc/source/ui/inc/tabvwsh.hxx
index 2f17319efeaf..8191d629b381 100644
--- a/sc/source/ui/inc/tabvwsh.hxx
+++ b/sc/source/ui/inc/tabvwsh.hxx
@@ -57,6 +57,7 @@ class ScPageBreakShell;
class ScDPObject;
class ScNavigatorSettings;
class ScRangeName;
+class FuInsertChart;
struct ScHeaderFieldData;
@@ -97,6 +98,7 @@ private:
sal_uInt16 nDrawSfxId;
sal_uInt16 nFormSfxId;
OUString sDrawCustom; // current custom shape type
+
std::unique_ptr<ScDrawShell> pDrawShell;
std::unique_ptr<ScDrawTextObjectBar> pDrawTextShell;
std::unique_ptr<ScEditShell> pEditShell;
@@ -111,6 +113,7 @@ private:
std::unique_ptr<ScPageBreakShell> pPageBreakShell;
std::unique_ptr<svx::ExtrusionBar> pExtrusionBarShell;
std::unique_ptr<svx::FontworkBar> pFontworkBarShell;
+ std::unique_ptr<FuInsertChart> pFuInsertChart;
std::unique_ptr<FmFormShell> pFormShell;
diff --git a/sc/source/ui/view/tabvwsh4.cxx b/sc/source/ui/view/tabvwsh4.cxx
index 30e9def2e4a2..ec912c115848 100644
--- a/sc/source/ui/view/tabvwsh4.cxx
+++ b/sc/source/ui/view/tabvwsh4.cxx
@@ -64,6 +64,7 @@
#include <inputwin.hxx>
#include <dbdata.hxx>
#include <reffact.hxx>
+#include <fuinsert.hxx>
#include <viewuno.hxx>
#include <dispuno.hxx>
#include <anyrefdg.hxx>
diff --git a/sc/source/ui/view/tabvwshb.cxx b/sc/source/ui/view/tabvwshb.cxx
index 5ea064f7fdd3..7ac16fa1a0dc 100644
--- a/sc/source/ui/view/tabvwshb.cxx
+++ b/sc/source/ui/view/tabvwshb.cxx
@@ -336,7 +336,7 @@ void ScTabViewShell::ExecDrawIns(SfxRequest& rReq)
break;
case SID_INSERT_DIAGRAM:
- FuInsertChart(*this, pWin, pView, pDrModel, rReq);
+ pFuInsertChart.reset(new FuInsertChart(*this, pWin, pView, pDrModel, rReq));
break;
case SID_INSERT_OBJECT: