summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Cecchetti <marco.cecchetti@collabora.com>2018-04-27 21:51:41 +0200
committerJan Holesovsky <kendy@collabora.com>2018-05-23 16:13:47 +0200
commit32ebfd0da5da80a2fc7b92469024585f1d49bb16 (patch)
tree356c7509b37430b58d7e56cbabe8d9e4cfe37dc7
parent249e93db8aaa25398eda29cc8292c1d707afacad (diff)
lok: sc: tunneling the ascii import dialog on paste action
I needed to modify CreateScImportAsciiDlg signature so that we are able to pass a pointer to a dialog parent window to ScImportAsciiDlg. Moreover, I needed to perform the execution of the ScImportAsciiDlg dialog in ScViewFunc::PasteDataFormat asynchronously, both for lok and desktop case. In order to achieve this result it has been needed to modify the lifespan of some objects previously local to PasteDataFormat. Since PasteDataFormat returns a boolean, I took care to check how this return value is used. I found out 2 cases: 1) in ScViewFunc::PasteFromSystem where it is used for popping up an error dialog box, informing the user in the case that the paste operation is failed; 2) in ScGridWindow::ExecuteDrop where it is used for informing the system window manager of the success or fail of the drag and drop action. The first case is now handled by a lamba invoked soon after the dialog execution ended. The second case is more tricky: I handle it as the paste operation is always successful, hoping it doesn't do any real difference since the return value is used not by LO but by the system window manager (e.g. gtk). The asynchronous call and the behaviors described above occur only when the paste operation involves some kind of simple text, in all other cases nothing is changed. Change-Id: Id4f96180a9336f665a22a2441ea490af993431b0 Reviewed-on: https://gerrit.libreoffice.org/53931 Reviewed-by: Jan Holesovsky <kendy@collabora.com> Tested-by: Jan Holesovsky <kendy@collabora.com>
-rw-r--r--sc/inc/scabstdlg.hxx3
-rw-r--r--sc/qa/unit/screenshots/screenshots.cxx2
-rw-r--r--sc/source/ui/attrdlg/scdlgfact.cxx5
-rw-r--r--sc/source/ui/attrdlg/scdlgfact.hxx3
-rw-r--r--sc/source/ui/unoobj/filtuno.cxx2
-rw-r--r--sc/source/ui/view/cellsh2.cxx2
-rw-r--r--sc/source/ui/view/viewfun5.cxx87
7 files changed, 64 insertions, 40 deletions
diff --git a/sc/inc/scabstdlg.hxx b/sc/inc/scabstdlg.hxx
index 67be06b9ad73..92c66e392902 100644
--- a/sc/inc/scabstdlg.hxx
+++ b/sc/inc/scabstdlg.hxx
@@ -394,7 +394,8 @@ class ScAbstractDialogFactory
public:
SC_DLLPUBLIC static ScAbstractDialogFactory* Create();
- virtual VclPtr<AbstractScImportAsciiDlg> CreateScImportAsciiDlg( const OUString& aDatName,
+ virtual VclPtr<AbstractScImportAsciiDlg> CreateScImportAsciiDlg(vcl::Window* pParent,
+ const OUString& aDatName,
SvStream* pInStream,
ScImportAsciiCall eCall) = 0;
diff --git a/sc/qa/unit/screenshots/screenshots.cxx b/sc/qa/unit/screenshots/screenshots.cxx
index 3cf875b3cc05..9def8077e515 100644
--- a/sc/qa/unit/screenshots/screenshots.cxx
+++ b/sc/qa/unit/screenshots/screenshots.cxx
@@ -244,7 +244,7 @@ VclPtr<VclAbstractDialog> ScScreenshotTest::createDialogByID(sal_uInt32 nID)
case 13: // "modules/scalc/ui/textimportcsv.ui"
{
- pReturnDialog = mpFact->CreateScImportAsciiDlg(OUString(), mpStream.get(), SC_PASTETEXT);
+ pReturnDialog = mpFact->CreateScImportAsciiDlg(nullptr, OUString(), mpStream.get(), SC_PASTETEXT);
break;
}
case 14: // "modules/scalc/ui/formatcellsdialog.ui"
diff --git a/sc/source/ui/attrdlg/scdlgfact.cxx b/sc/source/ui/attrdlg/scdlgfact.cxx
index 733afc03d39a..dfcd08f4639c 100644
--- a/sc/source/ui/attrdlg/scdlgfact.cxx
+++ b/sc/source/ui/attrdlg/scdlgfact.cxx
@@ -604,10 +604,11 @@ bool AbstractScTextImportOptionsDlg_Impl::IsDateConversionSet() const
}
// =========================Factories for createdialog ===================
-VclPtr<AbstractScImportAsciiDlg> ScAbstractDialogFactory_Impl::CreateScImportAsciiDlg ( const OUString& aDatName,
+VclPtr<AbstractScImportAsciiDlg> ScAbstractDialogFactory_Impl::CreateScImportAsciiDlg ( vcl::Window* pParent,
+ const OUString& aDatName,
SvStream* pInStream, ScImportAsciiCall eCall )
{
- VclPtr<ScImportAsciiDlg> pDlg = VclPtr<ScImportAsciiDlg>::Create( nullptr, aDatName,pInStream, eCall );
+ VclPtr<ScImportAsciiDlg> pDlg = VclPtr<ScImportAsciiDlg>::Create( pParent, aDatName,pInStream, eCall );
return VclPtr<AbstractScImportAsciiDlg_Impl>::Create( pDlg );
}
diff --git a/sc/source/ui/attrdlg/scdlgfact.hxx b/sc/source/ui/attrdlg/scdlgfact.hxx
index ef6e0a6a1057..2a0e2652c5c6 100644
--- a/sc/source/ui/attrdlg/scdlgfact.hxx
+++ b/sc/source/ui/attrdlg/scdlgfact.hxx
@@ -418,7 +418,8 @@ class ScAbstractDialogFactory_Impl : public ScAbstractDialogFactory
public:
virtual ~ScAbstractDialogFactory_Impl() {}
- virtual VclPtr<AbstractScImportAsciiDlg> CreateScImportAsciiDlg( const OUString& aDatName,
+ virtual VclPtr<AbstractScImportAsciiDlg> CreateScImportAsciiDlg(vcl::Window* pParent,
+ const OUString& aDatName,
SvStream* pInStream,
ScImportAsciiCall eCall) override;
diff --git a/sc/source/ui/unoobj/filtuno.cxx b/sc/source/ui/unoobj/filtuno.cxx
index f11fc1ee18d5..f5188d93e4d0 100644
--- a/sc/source/ui/unoobj/filtuno.cxx
+++ b/sc/source/ui/unoobj/filtuno.cxx
@@ -176,7 +176,7 @@ sal_Int16 SAL_CALL ScFilterOptionsObj::execute() throw(uno::RuntimeException, st
if ( xInputStream.is() )
pInStream.reset(utl::UcbStreamHelper::CreateStream( xInputStream ));
- ScopedVclPtr<AbstractScImportAsciiDlg> pDlg(pFact->CreateScImportAsciiDlg( aPrivDatName, pInStream.get(), SC_IMPORTFILE));
+ ScopedVclPtr<AbstractScImportAsciiDlg> pDlg(pFact->CreateScImportAsciiDlg(nullptr, aPrivDatName, pInStream.get(), SC_IMPORTFILE));
OSL_ENSURE(pDlg, "Dialog create fail!");
if ( pDlg->Execute() == RET_OK )
{
diff --git a/sc/source/ui/view/cellsh2.cxx b/sc/source/ui/view/cellsh2.cxx
index 8f4d031e6564..2cb6af596414 100644
--- a/sc/source/ui/view/cellsh2.cxx
+++ b/sc/source/ui/view/cellsh2.cxx
@@ -983,7 +983,7 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq )
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
OSL_ENSURE( pFact, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pFact is null!" );
ScopedVclPtr<AbstractScImportAsciiDlg> pDlg(pFact->CreateScImportAsciiDlg(
- OUString(), &aStream, SC_TEXTTOCOLUMNS));
+ nullptr, OUString(), &aStream, SC_TEXTTOCOLUMNS));
OSL_ENSURE( pDlg, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDlg is null!" );
if ( pDlg->Execute() == RET_OK )
diff --git a/sc/source/ui/view/viewfun5.cxx b/sc/source/ui/view/viewfun5.cxx
index 9a3ae1b14f04..c1da82818cef 100644
--- a/sc/source/ui/view/viewfun5.cxx
+++ b/sc/source/ui/view/viewfun5.cxx
@@ -44,6 +44,7 @@
#include <svtools/transfer.hxx>
#include <vcl/graph.hxx>
+#include <comphelper/lok.hxx>
#include <comphelper/processfactory.hxx>
#include <comphelper/storagehelper.hxx>
#include <comphelper/string.hxx>
@@ -56,6 +57,8 @@
#include "dbdata.hxx"
#include "sc.hrc"
#include "filter.hxx"
+#include "globstr.hrc"
+#include "global.hxx"
#include "scextopt.hxx"
#include "tabvwsh.hxx"
#include "compiler.hxx"
@@ -293,10 +296,11 @@ bool ScViewFunc::PasteDataFormat( SotClipboardFormatId nFormatId,
else
{
ScAddress aCellPos( nPosX, nPosY, GetViewData().GetTabNo() );
- ScImportExport aObj( GetViewData().GetDocument(), aCellPos );
- aObj.SetOverwriting( true );
+ std::shared_ptr<ScImportExport> pObj(new ScImportExport(GetViewData().GetDocument(), aCellPos));
+ pObj->SetOverwriting( true );
- OUString aStr;
+
+ std::shared_ptr<OUString> pStrBuffer(new OUString());
tools::SvRef<SotStorageStream> xStream;
if ( aDataHelper.GetSotStorageStream( nFormatId, xStream ) && xStream.Is() )
{
@@ -314,7 +318,7 @@ bool ScViewFunc::PasteDataFormat( SotClipboardFormatId nFormatId,
ScAsciiOptions aOptions;
aOptions.SetLanguage(pDlg->GetLanguageType());
aOptions.SetDetectSpecialNumber(pDlg->IsDateConversionSet());
- aObj.SetExtOptions(aOptions);
+ pObj->SetExtOptions(aOptions);
}
else
{
@@ -323,46 +327,63 @@ bool ScViewFunc::PasteDataFormat( SotClipboardFormatId nFormatId,
}
}
if(!bRet)
- bRet = aObj.ImportStream( *xStream, OUString(), nFormatId );
+ bRet = pObj->ImportStream( *xStream, OUString(), nFormatId );
// mba: clipboard always must contain absolute URLs (could be from alien source)
}
- else if (nFormatId == SotClipboardFormatId::STRING && aDataHelper.GetString( nFormatId, aStr ))
+
+ else if (nFormatId == SotClipboardFormatId::STRING && aDataHelper.GetString( nFormatId, *pStrBuffer ))
{
// Do CSV dialog if more than one line.
- sal_Int32 nDelim = aStr.indexOf('\n');
- if (nDelim >= 0 && nDelim != aStr.getLength () - 1)
+ sal_Int32 nDelim = pStrBuffer->indexOf('\n');
+ if (nDelim >= 0 && nDelim != pStrBuffer->getLength () - 1)
{
- ScImportStringStream aStrm( aStr);
- ScAbstractDialogFactory* pFact =
- ScAbstractDialogFactory::Create();
- ScopedVclPtr<AbstractScImportAsciiDlg> pDlg(
- pFact->CreateScImportAsciiDlg( OUString(), &aStrm, SC_PASTETEXT));
+ vcl::Window* pParent = comphelper::LibreOfficeKit::isActive() ? GetActiveWin() : nullptr;
- if (pDlg->Execute() == RET_OK)
- {
- ScAsciiOptions aOptions;
- pDlg->GetOptions( aOptions );
- pDlg->SaveParameters();
- aObj.SetExtOptions( aOptions );
+ std::shared_ptr<ScImportStringStream> pStrm(new ScImportStringStream(*pStrBuffer));
+
+ ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
+ VclPtr<AbstractScImportAsciiDlg> pDlg(
+ pFact->CreateScImportAsciiDlg(pParent, OUString(), pStrm.get(), SC_PASTETEXT));
+
+ bAllowDialogs = bAllowDialogs && !SC_MOD()->IsInExecuteDrop();
+
+ pDlg->StartExecuteAsync([this, pDlg, pDoc, pStrm, nFormatId, pStrBuffer, pObj, bAllowDialogs](sal_Int32 nResult){
+ bool bShowErrorDialog = bAllowDialogs;
+ if (RET_OK == nResult)
+ {
+ ScAsciiOptions aOptions;
+ pDlg->GetOptions( aOptions );
+ pDlg->SaveParameters();
+ pObj->SetExtOptions( aOptions );
+ pObj->ImportString( *pStrBuffer, nFormatId );
+
+ // TODO: what if (aObj.IsOverflow())
+ // Content was partially pasted, which can be undone by
+ // the user though.
+ bShowErrorDialog = bShowErrorDialog && pObj->IsOverflow();
+ }
+ else
+ {
+ bShowErrorDialog = false;
+ // Yes, no failure, don't raise a "couldn't paste"
+ // dialog if user cancelled.
+ }
- bRet = aObj.ImportString( aStr, nFormatId );
+ InvalidateAttribs();
+ GetViewData().UpdateInputHandler();
- // TODO: what if (aObj.IsOverflow())
- // Content was partially pasted, which can be undone by
- // the user though.
- if (aObj.IsOverflow())
- bRet = false;
- }
- else
- bRet = true;
- // Yes, no failure, don't raise a "couldn't paste"
- // dialog if user cancelled.
+ pDoc->SetPastingDrawFromOtherDoc( false );
+
+ if (bShowErrorDialog)
+ ErrorMessage(STR_PASTE_ERROR);
+ });
+ return true;
}
else
- bRet = aObj.ImportString( aStr, nFormatId );
+ bRet = pObj->ImportString( *pStrBuffer, nFormatId );
}
- else if (nFormatId != SotClipboardFormatId::STRING && aDataHelper.GetString( nFormatId, aStr ))
- bRet = aObj.ImportString( aStr, nFormatId );
+ else if (nFormatId != SotClipboardFormatId::STRING && aDataHelper.GetString( nFormatId, *pStrBuffer ))
+ bRet = pObj->ImportString( *pStrBuffer, nFormatId );
InvalidateAttribs();
GetViewData().UpdateInputHandler();