duplicateSelectedLinesBelow function

TextLineCommandResult duplicateSelectedLinesBelow(
  1. List<String> lines, {
  2. required TextPosition cursor,
  3. TextPosition? selectionBase,
  4. 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,
    ),
  );
}