Kaydet (Commit) dc44111a authored tarafından Eike Rathke's avatar Eike Rathke Kaydeden (comit) Caolán McNamara

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 faa0305b)

CheckLinkFormulaNeedingCheck() for .ods conditional format expressions

(cherry picked from commit 2930ba2a)

CheckLinkFormulaNeedingCheck() for .xlsx conditional format expressions

(cherry picked from commit fef24d9f)

CheckLinkFormulaNeedingCheck() for .xls conditional format expressions

(cherry picked from commit af2a2a0c)

45eb1ab5efa0ec9da2663f20427d2474ce300826
31ede1a23223a798141a0891deeabd8cf88fff58
afa112cc591b411d80ead48bf726788d361f6eb3

Change-Id: I68837e9bd33f125ab47b10b1a6fa18175abd1627
Reviewed-on: https://gerrit.libreoffice.org/48719Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst 2bef4deb
...@@ -522,6 +522,12 @@ void ScConditionEntry::CompileXML() ...@@ -522,6 +522,12 @@ void ScConditionEntry::CompileXML()
Compile( GetExpression(aSrcPos, 0, 0, eTempGrammar1), Compile( GetExpression(aSrcPos, 0, 0, eTempGrammar1),
GetExpression(aSrcPos, 1, 0, eTempGrammar2), GetExpression(aSrcPos, 1, 0, eTempGrammar2),
aStrNmsp1, aStrNmsp2, eTempGrammar1, eTempGrammar2, true ); aStrNmsp1, aStrNmsp2, eTempGrammar1, eTempGrammar2, true );
// Importing ocDde/ocWebservice?
if (pFormula1)
mpDoc->CheckLinkFormulaNeedingCheck(*pFormula1);
if (pFormula2)
mpDoc->CheckLinkFormulaNeedingCheck(*pFormula2);
} }
void ScConditionEntry::SetSrcString( const OUString& rNew ) void ScConditionEntry::SetSrcString( const OUString& rNew )
......
...@@ -1157,8 +1157,21 @@ void ScDocument::CheckLinkFormulaNeedingCheck( const ScTokenArray& rCode ) ...@@ -1157,8 +1157,21 @@ void ScDocument::CheckLinkFormulaNeedingCheck( const ScTokenArray& rCode )
if (HasLinkFormulaNeedingCheck()) if (HasLinkFormulaNeedingCheck())
return; return;
if (rCode.HasOpCodeRPN(ocDde) || rCode.HasOpCodeRPN(ocWebservice)) // Prefer RPN over tokenized formula if available.
SetLinkFormulaNeedingCheck(true); 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. // TimerDelays etc.
......
...@@ -662,7 +662,10 @@ void XclImpCondFormat::ReadCF( XclImpStream& rStrm ) ...@@ -662,7 +662,10 @@ void XclImpCondFormat::ReadCF( XclImpStream& rStrm )
rFmlaConv.Convert( pTokArr, rStrm, nFmlaSize1, false, FT_CondFormat ); rFmlaConv.Convert( pTokArr, rStrm, nFmlaSize1, false, FT_CondFormat );
// formula converter owns pTokArr -> create a copy of the token array // formula converter owns pTokArr -> create a copy of the token array
if( pTokArr ) if( pTokArr )
{
xTokArr1.reset( pTokArr->Clone() ); xTokArr1.reset( pTokArr->Clone() );
GetDocRef().CheckLinkFormulaNeedingCheck( *xTokArr1);
}
} }
::std::unique_ptr< ScTokenArray > pTokArr2; ::std::unique_ptr< ScTokenArray > pTokArr2;
...@@ -673,7 +676,10 @@ void XclImpCondFormat::ReadCF( XclImpStream& rStrm ) ...@@ -673,7 +676,10 @@ void XclImpCondFormat::ReadCF( XclImpStream& rStrm )
rFmlaConv.Convert( pTokArr, rStrm, nFmlaSize2, false, FT_CondFormat ); rFmlaConv.Convert( pTokArr, rStrm, nFmlaSize2, false, FT_CondFormat );
// formula converter owns pTokArr -> create a copy of the token array // formula converter owns pTokArr -> create a copy of the token array
if( pTokArr ) if( pTokArr )
{
pTokArr2.reset( pTokArr->Clone() ); pTokArr2.reset( pTokArr->Clone() );
GetDocRef().CheckLinkFormulaNeedingCheck( *pTokArr2);
}
} }
// *** create the Calc conditional formatting *** // *** create the Calc conditional formatting ***
......
...@@ -868,11 +868,13 @@ void CondFormatRule::finalizeImport() ...@@ -868,11 +868,13 @@ void CondFormatRule::finalizeImport()
{ {
pTokenArray2.reset(new ScTokenArray()); pTokenArray2.reset(new ScTokenArray());
ScTokenConversion::ConvertToTokenArray( rDoc, *pTokenArray2.get(), maModel.maFormulas[ 1 ] ); ScTokenConversion::ConvertToTokenArray( rDoc, *pTokenArray2.get(), maModel.maFormulas[ 1 ] );
rDoc.CheckLinkFormulaNeedingCheck( *pTokenArray2.get());
} }
ScTokenArray aTokenArray; ScTokenArray aTokenArray;
OUString aStyleName = getStyles().createDxfStyle( maModel.mnDxfId ); OUString aStyleName = getStyles().createDxfStyle( maModel.mnDxfId );
ScTokenConversion::ConvertToTokenArray( rDoc, aTokenArray, maModel.maFormulas[ 0 ] ); ScTokenConversion::ConvertToTokenArray( rDoc, aTokenArray, maModel.maFormulas[ 0 ] );
rDoc.CheckLinkFormulaNeedingCheck( aTokenArray);
ScCondFormatEntry* pNewEntry = new ScCondFormatEntry(eOperator, ScCondFormatEntry* pNewEntry = new ScCondFormatEntry(eOperator,
&aTokenArray, pTokenArray2.get(), &rDoc, aPos, aStyleName); &aTokenArray, pTokenArray2.get(), &rDoc, aPos, aStyleName);
mpFormat->AddEntry(pNewEntry); mpFormat->AddEntry(pNewEntry);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment