[Libreoffice-commits] core.git: Branch 'feature/formula-core-rework' - sc/inc sc/source
Kohei Yoshida
kohei.yoshida at gmail.com
Tue Jul 16 20:30:32 PDT 2013
sc/inc/address.hxx | 1
sc/source/core/inc/refupdat.hxx | 32 +++--
sc/source/core/tool/address.cxx | 18 ++
sc/source/core/tool/compiler.cxx | 114 +++++++++---------
sc/source/core/tool/refupdat.cxx | 242 +++++++++++++++++++++------------------
5 files changed, 229 insertions(+), 178 deletions(-)
New commits:
commit d944f0a90527452f0ad15ff3151b295407643908
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Tue Jul 16 23:31:51 2013 -0400
More on removing CalcAbsIfRel().
One test fails. I'll look into that next.
Change-Id: I4a40104187a73953769740fd47d7a917c83bf337
diff --git a/sc/inc/address.hxx b/sc/inc/address.hxx
index 84c62cb..2a38827 100644
--- a/sc/inc/address.hxx
+++ b/sc/inc/address.hxx
@@ -507,6 +507,7 @@ public:
SC_DLLPUBLIC void Justify();
SC_DLLPUBLIC void ExtendTo( const ScRange& rRange );
SC_DLLPUBLIC bool Intersects( const ScRange& ) const; // do two ranges intersect?
+ void PutInOrder();
inline bool operator==( const ScRange& r ) const;
inline bool operator!=( const ScRange& r ) const;
inline bool operator<( const ScRange& r ) const;
diff --git a/sc/source/core/inc/refupdat.hxx b/sc/source/core/inc/refupdat.hxx
index 1d9f4c2..8252005 100644
--- a/sc/source/core/inc/refupdat.hxx
+++ b/sc/source/core/inc/refupdat.hxx
@@ -58,17 +58,31 @@ public:
sal_Int32 nDx, sal_Int32 nDy, sal_Int32 nDz,
ScBigRange& rWhat );
- /// Before calling, the absolute references must be up-to-date!
- static ScRefUpdateRes Update( ScDocument* pDoc,
- UpdateRefMode eUpdateRefMode,
- const ScAddress& rPos, const ScRange& rRange,
- SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
- ScComplexRefData& rRef, WhatType eWhat = ALL );
+ /**
+ * Update range reference in response to row / column insertion / removal,
+ * copy-n-pasting of formula cell, moving of cells etc.
+ *
+ * @param pDoc
+ * @param eUpdateRefMode
+ * @param rPos position of formula cell that has the range reference.
+ * @param rRange range of cells being shifted.
+ * @param nDx
+ * @param nDy
+ * @param nDz
+ * @param rRef range reference object
+ * @param eWhat
+ *
+ * @return ScRefUpdateRes
+ */
+ static ScRefUpdateRes Update(
+ ScDocument* pDoc, UpdateRefMode eUpdateRefMode, const ScAddress& rPos,
+ const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
+ ScComplexRefData& rRef, ScRange& rRefRange, WhatType eWhat = ALL );
/// Before calling, the absolute references must be up-to-date!
- static ScRefUpdateRes Move( ScDocument* pDoc, const ScAddress& rPos,
- SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
- ScComplexRefData& rRef, bool bWrap, bool bAbsolute );
+ static ScRefUpdateRes Move(
+ ScDocument* pDoc, const ScAddress& rPos, SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
+ ScComplexRefData& rRef, ScRange& rRefRange, bool bWrap, bool bAbsolute );
static void MoveRelWrap( ScDocument* pDoc, const ScAddress& rPos,
SCCOL nMaxCol, SCROW nMaxRow, ScComplexRefData& rRef );
diff --git a/sc/source/core/tool/address.cxx b/sc/source/core/tool/address.cxx
index e21aa19..33c653e 100644
--- a/sc/source/core/tool/address.cxx
+++ b/sc/source/core/tool/address.cxx
@@ -1337,6 +1337,24 @@ bool ScRange::Intersects( const ScRange& r ) const
);
}
+void ScRange::PutInOrder()
+{
+ SCCOL nCol1 = aStart.Col(), nCol2 = aEnd.Col();
+ SCROW nRow1 = aStart.Row(), nRow2 = aEnd.Row();
+ SCTAB nTab1 = aStart.Tab(), nTab2 = aEnd.Tab();
+
+ ::PutInOrder(nCol1, nCol2);
+ ::PutInOrder(nRow1, nRow2);
+ ::PutInOrder(nTab1, nTab2);
+
+ aStart.SetCol(nCol1);
+ aStart.SetRow(nRow1);
+ aStart.SetTab(nTab1);
+
+ aEnd.SetCol(nCol2);
+ aEnd.SetRow(nRow2);
+ aEnd.SetTab(nTab2);
+}
void ScRange::Justify()
{
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index cd5cef0..494ed65 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -4206,13 +4206,16 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode,
aNewRef.IncRow(nDy);
aNewRef.IncTab(nDz);
if ( r.In( aNewRef ) )
- { // yes, this is URM_MOVE
- if ( ScRefUpdate::Update( pDoc, URM_MOVE, aPos,
- r, nDx, nDy, nDz,
- SingleDoubleRefModifier( rRef ).Ref() )
- != UR_NOTHING
- )
+ {
+ SingleDoubleRefModifier aMod(rRef);
+ ScComplexRefData& rRef2 = aMod.Ref();
+ ScRange aRefRange = rRef2.toAbs(rOldPos);
+ // yes, this is URM_MOVE
+ if (ScRefUpdate::Update(pDoc, URM_MOVE, aPos, r, nDx, nDy, nDz, rRef2, aRefRange) != UR_NOTHING)
+ {
+ rRef2.SetRange(aRefRange, rOldPos);
rChanged = true;
+ }
}
}
// Check for SharedFormulas.
@@ -4296,29 +4299,30 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode,
break;
case svSingleRef:
{
- t->CalcAbsIfRel( rOldPos );
SingleDoubleRefModifier aRefMod(t->GetSingleRef());
ScComplexRefData& rRef = aRefMod.Ref();
- if (ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef) != UR_NOTHING)
+ ScRange aRefRange = rRef.toAbs(rOldPos);
+ if (ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef, aRefRange) != UR_NOTHING)
+ {
+ rRef.SetRange(aRefRange, rOldPos);
rChanged = true;
+ }
}
break;
default:
{
ScComplexRefData& rRef = t->GetDoubleRef();
- ScRange aAbs = rRef.toAbs(rOldPos);
- SCCOL nCols = aAbs.aEnd.Col() - aAbs.aStart.Col();
- SCROW nRows = aAbs.aEnd.Row() - aAbs.aStart.Row();
- SCTAB nTabs = aAbs.aEnd.Tab() - aAbs.aStart.Tab();
- t->CalcAbsIfRel( rOldPos );
- if ( ScRefUpdate::Update( pDoc, eUpdateRefMode,
- aPos, r, nDx, nDy, nDz,
- t->GetDoubleRef()) != UR_NOTHING)
+ ScRange aRefRange = rRef.toAbs(rOldPos);
+ SCCOL nCols = aRefRange.aEnd.Col() - aRefRange.aStart.Col();
+ SCROW nRows = aRefRange.aEnd.Row() - aRefRange.aStart.Row();
+ SCTAB nTabs = aRefRange.aEnd.Tab() - aRefRange.aStart.Tab();
+ if (ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef, aRefRange) != UR_NOTHING)
{
+ rRef.SetRange(aRefRange, rOldPos);
rChanged = true;
- if (rRef.Ref2.nCol - rRef.Ref1.nCol != nCols ||
- rRef.Ref2.nRow - rRef.Ref1.nRow != nRows ||
- rRef.Ref2.nTab - rRef.Ref1.nTab != nTabs)
+ if (aRefRange.aEnd.Col() - aRefRange.aStart.Col() != nCols ||
+ aRefRange.aEnd.Row() - aRefRange.aStart.Row() != nRows ||
+ aRefRange.aEnd.Tab() - aRefRange.aStart.Tab() != nTabs)
rRefSizeChanged = true;
}
}
@@ -4335,38 +4339,35 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode,
{
ScSingleRefData& rRef = t->GetSingleRef();
SingleDoubleRefModifier aMod( rRef );
- if ( rRef.IsRelName() )
+ if (!rRef.IsRelName())
{
- ScRefUpdate::MoveRelWrap( pDoc, aPos, MAXCOL, MAXROW, aMod.Ref() );
- rChanged = true;
- }
- else
- {
- aMod.Ref().CalcAbsIfRel( rOldPos );
- if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos,
- r, nDx, nDy, nDz, aMod.Ref() )
- != UR_NOTHING
- )
+ ScComplexRefData& rRef2 = aMod.Ref();
+ ScRange aRefRange = rRef2.toAbs(rOldPos);
+ if (ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef2, aRefRange) != UR_NOTHING)
+ {
+ rRef2.SetRange(aRefRange, rOldPos);
rChanged = true;
+ }
}
}
else
{
ScComplexRefData& rRef = t->GetDoubleRef();
- SCCOL nCols = rRef.Ref2.nCol - rRef.Ref1.nCol;
- SCROW nRows = rRef.Ref2.nRow - rRef.Ref1.nRow;
- SCTAB nTabs = rRef.Ref2.nTab - rRef.Ref1.nTab;
+ ScRange aRefRange = rRef.toAbs(rOldPos);
+ SCCOL nCols = aRefRange.aEnd.Col() - aRefRange.aStart.Col();
+ SCROW nRows = aRefRange.aEnd.Row() - aRefRange.aStart.Row();
+ SCTAB nTabs = aRefRange.aEnd.Tab() - aRefRange.aStart.Tab();
if ( rRef.Ref1.IsRelName() || rRef.Ref2.IsRelName() )
{
- ScRefUpdate::MoveRelWrap( pDoc, aPos, MAXCOL, MAXROW, rRef );
- rChanged = true;
+ // do nothing
}
- else if (ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef) != UR_NOTHING)
+ else if (ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef, aRefRange) != UR_NOTHING)
{
+ rRef.SetRange(aRefRange, rOldPos);
rChanged = true;
- if (rRef.Ref2.nCol - rRef.Ref1.nCol != nCols ||
- rRef.Ref2.nRow - rRef.Ref1.nRow != nRows ||
- rRef.Ref2.nTab - rRef.Ref1.nTab != nTabs)
+ if (aRefRange.aEnd.Col() - aRefRange.aStart.Col() != nCols ||
+ aRefRange.aEnd.Row() - aRefRange.aStart.Row() != nRows ||
+ aRefRange.aEnd.Tab() - aRefRange.aStart.Tab() != nTabs)
{
rRefSizeChanged = true;
}
@@ -4410,11 +4411,12 @@ bool ScCompiler::UpdateNameReference(UpdateRefMode eUpdateRefMode,
}
if (bUpdate)
{
- rRef.CalcAbsIfRel( aPos);
- if (ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos, r,
- nDx, nDy, nDz, rRef, ScRefUpdate::ABSOLUTE)
- != UR_NOTHING )
+ ScRange aRefRange = rRef.toAbs(aPos);
+ if (ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef, aRefRange, ScRefUpdate::ABSOLUTE) != UR_NOTHING)
+ {
+ rRef.SetRange(aRefRange, aPos);
rChanged = true;
+ }
}
}
return bRelRef;
@@ -4435,52 +4437,48 @@ void ScCompiler::UpdateSharedFormulaReference( UpdateRefMode eUpdateRefMode,
{
if( t->GetType() != svIndex ) // it may be a DB area!!!
{
- t->CalcAbsIfRel( rOldPos );
// Absolute references have been already adjusted in the named
// shared formula itself prior to breaking the shared formula
// and calling this function. Don't readjust them again.
SingleDoubleRefModifier aMod( *t );
ScComplexRefData& rRef = aMod.Ref();
ScComplexRefData aBkp = rRef;
- ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos,
- r, nDx, nDy, nDz, rRef );
+ ScRange aRefRange = rRef.toAbs(rOldPos);
+ ScRange aBkpRange = aRefRange;
+ ScRefUpdate::Update(pDoc, eUpdateRefMode, aPos, r, nDx, nDy, nDz, rRef, aRefRange);
+ rRef.SetRange(aRefRange, rOldPos);
+
// restore absolute parts
if ( !aBkp.Ref1.IsColRel() )
{
- rRef.Ref1.nCol = aBkp.Ref1.nCol;
- rRef.Ref1.nRelCol = aBkp.Ref1.nRelCol;
+ rRef.Ref1.nCol = aBkpRange.aStart.Col();
rRef.Ref1.SetColDeleted( aBkp.Ref1.IsColDeleted() );
}
if ( !aBkp.Ref1.IsRowRel() )
{
- rRef.Ref1.nRow = aBkp.Ref1.nRow;
- rRef.Ref1.nRelRow = aBkp.Ref1.nRelRow;
+ rRef.Ref1.nRow = aBkpRange.aStart.Row();
rRef.Ref1.SetRowDeleted( aBkp.Ref1.IsRowDeleted() );
}
if ( !aBkp.Ref1.IsTabRel() )
{
- rRef.Ref1.nTab = aBkp.Ref1.nTab;
- rRef.Ref1.nRelTab = aBkp.Ref1.nRelTab;
+ rRef.Ref1.nTab = aBkpRange.aStart.Tab();
rRef.Ref1.SetTabDeleted( aBkp.Ref1.IsTabDeleted() );
}
if ( t->GetType() == svDoubleRef )
{
if ( !aBkp.Ref2.IsColRel() )
{
- rRef.Ref2.nCol = aBkp.Ref2.nCol;
- rRef.Ref2.nRelCol = aBkp.Ref2.nRelCol;
+ rRef.Ref2.nCol = aBkpRange.aEnd.Col();
rRef.Ref2.SetColDeleted( aBkp.Ref2.IsColDeleted() );
}
if ( !aBkp.Ref2.IsRowRel() )
{
- rRef.Ref2.nRow = aBkp.Ref2.nRow;
- rRef.Ref2.nRelRow = aBkp.Ref2.nRelRow;
+ rRef.Ref2.nRow = aBkpRange.aEnd.Row();
rRef.Ref2.SetRowDeleted( aBkp.Ref2.IsRowDeleted() );
}
if ( !aBkp.Ref2.IsTabRel() )
{
- rRef.Ref2.nTab = aBkp.Ref2.nTab;
- rRef.Ref2.nRelTab = aBkp.Ref2.nRelTab;
+ rRef.Ref2.nTab = aBkpRange.aEnd.Tab();
rRef.Ref2.SetTabDeleted( aBkp.Ref2.IsTabDeleted() );
}
}
diff --git a/sc/source/core/tool/refupdat.cxx b/sc/source/core/tool/refupdat.cxx
index c4e493d..8ad478b 100644
--- a/sc/source/core/tool/refupdat.cxx
+++ b/sc/source/core/tool/refupdat.cxx
@@ -481,20 +481,20 @@ ScRefUpdateRes ScRefUpdate::Update( UpdateRefMode eUpdateRefMode,
}
-ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eMode,
- const ScAddress& rPos, const ScRange& r,
- SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
- ScComplexRefData& rRef, WhatType eWhat )
+ScRefUpdateRes ScRefUpdate::Update(
+ ScDocument* pDoc, UpdateRefMode eMode, const ScAddress& rPos, const ScRange& rRange,
+ SCsCOL nDx, SCsROW nDy, SCsTAB nDz, ScComplexRefData& rRef, ScRange& rRefRange,
+ WhatType eWhat )
{
ScRefUpdateRes eRet = UR_NOTHING;
// Range that shifted.
- SCCOL nCol1 = r.aStart.Col();
- SCROW nRow1 = r.aStart.Row();
- SCTAB nTab1 = r.aStart.Tab();
- SCCOL nCol2 = r.aEnd.Col();
- SCROW nRow2 = r.aEnd.Row();
- SCTAB nTab2 = r.aEnd.Tab();
+ SCCOL nCol1 = rRange.aStart.Col();
+ SCROW nRow1 = rRange.aStart.Row();
+ SCTAB nTab1 = rRange.aStart.Tab();
+ SCCOL nCol2 = rRange.aEnd.Col();
+ SCROW nRow2 = rRange.aEnd.Row();
+ SCTAB nTab2 = rRange.aEnd.Tab();
if( eMode == URM_INSDEL )
{
@@ -506,12 +506,12 @@ ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eMode,
( pChangeTrack ? pChangeTrack->IsInDeleteUndo() : false );
// Store the old reference range.
- SCCOL nOldCol1 = rRef.Ref1.nCol;
- SCROW nOldRow1 = rRef.Ref1.nRow;
- SCTAB nOldTab1 = rRef.Ref1.nTab;
- SCCOL nOldCol2 = rRef.Ref2.nCol;
- SCROW nOldRow2 = rRef.Ref2.nRow;
- SCTAB nOldTab2 = rRef.Ref2.nTab;
+ SCCOL nOldCol1 = rRefRange.aStart.Col();
+ SCROW nOldRow1 = rRefRange.aStart.Row();
+ SCTAB nOldTab1 = rRefRange.aStart.Tab();
+ SCCOL nOldCol2 = rRefRange.aEnd.Col();
+ SCROW nOldRow2 = rRefRange.aEnd.Row();
+ SCTAB nOldTab2 = rRefRange.aEnd.Tab();
bool bRef1ColDel = rRef.Ref1.IsColDeleted();
bool bRef2ColDel = rRef.Ref2.IsColDeleted();
@@ -521,30 +521,31 @@ ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eMode,
bool bRef2TabDel = rRef.Ref2.IsTabDeleted();
if (nDx &&
- ((nRow1 <= rRef.Ref1.nRow && rRef.Ref2.nRow <= nRow2) || (bRef1RowDel || bRef2RowDel)) &&
- ((nTab1 <= rRef.Ref1.nTab && rRef.Ref2.nTab <= nTab2) || (bRef1TabDel || bRef2TabDel)))
+ ((nRow1 <= rRefRange.aStart.Row() && rRefRange.aEnd.Row() <= nRow2) || (bRef1RowDel || bRef2RowDel)) &&
+ ((nTab1 <= rRefRange.aStart.Tab() && rRefRange.aEnd.Tab() <= nTab2) || (bRef1TabDel || bRef2TabDel)))
{
// Shift in the column direction, reference range has at least one
// deleted row or sheet, and the reference range is within the
// shifted region.
- bool bExp = (bExpand && !bInDeleteUndo && IsExpand( rRef.Ref1.nCol,
- rRef.Ref2.nCol, nCol1, nDx ));
- bool bDo1 = (eWhat == ScRefUpdate::ALL || (eWhat ==
- ScRefUpdate::ABSOLUTE && !rRef.Ref1.IsColRel()));
- bool bDo2 = (eWhat == ScRefUpdate::ALL || (eWhat ==
- ScRefUpdate::ABSOLUTE && !rRef.Ref2.IsColRel()));
- if ( lcl_MoveRefPart( rRef.Ref1.nCol, bRef1ColDel, bDo1,
- rRef.Ref2.nCol, bRef2ColDel, bDo2,
+ bool bExp = (bExpand && !bInDeleteUndo && IsExpand(rRefRange.aStart.Col(), rRefRange.aEnd.Col(), nCol1, nDx));
+ bool bDo1 = (eWhat == ScRefUpdate::ALL || (eWhat == ScRefUpdate::ABSOLUTE && !rRef.Ref1.IsColRel()));
+ bool bDo2 = (eWhat == ScRefUpdate::ALL || (eWhat == ScRefUpdate::ABSOLUTE && !rRef.Ref2.IsColRel()));
+ SCCOL nRefCol1 = rRefRange.aStart.Col(), nRefCol2 = rRefRange.aEnd.Col();
+ if ( lcl_MoveRefPart(nRefCol1, bRef1ColDel, bDo1,
+ nRefCol2, bRef2ColDel, bDo2,
nCol1, nCol2, nDx, MAXCOL ) )
{
+ rRefRange.aStart.SetCol(nRefCol1);
+ rRefRange.aEnd.SetCol(nRefCol2);
+
eRet = UR_UPDATED;
if ( bInDeleteUndo && (bRef1ColDel || bRef2ColDel) )
{
- if ( bRef1ColDel && nCol1 <= rRef.Ref1.nCol &&
- rRef.Ref1.nCol <= nCol1 + nDx )
+ if (bRef1ColDel &&
+ nCol1 <= rRefRange.aStart.Col() && rRefRange.aStart.Col() <= nCol1 + nDx)
rRef.Ref1.SetColDeleted( false );
- if ( bRef2ColDel && nCol1 <= rRef.Ref2.nCol &&
- rRef.Ref2.nCol <= nCol1 + nDx )
+ if (bRef2ColDel &&
+ nCol1 <= rRefRange.aEnd.Col() && rRefRange.aEnd.Col() <= nCol1 + nDx)
rRef.Ref2.SetColDeleted( false );
}
else
@@ -557,36 +558,39 @@ ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eMode,
}
if ( bExp )
{
- Expand( rRef.Ref1.nCol, rRef.Ref2.nCol, nCol1, nDx );
+ nRefCol1 = rRefRange.aStart.Col();
+ nRefCol2 = rRefRange.aEnd.Col();
+ Expand(nRefCol1, nRefCol2, nCol1, nDx);
+ rRefRange.aStart.SetCol(nRefCol1);
+ rRefRange.aEnd.SetCol(nRefCol2);
+
eRet = UR_UPDATED;
}
}
if (nDy &&
- ((nCol1 <= rRef.Ref1.nCol && rRef.Ref2.nCol <= nCol2) || (bRef1ColDel || bRef2ColDel)) &&
- ((nTab1 <= rRef.Ref1.nTab && rRef.Ref2.nTab <= nTab2) || (bRef1TabDel || bRef2TabDel)))
+ ((nCol1 <= rRefRange.aStart.Col() && rRefRange.aEnd.Col() <= nCol2) || (bRef1ColDel || bRef2ColDel)) &&
+ ((nTab1 <= rRefRange.aStart.Tab() && rRefRange.aEnd.Tab() <= nTab2) || (bRef1TabDel || bRef2TabDel)))
{
// Shift in the row direction, reference range has at least one
// deleted column or sheet, and the reference range is within the
// shifted region.
- bool bExp = (bExpand && !bInDeleteUndo && IsExpand( rRef.Ref1.nRow,
- rRef.Ref2.nRow, nRow1, nDy ));
+ bool bExp = (bExpand && !bInDeleteUndo && IsExpand(rRefRange.aStart.Row(), rRefRange.aEnd.Row(), nRow1, nDy));
bool bDo1 = (eWhat == ScRefUpdate::ALL || (eWhat ==
ScRefUpdate::ABSOLUTE && !rRef.Ref1.IsRowRel()));
bool bDo2 = (eWhat == ScRefUpdate::ALL || (eWhat ==
ScRefUpdate::ABSOLUTE && !rRef.Ref2.IsRowRel()));
- if ( lcl_MoveRefPart( rRef.Ref1.nRow, bRef1RowDel, bDo1,
- rRef.Ref2.nRow, bRef2RowDel, bDo2,
- nRow1, nRow2, nDy, MAXROW ) )
+ SCROW nRefRow1 = rRefRange.aStart.Row(), nRefRow2 = rRefRange.aEnd.Row();
+ if (lcl_MoveRefPart(nRefRow1, bRef1RowDel, bDo1, nRefRow2, bRef2RowDel, bDo2, nRow1, nRow2, nDy, MAXROW))
{
+ rRefRange.aStart.SetRow(nRefRow1);
+ rRefRange.aEnd.SetRow(nRefRow2);
eRet = UR_UPDATED;
if ( bInDeleteUndo && (bRef1RowDel || bRef2RowDel) )
{
- if ( bRef1RowDel && nRow1 <= rRef.Ref1.nRow &&
- rRef.Ref1.nRow <= nRow1 + nDy )
+ if (bRef1RowDel && nRow1 <= rRefRange.aStart.Row() && rRefRange.aStart.Row() <= nRow1 + nDy)
rRef.Ref1.SetRowDeleted( false );
- if ( bRef2RowDel && nRow1 <= rRef.Ref2.nRow &&
- rRef.Ref2.nRow <= nRow1 + nDy )
+ if (bRef2RowDel && nRow1 <= rRefRange.aEnd.Row() && rRefRange.aEnd.Row() <= nRow1 + nDy)
rRef.Ref2.SetRowDeleted( false );
}
else
@@ -599,37 +603,40 @@ ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eMode,
}
if ( bExp )
{
- Expand( rRef.Ref1.nRow, rRef.Ref2.nRow, nRow1, nDy );
+ nRefRow1 = rRefRange.aStart.Row();
+ nRefRow2 = rRefRange.aEnd.Row();
+ Expand(nRefRow1, nRefRow2, nRow1, nDy);
+ rRefRange.aStart.SetRow(nRefRow1);
+ rRefRange.aEnd.SetRow(nRefRow2);
eRet = UR_UPDATED;
}
}
if (nDz &&
- ((nCol1 <= rRef.Ref1.nCol && rRef.Ref2.nCol <= nCol2) || (bRef1ColDel || bRef2ColDel)) &&
- ((nRow1 <= rRef.Ref1.nRow && rRef.Ref2.nRow <= nRow2) || (bRef1RowDel || bRef2RowDel)))
+ ((nCol1 <= rRefRange.aStart.Col() && rRefRange.aEnd.Col() <= nCol2) || (bRef1ColDel || bRef2ColDel)) &&
+ ((nRow1 <= rRefRange.aStart.Row() && rRefRange.aEnd.Row() <= nRow2) || (bRef1RowDel || bRef2RowDel)))
{
// Shift in the sheet direction, reference range has at least one
// deleted column or row, and the reference range is within the
// shifted region.
- bool bExp = (bExpand && !bInDeleteUndo && IsExpand( rRef.Ref1.nTab,
- rRef.Ref2.nTab, nTab1, nDz ));
+ bool bExp = (bExpand && !bInDeleteUndo && IsExpand(rRefRange.aStart.Tab(), rRefRange.aEnd.Tab(), nTab1, nDz));
SCTAB nMaxTab = pDoc->GetTableCount() - 1;
bool bDo1 = (eWhat == ScRefUpdate::ALL || (eWhat ==
ScRefUpdate::ABSOLUTE && !rRef.Ref1.IsTabRel()));
bool bDo2 = (eWhat == ScRefUpdate::ALL || (eWhat ==
ScRefUpdate::ABSOLUTE && !rRef.Ref2.IsTabRel()));
- if ( lcl_MoveRefPart( rRef.Ref1.nTab, bRef1TabDel, bDo1,
- rRef.Ref2.nTab, bRef2TabDel, bDo2,
- nTab1, nTab2, nDz, nMaxTab ) )
+
+ SCTAB nRefTab1 = rRefRange.aStart.Tab(), nRefTab2 = rRefRange.aEnd.Tab();
+ if (lcl_MoveRefPart(nRefTab1, bRef1TabDel, bDo1, nRefTab2, bRef2TabDel, bDo2, nTab1, nTab2, nDz, nMaxTab))
{
+ rRefRange.aStart.SetTab(nRefTab1);
+ rRefRange.aEnd.SetTab(nRefTab2);
eRet = UR_UPDATED;
if ( bInDeleteUndo && (bRef1TabDel || bRef2TabDel) )
{
- if ( bRef1TabDel && nTab1 <= rRef.Ref1.nTab &&
- rRef.Ref1.nTab <= nTab1 + nDz )
+ if (bRef1TabDel && nTab1 <= rRefRange.aStart.Tab() && rRefRange.aStart.Tab() <= nTab1 + nDz)
rRef.Ref1.SetTabDeleted( false );
- if ( bRef2TabDel && nTab1 <= rRef.Ref2.nTab &&
- rRef.Ref2.nTab <= nTab1 + nDz )
+ if (bRef2TabDel && nTab1 <= rRefRange.aEnd.Tab() && rRefRange.aEnd.Tab() <= nTab1 + nDz)
rRef.Ref2.SetTabDeleted( false );
}
else
@@ -642,73 +649,68 @@ ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eMode,
}
if ( bExp )
{
- Expand( rRef.Ref1.nTab, rRef.Ref2.nTab, nTab1, nDz );
+ nRefTab1 = rRefRange.aStart.Tab();
+ nRefTab2 = rRefRange.aEnd.Tab();
+ Expand(nRefTab1, nRefTab2, nTab1, nDz);
+ rRefRange.aStart.SetTab(nRefTab1);
+ rRefRange.aEnd.SetTab(nRefTab2);
eRet = UR_UPDATED;
}
}
if ( eRet == UR_NOTHING )
{
- if (nOldCol1 != rRef.Ref1.nCol
- || nOldRow1 != rRef.Ref1.nRow
- || nOldTab1 != rRef.Ref1.nTab
- || nOldCol2 != rRef.Ref2.nCol
- || nOldRow2 != rRef.Ref2.nRow
- || nOldTab2 != rRef.Ref2.nTab
+ if (nOldCol1 != rRefRange.aStart.Col()
+ || nOldRow1 != rRefRange.aStart.Row()
+ || nOldTab1 != rRefRange.aStart.Tab()
+ || nOldCol2 != rRefRange.aEnd.Col()
+ || nOldRow2 != rRefRange.aEnd.Row()
+ || nOldTab2 != rRefRange.aEnd.Tab()
)
// Reference has changed, but the flag has not been set !?
eRet = UR_UPDATED;
}
- if (eWhat != ScRefUpdate::ABSOLUTE)
- rRef.CalcRelFromAbs( rPos );
}
else if( eMode == URM_MOVE )
{
// Move
- if ( rRef.Ref1.nCol >= nCol1-nDx
- && rRef.Ref1.nRow >= nRow1-nDy
- && rRef.Ref1.nTab >= nTab1-nDz
- && rRef.Ref2.nCol <= nCol2-nDx
- && rRef.Ref2.nRow <= nRow2-nDy
- && rRef.Ref2.nTab <= nTab2-nDz )
+ if ( rRefRange.aStart.Col() >= nCol1-nDx
+ && rRefRange.aStart.Row() >= nRow1-nDy
+ && rRefRange.aStart.Tab() >= nTab1-nDz
+ && rRefRange.aEnd.Col() <= nCol2-nDx
+ && rRefRange.aEnd.Row() <= nRow2-nDy
+ && rRefRange.aEnd.Tab() <= nTab2-nDz )
{
- eRet = Move( pDoc, rPos, nDx, nDy, nDz, rRef, false, true ); // immer verschieben
+ eRet = Move(pDoc, rPos, nDx, nDy, nDz, rRef, rRefRange, false, true); // immer verschieben
}
- else if ( nDz && r.In( rPos ) )
+ else if ( nDz && rRange.In( rPos ) )
{
rRef.Ref1.SetFlag3D( true );
rRef.Ref2.SetFlag3D( true );
eRet = UR_UPDATED;
- if (eWhat != ScRefUpdate::ABSOLUTE)
- rRef.CalcRelFromAbs( rPos );
}
- else if (eWhat != ScRefUpdate::ABSOLUTE)
- rRef.CalcRelFromAbs( rPos );
}
- else if( eMode == URM_COPY && r.In( rPos ) )
+ else if( eMode == URM_COPY && rRange.In( rPos ) )
{
- eRet = Move( pDoc, rPos, nDx, nDy, nDz, rRef, false, false ); // nur relative
+ eRet = Move(pDoc, rPos, nDx, nDy, nDz, rRef, rRefRange, false, false); // nur relative
// sollte nicht mehr verwendet werden muessen
}
- else if (eWhat != ScRefUpdate::ABSOLUTE)
- {
- rRef.CalcRelFromAbs( rPos );
- }
+
return eRet;
}
-ScRefUpdateRes ScRefUpdate::Move( ScDocument* pDoc, const ScAddress& rPos,
- SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
- ScComplexRefData& rRef, bool bWrap, bool bAbsolute )
+ScRefUpdateRes ScRefUpdate::Move(
+ ScDocument* pDoc, const ScAddress& rPos, SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
+ ScComplexRefData& rRef, ScRange& rRefRange, bool bWrap, bool bAbsolute )
{
ScRefUpdateRes eRet = UR_NOTHING;
- SCCOL oldCol1 = rRef.Ref1.nCol;
- SCROW oldRow1 = rRef.Ref1.nRow;
- SCTAB oldTab1 = rRef.Ref1.nTab;
- SCCOL oldCol2 = rRef.Ref2.nCol;
- SCROW oldRow2 = rRef.Ref2.nRow;
- SCTAB oldTab2 = rRef.Ref2.nTab;
+ SCCOL nOldCol1 = rRef.Ref1.nCol;
+ SCROW nOldRow1 = rRef.Ref1.nRow;
+ SCTAB nOldTab1 = rRef.Ref1.nTab;
+ SCCOL nOldCol2 = rRef.Ref2.nCol;
+ SCROW nOldRow2 = rRef.Ref2.nRow;
+ SCTAB nOldTab2 = rRef.Ref2.nTab;
bool bCut1, bCut2;
if ( nDx )
@@ -716,17 +718,25 @@ ScRefUpdateRes ScRefUpdate::Move( ScDocument* pDoc, const ScAddress& rPos,
bCut1 = bCut2 = false;
if( bAbsolute || rRef.Ref1.IsColRel() )
{
+ SCCOL nRefCol1 = rRefRange.aStart.Col();
if( bWrap )
- lcl_MoveItWrap( rRef.Ref1.nCol, nDx, MAXCOL );
+ {
+ lcl_MoveItWrap(nRefCol1, nDx, MAXCOL);
+ }
else
- bCut1 = lcl_MoveItCut( rRef.Ref1.nCol, nDx, MAXCOL );
+ {
+ bCut1 = lcl_MoveItCut(nRefCol1, nDx, MAXCOL);
+ }
+ rRefRange.aStart.SetCol(nRefCol1);
}
if( bAbsolute || rRef.Ref2.IsColRel() )
{
+ SCCOL nRefCol2 = rRefRange.aEnd.Col();
if( bWrap )
- lcl_MoveItWrap( rRef.Ref2.nCol, nDx, MAXCOL );
+ lcl_MoveItWrap(nRefCol2, nDx, MAXCOL);
else
- bCut2 = lcl_MoveItCut( rRef.Ref2.nCol, nDx, MAXCOL );
+ bCut2 = lcl_MoveItCut(nRefCol2, nDx, MAXCOL);
+ rRefRange.aEnd.SetCol(nRefCol2);
}
if ( bCut1 || bCut2 )
eRet = UR_UPDATED;
@@ -741,17 +751,21 @@ ScRefUpdateRes ScRefUpdate::Move( ScDocument* pDoc, const ScAddress& rPos,
bCut1 = bCut2 = false;
if( bAbsolute || rRef.Ref1.IsRowRel() )
{
+ SCROW nRefRow1 = rRefRange.aStart.Row();
if( bWrap )
- lcl_MoveItWrap( rRef.Ref1.nRow, nDy, MAXROW );
+ lcl_MoveItWrap(nRefRow1, nDy, MAXROW);
else
- bCut1 = lcl_MoveItCut( rRef.Ref1.nRow, nDy, MAXROW );
+ bCut1 = lcl_MoveItCut(nRefRow1, nDy, MAXROW);
+ rRefRange.aStart.SetRow(nRefRow1);
}
if( bAbsolute || rRef.Ref2.IsRowRel() )
{
+ SCROW nRefRow2 = rRefRange.aEnd.Row();
if( bWrap )
- lcl_MoveItWrap( rRef.Ref2.nRow, nDy, MAXROW );
+ lcl_MoveItWrap(nRefRow2, nDy, MAXROW);
else
- bCut2 = lcl_MoveItCut( rRef.Ref2.nRow, nDy, MAXROW );
+ bCut2 = lcl_MoveItCut(nRefRow2, nDy, MAXROW);
+ rRefRange.aEnd.SetRow(nRefRow2);
}
if ( bCut1 || bCut2 )
eRet = UR_UPDATED;
@@ -767,19 +781,23 @@ ScRefUpdateRes ScRefUpdate::Move( ScDocument* pDoc, const ScAddress& rPos,
SCsTAB nMaxTab = (SCsTAB) pDoc->GetTableCount() - 1;
if( bAbsolute || rRef.Ref1.IsTabRel() )
{
+ SCTAB nRefTab1 = rRefRange.aStart.Tab();
if( bWrap )
- lcl_MoveItWrap( rRef.Ref1.nTab, nDz, static_cast<SCTAB>(nMaxTab) );
+ lcl_MoveItWrap(nRefTab1, nDz, static_cast<SCTAB>(nMaxTab));
else
- bCut1 = lcl_MoveItCut( rRef.Ref1.nTab, nDz, static_cast<SCTAB>(nMaxTab) );
- rRef.Ref1.SetFlag3D( rPos.Tab() != rRef.Ref1.nTab );
+ bCut1 = lcl_MoveItCut(nRefTab1, nDz, static_cast<SCTAB>(nMaxTab));
+ rRefRange.aStart.SetTab(nRefTab1);
+ rRef.Ref1.SetFlag3D(rPos.Tab() != rRefRange.aStart.Tab());
}
if( bAbsolute || rRef.Ref2.IsTabRel() )
{
+ SCTAB nRefTab2 = rRefRange.aEnd.Tab();
if( bWrap )
- lcl_MoveItWrap( rRef.Ref2.nTab, nDz, static_cast<SCTAB>(nMaxTab) );
+ lcl_MoveItWrap(nRefTab2, nDz, static_cast<SCTAB>(nMaxTab));
else
- bCut2 = lcl_MoveItCut( rRef.Ref2.nTab, nDz, static_cast<SCTAB>(nMaxTab) );
- rRef.Ref2.SetFlag3D( rPos.Tab() != rRef.Ref2.nTab );
+ bCut2 = lcl_MoveItCut(nRefTab2, nDz, static_cast<SCTAB>(nMaxTab));
+ rRefRange.aEnd.SetTab(nRefTab2);
+ rRef.Ref2.SetFlag3D(rPos.Tab() != rRefRange.aEnd.Tab());
}
if ( bCut1 || bCut2 )
eRet = UR_UPDATED;
@@ -792,18 +810,20 @@ ScRefUpdateRes ScRefUpdate::Move( ScDocument* pDoc, const ScAddress& rPos,
if ( eRet == UR_NOTHING )
{
- if (oldCol1 != rRef.Ref1.nCol
- || oldRow1 != rRef.Ref1.nRow
- || oldTab1 != rRef.Ref1.nTab
- || oldCol2 != rRef.Ref2.nCol
- || oldRow2 != rRef.Ref2.nRow
- || oldTab2 != rRef.Ref2.nTab
+ if (nOldCol1 != rRef.Ref1.nCol
+ || nOldRow1 != rRef.Ref1.nRow
+ || nOldTab1 != rRef.Ref1.nTab
+ || nOldCol2 != rRef.Ref2.nCol
+ || nOldRow2 != rRef.Ref2.nRow
+ || nOldTab2 != rRef.Ref2.nTab
)
eRet = UR_UPDATED;
}
if ( bWrap && eRet != UR_NOTHING )
+ {
rRef.PutInOrder();
- rRef.CalcRelFromAbs( rPos );
+ rRefRange.PutInOrder();
+ }
return eRet;
}
More information about the Libreoffice-commits
mailing list