[Libreoffice-commits] core.git: sc/source

Markus Mohrhard markus.mohrhard at googlemail.com
Thu Apr 7 12:07:12 UTC 2016


 sc/source/filter/excel/xicontent.cxx |   59 +++++++++++++++++++++--------------
 1 file changed, 37 insertions(+), 22 deletions(-)

New commits:
commit e214df32fb3637bd7810a299fb8b38810b1a3874
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Thu Apr 7 08:20:12 2016 +0200

    we need the position in the formula converter, tdf#99093
    
    Change-Id: Ic3dd13aa4d4b8190b78f3e6f1cdda844e39cc719
    Reviewed-on: https://gerrit.libreoffice.org/23884
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/sc/source/filter/excel/xicontent.cxx b/sc/source/filter/excel/xicontent.cxx
index edef22d..84c43e0 100644
--- a/sc/source/filter/excel/xicontent.cxx
+++ b/sc/source/filter/excel/xicontent.cxx
@@ -789,34 +789,21 @@ void XclImpValidationManager::ReadDV( XclImpStream& rStrm )
     rStrm.SetNulSubstChar( '\n' );
     ::std::unique_ptr< ScTokenArray > xTokArr1;
 
-    sal_uInt16 nLen = 0;
-    nLen = rStrm.ReaduInt16();
+    // We can't import the formula directly because we need the range
+    sal_uInt16 nLenFormula1 = rStrm.ReaduInt16();
     rStrm.Ignore( 2 );
-    if( nLen > 0 )
-    {
-        const ScTokenArray* pTokArr = nullptr;
-        rFmlaConv.Reset();
-        rFmlaConv.Convert( pTokArr, rStrm, nLen, false, FT_CondFormat );
-        // formula converter owns pTokArr -> create a copy of the token array
-        if( pTokArr )
-            xTokArr1.reset( pTokArr->Clone() );
-    }
-    rStrm.SetNulSubstChar();    // back to default
+    XclImpStreamPos aPosFormula1;
+    rStrm.StorePosition(aPosFormula1);
+    rStrm.Ignore(nLenFormula1);
 
     // second formula
     ::std::unique_ptr< ScTokenArray > xTokArr2;
 
-    nLen = rStrm.ReaduInt16();
+    sal_uInt16 nLenFormula2 = rStrm.ReaduInt16();
     rStrm.Ignore( 2 );
-    if( nLen > 0 )
-    {
-        const ScTokenArray* pTokArr = nullptr;
-        rFmlaConv.Reset();
-        rFmlaConv.Convert( pTokArr, rStrm, nLen, false, FT_CondFormat );
-        // formula converter owns pTokArr -> create a copy of the token array
-        if( pTokArr )
-            xTokArr2.reset( pTokArr->Clone() );
-    }
+    XclImpStreamPos aPosFormula2;
+    rStrm.StorePosition(aPosFormula2);
+    rStrm.Ignore(nLenFormula2);
 
     // read all cell ranges
     XclRangeList aXclRanges;
@@ -830,6 +817,34 @@ void XclImpValidationManager::ReadDV( XclImpStream& rStrm )
     if ( aScRanges.empty() )
         return;
 
+    ScRange aCombinedRange = aScRanges.Combine();
+
+    XclImpStreamPos aCurrentPos;
+    rStrm.StorePosition(aCurrentPos);
+    rStrm.RestorePosition(aPosFormula1);
+    if( nLenFormula1 > 0 )
+    {
+        const ScTokenArray* pTokArr = nullptr;
+        rFmlaConv.Reset(aCombinedRange.aStart);
+        rFmlaConv.Convert( pTokArr, rStrm, nLenFormula1, false, FT_CondFormat );
+        // formula converter owns pTokArr -> create a copy of the token array
+        if( pTokArr )
+            xTokArr1.reset( pTokArr->Clone() );
+    }
+    rStrm.SetNulSubstChar();    // back to default
+    if (nLenFormula2 > 0)
+    {
+        rStrm.RestorePosition(aPosFormula2);
+        const ScTokenArray* pTokArr = nullptr;
+        rFmlaConv.Reset(aCombinedRange.aStart);
+        rFmlaConv.Convert( pTokArr, rStrm, nLenFormula2, false, FT_CondFormat );
+        // formula converter owns pTokArr -> create a copy of the token array
+        if( pTokArr )
+            xTokArr2.reset( pTokArr->Clone() );
+    }
+
+    rStrm.RestorePosition(aCurrentPos);
+
     bool bIsValid = true;   // valid settings in flags field
 
     ScValidationMode eValMode = SC_VALID_ANY;


More information about the Libreoffice-commits mailing list