summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2015-06-18 00:05:58 +0200
committerEike Rathke <erack@redhat.com>2015-06-18 02:47:30 +0200
commit7b7aac2402038c3c9aaeacbbd61c83618728b857 (patch)
treec0372dac324143364908a257d22307717ed44106 /sc
parenta60fc4bf72bd4cecda8b50a4b62b0c14101f8a58 (diff)
Resolves: tdf#83365 push proper references in INDIRECT
... that take relative/absolute addressing and sheet 3D flag into account to be fed to reference extension via range operator. Change-Id: Iabe13ae384577e2d71ca87af6482ddccbf7ad0ac (cherry picked from commit fb6dd2a73074b9695bd8ddf7ba40f1819b03024e)
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/refdata.hxx5
-rw-r--r--sc/source/core/inc/interpre.hxx2
-rw-r--r--sc/source/core/tool/interpr1.cxx5
-rw-r--r--sc/source/core/tool/interpr4.cxx20
-rw-r--r--sc/source/core/tool/refdata.cxx24
5 files changed, 53 insertions, 3 deletions
diff --git a/sc/inc/refdata.hxx b/sc/inc/refdata.hxx
index ac27db8a3d9a..e0d9b807a78b 100644
--- a/sc/inc/refdata.hxx
+++ b/sc/inc/refdata.hxx
@@ -57,6 +57,8 @@ public:
void InitAddress( SCCOL nCol, SCROW nRow, SCTAB nTab );
/// InitAddressRel: InitFlags and set address, everything relative to rPos
void InitAddressRel( const ScAddress& rAdr, const ScAddress& rPos );
+ /// InitFlags and set address, relative to rPos if rRef says so.
+ void InitFromRefAddress( const ScRefAddress& rRef, const ScAddress& rPos );
sal_uInt8 FlagValue() const { return mnFlagValue;}
void SetColRel( bool bVal ) { Flags.bColRel = bVal; }
@@ -135,6 +137,9 @@ struct ScComplexRefData
Ref2.InitAddress( nCol2, nRow2, nTab2 );
}
+ /// InitFlags and set range, relative to rPos if rRef1 and rRef2 say so.
+ void InitFromRefAddresses( const ScRefAddress& rRef1, const ScRefAddress& rRef2, const ScAddress& rPos );
+
bool Valid() const;
/** In external references nTab is -1 for the start tab and -1 for the end
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 443164ec23d2..aea7c5f57ac6 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -333,6 +333,8 @@ void PushExternalSingleRef(sal_uInt16 nFileId, const OUString& rTabName,
void PushExternalDoubleRef(sal_uInt16 nFileId, const OUString& rTabName,
SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
SCCOL nCol2, SCROW nRow2, SCTAB nTab2);
+void PushSingleRef( const ScRefAddress& rRef );
+void PushDoubleRef( const ScRefAddress& rRef1, const ScRefAddress& rRef2 );
void PushMatrix( const sc::RangeMatrix& rMat );
void PushMatrix(const ScMatrixRef& pMat);
void PushError( sal_uInt16 nError );
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 66eef726ad58..df14604e8276 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -7052,8 +7052,7 @@ void ScInterpreter::ScIndirect()
aRefAd2.Col(), aRefAd2.Row(), aRefAd2.Tab());
}
else
- PushDoubleRef( aRefAd.Col(), aRefAd.Row(), aRefAd.Tab(),
- aRefAd2.Col(), aRefAd2.Row(), aRefAd2.Tab() );
+ PushDoubleRef( aRefAd, aRefAd2);
}
else if (ConvertSingleRef(pDok, sRefStr, nTab, aRefAd, aDetails, &aExtInfo))
{
@@ -7063,7 +7062,7 @@ void ScInterpreter::ScIndirect()
aExtInfo.mnFileId, aExtInfo.maTabName, aRefAd.Col(), aRefAd.Row(), aRefAd.Tab());
}
else
- PushSingleRef( aRefAd.Col(), aRefAd.Row(), aRefAd.Tab() );
+ PushSingleRef( aRefAd);
}
else
{
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 2e8ae003cd0f..18dee8e85ad7 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -1968,6 +1968,26 @@ void ScInterpreter::PushExternalDoubleRef(
}
}
+void ScInterpreter::PushSingleRef( const ScRefAddress& rRef )
+{
+ if (!IfErrorPushError())
+ {
+ ScSingleRefData aRef;
+ aRef.InitFromRefAddress( rRef, aPos);
+ PushTempTokenWithoutError( new ScSingleRefToken( aRef ) );
+ }
+}
+
+void ScInterpreter::PushDoubleRef( const ScRefAddress& rRef1, const ScRefAddress& rRef2 )
+{
+ if (!IfErrorPushError())
+ {
+ ScComplexRefData aRef;
+ aRef.InitFromRefAddresses( rRef1, rRef2, aPos);
+ PushTempTokenWithoutError( new ScDoubleRefToken( aRef ) );
+ }
+}
+
void ScInterpreter::PushMatrix( const sc::RangeMatrix& rMat )
{
if (!rMat.isRangeValid())
diff --git a/sc/source/core/tool/refdata.cxx b/sc/source/core/tool/refdata.cxx
index af18610297e5..97d419c03105 100644
--- a/sc/source/core/tool/refdata.cxx
+++ b/sc/source/core/tool/refdata.cxx
@@ -41,6 +41,16 @@ void ScSingleRefData::InitAddressRel( const ScAddress& rAdr, const ScAddress& rP
SetAddress(rAdr, rPos);
}
+void ScSingleRefData::InitFromRefAddress( const ScRefAddress& rRef, const ScAddress& rPos )
+{
+ InitFlags();
+ SetColRel( rRef.IsRelCol());
+ SetRowRel( rRef.IsRelRow());
+ SetTabRel( rRef.IsRelTab());
+ SetFlag3D( rRef.Tab() != rPos.Tab());
+ SetAddress( rRef.GetAddress(), rPos);
+}
+
void ScSingleRefData::SetAbsCol( SCCOL nVal )
{
Flags.bColRel = false;
@@ -257,6 +267,20 @@ void ScSingleRefData::Dump( int nIndent ) const
}
#endif
+void ScComplexRefData::InitFromRefAddresses( const ScRefAddress& rRef1, const ScRefAddress& rRef2, const ScAddress& rPos )
+{
+ InitFlags();
+ Ref1.SetColRel( rRef1.IsRelCol());
+ Ref1.SetRowRel( rRef1.IsRelRow());
+ Ref1.SetTabRel( rRef1.IsRelTab());
+ Ref1.SetFlag3D( rRef1.Tab() != rPos.Tab() || rRef1.Tab() != rRef2.Tab());
+ Ref2.SetColRel( rRef2.IsRelCol());
+ Ref2.SetRowRel( rRef2.IsRelRow());
+ Ref2.SetTabRel( rRef2.IsRelTab());
+ Ref2.SetFlag3D( rRef1.Tab() != rRef2.Tab());
+ SetRange( ScRange( rRef1.GetAddress(), rRef2.GetAddress()), rPos);
+}
+
ScComplexRefData& ScComplexRefData::Extend( const ScSingleRefData & rRef, const ScAddress & rPos )
{
bool bInherit3D = (Ref1.IsFlag3D() && !Ref2.IsFlag3D() && !rRef.IsFlag3D());