[Libreoffice-commits] core.git: sc/inc sc/source
Eike Rathke (via logerrit)
logerrit at kemper.freedesktop.org
Sat Oct 31 10:47:46 UTC 2020
sc/inc/rangeutl.hxx | 3 ++-
sc/source/core/tool/interpr1.cxx | 2 +-
sc/source/core/tool/rangeutl.cxx | 36 +++++++++++++++++++++++++++++++++++-
3 files changed, 38 insertions(+), 3 deletions(-)
New commits:
commit 075da6f2463c922bcb8c553949756af4e8e103e0
Author: Eike Rathke <erack at redhat.com>
AuthorDate: Sat Oct 31 01:20:55 2020 +0100
Commit: Eike Rathke <erack at redhat.com>
CommitDate: Sat Oct 31 11:47:00 2020 +0100
Resolves: tdf#100818 Support sheet-local scoped names in INDIRECT()
Change-Id: Iae1ef07bf735b5886e391dced9984acee617f051
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105091
Tested-by: Jenkins
Reviewed-by: Eike Rathke <erack at redhat.com>
diff --git a/sc/inc/rangeutl.hxx b/sc/inc/rangeutl.hxx
index 2212d6bb9a41..7f68a25a9af7 100644
--- a/sc/inc/rangeutl.hxx
+++ b/sc/inc/rangeutl.hxx
@@ -221,7 +221,8 @@ public:
const ScDocument& rDoc );
/// String to RangeData core
- static ScRangeData* GetRangeDataFromString(const OUString& rString, const SCTAB nTab, const ScDocument& rDoc);
+ static ScRangeData* GetRangeDataFromString( const OUString& rString, const SCTAB nTab,
+ const ScDocument& rDoc, formula::FormulaGrammar::AddressConvention eConv );
};
class ScArea
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 321f80328095..8e50ae7303c5 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -8128,7 +8128,7 @@ void ScInterpreter::ScIndirect()
{
do
{
- ScRangeData* pData = ScRangeStringConverter::GetRangeDataFromString(sRefStr, nTab, mrDoc);
+ ScRangeData* pData = ScRangeStringConverter::GetRangeDataFromString( sRefStr, nTab, mrDoc, eConv);
if (!pData)
break;
diff --git a/sc/source/core/tool/rangeutl.cxx b/sc/source/core/tool/rangeutl.cxx
index 39c4a1a26f58..eb6737f34879 100644
--- a/sc/source/core/tool/rangeutl.cxx
+++ b/sc/source/core/tool/rangeutl.cxx
@@ -894,8 +894,42 @@ void ScRangeStringConverter::GetStringFromXMLRangeString( OUString& rString, con
rString = aRetStr.makeStringAndClear();
}
-ScRangeData* ScRangeStringConverter::GetRangeDataFromString(const OUString& rString, const SCTAB nTab, const ScDocument& rDoc)
+ScRangeData* ScRangeStringConverter::GetRangeDataFromString( const OUString& rString, const SCTAB nTab,
+ const ScDocument& rDoc, formula::FormulaGrammar::AddressConvention eConv )
{
+ // This may be called with an external 'doc'#name but wouldn't find any.
+
+ // Dot '.' is not allowed in range names, if present only lookup if it's a
+ // sheet-local name. Same for '!' Excel syntax.
+ // If eConv == FormulaGrammar::CONV_A1_XL_A1 then try both, first our own.
+ sal_Int32 nIndex = -1;
+ if (eConv == FormulaGrammar::CONV_OOO || eConv == FormulaGrammar::CONV_A1_XL_A1)
+ nIndex = ScGlobal::FindUnquoted( rString, '.');
+ if (nIndex < 0 && (eConv == FormulaGrammar::CONV_A1_XL_A1
+ || eConv == FormulaGrammar::CONV_XL_A1
+ || eConv == FormulaGrammar::CONV_XL_R1C1
+ || eConv == FormulaGrammar::CONV_XL_OOX))
+ nIndex = ScGlobal::FindUnquoted( rString, '!');
+
+ if (nIndex >= 0)
+ {
+ if (nIndex == 0)
+ return nullptr; // Can't be a name.
+
+ OUString aTab( rString.copy( 0, nIndex));
+ ScGlobal::EraseQuotes( aTab, '\'');
+ SCTAB nLocalTab;
+ if (!rDoc.GetTable( aTab, nLocalTab))
+ return nullptr;
+
+ ScRangeName* pLocalRangeName = rDoc.GetRangeName(nLocalTab);
+ if (!pLocalRangeName)
+ return nullptr;
+
+ const OUString aName( rString.copy( nIndex+1));
+ return pLocalRangeName->findByUpperName( ScGlobal::getCharClassPtr()->uppercase( aName));
+ }
+
ScRangeName* pLocalRangeName = rDoc.GetRangeName(nTab);
ScRangeData* pData = nullptr;
OUString aUpperName = ScGlobal::getCharClassPtr()->uppercase(rString);
More information about the Libreoffice-commits
mailing list