sc/inc/token.hxx              |    6 ++++++
 sc/source/core/tool/token.cxx |   19 ++++++++++++++-----
 2 files changed, 20 insertions(+), 5 deletions(-)

New commits:
commit ab6be8b2b01f9657f105d5ec9b027c9fa99d4325
Author: Eike Rathke <er...@redhat.com>
Date:   Wed Jun 17 00:04:30 2015 +0200

    Resolves: tdf#86305 clone upper left of matrix result if double token
    
    Change-Id: I541577e0b99b0144a755e5755adc890c0ca8d204
    (cherry picked from commit ffc1ffed11dc63a69fc2db04f12b3ea266b580fe)

diff --git a/sc/inc/token.hxx b/sc/inc/token.hxx
index 4662074..63584c7 100644
--- a/sc/inc/token.hxx
+++ b/sc/inc/token.hxx
@@ -381,6 +381,12 @@ public:
     /** Reset matrix and upper left, keep matrix
         formula dimension. */
     void ResetResult();
+
+private:
+
+    /** xUpperLeft is modifiable through SetUpperLeftDouble(), so clone it
+        whenever an svDouble token is assigned to. */
+    void CloneUpperLeftIfNecessary();
 };
 
 class SC_DLLPUBLIC ScHybridCellToken : public formula::FormulaToken
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index f9e0cc0..00f1d45 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -1022,7 +1022,10 @@ void ScMatrixCellResultToken::Assign( const 
ScMatrixCellResultToken & r )
 
 ScMatrixFormulaCellToken::ScMatrixFormulaCellToken(
     SCCOL nC, SCROW nR, const ScConstMatrixRef& pMat, formula::FormulaToken* 
pUL ) :
-    ScMatrixCellResultToken(pMat, pUL), nRows(nR), nCols(nC) {}
+    ScMatrixCellResultToken(pMat, pUL), nRows(nR), nCols(nC)
+{
+    CloneUpperLeftIfNecessary();
+}
 
 ScMatrixFormulaCellToken::ScMatrixFormulaCellToken( SCCOL nC, SCROW nR ) :
     ScMatrixCellResultToken(NULL, NULL), nRows(nR), nCols(nC) {}
@@ -1030,10 +1033,7 @@ ScMatrixFormulaCellToken::ScMatrixFormulaCellToken( 
SCCOL nC, SCROW nR ) :
 ScMatrixFormulaCellToken::ScMatrixFormulaCellToken( const 
ScMatrixFormulaCellToken& r ) :
     ScMatrixCellResultToken(r), nRows(r.nRows), nCols(r.nCols)
 {
-    // xUpperLeft is modifiable through
-    // SetUpperLeftDouble(), so clone it.
-    if (xUpperLeft)
-        xUpperLeft = xUpperLeft->Clone();
+    CloneUpperLeftIfNecessary();
 }
 
 ScMatrixFormulaCellToken::~ScMatrixFormulaCellToken() {}
@@ -1045,9 +1045,17 @@ bool ScMatrixFormulaCellToken::operator==( const 
FormulaToken& r ) const
         nCols == p->nCols && nRows == p->nRows;
 }
 
+void ScMatrixFormulaCellToken::CloneUpperLeftIfNecessary()
+{
+    if (xUpperLeft && xUpperLeft->GetType() == svDouble)
+        xUpperLeft = xUpperLeft->Clone();
+}
+
 void ScMatrixFormulaCellToken::Assign( const ScMatrixCellResultToken & r )
 {
     ScMatrixCellResultToken::Assign( r);
+
+    CloneUpperLeftIfNecessary();
 }
 
 void ScMatrixFormulaCellToken::Assign( const formula::FormulaToken& r )
@@ -1069,6 +1077,7 @@ void ScMatrixFormulaCellToken::Assign( const 
formula::FormulaToken& r )
         {
             xUpperLeft = &r;
             xMatrix = NULL;
+            CloneUpperLeftIfNecessary();
         }
     }
 }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to