You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
10 KiB
229 lines
10 KiB
From bf97980c8d5d5fbc63a08b8834c10fe903152b75 Mon Sep 17 00:00:00 2001
|
|
From: David Tardon <dtardon@redhat.com>
|
|
Date: Fri, 12 Dec 2014 17:09:45 +0100
|
|
Subject: [PATCH] rhbz#1116534 crash when pasting over a formula
|
|
|
|
When pasting CSV data into existing document, we cannot use the
|
|
ScImportExport optimization for insertion, because the cells can already
|
|
have content (a grouped formula in this case). So use appropriate
|
|
ScDocument functions, even if that means the import is slower.
|
|
|
|
This is a regression from commit 93959db4d8846cfdfb87ab647c4d457fb09bb869
|
|
"use DocumentImport for csv import, related fdo#69006".
|
|
|
|
Change-Id: I92f70abca0542d796e3aa674b28a31053fff00d0
|
|
---
|
|
sc/source/ui/docshell/impex.cxx | 69 ++++++++++++++++++++++++++++-------------
|
|
sc/source/ui/inc/impex.hxx | 4 +++
|
|
sc/source/ui/view/viewfun5.cxx | 2 +-
|
|
3 files changed, 52 insertions(+), 23 deletions(-)
|
|
|
|
diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
|
|
index 75c7566..0d2aa7b1 100644
|
|
--- a/sc/source/ui/docshell/impex.cxx
|
|
+++ b/sc/source/ui/docshell/impex.cxx
|
|
@@ -85,7 +85,8 @@ ScImportExport::ScImportExport( ScDocument* p )
|
|
bFormulas( false ), bIncludeFiltered( true ),
|
|
bAll( true ), bSingle( true ), bUndo( false ),
|
|
bOverflowRow( false ), bOverflowCol( false ), bOverflowCell( false ),
|
|
- mbApi( true ), mbImportBroadcast(false), mExportTextOptions()
|
|
+ mbApi( true ), mbImportBroadcast(false), mbOverwriting( false ),
|
|
+ mExportTextOptions()
|
|
{
|
|
pUndoDoc = NULL;
|
|
pExtOptions = NULL;
|
|
@@ -99,7 +100,8 @@ ScImportExport::ScImportExport( ScDocument* p, const ScAddress& rPt )
|
|
bFormulas( false ), bIncludeFiltered( true ),
|
|
bAll( false ), bSingle( true ), bUndo( pDocSh != NULL ),
|
|
bOverflowRow( false ), bOverflowCol( false ), bOverflowCell( false ),
|
|
- mbApi( true ), mbImportBroadcast(false), mExportTextOptions()
|
|
+ mbApi( true ), mbImportBroadcast(false), mbOverwriting( false ),
|
|
+ mExportTextOptions()
|
|
{
|
|
pUndoDoc = NULL;
|
|
pExtOptions = NULL;
|
|
@@ -114,7 +116,8 @@ ScImportExport::ScImportExport( ScDocument* p, const ScRange& r )
|
|
bFormulas( false ), bIncludeFiltered( true ),
|
|
bAll( false ), bSingle( false ), bUndo( pDocSh != NULL ),
|
|
bOverflowRow( false ), bOverflowCol( false ), bOverflowCell( false ),
|
|
- mbApi( true ), mbImportBroadcast(false), mExportTextOptions()
|
|
+ mbApi( true ), mbImportBroadcast(false), mbOverwriting( false ),
|
|
+ mExportTextOptions()
|
|
{
|
|
pUndoDoc = NULL;
|
|
pExtOptions = NULL;
|
|
@@ -130,7 +133,8 @@ ScImportExport::ScImportExport( ScDocument* p, const OUString& rPos )
|
|
bFormulas( false ), bIncludeFiltered( true ),
|
|
bAll( false ), bSingle( true ), bUndo( pDocSh != NULL ),
|
|
bOverflowRow( false ), bOverflowCol( false ), bOverflowCell( false ),
|
|
- mbApi( true ), mbImportBroadcast(false), mExportTextOptions()
|
|
+ mbApi( true ), mbImportBroadcast(false), mbOverwriting( false ),
|
|
+ mExportTextOptions()
|
|
{
|
|
pUndoDoc = NULL;
|
|
pExtOptions = NULL;
|
|
@@ -927,7 +931,8 @@ bool ScImportExport::Text2Doc( SvStream& rStrm )
|
|
// Extended Ascii-Import
|
|
|
|
static bool lcl_PutString(
|
|
- ScDocumentImport& rDocImport, SCCOL nCol, SCROW nRow, SCTAB nTab, const OUString& rStr, sal_uInt8 nColFormat,
|
|
+ ScDocumentImport& rDocImport, bool bUseDocImport,
|
|
+ SCCOL nCol, SCROW nRow, SCTAB nTab, const OUString& rStr, sal_uInt8 nColFormat,
|
|
SvNumberFormatter* pFormatter, bool bDetectNumFormat,
|
|
::utl::TransliterationWrapper& rTransliteration, CalendarWrapper& rCalendar,
|
|
::utl::TransliterationWrapper* pSecondTransliteration, CalendarWrapper* pSecondCalendar )
|
|
@@ -951,17 +956,24 @@ static bool lcl_PutString(
|
|
pDoc->ApplyPattern(nCol, nRow, nTab, aNewAttrs);
|
|
|
|
}
|
|
- if(ScStringUtil::isMultiline(rStr))
|
|
+ if ( bUseDocImport )
|
|
{
|
|
- ScFieldEditEngine& rEngine = pDoc->GetEditEngine();
|
|
- rEngine.SetText(rStr);
|
|
- rDocImport.setEditCell(ScAddress(nCol, nRow, nTab), rEngine.CreateTextObject());
|
|
- return true;
|
|
- }
|
|
- else
|
|
+ if(ScStringUtil::isMultiline(rStr))
|
|
+ {
|
|
+ ScFieldEditEngine& rEngine = pDoc->GetEditEngine();
|
|
+ rEngine.SetText(rStr);
|
|
+ rDocImport.setEditCell(ScAddress(nCol, nRow, nTab), rEngine.CreateTextObject());
|
|
+ return true;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ rDocImport.setStringCell(ScAddress(nCol, nRow, nTab), rStr);
|
|
+ return false;
|
|
+ }
|
|
+ } else
|
|
{
|
|
- rDocImport.setStringCell(ScAddress(nCol, nRow, nTab), rStr);
|
|
- return false;
|
|
+ pDoc->SetTextCell(ScAddress(nCol, nRow, nTab), rStr);
|
|
+ return bMultiLine;
|
|
}
|
|
}
|
|
|
|
@@ -975,7 +987,10 @@ static bool lcl_PutString(
|
|
if ( pDocFormatter->IsNumberFormat( rStr, nEnglish, fVal ) )
|
|
{
|
|
// Numberformat will not be set to English
|
|
- rDocImport.setNumericCell( ScAddress( nCol, nRow, nTab ), fVal );
|
|
+ if ( bUseDocImport )
|
|
+ rDocImport.setNumericCell( ScAddress( nCol, nRow, nTab ), fVal );
|
|
+ else
|
|
+ pDoc->SetValue( nCol, nRow, nTab, fVal );
|
|
return bMultiLine;
|
|
}
|
|
// else, continue with SetString
|
|
@@ -1164,7 +1179,10 @@ static bool lcl_PutString(
|
|
nFormat = pDocFormatter->GetStandardFormat( fDays, nFormat, nType, eDocLang);
|
|
|
|
ScAddress aPos(nCol,nRow,nTab);
|
|
- rDocImport.setNumericCell(aPos, fDays);
|
|
+ if ( bUseDocImport )
|
|
+ rDocImport.setNumericCell(aPos, fDays);
|
|
+ else
|
|
+ pDoc->SetValue( aPos, fDays );
|
|
pDoc->SetNumberFormat(aPos, nFormat);
|
|
|
|
return bMultiLine; // success
|
|
@@ -1181,14 +1199,20 @@ static bool lcl_PutString(
|
|
aParam.mbDetectNumberFormat = bDetectNumFormat;
|
|
aParam.meSetTextNumFormat = ScSetStringParam::SpecialNumberOnly;
|
|
aParam.mbHandleApostrophe = false;
|
|
- rDocImport.setAutoInput(ScAddress(nCol, nRow, nTab), rStr, &aParam);
|
|
+ if ( bUseDocImport )
|
|
+ rDocImport.setAutoInput(ScAddress(nCol, nRow, nTab), rStr, &aParam);
|
|
+ else
|
|
+ pDoc->SetString( nCol, nRow, nTab, rStr, &aParam );
|
|
}
|
|
else
|
|
{
|
|
bMultiLine = true;
|
|
ScFieldEditEngine& rEngine = pDoc->GetEditEngine();
|
|
rEngine.SetText(rStr);
|
|
- rDocImport.setEditCell(ScAddress(nCol, nRow, nTab), rEngine.CreateTextObject());
|
|
+ if ( bUseDocImport )
|
|
+ rDocImport.setEditCell(ScAddress(nCol, nRow, nTab), rEngine.CreateTextObject());
|
|
+ else
|
|
+ pDoc->SetEditText( ScAddress( nCol, nRow, nTab ), rEngine.CreateTextObject() );
|
|
}
|
|
return bMultiLine;
|
|
}
|
|
@@ -1345,7 +1369,7 @@ bool ScImportExport::ExtText2Doc( SvStream& rStrm )
|
|
nFmt = SC_COL_TEXT;
|
|
|
|
bMultiLine |= lcl_PutString(
|
|
- aDocImport, nCol, nRow, nTab, aCell, nFmt,
|
|
+ aDocImport, !mbOverwriting, nCol, nRow, nTab, aCell, nFmt,
|
|
&aNumFormatter, bDetectNumFormat, aTransliteration, aCalendar,
|
|
pEnglishTransliteration.get(), pEnglishCalendar.get());
|
|
}
|
|
@@ -1388,7 +1412,7 @@ bool ScImportExport::ExtText2Doc( SvStream& rStrm )
|
|
nFmt = SC_COL_TEXT;
|
|
|
|
bMultiLine |= lcl_PutString(
|
|
- aDocImport, nCol, nRow, nTab, aCell, nFmt,
|
|
+ aDocImport, !mbOverwriting, nCol, nRow, nTab, aCell, nFmt,
|
|
&aNumFormatter, bDetectNumFormat, aTransliteration,
|
|
aCalendar, pEnglishTransliteration.get(), pEnglishCalendar.get());
|
|
}
|
|
@@ -1446,13 +1470,14 @@ bool ScImportExport::ExtText2Doc( SvStream& rStrm )
|
|
|
|
bDetermineRange = !bDetermineRange; // toggle
|
|
} while (!bDetermineRange);
|
|
- aDocImport.finalize();
|
|
+ if ( !mbOverwriting )
|
|
+ aDocImport.finalize();
|
|
|
|
xProgress.reset(); // make room for AdjustRowHeight progress
|
|
if (bRangeIsDetermined)
|
|
EndPaste(false);
|
|
|
|
- if (mbImportBroadcast)
|
|
+ if (mbImportBroadcast && !mbOverwriting)
|
|
{
|
|
pDoc->BroadcastCells(aRange, SC_HINT_DATACHANGED);
|
|
pDocSh->PostDataChanged();
|
|
diff --git a/sc/source/ui/inc/impex.hxx b/sc/source/ui/inc/impex.hxx
|
|
index 7bd3914..22ced95 100644
|
|
--- a/sc/source/ui/inc/impex.hxx
|
|
+++ b/sc/source/ui/inc/impex.hxx
|
|
@@ -67,6 +67,9 @@ class ScImportExport
|
|
bool bOverflowCell; // too much data for a cell
|
|
bool mbApi;
|
|
bool mbImportBroadcast; // whether or not to broadcast after data import.
|
|
+ bool mbOverwriting; // Whether we could be overwriting existing values (paste).
|
|
+ // In this case we cannot use the insert optimization, but we
|
|
+ // do not need to broadcast after the import.
|
|
ScExportTextOptions mExportTextOptions;
|
|
|
|
ScAsciiOptions* pExtOptions; // extended options
|
|
@@ -155,6 +158,7 @@ public:
|
|
bool IsApi() const { return mbApi; }
|
|
void SetApi( bool bApi ) { mbApi = bApi; }
|
|
void SetImportBroadcast( bool b ) { mbImportBroadcast = b; }
|
|
+ void SetOverwriting( const bool bOverwriting ) { mbOverwriting = bOverwriting; }
|
|
const ScExportTextOptions& GetExportTextOptions() { return mExportTextOptions; }
|
|
void SetExportTextOptions( const ScExportTextOptions& options ) { mExportTextOptions = options; }
|
|
};
|
|
diff --git a/sc/source/ui/view/viewfun5.cxx b/sc/source/ui/view/viewfun5.cxx
|
|
index 27ff0f4..983a39e 100644
|
|
--- a/sc/source/ui/view/viewfun5.cxx
|
|
+++ b/sc/source/ui/view/viewfun5.cxx
|
|
@@ -293,7 +293,7 @@ bool ScViewFunc::PasteDataFormat( sal_uLong nFormatId,
|
|
{
|
|
ScAddress aCellPos( nPosX, nPosY, GetViewData().GetTabNo() );
|
|
ScImportExport aObj( GetViewData().GetDocument(), aCellPos );
|
|
- aObj.SetImportBroadcast(true);
|
|
+ aObj.SetOverwriting( true );
|
|
|
|
OUString aStr;
|
|
SotStorageStreamRef xStream;
|
|
--
|
|
2.1.0
|
|
|