Force FormulaLanguage::OOXML for AddressConvention::CONV_XL_OOX
CONV_XL_OOX is used by OOXML ChartExport::parseFormula(), which
only handles ranges so FormulaLanguage doesn't really matter,
calling ScFormulaParserObj::printFormula(), but merging
AddressConvention::CONV_XL_OOX onto default
FormulaLanguage::NATIVE (mbEnglish wasn't set either) is an odd
combination that shouldn't happen.
Change-Id: I678b0da23886d0d5745bb4c0c0cee0bf7db4905c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112859
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
diff --git a/sc/source/ui/unoobj/tokenuno.cxx b/sc/source/ui/unoobj/tokenuno.cxx
index 3de405b..33f005f 100644
--- a/sc/source/ui/unoobj/tokenuno.cxx
+++ b/sc/source/ui/unoobj/tokenuno.cxx
@@ -59,6 +59,17 @@ static const SfxItemPropertyMapEntry* lcl_GetFormulaParserMap()
return aFormulaParserMap_Impl;
}
const formula::FormulaGrammar::AddressConvention aConvMap[] = {
formula::FormulaGrammar::CONV_OOO, // <- AddressConvention::OOO
formula::FormulaGrammar::CONV_XL_A1, // <- AddressConvention::XL_A1
formula::FormulaGrammar::CONV_XL_R1C1, // <- AddressConvention::XL_R1C1
formula::FormulaGrammar::CONV_XL_OOX, // <- AddressConvention::XL_OOX
formula::FormulaGrammar::CONV_LOTUS_A1 // <- AddressConvention::LOTUS_A1
};
// sal_Int16 because of comparison of integer expressions below.
constexpr sal_Int16 nConvMapCount = SAL_N_ELEMENTS(aConvMap);
SC_SIMPLE_SERVICE_INFO( ScFormulaParserObj, "ScFormulaParserObj", SC_SERVICENAME_FORMULAPARS )
ScFormulaParserObj::ScFormulaParserObj(ScDocShell* pDocSh) :
@@ -89,14 +100,9 @@ void ScFormulaParserObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
void ScFormulaParserObj::SetCompilerFlags( ScCompiler& rCompiler ) const
{
static const formula::FormulaGrammar::AddressConvention aConvMap[] = {
formula::FormulaGrammar::CONV_OOO, // <- AddressConvention::OOO
formula::FormulaGrammar::CONV_XL_A1, // <- AddressConvention::XL_A1
formula::FormulaGrammar::CONV_XL_R1C1, // <- AddressConvention::XL_R1C1
formula::FormulaGrammar::CONV_XL_OOX, // <- AddressConvention::XL_OOX
formula::FormulaGrammar::CONV_LOTUS_A1 // <- AddressConvention::LOTUS_A1
};
static const sal_Int16 nConvMapCount = SAL_N_ELEMENTS(aConvMap);
formula::FormulaGrammar::AddressConvention eConv = formula::FormulaGrammar::CONV_UNSPECIFIED;
if (mnConv >= 0 && mnConv < nConvMapCount)
eConv = aConvMap[mnConv];
// If mxOpCodeMap is not empty it overrides mbEnglish, and vice versa. We
// don't need to initialize things twice.
@@ -104,17 +110,13 @@ void ScFormulaParserObj::SetCompilerFlags( ScCompiler& rCompiler ) const
rCompiler.SetFormulaLanguage( mxOpCodeMap );
else
{
sal_Int32 nFormulaLanguage = mbEnglish ?
sheet::FormulaLanguage::ENGLISH :
sheet::FormulaLanguage::NATIVE;
const sal_Int32 nFormulaLanguage = (eConv == formula::FormulaGrammar::CONV_XL_OOX ?
sheet::FormulaLanguage::OOXML :
(mbEnglish ? sheet::FormulaLanguage::ENGLISH : sheet::FormulaLanguage::NATIVE));
ScCompiler::OpCodeMapPtr xMap = rCompiler.GetOpCodeMap( nFormulaLanguage);
rCompiler.SetFormulaLanguage( xMap);
}
formula::FormulaGrammar::AddressConvention eConv = formula::FormulaGrammar::CONV_UNSPECIFIED;
if (mnConv >= 0 && mnConv < nConvMapCount)
eConv = aConvMap[mnConv];
rCompiler.SetRefConvention( eConv );
rCompiler.EnableJumpCommandReorder(!mbCompileFAP);
rCompiler.EnableStopOnError(!mbCompileFAP);
@@ -206,6 +208,20 @@ void SAL_CALL ScFormulaParserObj::setPropertyValue(
else if ( aPropertyName == SC_UNO_FORMULACONVENTION )
{
aValue >>= mnConv;
bool bOldEnglish = mbEnglish;
if (mnConv >= 0 && mnConv < nConvMapCount
&& aConvMap[mnConv] == formula::FormulaGrammar::CONV_XL_OOX)
mbEnglish = true;
// Same as for SC_UNO_COMPILEENGLISH, though an OpCodeMap should not
// had been set for CONV_XL_OOX.
if (mxOpCodeMap && mbEnglish != bOldEnglish)
{
ScDocument& rDoc = mpDocShell->GetDocument();
ScCompiler aCompiler( rDoc, ScAddress(), rDoc.GetGrammar());
mxOpCodeMap = formula::FormulaCompiler::CreateOpCodeMap( maOpCodeMapping, mbEnglish);
}
}
else if ( aPropertyName == SC_UNO_IGNORELEADING )
{