[Libreoffice-commits] core.git: Branch 'libreoffice-5-2' - formula/source include/formula sc/source

Kohei Yoshida kohei.yoshida at collabora.com
Wed Oct 19 23:24:39 UTC 2016


 formula/source/core/api/token.cxx   |    5 ++++-
 include/formula/tokenarray.hxx      |   11 +++++++++++
 sc/source/core/data/formulacell.cxx |    5 ++++-
 sc/source/core/tool/compiler.cxx    |   26 ++++++++++++++++++++------
 sc/source/core/tool/token.cxx       |    1 +
 5 files changed, 40 insertions(+), 8 deletions(-)

New commits:
commit e3789123da397c82109a5fcead3d49f803ba6aad
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Mon Oct 17 23:19:23 2016 -0400

    tdf#93894: Prohibit grouping when certain token types are present.
    
    For instance, column / row label tokens don't work correctly in
    grouped cells with the current implementation.
    
    Change-Id: Idf86312ef15fbfd4382aa90ee6d131c671a80683
    (cherry picked from commit e944d9510404d8c67b3867d7cd9f313fd5091004)
    Reviewed-on: https://gerrit.libreoffice.org/30027
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Eike Rathke <erack at redhat.com>

diff --git a/formula/source/core/api/token.cxx b/formula/source/core/api/token.cxx
index 29ac8a1..713998c 100644
--- a/formula/source/core/api/token.cxx
+++ b/formula/source/core/api/token.cxx
@@ -712,7 +712,8 @@ FormulaTokenArray::FormulaTokenArray() :
     nError(0),
     nMode(ScRecalcMode::NORMAL),
     bHyperLink(false),
-    mbFromRangeName(false)
+    mbFromRangeName(false),
+    mbShareable(true)
 {
 }
 
@@ -735,6 +736,7 @@ void FormulaTokenArray::Assign( const FormulaTokenArray& r )
     nMode  = r.nMode;
     bHyperLink = r.bHyperLink;
     mbFromRangeName = r.mbFromRangeName;
+    mbShareable = r.mbShareable;
     pCode  = nullptr;
     pRPN   = nullptr;
     FormulaToken** pp;
@@ -846,6 +848,7 @@ void FormulaTokenArray::Clear()
     nError = nLen = nIndex = nRPN = 0;
     bHyperLink = false;
     mbFromRangeName = false;
+    mbShareable = true;
     ClearRecalcMode();
 }
 
diff --git a/include/formula/tokenarray.hxx b/include/formula/tokenarray.hxx
index 3faadec..78bbf57 100644
--- a/include/formula/tokenarray.hxx
+++ b/include/formula/tokenarray.hxx
@@ -118,6 +118,7 @@ protected:
     ScRecalcMode    nMode;                  // Flags to indicate when to recalc this code
     bool            bHyperLink;             // If HYPERLINK() occurs in the formula.
     bool            mbFromRangeName;        // If this array originates from a named expression
+    bool            mbShareable;            // Whether or not it can be shared with adjacent cells.
 
 protected:
     void                    Assign( const FormulaTokenArray& );
@@ -166,6 +167,16 @@ public:
     void SetFromRangeName( bool b ) { mbFromRangeName = b; }
     bool IsFromRangeName() const { return mbFromRangeName; }
 
+    void SetShareable( bool b ) { mbShareable = b; }
+
+    /**
+     * Check if this token array is shareable between multiple adjacent
+     * formula cells. Certain tokens may not function correctly when shared.
+     *
+     * @return true if the token array is shareable, false otherwise.
+     */
+    bool IsShareable() const { return mbShareable; }
+
     void Clear();
     void DelRPN();
     FormulaToken* First() { nIndex = 0; return Next(); }
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 04870c1..64a0bb4 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -1293,7 +1293,7 @@ void ScFormulaCell::CompileXML( sc::CompileFormulaContext& rCxt, ScProgress& rPr
         ScAddress aPreviousCell( aPos );
         aPreviousCell.IncRow( -1 );
         ScFormulaCell *pPreviousCell = pDocument->GetFormulaCell( aPreviousCell );
-        if( pPreviousCell )
+        if (pPreviousCell && pPreviousCell->GetCode()->IsShareable())
         {
             // Now try to convert to a string quickly ...
             ScCompiler aBackComp( rCxt, aPos, *(pPreviousCell->pCode) );
@@ -3767,6 +3767,9 @@ ScFormulaCell::CompareState ScFormulaCell::CompareByTokenArray( ScFormulaCell& r
     if ( GetHash() != rOther.GetHash() )
         return NotEqual;
 
+    if (!pCode->IsShareable() || !rOther.pCode->IsShareable())
+        return NotEqual;
+
     FormulaToken **pThis = pCode->GetCode();
     sal_uInt16     nThisLen = pCode->GetCodeLen();
     FormulaToken **pOther = rOther.pCode->GetCode();
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index e5659d5..264b7c3 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -4386,6 +4386,12 @@ ScTokenArray* ScCompiler::CompileString( const OUString& rFormula )
                     --nFunction;
             }
             break;
+            case ocColRowName:
+            case ocColRowNameAuto:
+                // The current implementation of column / row labels doesn't
+                // function correctly in grouped cells.
+                aArr.SetShareable(false);
+            break;
             default:
             break;
         }
@@ -5273,8 +5279,10 @@ bool ScCompiler::HandleColRowName()
             {
                 ScSingleRefData aRefData;
                 aRefData.InitAddress( aRange.aStart );
-                aRefData.SetColRel( true );
-                aRefData.SetRowRel( true );
+                if ( bColName )
+                    aRefData.SetColRel( true );
+                else
+                    aRefData.SetRowRel( true );
                 aRefData.SetAddress(aRange.aStart, aPos);
                 pNew->AddSingleReference( aRefData );
             }
@@ -5282,10 +5290,16 @@ bool ScCompiler::HandleColRowName()
             {
                 ScComplexRefData aRefData;
                 aRefData.InitRange( aRange );
-                aRefData.Ref1.SetColRel( true );
-                aRefData.Ref2.SetColRel( true );
-                aRefData.Ref1.SetRowRel( true );
-                aRefData.Ref2.SetRowRel( true );
+                if ( bColName )
+                {
+                    aRefData.Ref1.SetColRel( true );
+                    aRefData.Ref2.SetColRel( true );
+                }
+                else
+                {
+                    aRefData.Ref1.SetRowRel( true );
+                    aRefData.Ref2.SetRowRel( true );
+                }
                 aRefData.SetRange(aRange, aPos);
                 if ( bInList )
                     pNew->AddDoubleReference( aRefData );
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 581c2d7..a0eb39b 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -1787,6 +1787,7 @@ ScTokenArray* ScTokenArray::Clone() const
     p->mnHashValue = mnHashValue;
     p->meVectorState = meVectorState;
     p->mbFromRangeName = mbFromRangeName;
+    p->mbShareable = mbShareable;
 
     FormulaToken** pp;
     if( nLen )


More information about the Libreoffice-commits mailing list