reduce Sc*Ref*Token virtual calls

similar to
  commit f47fc9a67f16a3da1e5cbcc8b821682298ec90b3
  reduce ScRefListToken virtual calls

Push the Get/Set-Ref*() methods down to the only subclasses
that actually use it.

Change-Id: Idf56c7c1fc2340438add93e11a549824461b80a8
Reviewed-on: https://gerrit.collaboraoffice.com/c/core/+/1243
Reviewed-by: Noel Grandin <noel.grandin@collabora.com>
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
(cherry picked from commit 003c0007c13e443fe4e520d1b70586266abf7811)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/205579
Reviewed-by: Julien Nabet <serval2412@yahoo.fr>
Tested-by: Julien Nabet <serval2412@yahoo.fr>
This commit is contained in:
Noel Grandin
2026-05-23 21:47:06 +02:00
committed by Julien Nabet
parent e494181c41
commit 1d8cf993df
35 changed files with 342 additions and 308 deletions
-24
View File
@@ -182,30 +182,6 @@ void FormulaToken::SetInForceArray( ParamClass )
const svl::SharedString INVALID_STRING;
const ScSingleRefData* FormulaToken::GetSingleRef() const
{
OSL_FAIL( "FormulaToken::GetSingleRef: virtual dummy called" );
return nullptr;
}
ScSingleRefData* FormulaToken::GetSingleRef()
{
OSL_FAIL( "FormulaToken::GetSingleRef: virtual dummy called" );
return nullptr;
}
const ScSingleRefData* FormulaToken::GetSingleRef2() const
{
OSL_FAIL( "FormulaToken::GetSingleRef2: virtual dummy called" );
return nullptr;
}
ScSingleRefData* FormulaToken::GetSingleRef2()
{
OSL_FAIL( "FormulaToken::GetSingleRef2: virtual dummy called" );
return nullptr;
}
bool FormulaToken::TextEqual( const FormulaToken& rToken ) const
{
return *this == rToken;
-5
View File
@@ -216,11 +216,6 @@ public:
virtual ParamClass GetInForceArray() const;
virtual void SetInForceArray( ParamClass c );
virtual const ScSingleRefData* GetSingleRef() const;
virtual ScSingleRefData* GetSingleRef();
virtual const ScSingleRefData* GetSingleRef2() const;
virtual ScSingleRefData* GetSingleRef2();
virtual FormulaToken* Clone() const { return new FormulaToken(*this); }
virtual bool TextEqual( const formula::FormulaToken& rToken ) const;
+4
View File
@@ -28,6 +28,7 @@
class ScDocument;
class ScRangeList;
struct ScComplexRefData;
struct ScSingleRefData;
namespace ScRefTokenHelper
{
@@ -62,6 +63,9 @@ namespace ScRefTokenHelper
ScTokenRef createRefToken(const ScDocument& rDoc, const ScAddress& rAddr);
ScTokenRef createRefToken(const ScDocument& rDoc, const ScRange& rRange);
SC_DLLPUBLIC ScSingleRefData* getSingleRef(formula::FormulaToken*);
SC_DLLPUBLIC const ScSingleRefData* getSingleRef(const formula::FormulaToken*);
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+29 -16
View File
@@ -53,7 +53,7 @@ void DumpToken(formula::FormulaToken const & rToken);
*/
formula::FormulaTokenRef extendRangeReference( ScSheetLimits& rLimits, formula::FormulaToken & rTok1, formula::FormulaToken & rTok2, const ScAddress & rPos, bool bReuseDoubleRef );
class ScSingleRefToken final : public formula::FormulaToken
class SAL_DLLPUBLIC_RTTI ScSingleRefToken final : public formula::FormulaToken
{
private:
ScSheetLimits& mrSheetLimits; // don't use rtl::Reference to avoid ref-counting traffic
@@ -61,8 +61,8 @@ private:
public:
ScSingleRefToken( ScSheetLimits& rLimits, const ScSingleRefData& r, OpCode e = ocPush ) :
FormulaToken( formula::svSingleRef, e ), mrSheetLimits(rLimits), aSingleRef( r ) {}
virtual const ScSingleRefData* GetSingleRef() const override;
virtual ScSingleRefData* GetSingleRef() override;
const ScSingleRefData& GetSingleRef() const { return aSingleRef; }
ScSingleRefData& GetSingleRef() { return aSingleRef; }
virtual bool TextEqual( const formula::FormulaToken& rToken ) const override;
virtual bool operator==( const formula::FormulaToken& rToken ) const override;
virtual FormulaToken* Clone() const override { return new ScSingleRefToken(*this); }
@@ -76,12 +76,12 @@ private:
public:
ScDoubleRefToken( ScSheetLimits& rLimits, const ScComplexRefData& r, OpCode e = ocPush ) :
FormulaToken( formula::svDoubleRef, e ), mrSheetLimits(rLimits), aDoubleRef( r ) {}
virtual const ScSingleRefData* GetSingleRef() const override;
virtual ScSingleRefData* GetSingleRef() override;
const ScSingleRefData& GetSingleRef() const { return aDoubleRef.Ref1; }
ScSingleRefData& GetSingleRef() { return aDoubleRef.Ref1; }
const ScComplexRefData& GetDoubleRef() const { return aDoubleRef; }
ScComplexRefData& GetDoubleRef() { return aDoubleRef; }
virtual const ScSingleRefData* GetSingleRef2() const override;
virtual ScSingleRefData* GetSingleRef2() override;
const ScSingleRefData& GetSingleRef2() const { return aDoubleRef.Ref2; }
ScSingleRefData& GetSingleRef2() { return aDoubleRef.Ref2; }
virtual bool TextEqual( const formula::FormulaToken& rToken ) const override;
virtual bool operator==( const formula::FormulaToken& rToken ) const override;
virtual FormulaToken* Clone() const override { return new ScDoubleRefToken(*this); }
@@ -154,8 +154,8 @@ public:
ScExternalSingleRefToken & operator =(ScExternalSingleRefToken &&) = delete; // due to FormulaToken
const svl::SharedString & GetTableName() const { return maTabName; }
virtual const ScSingleRefData* GetSingleRef() const override;
virtual ScSingleRefData* GetSingleRef() override;
const ScSingleRefData& GetSingleRef() const { return maSingleRef; }
ScSingleRefData& GetSingleRef() { return maSingleRef; }
virtual bool operator==( const formula::FormulaToken& rToken ) const override;
virtual FormulaToken* Clone() const override { return new ScExternalSingleRefToken(*this); }
};
@@ -176,10 +176,10 @@ public:
ScExternalDoubleRefToken & operator =(ScExternalDoubleRefToken &&) = delete; // due to FormulaToken
const svl::SharedString & GetTableName() const { return maTabName; }
virtual const ScSingleRefData* GetSingleRef() const override;
virtual ScSingleRefData* GetSingleRef() override;
virtual const ScSingleRefData* GetSingleRef2() const override;
virtual ScSingleRefData* GetSingleRef2() override;
const ScSingleRefData& GetSingleRef() const { return maDoubleRef.Ref1; }
ScSingleRefData& GetSingleRef() { return maDoubleRef.Ref1; }
const ScSingleRefData& GetSingleRef2() const { return maDoubleRef.Ref2; }
ScSingleRefData& GetSingleRef2() { return maDoubleRef.Ref2; }
const ScComplexRefData& GetDoubleRef() const { return maDoubleRef; }
ScComplexRefData& GetDoubleRef() { return maDoubleRef; }
virtual bool operator==( const formula::FormulaToken& rToken ) const override;
@@ -409,9 +409,15 @@ public:
SingleDoubleRefModifier( formula::FormulaToken& rT )
{
formula::StackVar eType = rT.GetType();
if ( eType == formula::svSingleRef || eType == formula::svExternalSingleRef )
if ( eType == formula::svSingleRef )
{
pS = rT.GetSingleRef();
pS = &static_cast<ScSingleRefToken&>(rT).GetSingleRef();
aDub.Ref1 = aDub.Ref2 = *pS;
pD = &aDub;
}
else if ( eType == formula::svExternalSingleRef )
{
pS = &static_cast<ScExternalSingleRefToken&>(rT).GetSingleRef();
aDub.Ref1 = aDub.Ref2 = *pS;
pD = &aDub;
}
@@ -444,7 +450,14 @@ public:
const ScSingleRefData& Ref2;
SingleDoubleRefProvider( const formula::FormulaToken& r )
: Ref1( *r.GetSingleRef() ),
: Ref1( r.GetType() == formula::svSingleRef
? static_cast<const ScSingleRefToken&>(r).GetSingleRef()
: r.GetType() == formula::svExternalSingleRef
? static_cast<const ScExternalSingleRefToken&>(r).GetSingleRef()
: r.GetType() == formula::svDoubleRef
? static_cast<const ScDoubleRefToken&>(r).GetSingleRef()
: static_cast<const ScExternalDoubleRefToken&>(r).GetSingleRef()
),
Ref2( r.GetType() == formula::svDoubleRef
? static_cast<const ScDoubleRefToken&>(r).GetDoubleRef().Ref2
: r.GetType() == formula::svExternalDoubleRef
+3 -2
View File
@@ -1351,9 +1351,10 @@ CPPUNIT_TEST_FIXTURE(ScExportTest3, testAbsNamedRangeHTML)
ScDocument* pDoc = getScDoc();
ScRangeData* pRangeData = pDoc->GetRangeName()->findByUpperName(u"HTML_1"_ustr);
ScSingleRefData* pRef = pRangeData->GetCode()->FirstToken()->GetSingleRef();
ScSingleRefData& rRef
= static_cast<ScDoubleRefToken*>(pRangeData->GetCode()->FirstToken())->GetSingleRef();
// see tdf#119141 for the reason why this isn't Sheet1.HTML_1
CPPUNIT_ASSERT_MESSAGE("HTML_1 is an absolute reference", !pRef->IsTabRel());
CPPUNIT_ASSERT_MESSAGE("HTML_1 is an absolute reference", !rRef.IsTabRel());
}
CPPUNIT_TEST_FIXTURE(ScExportTest3, testTdf80149)
+7 -7
View File
@@ -1562,7 +1562,7 @@ bool broadcasterShifted(const ScDocument& rDoc, const ScAddress& rFrom, const Sc
return true;
}
formula::FormulaToken* getSingleRefToken(ScDocument& rDoc, const ScAddress& rPos)
ScSingleRefToken* getSingleRefToken(ScDocument& rDoc, const ScAddress& rPos)
{
ScFormulaCell* pFC = rDoc.GetFormulaCell(rPos);
if (!pFC)
@@ -1585,16 +1585,16 @@ formula::FormulaToken* getSingleRefToken(ScDocument& rDoc, const ScAddress& rPos
return nullptr;
}
return pToken;
return static_cast<ScSingleRefToken*>(pToken);
}
bool checkRelativeRefToken(ScDocument& rDoc, const ScAddress& rPos, SCCOL nRelCol, SCROW nRelRow)
{
formula::FormulaToken* pToken = getSingleRefToken(rDoc, rPos);
auto pToken = getSingleRefToken(rDoc, rPos);
if (!pToken)
return false;
ScSingleRefData& rRef = *pToken->GetSingleRef();
ScSingleRefData& rRef = pToken->GetSingleRef();
if (!rRef.IsColRel() || rRef.Col() != nRelCol)
{
std::cerr << "Unexpected relative column address." << std::endl;
@@ -1612,11 +1612,11 @@ bool checkRelativeRefToken(ScDocument& rDoc, const ScAddress& rPos, SCCOL nRelCo
bool checkDeletedRefToken(ScDocument& rDoc, const ScAddress& rPos)
{
formula::FormulaToken* pToken = getSingleRefToken(rDoc, rPos);
auto pToken = getSingleRefToken(rDoc, rPos);
if (!pToken)
return false;
ScSingleRefData& rRef = *pToken->GetSingleRef();
ScSingleRefData& rRef = pToken->GetSingleRef();
if (!rRef.IsDeleted())
{
std::cerr << "Deleted reference is expected, but it's still a valid reference." << std::endl;
@@ -4553,7 +4553,7 @@ bool hasRange(const ScDocument* pDoc, const std::vector<ScTokenRef>& rRefTokens,
{
case formula::svSingleRef:
{
ScSingleRefData aData = *p->GetSingleRef();
ScSingleRefData aData = static_cast<ScSingleRefToken*>(p.get())->GetSingleRef();
if (rRange.aStart != rRange.aEnd)
break;
+1 -1
View File
@@ -1333,7 +1333,7 @@ CPPUNIT_TEST_FIXTURE(TestFormula, testFormulaCompilerImplicitIntersection1ParamW
CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong type of RPN token(argument to COS)", svSingleRef, ppRPNTokens[0]->GetType());
ScSingleRefData aArgAddrRPN = *ppRPNTokens[0]->GetSingleRef();
ScSingleRefData aArgAddrRPN = static_cast<ScSingleRefToken*>(ppRPNTokens[0])->GetSingleRef();
ScAddress aArgAddrActual = aArgAddrRPN.toAbs(*m_pDoc, rCase.aCellAddress);
CPPUNIT_ASSERT_EQUAL_MESSAGE("Computed implicit intersection singleref is wrong", rCase.aArgAddr, aArgAddrActual);
}
+3 -3
View File
@@ -1084,9 +1084,9 @@ CPPUNIT_TEST_FIXTURE(TestSharedFormula, testSharedFormulasDeleteColumns)
CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pCode->GetLen());
const FormulaToken* pToken = pCode->GetArray()[0];
CPPUNIT_ASSERT_EQUAL(svSingleRef, pToken->GetType());
const ScSingleRefData* pSRef = pToken->GetSingleRef();
CPPUNIT_ASSERT(pSRef->IsColDeleted());
CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(0), pSRef->toAbs(*m_pDoc, ScAddress(1,0,0)).Row());
const ScSingleRefData& rSRef = static_cast<const ScSingleRefToken*>(pToken)->GetSingleRef();
CPPUNIT_ASSERT(rSRef.IsColDeleted());
CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(0), rSRef.toAbs(*m_pDoc, ScAddress(1,0,0)).Row());
// The formula string should show #REF! in lieu of the column position (only for Calc A1 syntax).
sc::CompileFormulaContext aCFCxt(*m_pDoc, FormulaGrammar::GRAM_ENGLISH);
+5 -4
View File
@@ -18,6 +18,7 @@
#include <refdata.hxx>
#include <editeng/fhgtitem.hxx>
#include <scitems.hxx>
#include <token.hxx>
#include <formula/token.hxx>
#include <vcl/bitmap.hxx>
@@ -56,8 +57,8 @@ void ScFormulaListener::startListening(const ScTokenArray* pArr, const ScRange&
{
case formula::svSingleRef:
{
ScAddress aCell = t->GetSingleRef()->toAbs(mrDoc, rRange.aStart);
ScAddress aCell2 = t->GetSingleRef()->toAbs(mrDoc, rRange.aEnd);
ScAddress aCell = static_cast<ScSingleRefToken*>(t)->GetSingleRef().toAbs(mrDoc, rRange.aStart);
ScAddress aCell2 = static_cast<ScSingleRefToken*>(t)->GetSingleRef().toAbs(mrDoc, rRange.aEnd);
ScRange aRange(aCell, aCell2);
if (aRange.IsValid())
mrDoc.StartListeningArea(aRange, false, this);
@@ -65,8 +66,8 @@ void ScFormulaListener::startListening(const ScTokenArray* pArr, const ScRange&
break;
case formula::svDoubleRef:
{
const ScSingleRefData& rRef1 = *t->GetSingleRef();
const ScSingleRefData& rRef2 = *t->GetSingleRef2();
const ScSingleRefData& rRef1 = static_cast<ScDoubleRefToken*>(t)->GetSingleRef();
const ScSingleRefData& rRef2 = static_cast<ScDoubleRefToken*>(t)->GetSingleRef2();
ScAddress aCell1 = rRef1.toAbs(mrDoc, rRange.aStart);
ScAddress aCell2 = rRef2.toAbs(mrDoc, rRange.aStart);
ScAddress aCell3 = rRef1.toAbs(mrDoc, rRange.aEnd);
+9 -5
View File
@@ -39,6 +39,7 @@
#include <tokenarray.hxx>
#include <fillinfo.hxx>
#include <refupdatecontext.hxx>
#include <reftokenhelper.hxx>
#include <formula/errorcodes.hxx>
#include <svl/sharedstring.hxx>
#include <svl/sharedstringpool.hxx>
@@ -93,12 +94,15 @@ static bool lcl_HasRelRef( ScDocument& rDoc, const ScTokenArray* pFormula, sal_u
ScSingleRefData& rRef2 = static_cast<ScDoubleRefToken*>(t)->GetDoubleRef().Ref2;
if ( rRef2.IsColRel() || rRef2.IsRowRel() || rRef2.IsTabRel() )
return true;
[[fallthrough]];
ScSingleRefData& rRef1 = static_cast<ScDoubleRefToken*>(t)->GetSingleRef();
if ( rRef1.IsColRel() || rRef1.IsRowRel() || rRef1.IsTabRel() )
return true;
}
break;
case svSingleRef:
{
ScSingleRefData& rRef1 = *t->GetSingleRef();
ScSingleRefData& rRef1 = static_cast<ScSingleRefToken*>(t)->GetSingleRef();
if ( rRef1.IsColRel() || rRef1.IsRowRel() || rRef1.IsTabRel() )
return true;
}
@@ -1423,9 +1427,9 @@ ScAddress ScConditionEntry::GetValidSrcPos() const
{
for ( auto t: pFormula->References() )
{
ScSingleRefData& rRef1 = *t->GetSingleRef();
ScAddress aAbs = rRef1.toAbs(mrDoc, aSrcPos);
if (!rRef1.IsTabDeleted())
ScSingleRefData* pRef1 = ScRefTokenHelper::getSingleRef(t);
ScAddress aAbs = pRef1->toAbs(mrDoc, aSrcPos);
if (!pRef1->IsTabDeleted())
{
if (aAbs.Tab() < nMinTab)
nMinTab = aAbs.Tab();
+1 -1
View File
@@ -370,7 +370,7 @@ void ScDocument::InsertMatrixFormula(SCCOL nCol1, SCROW nRow1,
// Reference in each cell must point to the origin cell relative to the current cell.
aRefData.SetRelRow(nRow1 - nRow);
*t->GetSingleRef() = aRefData;
static_cast<ScSingleRefToken*>(t)->GetSingleRef() = aRefData;
// Token array must be cloned so that each formula cell receives its own copy.
ScTokenArray aTokArr(aArr.CloneValue());
aPos = ScAddress(nCol, nRow, nTab);
+3 -2
View File
@@ -24,6 +24,7 @@
#include <bcaslot.hxx>
#include <scopetools.hxx>
#include <numformat.hxx>
#include <reftokenhelper.hxx>
#include <o3tl/safeint.hxx>
#include <svl/sharedstringpool.hxx>
@@ -446,7 +447,7 @@ void ScDocumentImport::setMatrixCells(
aPos.SetRow(nRow);
// Reference in each cell must point to the origin cell relative to the current cell.
aRefData.SetAddress(mpImpl->mrDoc.GetSheetLimits(), rBasePos, aPos);
*t->GetSingleRef() = aRefData;
*ScRefTokenHelper::getSingleRef(t) = aRefData;
ScTokenArray aTokArr(aArr.CloneValue());
pCell = new ScFormulaCell(mpImpl->mrDoc, aPos, aTokArr, eGram, ScMatrixMode::Reference);
pBlockPos->miCellPos =
@@ -466,7 +467,7 @@ void ScDocumentImport::setMatrixCells(
{
aPos.SetRow(nRow);
aRefData.SetAddress(mpImpl->mrDoc.GetSheetLimits(), rBasePos, aPos);
*t->GetSingleRef() = aRefData;
*ScRefTokenHelper::getSingleRef(t) = aRefData;
ScTokenArray aTokArr(aArr.CloneValue());
pCell = new ScFormulaCell(mpImpl->mrDoc, aPos, aTokArr, eGram, ScMatrixMode::Reference);
pBlockPos->miCellPos =
+37 -36
View File
@@ -48,6 +48,7 @@
#include <editutil.hxx>
#include <chgtrack.hxx>
#include <tokenarray.hxx>
#include <reftokenhelper.hxx>
#include <comphelper/threadpool.hxx>
#include <editeng/editobj.hxx>
@@ -1000,7 +1001,7 @@ OUString ScFormulaCell::GetFormula( const FormulaGrammar::Grammar eGrammar, ScIn
* GetEnglishFormula() omitted that test.
* Can we live without in all cases? */
ScFormulaCell* pCell = nullptr;
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(rDocument, aPos);
if (rDocument.ValidAddress(aAbs))
pCell = rDocument.GetFormulaCell(aAbs);
@@ -1058,7 +1059,7 @@ OUString ScFormulaCell::GetFormula( sc::CompileFormulaContext& rCxt, ScInterpret
* GetEnglishFormula() omitted that test.
* Can we live without in all cases? */
ScFormulaCell* pCell = nullptr;
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(rDocument, aPos);
if (rDocument.ValidAddress(aAbs))
pCell = rDocument.GetFormulaCell(aAbs);
@@ -2879,7 +2880,7 @@ bool ScFormulaCell::GetMatrixOrigin( const ScDocument& rDoc, ScAddress& rPos ) c
formula::FormulaToken* t = aIter.GetNextReferenceRPN();
if( t )
{
ScSingleRefData& rRef = *t->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(t)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(rDoc, aPos);
if (rDoc.ValidAddress(aAbs))
{
@@ -3134,7 +3135,7 @@ ScFormulaCell::RelNameRef ScFormulaCell::HasRelNameReference() const
switch (t->GetType())
{
case formula::svSingleRef:
if (t->GetSingleRef()->IsRelName() && eRelNameRef == RelNameRef::NONE)
if (static_cast<ScSingleRefToken*>(t)->GetSingleRef().IsRelName() && eRelNameRef == RelNameRef::NONE)
eRelNameRef = RelNameRef::SINGLE;
break;
case formula::svDoubleRef:
@@ -3203,7 +3204,7 @@ bool checkCompileColRowName(
ScRangePairList* pRowList = rDoc.GetRowNameRanges();
while ((t = aIter.GetNextColRowName()) != nullptr)
{
ScSingleRefData& rRef = *t->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(t)->GetSingleRef();
if (rCxt.mnRowDelta > 0 && rRef.IsColRel())
{ // ColName
ScAddress aAdr = rRef.toAbs(rDoc, aPos);
@@ -3248,7 +3249,7 @@ bool checkCompileColRowName(
const formula::FormulaToken* t = aIter.GetNextColRowName();
for (; t; t = aIter.GetNextColRowName())
{
const ScSingleRefData& rRef = *t->GetSingleRef();
const ScSingleRefData& rRef = static_cast<const ScSingleRefToken*>(t)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(rDoc, aPos);
if (rDoc.ValidAddress(aAbs))
{
@@ -3731,9 +3732,9 @@ void ScFormulaCell::UpdateInsertTabAbs(SCTAB nTable)
formula::FormulaToken* p = aIter.GetNextReferenceRPN();
while (p)
{
ScSingleRefData& rRef1 = *p->GetSingleRef();
if (!rRef1.IsTabRel() && nTable <= rRef1.Tab())
rRef1.IncTab(1);
ScSingleRefData* pRef1 = ScRefTokenHelper::getSingleRef(p);
if (!pRef1->IsTabRel() && nTable <= pRef1->Tab())
pRef1->IncTab(1);
if (p->GetType() == formula::svDoubleRef)
{
ScSingleRefData& rRef2 = static_cast<ScDoubleRefToken*>(p)->GetDoubleRef().Ref2;
@@ -3770,7 +3771,7 @@ bool ScFormulaCell::TestTabRefAbs(SCTAB nTable)
formula::FormulaToken* p = aIter.GetNextReferenceRPN();
while (p)
{
ScSingleRefData& rRef1 = *p->GetSingleRef();
ScSingleRefData& rRef1 = *ScRefTokenHelper::getSingleRef(p);
if (!rRef1.IsTabRel())
{
if (nTable != rRef1.Tab())
@@ -3820,14 +3821,14 @@ void ScFormulaCell::TransposeReference()
formula::FormulaToken* t;
while ( ( t = aIter.GetNextReference() ) != nullptr )
{
ScSingleRefData& rRef1 = *t->GetSingleRef();
if ( rRef1.IsColRel() && rRef1.IsRowRel() )
ScSingleRefData* pRef1 = ScRefTokenHelper::getSingleRef(t);
if ( pRef1->IsColRel() && pRef1->IsRowRel() )
{
bool bDouble = (t->GetType() == formula::svDoubleRef);
ScSingleRefData& rRef2 = (bDouble ? static_cast<ScDoubleRefToken*>(t)->GetDoubleRef().Ref2 : rRef1);
ScSingleRefData& rRef2 = (bDouble ? static_cast<ScDoubleRefToken*>(t)->GetDoubleRef().Ref2 : *pRef1);
if ( !bDouble || (rRef2.IsColRel() && rRef2.IsRowRel()) )
{
lcl_TransposeReference(rRef1);
lcl_TransposeReference(*pRef1);
if ( bDouble )
lcl_TransposeReference(rRef2);
@@ -4155,8 +4156,8 @@ ScFormulaCell::CompareState ScFormulaCell::CompareByTokenArray( const ScFormulaC
case formula::svSingleRef:
{
// Single cell reference.
const ScSingleRefData& rRef = *pThisTok->GetSingleRef();
if (rRef != *pOtherTok->GetSingleRef())
const ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(pThisTok)->GetSingleRef();
if (rRef != static_cast<ScSingleRefToken*>(pOtherTok)->GetSingleRef())
return NotEqual;
if (rRef.IsRowRel())
@@ -4166,12 +4167,12 @@ ScFormulaCell::CompareState ScFormulaCell::CompareByTokenArray( const ScFormulaC
case formula::svDoubleRef:
{
// Range reference.
const ScSingleRefData& rRef1 = *pThisTok->GetSingleRef();
const ScSingleRefData& rRef2 = *pThisTok->GetSingleRef2();
if (rRef1 != *pOtherTok->GetSingleRef())
const ScSingleRefData& rRef1 = static_cast<ScDoubleRefToken*>(pThisTok)->GetSingleRef();
const ScSingleRefData& rRef2 = static_cast<ScDoubleRefToken*>(pThisTok)->GetSingleRef2();
if (rRef1 != static_cast<ScDoubleRefToken*>(pOtherTok)->GetSingleRef())
return NotEqual;
if (rRef2 != *pOtherTok->GetSingleRef2())
if (rRef2 != static_cast<ScDoubleRefToken*>(pOtherTok)->GetSingleRef2())
return NotEqual;
if (rRef1.IsRowRel())
@@ -4281,8 +4282,8 @@ ScFormulaCell::CompareState ScFormulaCell::CompareByTokenArray( const ScFormulaC
case formula::svSingleRef:
{
// Single cell reference.
const ScSingleRefData& rRef = *pThisTok->GetSingleRef();
if (rRef != *pOtherTok->GetSingleRef())
const ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(pThisTok)->GetSingleRef();
if (rRef != static_cast<ScSingleRefToken*>(pOtherTok)->GetSingleRef())
return NotEqual;
if (rRef.IsRowRel())
@@ -4292,12 +4293,12 @@ ScFormulaCell::CompareState ScFormulaCell::CompareByTokenArray( const ScFormulaC
case formula::svDoubleRef:
{
// Range reference.
const ScSingleRefData& rRef1 = *pThisTok->GetSingleRef();
const ScSingleRefData& rRef2 = *pThisTok->GetSingleRef2();
if (rRef1 != *pOtherTok->GetSingleRef())
const ScSingleRefData& rRef1 = static_cast<ScDoubleRefToken*>(pThisTok)->GetSingleRef();
const ScSingleRefData& rRef2 = static_cast<ScDoubleRefToken*>(pThisTok)->GetSingleRef2();
if (rRef1 != static_cast<ScDoubleRefToken*>(pOtherTok)->GetSingleRef())
return NotEqual;
if (rRef2 != *pOtherTok->GetSingleRef2())
if (rRef2 != static_cast<ScDoubleRefToken*>(pOtherTok)->GetSingleRef2())
return NotEqual;
if (rRef1.IsRowRel())
@@ -4609,7 +4610,7 @@ struct ScDependantsCalculator
{
case svSingleRef:
{
ScSingleRefData aRef = *p->GetSingleRef(); // =Sheet1!A1
ScSingleRefData aRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef(); // =Sheet1!A1
if( aRef.IsDeleted())
return false;
ScAddress aRefPos = aRef.toAbs(mrDoc, mrPos);
@@ -5344,7 +5345,7 @@ bool ScFormulaCell::InterpretInvariantFormulaGroup()
{
case svSingleRef:
{
ScSingleRefData aRef = *p->GetSingleRef();
ScSingleRefData aRef = static_cast<const ScSingleRefToken*>(p)->GetSingleRef();
ScAddress aRefPos = aRef.toAbs(rDocument, aPos);
formula::FormulaTokenRef pNewToken = rDocument.ResolveStaticReference(aRefPos);
if (!pNewToken)
@@ -5410,8 +5411,8 @@ namespace {
void startListeningArea(
ScFormulaCell* pCell, ScDocument& rDoc, const ScAddress& rPos, const formula::FormulaToken& rToken)
{
const ScSingleRefData& rRef1 = *rToken.GetSingleRef();
const ScSingleRefData& rRef2 = *rToken.GetSingleRef2();
const ScSingleRefData& rRef1 = static_cast<const ScDoubleRefToken&>(rToken).GetSingleRef();
const ScSingleRefData& rRef2 = static_cast<const ScDoubleRefToken&>(rToken).GetSingleRef2();
ScAddress aCell1 = rRef1.toAbs(rDoc, rPos);
ScAddress aCell2 = rRef2.toAbs(rDoc, rPos);
if (!(aCell1.IsValid() && aCell2.IsValid()))
@@ -5459,7 +5460,7 @@ void ScFormulaCell::StartListeningTo( ScDocument& rDoc )
{
case svSingleRef:
{
ScAddress aCell = t->GetSingleRef()->toAbs(rDocument, aPos);
ScAddress aCell = static_cast<ScSingleRefToken*>(t)->GetSingleRef().toAbs(rDocument, aPos);
if (aCell.IsValid())
rDoc.StartListeningCell(aCell, this);
}
@@ -5502,7 +5503,7 @@ void ScFormulaCell::StartListeningTo( sc::StartListeningContext& rCxt )
{
case svSingleRef:
{
ScAddress aCell = t->GetSingleRef()->toAbs(rDocument, aPos);
ScAddress aCell = static_cast<ScSingleRefToken*>(t)->GetSingleRef().toAbs(rDocument, aPos);
if (aCell.IsValid())
rDoc.StartListeningCell(rCxt, aCell, *this);
}
@@ -5522,8 +5523,8 @@ namespace {
void endListeningArea(
ScFormulaCell* pCell, ScDocument& rDoc, const ScAddress& rPos, const formula::FormulaToken& rToken)
{
const ScSingleRefData& rRef1 = *rToken.GetSingleRef();
const ScSingleRefData& rRef2 = *rToken.GetSingleRef2();
const ScSingleRefData& rRef1 = static_cast<const ScDoubleRefToken&>(rToken).GetSingleRef();
const ScSingleRefData& rRef2 = static_cast<const ScDoubleRefToken&>(rToken).GetSingleRef2();
ScAddress aCell1 = rRef1.toAbs(rDoc, rPos);
ScAddress aCell2 = rRef2.toAbs(rDoc, rPos);
if (!(aCell1.IsValid() && aCell2.IsValid()))
@@ -5579,7 +5580,7 @@ void ScFormulaCell::EndListeningTo( ScDocument& rDoc, ScTokenArray* pArr,
{
case svSingleRef:
{
ScAddress aCell = t->GetSingleRef()->toAbs(rDocument, aCellPos);
ScAddress aCell = static_cast<ScSingleRefToken*>(t)->GetSingleRef().toAbs(rDocument, aCellPos);
if (aCell.IsValid())
rDoc.EndListeningCell(aCell, this);
}
@@ -5626,7 +5627,7 @@ void ScFormulaCell::EndListeningTo( sc::EndListeningContext& rCxt )
{
case svSingleRef:
{
ScAddress aCell = t->GetSingleRef()->toAbs(rDocument, aCellPos);
ScAddress aCell = static_cast<ScSingleRefToken*>(t)->GetSingleRef().toAbs(rDocument, aCellPos);
if (aCell.IsValid())
rDoc.EndListeningCell(rCxt, aCell, *this);
}
+4 -2
View File
@@ -23,6 +23,7 @@
#include <tokenarray.hxx>
#include <formula/token.hxx>
#include <token.hxx>
#include <reftokenhelper.hxx>
using namespace formula;
@@ -35,10 +36,11 @@ ScDetectiveRefIter::ScDetectiveRefIter( const ScDocument& rDoc, ScFormulaCell* p
static bool lcl_ScDetectiveRefIter_SkipRef( const ScDocument& rDoc, formula::FormulaToken* p, const ScAddress& rPos )
{
ScSingleRefData& rRef1 = *p->GetSingleRef();
ScAddress aAbs1 = rRef1.toAbs(rDoc, rPos);
ScSingleRefData* pRef1 = ScRefTokenHelper::getSingleRef(p);
ScAddress aAbs1 = pRef1->toAbs(rDoc, rPos);
if (!rDoc.ValidAddress(aAbs1))
return true;
if ( p->GetType() == svDoubleRef )
{
ScSingleRefData& rRef2 = static_cast<ScDoubleRefToken*>(p)->GetDoubleRef().Ref2;
+1 -1
View File
@@ -119,7 +119,7 @@ bool ScGroupTokenConverter::convert( const ScTokenArray& rCode, sc::FormulaLogge
{
case svSingleRef:
{
ScSingleRefData aRef = *p->GetSingleRef();
ScSingleRefData aRef = static_cast<const ScSingleRefToken*>(p)->GetSingleRef();
if( aRef.IsDeleted())
return false;
ScAddress aRefPos = aRef.toAbs(mrDoc, mrPos);
+1 -1
View File
@@ -1800,7 +1800,7 @@ void ScChangeActionContent::PutValueToDoc(
static void lcl_InvalidateReference( const ScDocument& rDoc, formula::FormulaToken& rTok, const ScBigAddress& rPos )
{
ScSingleRefData& rRef1 = *rTok.GetSingleRef();
ScSingleRefData& rRef1 = static_cast<ScSingleRefToken&>(rTok).GetSingleRef();
if ( rPos.Col() < 0 || rDoc.MaxCol() < rPos.Col() )
{
rRef1.SetColDeleted( true );
+23 -18
View File
@@ -77,6 +77,7 @@
#include <officecfg/Office/Common.hxx>
#include <sfx2/linkmgr.hxx>
#include <interpre.hxx>
#include <reftokenhelper.hxx>
using namespace formula;
using namespace ::com::sun::star;
@@ -5521,9 +5522,9 @@ void ScCompiler::AdjustSheetLocalNameRelReferences( SCTAB nDelta )
{
for ( auto t: pArr->References() )
{
ScSingleRefData& rRef1 = *t->GetSingleRef();
if (rRef1.IsTabRel())
rRef1.IncTab( nDelta);
ScSingleRefData* pRef1 = ScRefTokenHelper::getSingleRef(t);
if (pRef1->IsTabRel())
pRef1->IncTab( nDelta);
if ( t->GetType() == svDoubleRef )
{
ScSingleRefData& rRef2 = static_cast<ScDoubleRefToken*>(t)->GetDoubleRef().Ref2;
@@ -5539,7 +5540,7 @@ void ScCompiler::SetRelNameReference()
{
for ( auto t: pArr->References() )
{
ScSingleRefData& rRef1 = *t->GetSingleRef();
ScSingleRefData& rRef1 = *ScRefTokenHelper::getSingleRef(t);
if ( rRef1.IsColRel() || rRef1.IsRowRel() || rRef1.IsTabRel() )
rRef1.SetRelName( true );
if ( t->GetType() == svDoubleRef )
@@ -5557,8 +5558,10 @@ void ScCompiler::MoveRelWrap()
{
for ( auto t: pArr->References() )
{
if ( t->GetType() == svSingleRef || t->GetType() == svExternalSingleRef )
ScRefUpdate::MoveRelWrap( rDoc, aPos, rDoc.MaxCol(), rDoc.MaxRow(), SingleDoubleRefModifier( *t->GetSingleRef() ).Ref() );
if ( t->GetType() == svSingleRef )
ScRefUpdate::MoveRelWrap( rDoc, aPos, rDoc.MaxCol(), rDoc.MaxRow(), SingleDoubleRefModifier( static_cast<ScSingleRefToken*>(t)->GetSingleRef() ).Ref() );
else if ( t->GetType() == svExternalSingleRef )
ScRefUpdate::MoveRelWrap( rDoc, aPos, rDoc.MaxCol(), rDoc.MaxRow(), SingleDoubleRefModifier( static_cast<ScExternalSingleRefToken*>(t)->GetSingleRef() ).Ref() );
else if (t->GetType() == svDoubleRef)
ScRefUpdate::MoveRelWrap( rDoc, aPos, rDoc.MaxCol(), rDoc.MaxRow(), static_cast<ScDoubleRefToken*>(t)->GetDoubleRef() );
else
@@ -5573,8 +5576,10 @@ void ScCompiler::MoveRelWrap( const ScTokenArray& rArr, const ScDocument& rDoc,
{
for ( auto t: rArr.References() )
{
if ( t->GetType() == svSingleRef || t->GetType() == svExternalSingleRef )
ScRefUpdate::MoveRelWrap( rDoc, rPos, nMaxCol, nMaxRow, SingleDoubleRefModifier( *t->GetSingleRef() ).Ref() );
if ( t->GetType() == svSingleRef )
ScRefUpdate::MoveRelWrap( rDoc, rPos, nMaxCol, nMaxRow, SingleDoubleRefModifier( static_cast<ScSingleRefToken*>(t)->GetSingleRef() ).Ref() );
else if ( t->GetType() == svExternalSingleRef )
ScRefUpdate::MoveRelWrap( rDoc, rPos, nMaxCol, nMaxRow, SingleDoubleRefModifier( static_cast<ScExternalSingleRefToken*>(t)->GetSingleRef() ).Ref() );
else if ( t->GetType() == svDoubleRef )
ScRefUpdate::MoveRelWrap( rDoc, rPos, nMaxCol, nMaxRow, static_cast<ScDoubleRefToken*>(t)->GetDoubleRef() );
else
@@ -5689,7 +5694,7 @@ void ScCompiler::CreateStringFromExternal( OUStringBuffer& rBuffer, const Formul
case svExternalSingleRef:
pConv->makeExternalRefStr(rDoc.GetSheetLimits(),
rBuffer, GetPos(), nUsedFileId, *pFileName, static_cast<const ScExternalSingleRefToken*>(t)->GetTableName().getString(),
*t->GetSingleRef());
static_cast<const ScExternalSingleRefToken*>(t)->GetSingleRef());
break;
case svExternalDoubleRef:
{
@@ -5793,7 +5798,7 @@ bool ScCompiler::GetRefColRowNames(const FormulaToken* pToken, ScComplexRefData&
bool& bInList, FormulaError& nError,
bool bLookUpColRowNames) const
{
ScSingleRefData rSingleRef = *pToken->GetSingleRef();
ScSingleRefData rSingleRef = static_cast<const ScSingleRefToken*>(pToken)->GetSingleRef();
const ScAddress aAbs = rSingleRef.toAbs(rDoc, aPos);
if (!rDoc.ValidAddress(aAbs))
@@ -6021,7 +6026,7 @@ void ScCompiler::CreateStringFromSingleRef( OUStringBuffer& rBuffer, const Formu
const FormulaToken* p;
OUString aErrRef = GetCurrentOpCodeMap()->getSymbol(ocErrRef);
const OpCode eOp = _pTokenP->GetOpCode();
const ScSingleRefData& rRef = *_pTokenP->GetSingleRef();
const ScSingleRefData& rRef = static_cast<const ScSingleRefToken*>(_pTokenP)->GetSingleRef();
ScComplexRefData aRef;
aRef.Ref1 = aRef.Ref2 = rRef;
if ( eOp == ocColRowName )
@@ -6464,8 +6469,8 @@ bool ScCompiler::HandleTableRef()
if (eState == sOpen && p->GetType() == svSingleRef)
{
bColumnRange = true;
bCol1Rel = p->GetSingleRef()->IsColRel();
bCol1RelName = p->GetSingleRef()->IsRelName();
bCol1Rel = static_cast<const ScSingleRefToken*>(p)->GetSingleRef().IsColRel();
bCol1RelName = static_cast<const ScSingleRefToken*>(p)->GetSingleRef().IsRelName();
eState = sLast;
}
else
@@ -6503,7 +6508,7 @@ bool ScCompiler::HandleTableRef()
{
case svSingleRef:
{
aColRange.aStart = aColRange.aEnd = mpToken->GetSingleRef()->toAbs(rDoc, aPos);
aColRange.aStart = aColRange.aEnd = static_cast<ScSingleRefToken*>(mpToken.get())->GetSingleRef().toAbs(rDoc, aPos);
if ( GetTokenIfOpCode( ocTableRefClose) && (nLevel--) &&
GetTokenIfOpCode( ocRange) &&
GetTokenIfOpCode( ocTableRefOpen) && (++nLevel) &&
@@ -6513,10 +6518,10 @@ bool ScCompiler::HandleTableRef()
aColRange = ScRange( ScAddress::INITIALIZE_INVALID);
else
{
aColRange.aEnd = mpToken->GetSingleRef()->toAbs(rDoc, aPos);
aColRange.aEnd = static_cast<ScSingleRefToken*>(mpToken.get())->GetSingleRef().toAbs(rDoc, aPos);
aColRange.PutInOrder();
bCol2Rel = mpToken->GetSingleRef()->IsColRel();
bCol2RelName = mpToken->GetSingleRef()->IsRelName();
bCol2Rel = static_cast<ScSingleRefToken*>(mpToken.get())->GetSingleRef().IsColRel();
bCol2RelName = static_cast<ScSingleRefToken*>(mpToken.get())->GetSingleRef().IsRelName();
}
}
}
@@ -6687,7 +6692,7 @@ bool ScCompiler::HandleIIOpCodeInternal(FormulaToken* token, FormulaToken*** ppp
ScComplexRefData aSumRange;
if (eSumRangeType == svSingleRef)
{
aSumRange.Ref1 = *(*pppToken[2])->GetSingleRef();
aSumRange.Ref1 = static_cast<ScSingleRefToken*>(*pppToken[2])->GetSingleRef();
aSumRange.Ref2 = aSumRange.Ref1;
}
else
+2 -2
View File
@@ -1120,8 +1120,8 @@ OUString ScDBData::GetSimpleSubTotalFunction(const ScTokenArray* pTokens, SCCOL
}
else if (nIdx == 6) // { ocPush, formula::svSingleRef }
{
const ScSingleRefData* pRef = t->GetSingleRef();
if (!(pRef && pRef->Col() == nCol && pRef->Row() == nHeaderRow))
const ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(t)->GetSingleRef();
if (!(rRef.Col() == nCol && rRef.Row() == nHeaderRow))
{
return u"custom"_ustr;
}
+2 -2
View File
@@ -585,7 +585,7 @@ bool ScInterpreter::JumpMatrix( short nStackLevel )
/* TODO: What about error handling and do we actually
* need the result matrix above at all in this case? */
ScComplexRefData aRef;
aRef.Ref1 = aRef.Ref2 = *(xRef->GetSingleRef());
aRef.Ref1 = aRef.Ref2 = static_cast<const ScSingleRefToken*>(xRef.get())->GetSingleRef();
pJumpMatrix->GetRefList().push_back( aRef);
}
}
@@ -11522,7 +11522,7 @@ void ScInterpreter::ScAreas()
case svSingleRef:
{
FormulaConstTokenRef xT = PopToken();
ValidateRef( *xT->GetSingleRef());
ValidateRef( static_cast<const ScSingleRefToken*>(xT.get())->GetSingleRef());
++nCount;
}
break;
+17 -21
View File
@@ -2443,7 +2443,7 @@ void ScInterpreter::ScIntersect()
if (sv[i] == svSingleRef)
{
ScComplexRefData aRef;
aRef.Ref1 = aRef.Ref2 = *xt[i]->GetSingleRef();
aRef.Ref1 = aRef.Ref2 = static_cast<const ScSingleRefToken*>(xt[i])->GetSingleRef();
p.reset(new ScRefListToken);
p->GetRefList()->push_back( aRef);
xt[i] = p.get();
@@ -2511,27 +2511,23 @@ void ScInterpreter::ScIntersect()
switch (sv[i])
{
case svSingleRef:
{
const ScAddress r = static_cast<const ScSingleRefToken*>(pt[i])->GetSingleRef().toAbs(mrDoc, aPos);
nC1[i] = nC2[i] = r.Col();
nR1[i] = nR2[i] = r.Row();
nT1[i] = nT2[i] = r.Tab();
}
break;
case svDoubleRef:
{
{
const ScAddress r = pt[i]->GetSingleRef()->toAbs(mrDoc, aPos);
nC1[i] = r.Col();
nR1[i] = r.Row();
nT1[i] = r.Tab();
}
if (sv[i] == svDoubleRef)
{
const ScAddress r = pt[i]->GetSingleRef2()->toAbs(mrDoc, aPos);
nC2[i] = r.Col();
nR2[i] = r.Row();
nT2[i] = r.Tab();
}
else
{
nC2[i] = nC1[i];
nR2[i] = nR1[i];
nT2[i] = nT1[i];
}
const ScAddress r = static_cast<const ScDoubleRefToken*>(pt[i])->GetSingleRef().toAbs(mrDoc, aPos);
nC1[i] = r.Col();
nR1[i] = r.Row();
nT1[i] = r.Tab();
const ScAddress r2 = static_cast<const ScDoubleRefToken*>(pt[i])->GetSingleRef2().toAbs(mrDoc, aPos);
nC2[i] = r2.Col();
nR2[i] = r2.Row();
nT2[i] = r2.Tab();
}
break;
default:
@@ -2622,7 +2618,7 @@ void ScInterpreter::ScUnionFunc()
case svSingleRef:
{
ScComplexRefData aRef;
aRef.Ref1 = aRef.Ref2 = *pt[i]->GetSingleRef();
aRef.Ref1 = aRef.Ref2 = static_cast<const ScSingleRefToken*>(pt[i])->GetSingleRef();
pRes->push_back( aRef);
}
break;
+4 -4
View File
@@ -935,8 +935,8 @@ void ScInterpreter::PopSingleRef( ScAddress& rAdr )
break;
case svSingleRef:
{
const ScSingleRefData* pRefData = p->GetSingleRef();
if (pRefData->IsDeleted())
const ScSingleRefData& rRefData = static_cast<const ScSingleRefToken*>(p)->GetSingleRef();
if (rRefData.IsDeleted())
{
SetError( FormulaError::NoRef);
break;
@@ -945,7 +945,7 @@ void ScInterpreter::PopSingleRef( ScAddress& rAdr )
SCCOL nCol;
SCROW nRow;
SCTAB nTab;
SingleRefToVars( *pRefData, nCol, nRow, nTab);
SingleRefToVars( rRefData, nCol, nRow, nTab);
rAdr.Set( nCol, nRow, nTab );
if (!mrDoc.m_TableOpList.empty())
ReplaceCell( rAdr );
@@ -1183,7 +1183,7 @@ void ScInterpreter::PopExternalSingleRef(sal_uInt16& rFileId, OUString& rTabName
rFileId = static_cast<const ScExternalSingleRefToken*>(p)->GetFileId();
rTabName = static_cast<const ScExternalSingleRefToken*>(p)->GetTableName().getString();
rRef = *p->GetSingleRef();
rRef = static_cast<const ScExternalSingleRefToken*>(p)->GetSingleRef();
}
void ScInterpreter::PopExternalSingleRef(ScExternalRefCache::TokenRef& rToken, ScExternalRefCache::CellFormat* pFmt)
+12 -11
View File
@@ -33,6 +33,7 @@
#include <refupdat.hxx>
#include <document.hxx>
#include <refupdatecontext.hxx>
#include <reftokenhelper.hxx>
#include <tokenstringcontext.hxx>
#include <formula/errorcodes.hxx>
@@ -217,13 +218,13 @@ void ScRangeData::GuessPosition()
formula::FormulaTokenArrayPlainIterator aIter(*pCode);
while ( ( t = aIter.GetNextReference() ) != nullptr )
{
ScSingleRefData& rRef1 = *t->GetSingleRef();
if ( rRef1.IsColRel() && rRef1.Col() < nMinCol )
nMinCol = rRef1.Col();
if ( rRef1.IsRowRel() && rRef1.Row() < nMinRow )
nMinRow = rRef1.Row();
if ( rRef1.IsTabRel() && rRef1.Tab() < nMinTab )
nMinTab = rRef1.Tab();
ScSingleRefData* pRef1 = ScRefTokenHelper::getSingleRef(t);
if ( pRef1->IsColRel() && pRef1->Col() < nMinCol )
nMinCol = pRef1->Col();
if ( pRef1->IsRowRel() && pRef1->Row() < nMinRow )
nMinRow = pRef1->Row();
if ( pRef1->IsTabRel() && pRef1->Tab() < nMinTab )
nMinTab = pRef1->Tab();
if ( t->GetType() == svDoubleRef )
{
@@ -548,9 +549,9 @@ void ScRangeData::ValidateTabRefs()
formula::FormulaTokenArrayPlainIterator aIter(*pCode);
while ( ( t = aIter.GetNextReference() ) != nullptr )
{
ScSingleRefData& rRef1 = *t->GetSingleRef();
ScAddress aAbs = rRef1.toAbs(rDoc, aPos);
if ( rRef1.IsTabRel() && !rRef1.IsTabDeleted() )
ScSingleRefData* pRef1 = ScRefTokenHelper::getSingleRef(t);
ScAddress aAbs = pRef1->toAbs(rDoc, aPos);
if ( pRef1->IsTabRel() && !pRef1->IsTabDeleted() )
{
if (aAbs.Tab() < nMinTab)
nMinTab = aAbs.Tab();
@@ -589,7 +590,7 @@ void ScRangeData::ValidateTabRefs()
{
case svSingleRef:
{
ScSingleRefData& rRef = *t->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(t)->GetSingleRef();
if (!rRef.IsTabDeleted())
{
ScAddress aAbs = rRef.toAbs(rDoc, aOldPos);
+42 -8
View File
@@ -74,7 +74,7 @@ void ScRefTokenHelper::compileRangeRepresentation(
{
case svSingleRef:
{
const ScSingleRefData& rRef = *p->GetSingleRef();
const ScSingleRefData& rRef = static_cast<const ScSingleRefToken*>(p)->GetSingleRef();
if (!rRef.Valid(rDoc))
bFailure = true;
else if (bOnly3DRef && !rRef.IsFlag3D())
@@ -92,7 +92,7 @@ void ScRefTokenHelper::compileRangeRepresentation(
break;
case svExternalSingleRef:
{
if (!p->GetSingleRef()->ValidExternal(rDoc))
if (!static_cast<const ScExternalSingleRefToken*>(p)->GetSingleRef().ValidExternal(rDoc))
bFailure = true;
}
break;
@@ -133,17 +133,24 @@ bool ScRefTokenHelper::getRangeFromToken(
const ScDocument* pDoc,
ScRange& rRange, const ScTokenRef& pToken, const ScAddress& rPos, bool bExternal)
{
StackVar eType = pToken->GetType();
switch (pToken->GetType())
{
case svSingleRef:
case svExternalSingleRef:
{
if ((eType == svExternalSingleRef && !bExternal) ||
(eType == svSingleRef && bExternal))
if (bExternal)
return false;
const ScSingleRefData& rRefData = *pToken->GetSingleRef();
const ScSingleRefData& rRefData = static_cast<ScSingleRefToken*>(pToken.get())->GetSingleRef();
rRange.aStart = rRefData.toAbs(*pDoc, rPos);
rRange.aEnd = rRange.aStart;
return true;
}
case svExternalSingleRef:
{
if (!bExternal)
return false;
const ScSingleRefData& rRefData = static_cast<ScExternalSingleRefToken*>(pToken.get())->GetSingleRef();
rRange.aStart = rRefData.toAbs(*pDoc, rPos);
rRange.aEnd = rRange.aStart;
return true;
@@ -472,9 +479,17 @@ bool ScRefTokenHelper::getDoubleRefDataFromToken(ScComplexRefData& rData, const
switch (pToken->GetType())
{
case svSingleRef:
{
const ScSingleRefData& r = static_cast<ScSingleRefToken*>(pToken.get())->GetSingleRef();
rData.Ref1 = r;
rData.Ref1.SetFlag3D(true);
rData.Ref2 = r;
rData.Ref2.SetFlag3D(false); // Don't display sheet name on second reference.
}
break;
case svExternalSingleRef:
{
const ScSingleRefData& r = *pToken->GetSingleRef();
const ScSingleRefData& r = static_cast<ScExternalSingleRefToken*>(pToken.get())->GetSingleRef();
rData.Ref1 = r;
rData.Ref1.SetFlag3D(true);
rData.Ref2 = r;
@@ -510,4 +525,23 @@ ScTokenRef ScRefTokenHelper::createRefToken(const ScDocument& rDoc, const ScRang
return pRef;
}
ScSingleRefData* ScRefTokenHelper::getSingleRef(formula::FormulaToken* t)
{
if ( t->GetType() == svSingleRef )
return &static_cast<ScSingleRefToken*>(t)->GetSingleRef();
else if ( t->GetType() == svExternalSingleRef )
return &static_cast<ScExternalSingleRefToken*>(t)->GetSingleRef();
else if ( t->GetType() == svDoubleRef )
return &static_cast<ScDoubleRefToken*>(t)->GetSingleRef();
else if ( t->GetType() == svExternalDoubleRef )
return &static_cast<ScExternalDoubleRefToken*>(t)->GetSingleRef();
else
return nullptr;
}
const ScSingleRefData* ScRefTokenHelper::getSingleRef(const formula::FormulaToken* t)
{
return getSingleRef(const_cast<formula::FormulaToken*>(t));
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+6 -5
View File
@@ -14,6 +14,7 @@
#include <document.hxx>
#include <grouparealistener.hxx>
#include <refdata.hxx>
#include <token.hxx>
namespace sc {
@@ -378,8 +379,8 @@ void SharedFormulaUtil::startListeningAsGroup( sc::StartListeningContext& rCxt,
{
case formula::svSingleRef:
{
const ScSingleRefData* pRef = t->GetSingleRef();
ScAddress aPos = pRef->toAbs(rDoc, rTopCell.aPos);
const ScSingleRefData& rRef = static_cast<const ScSingleRefToken*>(t)->GetSingleRef();
ScAddress aPos = rRef.toAbs(rDoc, rTopCell.aPos);
ScFormulaCell** pp = ppSharedTop;
ScFormulaCell** ppEnd = ppSharedTop + xGroup->mnLength;
for (; pp != ppEnd; ++pp)
@@ -388,15 +389,15 @@ void SharedFormulaUtil::startListeningAsGroup( sc::StartListeningContext& rCxt,
break;
rDoc.StartListeningCell(rCxt, aPos, **pp);
if (pRef->IsRowRel())
if (rRef.IsRowRel())
aPos.IncRow();
}
}
break;
case formula::svDoubleRef:
{
const ScSingleRefData& rRef1 = *t->GetSingleRef();
const ScSingleRefData& rRef2 = *t->GetSingleRef2();
const ScSingleRefData& rRef1 = static_cast<const ScDoubleRefToken*>(t)->GetSingleRef();
const ScSingleRefData& rRef2 = static_cast<const ScDoubleRefToken*>(t)->GetSingleRef2();
ScAddress aPos1 = rRef1.toAbs(rDoc, rTopCell.aPos);
ScAddress aPos2 = rRef2.toAbs(rDoc, rTopCell.aPos);
+64 -82
View File
@@ -158,7 +158,7 @@ namespace
switch ((*pp)->GetType())
{
case svSingleRef:
return (*pp)->GetSingleRef()->IsRelName();
return static_cast<const ScSingleRefToken*>(*pp)->GetSingleRef().IsRelName();
case svDoubleRef:
{
const ScComplexRefData& rRef = static_cast<const ScDoubleRefToken*>(*pp)->GetDoubleRef();
@@ -456,7 +456,7 @@ bool checkTextEqual( const ScSheetLimits& rLimits, const FormulaToken& _rToken1,
ScComplexRefData aTemp1;
if ( _rToken1.GetType() == svSingleRef )
{
aTemp1.Ref1 = *_rToken1.GetSingleRef();
aTemp1.Ref1 = static_cast<const ScSingleRefToken&>(_rToken1).GetSingleRef();
aTemp1.Ref2 = aTemp1.Ref1;
}
else
@@ -465,7 +465,7 @@ bool checkTextEqual( const ScSheetLimits& rLimits, const FormulaToken& _rToken1,
ScComplexRefData aTemp2;
if ( _rToken2.GetType() == svSingleRef )
{
aTemp2.Ref1 = *_rToken2.GetSingleRef();
aTemp2.Ref1 = static_cast<const ScSingleRefToken&>(_rToken2).GetSingleRef();
aTemp2.Ref2 = aTemp2.Ref1;
}
else
@@ -555,12 +555,12 @@ FormulaTokenRef extendRangeReference( ScSheetLimits& rLimits, FormulaToken & rTo
* merged here. For Xcl syntax already parse an external range
* reference entirely, cumbersome. */
const ScSingleRefData& rRef2 = *rTok2.GetSingleRef();
const ScSingleRefData& rRef2 = static_cast<ScSingleRefToken&>(rTok2).GetSingleRef();
if (bExternal && rRef2.IsFlag3D())
return nullptr;
ScComplexRefData aRef;
aRef.Ref1 = aRef.Ref2 = *rTok1.GetSingleRef();
aRef.Ref1 = aRef.Ref2 = static_cast<ScSingleRefToken&>(rTok1).GetSingleRef();
aRef.Ref2.SetFlag3D( false);
aRef.Extend(rLimits, rRef2, rPos);
if (bExternal)
@@ -604,7 +604,7 @@ FormulaTokenRef extendRangeReference( ScSheetLimits& rLimits, FormulaToken & rTo
switch (sv[i])
{
case svSingleRef:
rRef.Extend(rLimits, *pt[i]->GetSingleRef(), rPos);
rRef.Extend(rLimits, static_cast<ScSingleRefToken*>(pt[i])->GetSingleRef(), rPos);
break;
case svDoubleRef:
rRef.Extend(rLimits, static_cast<ScDoubleRefToken*>(pt[i])->GetDoubleRef(), rPos);
@@ -624,7 +624,7 @@ FormulaTokenRef extendRangeReference( ScSheetLimits& rLimits, FormulaToken & rTo
if (rRef.Ref1.IsFlag3D() || rRef.Ref2.IsFlag3D())
return nullptr; // no other sheets with external refs
else
rRef.Extend(rLimits, *pt[i]->GetSingleRef(), rPos);
rRef.Extend(rLimits, static_cast<ScExternalSingleRefToken*>(pt[i])->GetSingleRef(), rPos);
break;
case svExternalDoubleRef:
if (rRef.Ref1.IsFlag3D() || rRef.Ref2.IsFlag3D())
@@ -642,21 +642,16 @@ FormulaTokenRef extendRangeReference( ScSheetLimits& rLimits, FormulaToken & rTo
// real implementations of virtual functions
const ScSingleRefData* ScSingleRefToken::GetSingleRef() const { return &aSingleRef; }
ScSingleRefData* ScSingleRefToken::GetSingleRef() { return &aSingleRef; }
bool ScSingleRefToken::TextEqual( const FormulaToken& _rToken ) const
{
return FormulaToken::operator ==(_rToken) && checkTextEqual(mrSheetLimits, *this, _rToken);
}
bool ScSingleRefToken::operator==( const FormulaToken& r ) const
{
return FormulaToken::operator==( r ) && aSingleRef == *r.GetSingleRef();
return FormulaToken::operator==( r )
&& aSingleRef == static_cast<const ScSingleRefToken&>(r).GetSingleRef();
}
const ScSingleRefData* ScDoubleRefToken::GetSingleRef() const { return &aDoubleRef.Ref1; }
ScSingleRefData* ScDoubleRefToken::GetSingleRef() { return &aDoubleRef.Ref1; }
const ScSingleRefData* ScDoubleRefToken::GetSingleRef2() const { return &aDoubleRef.Ref2; }
ScSingleRefData* ScDoubleRefToken::GetSingleRef2() { return &aDoubleRef.Ref2; }
bool ScDoubleRefToken::TextEqual( const FormulaToken& _rToken ) const
{
return FormulaToken::operator ==(_rToken) && checkTextEqual(mrSheetLimits, *this, _rToken);
@@ -735,16 +730,6 @@ ScExternalSingleRefToken::~ScExternalSingleRefToken()
{
}
const ScSingleRefData* ScExternalSingleRefToken::GetSingleRef() const
{
return &maSingleRef;
}
ScSingleRefData* ScExternalSingleRefToken::GetSingleRef()
{
return &maSingleRef;
}
bool ScExternalSingleRefToken::operator ==( const FormulaToken& r ) const
{
if (!ScExternalToken::operator==(r))
@@ -753,7 +738,7 @@ bool ScExternalSingleRefToken::operator ==( const FormulaToken& r ) const
if (maTabName != static_cast<const ScExternalSingleRefToken&>(r).GetTableName())
return false;
return maSingleRef == *r.GetSingleRef();
return maSingleRef == static_cast<const ScExternalSingleRefToken&>(r).GetSingleRef();
}
ScExternalDoubleRefToken::ScExternalDoubleRefToken( sal_uInt16 nFileId, svl::SharedString aTabName, const ScComplexRefData& r ) :
@@ -767,26 +752,6 @@ ScExternalDoubleRefToken::~ScExternalDoubleRefToken()
{
}
const ScSingleRefData* ScExternalDoubleRefToken::GetSingleRef() const
{
return &maDoubleRef.Ref1;
}
ScSingleRefData* ScExternalDoubleRefToken::GetSingleRef()
{
return &maDoubleRef.Ref1;
}
const ScSingleRefData* ScExternalDoubleRefToken::GetSingleRef2() const
{
return &maDoubleRef.Ref2;
}
ScSingleRefData* ScExternalDoubleRefToken::GetSingleRef2()
{
return &maDoubleRef.Ref2;
}
bool ScExternalDoubleRefToken::operator ==( const FormulaToken& r ) const
{
if (!ScExternalToken::operator==(r))
@@ -1672,7 +1637,7 @@ bool ScTokenArray::ImplGetReference( ScRange& rRange, const ScAddress& rPos, boo
{
if ( pToken->GetType() == svSingleRef )
{
const ScSingleRefData& rRef = *static_cast<const ScSingleRefToken*>(pToken)->GetSingleRef();
const ScSingleRefData& rRef = static_cast<const ScSingleRefToken*>(pToken)->GetSingleRef();
rRange.aStart = rRange.aEnd = rRef.toAbs(*mxSheetLimits, rPos);
bIs = !bValidOnly || mxSheetLimits->ValidAddress(rRange.aStart);
}
@@ -1749,7 +1714,7 @@ void ScTokenArray::GenHash()
break;
case svSingleRef:
{
size_t nVal = HashSingleRef(*p->GetSingleRef());
size_t nVal = HashSingleRef(static_cast<const ScSingleRefToken*>(p)->GetSingleRef());
nHash += nVal;
}
break;
@@ -1809,9 +1774,15 @@ bool ScTokenArray::IsInvariant() const
switch ((*p)->GetType())
{
case svSingleRef:
{
const ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(*p)->GetSingleRef();
if (rRef.IsRowRel())
return false;
}
break;
case svExternalSingleRef:
{
const ScSingleRefData& rRef = *(*p)->GetSingleRef();
const ScSingleRefData& rRef = static_cast<ScExternalSingleRefToken*>(*p)->GetSingleRef();
if (rRef.IsRowRel())
return false;
}
@@ -2377,7 +2348,7 @@ bool ScTokenArray::GetAdjacentExtendOfOuterFuncRefs( SCCOLROW& nExtend,
{
case svSingleRef :
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rPos);
switch ( eDir )
{
@@ -2492,14 +2463,17 @@ bool SkipReference(formula::FormulaToken* pToken, const ScAddress& rPos, const S
{
case svDoubleRef:
{
ScSingleRefData& rRef = *pToken->GetSingleRef2();
ScSingleRefData& rRef = static_cast<ScDoubleRefToken*>(pToken)->GetSingleRef2();
if (rRef.IsColRel() || rRef.IsRowRel())
return true;
ScSingleRefData& rRef1 = static_cast<ScDoubleRefToken*>(pToken)->GetSingleRef();
if (rRef1.IsColRel() || rRef1.IsRowRel())
return true;
}
[[fallthrough]];
break;
case svSingleRef:
{
ScSingleRefData& rRef = *pToken->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(pToken)->GetSingleRef();
if (rRef.IsColRel() || rRef.IsRowRel())
return true;
}
@@ -2564,7 +2538,7 @@ void ScTokenArray::ReadjustAbsolute3DReferences( const ScDocument& rOldDoc, ScDo
if (SkipReference(pCode[j], rPos, rOldDoc, bRangeName, true))
continue;
ScSingleRefData& rRef = *pCode[j]->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(pCode[j])->GetSingleRef();
if ( rRef.IsFlag3D() && !rRef.IsTabRel() )
{
@@ -2619,7 +2593,7 @@ void ScTokenArray::AdjustAbsoluteRefs( const ScDocument& rOldDoc, const ScAddres
if (!SkipReference(p, rOldPos, rOldDoc, false, bCheckCopyRange))
continue;
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
AdjustSingleRefData( rRef, rOldPos, rNewPos );
}
@@ -2674,7 +2648,7 @@ void ScTokenArray::AdjustRelativeTabRefs(SCTAB nOldTab, SCTAB nNewTab, sc::Targe
}
case svSingleRef:
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
adjustRelativeTabRef(rRef, nOldTab, nNewTab, bInsertedTab);
break;
}
@@ -2720,7 +2694,7 @@ void ScTokenArray::AdjustSheetLocalNameReferences( SCTAB nOldTab, SCTAB nNewTab
break;
case svSingleRef :
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
if (!rRef.IsTabRel() && rRef.Tab() == nOldTab)
rRef.SetAbsTab( nNewTab);
@@ -2762,7 +2736,7 @@ bool ScTokenArray::ReferencesSheet( SCTAB nTab, SCTAB nPosTab ) const
break;
case svSingleRef :
{
const ScSingleRefData& rRef = *p->GetSingleRef();
const ScSingleRefData& rRef = static_cast<const ScSingleRefToken*>(p)->GetSingleRef();
if (rRef.IsTabRel())
{
if (rRef.Tab() + nPosTab == nTab)
@@ -3227,7 +3201,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnShift( const sc::RefUpdateCon
{
case svSingleRef:
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rOldPos);
if (rCxt.isDeleted() && aSelectedRange.Contains(aAbs))
@@ -3387,7 +3361,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnShift( const sc::RefUpdateCon
{
// For external reference, just reset the reference with
// respect to the new cell position.
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScExternalSingleRefToken*>(p)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rOldPos);
rRef.SetAddress(*mxSheetLimits, aAbs, aNewPos);
}
@@ -3472,7 +3446,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMove(
{
case svSingleRef:
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rOldPos);
// Do not update the reference in transposed case (cut paste transposed).
@@ -3558,7 +3532,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMove(
break;
case svExternalSingleRef:
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScExternalSingleRefToken*>(p)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rOldPos);
rRef.SetAddress(*mxSheetLimits, aAbs, rNewPos);
}
@@ -3621,7 +3595,7 @@ void ScTokenArray::MoveReferenceColReorder(
{
case svSingleRef:
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rPos);
if (aAbs.Tab() == nTab && nRow1 <= aAbs.Row() && aAbs.Row() <= nRow2)
@@ -3690,7 +3664,7 @@ void ScTokenArray::MoveReferenceRowReorder( const ScAddress& rPos, SCTAB nTab, S
{
case svSingleRef:
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rPos);
if (aAbs.Tab() == nTab && nCol1 <= aAbs.Col() && aAbs.Col() <= nCol2)
@@ -3917,7 +3891,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceInName(
{
case svSingleRef:
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
if (rCxt.mnRowDelta < 0)
{
// row(s) deleted.
@@ -4192,7 +4166,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceInMovedName( const sc::RefUpdat
{
case svSingleRef:
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
if (rRef.IsColRel() || rRef.IsRowRel() || rRef.IsTabRel())
continue;
@@ -4355,7 +4329,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnDeletedTab( const sc::RefUpda
{
case svSingleRef:
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
bool bOldError = rRef.IsTabDeleted();
if (adjustSingleRefOnDeletedTab(*mxSheetLimits, rRef, rCxt.mnDeletePos, rCxt.mnSheets, rOldPos, aNewPos))
@@ -4438,7 +4412,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnInsertedTab( const sc::RefUpd
{
case svSingleRef:
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
if (adjustSingleRefOnInsertedTab(*mxSheetLimits, rRef, rCxt.mnInsertPos, rCxt.mnSheets, rOldPos, aNewPos))
aRes.mbReferenceModified = true;
}
@@ -4532,7 +4506,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMovedTab( const sc::RefUpdate
{
case svSingleRef:
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rOldPos);
if (adjustTabOnMove(aAbs, rCxt))
aRes.mbReferenceModified = true;
@@ -4605,9 +4579,15 @@ void ScTokenArray::AdjustReferenceOnMovedOrigin( const ScAddress& rOldPos, const
switch (p->GetType())
{
case svSingleRef:
{
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rOldPos);
rRef.SetAddress(*mxSheetLimits, aAbs, rNewPos);
}
break;
case svExternalSingleRef:
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScExternalSingleRefToken*>(p)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rOldPos);
rRef.SetAddress(*mxSheetLimits, aAbs, rNewPos);
}
@@ -4646,18 +4626,20 @@ void ScTokenArray::AdjustReferenceOnMovedOriginIfOtherSheet( const ScAddress& rO
if (!p)
continue;
bool bAdjust = false;
switch (p->GetType())
{
case svExternalSingleRef:
bAdjust = true; // always
[[fallthrough]];
{
ScSingleRefData& rRef = static_cast<ScExternalSingleRefToken*>(p)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rOldPos);
rRef.SetAddress(*mxSheetLimits, aAbs, rNewPos);
}
break;
case svSingleRef:
{
ScSingleRefData& rRef = *p->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rOldPos);
if (!bAdjust)
bAdjust = (aAbs.Tab() != rOldPos.Tab());
bool bAdjust = (aAbs.Tab() != rOldPos.Tab());
if (bAdjust)
rRef.SetAddress(*mxSheetLimits, aAbs, rNewPos);
}
@@ -4673,7 +4655,7 @@ void ScTokenArray::AdjustReferenceOnMovedOriginIfOtherSheet( const ScAddress& rO
{
ScComplexRefData& rRef = static_cast<ScDoubleRefToken*>(p)->GetDoubleRef();
ScRange aAbs = rRef.toAbs(*mxSheetLimits, rOldPos);
bAdjust = (rOldPos.Tab() < aAbs.aStart.Tab() || aAbs.aEnd.Tab() < rOldPos.Tab());
bool bAdjust = (rOldPos.Tab() < aAbs.aStart.Tab() || aAbs.aEnd.Tab() < rOldPos.Tab());
if (bAdjust)
rRef.SetRange(*mxSheetLimits, aAbs, rNewPos);
}
@@ -4741,7 +4723,7 @@ void ScTokenArray::ClearTabDeleted( const ScAddress& rPos, SCTAB nStartTab, SCTA
case svSingleRef:
{
formula::FormulaToken* pToken = *p;
ScSingleRefData& rRef = *pToken->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(pToken)->GetSingleRef();
clearTabDeletedFlag(*mxSheetLimits, rRef, rPos, nStartTab, nEndTab);
}
break;
@@ -4885,7 +4867,7 @@ void ScTokenArray::CheckRelativeReferenceBounds(
{
case svSingleRef:
{
checkBounds(rCxt, rPos, nGroupLen, *p->GetSingleRef(), rBounds);
checkBounds(rCxt, rPos, nGroupLen, static_cast<ScSingleRefToken*>(p)->GetSingleRef(), rBounds);
}
break;
case svDoubleRef:
@@ -4920,7 +4902,7 @@ void ScTokenArray::CheckRelativeReferenceBounds(
{
case svSingleRef:
{
const ScSingleRefData& rRef = *p->GetSingleRef();
const ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(p)->GetSingleRef();
checkBounds(*mxSheetLimits, rPos, nGroupLen, rRange, rRef, rBounds, nullptr);
}
break;
@@ -5088,7 +5070,7 @@ void appendTokenByType( ScSheetLimits& rLimits, sc::TokenStringContext& rCxt, OU
{
OUString aTabName = static_cast<const ScExternalSingleRefToken&>(rToken).GetTableName().getString();
rCxt.mpRefConv->makeExternalRefStr(
rLimits, rBuf, rPos, nFileId, aFileName, aTabName, *rToken.GetSingleRef());
rLimits, rBuf, rPos, nFileId, aFileName, aTabName, static_cast<const ScExternalSingleRefToken&>(rToken).GetSingleRef());
}
break;
case svExternalDoubleRef:
@@ -5135,7 +5117,7 @@ void appendTokenByType( ScSheetLimits& rLimits, sc::TokenStringContext& rCxt, OU
{
if (rCxt.mpRefConv)
{
const ScSingleRefData& rRef = *rToken.GetSingleRef();
const ScSingleRefData& rRef = static_cast<const ScSingleRefToken&>(rToken).GetSingleRef();
ScComplexRefData aRef;
aRef.Ref1 = rRef;
aRef.Ref2 = rRef;
@@ -5447,7 +5429,7 @@ void ScTokenArray::WrapReference( const ScAddress& rPos, SCCOL nMaxCol, SCROW nM
case svSingleRef:
{
formula::FormulaToken* pToken = *p;
ScSingleRefData& rRef = *pToken->GetSingleRef();
ScSingleRefData& rRef = static_cast<ScSingleRefToken*>(pToken)->GetSingleRef();
ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rPos);
wrapAddress(aAbs, nMaxCol, nMaxRow);
rRef.SetAddress(*mxSheetLimits, aAbs, rPos);
+3 -3
View File
@@ -1976,7 +1976,7 @@ void XclExpFmlaCompImpl::ProcessCellRef( const XclExpScToken& rTokData )
{
// get the Excel address components, adjust internal data in aRefData
bool bNatLangRef = (meBiff == EXC_BIFF8) && mxData->mpScBasePos && (rTokData.GetOpCode() == ocColRowName);
ScSingleRefData aRefData = *rTokData.mpScToken->GetSingleRef();
ScSingleRefData aRefData = static_cast<const ScSingleRefToken*>(rTokData.mpScToken)->GetSingleRef();
XclAddress aXclPos( ScAddress::UNINITIALIZED );
ConvertRefData( aRefData, aXclPos, bNatLangRef, false, false );
@@ -2081,7 +2081,7 @@ void XclExpFmlaCompImpl::ProcessExternalCellRef( const XclExpScToken& rTokData )
{
auto pESRToken = static_cast<const ScExternalSingleRefToken*>(rTokData.mpScToken);
// get the Excel address components, adjust internal data in aRefData
ScSingleRefData aRefData = *pESRToken->GetSingleRef();
ScSingleRefData aRefData = pESRToken->GetSingleRef();
XclAddress aXclPos( ScAddress::UNINITIALIZED );
ConvertRefData( aRefData, aXclPos, false, false, false );
@@ -2205,7 +2205,7 @@ void XclExpFmlaCompImpl::ProcessExternalName( const XclExpScToken& rTokData )
{
case svExternalSingleRef:
{
ScSingleRefData aRefData = *pScToken->GetSingleRef();
ScSingleRefData aRefData = static_cast<ScExternalSingleRefToken*>(pScToken)->GetSingleRef();
mxData->mpLinkMgr->StoreCell(
nFileId, static_cast<ScExternalSingleRefToken*>(pScToken)->GetTableName().getString(), aRefData.toAbs(GetRoot().GetDoc(), *mxData->mpScBasePos));
}
+1 -1
View File
@@ -971,7 +971,7 @@ void XclExpExtName::WriteAddData( XclExpStream& rStrm )
{
case svExternalSingleRef:
{
const ScSingleRefData& rRef = *p->GetSingleRef();
const ScSingleRefData& rRef = static_cast<const ScExternalSingleRefToken*>(p)->GetSingleRef();
if (rRef.IsTabRel())
break;
+4 -3
View File
@@ -31,6 +31,7 @@
#include <xeformula.hxx>
#include <xestring.hxx>
#include <xltools.hxx>
#include <reftokenhelper.hxx>
#include <formula/grammar.hxx>
#include <oox/export/utils.hxx>
@@ -396,7 +397,7 @@ void XclExpName::SaveXml( XclExpXmlStream& rStrm )
auto pESRToken = static_cast<ScExternalSingleRefToken*>(t);
pNewToken = new ScExternalSingleRefToken(
nFileId, svl::SharedString(it->second),
*pESRToken->GetSingleRef());
pESRToken->GetSingleRef());
}
else if (eType == formula::svExternalDoubleRef)
{
@@ -467,13 +468,13 @@ static bool lcl_EnsureAbs3DToken( const SCTAB nTab, formula::FormulaToken* pTok,
if ( !pTok || ( pTok->GetType() != formula::svSingleRef && pTok->GetType() != formula::svDoubleRef ) )
return bFixRequired;
ScSingleRefData* pRef1 = pTok->GetSingleRef();
ScSingleRefData* pRef1 = ScRefTokenHelper::getSingleRef(pTok);
if ( !pRef1 )
return bFixRequired;
ScSingleRefData* pRef2 = nullptr;
if ( pTok->GetType() == formula::svDoubleRef )
pRef2 = pTok->GetSingleRef2();
pRef2 = &static_cast<ScDoubleRefToken*>(pTok)->GetSingleRef2();
if ( pRef1->IsTabRel() || !pRef1->IsFlag3D() )
{
+2 -2
View File
@@ -168,7 +168,7 @@ XclExpArrayRef XclExpArrayBuffer::FindArray( const ScTokenArray& rScTokArr, cons
// not a matrix reference token.
return xRec;
const ScSingleRefData& rRef = *pToken->GetSingleRef();
const ScSingleRefData& rRef = static_cast<const ScSingleRefToken*>(pToken)->GetSingleRef();
ScAddress aAbsPos = rRef.toAbs(GetRoot().GetDoc(), rBasePos);
XclExpArrayMap::const_iterator it = maRecMap.find(aAbsPos);
@@ -226,7 +226,7 @@ bool XclExpShrfmlaBuffer::IsValidTokenArray( const ScTokenArray& rArray ) const
{
case svSingleRef:
{
const ScSingleRefData& rRefData = *p->GetSingleRef();
const ScSingleRefData& rRefData = static_cast<const ScSingleRefToken*>(p)->GetSingleRef();
if (!GetFormulaCompiler().IsRef2D(rRefData))
// Excel's shared formula cannot include 3D reference.
return false;
+2 -1
View File
@@ -24,6 +24,7 @@
#include <xestream.hxx>
#include <xistream.hxx>
#include <xlroot.hxx>
#include <token.hxx>
#include <comphelper/string.hxx>
#include <o3tl/untaint.hxx>
@@ -996,7 +997,7 @@ bool lclGetAddress( const ScDocument& rDoc, ScAddress& rAddress, const FormulaTo
bool bIsSingleRef = (eOpCode == ocPush) && (rToken.GetType() == svSingleRef);
if( bIsSingleRef )
{
const ScSingleRefData& rRef = *rToken.GetSingleRef();
const ScSingleRefData& rRef = static_cast<const ScSingleRefToken&>(rToken).GetSingleRef();
rAddress = rRef.toAbs(rDoc, rPos);
bIsSingleRef = !rRef.IsDeleted();
}
+6 -3
View File
@@ -153,12 +153,15 @@ static bool HasRelRefIgnoringSheet0Relative( ScDocument* pDoc, const ScTokenArra
ScSingleRefData& rRef2 = static_cast<ScDoubleRefToken*>(t)->GetDoubleRef().Ref2;
if ( rRef2.IsColRel() || rRef2.IsRowRel() || (rRef2.IsFlag3D() && rRef2.IsTabRel()) )
return true;
[[fallthrough]];
ScSingleRefData& rRef1 = static_cast<ScDoubleRefToken*>(t)->GetSingleRef();
if ( rRef1.IsColRel() || rRef1.IsRowRel() || (rRef1.IsFlag3D() && rRef1.IsTabRel()) )
return true;
}
break;
case formula::svSingleRef:
{
ScSingleRefData& rRef1 = *t->GetSingleRef();
ScSingleRefData& rRef1 = static_cast<ScSingleRefToken*>(t)->GetSingleRef();
if ( rRef1.IsColRel() || rRef1.IsRowRel() || (rRef1.IsFlag3D() && rRef1.IsTabRel()) )
return true;
}
@@ -213,7 +216,7 @@ static bool HasOneSingleFullyRelativeReference( const ScTokenArray* pTokens, ScS
{
case formula::svSingleRef:
{
ScSingleRefData& rRef1 = *t->GetSingleRef();
ScSingleRefData& rRef1 = static_cast<ScSingleRefToken*>(t)->GetSingleRef();
if ( rRef1.IsColRel() && rRef1.IsRowRel() && !rRef1.IsFlag3D() && rRef1.IsTabRel() )
{
nCount++;
+6 -6
View File
@@ -1790,19 +1790,19 @@ void ScExternalRefManager::storeRangeNameTokens(sal_uInt16 nFileId, const OUStri
{
case svSingleRef:
{
const ScSingleRefData& rRef = *pToken->GetSingleRef();
const ScSingleRefData& rRef = static_cast<const ScSingleRefToken*>(pToken)->GetSingleRef();
OUString aTabName;
if (SCTAB nCacheId = rRef.Tab(); nCacheId >= 0)
aTabName = maRefCache.getTableName(nFileId, nCacheId);
ScExternalSingleRefToken aNewToken(nFileId, svl::SharedString(aTabName), // string not interned
*pToken->GetSingleRef());
static_cast<const ScSingleRefToken*>(pToken)->GetSingleRef());
pNewArray->AddToken(aNewToken);
bTokenAdded = true;
}
break;
case svDoubleRef:
{
const ScSingleRefData& rRef = *pToken->GetSingleRef();
const ScSingleRefData& rRef = static_cast<const ScDoubleRefToken*>(pToken)->GetSingleRef();
OUString aTabName;
if (SCTAB nCacheId = rRef.Tab(); nCacheId >= 0)
aTabName = maRefCache.getTableName(nFileId, nCacheId);
@@ -2377,18 +2377,18 @@ ScExternalRefCache::TokenArrayRef ScExternalRefManager::getRangeNameTokensFromSr
{
case svSingleRef:
{
const ScSingleRefData& rRef = *pToken->GetSingleRef();
const ScSingleRefData& rRef = static_cast<const ScSingleRefToken*>(pToken)->GetSingleRef();
OUString aTabName;
rSrcDoc.GetName(rRef.Tab(), aTabName);
ScExternalSingleRefToken aNewToken(nFileId, svl::SharedString( aTabName), // string not interned
*pToken->GetSingleRef());
static_cast<const ScSingleRefToken*>(pToken)->GetSingleRef());
pNew->AddToken(aNewToken);
bTokenAdded = true;
}
break;
case svDoubleRef:
{
const ScSingleRefData& rRef = *pToken->GetSingleRef();
const ScSingleRefData& rRef = static_cast<const ScDoubleRefToken*>(pToken)->GetSingleRef();
OUString aTabName;
rSrcDoc.GetName(rRef.Tab(), aTabName);
ScExternalDoubleRefToken aNewToken(nFileId, svl::SharedString( aTabName), // string not interned
+1 -1
View File
@@ -220,7 +220,7 @@ void ScFormulaReferenceHelper::ShowFormulaReference(const OUString& rStr)
}
else
{
ScSingleRefData aRef( *pToken->GetSingleRef() );
ScSingleRefData aRef( static_cast<const ScSingleRefToken*>(pToken)->GetSingleRef() );
aRange.aStart = aRef.toAbs(rDoc, aPos);
aRange.aEnd = aRange.aStart;
}
+27 -15
View File
@@ -1103,7 +1103,7 @@ bool lcl_addUpperLeftCornerIfMissing(const ScDocument* pDoc, std::vector<ScToken
{
case svSingleRef:
{
const ScSingleRefData& rData = *pToken->GetSingleRef();
const ScSingleRefData& rData = static_cast<ScSingleRefToken*>(pToken.get())->GetSingleRef();
nMinCol = rData.Col();
nMinRow = rData.Row();
nMaxCol = rData.Col();
@@ -1124,7 +1124,7 @@ bool lcl_addUpperLeftCornerIfMissing(const ScDocument* pDoc, std::vector<ScToken
case svExternalSingleRef:
{
auto pESRToken = static_cast<ScExternalSingleRefToken*>(pToken.get());
const ScSingleRefData& rData = *pToken->GetSingleRef();
const ScSingleRefData& rData = pESRToken->GetSingleRef();
nMinCol = rData.Col();
nMinRow = rData.Row();
nMaxCol = rData.Col();
@@ -1163,7 +1163,7 @@ bool lcl_addUpperLeftCornerIfMissing(const ScDocument* pDoc, std::vector<ScToken
{
case svSingleRef:
{
const ScSingleRefData& rData = *pToken->GetSingleRef();
const ScSingleRefData& rData = static_cast<ScSingleRefToken*>(pToken.get())->GetSingleRef();
nMinCol = std::min(nMinCol, rData.Col());
nMinRow = std::min(nMinRow, rData.Row());
@@ -1201,7 +1201,7 @@ bool lcl_addUpperLeftCornerIfMissing(const ScDocument* pDoc, std::vector<ScToken
if (nFileId != pESRToken->GetFileId() || aExtTabName != pESRToken->GetTableName())
return false;
const ScSingleRefData& rData = *pToken->GetSingleRef();
const ScSingleRefData& rData = pESRToken->GetSingleRef();
nMinCol = std::min(nMinCol, rData.Col());
nMinRow = std::min(nMinRow, rData.Row());
@@ -1259,18 +1259,22 @@ bool lcl_addUpperLeftCornerIfMissing(const ScDocument* pDoc, std::vector<ScToken
case svSingleRef:
case svExternalSingleRef:
{
const ScSingleRefData& rData = *rxToken->GetSingleRef();
if (rData.Col() == nMinCol && rData.Row() == nMinRow)
const ScSingleRefData* pData;
if (rxToken->GetType() == svSingleRef)
pData = &static_cast<ScSingleRefToken*>(rxToken.get())->GetSingleRef();
else
pData = &static_cast<ScExternalSingleRefToken*>(rxToken.get())->GetSingleRef();
if (pData->Col() == nMinCol && pData->Row() == nMinRow)
// The corner cell is contained.
return false;
if (rData.Col() == nMinCol+nCornerColumnCount && rData.Row() == nMinRow)
if (pData->Col() == nMinCol+nCornerColumnCount && pData->Row() == nMinRow)
bRight = true;
if (rData.Col() == nMinCol && rData.Row() == nMinRow+nCornerRowCount)
if (pData->Col() == nMinCol && pData->Row() == nMinRow+nCornerRowCount)
bBottom = true;
if (rData.Col() == nMinCol+nCornerColumnCount && rData.Row() == nMinRow+nCornerRowCount)
if (pData->Col() == nMinCol+nCornerColumnCount && pData->Row() == nMinRow+nCornerRowCount)
bDiagonal = true;
}
break;
@@ -1608,8 +1612,12 @@ public:
if (!ScRefTokenHelper::isRef(pToken))
return;
const ScSingleRefData& r = *pToken->GetSingleRef();
mpTabNumVector->push_back(r.Tab());
SCTAB nTab;
if (pToken->GetType() == svSingleRef)
nTab = static_cast<ScSingleRefToken*>(pToken.get())->GetSingleRef().Tab();
else
nTab = static_cast<ScDoubleRefToken*>(pToken.get())->GetSingleRef().Tab();
mpTabNumVector->push_back(nTab);
}
void getVector(std::vector<SCTAB>& rVector)
@@ -1696,17 +1704,21 @@ void RangeAnalyzer::initRangeAnalyzer( const ScDocument* pDoc, const std::vector
}
else if (eVar == svSingleRef || eVar == svExternalSingleRef)
{
const ScSingleRefData& r = *aRefToken->GetSingleRef();
const ScSingleRefData* p;
if (eVar == svSingleRef)
p = &static_cast<ScSingleRefToken*>(aRefToken.get())->GetSingleRef();
else
p = &static_cast<ScExternalSingleRefToken*>(aRefToken.get())->GetSingleRef();
mnColumnCount = std::max<SCCOL>( mnColumnCount, 1);
mnRowCount = std::max<SCROW>( mnRowCount, 1);
if( mnStartColumn == -1 )
{
mnStartColumn = r.Col();
mnStartRow = r.Row();
mnStartColumn = p->Col();
mnStartRow = p->Row();
}
else
{
if (mnStartColumn != r.Col() && mnStartRow != r.Row())
if (mnStartColumn != p->Col() && mnStartRow != p->Row())
mbAmbiguous=true;
}
}
+10 -10
View File
@@ -433,15 +433,15 @@ void ScTokenConversion::ConvertToTokenSequence( const ScDocument& rDoc,
case svSingleRef:
{
sheet::SingleReference aSingleRef;
lcl_SingleRefToApi( aSingleRef, *rToken.GetSingleRef() );
lcl_SingleRefToApi( aSingleRef, static_cast<const ScSingleRefToken&>(rToken).GetSingleRef() );
rAPI.Data <<= aSingleRef;
}
break;
case formula::svDoubleRef:
{
sheet::ComplexReference aCompRef;
lcl_SingleRefToApi( aCompRef.Reference1, *rToken.GetSingleRef() );
lcl_SingleRefToApi( aCompRef.Reference2, *rToken.GetSingleRef2() );
lcl_SingleRefToApi( aCompRef.Reference1, static_cast<const ScDoubleRefToken&>(rToken).GetSingleRef() );
lcl_SingleRefToApi( aCompRef.Reference2, static_cast<const ScDoubleRefToken&>(rToken).GetSingleRef2() );
rAPI.Data <<= aCompRef;
}
break;
@@ -462,12 +462,12 @@ void ScTokenConversion::ConvertToTokenSequence( const ScDocument& rDoc,
switch (pRef->GetType())
{
case svSingleRef:
lcl_SingleRefToApi( aTableRefToken.Reference.Reference1, *pRef->GetSingleRef());
lcl_SingleRefToApi( aTableRefToken.Reference.Reference1, static_cast<const ScSingleRefToken*>(pRef)->GetSingleRef());
aTableRefToken.Reference.Reference2 = aTableRefToken.Reference.Reference1;
break;
case svDoubleRef:
lcl_SingleRefToApi( aTableRefToken.Reference.Reference1, *pRef->GetSingleRef());
lcl_SingleRefToApi( aTableRefToken.Reference.Reference2, *pRef->GetSingleRef2());
lcl_SingleRefToApi( aTableRefToken.Reference.Reference1, static_cast<const ScDoubleRefToken*>(pRef)->GetSingleRef());
lcl_SingleRefToApi( aTableRefToken.Reference.Reference2, static_cast<const ScDoubleRefToken*>(pRef)->GetSingleRef2());
break;
default:
; // nothing
@@ -493,7 +493,7 @@ void ScTokenConversion::ConvertToTokenSequence( const ScDocument& rDoc,
{
const auto & rESRToken = static_cast<const ScExternalSingleRefToken&>(rToken);
sheet::SingleReference aSingleRef;
lcl_ExternalRefToApi( aSingleRef, *rToken.GetSingleRef() );
lcl_ExternalRefToApi( aSingleRef, rESRToken.GetSingleRef() );
size_t nCacheId;
rDoc.GetExternalRefManager()->getCacheTable(
rESRToken.GetFileId(), rESRToken.GetTableName().getString(), false, &nCacheId);
@@ -509,8 +509,8 @@ void ScTokenConversion::ConvertToTokenSequence( const ScDocument& rDoc,
{
const auto & rEDRToken = static_cast<const ScExternalDoubleRefToken&>(rToken);
sheet::ComplexReference aComplRef;
lcl_ExternalRefToApi( aComplRef.Reference1, *rToken.GetSingleRef() );
lcl_ExternalRefToApi( aComplRef.Reference2, *rToken.GetSingleRef2() );
lcl_ExternalRefToApi( aComplRef.Reference1, rEDRToken.GetSingleRef() );
lcl_ExternalRefToApi( aComplRef.Reference2, rEDRToken.GetSingleRef2() );
size_t nCacheId;
rDoc.GetExternalRefManager()->getCacheTable(
rEDRToken.GetFileId(), rEDRToken.GetTableName().getString(), false, &nCacheId);
@@ -518,7 +518,7 @@ void ScTokenConversion::ConvertToTokenSequence( const ScDocument& rDoc,
// NOTE: This assumes that cached sheets are in consecutive order!
aComplRef.Reference2.Sheet =
aComplRef.Reference1.Sheet +
(rToken.GetSingleRef2()->Tab() - rToken.GetSingleRef()->Tab());
(rEDRToken.GetSingleRef2().Tab() - rEDRToken.GetSingleRef().Tab());
sheet::ExternalReference aExtRef;
aExtRef.Index = rEDRToken.GetFileId();
aExtRef.Reference <<= aComplRef;