delete method

void delete()

Remove the selection or the char at cursor position (delete key)

Implementation

void delete() {
  if (readOnly) return;
  if (_undoController?.isUndoRedoInProgress ?? false) return;

  final selectionBefore = _selection;
  final sel = _selection;
  String deletedText;

  if (sel.start < sel.end) {
    _flushBuffer();
    deletedText = _rope.substring(sel.start, sel.end);
    _rope.delete(sel.start, sel.end);
    _currentVersion++;
    _selection = TextSelection.collapsed(offset: sel.start);
    dirtyLine = _rope.getLineAtOffset(sel.start);

    _recordDeletion(sel.start, deletedText, selectionBefore, _selection);
    _syncToConnection();
    notifyListeners();
    return;
  }

  final textLen = length;
  if (sel.start >= textLen) return;

  final deleteOffset = sel.start;

  String charToDelete;
  if (_bufferLineIndex != null && _bufferDirty) {
    final bufferEnd = _bufferLineRopeStart + _bufferLineText!.length;
    if (deleteOffset >= _bufferLineRopeStart && deleteOffset < bufferEnd) {
      charToDelete = _bufferLineText![deleteOffset - _bufferLineRopeStart];
    } else {
      charToDelete = _rope.charAt(deleteOffset);
    }
  } else {
    charToDelete = _rope.charAt(deleteOffset);
  }

  if (charToDelete == '\n') {
    _flushBuffer();
    _rope.delete(deleteOffset, deleteOffset + 1);
    _currentVersion++;
    dirtyLine = _rope.getLineAtOffset(deleteOffset);
    lineStructureChanged = true;

    _recordDeletion(deleteOffset, '\n', selectionBefore, _selection);
    _syncToConnection();
    notifyListeners();
    return;
  }

  if (_bufferLineIndex != null && _bufferDirty) {
    final bufferEnd = _bufferLineRopeStart + _bufferLineText!.length;

    if (deleteOffset >= _bufferLineRopeStart && deleteOffset < bufferEnd) {
      final localOffset = deleteOffset - _bufferLineRopeStart;
      deletedText = _bufferLineText![localOffset];
      _bufferLineText =
          _bufferLineText!.substring(0, localOffset) +
          _bufferLineText!.substring(localOffset + 1);
      _currentVersion++;

      bufferNeedsRepaint = true;

      _recordDeletion(deleteOffset, deletedText, selectionBefore, _selection);
      _scheduleSyncToConnection();
      _scheduleFlush();
      notifyListeners();
      return;
    }
    _flushBuffer();
  }

  final lineIndex = _rope.getLineAtOffset(deleteOffset);
  _initBuffer(lineIndex);

  final localOffset = deleteOffset - _bufferLineRopeStart;
  if (localOffset >= 0 && localOffset < _bufferLineText!.length) {
    deletedText = _bufferLineText![localOffset];
    _bufferLineText =
        _bufferLineText!.substring(0, localOffset) +
        _bufferLineText!.substring(localOffset + 1);
    _bufferDirty = true;
    _currentVersion++;
    dirtyLine = lineIndex;

    bufferNeedsRepaint = true;

    _recordDeletion(deleteOffset, deletedText, selectionBefore, _selection);
    _scheduleSyncToConnection();
    _scheduleFlush();
    notifyListeners();
  }
}