diff options
Diffstat (limited to 'sc/source/core/tool')
-rw-r--r-- | sc/source/core/tool/chgtrack.cxx | 4 | ||||
-rw-r--r-- | sc/source/core/tool/token.cxx | 81 |
2 files changed, 71 insertions, 14 deletions
diff --git a/sc/source/core/tool/chgtrack.cxx b/sc/source/core/tool/chgtrack.cxx index 29dfcc66fe18..6b132adfb1ce 100644 --- a/sc/source/core/tool/chgtrack.cxx +++ b/sc/source/core/tool/chgtrack.cxx @@ -1303,7 +1303,7 @@ bool ScChangeActionMove::Reject( ScDocument* pDoc ) pDoc->DeleteAreaTab( aToRange, IDF_ALL ); pDoc->DeleteAreaTab( aFrmRange, IDF_ALL ); // Formeln im Dokument anpassen - sc::RefUpdateContext aCxt; + sc::RefUpdateContext aCxt(*pDoc); aCxt.meMode = URM_MOVE; aCxt.maRange = aFrmRange; aCxt.mnColDelta = aFrmRange.aStart.Col() - aToRange.aStart.Col(); @@ -2098,7 +2098,7 @@ void ScChangeActionContent::UpdateReference( const ScChangeTrack* pTrack, } ScRange aRange( aTmpRange.MakeRange() ); - sc::RefUpdateContext aRefCxt; + sc::RefUpdateContext aRefCxt(*pTrack->GetDocument()); aRefCxt.meMode = eMode; aRefCxt.maRange = aRange; aRefCxt.mnColDelta = nDx; diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx index 30bef7b4fce5..659588139d80 100644 --- a/sc/source/core/tool/token.cxx +++ b/sc/source/core/tool/token.cxx @@ -2296,43 +2296,91 @@ bool shrinkRange( const sc::RefUpdateContext& rCxt, ScRange& rRefRange, const Sc return false; } -bool expandRange( const sc::RefUpdateContext& rCxt, ScRange& rRefRange, const ScRange& rInsertedRange ) +bool expandRange( const sc::RefUpdateContext& rCxt, ScRange& rRefRange, const ScRange& rSelectedRange ) { + if (!rSelectedRange.Intersects(rRefRange)) + return false; + if (rCxt.mnColDelta > 0) { // Insert and shifting right. - if (rRefRange.aStart.Row() < rInsertedRange.aStart.Row() || rInsertedRange.aEnd.Row() < rRefRange.aEnd.Row()) - // Inserted range is only partially overlapping in vertical direction. Bail out. + if (rRefRange.aStart.Row() < rSelectedRange.aStart.Row() || rSelectedRange.aEnd.Row() < rRefRange.aEnd.Row()) + // Selected range is only partially overlapping in vertical direction. Bail out. return false; - if (rInsertedRange.aStart.Col() == rRefRange.aStart.Col()) - // Inserted range is at the left end. No expansion. + if (!rCxt.mrDoc.IsExpandRefs() && rSelectedRange.aStart.Col() == rRefRange.aStart.Col()) + // Selected range is at the left end and the edge expansion is turned off. No expansion. return false; // Move the last column position to the right. - SCCOL nDelta = rInsertedRange.aEnd.Col() - rInsertedRange.aStart.Col() + 1; + SCCOL nDelta = rSelectedRange.aEnd.Col() - rSelectedRange.aStart.Col() + 1; rRefRange.aEnd.IncCol(nDelta); return true; } else if (rCxt.mnRowDelta > 0) { // Insert and shifting down. - if (rRefRange.aStart.Col() < rInsertedRange.aStart.Col() || rInsertedRange.aEnd.Col() < rRefRange.aEnd.Col()) - // Inserted range is only partially overlapping in horizontal direction. Bail out. + if (rRefRange.aStart.Col() < rSelectedRange.aStart.Col() || rSelectedRange.aEnd.Col() < rRefRange.aEnd.Col()) + // Selected range is only partially overlapping in horizontal direction. Bail out. return false; - if (rInsertedRange.aStart.Row() == rRefRange.aStart.Row()) - // Inserted range is at the top end. No expansion. + if (!rCxt.mrDoc.IsExpandRefs() && rSelectedRange.aStart.Row() == rRefRange.aStart.Row()) + // Selected range is at the top end and the edge expansion is turned off. No expansion. return false; // Move the last row position down. - SCROW nDelta = rInsertedRange.aEnd.Row() - rInsertedRange.aStart.Row() + 1; + SCROW nDelta = rSelectedRange.aEnd.Row() - rSelectedRange.aStart.Row() + 1; rRefRange.aEnd.IncRow(nDelta); return true; } return false; } +/** + * Check if the referenced range is expandable when the selected range is + * not overlapping the referenced range. + */ +bool expandRangeByEdge( const sc::RefUpdateContext& rCxt, ScRange& rRefRange, const ScRange& rSelectedRange ) +{ + if (!rCxt.mrDoc.IsExpandRefs()) + // Edge-expansion is turned off. + return false; + + if (rCxt.mnColDelta > 0) + { + // Insert and shift right. + if (rRefRange.aStart.Row() < rSelectedRange.aStart.Row() || rSelectedRange.aEnd.Row() < rRefRange.aEnd.Row()) + // Selected range is only partially overlapping in vertical direction. Bail out. + return false; + + if (rSelectedRange.aStart.Col() - rRefRange.aEnd.Col() != 1) + // Selected range is not immediately adjacent. Bail out. + return false; + + // Move the last column position to the right. + SCCOL nDelta = rSelectedRange.aEnd.Col() - rSelectedRange.aStart.Col() + 1; + rRefRange.aEnd.IncCol(nDelta); + return true; + } + else if (rCxt.mnRowDelta > 0) + { + if (rRefRange.aStart.Col() < rSelectedRange.aStart.Col() || rSelectedRange.aEnd.Col() < rRefRange.aEnd.Col()) + // Selected range is only partially overlapping in horizontal direction. Bail out. + return false; + + if (rSelectedRange.aStart.Row() - rRefRange.aEnd.Row() != 1) + // Selected range is not immediately adjacent. Bail out. + return false; + + // Move the last row position down. + SCROW nDelta = rSelectedRange.aEnd.Row() - rSelectedRange.aStart.Row() + 1; + rRefRange.aEnd.IncRow(nDelta); + return true; + } + + return false; +} + } sc::RefUpdateResult ScTokenArray::AdjustReferenceOnShift( const sc::RefUpdateContext& rCxt, const ScAddress& rOldPos ) @@ -2398,7 +2446,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnShift( const sc::RefUpdateCon } } - if (rCxt.isInserted() && aSelectedRange.Intersects(aAbs)) + if (rCxt.isInserted()) { if (expandRange(rCxt, aAbs, aSelectedRange)) { @@ -2408,6 +2456,15 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnShift( const sc::RefUpdateCon aRes.mbRangeSizeModified = true; break; } + + if (expandRangeByEdge(rCxt, aAbs, aSelectedRange)) + { + // The reference range has been expanded on the edge. + rRef.SetRange(aAbs, aNewPos); + aRes.mbValueChanged = true; + aRes.mbRangeSizeModified = true; + break; + } } if (rCxt.maRange.In(aAbs)) |