diff --git a/src/vs/editor/browser/view/domLineBreaksComputer.ts b/src/vs/editor/browser/view/domLineBreaksComputer.ts index 0d8f1683bff..0c1b68b56f7 100644 --- a/src/vs/editor/browser/view/domLineBreaksComputer.ts +++ b/src/vs/editor/browser/view/domLineBreaksComputer.ts @@ -3,14 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ILineBreaksComputerFactory } from 'vs/editor/common/viewModel/splitLinesCollection'; import { WrappingIndent } from 'vs/editor/common/config/editorOptions'; import { FontInfo } from 'vs/editor/common/config/fontInfo'; import { createStringBuilder, IStringBuilder } from 'vs/editor/common/core/stringBuilder'; import { CharCode } from 'vs/base/common/charCode'; import * as strings from 'vs/base/common/strings'; import { Configuration } from 'vs/editor/browser/config/configuration'; -import { ILineBreaksComputer, LineBreakData } from 'vs/editor/common/viewModel/viewModel'; +import { ILineBreaksComputer, ILineBreaksComputerFactory, LineBreakData } from 'vs/editor/common/viewModel/viewModel'; import { LineInjectedText } from 'vs/editor/common/model/textModelEvents'; import { InjectedTextOptions } from 'vs/editor/common/model'; diff --git a/src/vs/editor/common/viewModel/monospaceLineBreaksComputer.ts b/src/vs/editor/common/viewModel/monospaceLineBreaksComputer.ts index 6b8f0644953..b7e43dc0e34 100644 --- a/src/vs/editor/common/viewModel/monospaceLineBreaksComputer.ts +++ b/src/vs/editor/common/viewModel/monospaceLineBreaksComputer.ts @@ -7,9 +7,8 @@ import { CharCode } from 'vs/base/common/charCode'; import * as strings from 'vs/base/common/strings'; import { WrappingIndent, IComputedEditorOptions, EditorOption } from 'vs/editor/common/config/editorOptions'; import { CharacterClassifier } from 'vs/editor/common/core/characterClassifier'; -import { ILineBreaksComputerFactory } from 'vs/editor/common/viewModel/splitLinesCollection'; import { FontInfo } from 'vs/editor/common/config/fontInfo'; -import { ILineBreaksComputer, LineBreakData } from 'vs/editor/common/viewModel/viewModel'; +import { ILineBreaksComputer, ILineBreaksComputerFactory, LineBreakData } from 'vs/editor/common/viewModel/viewModel'; import { LineInjectedText } from 'vs/editor/common/model/textModelEvents'; import { InjectedTextOptions } from 'vs/editor/common/model'; diff --git a/src/vs/editor/common/viewModel/splitLinesCollection.ts b/src/vs/editor/common/viewModel/splitLinesCollection.ts index a282875de7d..79864805854 100644 --- a/src/vs/editor/common/viewModel/splitLinesCollection.ts +++ b/src/vs/editor/common/viewModel/splitLinesCollection.ts @@ -15,12 +15,7 @@ import { LineInjectedText } from 'vs/editor/common/model/textModelEvents'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { createModelLineProjection, IModelLineProjection } from 'vs/editor/common/viewModel/modelLineProjection'; import { ConstantTimePrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer'; -import { ICoordinatesConverter, ILineBreaksComputer, InjectedText, LineBreakData, ViewLineData } from 'vs/editor/common/viewModel/viewModel'; - -export interface ILineBreaksComputerFactory { - createLineBreaksComputer(fontInfo: FontInfo, tabSize: number, wrappingColumn: number, wrappingIndent: WrappingIndent): ILineBreaksComputer; -} - +import { ICoordinatesConverter, ILineBreaksComputer, ILineBreaksComputerFactory, InjectedText, LineBreakData, ViewLineData } from 'vs/editor/common/viewModel/viewModel'; export interface IViewModelLinesCollection extends IDisposable { createCoordinatesConverter(): ICoordinatesConverter; @@ -60,63 +55,7 @@ export interface IViewModelLinesCollection extends IDisposable { getLineIndentColumn(lineNumber: number): number; } -export class CoordinatesConverter implements ICoordinatesConverter { - - private readonly _lines: SplitLinesCollection; - - constructor(lines: SplitLinesCollection) { - this._lines = lines; - } - - // View -> Model conversion and related methods - - public convertViewPositionToModelPosition(viewPosition: Position): Position { - return this._lines.convertViewPositionToModelPosition(viewPosition.lineNumber, viewPosition.column); - } - - public convertViewRangeToModelRange(viewRange: Range): Range { - return this._lines.convertViewRangeToModelRange(viewRange); - } - - public validateViewPosition(viewPosition: Position, expectedModelPosition: Position): Position { - return this._lines.validateViewPosition(viewPosition.lineNumber, viewPosition.column, expectedModelPosition); - } - - public validateViewRange(viewRange: Range, expectedModelRange: Range): Range { - return this._lines.validateViewRange(viewRange, expectedModelRange); - } - - // Model -> View conversion and related methods - - public convertModelPositionToViewPosition(modelPosition: Position, affinity?: PositionAffinity): Position { - return this._lines.convertModelPositionToViewPosition(modelPosition.lineNumber, modelPosition.column, affinity); - } - - public convertModelRangeToViewRange(modelRange: Range, affinity?: PositionAffinity): Range { - return this._lines.convertModelRangeToViewRange(modelRange, affinity); - } - - public modelPositionIsVisible(modelPosition: Position): boolean { - return this._lines.modelPositionIsVisible(modelPosition.lineNumber, modelPosition.column); - } - - public getModelLineViewLineCount(modelLineNumber: number): number { - return this._lines.getModelLineViewLineCount(modelLineNumber); - } - - public getViewLineNumberOfModelPosition(modelLineNumber: number, modelColumn: number): number { - return this._lines.getViewLineNumberOfModelPosition(modelLineNumber, modelColumn); - } -} - -const enum IndentGuideRepeatOption { - BlockNone = 0, - BlockSubsequent = 1, - BlockAll = 2 -} - export class SplitLinesCollection implements IViewModelLinesCollection { - private readonly _editorId: number; private readonly model: ITextModel; private _validModelVersionId: number; @@ -133,7 +72,7 @@ export class SplitLinesCollection implements IViewModelLinesCollection { private modelLineProjections!: IModelLineProjection[]; /** - * Reflects the sum of the line counts of all . + * Reflects the sum of the line counts of all projected model lines. */ private projectedModelLineLineCounts!: ConstantTimePrefixSumComputer; @@ -1027,70 +966,61 @@ class ViewLineInfoGroupedByModelRange { } } -export class IdentityCoordinatesConverter implements ICoordinatesConverter { +class CoordinatesConverter implements ICoordinatesConverter { + private readonly _lines: SplitLinesCollection; - private readonly _lines: IdentityLinesCollection; - - constructor(lines: IdentityLinesCollection) { + constructor(lines: SplitLinesCollection) { this._lines = lines; } - private _validPosition(pos: Position): Position { - return this._lines.model.validatePosition(pos); - } - - private _validRange(range: Range): Range { - return this._lines.model.validateRange(range); - } - // View -> Model conversion and related methods public convertViewPositionToModelPosition(viewPosition: Position): Position { - return this._validPosition(viewPosition); + return this._lines.convertViewPositionToModelPosition(viewPosition.lineNumber, viewPosition.column); } public convertViewRangeToModelRange(viewRange: Range): Range { - return this._validRange(viewRange); + return this._lines.convertViewRangeToModelRange(viewRange); } - public validateViewPosition(_viewPosition: Position, expectedModelPosition: Position): Position { - return this._validPosition(expectedModelPosition); + public validateViewPosition(viewPosition: Position, expectedModelPosition: Position): Position { + return this._lines.validateViewPosition(viewPosition.lineNumber, viewPosition.column, expectedModelPosition); } - public validateViewRange(_viewRange: Range, expectedModelRange: Range): Range { - return this._validRange(expectedModelRange); + public validateViewRange(viewRange: Range, expectedModelRange: Range): Range { + return this._lines.validateViewRange(viewRange, expectedModelRange); } // Model -> View conversion and related methods - public convertModelPositionToViewPosition(modelPosition: Position): Position { - return this._validPosition(modelPosition); + public convertModelPositionToViewPosition(modelPosition: Position, affinity?: PositionAffinity): Position { + return this._lines.convertModelPositionToViewPosition(modelPosition.lineNumber, modelPosition.column, affinity); } - public convertModelRangeToViewRange(modelRange: Range): Range { - return this._validRange(modelRange); + public convertModelRangeToViewRange(modelRange: Range, affinity?: PositionAffinity): Range { + return this._lines.convertModelRangeToViewRange(modelRange, affinity); } public modelPositionIsVisible(modelPosition: Position): boolean { - const lineCount = this._lines.model.getLineCount(); - if (modelPosition.lineNumber < 1 || modelPosition.lineNumber > lineCount) { - // invalid arguments - return false; - } - return true; + return this._lines.modelPositionIsVisible(modelPosition.lineNumber, modelPosition.column); } public getModelLineViewLineCount(modelLineNumber: number): number { - return 1; + return this._lines.getModelLineViewLineCount(modelLineNumber); } public getViewLineNumberOfModelPosition(modelLineNumber: number, modelColumn: number): number { - return modelLineNumber; + return this._lines.getViewLineNumberOfModelPosition(modelLineNumber, modelColumn); } } -export class IdentityLinesCollection implements IViewModelLinesCollection { +const enum IndentGuideRepeatOption { + BlockNone = 0, + BlockSubsequent = 1, + BlockAll = 2 +} +export class IdentityLinesCollection implements IViewModelLinesCollection { public readonly model: ITextModel; constructor(model: ITextModel) { @@ -1239,3 +1169,64 @@ export class IdentityLinesCollection implements IViewModelLinesCollection { return null; } } + +class IdentityCoordinatesConverter implements ICoordinatesConverter { + private readonly _lines: IdentityLinesCollection; + + constructor(lines: IdentityLinesCollection) { + this._lines = lines; + } + + private _validPosition(pos: Position): Position { + return this._lines.model.validatePosition(pos); + } + + private _validRange(range: Range): Range { + return this._lines.model.validateRange(range); + } + + // View -> Model conversion and related methods + + public convertViewPositionToModelPosition(viewPosition: Position): Position { + return this._validPosition(viewPosition); + } + + public convertViewRangeToModelRange(viewRange: Range): Range { + return this._validRange(viewRange); + } + + public validateViewPosition(_viewPosition: Position, expectedModelPosition: Position): Position { + return this._validPosition(expectedModelPosition); + } + + public validateViewRange(_viewRange: Range, expectedModelRange: Range): Range { + return this._validRange(expectedModelRange); + } + + // Model -> View conversion and related methods + + public convertModelPositionToViewPosition(modelPosition: Position): Position { + return this._validPosition(modelPosition); + } + + public convertModelRangeToViewRange(modelRange: Range): Range { + return this._validRange(modelRange); + } + + public modelPositionIsVisible(modelPosition: Position): boolean { + const lineCount = this._lines.model.getLineCount(); + if (modelPosition.lineNumber < 1 || modelPosition.lineNumber > lineCount) { + // invalid arguments + return false; + } + return true; + } + + public getModelLineViewLineCount(modelLineNumber: number): number { + return 1; + } + + public getViewLineNumberOfModelPosition(modelLineNumber: number, modelColumn: number): number { + return modelLineNumber; + } +} diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index d0df4c3e266..cb4f9ff296d 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -18,6 +18,8 @@ import { ICursorSimpleModel, PartialCursorState, CursorState, IColumnSelectData, import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; import { LineInjectedText } from 'vs/editor/common/model/textModelEvents'; +import { FontInfo } from 'vs/editor/common/config/fontInfo'; +import { WrappingIndent } from 'vs/editor/common/config/editorOptions'; export interface IViewWhitespaceViewportData { readonly id: string; @@ -290,6 +292,10 @@ export class LineBreakData { } } +export interface ILineBreaksComputerFactory { + createLineBreaksComputer(fontInfo: FontInfo, tabSize: number, wrappingColumn: number, wrappingIndent: WrappingIndent): ILineBreaksComputer; +} + export interface ILineBreaksComputer { /** * Pass in `previousLineBreakData` if the only difference is in breaking columns!!! diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 3c0b604a3d9..46e1d177528 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -20,8 +20,8 @@ import { tokenizeLineToHTML } from 'vs/editor/common/modes/textToHtmlTokenizer'; import { MinimapTokensColorTracker } from 'vs/editor/common/viewModel/minimapTokensColorTracker'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { ViewLayout } from 'vs/editor/common/viewLayout/viewLayout'; -import { IViewModelLinesCollection, IdentityLinesCollection, SplitLinesCollection, ILineBreaksComputerFactory } from 'vs/editor/common/viewModel/splitLinesCollection'; -import { ICoordinatesConverter, InjectedText, ILineBreaksComputer, IViewModel, MinimapLinesRenderingData, ViewLineData, ViewLineRenderingData, ViewModelDecoration, OverviewRulerDecorationsGroup } from 'vs/editor/common/viewModel/viewModel'; +import { IViewModelLinesCollection, IdentityLinesCollection, SplitLinesCollection } from 'vs/editor/common/viewModel/splitLinesCollection'; +import { ICoordinatesConverter, InjectedText, ILineBreaksComputer, IViewModel, MinimapLinesRenderingData, ViewLineData, ViewLineRenderingData, ViewModelDecoration, OverviewRulerDecorationsGroup, ILineBreaksComputerFactory } from 'vs/editor/common/viewModel/viewModel'; import { ViewModelDecorations } from 'vs/editor/common/viewModel/viewModelDecorations'; import { RunOnceScheduler } from 'vs/base/common/async'; import * as platform from 'vs/base/common/platform'; diff --git a/src/vs/editor/test/common/viewModel/monospaceLineBreaksComputer.test.ts b/src/vs/editor/test/common/viewModel/monospaceLineBreaksComputer.test.ts index 772c93a40cf..eb8bae9e8dc 100644 --- a/src/vs/editor/test/common/viewModel/monospaceLineBreaksComputer.test.ts +++ b/src/vs/editor/test/common/viewModel/monospaceLineBreaksComputer.test.ts @@ -5,9 +5,8 @@ import * as assert from 'assert'; import { WrappingIndent, EditorOptions } from 'vs/editor/common/config/editorOptions'; import { MonospaceLineBreaksComputerFactory } from 'vs/editor/common/viewModel/monospaceLineBreaksComputer'; -import { ILineBreaksComputerFactory } from 'vs/editor/common/viewModel/splitLinesCollection'; import { FontInfo } from 'vs/editor/common/config/fontInfo'; -import { LineBreakData } from 'vs/editor/common/viewModel/viewModel'; +import { ILineBreaksComputerFactory, LineBreakData } from 'vs/editor/common/viewModel/viewModel'; function parseAnnotatedText(annotatedText: string): { text: string; indices: number[]; } { let text = '';