replaceRangeAndUpdateSelection method

SelectionState replaceRangeAndUpdateSelection({
  1. required int start,
  2. required int end,
  3. required String replacement,
  4. required bool preserveOldCursor,
  5. required int oldBase,
  6. required int oldExtent,
})

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;
}