duplicateSelectedLinesBelow function
TextLineCommandResult
duplicateSelectedLinesBelow(
- List<
String> lines, { - required TextPosition cursor,
- TextPosition? selectionBase,
- TextPosition? selectionExtent,
Implementation
TextLineCommandResult duplicateSelectedLinesBelow(
List<String> lines, {
required TextPosition cursor,
TextPosition? selectionBase,
TextPosition? selectionExtent,
}) {
final lineTexts = lines.isEmpty ? <String>[''] : List<String>.from(lines);
final clampedCursor = _clampPositionToLines(cursor, lineTexts);
final clampedBase = selectionBase == null
? null
: _clampPositionToLines(selectionBase, lineTexts);
final clampedExtent = selectionExtent == null
? null
: _clampPositionToLines(selectionExtent, lineTexts);
final span = _selectedLineSpan(
clampedCursor,
selectionBase: clampedBase,
selectionExtent: clampedExtent,
);
final startLine = span.startLine;
final endLine = span.endLine;
final blockHeight = endLine - startLine + 1;
final duplicatedLines = lineTexts
.sublist(startLine, endLine + 1)
.map((line) => line)
.toList(growable: false);
lineTexts.insertAll(endLine + 1, duplicatedLines);
final state = EditorState(
line: clampedCursor.line,
column: clampedCursor.column,
);
if (clampedBase != null && clampedExtent != null) {
state.setSelection(
base: clampedBase,
extent: clampedExtent,
cursor: clampedCursor,
);
}
state.shiftRowsInRange(
startLine: startLine,
endLine: endLine,
delta: blockHeight,
maxLine: lineTexts.length - 1,
lineLength: (line) => lineTexts[line].length,
);
return _lineResultFromSnapshot(
lineTexts,
lineSnapshotFromEditorState(
state,
lineCount: lineTexts.length,
lineLength: (line) => lineTexts[line].length,
),
);
}