Skip to content

Commit 97c9f5c

Browse files
authored
refactoring : extracting coordinatesConverter code to a separate file (microsoft#254616)
* refactoring * resolving merge conflict * adding change
1 parent 08b4bcb commit 97c9f5c

File tree

9 files changed

+117
-105
lines changed

9 files changed

+117
-105
lines changed

src/vs/editor/browser/view/viewUserInputEvents.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
import { IKeyboardEvent } from '../../../base/browser/keyboardEvent.js';
77
import { IEditorMouseEvent, IMouseTarget, IMouseTargetViewZoneData, IPartialEditorMouseEvent, MouseTargetType } from '../editorBrowser.js';
8-
import { ICoordinatesConverter } from '../../common/viewModel.js';
98
import { IMouseWheelEvent } from '../../../base/browser/mouseEvent.js';
109
import { Position } from '../../common/core/position.js';
10+
import { ICoordinatesConverter } from '../../common/coordinatesConverter.js';
1111

1212
export interface EventCallback<T> {
1313
(event: T): void;
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
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+
}

src/vs/editor/common/cursor/cursor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ import { ITextModel, TrackedRangeStickiness, IModelDeltaDecoration, ICursorState
2020
import { RawContentChangedType, ModelInjectedTextChangedEvent, InternalModelContentChangeEvent } from '../textModelEvents.js';
2121
import { VerticalRevealType, ViewCursorStateChangedEvent, ViewRevealRangeRequestEvent } from '../viewEvents.js';
2222
import { dispose, Disposable } from '../../../base/common/lifecycle.js';
23-
import { ICoordinatesConverter } from '../viewModel.js';
2423
import { CursorStateChangedEvent, ViewModelEventsCollector } from '../viewModelEventDispatcher.js';
2524
import { TextModelEditReason, EditReasons } from '../textModelEditReason.js';
25+
import { ICoordinatesConverter } from '../coordinatesConverter.js';
2626

2727
export class CursorsController extends Disposable {
2828

src/vs/editor/common/cursor/cursorContext.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { ITextModel } from '../model.js';
7-
import { ICoordinatesConverter } from '../viewModel.js';
87
import { CursorConfiguration, ICursorSimpleModel } from '../cursorCommon.js';
8+
import { ICoordinatesConverter } from '../coordinatesConverter.js';
99

1010
export class CursorContext {
1111
_cursorContextBrand: void = undefined;

src/vs/editor/common/viewModel.ts

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66
import * as arrays from '../../base/common/arrays.js';
77
import { IScrollPosition, Scrollable } from '../../base/common/scrollable.js';
88
import * as strings from '../../base/common/strings.js';
9+
import { ICoordinatesConverter } from './coordinatesConverter.js';
910
import { IPosition, Position } from './core/position.js';
1011
import { Range } from './core/range.js';
1112
import { CursorConfiguration, CursorState, EditOperationType, IColumnSelectData, ICursorSimpleModel, PartialCursorState } from './cursorCommon.js';
1213
import { CursorChangeReason } from './cursorEvents.js';
1314
import { INewScrollPosition, ScrollType } from './editorCommon.js';
1415
import { EditorTheme } from './editorTheme.js';
15-
import { EndOfLinePreference, IGlyphMarginLanesModel, IModelDecorationOptions, ITextModel, PositionAffinity } from './model.js';
16+
import { EndOfLinePreference, IGlyphMarginLanesModel, IModelDecorationOptions, ITextModel } from './model.js';
1617
import { ILineBreaksComputer, InjectedText } from './modelLineProjectionData.js';
1718
import { BracketGuideOptions, IActiveIndentGuideInfo, IndentGuide } from './textModelGuides.js';
1819
import { IViewLineTokens } from './tokens/lineTokens.js';
@@ -223,28 +224,6 @@ export class Viewport {
223224
}
224225
}
225226

226-
export interface ICoordinatesConverter {
227-
// View -> Model conversion and related methods
228-
convertViewPositionToModelPosition(viewPosition: Position): Position;
229-
convertViewRangeToModelRange(viewRange: Range): Range;
230-
validateViewPosition(viewPosition: Position, expectedModelPosition: Position): Position;
231-
validateViewRange(viewRange: Range, expectedModelRange: Range): Range;
232-
233-
// Model -> View conversion and related methods
234-
/**
235-
* @param allowZeroLineNumber Should it return 0 when there are hidden lines at the top and the position is in the hidden area?
236-
* @param belowHiddenRanges When the model position is in a hidden area, should it return the first view position after or before?
237-
*/
238-
convertModelPositionToViewPosition(modelPosition: Position, affinity?: PositionAffinity, allowZeroLineNumber?: boolean, belowHiddenRanges?: boolean): Position;
239-
/**
240-
* @param affinity Only has an effect if the range is empty.
241-
*/
242-
convertModelRangeToViewRange(modelRange: Range, affinity?: PositionAffinity): Range;
243-
modelPositionIsVisible(modelPosition: Position): boolean;
244-
getModelLineViewLineCount(modelLineNumber: number): number;
245-
getViewLineNumberOfModelPosition(modelLineNumber: number, modelColumn: number): number;
246-
}
247-
248227
export class MinimapLinesRenderingData {
249228
public readonly tabSize: number;
250229
public readonly data: Array<ViewLineData | null>;

src/vs/editor/common/viewModel/viewModelDecorations.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import { Range } from '../core/range.js';
99
import { IEditorConfiguration } from '../config/editorConfiguration.js';
1010
import { IModelDecoration, ITextModel, PositionAffinity } from '../model.js';
1111
import { IViewModelLines } from './viewModelLines.js';
12-
import { ICoordinatesConverter } from '../viewModel.js';
1312
import { filterFontDecorations, filterValidationDecorations } from '../config/editorOptions.js';
1413
import { isModelDecorationVisible, ViewModelDecoration } from './viewModelDecoration.js';
1514
import { InlineDecoration, InlineDecorationType } from './inlineDecorations.js';
15+
import { ICoordinatesConverter } from '../coordinatesConverter.js';
1616

1717
export interface IDecorationsViewportData {
1818
/**

src/vs/editor/common/viewModel/viewModelImpl.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import { ViewLayout } from '../viewLayout/viewLayout.js';
3434
import { MinimapTokensColorTracker } from './minimapTokensColorTracker.js';
3535
import { ILineBreaksComputer, ILineBreaksComputerFactory, InjectedText } from '../modelLineProjectionData.js';
3636
import { ViewEventHandler } from '../viewEventHandler.js';
37-
import { ICoordinatesConverter, ILineHeightChangeAccessor, IViewModel, IWhitespaceChangeAccessor, MinimapLinesRenderingData, OverviewRulerDecorationsGroup, ViewLineData, ViewLineRenderingData, ViewModelDecoration } from '../viewModel.js';
37+
import { ILineHeightChangeAccessor, IViewModel, IWhitespaceChangeAccessor, MinimapLinesRenderingData, OverviewRulerDecorationsGroup, ViewLineData, ViewLineRenderingData, ViewModelDecoration } from '../viewModel.js';
3838
import { ViewModelDecorations } from './viewModelDecorations.js';
3939
import { FocusChangedEvent, HiddenAreasChangedEvent, ModelContentChangedEvent, ModelDecorationsChangedEvent, ModelFontChangedEvent, ModelLanguageChangedEvent, ModelLanguageConfigurationChangedEvent, ModelLineHeightChangedEvent, ModelOptionsChangedEvent, ModelTokensChangedEvent, OutgoingViewModelEvent, ReadOnlyEditAttemptEvent, ScrollChangedEvent, ViewModelEventDispatcher, ViewModelEventsCollector, ViewZonesChangedEvent, WidgetFocusChangedEvent } from '../viewModelEventDispatcher.js';
4040
import { IViewModelLines, ViewModelLinesFromModelAsIs, ViewModelLinesFromProjectedModel } from './viewModelLines.js';
@@ -43,6 +43,7 @@ import { GlyphMarginLanesModel } from './glyphLanesModel.js';
4343
import { ICustomLineHeightData } from '../viewLayout/lineHeights.js';
4444
import { TextModelEditReason } from '../textModelEditReason.js';
4545
import { InlineDecoration } from './inlineDecorations.js';
46+
import { ICoordinatesConverter } from '../coordinatesConverter.js';
4647

4748
const USE_IDENTITY_LINES_COLLECTION = true;
4849

src/vs/editor/common/viewModel/viewModelLines.ts

Lines changed: 3 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ import * as viewEvents from '../viewEvents.js';
1717
import { createModelLineProjection, IModelLineProjection } from './modelLineProjection.js';
1818
import { ILineBreaksComputer, ModelLineProjectionData, InjectedText, ILineBreaksComputerFactory } from '../modelLineProjectionData.js';
1919
import { ConstantTimePrefixSumComputer } from '../model/prefixSumComputer.js';
20-
import { ICoordinatesConverter, ViewLineData } from '../viewModel.js';
20+
import { ViewLineData } from '../viewModel.js';
21+
import { ICoordinatesConverter, IdentityCoordinatesConverter } from '../coordinatesConverter.js';
2122

2223
export interface IViewModelLines extends IDisposable {
2324
createCoordinatesConverter(): ICoordinatesConverter;
@@ -1120,7 +1121,7 @@ export class ViewModelLinesFromModelAsIs implements IViewModelLines {
11201121
}
11211122

11221123
public createCoordinatesConverter(): ICoordinatesConverter {
1123-
return new IdentityCoordinatesConverter(this);
1124+
return new IdentityCoordinatesConverter(this.model);
11241125
}
11251126

11261127
public getHiddenAreas(): Range[] {
@@ -1255,77 +1256,3 @@ export class ViewModelLinesFromModelAsIs implements IViewModelLines {
12551256
return null;
12561257
}
12571258
}
1258-
1259-
class IdentityCoordinatesConverter implements ICoordinatesConverter {
1260-
private readonly _lines: ViewModelLinesFromModelAsIs;
1261-
1262-
constructor(lines: ViewModelLinesFromModelAsIs) {
1263-
this._lines = lines;
1264-
}
1265-
1266-
private _validPosition(pos: Position): Position {
1267-
return this._lines.model.validatePosition(pos);
1268-
}
1269-
1270-
private _validRange(range: Range): Range {
1271-
return this._lines.model.validateRange(range);
1272-
}
1273-
1274-
// View -> Model conversion and related methods
1275-
1276-
public convertViewPositionToModelPosition(viewPosition: Position): Position {
1277-
return this._validPosition(viewPosition);
1278-
}
1279-
1280-
public convertViewRangeToModelRange(viewRange: Range): Range {
1281-
return this._validRange(viewRange);
1282-
}
1283-
1284-
public validateViewPosition(_viewPosition: Position, expectedModelPosition: Position): Position {
1285-
return this._validPosition(expectedModelPosition);
1286-
}
1287-
1288-
public validateViewRange(_viewRange: Range, expectedModelRange: Range): Range {
1289-
return this._validRange(expectedModelRange);
1290-
}
1291-
1292-
// Model -> View conversion and related methods
1293-
1294-
public convertModelPositionToViewPosition(modelPosition: Position): Position {
1295-
return this._validPosition(modelPosition);
1296-
}
1297-
1298-
public convertModelRangeToViewRange(modelRange: Range): Range {
1299-
return this._validRange(modelRange);
1300-
}
1301-
1302-
public modelPositionIsVisible(modelPosition: Position): boolean {
1303-
const lineCount = this._lines.model.getLineCount();
1304-
if (modelPosition.lineNumber < 1 || modelPosition.lineNumber > lineCount) {
1305-
// invalid arguments
1306-
return false;
1307-
}
1308-
return true;
1309-
}
1310-
1311-
public modelRangeIsVisible(modelRange: Range): boolean {
1312-
const lineCount = this._lines.model.getLineCount();
1313-
if (modelRange.startLineNumber < 1 || modelRange.startLineNumber > lineCount) {
1314-
// invalid arguments
1315-
return false;
1316-
}
1317-
if (modelRange.endLineNumber < 1 || modelRange.endLineNumber > lineCount) {
1318-
// invalid arguments
1319-
return false;
1320-
}
1321-
return true;
1322-
}
1323-
1324-
public getModelLineViewLineCount(modelLineNumber: number): number {
1325-
return 1;
1326-
}
1327-
1328-
public getViewLineNumberOfModelPosition(modelLineNumber: number, modelColumn: number): number {
1329-
return modelLineNumber;
1330-
}
1331-
}

src/vs/workbench/contrib/notebook/browser/contrib/multicursor/notebookMulticursor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import { ILanguageConfigurationService } from '../../../../../../editor/common/l
2929
import { IModelDeltaDecoration, ITextModel, PositionAffinity } from '../../../../../../editor/common/model.js';
3030
import { indentOfLine } from '../../../../../../editor/common/model/textModel.js';
3131
import { ITextModelService } from '../../../../../../editor/common/services/resolverService.js';
32-
import { ICoordinatesConverter } from '../../../../../../editor/common/viewModel.js';
3332
import { ViewModelEventsCollector } from '../../../../../../editor/common/viewModelEventDispatcher.js';
3433
import { IAccessibilityService } from '../../../../../../platform/accessibility/common/accessibility.js';
3534
import { MenuId, registerAction2 } from '../../../../../../platform/actions/common/actions.js';
@@ -48,6 +47,7 @@ import { CellEditorOptions } from '../../view/cellParts/cellEditorOptions.js';
4847
import { NotebookFindContrib } from '../find/notebookFindWidget.js';
4948
import { NotebookTextModel } from '../../../common/model/notebookTextModel.js';
5049
import { NotebookCellTextModel } from '../../../common/model/notebookCellTextModel.js';
50+
import { ICoordinatesConverter } from '../../../../../../editor/common/coordinatesConverter.js';
5151

5252
const NOTEBOOK_ADD_FIND_MATCH_TO_SELECTION_ID = 'notebook.addFindMatchToSelection';
5353
const NOTEBOOK_SELECT_ALL_FIND_MATCHES_ID = 'notebook.selectAllFindMatches';

0 commit comments

Comments
 (0)