sc/source/ui/unoobj/tokenuno.cxx |   46 ++++++++++++++++++++++++++-------------
 1 file changed, 31 insertions(+), 15 deletions(-)

New commits:
commit d2475f85bf4f0015007746d6af5dd5baaee09566
Author:     Eike Rathke <er...@redhat.com>
AuthorDate: Mon Mar 22 01:14:49 2021 +0100
Commit:     Eike Rathke <er...@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 <er...@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 )
     {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to