pressDownArrowKey method
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));
}
}