diff options
-rw-r--r-- | sc/inc/scabstdlg.hxx | 3 | ||||
-rw-r--r-- | sc/qa/unit/screenshots/screenshots.cxx | 2 | ||||
-rw-r--r-- | sc/source/ui/attrdlg/scdlgfact.cxx | 5 | ||||
-rw-r--r-- | sc/source/ui/attrdlg/scdlgfact.hxx | 3 | ||||
-rw-r--r-- | sc/source/ui/unoobj/filtuno.cxx | 2 | ||||
-rw-r--r-- | sc/source/ui/view/cellsh2.cxx | 2 | ||||
-rw-r--r-- | sc/source/ui/view/viewfun5.cxx | 86 |
7 files changed, 63 insertions, 40 deletions
diff --git a/sc/inc/scabstdlg.hxx b/sc/inc/scabstdlg.hxx index 707e2cda6569..4019eae3792b 100644 --- a/sc/inc/scabstdlg.hxx +++ b/sc/inc/scabstdlg.hxx @@ -396,7 +396,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 8b16314fd87d..a758ef0369ba 100644 --- a/sc/qa/unit/screenshots/screenshots.cxx +++ b/sc/qa/unit/screenshots/screenshots.cxx @@ -245,7 +245,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 4134e6f2a0a4..4088b50dbe15 100644 --- a/sc/source/ui/attrdlg/scdlgfact.cxx +++ b/sc/source/ui/attrdlg/scdlgfact.cxx @@ -719,10 +719,11 @@ void ScAbstractTabController_Impl::SetText( const OUString& rStr ) } // =========================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 cd63bb3a7418..722684d30c95 100644 --- a/sc/source/ui/attrdlg/scdlgfact.hxx +++ b/sc/source/ui/attrdlg/scdlgfact.hxx @@ -539,7 +539,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 20d8dbcfe487..26c45ecfbfc3 100644 --- a/sc/source/ui/unoobj/filtuno.cxx +++ b/sc/source/ui/unoobj/filtuno.cxx @@ -191,7 +191,7 @@ sal_Int16 SAL_CALL ScFilterOptionsObj::execute() 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 24e0c76f1de6..bbab68d2e952 100644 --- a/sc/source/ui/view/cellsh2.cxx +++ b/sc/source/ui/view/cellsh2.cxx @@ -1006,7 +1006,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 7a393f59777c..72604ea4dfd3 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,48 +327,64 @@ 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 || nFormatId == SotClipboardFormatId::STRING_TSVC) - && aDataHelper.GetString( nFormatId, aStr )) + && 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 = GetActiveWin(); - if (pDlg->Execute() == RET_OK) - { - ScAsciiOptions aOptions; - pDlg->GetOptions( aOptions ); - pDlg->SaveParameters(); - aObj.SetExtOptions( aOptions ); + std::shared_ptr<ScImportStringStream> pStrm(new ScImportStringStream(*pStrBuffer)); - bRet = aObj.ImportString( aStr, nFormatId ); + 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. + } - // 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. + InvalidateAttribs(); + GetViewData().UpdateInputHandler(); + + 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 && nFormatId != SotClipboardFormatId::STRING_TSVC) - && aDataHelper.GetString( nFormatId, aStr )) - bRet = aObj.ImportString( aStr, nFormatId ); + && aDataHelper.GetString( nFormatId, *pStrBuffer )) + bRet = pObj->ImportString( *pStrBuffer, nFormatId ); InvalidateAttribs(); GetViewData().UpdateInputHandler(); |