summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKatarina Behrens <Katarina.Behrens@cib.de>2015-07-23 09:52:59 +0200
committerEike Rathke <erack@redhat.com>2015-07-24 14:33:20 +0000
commit738be269bfc795400fcb10d4eefb6c33b17bded4 (patch)
tree7f66afcf79e8f76e3b9feb702ac41097b4c9d158
parente0bbfcbed34bb71c1a4979a7db30e38bfd6a7f61 (diff)
tdf#92256: Handle case when string ref syntax is unknown
i.e. the document doesn't have that property. Use CONV_A1_XL_A1 pseudoconvention for interpreting INDIRECT in such case Change-Id: If9bac9053029b4b8f79d3ac7ac0759adbb25803f Reviewed-on: https://gerrit.libreoffice.org/17311 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Eike Rathke <erack@redhat.com>
-rw-r--r--sc/inc/calcconfig.hxx2
-rw-r--r--sc/qa/unit/ucalc_formula.cxx11
-rw-r--r--sc/source/core/tool/calcconfig.cxx12
-rw-r--r--sc/source/core/tool/interpr1.cxx7
-rw-r--r--sc/source/ui/optdlg/calcoptionsdlg.cxx2
-rw-r--r--sc/source/ui/unoobj/confuno.cxx43
6 files changed, 50 insertions, 27 deletions
diff --git a/sc/inc/calcconfig.hxx b/sc/inc/calcconfig.hxx
index d10154c426f4..18aab2166c0d 100644
--- a/sc/inc/calcconfig.hxx
+++ b/sc/inc/calcconfig.hxx
@@ -43,6 +43,7 @@ struct SC_DLLPUBLIC ScCalcConfig
formula::FormulaGrammar::AddressConvention meStringRefAddressSyntax;
StringConversion meStringConversion;
bool mbEmptyStringAsZero:1;
+ bool mbHasStringRefSyntax:1;
bool mbOpenCLSubsetOnly:1;
bool mbOpenCLAutoSelect:1;
@@ -59,6 +60,7 @@ struct SC_DLLPUBLIC ScCalcConfig
void reset();
void MergeDocumentSpecific( const ScCalcConfig& r );
+ void SetStringRefSyntax( formula::FormulaGrammar::AddressConvention eConv );
bool operator== (const ScCalcConfig& r) const;
bool operator!= (const ScCalcConfig& r) const;
diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx
index 8610c5467cb2..b7c4fd76cb9b 100644
--- a/sc/qa/unit/ucalc_formula.cxx
+++ b/sc/qa/unit/ucalc_formula.cxx
@@ -4396,9 +4396,10 @@ void Test::testFuncINDIRECT()
m_pDoc->CalcAll();
{
- // Default is to use the current formula syntax, which is Calc A1.
+ // Default is to use compatibility mode, accept both Calc A1 and
+ // Excel A1 syntax
const OUString* aChecks[] = {
- &aTest, &aRefErr, &aRefErr, &aTest
+ &aTest, &aTest, &aRefErr, &aTest
};
for (size_t i = 0; i < SAL_N_ELEMENTS(aChecks); ++i)
@@ -4409,7 +4410,7 @@ void Test::testFuncINDIRECT()
}
ScCalcConfig aConfig;
- aConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_OOO;
+ aConfig.SetStringRefSyntax( formula::FormulaGrammar::CONV_OOO );
m_pDoc->SetCalcConfig(aConfig);
m_pDoc->CalcAll();
{
@@ -4425,7 +4426,7 @@ void Test::testFuncINDIRECT()
}
}
- aConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_XL_A1;
+ aConfig.SetStringRefSyntax( formula::FormulaGrammar::CONV_XL_A1 );
m_pDoc->SetCalcConfig(aConfig);
m_pDoc->CalcAll();
{
@@ -4441,7 +4442,7 @@ void Test::testFuncINDIRECT()
}
}
- aConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_XL_R1C1;
+ aConfig.SetStringRefSyntax( formula::FormulaGrammar::CONV_XL_R1C1 );
m_pDoc->SetCalcConfig(aConfig);
m_pDoc->CalcAll();
{
diff --git a/sc/source/core/tool/calcconfig.cxx b/sc/source/core/tool/calcconfig.cxx
index 6fd43458ef88..cc52ad7b3de7 100644
--- a/sc/source/core/tool/calcconfig.cxx
+++ b/sc/source/core/tool/calcconfig.cxx
@@ -23,7 +23,8 @@
ScCalcConfig::ScCalcConfig() :
meStringRefAddressSyntax(formula::FormulaGrammar::CONV_UNSPECIFIED),
meStringConversion(StringConversion::LOCALE), // old LibreOffice behavior
- mbEmptyStringAsZero(false)
+ mbEmptyStringAsZero(false),
+ mbHasStringRefSyntax(false)
{
setOpenCLConfigToDefault();
@@ -85,6 +86,13 @@ void ScCalcConfig::MergeDocumentSpecific( const ScCalcConfig& r )
mbEmptyStringAsZero = r.mbEmptyStringAsZero;
// INDIRECT ref syntax is per document.
meStringRefAddressSyntax = r.meStringRefAddressSyntax;
+ mbHasStringRefSyntax = r.mbHasStringRefSyntax;
+}
+
+void ScCalcConfig::SetStringRefSyntax( formula::FormulaGrammar::AddressConvention eConv )
+{
+ meStringRefAddressSyntax = eConv;
+ mbHasStringRefSyntax = true;
}
bool ScCalcConfig::operator== (const ScCalcConfig& r) const
@@ -92,6 +100,7 @@ bool ScCalcConfig::operator== (const ScCalcConfig& r) const
return meStringRefAddressSyntax == r.meStringRefAddressSyntax &&
meStringConversion == r.meStringConversion &&
mbEmptyStringAsZero == r.mbEmptyStringAsZero &&
+ mbHasStringRefSyntax == r.mbHasStringRefSyntax &&
mbOpenCLSubsetOnly == r.mbOpenCLSubsetOnly &&
mbOpenCLAutoSelect == r.mbOpenCLAutoSelect &&
maOpenCLDevice == r.maOpenCLDevice &&
@@ -127,6 +136,7 @@ std::ostream& operator<<(std::ostream& rStream, const ScCalcConfig& rConfig)
"StringRefAddressSyntax=" << rConfig.meStringRefAddressSyntax << ","
"StringConversion=" << StringConversionToString(rConfig.meStringConversion) << ","
"EmptyStringAsZero=" << (rConfig.mbEmptyStringAsZero?"Y":"N") << ","
+ "HasStringRefSyntax=" << (rConfig.mbHasStringRefSyntax?"Y":"N") << ","
"OpenCLSubsetOnly=" << (rConfig.mbOpenCLSubsetOnly?"Y":"N") << ","
"OpenCLAutoSelect=" << (rConfig.mbOpenCLAutoSelect?"Y":"N") << ","
"OpenCLDevice='" << rConfig.maOpenCLDevice << "',"
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 31e98b1561fd..ec7c41fdc0f2 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -7031,13 +7031,18 @@ void ScInterpreter::ScIndirect()
// Use the current address syntax if unspecified.
eConv = pDok->GetAddressConvention();
+ // either CONV_A1_XL_A1 was explicitly configured, or nothing at all
+ // was configured
+ bool bTryXlA1 = (eConv == FormulaGrammar::CONV_A1_XL_A1 ||
+ !maCalcConfig.mbHasStringRefSyntax);
+
if (nParamCount == 2 && 0.0 == ::rtl::math::approxFloor( GetDouble()))
{
// Overwrite the config and try Excel R1C1.
eConv = FormulaGrammar::CONV_XL_R1C1;
+ bTryXlA1 = false;
}
- bool bTryXlA1 = (eConv == FormulaGrammar::CONV_A1_XL_A1);
const ScAddress::Details aDetails( bTryXlA1 ? FormulaGrammar::CONV_OOO : eConv, aPos );
const ScAddress::Details aDetailsXlA1( FormulaGrammar::CONV_XL_A1, aPos );
diff --git a/sc/source/ui/optdlg/calcoptionsdlg.cxx b/sc/source/ui/optdlg/calcoptionsdlg.cxx
index 6f2de0bf8b92..dc41f5f96501 100644
--- a/sc/source/ui/optdlg/calcoptionsdlg.cxx
+++ b/sc/source/ui/optdlg/calcoptionsdlg.cxx
@@ -226,7 +226,7 @@ IMPL_LINK(ScCalcOptionsDialog, ConversionModifiedHdl, ListBox*, pConv )
IMPL_LINK(ScCalcOptionsDialog, SyntaxModifiedHdl, ListBox*, pSyntax)
{
- maConfig.meStringRefAddressSyntax = toAddressConvention(pSyntax->GetSelectEntryPos());
+ maConfig.SetStringRefSyntax(toAddressConvention(pSyntax->GetSelectEntryPos()));
return 0;
}
diff --git a/sc/source/ui/unoobj/confuno.cxx b/sc/source/ui/unoobj/confuno.cxx
index 5d0385e2fbea..c695f4fc3c81 100644
--- a/sc/source/ui/unoobj/confuno.cxx
+++ b/sc/source/ui/unoobj/confuno.cxx
@@ -312,10 +312,10 @@ void SAL_CALL ScDocumentConfiguration::setPropertyValue(
case 2: // CONV_XL_A1
case 3: // CONV_XL_R1C1
case 7: // CONV_A1_XL_A1
- aCalcConfig.meStringRefAddressSyntax = static_cast<formula::FormulaGrammar::AddressConvention>( nUno );
+ aCalcConfig.SetStringRefSyntax( static_cast<formula::FormulaGrammar::AddressConvention>( nUno ) );
break;
default:
- aCalcConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_UNSPECIFIED;
+ aCalcConfig.SetStringRefSyntax( formula::FormulaGrammar::CONV_UNSPECIFIED );
break;
}
@@ -461,26 +461,31 @@ uno::Any SAL_CALL ScDocumentConfiguration::getPropertyValue( const OUString& aPr
else if ( aPropertyName == SC_UNO_SYNTAXSTRINGREF )
{
ScCalcConfig aCalcConfig = rDoc.GetCalcConfig();
- formula::FormulaGrammar::AddressConvention aConv = aCalcConfig.meStringRefAddressSyntax;
- switch (aConv)
+ // if it hasn't been read or explicitly changed, don't write it
+ if ( aCalcConfig.mbHasStringRefSyntax )
{
- case formula::FormulaGrammar::CONV_OOO:
- case formula::FormulaGrammar::CONV_XL_A1:
- case formula::FormulaGrammar::CONV_XL_R1C1:
- case formula::FormulaGrammar::CONV_A1_XL_A1:
- aRet <<= static_cast<sal_Int16>( aConv );
- break;
-
- case formula::FormulaGrammar::CONV_UNSPECIFIED:
- case formula::FormulaGrammar::CONV_ODF:
- case formula::FormulaGrammar::CONV_XL_OOX:
- case formula::FormulaGrammar::CONV_LOTUS_A1:
- case formula::FormulaGrammar::CONV_LAST:
+ formula::FormulaGrammar::AddressConvention aConv = aCalcConfig.meStringRefAddressSyntax;
+
+ switch (aConv)
{
- aRet <<= sal_Int16(9999);
- break;
- }
+ case formula::FormulaGrammar::CONV_OOO:
+ case formula::FormulaGrammar::CONV_XL_A1:
+ case formula::FormulaGrammar::CONV_XL_R1C1:
+ case formula::FormulaGrammar::CONV_A1_XL_A1:
+ aRet <<= static_cast<sal_Int16>( aConv );
+ break;
+
+ case formula::FormulaGrammar::CONV_UNSPECIFIED:
+ case formula::FormulaGrammar::CONV_ODF:
+ case formula::FormulaGrammar::CONV_XL_OOX:
+ case formula::FormulaGrammar::CONV_LOTUS_A1:
+ case formula::FormulaGrammar::CONV_LAST:
+ {
+ aRet <<= sal_Int16(9999);
+ break;
+ }
+ }
}
}