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,
})

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