| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- /*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
- import { SingleCursorState } from '../cursorCommon.js';
- import { Position } from '../core/position.js';
- import { Range } from '../core/range.js';
- export class ColumnSelection {
- static columnSelect(config, model, fromLineNumber, fromVisibleColumn, toLineNumber, toVisibleColumn) {
- const lineCount = Math.abs(toLineNumber - fromLineNumber) + 1;
- const reversed = (fromLineNumber > toLineNumber);
- const isRTL = (fromVisibleColumn > toVisibleColumn);
- const isLTR = (fromVisibleColumn < toVisibleColumn);
- const result = [];
- // console.log(`fromVisibleColumn: ${fromVisibleColumn}, toVisibleColumn: ${toVisibleColumn}`);
- for (let i = 0; i < lineCount; i++) {
- const lineNumber = fromLineNumber + (reversed ? -i : i);
- const startColumn = config.columnFromVisibleColumn(model, lineNumber, fromVisibleColumn);
- const endColumn = config.columnFromVisibleColumn(model, lineNumber, toVisibleColumn);
- const visibleStartColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, startColumn));
- const visibleEndColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, endColumn));
- // console.log(`lineNumber: ${lineNumber}: visibleStartColumn: ${visibleStartColumn}, visibleEndColumn: ${visibleEndColumn}`);
- if (isLTR) {
- if (visibleStartColumn > toVisibleColumn) {
- continue;
- }
- if (visibleEndColumn < fromVisibleColumn) {
- continue;
- }
- }
- if (isRTL) {
- if (visibleEndColumn > fromVisibleColumn) {
- continue;
- }
- if (visibleStartColumn < toVisibleColumn) {
- continue;
- }
- }
- result.push(new SingleCursorState(new Range(lineNumber, startColumn, lineNumber, startColumn), 0, new Position(lineNumber, endColumn), 0));
- }
- if (result.length === 0) {
- // We are after all the lines, so add cursor at the end of each line
- for (let i = 0; i < lineCount; i++) {
- const lineNumber = fromLineNumber + (reversed ? -i : i);
- const maxColumn = model.getLineMaxColumn(lineNumber);
- result.push(new SingleCursorState(new Range(lineNumber, maxColumn, lineNumber, maxColumn), 0, new Position(lineNumber, maxColumn), 0));
- }
- }
- return {
- viewStates: result,
- reversed: reversed,
- fromLineNumber: fromLineNumber,
- fromVisualColumn: fromVisibleColumn,
- toLineNumber: toLineNumber,
- toVisualColumn: toVisibleColumn
- };
- }
- static columnSelectLeft(config, model, prevColumnSelectData) {
- let toViewVisualColumn = prevColumnSelectData.toViewVisualColumn;
- if (toViewVisualColumn > 0) {
- toViewVisualColumn--;
- }
- return ColumnSelection.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, prevColumnSelectData.toViewLineNumber, toViewVisualColumn);
- }
- static columnSelectRight(config, model, prevColumnSelectData) {
- let maxVisualViewColumn = 0;
- const minViewLineNumber = Math.min(prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.toViewLineNumber);
- const maxViewLineNumber = Math.max(prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.toViewLineNumber);
- for (let lineNumber = minViewLineNumber; lineNumber <= maxViewLineNumber; lineNumber++) {
- const lineMaxViewColumn = model.getLineMaxColumn(lineNumber);
- const lineMaxVisualViewColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, lineMaxViewColumn));
- maxVisualViewColumn = Math.max(maxVisualViewColumn, lineMaxVisualViewColumn);
- }
- let toViewVisualColumn = prevColumnSelectData.toViewVisualColumn;
- if (toViewVisualColumn < maxVisualViewColumn) {
- toViewVisualColumn++;
- }
- return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, prevColumnSelectData.toViewLineNumber, toViewVisualColumn);
- }
- static columnSelectUp(config, model, prevColumnSelectData, isPaged) {
- const linesCount = isPaged ? config.pageSize : 1;
- const toViewLineNumber = Math.max(1, prevColumnSelectData.toViewLineNumber - linesCount);
- return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, toViewLineNumber, prevColumnSelectData.toViewVisualColumn);
- }
- static columnSelectDown(config, model, prevColumnSelectData, isPaged) {
- const linesCount = isPaged ? config.pageSize : 1;
- const toViewLineNumber = Math.min(model.getLineCount(), prevColumnSelectData.toViewLineNumber + linesCount);
- return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, toViewLineNumber, prevColumnSelectData.toViewVisualColumn);
- }
- }
|