[libreoffice] Resolves: rhbz#1116534 crash when pasting over a formula

David Tardon dtardon at fedoraproject.org
Fri Dec 12 17:47:58 UTC 2014


commit 6d57a333e4314b3226bb9df1086a78407f17bdec
Author: David Tardon <dtardon at redhat.com>
Date:   Fri Dec 12 18:42:30 2014 +0100

    Resolves: rhbz#1116534 crash when pasting over a formula

 ...1116534-crash-when-pasting-over-a-formula.patch |  228 ++++++++++++++++++++
 libreoffice.spec                                   |    5 +-
 2 files changed, 232 insertions(+), 1 deletions(-)
---
diff --git a/0001-rhbz-1116534-crash-when-pasting-over-a-formula.patch b/0001-rhbz-1116534-crash-when-pasting-over-a-formula.patch
new file mode 100644
index 0000000..9673ec4
--- /dev/null
+++ b/0001-rhbz-1116534-crash-when-pasting-over-a-formula.patch
@@ -0,0 +1,228 @@
+From bf97980c8d5d5fbc63a08b8834c10fe903152b75 Mon Sep 17 00:00:00 2001
+From: David Tardon <dtardon at 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
+
diff --git a/libreoffice.spec b/libreoffice.spec
index 4389dd4..1aa7225 100644
--- a/libreoffice.spec
+++ b/libreoffice.spec
@@ -46,7 +46,7 @@ Summary:        Free Software Productivity Suite
 Name:           libreoffice
 Epoch:          1
 Version:        %{libo_version}.0
-Release:        5%{?libo_prerelease}%{?dist}
+Release:        6%{?libo_prerelease}%{?dist}
 License:        (MPLv1.1 or LGPLv3+) and LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and Public Domain and ASL 2.0 and Artistic and MPLv2.0 and CC0
 Group:          Applications/Productivity
 URL:            http://www.libreoffice.org/
@@ -2290,6 +2290,9 @@ update-desktop-database %{_datadir}/applications &> /dev/null || :
 %endif
 
 %changelog
+* Fri Dec 12 2014 David Tardon <dtardon at redhat.com> - 1:4.4.0.0-6.beta2
+- Resolves: rhbz#1116534 crash when pasting over a formula
+
 * Sat Dec 06 2014 David Tardon <dtardon at redhat.com> - 1:4.4.0.0-5.beta2
 - update to 4.4.0 beta2
 - move officehelper.py to pyuno package so it can be imported from python


More information about the scm-commits mailing list