replaceRangeAndUpdateSelection method
SelectionState
replaceRangeAndUpdateSelection(
{ - required int start,
- required int end,
- required String replacement,
- required bool preserveOldCursor,
- required int oldBase,
- required int oldExtent,
})
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);
delete(safeStart, safeEnd);
insert(safeStart, replacement);
int mapOffset(int offset) {
if (offset <= safeStart) return offset;
if (offset >= safeEnd) {
return (offset + replacement.runes.length - (safeEnd - safeStart))
.clamp(0, length);
}
return (safeStart +
(offset - safeStart).clamp(0, replacement.runes.length))
.clamp(0, length);
}
final endOffset = safeStart + replacement.runes.length;
_selection = SelectionState(
baseOffset: BigInt.from(
(preserveOldCursor ? mapOffset(oldBase) : endOffset).clamp(0, length),
),
extentOffset: BigInt.from(
(preserveOldCursor ? mapOffset(oldExtent) : endOffset).clamp(0, length),
),
);
return _selection;
}