Kaydet (Commit) 32ebfd0d authored tarafından Marco Cecchetti's avatar Marco Cecchetti Kaydeden (comit) Jan Holesovsky

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/53931Reviewed-by: 's avatarJan Holesovsky <kendy@collabora.com>
Tested-by: 's avatarJan Holesovsky <kendy@collabora.com>
üst 249e93db
......@@ -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;
......
......@@ -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"
......
......@@ -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 );
}
......
......@@ -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;
......
......@@ -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 )
{
......
......@@ -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 )
......
......@@ -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();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment