Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/common/cursor/cursorColumnSelection.ts
3294 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { CursorConfiguration, ICursorSimpleModel, SingleCursorState, IColumnSelectData, SelectionStartKind } from '../cursorCommon.js';
7
import { Position } from '../core/position.js';
8
import { Range } from '../core/range.js';
9
10
export class ColumnSelection {
11
12
public static columnSelect(config: CursorConfiguration, model: ICursorSimpleModel, fromLineNumber: number, fromVisibleColumn: number, toLineNumber: number, toVisibleColumn: number): IColumnSelectResult {
13
const lineCount = Math.abs(toLineNumber - fromLineNumber) + 1;
14
const reversed = (fromLineNumber > toLineNumber);
15
const isRTL = (fromVisibleColumn > toVisibleColumn);
16
const isLTR = (fromVisibleColumn < toVisibleColumn);
17
18
const result: SingleCursorState[] = [];
19
20
// console.log(`fromVisibleColumn: ${fromVisibleColumn}, toVisibleColumn: ${toVisibleColumn}`);
21
22
for (let i = 0; i < lineCount; i++) {
23
const lineNumber = fromLineNumber + (reversed ? -i : i);
24
25
const startColumn = config.columnFromVisibleColumn(model, lineNumber, fromVisibleColumn);
26
const endColumn = config.columnFromVisibleColumn(model, lineNumber, toVisibleColumn);
27
const visibleStartColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, startColumn));
28
const visibleEndColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, endColumn));
29
30
// console.log(`lineNumber: ${lineNumber}: visibleStartColumn: ${visibleStartColumn}, visibleEndColumn: ${visibleEndColumn}`);
31
32
if (isLTR) {
33
if (visibleStartColumn > toVisibleColumn) {
34
continue;
35
}
36
if (visibleEndColumn < fromVisibleColumn) {
37
continue;
38
}
39
}
40
41
if (isRTL) {
42
if (visibleEndColumn > fromVisibleColumn) {
43
continue;
44
}
45
if (visibleStartColumn < toVisibleColumn) {
46
continue;
47
}
48
}
49
50
result.push(new SingleCursorState(
51
new Range(lineNumber, startColumn, lineNumber, startColumn), SelectionStartKind.Simple, 0,
52
new Position(lineNumber, endColumn), 0
53
));
54
}
55
56
if (result.length === 0) {
57
// We are after all the lines, so add cursor at the end of each line
58
for (let i = 0; i < lineCount; i++) {
59
const lineNumber = fromLineNumber + (reversed ? -i : i);
60
const maxColumn = model.getLineMaxColumn(lineNumber);
61
62
result.push(new SingleCursorState(
63
new Range(lineNumber, maxColumn, lineNumber, maxColumn), SelectionStartKind.Simple, 0,
64
new Position(lineNumber, maxColumn), 0
65
));
66
}
67
}
68
69
return {
70
viewStates: result,
71
reversed: reversed,
72
fromLineNumber: fromLineNumber,
73
fromVisualColumn: fromVisibleColumn,
74
toLineNumber: toLineNumber,
75
toVisualColumn: toVisibleColumn
76
};
77
}
78
79
public static columnSelectLeft(config: CursorConfiguration, model: ICursorSimpleModel, prevColumnSelectData: IColumnSelectData): IColumnSelectResult {
80
let toViewVisualColumn = prevColumnSelectData.toViewVisualColumn;
81
if (toViewVisualColumn > 0) {
82
toViewVisualColumn--;
83
}
84
85
return ColumnSelection.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, prevColumnSelectData.toViewLineNumber, toViewVisualColumn);
86
}
87
88
public static columnSelectRight(config: CursorConfiguration, model: ICursorSimpleModel, prevColumnSelectData: IColumnSelectData): IColumnSelectResult {
89
let maxVisualViewColumn = 0;
90
const minViewLineNumber = Math.min(prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.toViewLineNumber);
91
const maxViewLineNumber = Math.max(prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.toViewLineNumber);
92
for (let lineNumber = minViewLineNumber; lineNumber <= maxViewLineNumber; lineNumber++) {
93
const lineMaxViewColumn = model.getLineMaxColumn(lineNumber);
94
const lineMaxVisualViewColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, lineMaxViewColumn));
95
maxVisualViewColumn = Math.max(maxVisualViewColumn, lineMaxVisualViewColumn);
96
}
97
98
let toViewVisualColumn = prevColumnSelectData.toViewVisualColumn;
99
if (toViewVisualColumn < maxVisualViewColumn) {
100
toViewVisualColumn++;
101
}
102
103
return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, prevColumnSelectData.toViewLineNumber, toViewVisualColumn);
104
}
105
106
public static columnSelectUp(config: CursorConfiguration, model: ICursorSimpleModel, prevColumnSelectData: IColumnSelectData, isPaged: boolean): IColumnSelectResult {
107
const linesCount = isPaged ? config.pageSize : 1;
108
const toViewLineNumber = Math.max(1, prevColumnSelectData.toViewLineNumber - linesCount);
109
return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, toViewLineNumber, prevColumnSelectData.toViewVisualColumn);
110
}
111
112
public static columnSelectDown(config: CursorConfiguration, model: ICursorSimpleModel, prevColumnSelectData: IColumnSelectData, isPaged: boolean): IColumnSelectResult {
113
const linesCount = isPaged ? config.pageSize : 1;
114
const toViewLineNumber = Math.min(model.getLineCount(), prevColumnSelectData.toViewLineNumber + linesCount);
115
return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, toViewLineNumber, prevColumnSelectData.toViewVisualColumn);
116
}
117
}
118
119
export interface IColumnSelectResult {
120
viewStates: SingleCursorState[];
121
reversed: boolean;
122
fromLineNumber: number;
123
fromVisualColumn: number;
124
toLineNumber: number;
125
toVisualColumn: number;
126
}
127
128