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.yosh...@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; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits