Kaydet (Commit) abe17881 authored tarafından Katarina Behrens's avatar Katarina Behrens Kaydeden (comit) Eike Rathke

tdf#92256: Introducing CONV_A1_XL_A1 address pseudoconvention

a special case for INDIRECT function interpretation. Does what
OOo used to do, interprets formula using CONV_OOO first, failing
that, tries CONV_XL_A1

Change-Id: I4281ab2bb7164607206c0b8e51f7e63a1fc2db9a
Reviewed-on: https://gerrit.libreoffice.org/17255Reviewed-by: 's avatarEike Rathke <erack@redhat.com>
Tested-by: 's avatarEike Rathke <erack@redhat.com>
üst 6e7f44a5
......@@ -43,7 +43,11 @@ public:
CONV_LOTUS_A1, /* external? 3d? A1.B2 <placeholder/> */
CONV_LAST /* for loops, must always be last */
CONV_LAST, /* for loops, must always be last */
// not a real address convention, a special case for INDIRECT function interpretation
// only -> try using CONV_OOO, failing that CONV_XL_A1
CONV_A1_XL_A1
};
//! CONV_UNSPECIFIED is a negative value!
......
......@@ -7036,12 +7036,18 @@ void ScInterpreter::ScIndirect()
// Overwrite the config and try Excel R1C1.
eConv = FormulaGrammar::CONV_XL_R1C1;
}
const ScAddress::Details aDetails( eConv, aPos );
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 );
SCTAB nTab = aPos.Tab();
OUString sRefStr = GetString().getString();
ScRefAddress aRefAd, aRefAd2;
ScAddress::ExternalInfo aExtInfo;
if (ConvertDoubleRef(pDok, sRefStr, nTab, aRefAd, aRefAd2, aDetails, &aExtInfo))
if ( ConvertDoubleRef(pDok, sRefStr, nTab, aRefAd, aRefAd2, aDetails, &aExtInfo) ||
( bTryXlA1 && ConvertDoubleRef(pDok, sRefStr, nTab, aRefAd,
aRefAd2, aDetailsXlA1, &aExtInfo) ) )
{
if (aExtInfo.mbExternal)
{
......@@ -7053,7 +7059,9 @@ void ScInterpreter::ScIndirect()
else
PushDoubleRef( aRefAd, aRefAd2);
}
else if (ConvertSingleRef(pDok, sRefStr, nTab, aRefAd, aDetails, &aExtInfo))
else if ( ConvertSingleRef(pDok, sRefStr, nTab, aRefAd, aDetails, &aExtInfo) ||
( bTryXlA1 && ConvertSingleRef (pDok, sRefStr, nTab, aRefAd,
aDetailsXlA1, &aExtInfo) ) )
{
if (aExtInfo.mbExternal)
{
......
......@@ -46,6 +46,8 @@ formula::FormulaGrammar::AddressConvention toAddressConvention(sal_Int32 nPos)
return formula::FormulaGrammar::CONV_XL_A1;
case 3:
return formula::FormulaGrammar::CONV_XL_R1C1;
case 4:
return formula::FormulaGrammar::CONV_A1_XL_A1;
case 0:
default:
;
......@@ -64,6 +66,8 @@ sal_Int32 toSelectedItem( formula::FormulaGrammar::AddressConvention eConv )
return 2;
case formula::FormulaGrammar::CONV_XL_R1C1:
return 3;
case formula::FormulaGrammar::CONV_A1_XL_A1:
return 4;
default:
;
}
......
......@@ -311,6 +311,7 @@ void SAL_CALL ScDocumentConfiguration::setPropertyValue(
case 0: // CONV_OOO
case 2: // CONV_XL_A1
case 3: // CONV_XL_R1C1
case 7: // CONV_A1_XL_A1
aCalcConfig.meStringRefAddressSyntax = static_cast<formula::FormulaGrammar::AddressConvention>( nUno );
break;
default:
......@@ -467,6 +468,7 @@ uno::Any SAL_CALL ScDocumentConfiguration::getPropertyValue( const OUString& aPr
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;
......
......@@ -86,6 +86,7 @@
<item id="1">Calc A1</item>
<item id="2">Excel A1</item>
<item id="3">Excel R1C1</item>
<item id="4">Calc A1 | Excel A1</item>
</items>
</object>
<packing>
......
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