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:
committed by
Julien Nabet
parent
e494181c41
commit
1d8cf993df
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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: */
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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() )
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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++;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user