Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/common/coordinatesConverter.ts
3292 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 { Position } from './core/position.js';
7
import { Range } from './core/range.js';
8
import { ITextModel, PositionAffinity } from './model.js';
9
10
export interface ICoordinatesConverter {
11
// View -> Model conversion and related methods
12
convertViewPositionToModelPosition(viewPosition: Position): Position;
13
convertViewRangeToModelRange(viewRange: Range): Range;
14
validateViewPosition(viewPosition: Position, expectedModelPosition: Position): Position;
15
validateViewRange(viewRange: Range, expectedModelRange: Range): Range;
16
17
// Model -> View conversion and related methods
18
/**
19
* @param allowZeroLineNumber Should it return 0 when there are hidden lines at the top and the position is in the hidden area?
20
* @param belowHiddenRanges When the model position is in a hidden area, should it return the first view position after or before?
21
*/
22
convertModelPositionToViewPosition(modelPosition: Position, affinity?: PositionAffinity, allowZeroLineNumber?: boolean, belowHiddenRanges?: boolean): Position;
23
/**
24
* @param affinity Only has an effect if the range is empty.
25
*/
26
convertModelRangeToViewRange(modelRange: Range, affinity?: PositionAffinity): Range;
27
modelPositionIsVisible(modelPosition: Position): boolean;
28
getModelLineViewLineCount(modelLineNumber: number): number;
29
getViewLineNumberOfModelPosition(modelLineNumber: number, modelColumn: number): number;
30
}
31
32
export class IdentityCoordinatesConverter implements ICoordinatesConverter {
33
34
private readonly _model: ITextModel;
35
36
constructor(model: ITextModel) {
37
this._model = model;
38
}
39
40
private _validPosition(pos: Position): Position {
41
return this._model.validatePosition(pos);
42
}
43
44
private _validRange(range: Range): Range {
45
return this._model.validateRange(range);
46
}
47
48
// View -> Model conversion and related methods
49
50
public convertViewPositionToModelPosition(viewPosition: Position): Position {
51
return this._validPosition(viewPosition);
52
}
53
54
public convertViewRangeToModelRange(viewRange: Range): Range {
55
return this._validRange(viewRange);
56
}
57
58
public validateViewPosition(_viewPosition: Position, expectedModelPosition: Position): Position {
59
return this._validPosition(expectedModelPosition);
60
}
61
62
public validateViewRange(_viewRange: Range, expectedModelRange: Range): Range {
63
return this._validRange(expectedModelRange);
64
}
65
66
// Model -> View conversion and related methods
67
68
public convertModelPositionToViewPosition(modelPosition: Position): Position {
69
return this._validPosition(modelPosition);
70
}
71
72
public convertModelRangeToViewRange(modelRange: Range): Range {
73
return this._validRange(modelRange);
74
}
75
76
public modelPositionIsVisible(modelPosition: Position): boolean {
77
const lineCount = this._model.getLineCount();
78
if (modelPosition.lineNumber < 1 || modelPosition.lineNumber > lineCount) {
79
// invalid arguments
80
return false;
81
}
82
return true;
83
}
84
85
public modelRangeIsVisible(modelRange: Range): boolean {
86
const lineCount = this._model.getLineCount();
87
if (modelRange.startLineNumber < 1 || modelRange.startLineNumber > lineCount) {
88
// invalid arguments
89
return false;
90
}
91
if (modelRange.endLineNumber < 1 || modelRange.endLineNumber > lineCount) {
92
// invalid arguments
93
return false;
94
}
95
return true;
96
}
97
98
public getModelLineViewLineCount(modelLineNumber: number): number {
99
return 1;
100
}
101
102
public getViewLineNumberOfModelPosition(modelLineNumber: number, modelColumn: number): number {
103
return modelLineNumber;
104
}
105
}
106
107