Path: blob/main/src/vs/editor/common/coordinatesConverter.ts
3292 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 { Position } from './core/position.js';6import { Range } from './core/range.js';7import { ITextModel, PositionAffinity } from './model.js';89export interface ICoordinatesConverter {10// View -> Model conversion and related methods11convertViewPositionToModelPosition(viewPosition: Position): Position;12convertViewRangeToModelRange(viewRange: Range): Range;13validateViewPosition(viewPosition: Position, expectedModelPosition: Position): Position;14validateViewRange(viewRange: Range, expectedModelRange: Range): Range;1516// Model -> View conversion and related methods17/**18* @param allowZeroLineNumber Should it return 0 when there are hidden lines at the top and the position is in the hidden area?19* @param belowHiddenRanges When the model position is in a hidden area, should it return the first view position after or before?20*/21convertModelPositionToViewPosition(modelPosition: Position, affinity?: PositionAffinity, allowZeroLineNumber?: boolean, belowHiddenRanges?: boolean): Position;22/**23* @param affinity Only has an effect if the range is empty.24*/25convertModelRangeToViewRange(modelRange: Range, affinity?: PositionAffinity): Range;26modelPositionIsVisible(modelPosition: Position): boolean;27getModelLineViewLineCount(modelLineNumber: number): number;28getViewLineNumberOfModelPosition(modelLineNumber: number, modelColumn: number): number;29}3031export class IdentityCoordinatesConverter implements ICoordinatesConverter {3233private readonly _model: ITextModel;3435constructor(model: ITextModel) {36this._model = model;37}3839private _validPosition(pos: Position): Position {40return this._model.validatePosition(pos);41}4243private _validRange(range: Range): Range {44return this._model.validateRange(range);45}4647// View -> Model conversion and related methods4849public convertViewPositionToModelPosition(viewPosition: Position): Position {50return this._validPosition(viewPosition);51}5253public convertViewRangeToModelRange(viewRange: Range): Range {54return this._validRange(viewRange);55}5657public validateViewPosition(_viewPosition: Position, expectedModelPosition: Position): Position {58return this._validPosition(expectedModelPosition);59}6061public validateViewRange(_viewRange: Range, expectedModelRange: Range): Range {62return this._validRange(expectedModelRange);63}6465// Model -> View conversion and related methods6667public convertModelPositionToViewPosition(modelPosition: Position): Position {68return this._validPosition(modelPosition);69}7071public convertModelRangeToViewRange(modelRange: Range): Range {72return this._validRange(modelRange);73}7475public modelPositionIsVisible(modelPosition: Position): boolean {76const lineCount = this._model.getLineCount();77if (modelPosition.lineNumber < 1 || modelPosition.lineNumber > lineCount) {78// invalid arguments79return false;80}81return true;82}8384public modelRangeIsVisible(modelRange: Range): boolean {85const lineCount = this._model.getLineCount();86if (modelRange.startLineNumber < 1 || modelRange.startLineNumber > lineCount) {87// invalid arguments88return false;89}90if (modelRange.endLineNumber < 1 || modelRange.endLineNumber > lineCount) {91// invalid arguments92return false;93}94return true;95}9697public getModelLineViewLineCount(modelLineNumber: number): number {98return 1;99}100101public getViewLineNumberOfModelPosition(modelLineNumber: number, modelColumn: number): number {102return modelLineNumber;103}104}105106107