moveSelectedLines function

TextLineCommandResult moveSelectedLines(
  1. List<String> lines, {
  2. required TextPosition cursor,
  3. TextPosition? selectionBase,
  4. TextPosition? selectionExtent,
  5. required int direction,
})

Implementation

TextLineCommandResult moveSelectedLines(
  List<String> lines, {
  required TextPosition cursor,
  TextPosition? selectionBase,
  TextPosition? selectionExtent,
  required int direction,
}) {
  if (direction != -1 && direction != 1) {
    return _unchangedLineResult(
      lines,
      cursor: cursor,
      selectionBase: selectionBase,
      selectionExtent: 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;

  if (direction < 0 && startLine == 0) {
    return _unchangedLineResult(
      lineTexts,
      cursor: clampedCursor,
      selectionBase: selectionBase,
      selectionExtent: selectionExtent,
    );
  }
  if (direction > 0 && endLine >= lineTexts.length - 1) {
    return _unchangedLineResult(
      lineTexts,
      cursor: clampedCursor,
      selectionBase: selectionBase,
      selectionExtent: selectionExtent,
    );
  }

  final movedLines = lineTexts
      .sublist(startLine, endLine + 1)
      .map((line) => line)
      .toList(growable: false);
  lineTexts.removeRange(startLine, endLine + 1);
  final insertionLine = direction < 0 ? startLine - 1 : startLine + 1;
  lineTexts.insertAll(insertionLine, movedLines);

  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: direction,
    maxLine: lineTexts.length - 1,
    lineLength: (line) => lineTexts[line].length,
  );

  return _lineResultFromSnapshot(
    lineTexts,
    lineSnapshotFromEditorState(
      state,
      lineCount: lineTexts.length,
      lineLength: (line) => lineTexts[line].length,
    ),
  );
}