summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2018-01-25 13:20:27 +0100
committerAndras Timar <andras.timar@collabora.com>2018-02-09 10:05:11 +0100
commit68a7e83f0e8dc34cf2b1eeba58a2cd8d3fe7b77d (patch)
tree6cdfa783a9cd35a7a70e06d7f9bc9080ff7987d6
parentb5e114e440028fee0d165728dbabbff53c99c5d8 (diff)
CheckLinkFormulaNeedingCheck() for conditional format expressions
This is a combination of 4 commits. Prepare CheckLinkFormulaNeedingCheck() to use either RPN or tokenized code Conditional format formulas aren't finally compiled until needed so the check will have to operate on the tokenized expression instead of RPN code. (cherry picked from commit faa0305ba3d0dc698fce4915d4f3a1fb52422380) CheckLinkFormulaNeedingCheck() for .ods conditional format expressions (cherry picked from commit 2930ba2ac5d9423f2848b968edcd8ddc71966186) CheckLinkFormulaNeedingCheck() for .xlsx conditional format expressions (cherry picked from commit fef24d9f999ee54d7936900485d97ff26656f517) CheckLinkFormulaNeedingCheck() for .xls conditional format expressions (cherry picked from commit af2a2a0c72db312902e466c36697b5c198041e82) 45eb1ab5efa0ec9da2663f20427d2474ce300826 31ede1a23223a798141a0891deeabd8cf88fff58 afa112cc591b411d80ead48bf726788d361f6eb3 Change-Id: I68837e9bd33f125ab47b10b1a6fa18175abd1627 Reviewed-on: https://gerrit.libreoffice.org/48719 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--sc/source/core/data/conditio.cxx6
-rw-r--r--sc/source/core/data/documen8.cxx17
-rw-r--r--sc/source/filter/excel/xicontent.cxx6
-rw-r--r--sc/source/filter/oox/condformatbuffer.cxx2
4 files changed, 29 insertions, 2 deletions
diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index c4b32cd813dd..2beedf0b1a54 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -472,6 +472,12 @@ void ScConditionEntry::CompileXML()
Compile( GetExpression(aSrcPos, 0, 0, eTempGrammar1),
GetExpression(aSrcPos, 1, 0, eTempGrammar2),
aStrNmsp1, aStrNmsp2, eTempGrammar1, eTempGrammar2, true );
+
+ // Importing ocDde/ocWebservice?
+ if (pFormula1)
+ mpDoc->CheckLinkFormulaNeedingCheck(*pFormula1);
+ if (pFormula2)
+ mpDoc->CheckLinkFormulaNeedingCheck(*pFormula2);
}
void ScConditionEntry::SetSrcString( const OUString& rNew )
diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx
index cc77c70a0b3a..9734ce650f5f 100644
--- a/sc/source/core/data/documen8.cxx
+++ b/sc/source/core/data/documen8.cxx
@@ -1159,8 +1159,21 @@ void ScDocument::CheckLinkFormulaNeedingCheck( const ScTokenArray& rCode )
if (HasLinkFormulaNeedingCheck())
return;
- if (rCode.HasOpCodeRPN(ocDde) || rCode.HasOpCodeRPN(ocWebservice))
- SetLinkFormulaNeedingCheck(true);
+ // Prefer RPN over tokenized formula if available.
+ if (rCode.GetCodeLen())
+ {
+ if (rCode.HasOpCodeRPN(ocDde) || rCode.HasOpCodeRPN(ocWebservice))
+ SetLinkFormulaNeedingCheck(true);
+ }
+ else if (rCode.GetLen())
+ {
+ if (rCode.HasOpCode(ocDde) || rCode.HasOpCode(ocWebservice))
+ SetLinkFormulaNeedingCheck(true);
+ }
+ else
+ {
+ assert(!"called with empty ScTokenArray");
+ }
}
// TimerDelays etc.
diff --git a/sc/source/filter/excel/xicontent.cxx b/sc/source/filter/excel/xicontent.cxx
index 8534f8a68832..73513ee17e81 100644
--- a/sc/source/filter/excel/xicontent.cxx
+++ b/sc/source/filter/excel/xicontent.cxx
@@ -657,7 +657,10 @@ void XclImpCondFormat::ReadCF( XclImpStream& rStrm )
rFmlaConv.Convert( pTokArr, rStrm, nFmlaSize1, false, FT_CondFormat );
// formula converter owns pTokArr -> create a copy of the token array
if( pTokArr )
+ {
xTokArr1.reset( pTokArr->Clone() );
+ GetDocRef().CheckLinkFormulaNeedingCheck( *xTokArr1);
+ }
}
::std::unique_ptr< ScTokenArray > pTokArr2;
@@ -668,7 +671,10 @@ void XclImpCondFormat::ReadCF( XclImpStream& rStrm )
rFmlaConv.Convert( pTokArr, rStrm, nFmlaSize2, false, FT_CondFormat );
// formula converter owns pTokArr -> create a copy of the token array
if( pTokArr )
+ {
pTokArr2.reset( pTokArr->Clone() );
+ GetDocRef().CheckLinkFormulaNeedingCheck( *pTokArr2);
+ }
}
// *** create the Calc conditional formatting ***
diff --git a/sc/source/filter/oox/condformatbuffer.cxx b/sc/source/filter/oox/condformatbuffer.cxx
index 98f654f2610b..d1e230ecb58e 100644
--- a/sc/source/filter/oox/condformatbuffer.cxx
+++ b/sc/source/filter/oox/condformatbuffer.cxx
@@ -867,11 +867,13 @@ void CondFormatRule::finalizeImport()
{
pTokenArray2.reset(new ScTokenArray());
ScTokenConversion::ConvertToTokenArray( rDoc, *pTokenArray2.get(), maModel.maFormulas[ 1 ] );
+ rDoc.CheckLinkFormulaNeedingCheck( *pTokenArray2.get());
}
ScTokenArray aTokenArray;
OUString aStyleName = getStyles().createDxfStyle( maModel.mnDxfId );
ScTokenConversion::ConvertToTokenArray( rDoc, aTokenArray, maModel.maFormulas[ 0 ] );
+ rDoc.CheckLinkFormulaNeedingCheck( aTokenArray);
ScCondFormatEntry* pNewEntry = new ScCondFormatEntry(eOperator,
&aTokenArray, pTokenArray2.get(), &rDoc, aPos, aStyleName);
mpFormat->AddEntry(pNewEntry);