Path: blob/main/src/vs/editor/contrib/linesOperations/browser/copyLinesCommand.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { Range } from '../../../common/core/range.js';6import { Selection, SelectionDirection } from '../../../common/core/selection.js';7import { ICommand, ICursorStateComputerData, IEditOperationBuilder } from '../../../common/editorCommon.js';8import { ITextModel } from '../../../common/model.js';910export class CopyLinesCommand implements ICommand {1112private readonly _selection: Selection;13private readonly _isCopyingDown: boolean;14private readonly _noop: boolean;1516private _selectionDirection: SelectionDirection;17private _selectionId: string | null;18private _startLineNumberDelta: number;19private _endLineNumberDelta: number;2021constructor(selection: Selection, isCopyingDown: boolean, noop?: boolean) {22this._selection = selection;23this._isCopyingDown = isCopyingDown;24this._noop = noop || false;25this._selectionDirection = SelectionDirection.LTR;26this._selectionId = null;27this._startLineNumberDelta = 0;28this._endLineNumberDelta = 0;29}3031public getEditOperations(model: ITextModel, builder: IEditOperationBuilder): void {32let s = this._selection;3334this._startLineNumberDelta = 0;35this._endLineNumberDelta = 0;36if (s.startLineNumber < s.endLineNumber && s.endColumn === 1) {37this._endLineNumberDelta = 1;38s = s.setEndPosition(s.endLineNumber - 1, model.getLineMaxColumn(s.endLineNumber - 1));39}4041const sourceLines: string[] = [];42for (let i = s.startLineNumber; i <= s.endLineNumber; i++) {43sourceLines.push(model.getLineContent(i));44}45const sourceText = sourceLines.join('\n');4647if (sourceText === '') {48// Duplicating empty line49if (this._isCopyingDown) {50this._startLineNumberDelta++;51this._endLineNumberDelta++;52}53}5455if (this._noop) {56builder.addEditOperation(new Range(s.endLineNumber, model.getLineMaxColumn(s.endLineNumber), s.endLineNumber + 1, 1), s.endLineNumber === model.getLineCount() ? '' : '\n');57} else {58if (!this._isCopyingDown) {59builder.addEditOperation(new Range(s.endLineNumber, model.getLineMaxColumn(s.endLineNumber), s.endLineNumber, model.getLineMaxColumn(s.endLineNumber)), '\n' + sourceText);60} else {61builder.addEditOperation(new Range(s.startLineNumber, 1, s.startLineNumber, 1), sourceText + '\n');62}63}6465this._selectionId = builder.trackSelection(s);66this._selectionDirection = this._selection.getDirection();67}6869public computeCursorState(model: ITextModel, helper: ICursorStateComputerData): Selection {70let result = helper.getTrackedSelection(this._selectionId!);7172if (this._startLineNumberDelta !== 0 || this._endLineNumberDelta !== 0) {73let startLineNumber = result.startLineNumber;74let startColumn = result.startColumn;75let endLineNumber = result.endLineNumber;76let endColumn = result.endColumn;7778if (this._startLineNumberDelta !== 0) {79startLineNumber = startLineNumber + this._startLineNumberDelta;80startColumn = 1;81}8283if (this._endLineNumberDelta !== 0) {84endLineNumber = endLineNumber + this._endLineNumberDelta;85endColumn = 1;86}8788result = Selection.createWithDirection(startLineNumber, startColumn, endLineNumber, endColumn, this._selectionDirection);89}9091return result;92}93}949596