summaryrefslogtreecommitdiff
path: root/sc/source/core/tool
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/core/tool')
-rw-r--r--sc/source/core/tool/chgtrack.cxx4
-rw-r--r--sc/source/core/tool/token.cxx81
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))