replaceRangeAndUpdateSelection method
Replaces [start, end) with replacement and remaps the selection.
Implementation
SelectionState replaceRangeAndUpdateSelection({
required int start,
required int end,
required String replacement,
required bool preserveOldCursor,
required int oldBase,
required int oldExtent,
}) {
final safeStart = start.clamp(0, length);
final safeEnd = end.clamp(safeStart, length);
final removedLength = safeEnd - safeStart;
final replacementLength = replacement.length;
replace(safeStart, safeEnd, replacement);
int mapOffset(int offset) {
if (offset <= safeStart) return offset;
if (offset >= safeEnd) return offset + replacementLength - removedLength;
return safeStart + math.min(offset - safeStart, replacementLength);
}
final endOffset = safeStart + replacementLength;
final total = length;
_selection = SelectionState(
baseOffset: (preserveOldCursor ? mapOffset(oldBase) : endOffset).clamp(
0,
total,
),
extentOffset: (preserveOldCursor ? mapOffset(oldExtent) : endOffset)
.clamp(0, total),
);
return _selection;
}