[Libreoffice-commits] core.git: sc/source
Eike Rathke (via logerrit)
logerrit at kemper.freedesktop.org
Mon Mar 22 13:38:30 UTC 2021
sc/source/ui/unoobj/tokenuno.cxx | 46 ++++++++++++++++++++++++++-------------
1 file changed, 31 insertions(+), 15 deletions(-)
New commits:
commit d2475f85bf4f0015007746d6af5dd5baaee09566
Author: Eike Rathke <erack at redhat.com>
AuthorDate: Mon Mar 22 01:14:49 2021 +0100
Commit: Eike Rathke <erack at redhat.com>
CommitDate: Mon Mar 22 14:37:44 2021 +0100
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 at redhat.com>
Tested-by: Jenkins
diff --git a/sc/source/ui/unoobj/tokenuno.cxx b/sc/source/ui/unoobj/tokenuno.cxx
index 3de405b605b2..33f005fff8d6 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 )
{
More information about the Libreoffice-commits
mailing list