summaryrefslogtreecommitdiff
path: root/sc/source/ui/docshell
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2014-12-12 17:09:45 +0100
committerDavid Tardon <dtardon@redhat.com>2014-12-12 17:32:22 +0100
commitbf97980c8d5d5fbc63a08b8834c10fe903152b75 (patch)
treef58228c5f00510e8850ff4b1e9d44995c065c608 /sc/source/ui/docshell
parentcbf0c9f8332be9abfed6016f9708e3260331eb2d (diff)
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
Diffstat (limited to 'sc/source/ui/docshell')
-rw-r--r--sc/source/ui/docshell/impex.cxx69
1 files changed, 47 insertions, 22 deletions
diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
index 75c75665a37c..0d2aa7b1d47c 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();