pressDownArrowKey method

void pressDownArrowKey({
  1. bool isShiftPressed = false,
})

Moves the cursor down one line, maintaining the column position.

If isShiftPressed is true, extends the selection.

Implementation

void pressDownArrowKey({bool isShiftPressed = false}) {
  final currentLine = getLineAtOffset(selection.extentOffset);

  if (currentLine >= lineCount - 1) {
    final endOffset = length;
    if (isShiftPressed) {
      setSelectionSilently(
        TextSelection(
          baseOffset: selection.baseOffset,
          extentOffset: endOffset,
        ),
      );
    } else {
      setSelectionSilently(TextSelection.collapsed(offset: endOffset));
    }
    return;
  }

  final foldAtCurrent = _getFoldRangeAtCurrentLine(currentLine);
  int targetLine;
  if (foldAtCurrent != null && foldAtCurrent.isFolded) {
    targetLine = foldAtCurrent.endIndex + 1;
  } else {
    targetLine = currentLine + 1;
  }

  while (targetLine < lineCount && _isLineInFoldedRegion(targetLine)) {
    final foldStart = _getFoldStartForLine(targetLine);
    if (foldStart != null) {
      final fold = foldings.firstWhere(
        (f) => f.startIndex == foldStart && f.isFolded,
        orElse: () => FoldRange(targetLine, targetLine),
      );
      targetLine = fold.endIndex + 1;
    } else {
      targetLine++;
    }
  }

  if (targetLine >= lineCount) {
    final endOffset = length;
    if (isShiftPressed) {
      setSelectionSilently(
        TextSelection(
          baseOffset: selection.baseOffset,
          extentOffset: endOffset,
        ),
      );
    } else {
      setSelectionSilently(TextSelection.collapsed(offset: endOffset));
    }
    return;
  }

  final lineStart = getLineStartOffset(currentLine);
  final column = selection.extentOffset - lineStart;
  final nextLineStart = getLineStartOffset(targetLine);
  final nextLineText = getLineText(targetLine);
  final nextLineLength = nextLineText.length;
  final newColumn = column.clamp(0, nextLineLength);
  final newOffset = (nextLineStart + newColumn).clamp(0, length);

  if (isShiftPressed) {
    setSelectionSilently(
      TextSelection(
        baseOffset: selection.baseOffset,
        extentOffset: newOffset,
      ),
    );
  } else {
    setSelectionSilently(TextSelection.collapsed(offset: newOffset));
  }
}