monaco-editor-core 0.56.0-dev-20251218 → 0.56.0-dev-20251220
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/nls.messages.cs.js +1 -1
- package/esm/nls.messages.de.js +1 -1
- package/esm/nls.messages.es.js +1 -1
- package/esm/nls.messages.fr.js +1 -1
- package/esm/nls.messages.it.js +1 -1
- package/esm/nls.messages.ja.js +1 -1
- package/esm/nls.messages.ko.js +1 -1
- package/esm/nls.messages.pl.js +1 -1
- package/esm/nls.messages.pt-br.js +1 -1
- package/esm/nls.messages.ru.js +1 -1
- package/esm/nls.messages.tr.js +1 -1
- package/esm/nls.messages.zh-cn.js +1 -1
- package/esm/nls.messages.zh-tw.js +1 -1
- package/esm/vs/base/common/fuzzyScorer.js +3 -2
- package/esm/vs/base/common/fuzzyScorer.js.map +1 -1
- package/esm/vs/editor/common/cursor/cursorTypeEditOperations.js +3 -3
- package/esm/vs/editor/common/cursor/cursorTypeEditOperations.js.map +1 -1
- package/esm/vs/editor/common/viewModel/viewModelImpl.js +4 -15
- package/esm/vs/editor/common/viewModel/viewModelImpl.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js +2 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.js +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/model/renameSymbolProcessor.js +2 -2
- package/esm/vs/editor/contrib/inlineCompletions/browser/model/renameSymbolProcessor.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js +6 -6
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js +13 -11
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCustomView.js +5 -7
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCustomView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsDeletionView.js +6 -5
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsDeletionView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsInsertionView.js +6 -5
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsInsertionView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsLineReplacementView.js +9 -7
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsLineReplacementView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsSideBySideView.js +14 -9
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsSideBySideView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsWordReplacementView.js +9 -7
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsWordReplacementView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/inlineEditsLongDistanceHint.js +5 -4
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/inlineEditsLongDistanceHint.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/originalEditorInlineDiffView.js +2 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/originalEditorInlineDiffView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js +20 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/quickInput.js +3 -37
- package/esm/vs/platform/quickinput/browser/quickInput.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/quickInputController.js +1 -0
- package/esm/vs/platform/quickinput/browser/quickInputController.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/quickInputUtils.js +1 -1
- package/esm/vs/platform/quickinput/browser/quickInputUtils.js.map +1 -1
- package/esm/vs/platform/quickinput/common/quickInput.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/common/viewModel/viewModelImpl.ts","vs/editor/common/viewModel/viewModelImpl.ts"],"names":[],"mappings":"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","file":"viewModelImpl.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ArrayQueue } from '../../../base/common/arrays.js';\nimport { RunOnceScheduler } from '../../../base/common/async.js';\nimport { Color } from '../../../base/common/color.js';\nimport { Event } from '../../../base/common/event.js';\nimport { Disposable, IDisposable } from '../../../base/common/lifecycle.js';\nimport * as platform from '../../../base/common/platform.js';\nimport * as strings from '../../../base/common/strings.js';\nimport { ConfigurationChangedEvent, EditorOption, filterValidationDecorations, filterFontDecorations } from '../config/editorOptions.js';\nimport { EDITOR_FONT_DEFAULTS } from '../config/fontInfo.js';\nimport { CursorsController } from '../cursor/cursor.js';\nimport { CursorConfiguration, CursorState, EditOperationType, IColumnSelectData, PartialCursorState } from '../cursorCommon.js';\nimport { CursorChangeReason } from '../cursorEvents.js';\nimport { IPosition, Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { ISelection, Selection } from '../core/selection.js';\nimport { ICommand, ICursorState, IViewState, ScrollType } from '../editorCommon.js';\nimport { IEditorConfiguration } from '../config/editorConfiguration.js';\nimport { EndOfLinePreference, IAttachedView, ICursorStateComputer, IGlyphMarginLanesModel, IIdentifiedSingleEditOperation, ITextModel, PositionAffinity, TextDirection, TrackedRangeStickiness } from '../model.js';\nimport { IActiveIndentGuideInfo, BracketGuideOptions, IndentGuide } from '../textModelGuides.js';\nimport { ModelDecorationMinimapOptions, ModelDecorationOptions, ModelDecorationOverviewRulerOptions } from '../model/textModel.js';\nimport * as textModelEvents from '../textModelEvents.js';\nimport { TokenizationRegistry } from '../languages.js';\nimport { ColorId } from '../encodedTokenAttributes.js';\nimport { ILanguageConfigurationService } from '../languages/languageConfigurationRegistry.js';\nimport { PLAINTEXT_LANGUAGE_ID } from '../languages/modesRegistry.js';\nimport { tokenizeLineToHTML } from '../languages/textToHtmlTokenizer.js';\nimport { EditorTheme } from '../editorTheme.js';\nimport * as viewEvents from '../viewEvents.js';\nimport { ViewLayout } from '../viewLayout/viewLayout.js';\nimport { MinimapTokensColorTracker } from './minimapTokensColorTracker.js';\nimport { ILineBreaksComputer, ILineBreaksComputerFactory, InjectedText } from '../modelLineProjectionData.js';\nimport { ViewEventHandler } from '../viewEventHandler.js';\nimport { ILineHeightChangeAccessor, IViewModel, IWhitespaceChangeAccessor, MinimapLinesRenderingData, OverviewRulerDecorationsGroup, ViewLineData, ViewLineRenderingData, ViewModelDecoration } from '../viewModel.js';\nimport { ViewModelDecorations } from './viewModelDecorations.js';\nimport { FocusChangedEvent, HiddenAreasChangedEvent, ModelContentChangedEvent, ModelDecorationsChangedEvent, ModelFontChangedEvent, ModelLanguageChangedEvent, ModelLanguageConfigurationChangedEvent, ModelLineHeightChangedEvent, ModelOptionsChangedEvent, ModelTokensChangedEvent, OutgoingViewModelEvent, ReadOnlyEditAttemptEvent, ScrollChangedEvent, ViewModelEventDispatcher, ViewModelEventsCollector, ViewZonesChangedEvent, WidgetFocusChangedEvent } from '../viewModelEventDispatcher.js';\nimport { IViewModelLines, ViewModelLinesFromModelAsIs, ViewModelLinesFromProjectedModel } from './viewModelLines.js';\nimport { IThemeService } from '../../../platform/theme/common/themeService.js';\nimport { GlyphMarginLanesModel } from './glyphLanesModel.js';\nimport { ICustomLineHeightData } from '../viewLayout/lineHeights.js';\nimport { TextModelEditSource } from '../textModelEditSource.js';\nimport { InlineDecoration } from './inlineDecorations.js';\nimport { ICoordinatesConverter } from '../coordinatesConverter.js';\n\nconst USE_IDENTITY_LINES_COLLECTION = true;\n\nexport class ViewModel extends Disposable implements IViewModel {\n\n\tprivate readonly _editorId: number;\n\tprivate readonly _configuration: IEditorConfiguration;\n\tpublic readonly model: ITextModel;\n\tprivate readonly _eventDispatcher: ViewModelEventDispatcher;\n\tpublic readonly onEvent: Event<OutgoingViewModelEvent>;\n\tpublic cursorConfig: CursorConfiguration;\n\tprivate readonly _updateConfigurationViewLineCount: RunOnceScheduler;\n\tprivate _hasFocus: boolean;\n\tprivate readonly _viewportStart: ViewportStart;\n\tprivate readonly _lines: IViewModelLines;\n\tpublic readonly coordinatesConverter: ICoordinatesConverter;\n\tpublic readonly viewLayout: ViewLayout;\n\tprivate readonly _cursor: CursorsController;\n\tprivate readonly _decorations: ViewModelDecorations;\n\tpublic readonly glyphLanes: IGlyphMarginLanesModel;\n\n\tconstructor(\n\t\teditorId: number,\n\t\tconfiguration: IEditorConfiguration,\n\t\tmodel: ITextModel,\n\t\tdomLineBreaksComputerFactory: ILineBreaksComputerFactory,\n\t\tmonospaceLineBreaksComputerFactory: ILineBreaksComputerFactory,\n\t\tscheduleAtNextAnimationFrame: (callback: () => void) => IDisposable,\n\t\tprivate readonly languageConfigurationService: ILanguageConfigurationService,\n\t\tprivate readonly _themeService: IThemeService,\n\t\tprivate readonly _attachedView: IAttachedView,\n\t\tprivate readonly _transactionalTarget: IBatchableTarget,\n\t) {\n\t\tsuper();\n\n\t\tthis._editorId = editorId;\n\t\tthis._configuration = configuration;\n\t\tthis.model = model;\n\t\tthis._eventDispatcher = new ViewModelEventDispatcher();\n\t\tthis.onEvent = this._eventDispatcher.onEvent;\n\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\tthis._updateConfigurationViewLineCount = this._register(new RunOnceScheduler(() => this._updateConfigurationViewLineCountNow(), 0));\n\t\tthis._hasFocus = false;\n\t\tthis._viewportStart = ViewportStart.create(this.model);\n\t\tthis.glyphLanes = new GlyphMarginLanesModel(0);\n\n\t\tif (USE_IDENTITY_LINES_COLLECTION && this.model.isTooLargeForTokenization()) {\n\n\t\t\tthis._lines = new ViewModelLinesFromModelAsIs(this.model);\n\n\t\t} else {\n\t\t\tconst options = this._configuration.options;\n\t\t\tconst fontInfo = options.get(EditorOption.fontInfo);\n\t\t\tconst wrappingStrategy = options.get(EditorOption.wrappingStrategy);\n\t\t\tconst wrappingInfo = options.get(EditorOption.wrappingInfo);\n\t\t\tconst wrappingIndent = options.get(EditorOption.wrappingIndent);\n\t\t\tconst wordBreak = options.get(EditorOption.wordBreak);\n\t\t\tconst wrapOnEscapedLineFeeds = options.get(EditorOption.wrapOnEscapedLineFeeds);\n\n\t\t\tthis._lines = new ViewModelLinesFromProjectedModel(\n\t\t\t\tthis._editorId,\n\t\t\t\tthis.model,\n\t\t\t\tdomLineBreaksComputerFactory,\n\t\t\t\tmonospaceLineBreaksComputerFactory,\n\t\t\t\tfontInfo,\n\t\t\t\tthis.model.getOptions().tabSize,\n\t\t\t\twrappingStrategy,\n\t\t\t\twrappingInfo.wrappingColumn,\n\t\t\t\twrappingIndent,\n\t\t\t\twordBreak,\n\t\t\t\twrapOnEscapedLineFeeds\n\t\t\t);\n\t\t}\n\n\t\tthis.coordinatesConverter = this._lines.createCoordinatesConverter();\n\n\t\tthis._cursor = this._register(new CursorsController(model, this, this.coordinatesConverter, this.cursorConfig));\n\n\t\tthis.viewLayout = this._register(new ViewLayout(this._configuration, this.getLineCount(), this._getCustomLineHeights(), scheduleAtNextAnimationFrame));\n\n\t\tthis._register(this.viewLayout.onDidScroll((e) => {\n\t\t\tif (e.scrollTopChanged) {\n\t\t\t\tthis._handleVisibleLinesChanged();\n\t\t\t}\n\t\t\tif (e.scrollTopChanged) {\n\t\t\t\tthis._viewportStart.invalidate();\n\t\t\t}\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewScrollChangedEvent(e));\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ScrollChangedEvent(\n\t\t\t\te.oldScrollWidth, e.oldScrollLeft, e.oldScrollHeight, e.oldScrollTop,\n\t\t\t\te.scrollWidth, e.scrollLeft, e.scrollHeight, e.scrollTop\n\t\t\t));\n\t\t}));\n\n\t\tthis._register(this.viewLayout.onDidContentSizeChange((e) => {\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(e);\n\t\t}));\n\n\t\tthis._decorations = new ViewModelDecorations(this._editorId, this.model, this._configuration, this._lines, this.coordinatesConverter);\n\n\t\tthis._registerModelEvents();\n\n\t\tthis._register(this._configuration.onDidChangeFast((e) => {\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\tthis._onConfigurationChanged(eventsCollector, e);\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(MinimapTokensColorTracker.getInstance().onDidChange(() => {\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewTokensColorsChangedEvent());\n\t\t}));\n\n\t\tthis._register(this._themeService.onDidColorThemeChange((theme) => {\n\t\t\tthis._invalidateDecorationsColorCache();\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewThemeChangedEvent(theme));\n\t\t}));\n\n\t\tthis._updateConfigurationViewLineCountNow();\n\t}\n\n\tpublic override dispose(): void {\n\t\t// First remove listeners, as disposing the lines might end up sending\n\t\t// model decoration changed events ... and we no longer care about them ...\n\t\tsuper.dispose();\n\t\tthis._decorations.dispose();\n\t\tthis._lines.dispose();\n\t\tthis._viewportStart.dispose();\n\t\tthis._eventDispatcher.dispose();\n\t}\n\n\tpublic createLineBreaksComputer(): ILineBreaksComputer {\n\t\treturn this._lines.createLineBreaksComputer();\n\t}\n\n\tpublic addViewEventHandler(eventHandler: ViewEventHandler): void {\n\t\tthis._eventDispatcher.addViewEventHandler(eventHandler);\n\t}\n\n\tpublic removeViewEventHandler(eventHandler: ViewEventHandler): void {\n\t\tthis._eventDispatcher.removeViewEventHandler(eventHandler);\n\t}\n\n\tprivate _getCustomLineHeights(): ICustomLineHeightData[] {\n\t\tconst allowVariableLineHeights = this._configuration.options.get(EditorOption.allowVariableLineHeights);\n\t\tif (!allowVariableLineHeights) {\n\t\t\treturn [];\n\t\t}\n\t\tconst decorations = this.model.getCustomLineHeightsDecorations(this._editorId);\n\t\treturn decorations.map((d) => {\n\t\t\tconst lineNumber = d.range.startLineNumber;\n\t\t\tconst viewRange = this.coordinatesConverter.convertModelRangeToViewRange(new Range(lineNumber, 1, lineNumber, this.model.getLineMaxColumn(lineNumber)));\n\t\t\treturn {\n\t\t\t\tdecorationId: d.id,\n\t\t\t\tstartLineNumber: viewRange.startLineNumber,\n\t\t\t\tendLineNumber: viewRange.endLineNumber,\n\t\t\t\tlineHeight: d.options.lineHeight || 0\n\t\t\t};\n\t\t});\n\t}\n\n\tprivate _updateConfigurationViewLineCountNow(): void {\n\t\tthis._configuration.setViewLineCount(this._lines.getViewLineCount());\n\t}\n\n\tprivate getModelVisibleRanges(): Range[] {\n\t\tconst linesViewportData = this.viewLayout.getLinesViewportData();\n\t\tconst viewVisibleRange = new Range(\n\t\t\tlinesViewportData.startLineNumber,\n\t\t\tthis.getLineMinColumn(linesViewportData.startLineNumber),\n\t\t\tlinesViewportData.endLineNumber,\n\t\t\tthis.getLineMaxColumn(linesViewportData.endLineNumber)\n\t\t);\n\t\tconst modelVisibleRanges = this._toModelVisibleRanges(viewVisibleRange);\n\t\treturn modelVisibleRanges;\n\t}\n\n\tpublic visibleLinesStabilized(): void {\n\t\tconst modelVisibleRanges = this.getModelVisibleRanges();\n\t\tthis._attachedView.setVisibleLines(modelVisibleRanges, true);\n\t}\n\n\tprivate _handleVisibleLinesChanged(): void {\n\t\tconst modelVisibleRanges = this.getModelVisibleRanges();\n\t\tthis._attachedView.setVisibleLines(modelVisibleRanges, false);\n\t}\n\n\tpublic setHasFocus(hasFocus: boolean): void {\n\t\tthis._hasFocus = hasFocus;\n\t\tthis._cursor.setHasFocus(hasFocus);\n\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewFocusChangedEvent(hasFocus));\n\t\tthis._eventDispatcher.emitOutgoingEvent(new FocusChangedEvent(!hasFocus, hasFocus));\n\t}\n\n\tpublic setHasWidgetFocus(hasWidgetFocus: boolean): void {\n\t\tthis._eventDispatcher.emitOutgoingEvent(new WidgetFocusChangedEvent(!hasWidgetFocus, hasWidgetFocus));\n\t}\n\n\tpublic onCompositionStart(): void {\n\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewCompositionStartEvent());\n\t}\n\n\tpublic onCompositionEnd(): void {\n\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewCompositionEndEvent());\n\t}\n\n\tprivate _captureStableViewport(): StableViewport {\n\t\t// We might need to restore the current start view range, so save it (if available)\n\t\t// But only if the scroll position is not at the top of the file\n\t\tif (this._viewportStart.isValid && this.viewLayout.getCurrentScrollTop() > 0) {\n\t\t\tconst previousViewportStartViewPosition = new Position(this._viewportStart.viewLineNumber, this.getLineMinColumn(this._viewportStart.viewLineNumber));\n\t\t\tconst previousViewportStartModelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(previousViewportStartViewPosition);\n\t\t\treturn new StableViewport(previousViewportStartModelPosition, this._viewportStart.startLineDelta);\n\t\t}\n\t\treturn new StableViewport(null, 0);\n\t}\n\n\tprivate _onConfigurationChanged(eventsCollector: ViewModelEventsCollector, e: ConfigurationChangedEvent): void {\n\t\tconst stableViewport = this._captureStableViewport();\n\t\tconst options = this._configuration.options;\n\t\tconst fontInfo = options.get(EditorOption.fontInfo);\n\t\tconst wrappingStrategy = options.get(EditorOption.wrappingStrategy);\n\t\tconst wrappingInfo = options.get(EditorOption.wrappingInfo);\n\t\tconst wrappingIndent = options.get(EditorOption.wrappingIndent);\n\t\tconst wordBreak = options.get(EditorOption.wordBreak);\n\n\t\tif (this._lines.setWrappingSettings(fontInfo, wrappingStrategy, wrappingInfo.wrappingColumn, wrappingIndent, wordBreak)) {\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\n\t\t\tthis._updateConfigurationViewLineCount.schedule();\n\t\t}\n\n\t\tif (e.hasChanged(EditorOption.readOnly)) {\n\t\t\t// Must read again all decorations due to readOnly filtering\n\t\t\tthis._decorations.reset();\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t}\n\n\t\tif (e.hasChanged(EditorOption.renderValidationDecorations)) {\n\t\t\tthis._decorations.reset();\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t}\n\n\t\teventsCollector.emitViewEvent(new viewEvents.ViewConfigurationChangedEvent(e));\n\t\tthis.viewLayout.onConfigurationChanged(e);\n\n\t\tstableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout);\n\n\t\tif (CursorConfiguration.shouldRecreate(e)) {\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\t\t}\n\t}\n\n\tprivate _registerModelEvents(): void {\n\n\t\tthis._register(this.model.onDidChangeContentOrInjectedText((e) => {\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\n\t\t\t\tlet hadOtherModelChange = false;\n\t\t\t\tlet hadModelLineChangeThatChangedLineMapping = false;\n\n\t\t\t\tconst changes = (e instanceof textModelEvents.InternalModelContentChangeEvent ? e.rawContentChangedEvent.changes : e.changes);\n\t\t\t\tconst versionId = (e instanceof textModelEvents.InternalModelContentChangeEvent ? e.rawContentChangedEvent.versionId : null);\n\n\t\t\t\t// Do a first pass to compute line mappings, and a second pass to actually interpret them\n\t\t\t\tconst lineBreaksComputer = this._lines.createLineBreaksComputer();\n\t\t\t\tfor (const change of changes) {\n\t\t\t\t\tswitch (change.changeType) {\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LinesInserted: {\n\t\t\t\t\t\t\tfor (let lineIdx = 0; lineIdx < change.detail.length; lineIdx++) {\n\t\t\t\t\t\t\t\tconst line = change.detail[lineIdx];\n\t\t\t\t\t\t\t\tlet injectedText = change.injectedTexts[lineIdx];\n\t\t\t\t\t\t\t\tif (injectedText) {\n\t\t\t\t\t\t\t\t\tinjectedText = injectedText.filter(element => (!element.ownerId || element.ownerId === this._editorId));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlineBreaksComputer.addRequest(line, injectedText, null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LineChanged: {\n\t\t\t\t\t\t\tlet injectedText: textModelEvents.LineInjectedText[] | null = null;\n\t\t\t\t\t\t\tif (change.injectedText) {\n\t\t\t\t\t\t\t\tinjectedText = change.injectedText.filter(element => (!element.ownerId || element.ownerId === this._editorId));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlineBreaksComputer.addRequest(change.detail, injectedText, null);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst lineBreaks = lineBreaksComputer.finalize();\n\t\t\t\tconst lineBreakQueue = new ArrayQueue(lineBreaks);\n\n\t\t\t\tfor (const change of changes) {\n\t\t\t\t\tswitch (change.changeType) {\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.Flush: {\n\t\t\t\t\t\t\tthis._lines.onModelFlushed();\n\t\t\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\t\t\t\t\tthis._decorations.reset();\n\t\t\t\t\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\t\t\t\t\t\t\thadOtherModelChange = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LinesDeleted: {\n\t\t\t\t\t\t\tconst linesDeletedEvent = this._lines.onModelLinesDeleted(versionId, change.fromLineNumber, change.toLineNumber);\n\t\t\t\t\t\t\tif (linesDeletedEvent !== null) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesDeletedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thadOtherModelChange = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LinesInserted: {\n\t\t\t\t\t\t\tconst insertedLineBreaks = lineBreakQueue.takeCount(change.detail.length);\n\t\t\t\t\t\t\tconst linesInsertedEvent = this._lines.onModelLinesInserted(versionId, change.fromLineNumber, change.toLineNumber, insertedLineBreaks);\n\t\t\t\t\t\t\tif (linesInsertedEvent !== null) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesInsertedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thadOtherModelChange = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LineChanged: {\n\t\t\t\t\t\t\tconst changedLineBreakData = lineBreakQueue.dequeue()!;\n\t\t\t\t\t\t\tconst [lineMappingChanged, linesChangedEvent, linesInsertedEvent, linesDeletedEvent] =\n\t\t\t\t\t\t\t\tthis._lines.onModelLineChanged(versionId, change.lineNumber, changedLineBreakData);\n\t\t\t\t\t\t\thadModelLineChangeThatChangedLineMapping = lineMappingChanged;\n\t\t\t\t\t\t\tif (linesChangedEvent) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesChangedEvent);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (linesInsertedEvent) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesInsertedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (linesDeletedEvent) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesDeletedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.EOLChanged: {\n\t\t\t\t\t\t\t// Nothing to do. The new version will be accepted below\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (versionId !== null) {\n\t\t\t\t\tthis._lines.acceptVersionId(versionId);\n\t\t\t\t}\n\t\t\t\tthis.viewLayout.onHeightMaybeChanged();\n\n\t\t\t\tif (!hadOtherModelChange && hadModelLineChangeThatChangedLineMapping) {\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\n\t\t\t// Update the configuration and reset the centered view line\n\t\t\tconst viewportStartWasValid = this._viewportStart.isValid;\n\t\t\tthis._viewportStart.invalidate();\n\t\t\tthis._configuration.setModelLineCount(this.model.getLineCount());\n\t\t\tthis._updateConfigurationViewLineCountNow();\n\n\t\t\t// Recover viewport\n\t\t\tif (!this._hasFocus && this.model.getAttachedEditorCount() >= 2 && viewportStartWasValid) {\n\t\t\t\tconst modelRange = this.model._getTrackedRange(this._viewportStart.modelTrackedRange);\n\t\t\t\tif (modelRange) {\n\t\t\t\t\tconst viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(modelRange.getStartPosition());\n\t\t\t\t\tconst viewPositionTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber);\n\t\t\t\t\tthis.viewLayout.setScrollPosition({ scrollTop: viewPositionTop + this._viewportStart.startLineDelta }, ScrollType.Immediate);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\tif (e instanceof textModelEvents.InternalModelContentChangeEvent) {\n\t\t\t\t\teventsCollector.emitOutgoingEvent(new ModelContentChangedEvent(e.contentChangedEvent));\n\t\t\t\t}\n\t\t\t\tthis._cursor.onModelContentChanged(eventsCollector, e);\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\n\t\t\tthis._handleVisibleLinesChanged();\n\t\t}));\n\n\t\tconst allowVariableLineHeights = this._configuration.options.get(EditorOption.allowVariableLineHeights);\n\t\tif (allowVariableLineHeights) {\n\t\t\tthis._register(this.model.onDidChangeLineHeight((e) => {\n\t\t\t\tconst filteredChanges = e.changes.filter((change) => change.ownerId === this._editorId || change.ownerId === 0);\n\n\t\t\t\tthis.viewLayout.changeSpecialLineHeights((accessor: ILineHeightChangeAccessor) => {\n\t\t\t\t\tfor (const change of filteredChanges) {\n\t\t\t\t\t\tconst { decorationId, lineNumber, lineHeight } = change;\n\t\t\t\t\t\tconst viewRange = this.coordinatesConverter.convertModelRangeToViewRange(new Range(lineNumber, 1, lineNumber, this.model.getLineMaxColumn(lineNumber)));\n\t\t\t\t\t\tif (lineHeight !== null) {\n\t\t\t\t\t\t\taccessor.insertOrChangeCustomLineHeight(decorationId, viewRange.startLineNumber, viewRange.endLineNumber, lineHeight);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\taccessor.removeCustomLineHeight(decorationId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// recreate the model event using the filtered changes\n\t\t\t\tif (filteredChanges.length > 0) {\n\t\t\t\t\tconst filteredEvent = new textModelEvents.ModelLineHeightChangedEvent(filteredChanges);\n\t\t\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelLineHeightChangedEvent(filteredEvent));\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\tconst allowVariableFonts = this._configuration.options.get(EditorOption.effectiveAllowVariableFonts);\n\t\tif (allowVariableFonts) {\n\t\t\tthis._register(this.model.onDidChangeFont((e) => {\n\t\t\t\tconst filteredChanges = e.changes.filter((change) => change.ownerId === this._editorId || change.ownerId === 0);\n\t\t\t\t// recreate the model event using the filtered changes\n\t\t\t\tif (filteredChanges.length > 0) {\n\t\t\t\t\tconst filteredEvent = new textModelEvents.ModelFontChangedEvent(filteredChanges);\n\t\t\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelFontChangedEvent(filteredEvent));\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\tthis._register(this.model.onDidChangeTokens((e) => {\n\t\t\tconst viewRanges: { fromLineNumber: number; toLineNumber: number }[] = [];\n\t\t\tfor (let j = 0, lenJ = e.ranges.length; j < lenJ; j++) {\n\t\t\t\tconst modelRange = e.ranges[j];\n\t\t\t\tconst viewStartLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.fromLineNumber, 1)).lineNumber;\n\t\t\t\tconst viewEndLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.toLineNumber, this.model.getLineMaxColumn(modelRange.toLineNumber))).lineNumber;\n\t\t\t\tviewRanges[j] = {\n\t\t\t\t\tfromLineNumber: viewStartLineNumber,\n\t\t\t\t\ttoLineNumber: viewEndLineNumber\n\t\t\t\t};\n\t\t\t}\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewTokensChangedEvent(viewRanges));\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelTokensChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeLanguageConfiguration((e) => {\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewLanguageConfigurationEvent());\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelLanguageConfigurationChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeLanguage((e) => {\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelLanguageChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeOptions((e) => {\n\t\t\t// A tab size change causes a line mapping changed event => all view parts will repaint OK, no further event needed here\n\t\t\tif (this._lines.setTabSize(this.model.getOptions().tabSize)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\t\t\t\t} finally {\n\t\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t\t}\n\t\t\t\tthis._updateConfigurationViewLineCount.schedule();\n\t\t\t}\n\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelOptionsChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeDecorations((e) => {\n\t\t\tthis._decorations.onModelDecorationsChanged();\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewDecorationsChangedEvent(e));\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelDecorationsChangedEvent(e));\n\t\t}));\n\t}\n\n\tprivate readonly hiddenAreasModel = new HiddenAreasModel();\n\tprivate previousHiddenAreas: readonly Range[] = [];\n\n\tpublic getFontSizeAtPosition(position: IPosition): string | null {\n\t\tconst allowVariableFonts = this._configuration.options.get(EditorOption.effectiveAllowVariableFonts);\n\t\tif (!allowVariableFonts) {\n\t\t\treturn null;\n\t\t}\n\t\tconst fontDecorations = this.model.getFontDecorationsInRange(Range.fromPositions(position), this._editorId);\n\t\tlet fontSize: string = this._configuration.options.get(EditorOption.fontInfo).fontSize + 'px';\n\t\tfor (const fontDecoration of fontDecorations) {\n\t\t\tif (fontDecoration.options.fontSize) {\n\t\t\t\tfontSize = fontDecoration.options.fontSize;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn fontSize;\n\t}\n\n\t/**\n\t * @param forceUpdate If true, the hidden areas will be updated even if the new ranges are the same as the previous ranges.\n\t * This is because the model might have changed, which resets the hidden areas, but not the last cached value.\n\t * This needs a better fix in the future.\n\t*/\n\tpublic setHiddenAreas(ranges: Range[], source?: unknown, forceUpdate?: boolean): void {\n\t\tthis.hiddenAreasModel.setHiddenAreas(source, ranges);\n\t\tconst mergedRanges = this.hiddenAreasModel.getMergedRanges();\n\t\tif (mergedRanges === this.previousHiddenAreas && !forceUpdate) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.previousHiddenAreas = mergedRanges;\n\n\t\tconst stableViewport = this._captureStableViewport();\n\n\t\tlet lineMappingChanged = false;\n\t\ttry {\n\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\tlineMappingChanged = this._lines.setHiddenAreas(mergedRanges);\n\t\t\tif (lineMappingChanged) {\n\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\t\t\t\tthis.viewLayout.onHeightMaybeChanged();\n\t\t\t}\n\n\t\t\tconst firstModelLineInViewPort = stableViewport.viewportStartModelPosition?.lineNumber;\n\t\t\tconst firstModelLineIsHidden = firstModelLineInViewPort && mergedRanges.some(range => range.startLineNumber <= firstModelLineInViewPort && firstModelLineInViewPort <= range.endLineNumber);\n\t\t\tif (!firstModelLineIsHidden) {\n\t\t\t\tstableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t}\n\t\tthis._updateConfigurationViewLineCount.schedule();\n\n\t\tif (lineMappingChanged) {\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new HiddenAreasChangedEvent());\n\t\t}\n\t}\n\n\tpublic getVisibleRangesPlusViewportAboveBelow(): Range[] {\n\t\tconst layoutInfo = this._configuration.options.get(EditorOption.layoutInfo);\n\t\tconst lineHeight = this._configuration.options.get(EditorOption.lineHeight);\n\t\tconst linesAround = Math.max(20, Math.round(layoutInfo.height / lineHeight));\n\t\tconst partialData = this.viewLayout.getLinesViewportData();\n\t\tconst startViewLineNumber = Math.max(1, partialData.completelyVisibleStartLineNumber - linesAround);\n\t\tconst endViewLineNumber = Math.min(this.getLineCount(), partialData.completelyVisibleEndLineNumber + linesAround);\n\n\t\treturn this._toModelVisibleRanges(new Range(\n\t\t\tstartViewLineNumber, this.getLineMinColumn(startViewLineNumber),\n\t\t\tendViewLineNumber, this.getLineMaxColumn(endViewLineNumber)\n\t\t));\n\t}\n\n\tpublic getVisibleRanges(): Range[] {\n\t\tconst visibleViewRange = this.getCompletelyVisibleViewRange();\n\t\treturn this._toModelVisibleRanges(visibleViewRange);\n\t}\n\n\tpublic getHiddenAreas(): Range[] {\n\t\treturn this._lines.getHiddenAreas();\n\t}\n\n\tprivate _toModelVisibleRanges(visibleViewRange: Range): Range[] {\n\t\tconst visibleRange = this.coordinatesConverter.convertViewRangeToModelRange(visibleViewRange);\n\t\tconst hiddenAreas = this._lines.getHiddenAreas();\n\n\t\tif (hiddenAreas.length === 0) {\n\t\t\treturn [visibleRange];\n\t\t}\n\n\t\tconst result: Range[] = [];\n\t\tlet resultLen = 0;\n\t\tlet startLineNumber = visibleRange.startLineNumber;\n\t\tlet startColumn = visibleRange.startColumn;\n\t\tconst endLineNumber = visibleRange.endLineNumber;\n\t\tconst endColumn = visibleRange.endColumn;\n\t\tfor (let i = 0, len = hiddenAreas.length; i < len; i++) {\n\t\t\tconst hiddenStartLineNumber = hiddenAreas[i].startLineNumber;\n\t\t\tconst hiddenEndLineNumber = hiddenAreas[i].endLineNumber;\n\n\t\t\tif (hiddenEndLineNumber < startLineNumber) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (hiddenStartLineNumber > endLineNumber) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (startLineNumber < hiddenStartLineNumber) {\n\t\t\t\tresult[resultLen++] = new Range(\n\t\t\t\t\tstartLineNumber, startColumn,\n\t\t\t\t\thiddenStartLineNumber - 1, this.model.getLineMaxColumn(hiddenStartLineNumber - 1)\n\t\t\t\t);\n\t\t\t}\n\t\t\tstartLineNumber = hiddenEndLineNumber + 1;\n\t\t\tstartColumn = 1;\n\t\t}\n\n\t\tif (startLineNumber < endLineNumber || (startLineNumber === endLineNumber && startColumn < endColumn)) {\n\t\t\tresult[resultLen++] = new Range(\n\t\t\t\tstartLineNumber, startColumn,\n\t\t\t\tendLineNumber, endColumn\n\t\t\t);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic getCompletelyVisibleViewRange(): Range {\n\t\tconst partialData = this.viewLayout.getLinesViewportData();\n\t\tconst startViewLineNumber = partialData.completelyVisibleStartLineNumber;\n\t\tconst endViewLineNumber = partialData.completelyVisibleEndLineNumber;\n\n\t\treturn new Range(\n\t\t\tstartViewLineNumber, this.getLineMinColumn(startViewLineNumber),\n\t\t\tendViewLineNumber, this.getLineMaxColumn(endViewLineNumber)\n\t\t);\n\t}\n\n\tpublic getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range {\n\t\tconst partialData = this.viewLayout.getLinesViewportDataAtScrollTop(scrollTop);\n\t\tconst startViewLineNumber = partialData.completelyVisibleStartLineNumber;\n\t\tconst endViewLineNumber = partialData.completelyVisibleEndLineNumber;\n\n\t\treturn new Range(\n\t\t\tstartViewLineNumber, this.getLineMinColumn(startViewLineNumber),\n\t\t\tendViewLineNumber, this.getLineMaxColumn(endViewLineNumber)\n\t\t);\n\t}\n\n\tpublic saveState(): IViewState {\n\t\tconst compatViewState = this.viewLayout.saveState();\n\n\t\tconst scrollTop = compatViewState.scrollTop;\n\t\tconst firstViewLineNumber = this.viewLayout.getLineNumberAtVerticalOffset(scrollTop);\n\t\tconst firstPosition = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(firstViewLineNumber, this.getLineMinColumn(firstViewLineNumber)));\n\t\tconst firstPositionDeltaTop = this.viewLayout.getVerticalOffsetForLineNumber(firstViewLineNumber) - scrollTop;\n\n\t\treturn {\n\t\t\tscrollLeft: compatViewState.scrollLeft,\n\t\t\tfirstPosition: firstPosition,\n\t\t\tfirstPositionDeltaTop: firstPositionDeltaTop\n\t\t};\n\t}\n\n\tpublic reduceRestoreState(state: IViewState): { scrollLeft: number; scrollTop: number } {\n\t\tif (typeof state.firstPosition === 'undefined') {\n\t\t\t// This is a view state serialized by an older version\n\t\t\treturn this._reduceRestoreStateCompatibility(state);\n\t\t}\n\n\t\tconst modelPosition = this.model.validatePosition(state.firstPosition);\n\t\tconst viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(modelPosition);\n\t\tconst scrollTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber) - state.firstPositionDeltaTop;\n\t\treturn {\n\t\t\tscrollLeft: state.scrollLeft,\n\t\t\tscrollTop: scrollTop\n\t\t};\n\t}\n\n\tprivate _reduceRestoreStateCompatibility(state: IViewState): { scrollLeft: number; scrollTop: number } {\n\t\treturn {\n\t\t\tscrollLeft: state.scrollLeft,\n\t\t\tscrollTop: state.scrollTopWithoutViewZones!\n\t\t};\n\t}\n\n\tprivate getTabSize(): number {\n\t\treturn this.model.getOptions().tabSize;\n\t}\n\n\tpublic getLineCount(): number {\n\t\treturn this._lines.getViewLineCount();\n\t}\n\n\t/**\n\t * Gives a hint that a lot of requests are about to come in for these line numbers.\n\t */\n\tpublic setViewport(startLineNumber: number, endLineNumber: number, centeredLineNumber: number): void {\n\t\tthis._viewportStart.update(this, startLineNumber);\n\t}\n\n\tpublic getActiveIndentGuide(lineNumber: number, minLineNumber: number, maxLineNumber: number): IActiveIndentGuideInfo {\n\t\treturn this._lines.getActiveIndentGuide(lineNumber, minLineNumber, maxLineNumber);\n\t}\n\n\tpublic getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[] {\n\t\treturn this._lines.getViewLinesIndentGuides(startLineNumber, endLineNumber);\n\t}\n\n\tpublic getBracketGuidesInRangeByLine(startLineNumber: number, endLineNumber: number, activePosition: IPosition | null, options: BracketGuideOptions): IndentGuide[][] {\n\t\treturn this._lines.getViewLinesBracketGuides(startLineNumber, endLineNumber, activePosition, options);\n\t}\n\n\tpublic getLineContent(lineNumber: number): string {\n\t\treturn this._lines.getViewLineContent(lineNumber);\n\t}\n\n\tpublic getLineLength(lineNumber: number): number {\n\t\treturn this._lines.getViewLineLength(lineNumber);\n\t}\n\n\tpublic getLineMinColumn(lineNumber: number): number {\n\t\treturn this._lines.getViewLineMinColumn(lineNumber);\n\t}\n\n\tpublic getLineMaxColumn(lineNumber: number): number {\n\t\treturn this._lines.getViewLineMaxColumn(lineNumber);\n\t}\n\n\tpublic getLineFirstNonWhitespaceColumn(lineNumber: number): number {\n\t\tconst result = strings.firstNonWhitespaceIndex(this.getLineContent(lineNumber));\n\t\tif (result === -1) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn result + 1;\n\t}\n\n\tpublic getLineLastNonWhitespaceColumn(lineNumber: number): number {\n\t\tconst result = strings.lastNonWhitespaceIndex(this.getLineContent(lineNumber));\n\t\tif (result === -1) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn result + 2;\n\t}\n\n\tpublic getMinimapDecorationsInRange(range: Range): ViewModelDecoration[] {\n\t\treturn this._decorations.getMinimapDecorationsInRange(range);\n\t}\n\n\tpublic getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[] {\n\t\treturn this._decorations.getDecorationsViewportData(visibleRange).decorations;\n\t}\n\n\tpublic getInjectedTextAt(viewPosition: Position): InjectedText | null {\n\t\treturn this._lines.getInjectedTextAt(viewPosition);\n\t}\n\n\tprivate _getTextDirection(lineNumber: number, decorations: ViewModelDecoration[]): TextDirection {\n\t\tlet rtlCount = 0;\n\n\t\tfor (const decoration of decorations) {\n\t\t\tconst range = decoration.range;\n\t\t\tif (range.startLineNumber > lineNumber || range.endLineNumber < lineNumber) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst textDirection = decoration.options.textDirection;\n\t\t\tif (textDirection === TextDirection.RTL) {\n\t\t\t\trtlCount++;\n\t\t\t} else if (textDirection === TextDirection.LTR) {\n\t\t\t\trtlCount--;\n\t\t\t}\n\t\t}\n\n\t\treturn rtlCount > 0 ? TextDirection.RTL : TextDirection.LTR;\n\t}\n\n\tpublic getTextDirection(lineNumber: number): TextDirection {\n\t\tconst decorationsCollection = this._decorations.getDecorationsOnLine(lineNumber);\n\t\treturn this._getTextDirection(lineNumber, decorationsCollection.decorations);\n\t}\n\n\tpublic getViewportViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData {\n\t\tconst viewportDecorationsCollection = this._decorations.getDecorationsViewportData(visibleRange);\n\t\tconst inlineDecorations = viewportDecorationsCollection.inlineDecorations[lineNumber - visibleRange.startLineNumber];\n\t\treturn this._getViewLineRenderingData(lineNumber, inlineDecorations, viewportDecorationsCollection.hasVariableFonts, viewportDecorationsCollection.decorations);\n\t}\n\n\tpublic getViewLineRenderingData(lineNumber: number): ViewLineRenderingData {\n\t\tconst decorationsCollection = this._decorations.getDecorationsOnLine(lineNumber);\n\t\treturn this._getViewLineRenderingData(lineNumber, decorationsCollection.inlineDecorations[0], decorationsCollection.hasVariableFonts, decorationsCollection.decorations);\n\t}\n\n\tprivate _getViewLineRenderingData(lineNumber: number, inlineDecorations: InlineDecoration[], hasVariableFonts: boolean, decorations: ViewModelDecoration[]): ViewLineRenderingData {\n\t\tconst mightContainRTL = this.model.mightContainRTL();\n\t\tconst mightContainNonBasicASCII = this.model.mightContainNonBasicASCII();\n\t\tconst tabSize = this.getTabSize();\n\t\tconst lineData = this._lines.getViewLineData(lineNumber);\n\n\t\tif (lineData.inlineDecorations) {\n\t\t\tinlineDecorations = [\n\t\t\t\t...inlineDecorations,\n\t\t\t\t...lineData.inlineDecorations.map(d =>\n\t\t\t\t\td.toInlineDecoration(lineNumber)\n\t\t\t\t)\n\t\t\t];\n\t\t}\n\n\t\treturn new ViewLineRenderingData(\n\t\t\tlineData.minColumn,\n\t\t\tlineData.maxColumn,\n\t\t\tlineData.content,\n\t\t\tlineData.continuesWithWrappedLine,\n\t\t\tmightContainRTL,\n\t\t\tmightContainNonBasicASCII,\n\t\t\tlineData.tokens,\n\t\t\tinlineDecorations,\n\t\t\ttabSize,\n\t\t\tlineData.startVisibleColumn,\n\t\t\tthis._getTextDirection(lineNumber, decorations),\n\t\t\thasVariableFonts\n\t\t);\n\t}\n\n\tpublic getViewLineData(lineNumber: number): ViewLineData {\n\t\treturn this._lines.getViewLineData(lineNumber);\n\t}\n\n\tpublic getMinimapLinesRenderingData(startLineNumber: number, endLineNumber: number, needed: boolean[]): MinimapLinesRenderingData {\n\t\tconst result = this._lines.getViewLinesData(startLineNumber, endLineNumber, needed);\n\t\treturn new MinimapLinesRenderingData(\n\t\t\tthis.getTabSize(),\n\t\t\tresult\n\t\t);\n\t}\n\n\tpublic getAllOverviewRulerDecorations(theme: EditorTheme): OverviewRulerDecorationsGroup[] {\n\t\tconst decorations = this.model.getOverviewRulerDecorations(this._editorId, filterValidationDecorations(this._configuration.options), filterFontDecorations(this._configuration.options));\n\t\tconst result = new OverviewRulerDecorations();\n\t\tfor (const decoration of decorations) {\n\t\t\tconst decorationOptions = <ModelDecorationOptions>decoration.options;\n\t\t\tconst opts = decorationOptions.overviewRuler;\n\t\t\tif (!opts) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst lane = <number>opts.position;\n\t\t\tif (lane === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst color = opts.getColor(theme.value);\n\t\t\tconst viewStartLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration.range.startLineNumber, decoration.range.startColumn);\n\t\t\tconst viewEndLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration.range.endLineNumber, decoration.range.endColumn);\n\n\t\t\tresult.accept(color, decorationOptions.zIndex, viewStartLineNumber, viewEndLineNumber, lane);\n\t\t}\n\t\treturn result.asArray;\n\t}\n\n\tprivate _invalidateDecorationsColorCache(): void {\n\t\tconst decorations = this.model.getOverviewRulerDecorations();\n\t\tfor (const decoration of decorations) {\n\t\t\tconst opts1 = <ModelDecorationOverviewRulerOptions>decoration.options.overviewRuler;\n\t\t\topts1?.invalidateCachedColor();\n\t\t\tconst opts2 = <ModelDecorationMinimapOptions>decoration.options.minimap;\n\t\t\topts2?.invalidateCachedColor();\n\t\t}\n\t}\n\n\tpublic getValueInRange(range: Range, eol: EndOfLinePreference): string {\n\t\tconst modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range);\n\t\treturn this.model.getValueInRange(modelRange, eol);\n\t}\n\n\tpublic getValueLengthInRange(range: Range, eol: EndOfLinePreference): number {\n\t\tconst modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range);\n\t\treturn this.model.getValueLengthInRange(modelRange, eol);\n\t}\n\n\tpublic modifyPosition(position: Position, offset: number): Position {\n\t\tconst modelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(position);\n\t\tconst resultModelPosition = this.model.modifyPosition(modelPosition, offset);\n\t\treturn this.coordinatesConverter.convertModelPositionToViewPosition(resultModelPosition);\n\t}\n\n\tpublic deduceModelPositionRelativeToViewPosition(viewAnchorPosition: Position, deltaOffset: number, lineFeedCnt: number): Position {\n\t\tconst modelAnchor = this.coordinatesConverter.convertViewPositionToModelPosition(viewAnchorPosition);\n\t\tif (this.model.getEOL().length === 2) {\n\t\t\t// This model uses CRLF, so the delta must take that into account\n\t\t\tif (deltaOffset < 0) {\n\t\t\t\tdeltaOffset -= lineFeedCnt;\n\t\t\t} else {\n\t\t\t\tdeltaOffset += lineFeedCnt;\n\t\t\t}\n\t\t}\n\n\t\tconst modelAnchorOffset = this.model.getOffsetAt(modelAnchor);\n\t\tconst resultOffset = modelAnchorOffset + deltaOffset;\n\t\treturn this.model.getPositionAt(resultOffset);\n\t}\n\n\tpublic getPlainTextToCopy(modelRanges: Range[], emptySelectionClipboard: boolean, forceCRLF: boolean): string | string[] {\n\t\tconst newLineCharacter = forceCRLF ? '\\r\\n' : this.model.getEOL();\n\n\t\tmodelRanges = modelRanges.slice(0);\n\t\tmodelRanges.sort(Range.compareRangesUsingStarts);\n\n\t\tlet hasEmptyRange = false;\n\t\tlet hasNonEmptyRange = false;\n\t\tfor (const range of modelRanges) {\n\t\t\tif (range.isEmpty()) {\n\t\t\t\thasEmptyRange = true;\n\t\t\t} else {\n\t\t\t\thasNonEmptyRange = true;\n\t\t\t}\n\t\t}\n\n\t\tif (!hasNonEmptyRange) {\n\t\t\t// all ranges are empty\n\t\t\tif (!emptySelectionClipboard) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tconst modelLineNumbers = modelRanges.map((r) => r.startLineNumber);\n\n\t\t\tlet result = '';\n\t\t\tfor (let i = 0; i < modelLineNumbers.length; i++) {\n\t\t\t\tif (i > 0 && modelLineNumbers[i - 1] === modelLineNumbers[i]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tresult += this.model.getLineContent(modelLineNumbers[i]) + newLineCharacter;\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tif (hasEmptyRange && emptySelectionClipboard) {\n\t\t\t// mixed empty selections and non-empty selections\n\t\t\tconst result: string[] = [];\n\t\t\tlet prevModelLineNumber = 0;\n\t\t\tfor (const modelRange of modelRanges) {\n\t\t\t\tconst modelLineNumber = modelRange.startLineNumber;\n\t\t\t\tif (modelRange.isEmpty()) {\n\t\t\t\t\tif (modelLineNumber !== prevModelLineNumber) {\n\t\t\t\t\t\tresult.push(this.model.getLineContent(modelLineNumber));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresult.push(this.model.getValueInRange(modelRange, forceCRLF ? EndOfLinePreference.CRLF : EndOfLinePreference.TextDefined));\n\t\t\t\t}\n\t\t\t\tprevModelLineNumber = modelLineNumber;\n\t\t\t}\n\t\t\treturn result.length === 1 ? result[0] : result;\n\t\t}\n\n\t\tconst result: string[] = [];\n\t\tfor (const modelRange of modelRanges) {\n\t\t\tif (!modelRange.isEmpty()) {\n\t\t\t\tresult.push(this.model.getValueInRange(modelRange, forceCRLF ? EndOfLinePreference.CRLF : EndOfLinePreference.TextDefined));\n\t\t\t}\n\t\t}\n\t\treturn result.length === 1 ? result[0] : result;\n\t}\n\n\tpublic getRichTextToCopy(modelRanges: Range[], emptySelectionClipboard: boolean): { html: string; mode: string } | null {\n\t\tconst languageId = this.model.getLanguageId();\n\t\tif (languageId === PLAINTEXT_LANGUAGE_ID) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (modelRanges.length !== 1) {\n\t\t\t// no multiple selection support at this time\n\t\t\treturn null;\n\t\t}\n\n\t\tlet range = modelRanges[0];\n\t\tif (range.isEmpty()) {\n\t\t\tif (!emptySelectionClipboard) {\n\t\t\t\t// nothing to copy\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst lineNumber = range.startLineNumber;\n\t\t\trange = new Range(lineNumber, this.model.getLineMinColumn(lineNumber), lineNumber, this.model.getLineMaxColumn(lineNumber));\n\t\t}\n\n\t\tconst fontInfo = this._configuration.options.get(EditorOption.fontInfo);\n\t\tconst colorMap = this._getColorMap();\n\t\tconst hasBadChars = (/[:;\\\\\\/<>]/.test(fontInfo.fontFamily));\n\t\tconst useDefaultFontFamily = (hasBadChars || fontInfo.fontFamily === EDITOR_FONT_DEFAULTS.fontFamily);\n\t\tlet fontFamily: string;\n\t\tif (useDefaultFontFamily) {\n\t\t\tfontFamily = EDITOR_FONT_DEFAULTS.fontFamily;\n\t\t} else {\n\t\t\tfontFamily = fontInfo.fontFamily;\n\t\t\tfontFamily = fontFamily.replace(/\"/g, '\\'');\n\t\t\tconst hasQuotesOrIsList = /[,']/.test(fontFamily);\n\t\t\tif (!hasQuotesOrIsList) {\n\t\t\t\tconst needsQuotes = /[+ ]/.test(fontFamily);\n\t\t\t\tif (needsQuotes) {\n\t\t\t\t\tfontFamily = `'${fontFamily}'`;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfontFamily = `${fontFamily}, ${EDITOR_FONT_DEFAULTS.fontFamily}`;\n\t\t}\n\n\t\treturn {\n\t\t\tmode: languageId,\n\t\t\thtml: (\n\t\t\t\t`<div style=\"`\n\t\t\t\t+ `color: ${colorMap[ColorId.DefaultForeground]};`\n\t\t\t\t+ `background-color: ${colorMap[ColorId.DefaultBackground]};`\n\t\t\t\t+ `font-family: ${fontFamily};`\n\t\t\t\t+ `font-weight: ${fontInfo.fontWeight};`\n\t\t\t\t+ `font-size: ${fontInfo.fontSize}px;`\n\t\t\t\t+ `line-height: ${fontInfo.lineHeight}px;`\n\t\t\t\t+ `white-space: pre;`\n\t\t\t\t+ `\">`\n\t\t\t\t+ this._getHTMLToCopy(range, colorMap)\n\t\t\t\t+ '</div>'\n\t\t\t)\n\t\t};\n\t}\n\n\tprivate _getHTMLToCopy(modelRange: Range, colorMap: string[]): string {\n\t\tconst startLineNumber = modelRange.startLineNumber;\n\t\tconst startColumn = modelRange.startColumn;\n\t\tconst endLineNumber = modelRange.endLineNumber;\n\t\tconst endColumn = modelRange.endColumn;\n\n\t\tconst tabSize = this.getTabSize();\n\n\t\tlet result = '';\n\n\t\tfor (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n\t\t\tconst lineTokens = this.model.tokenization.getLineTokens(lineNumber);\n\t\t\tconst lineContent = lineTokens.getLineContent();\n\t\t\tconst startOffset = (lineNumber === startLineNumber ? startColumn - 1 : 0);\n\t\t\tconst endOffset = (lineNumber === endLineNumber ? endColumn - 1 : lineContent.length);\n\n\t\t\tif (lineContent === '') {\n\t\t\t\tresult += '<br>';\n\t\t\t} else {\n\t\t\t\tresult += tokenizeLineToHTML(lineContent, lineTokens.inflate(), colorMap, startOffset, endOffset, tabSize, platform.isWindows);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate _getColorMap(): string[] {\n\t\tconst colorMap = TokenizationRegistry.getColorMap();\n\t\tconst result: string[] = ['#000000'];\n\t\tif (colorMap) {\n\t\t\tfor (let i = 1, len = colorMap.length; i < len; i++) {\n\t\t\t\tresult[i] = Color.Format.CSS.formatHex(colorMap[i]);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t//#region cursor operations\n\n\tpublic getPrimaryCursorState(): CursorState {\n\t\treturn this._cursor.getPrimaryCursorState();\n\t}\n\tpublic getLastAddedCursorIndex(): number {\n\t\treturn this._cursor.getLastAddedCursorIndex();\n\t}\n\tpublic getCursorStates(): CursorState[] {\n\t\treturn this._cursor.getCursorStates();\n\t}\n\tpublic setCursorStates(source: string | null | undefined, reason: CursorChangeReason, states: PartialCursorState[] | null): boolean {\n\t\treturn this._withViewEventsCollector(eventsCollector => this._cursor.setStates(eventsCollector, source, reason, states));\n\t}\n\tpublic getCursorColumnSelectData(): IColumnSelectData {\n\t\treturn this._cursor.getCursorColumnSelectData();\n\t}\n\tpublic getCursorAutoClosedCharacters(): Range[] {\n\t\treturn this._cursor.getAutoClosedCharacters();\n\t}\n\tpublic setCursorColumnSelectData(columnSelectData: IColumnSelectData): void {\n\t\tthis._cursor.setCursorColumnSelectData(columnSelectData);\n\t}\n\tpublic getPrevEditOperationType(): EditOperationType {\n\t\treturn this._cursor.getPrevEditOperationType();\n\t}\n\tpublic setPrevEditOperationType(type: EditOperationType): void {\n\t\tthis._cursor.setPrevEditOperationType(type);\n\t}\n\tpublic getSelection(): Selection {\n\t\treturn this._cursor.getSelection();\n\t}\n\tpublic getSelections(): Selection[] {\n\t\treturn this._cursor.getSelections();\n\t}\n\tpublic getPosition(): Position {\n\t\treturn this._cursor.getPrimaryCursorState().modelState.position;\n\t}\n\tpublic setSelections(source: string | null | undefined, selections: readonly ISelection[], reason = CursorChangeReason.NotSet): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.setSelections(eventsCollector, source, selections, reason));\n\t}\n\tpublic saveCursorState(): ICursorState[] {\n\t\treturn this._cursor.saveState();\n\t}\n\tpublic restoreCursorState(states: ICursorState[]): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.restoreState(eventsCollector, states));\n\t}\n\n\tprivate _executeCursorEdit(callback: (eventsCollector: ViewModelEventsCollector) => void): void {\n\t\tif (this._cursor.context.cursorConfig.readOnly) {\n\t\t\t// we cannot edit when read only...\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ReadOnlyEditAttemptEvent());\n\t\t\treturn;\n\t\t}\n\t\tthis._withViewEventsCollector(callback);\n\t}\n\tpublic executeEdits(source: string | null | undefined, edits: IIdentifiedSingleEditOperation[], cursorStateComputer: ICursorStateComputer, reason: TextModelEditSource): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.executeEdits(eventsCollector, source, edits, cursorStateComputer, reason));\n\t}\n\tpublic startComposition(): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.startComposition(eventsCollector));\n\t}\n\tpublic endComposition(source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.endComposition(eventsCollector, source));\n\t}\n\tpublic type(text: string, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.type(eventsCollector, text, source));\n\t}\n\tpublic compositionType(text: string, replacePrevCharCnt: number, replaceNextCharCnt: number, positionDelta: number, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.compositionType(eventsCollector, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source));\n\t}\n\tpublic paste(text: string, pasteOnNewLine: boolean, multicursorText?: string[] | null | undefined, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.paste(eventsCollector, text, pasteOnNewLine, multicursorText, source));\n\t}\n\tpublic cut(source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.cut(eventsCollector, source));\n\t}\n\tpublic executeCommand(command: ICommand, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.executeCommand(eventsCollector, command, source));\n\t}\n\tpublic executeCommands(commands: ICommand[], source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.executeCommands(eventsCollector, commands, source));\n\t}\n\tpublic revealAllCursors(source: string | null | undefined, revealHorizontal: boolean, minimalReveal: boolean = false): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.revealAll(eventsCollector, source, minimalReveal, viewEvents.VerticalRevealType.Simple, revealHorizontal, ScrollType.Smooth));\n\t}\n\tpublic revealPrimaryCursor(source: string | null | undefined, revealHorizontal: boolean, minimalReveal: boolean = false): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.revealPrimary(eventsCollector, source, minimalReveal, viewEvents.VerticalRevealType.Simple, revealHorizontal, ScrollType.Smooth));\n\t}\n\tpublic revealTopMostCursor(source: string | null | undefined): void {\n\t\tconst viewPosition = this._cursor.getTopMostViewPosition();\n\t\tconst viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column);\n\t\tthis._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new viewEvents.ViewRevealRangeRequestEvent(source, false, viewRange, null, viewEvents.VerticalRevealType.Simple, true, ScrollType.Smooth)));\n\t}\n\tpublic revealBottomMostCursor(source: string | null | undefined): void {\n\t\tconst viewPosition = this._cursor.getBottomMostViewPosition();\n\t\tconst viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column);\n\t\tthis._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new viewEvents.ViewRevealRangeRequestEvent(source, false, viewRange, null, viewEvents.VerticalRevealType.Simple, true, ScrollType.Smooth)));\n\t}\n\tpublic revealRange(source: string | null | undefined, revealHorizontal: boolean, viewRange: Range, verticalType: viewEvents.VerticalRevealType, scrollType: ScrollType): void {\n\t\tthis._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new viewEvents.ViewRevealRangeRequestEvent(source, false, viewRange, null, verticalType, revealHorizontal, scrollType)));\n\t}\n\n\t//#endregion\n\n\t//#region viewLayout\n\tpublic changeWhitespace(callback: (accessor: IWhitespaceChangeAccessor) => void): void {\n\t\tconst hadAChange = this.viewLayout.changeWhitespace(callback);\n\t\tif (hadAChange) {\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewZonesChangedEvent());\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ViewZonesChangedEvent());\n\t\t}\n\t}\n\t//#endregion\n\n\tprivate _withViewEventsCollector<T>(callback: (eventsCollector: ViewModelEventsCollector) => T): T {\n\t\treturn this._transactionalTarget.batchChanges(() => {\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\treturn callback(eventsCollector);\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic batchEvents(callback: () => void): void {\n\t\tthis._withViewEventsCollector(() => { callback(); });\n\t}\n\n\tnormalizePosition(position: Position, affinity: PositionAffinity): Position {\n\t\treturn this._lines.normalizePosition(position, affinity);\n\t}\n\n\t/**\n\t * Gets the column at which indentation stops at a given line.\n\t * @internal\n\t*/\n\tgetLineIndentColumn(lineNumber: number): number {\n\t\treturn this._lines.getLineIndentColumn(lineNumber);\n\t}\n}\n\nexport interface IBatchableTarget {\n\t/**\n\t * Allows the target to apply the changes introduced by the callback in a batch.\n\t*/\n\tbatchChanges<T>(cb: () => T): T;\n}\n\nclass ViewportStart implements IDisposable {\n\n\tpublic static create(model: ITextModel): ViewportStart {\n\t\tconst viewportStartLineTrackedRange = model._setTrackedRange(null, new Range(1, 1, 1, 1), TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges);\n\t\treturn new ViewportStart(model, 1, false, viewportStartLineTrackedRange, 0);\n\t}\n\n\tpublic get viewLineNumber(): number {\n\t\treturn this._viewLineNumber;\n\t}\n\n\tpublic get isValid(): boolean {\n\t\treturn this._isValid;\n\t}\n\n\tpublic get modelTrackedRange(): string {\n\t\treturn this._modelTrackedRange;\n\t}\n\n\tpublic get startLineDelta(): number {\n\t\treturn this._startLineDelta;\n\t}\n\n\tprivate constructor(\n\t\tprivate readonly _model: ITextModel,\n\t\tprivate _viewLineNumber: number,\n\t\tprivate _isValid: boolean,\n\t\tprivate _modelTrackedRange: string,\n\t\tprivate _startLineDelta: number,\n\t) { }\n\n\tpublic dispose(): void {\n\t\tthis._model._setTrackedRange(this._modelTrackedRange, null, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges);\n\t}\n\n\tpublic update(viewModel: IViewModel, startLineNumber: number): void {\n\t\tconst position = viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(startLineNumber, viewModel.getLineMinColumn(startLineNumber)));\n\t\tconst viewportStartLineTrackedRange = viewModel.model._setTrackedRange(this._modelTrackedRange, new Range(position.lineNumber, position.column, position.lineNumber, position.column), TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges);\n\t\tconst viewportStartLineTop = viewModel.viewLayout.getVerticalOffsetForLineNumber(startLineNumber);\n\t\tconst scrollTop = viewModel.viewLayout.getCurrentScrollTop();\n\n\t\tthis._viewLineNumber = startLineNumber;\n\t\tthis._isValid = true;\n\t\tthis._modelTrackedRange = viewportStartLineTrackedRange;\n\t\tthis._startLineDelta = scrollTop - viewportStartLineTop;\n\t}\n\n\tpublic invalidate(): void {\n\t\tthis._isValid = false;\n\t}\n}\n\nclass OverviewRulerDecorations {\n\n\tprivate readonly _asMap: { [color: string]: OverviewRulerDecorationsGroup } = Object.create(null);\n\treadonly asArray: OverviewRulerDecorationsGroup[] = [];\n\n\tpublic accept(color: string, zIndex: number, startLineNumber: number, endLineNumber: number, lane: number): void {\n\t\tconst prevGroup = this._asMap[color];\n\n\t\tif (prevGroup) {\n\t\t\tconst prevData = prevGroup.data;\n\t\t\tconst prevLane = prevData[prevData.length - 3];\n\t\t\tconst prevEndLineNumber = prevData[prevData.length - 1];\n\t\t\tif (prevLane === lane && prevEndLineNumber + 1 >= startLineNumber) {\n\t\t\t\t// merge into prev\n\t\t\t\tif (endLineNumber > prevEndLineNumber) {\n\t\t\t\t\tprevData[prevData.length - 1] = endLineNumber;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// push\n\t\t\tprevData.push(lane, startLineNumber, endLineNumber);\n\t\t} else {\n\t\t\tconst group = new OverviewRulerDecorationsGroup(color, zIndex, [lane, startLineNumber, endLineNumber]);\n\t\t\tthis._asMap[color] = group;\n\t\t\tthis.asArray.push(group);\n\t\t}\n\t}\n}\n\nclass HiddenAreasModel {\n\tprivate readonly hiddenAreas = new Map<unknown, Range[]>();\n\tprivate shouldRecompute = false;\n\tprivate ranges: Range[] = [];\n\n\tsetHiddenAreas(source: unknown, ranges: Range[]): void {\n\t\tconst existing = this.hiddenAreas.get(source);\n\t\tif (existing && rangeArraysEqual(existing, ranges)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.hiddenAreas.set(source, ranges);\n\t\tthis.shouldRecompute = true;\n\t}\n\n\t/**\n\t * The returned array is immutable.\n\t*/\n\tgetMergedRanges(): readonly Range[] {\n\t\tif (!this.shouldRecompute) {\n\t\t\treturn this.ranges;\n\t\t}\n\t\tthis.shouldRecompute = false;\n\t\tconst newRanges = Array.from(this.hiddenAreas.values()).reduce((r, hiddenAreas) => mergeLineRangeArray(r, hiddenAreas), []);\n\t\tif (rangeArraysEqual(this.ranges, newRanges)) {\n\t\t\treturn this.ranges;\n\t\t}\n\t\tthis.ranges = newRanges;\n\t\treturn this.ranges;\n\t}\n}\n\nfunction mergeLineRangeArray(arr1: Range[], arr2: Range[]): Range[] {\n\tconst result: Range[] = [];\n\tlet i = 0;\n\tlet j = 0;\n\twhile (i < arr1.length && j < arr2.length) {\n\t\tconst item1 = arr1[i];\n\t\tconst item2 = arr2[j];\n\n\t\tif (item1.endLineNumber < item2.startLineNumber - 1) {\n\t\t\tresult.push(arr1[i++]);\n\t\t} else if (item2.endLineNumber < item1.startLineNumber - 1) {\n\t\t\tresult.push(arr2[j++]);\n\t\t} else {\n\t\t\tconst startLineNumber = Math.min(item1.startLineNumber, item2.startLineNumber);\n\t\t\tconst endLineNumber = Math.max(item1.endLineNumber, item2.endLineNumber);\n\t\t\tresult.push(new Range(startLineNumber, 1, endLineNumber, 1));\n\t\t\ti++;\n\t\t\tj++;\n\t\t}\n\t}\n\twhile (i < arr1.length) {\n\t\tresult.push(arr1[i++]);\n\t}\n\twhile (j < arr2.length) {\n\t\tresult.push(arr2[j++]);\n\t}\n\treturn result;\n}\n\nfunction rangeArraysEqual(arr1: Range[], arr2: Range[]): boolean {\n\tif (arr1.length !== arr2.length) {\n\t\treturn false;\n\t}\n\tfor (let i = 0; i < arr1.length; i++) {\n\t\tif (!arr1[i].equalsRange(arr2[i])) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Maintain a stable viewport by trying to keep the first line in the viewport constant.\n */\nclass StableViewport {\n\tconstructor(\n\t\tpublic readonly viewportStartModelPosition: Position | null,\n\t\tpublic readonly startLineDelta: number\n\t) { }\n\n\tpublic recoverViewportStart(coordinatesConverter: ICoordinatesConverter, viewLayout: ViewLayout): void {\n\t\tif (!this.viewportStartModelPosition) {\n\t\t\treturn;\n\t\t}\n\t\tconst viewPosition = coordinatesConverter.convertModelPositionToViewPosition(this.viewportStartModelPosition);\n\t\tconst viewPositionTop = viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber);\n\t\tviewLayout.setScrollPosition({ scrollTop: viewPositionTop + this.startLineDelta }, ScrollType.Immediate);\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ArrayQueue } from '../../../base/common/arrays.js';\nimport { RunOnceScheduler } from '../../../base/common/async.js';\nimport { Color } from '../../../base/common/color.js';\nimport { Event } from '../../../base/common/event.js';\nimport { Disposable, IDisposable } from '../../../base/common/lifecycle.js';\nimport * as platform from '../../../base/common/platform.js';\nimport * as strings from '../../../base/common/strings.js';\nimport { ConfigurationChangedEvent, EditorOption, filterValidationDecorations, filterFontDecorations } from '../config/editorOptions.js';\nimport { EDITOR_FONT_DEFAULTS } from '../config/fontInfo.js';\nimport { CursorsController } from '../cursor/cursor.js';\nimport { CursorConfiguration, CursorState, EditOperationType, IColumnSelectData, PartialCursorState } from '../cursorCommon.js';\nimport { CursorChangeReason } from '../cursorEvents.js';\nimport { IPosition, Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { ISelection, Selection } from '../core/selection.js';\nimport { ICommand, ICursorState, IViewState, ScrollType } from '../editorCommon.js';\nimport { IEditorConfiguration } from '../config/editorConfiguration.js';\nimport { EndOfLinePreference, IAttachedView, ICursorStateComputer, IGlyphMarginLanesModel, IIdentifiedSingleEditOperation, ITextModel, PositionAffinity, TextDirection, TrackedRangeStickiness } from '../model.js';\nimport { IActiveIndentGuideInfo, BracketGuideOptions, IndentGuide } from '../textModelGuides.js';\nimport { ModelDecorationMinimapOptions, ModelDecorationOptions, ModelDecorationOverviewRulerOptions } from '../model/textModel.js';\nimport * as textModelEvents from '../textModelEvents.js';\nimport { TokenizationRegistry } from '../languages.js';\nimport { ColorId } from '../encodedTokenAttributes.js';\nimport { ILanguageConfigurationService } from '../languages/languageConfigurationRegistry.js';\nimport { PLAINTEXT_LANGUAGE_ID } from '../languages/modesRegistry.js';\nimport { tokenizeLineToHTML } from '../languages/textToHtmlTokenizer.js';\nimport { EditorTheme } from '../editorTheme.js';\nimport * as viewEvents from '../viewEvents.js';\nimport { ViewLayout } from '../viewLayout/viewLayout.js';\nimport { MinimapTokensColorTracker } from './minimapTokensColorTracker.js';\nimport { ILineBreaksComputer, ILineBreaksComputerFactory, InjectedText } from '../modelLineProjectionData.js';\nimport { ViewEventHandler } from '../viewEventHandler.js';\nimport { ILineHeightChangeAccessor, IViewModel, IWhitespaceChangeAccessor, MinimapLinesRenderingData, OverviewRulerDecorationsGroup, ViewLineData, ViewLineRenderingData, ViewModelDecoration } from '../viewModel.js';\nimport { ViewModelDecorations } from './viewModelDecorations.js';\nimport { FocusChangedEvent, HiddenAreasChangedEvent, ModelContentChangedEvent, ModelDecorationsChangedEvent, ModelFontChangedEvent, ModelLanguageChangedEvent, ModelLanguageConfigurationChangedEvent, ModelLineHeightChangedEvent, ModelOptionsChangedEvent, ModelTokensChangedEvent, OutgoingViewModelEvent, ReadOnlyEditAttemptEvent, ScrollChangedEvent, ViewModelEventDispatcher, ViewModelEventsCollector, ViewZonesChangedEvent, WidgetFocusChangedEvent } from '../viewModelEventDispatcher.js';\nimport { IViewModelLines, ViewModelLinesFromModelAsIs, ViewModelLinesFromProjectedModel } from './viewModelLines.js';\nimport { IThemeService } from '../../../platform/theme/common/themeService.js';\nimport { GlyphMarginLanesModel } from './glyphLanesModel.js';\nimport { ICustomLineHeightData } from '../viewLayout/lineHeights.js';\nimport { TextModelEditSource } from '../textModelEditSource.js';\nimport { InlineDecoration } from './inlineDecorations.js';\nimport { ICoordinatesConverter } from '../coordinatesConverter.js';\n\nconst USE_IDENTITY_LINES_COLLECTION = true;\n\nexport class ViewModel extends Disposable implements IViewModel {\n\n\tprivate readonly _editorId: number;\n\tprivate readonly _configuration: IEditorConfiguration;\n\tpublic readonly model: ITextModel;\n\tprivate readonly _eventDispatcher: ViewModelEventDispatcher;\n\tpublic readonly onEvent: Event<OutgoingViewModelEvent>;\n\tpublic cursorConfig: CursorConfiguration;\n\tprivate readonly _updateConfigurationViewLineCount: RunOnceScheduler;\n\tprivate _hasFocus: boolean;\n\tprivate readonly _viewportStart: ViewportStart;\n\tprivate readonly _lines: IViewModelLines;\n\tpublic readonly coordinatesConverter: ICoordinatesConverter;\n\tpublic readonly viewLayout: ViewLayout;\n\tprivate readonly _cursor: CursorsController;\n\tprivate readonly _decorations: ViewModelDecorations;\n\tpublic readonly glyphLanes: IGlyphMarginLanesModel;\n\n\tconstructor(\n\t\teditorId: number,\n\t\tconfiguration: IEditorConfiguration,\n\t\tmodel: ITextModel,\n\t\tdomLineBreaksComputerFactory: ILineBreaksComputerFactory,\n\t\tmonospaceLineBreaksComputerFactory: ILineBreaksComputerFactory,\n\t\tscheduleAtNextAnimationFrame: (callback: () => void) => IDisposable,\n\t\tprivate readonly languageConfigurationService: ILanguageConfigurationService,\n\t\tprivate readonly _themeService: IThemeService,\n\t\tprivate readonly _attachedView: IAttachedView,\n\t\tprivate readonly _transactionalTarget: IBatchableTarget,\n\t) {\n\t\tsuper();\n\n\t\tthis._editorId = editorId;\n\t\tthis._configuration = configuration;\n\t\tthis.model = model;\n\t\tthis._eventDispatcher = new ViewModelEventDispatcher();\n\t\tthis.onEvent = this._eventDispatcher.onEvent;\n\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\tthis._updateConfigurationViewLineCount = this._register(new RunOnceScheduler(() => this._updateConfigurationViewLineCountNow(), 0));\n\t\tthis._hasFocus = false;\n\t\tthis._viewportStart = ViewportStart.create(this.model);\n\t\tthis.glyphLanes = new GlyphMarginLanesModel(0);\n\n\t\tif (USE_IDENTITY_LINES_COLLECTION && this.model.isTooLargeForTokenization()) {\n\n\t\t\tthis._lines = new ViewModelLinesFromModelAsIs(this.model);\n\n\t\t} else {\n\t\t\tconst options = this._configuration.options;\n\t\t\tconst fontInfo = options.get(EditorOption.fontInfo);\n\t\t\tconst wrappingStrategy = options.get(EditorOption.wrappingStrategy);\n\t\t\tconst wrappingInfo = options.get(EditorOption.wrappingInfo);\n\t\t\tconst wrappingIndent = options.get(EditorOption.wrappingIndent);\n\t\t\tconst wordBreak = options.get(EditorOption.wordBreak);\n\t\t\tconst wrapOnEscapedLineFeeds = options.get(EditorOption.wrapOnEscapedLineFeeds);\n\n\t\t\tthis._lines = new ViewModelLinesFromProjectedModel(\n\t\t\t\tthis._editorId,\n\t\t\t\tthis.model,\n\t\t\t\tdomLineBreaksComputerFactory,\n\t\t\t\tmonospaceLineBreaksComputerFactory,\n\t\t\t\tfontInfo,\n\t\t\t\tthis.model.getOptions().tabSize,\n\t\t\t\twrappingStrategy,\n\t\t\t\twrappingInfo.wrappingColumn,\n\t\t\t\twrappingIndent,\n\t\t\t\twordBreak,\n\t\t\t\twrapOnEscapedLineFeeds\n\t\t\t);\n\t\t}\n\n\t\tthis.coordinatesConverter = this._lines.createCoordinatesConverter();\n\n\t\tthis._cursor = this._register(new CursorsController(model, this, this.coordinatesConverter, this.cursorConfig));\n\n\t\tthis.viewLayout = this._register(new ViewLayout(this._configuration, this.getLineCount(), this._getCustomLineHeights(), scheduleAtNextAnimationFrame));\n\n\t\tthis._register(this.viewLayout.onDidScroll((e) => {\n\t\t\tif (e.scrollTopChanged) {\n\t\t\t\tthis._handleVisibleLinesChanged();\n\t\t\t}\n\t\t\tif (e.scrollTopChanged) {\n\t\t\t\tthis._viewportStart.invalidate();\n\t\t\t}\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewScrollChangedEvent(e));\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ScrollChangedEvent(\n\t\t\t\te.oldScrollWidth, e.oldScrollLeft, e.oldScrollHeight, e.oldScrollTop,\n\t\t\t\te.scrollWidth, e.scrollLeft, e.scrollHeight, e.scrollTop\n\t\t\t));\n\t\t}));\n\n\t\tthis._register(this.viewLayout.onDidContentSizeChange((e) => {\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(e);\n\t\t}));\n\n\t\tthis._decorations = new ViewModelDecorations(this._editorId, this.model, this._configuration, this._lines, this.coordinatesConverter);\n\n\t\tthis._registerModelEvents();\n\n\t\tthis._register(this._configuration.onDidChangeFast((e) => {\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\tthis._onConfigurationChanged(eventsCollector, e);\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(MinimapTokensColorTracker.getInstance().onDidChange(() => {\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewTokensColorsChangedEvent());\n\t\t}));\n\n\t\tthis._register(this._themeService.onDidColorThemeChange((theme) => {\n\t\t\tthis._invalidateDecorationsColorCache();\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewThemeChangedEvent(theme));\n\t\t}));\n\n\t\tthis._updateConfigurationViewLineCountNow();\n\t}\n\n\tpublic override dispose(): void {\n\t\t// First remove listeners, as disposing the lines might end up sending\n\t\t// model decoration changed events ... and we no longer care about them ...\n\t\tsuper.dispose();\n\t\tthis._decorations.dispose();\n\t\tthis._lines.dispose();\n\t\tthis._viewportStart.dispose();\n\t\tthis._eventDispatcher.dispose();\n\t}\n\n\tpublic createLineBreaksComputer(): ILineBreaksComputer {\n\t\treturn this._lines.createLineBreaksComputer();\n\t}\n\n\tpublic addViewEventHandler(eventHandler: ViewEventHandler): void {\n\t\tthis._eventDispatcher.addViewEventHandler(eventHandler);\n\t}\n\n\tpublic removeViewEventHandler(eventHandler: ViewEventHandler): void {\n\t\tthis._eventDispatcher.removeViewEventHandler(eventHandler);\n\t}\n\n\tprivate _getCustomLineHeights(): ICustomLineHeightData[] {\n\t\tconst allowVariableLineHeights = this._configuration.options.get(EditorOption.allowVariableLineHeights);\n\t\tif (!allowVariableLineHeights) {\n\t\t\treturn [];\n\t\t}\n\t\tconst decorations = this.model.getCustomLineHeightsDecorations(this._editorId);\n\t\treturn decorations.map((d) => {\n\t\t\tconst lineNumber = d.range.startLineNumber;\n\t\t\tconst viewRange = this.coordinatesConverter.convertModelRangeToViewRange(new Range(lineNumber, 1, lineNumber, this.model.getLineMaxColumn(lineNumber)));\n\t\t\treturn {\n\t\t\t\tdecorationId: d.id,\n\t\t\t\tstartLineNumber: viewRange.startLineNumber,\n\t\t\t\tendLineNumber: viewRange.endLineNumber,\n\t\t\t\tlineHeight: d.options.lineHeight || 0\n\t\t\t};\n\t\t});\n\t}\n\n\tprivate _updateConfigurationViewLineCountNow(): void {\n\t\tthis._configuration.setViewLineCount(this._lines.getViewLineCount());\n\t}\n\n\tprivate getModelVisibleRanges(): Range[] {\n\t\tconst linesViewportData = this.viewLayout.getLinesViewportData();\n\t\tconst viewVisibleRange = new Range(\n\t\t\tlinesViewportData.startLineNumber,\n\t\t\tthis.getLineMinColumn(linesViewportData.startLineNumber),\n\t\t\tlinesViewportData.endLineNumber,\n\t\t\tthis.getLineMaxColumn(linesViewportData.endLineNumber)\n\t\t);\n\t\tconst modelVisibleRanges = this._toModelVisibleRanges(viewVisibleRange);\n\t\treturn modelVisibleRanges;\n\t}\n\n\tpublic visibleLinesStabilized(): void {\n\t\tconst modelVisibleRanges = this.getModelVisibleRanges();\n\t\tthis._attachedView.setVisibleLines(modelVisibleRanges, true);\n\t}\n\n\tprivate _handleVisibleLinesChanged(): void {\n\t\tconst modelVisibleRanges = this.getModelVisibleRanges();\n\t\tthis._attachedView.setVisibleLines(modelVisibleRanges, false);\n\t}\n\n\tpublic setHasFocus(hasFocus: boolean): void {\n\t\tthis._hasFocus = hasFocus;\n\t\tthis._cursor.setHasFocus(hasFocus);\n\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewFocusChangedEvent(hasFocus));\n\t\tthis._eventDispatcher.emitOutgoingEvent(new FocusChangedEvent(!hasFocus, hasFocus));\n\t}\n\n\tpublic setHasWidgetFocus(hasWidgetFocus: boolean): void {\n\t\tthis._eventDispatcher.emitOutgoingEvent(new WidgetFocusChangedEvent(!hasWidgetFocus, hasWidgetFocus));\n\t}\n\n\tpublic onCompositionStart(): void {\n\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewCompositionStartEvent());\n\t}\n\n\tpublic onCompositionEnd(): void {\n\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewCompositionEndEvent());\n\t}\n\n\tprivate _captureStableViewport(): StableViewport {\n\t\t// We might need to restore the current start view range, so save it (if available)\n\t\t// But only if the scroll position is not at the top of the file\n\t\tif (this._viewportStart.isValid && this.viewLayout.getCurrentScrollTop() > 0) {\n\t\t\tconst previousViewportStartViewPosition = new Position(this._viewportStart.viewLineNumber, this.getLineMinColumn(this._viewportStart.viewLineNumber));\n\t\t\tconst previousViewportStartModelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(previousViewportStartViewPosition);\n\t\t\treturn new StableViewport(previousViewportStartModelPosition, this._viewportStart.startLineDelta);\n\t\t}\n\t\treturn new StableViewport(null, 0);\n\t}\n\n\tprivate _onConfigurationChanged(eventsCollector: ViewModelEventsCollector, e: ConfigurationChangedEvent): void {\n\t\tconst stableViewport = this._captureStableViewport();\n\t\tconst options = this._configuration.options;\n\t\tconst fontInfo = options.get(EditorOption.fontInfo);\n\t\tconst wrappingStrategy = options.get(EditorOption.wrappingStrategy);\n\t\tconst wrappingInfo = options.get(EditorOption.wrappingInfo);\n\t\tconst wrappingIndent = options.get(EditorOption.wrappingIndent);\n\t\tconst wordBreak = options.get(EditorOption.wordBreak);\n\n\t\tif (this._lines.setWrappingSettings(fontInfo, wrappingStrategy, wrappingInfo.wrappingColumn, wrappingIndent, wordBreak)) {\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\n\t\t\tthis._updateConfigurationViewLineCount.schedule();\n\t\t}\n\n\t\tif (e.hasChanged(EditorOption.readOnly)) {\n\t\t\t// Must read again all decorations due to readOnly filtering\n\t\t\tthis._decorations.reset();\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t}\n\n\t\tif (e.hasChanged(EditorOption.renderValidationDecorations)) {\n\t\t\tthis._decorations.reset();\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t}\n\n\t\teventsCollector.emitViewEvent(new viewEvents.ViewConfigurationChangedEvent(e));\n\t\tthis.viewLayout.onConfigurationChanged(e);\n\n\t\tstableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout);\n\n\t\tif (CursorConfiguration.shouldRecreate(e)) {\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\t\t}\n\t}\n\n\tprivate _registerModelEvents(): void {\n\n\t\tthis._register(this.model.onDidChangeContentOrInjectedText((e) => {\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\n\t\t\t\tlet hadOtherModelChange = false;\n\t\t\t\tlet hadModelLineChangeThatChangedLineMapping = false;\n\n\t\t\t\tconst changes = (e instanceof textModelEvents.InternalModelContentChangeEvent ? e.rawContentChangedEvent.changes : e.changes);\n\t\t\t\tconst versionId = (e instanceof textModelEvents.InternalModelContentChangeEvent ? e.rawContentChangedEvent.versionId : null);\n\n\t\t\t\t// Do a first pass to compute line mappings, and a second pass to actually interpret them\n\t\t\t\tconst lineBreaksComputer = this._lines.createLineBreaksComputer();\n\t\t\t\tfor (const change of changes) {\n\t\t\t\t\tswitch (change.changeType) {\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LinesInserted: {\n\t\t\t\t\t\t\tfor (let lineIdx = 0; lineIdx < change.detail.length; lineIdx++) {\n\t\t\t\t\t\t\t\tconst line = change.detail[lineIdx];\n\t\t\t\t\t\t\t\tlet injectedText = change.injectedTexts[lineIdx];\n\t\t\t\t\t\t\t\tif (injectedText) {\n\t\t\t\t\t\t\t\t\tinjectedText = injectedText.filter(element => (!element.ownerId || element.ownerId === this._editorId));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlineBreaksComputer.addRequest(line, injectedText, null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LineChanged: {\n\t\t\t\t\t\t\tlet injectedText: textModelEvents.LineInjectedText[] | null = null;\n\t\t\t\t\t\t\tif (change.injectedText) {\n\t\t\t\t\t\t\t\tinjectedText = change.injectedText.filter(element => (!element.ownerId || element.ownerId === this._editorId));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlineBreaksComputer.addRequest(change.detail, injectedText, null);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst lineBreaks = lineBreaksComputer.finalize();\n\t\t\t\tconst lineBreakQueue = new ArrayQueue(lineBreaks);\n\n\t\t\t\tfor (const change of changes) {\n\t\t\t\t\tswitch (change.changeType) {\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.Flush: {\n\t\t\t\t\t\t\tthis._lines.onModelFlushed();\n\t\t\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\t\t\t\t\tthis._decorations.reset();\n\t\t\t\t\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\t\t\t\t\t\t\thadOtherModelChange = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LinesDeleted: {\n\t\t\t\t\t\t\tconst linesDeletedEvent = this._lines.onModelLinesDeleted(versionId, change.fromLineNumber, change.toLineNumber);\n\t\t\t\t\t\t\tif (linesDeletedEvent !== null) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesDeletedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thadOtherModelChange = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LinesInserted: {\n\t\t\t\t\t\t\tconst insertedLineBreaks = lineBreakQueue.takeCount(change.detail.length);\n\t\t\t\t\t\t\tconst linesInsertedEvent = this._lines.onModelLinesInserted(versionId, change.fromLineNumber, change.toLineNumber, insertedLineBreaks);\n\t\t\t\t\t\t\tif (linesInsertedEvent !== null) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesInsertedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thadOtherModelChange = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LineChanged: {\n\t\t\t\t\t\t\tconst changedLineBreakData = lineBreakQueue.dequeue()!;\n\t\t\t\t\t\t\tconst [lineMappingChanged, linesChangedEvent, linesInsertedEvent, linesDeletedEvent] =\n\t\t\t\t\t\t\t\tthis._lines.onModelLineChanged(versionId, change.lineNumber, changedLineBreakData);\n\t\t\t\t\t\t\thadModelLineChangeThatChangedLineMapping = lineMappingChanged;\n\t\t\t\t\t\t\tif (linesChangedEvent) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesChangedEvent);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (linesInsertedEvent) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesInsertedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (linesDeletedEvent) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesDeletedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.EOLChanged: {\n\t\t\t\t\t\t\t// Nothing to do. The new version will be accepted below\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (versionId !== null) {\n\t\t\t\t\tthis._lines.acceptVersionId(versionId);\n\t\t\t\t}\n\t\t\t\tthis.viewLayout.onHeightMaybeChanged();\n\n\t\t\t\tif (!hadOtherModelChange && hadModelLineChangeThatChangedLineMapping) {\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\n\t\t\t// Update the configuration and reset the centered view line\n\t\t\tconst viewportStartWasValid = this._viewportStart.isValid;\n\t\t\tthis._viewportStart.invalidate();\n\t\t\tthis._configuration.setModelLineCount(this.model.getLineCount());\n\t\t\tthis._updateConfigurationViewLineCountNow();\n\n\t\t\t// Recover viewport\n\t\t\tif (!this._hasFocus && this.model.getAttachedEditorCount() >= 2 && viewportStartWasValid) {\n\t\t\t\tconst modelRange = this.model._getTrackedRange(this._viewportStart.modelTrackedRange);\n\t\t\t\tif (modelRange) {\n\t\t\t\t\tconst viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(modelRange.getStartPosition());\n\t\t\t\t\tconst viewPositionTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber);\n\t\t\t\t\tthis.viewLayout.setScrollPosition({ scrollTop: viewPositionTop + this._viewportStart.startLineDelta }, ScrollType.Immediate);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\tif (e instanceof textModelEvents.InternalModelContentChangeEvent) {\n\t\t\t\t\teventsCollector.emitOutgoingEvent(new ModelContentChangedEvent(e.contentChangedEvent));\n\t\t\t\t}\n\t\t\t\tthis._cursor.onModelContentChanged(eventsCollector, e);\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\n\t\t\tthis._handleVisibleLinesChanged();\n\t\t}));\n\n\t\tconst allowVariableLineHeights = this._configuration.options.get(EditorOption.allowVariableLineHeights);\n\t\tif (allowVariableLineHeights) {\n\t\t\tthis._register(this.model.onDidChangeLineHeight((e) => {\n\t\t\t\tconst filteredChanges = e.changes.filter((change) => change.ownerId === this._editorId || change.ownerId === 0);\n\n\t\t\t\tthis.viewLayout.changeSpecialLineHeights((accessor: ILineHeightChangeAccessor) => {\n\t\t\t\t\tfor (const change of filteredChanges) {\n\t\t\t\t\t\tconst { decorationId, lineNumber, lineHeight } = change;\n\t\t\t\t\t\tconst viewRange = this.coordinatesConverter.convertModelRangeToViewRange(new Range(lineNumber, 1, lineNumber, this.model.getLineMaxColumn(lineNumber)));\n\t\t\t\t\t\tif (lineHeight !== null) {\n\t\t\t\t\t\t\taccessor.insertOrChangeCustomLineHeight(decorationId, viewRange.startLineNumber, viewRange.endLineNumber, lineHeight);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\taccessor.removeCustomLineHeight(decorationId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// recreate the model event using the filtered changes\n\t\t\t\tif (filteredChanges.length > 0) {\n\t\t\t\t\tconst filteredEvent = new textModelEvents.ModelLineHeightChangedEvent(filteredChanges);\n\t\t\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelLineHeightChangedEvent(filteredEvent));\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\tconst allowVariableFonts = this._configuration.options.get(EditorOption.effectiveAllowVariableFonts);\n\t\tif (allowVariableFonts) {\n\t\t\tthis._register(this.model.onDidChangeFont((e) => {\n\t\t\t\tconst filteredChanges = e.changes.filter((change) => change.ownerId === this._editorId || change.ownerId === 0);\n\t\t\t\t// recreate the model event using the filtered changes\n\t\t\t\tif (filteredChanges.length > 0) {\n\t\t\t\t\tconst filteredEvent = new textModelEvents.ModelFontChangedEvent(filteredChanges);\n\t\t\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelFontChangedEvent(filteredEvent));\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\tthis._register(this.model.onDidChangeTokens((e) => {\n\t\t\tconst viewRanges: { fromLineNumber: number; toLineNumber: number }[] = [];\n\t\t\tfor (let j = 0, lenJ = e.ranges.length; j < lenJ; j++) {\n\t\t\t\tconst modelRange = e.ranges[j];\n\t\t\t\tconst viewStartLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.fromLineNumber, 1)).lineNumber;\n\t\t\t\tconst viewEndLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.toLineNumber, this.model.getLineMaxColumn(modelRange.toLineNumber))).lineNumber;\n\t\t\t\tviewRanges[j] = {\n\t\t\t\t\tfromLineNumber: viewStartLineNumber,\n\t\t\t\t\ttoLineNumber: viewEndLineNumber\n\t\t\t\t};\n\t\t\t}\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewTokensChangedEvent(viewRanges));\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelTokensChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeLanguageConfiguration((e) => {\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewLanguageConfigurationEvent());\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelLanguageConfigurationChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeLanguage((e) => {\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelLanguageChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeOptions((e) => {\n\t\t\t// A tab size change causes a line mapping changed event => all view parts will repaint OK, no further event needed here\n\t\t\tif (this._lines.setTabSize(this.model.getOptions().tabSize)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\t\t\t\t} finally {\n\t\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t\t}\n\t\t\t\tthis._updateConfigurationViewLineCount.schedule();\n\t\t\t}\n\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelOptionsChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeDecorations((e) => {\n\t\t\tthis._decorations.onModelDecorationsChanged();\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewDecorationsChangedEvent(e));\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelDecorationsChangedEvent(e));\n\t\t}));\n\t}\n\n\tprivate readonly hiddenAreasModel = new HiddenAreasModel();\n\tprivate previousHiddenAreas: readonly Range[] = [];\n\n\tpublic getFontSizeAtPosition(position: IPosition): string | null {\n\t\tconst allowVariableFonts = this._configuration.options.get(EditorOption.effectiveAllowVariableFonts);\n\t\tif (!allowVariableFonts) {\n\t\t\treturn null;\n\t\t}\n\t\tconst fontDecorations = this.model.getFontDecorationsInRange(Range.fromPositions(position), this._editorId);\n\t\tlet fontSize: string = this._configuration.options.get(EditorOption.fontInfo).fontSize + 'px';\n\t\tfor (const fontDecoration of fontDecorations) {\n\t\t\tif (fontDecoration.options.fontSize) {\n\t\t\t\tfontSize = fontDecoration.options.fontSize;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn fontSize;\n\t}\n\n\t/**\n\t * @param forceUpdate If true, the hidden areas will be updated even if the new ranges are the same as the previous ranges.\n\t * This is because the model might have changed, which resets the hidden areas, but not the last cached value.\n\t * This needs a better fix in the future.\n\t*/\n\tpublic setHiddenAreas(ranges: Range[], source?: unknown, forceUpdate?: boolean): void {\n\t\tthis.hiddenAreasModel.setHiddenAreas(source, ranges);\n\t\tconst mergedRanges = this.hiddenAreasModel.getMergedRanges();\n\t\tif (mergedRanges === this.previousHiddenAreas && !forceUpdate) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.previousHiddenAreas = mergedRanges;\n\n\t\tconst stableViewport = this._captureStableViewport();\n\n\t\tlet lineMappingChanged = false;\n\t\ttry {\n\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\tlineMappingChanged = this._lines.setHiddenAreas(mergedRanges);\n\t\t\tif (lineMappingChanged) {\n\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\t\t\t\tthis.viewLayout.onHeightMaybeChanged();\n\t\t\t}\n\n\t\t\tconst firstModelLineInViewPort = stableViewport.viewportStartModelPosition?.lineNumber;\n\t\t\tconst firstModelLineIsHidden = firstModelLineInViewPort && mergedRanges.some(range => range.startLineNumber <= firstModelLineInViewPort && firstModelLineInViewPort <= range.endLineNumber);\n\t\t\tif (!firstModelLineIsHidden) {\n\t\t\t\tstableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t}\n\t\tthis._updateConfigurationViewLineCount.schedule();\n\n\t\tif (lineMappingChanged) {\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new HiddenAreasChangedEvent());\n\t\t}\n\t}\n\n\tpublic getVisibleRangesPlusViewportAboveBelow(): Range[] {\n\t\tconst layoutInfo = this._configuration.options.get(EditorOption.layoutInfo);\n\t\tconst lineHeight = this._configuration.options.get(EditorOption.lineHeight);\n\t\tconst linesAround = Math.max(20, Math.round(layoutInfo.height / lineHeight));\n\t\tconst partialData = this.viewLayout.getLinesViewportData();\n\t\tconst startViewLineNumber = Math.max(1, partialData.completelyVisibleStartLineNumber - linesAround);\n\t\tconst endViewLineNumber = Math.min(this.getLineCount(), partialData.completelyVisibleEndLineNumber + linesAround);\n\n\t\treturn this._toModelVisibleRanges(new Range(\n\t\t\tstartViewLineNumber, this.getLineMinColumn(startViewLineNumber),\n\t\t\tendViewLineNumber, this.getLineMaxColumn(endViewLineNumber)\n\t\t));\n\t}\n\n\tpublic getVisibleRanges(): Range[] {\n\t\tconst visibleViewRange = this.getCompletelyVisibleViewRange();\n\t\treturn this._toModelVisibleRanges(visibleViewRange);\n\t}\n\n\tpublic getHiddenAreas(): Range[] {\n\t\treturn this._lines.getHiddenAreas();\n\t}\n\n\tprivate _toModelVisibleRanges(visibleViewRange: Range): Range[] {\n\t\tconst visibleRange = this.coordinatesConverter.convertViewRangeToModelRange(visibleViewRange);\n\t\tconst hiddenAreas = this._lines.getHiddenAreas();\n\n\t\tif (hiddenAreas.length === 0) {\n\t\t\treturn [visibleRange];\n\t\t}\n\n\t\tconst result: Range[] = [];\n\t\tlet resultLen = 0;\n\t\tlet startLineNumber = visibleRange.startLineNumber;\n\t\tlet startColumn = visibleRange.startColumn;\n\t\tconst endLineNumber = visibleRange.endLineNumber;\n\t\tconst endColumn = visibleRange.endColumn;\n\t\tfor (let i = 0, len = hiddenAreas.length; i < len; i++) {\n\t\t\tconst hiddenStartLineNumber = hiddenAreas[i].startLineNumber;\n\t\t\tconst hiddenEndLineNumber = hiddenAreas[i].endLineNumber;\n\n\t\t\tif (hiddenEndLineNumber < startLineNumber) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (hiddenStartLineNumber > endLineNumber) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (startLineNumber < hiddenStartLineNumber) {\n\t\t\t\tresult[resultLen++] = new Range(\n\t\t\t\t\tstartLineNumber, startColumn,\n\t\t\t\t\thiddenStartLineNumber - 1, this.model.getLineMaxColumn(hiddenStartLineNumber - 1)\n\t\t\t\t);\n\t\t\t}\n\t\t\tstartLineNumber = hiddenEndLineNumber + 1;\n\t\t\tstartColumn = 1;\n\t\t}\n\n\t\tif (startLineNumber < endLineNumber || (startLineNumber === endLineNumber && startColumn < endColumn)) {\n\t\t\tresult[resultLen++] = new Range(\n\t\t\t\tstartLineNumber, startColumn,\n\t\t\t\tendLineNumber, endColumn\n\t\t\t);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic getCompletelyVisibleViewRange(): Range {\n\t\tconst partialData = this.viewLayout.getLinesViewportData();\n\t\tconst startViewLineNumber = partialData.completelyVisibleStartLineNumber;\n\t\tconst endViewLineNumber = partialData.completelyVisibleEndLineNumber;\n\n\t\treturn new Range(\n\t\t\tstartViewLineNumber, this.getLineMinColumn(startViewLineNumber),\n\t\t\tendViewLineNumber, this.getLineMaxColumn(endViewLineNumber)\n\t\t);\n\t}\n\n\tpublic getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range {\n\t\tconst partialData = this.viewLayout.getLinesViewportDataAtScrollTop(scrollTop);\n\t\tconst startViewLineNumber = partialData.completelyVisibleStartLineNumber;\n\t\tconst endViewLineNumber = partialData.completelyVisibleEndLineNumber;\n\n\t\treturn new Range(\n\t\t\tstartViewLineNumber, this.getLineMinColumn(startViewLineNumber),\n\t\t\tendViewLineNumber, this.getLineMaxColumn(endViewLineNumber)\n\t\t);\n\t}\n\n\tpublic saveState(): IViewState {\n\t\tconst compatViewState = this.viewLayout.saveState();\n\n\t\tconst scrollTop = compatViewState.scrollTop;\n\t\tconst firstViewLineNumber = this.viewLayout.getLineNumberAtVerticalOffset(scrollTop);\n\t\tconst firstPosition = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(firstViewLineNumber, this.getLineMinColumn(firstViewLineNumber)));\n\t\tconst firstPositionDeltaTop = this.viewLayout.getVerticalOffsetForLineNumber(firstViewLineNumber) - scrollTop;\n\n\t\treturn {\n\t\t\tscrollLeft: compatViewState.scrollLeft,\n\t\t\tfirstPosition: firstPosition,\n\t\t\tfirstPositionDeltaTop: firstPositionDeltaTop\n\t\t};\n\t}\n\n\tpublic reduceRestoreState(state: IViewState): { scrollLeft: number; scrollTop: number } {\n\t\tif (typeof state.firstPosition === 'undefined') {\n\t\t\t// This is a view state serialized by an older version\n\t\t\treturn this._reduceRestoreStateCompatibility(state);\n\t\t}\n\n\t\tconst modelPosition = this.model.validatePosition(state.firstPosition);\n\t\tconst viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(modelPosition);\n\t\tconst scrollTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber) - state.firstPositionDeltaTop;\n\t\treturn {\n\t\t\tscrollLeft: state.scrollLeft,\n\t\t\tscrollTop: scrollTop\n\t\t};\n\t}\n\n\tprivate _reduceRestoreStateCompatibility(state: IViewState): { scrollLeft: number; scrollTop: number } {\n\t\treturn {\n\t\t\tscrollLeft: state.scrollLeft,\n\t\t\tscrollTop: state.scrollTopWithoutViewZones!\n\t\t};\n\t}\n\n\tprivate getTabSize(): number {\n\t\treturn this.model.getOptions().tabSize;\n\t}\n\n\tpublic getLineCount(): number {\n\t\treturn this._lines.getViewLineCount();\n\t}\n\n\t/**\n\t * Gives a hint that a lot of requests are about to come in for these line numbers.\n\t */\n\tpublic setViewport(startLineNumber: number, endLineNumber: number, centeredLineNumber: number): void {\n\t\tthis._viewportStart.update(this, startLineNumber);\n\t}\n\n\tpublic getActiveIndentGuide(lineNumber: number, minLineNumber: number, maxLineNumber: number): IActiveIndentGuideInfo {\n\t\treturn this._lines.getActiveIndentGuide(lineNumber, minLineNumber, maxLineNumber);\n\t}\n\n\tpublic getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[] {\n\t\treturn this._lines.getViewLinesIndentGuides(startLineNumber, endLineNumber);\n\t}\n\n\tpublic getBracketGuidesInRangeByLine(startLineNumber: number, endLineNumber: number, activePosition: IPosition | null, options: BracketGuideOptions): IndentGuide[][] {\n\t\treturn this._lines.getViewLinesBracketGuides(startLineNumber, endLineNumber, activePosition, options);\n\t}\n\n\tpublic getLineContent(lineNumber: number): string {\n\t\treturn this._lines.getViewLineContent(lineNumber);\n\t}\n\n\tpublic getLineLength(lineNumber: number): number {\n\t\treturn this._lines.getViewLineLength(lineNumber);\n\t}\n\n\tpublic getLineMinColumn(lineNumber: number): number {\n\t\treturn this._lines.getViewLineMinColumn(lineNumber);\n\t}\n\n\tpublic getLineMaxColumn(lineNumber: number): number {\n\t\treturn this._lines.getViewLineMaxColumn(lineNumber);\n\t}\n\n\tpublic getLineFirstNonWhitespaceColumn(lineNumber: number): number {\n\t\tconst result = strings.firstNonWhitespaceIndex(this.getLineContent(lineNumber));\n\t\tif (result === -1) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn result + 1;\n\t}\n\n\tpublic getLineLastNonWhitespaceColumn(lineNumber: number): number {\n\t\tconst result = strings.lastNonWhitespaceIndex(this.getLineContent(lineNumber));\n\t\tif (result === -1) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn result + 2;\n\t}\n\n\tpublic getMinimapDecorationsInRange(range: Range): ViewModelDecoration[] {\n\t\treturn this._decorations.getMinimapDecorationsInRange(range);\n\t}\n\n\tpublic getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[] {\n\t\treturn this._decorations.getDecorationsViewportData(visibleRange).decorations;\n\t}\n\n\tpublic getInjectedTextAt(viewPosition: Position): InjectedText | null {\n\t\treturn this._lines.getInjectedTextAt(viewPosition);\n\t}\n\n\tprivate _getTextDirection(lineNumber: number, decorations: ViewModelDecoration[]): TextDirection {\n\t\tlet rtlCount = 0;\n\n\t\tfor (const decoration of decorations) {\n\t\t\tconst range = decoration.range;\n\t\t\tif (range.startLineNumber > lineNumber || range.endLineNumber < lineNumber) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst textDirection = decoration.options.textDirection;\n\t\t\tif (textDirection === TextDirection.RTL) {\n\t\t\t\trtlCount++;\n\t\t\t} else if (textDirection === TextDirection.LTR) {\n\t\t\t\trtlCount--;\n\t\t\t}\n\t\t}\n\n\t\treturn rtlCount > 0 ? TextDirection.RTL : TextDirection.LTR;\n\t}\n\n\tpublic getTextDirection(lineNumber: number): TextDirection {\n\t\tconst decorationsCollection = this._decorations.getDecorationsOnLine(lineNumber);\n\t\treturn this._getTextDirection(lineNumber, decorationsCollection.decorations);\n\t}\n\n\tpublic getViewportViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData {\n\t\tconst viewportDecorationsCollection = this._decorations.getDecorationsViewportData(visibleRange);\n\t\tconst inlineDecorations = viewportDecorationsCollection.inlineDecorations[lineNumber - visibleRange.startLineNumber];\n\t\treturn this._getViewLineRenderingData(lineNumber, inlineDecorations, viewportDecorationsCollection.hasVariableFonts, viewportDecorationsCollection.decorations);\n\t}\n\n\tpublic getViewLineRenderingData(lineNumber: number): ViewLineRenderingData {\n\t\tconst decorationsCollection = this._decorations.getDecorationsOnLine(lineNumber);\n\t\treturn this._getViewLineRenderingData(lineNumber, decorationsCollection.inlineDecorations[0], decorationsCollection.hasVariableFonts, decorationsCollection.decorations);\n\t}\n\n\tprivate _getViewLineRenderingData(lineNumber: number, inlineDecorations: InlineDecoration[], hasVariableFonts: boolean, decorations: ViewModelDecoration[]): ViewLineRenderingData {\n\t\tconst mightContainRTL = this.model.mightContainRTL();\n\t\tconst mightContainNonBasicASCII = this.model.mightContainNonBasicASCII();\n\t\tconst tabSize = this.getTabSize();\n\t\tconst lineData = this._lines.getViewLineData(lineNumber);\n\n\t\tif (lineData.inlineDecorations) {\n\t\t\tinlineDecorations = [\n\t\t\t\t...inlineDecorations,\n\t\t\t\t...lineData.inlineDecorations.map(d =>\n\t\t\t\t\td.toInlineDecoration(lineNumber)\n\t\t\t\t)\n\t\t\t];\n\t\t}\n\n\t\treturn new ViewLineRenderingData(\n\t\t\tlineData.minColumn,\n\t\t\tlineData.maxColumn,\n\t\t\tlineData.content,\n\t\t\tlineData.continuesWithWrappedLine,\n\t\t\tmightContainRTL,\n\t\t\tmightContainNonBasicASCII,\n\t\t\tlineData.tokens,\n\t\t\tinlineDecorations,\n\t\t\ttabSize,\n\t\t\tlineData.startVisibleColumn,\n\t\t\tthis._getTextDirection(lineNumber, decorations),\n\t\t\thasVariableFonts\n\t\t);\n\t}\n\n\tpublic getViewLineData(lineNumber: number): ViewLineData {\n\t\treturn this._lines.getViewLineData(lineNumber);\n\t}\n\n\tpublic getMinimapLinesRenderingData(startLineNumber: number, endLineNumber: number, needed: boolean[]): MinimapLinesRenderingData {\n\t\tconst result = this._lines.getViewLinesData(startLineNumber, endLineNumber, needed);\n\t\treturn new MinimapLinesRenderingData(\n\t\t\tthis.getTabSize(),\n\t\t\tresult\n\t\t);\n\t}\n\n\tpublic getAllOverviewRulerDecorations(theme: EditorTheme): OverviewRulerDecorationsGroup[] {\n\t\tconst decorations = this.model.getOverviewRulerDecorations(this._editorId, filterValidationDecorations(this._configuration.options), filterFontDecorations(this._configuration.options));\n\t\tconst result = new OverviewRulerDecorations();\n\t\tfor (const decoration of decorations) {\n\t\t\tconst decorationOptions = <ModelDecorationOptions>decoration.options;\n\t\t\tconst opts = decorationOptions.overviewRuler;\n\t\t\tif (!opts) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst lane = <number>opts.position;\n\t\t\tif (lane === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst color = opts.getColor(theme.value);\n\t\t\tconst viewStartLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration.range.startLineNumber, decoration.range.startColumn);\n\t\t\tconst viewEndLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration.range.endLineNumber, decoration.range.endColumn);\n\n\t\t\tresult.accept(color, decorationOptions.zIndex, viewStartLineNumber, viewEndLineNumber, lane);\n\t\t}\n\t\treturn result.asArray;\n\t}\n\n\tprivate _invalidateDecorationsColorCache(): void {\n\t\tconst decorations = this.model.getOverviewRulerDecorations();\n\t\tfor (const decoration of decorations) {\n\t\t\tconst opts1 = <ModelDecorationOverviewRulerOptions>decoration.options.overviewRuler;\n\t\t\topts1?.invalidateCachedColor();\n\t\t\tconst opts2 = <ModelDecorationMinimapOptions>decoration.options.minimap;\n\t\t\topts2?.invalidateCachedColor();\n\t\t}\n\t}\n\n\tpublic getValueInRange(range: Range, eol: EndOfLinePreference): string {\n\t\tconst modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range);\n\t\treturn this.model.getValueInRange(modelRange, eol);\n\t}\n\n\tpublic getValueLengthInRange(range: Range, eol: EndOfLinePreference): number {\n\t\tconst modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range);\n\t\treturn this.model.getValueLengthInRange(modelRange, eol);\n\t}\n\n\tpublic modifyPosition(position: Position, offset: number): Position {\n\t\tconst modelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(position);\n\t\tconst resultModelPosition = this.model.modifyPosition(modelPosition, offset);\n\t\treturn this.coordinatesConverter.convertModelPositionToViewPosition(resultModelPosition);\n\t}\n\n\tpublic deduceModelPositionRelativeToViewPosition(viewAnchorPosition: Position, deltaOffset: number, lineFeedCnt: number): Position {\n\t\tconst modelAnchor = this.coordinatesConverter.convertViewPositionToModelPosition(viewAnchorPosition);\n\t\tif (this.model.getEOL().length === 2) {\n\t\t\t// This model uses CRLF, so the delta must take that into account\n\t\t\tif (deltaOffset < 0) {\n\t\t\t\tdeltaOffset -= lineFeedCnt;\n\t\t\t} else {\n\t\t\t\tdeltaOffset += lineFeedCnt;\n\t\t\t}\n\t\t}\n\n\t\tconst modelAnchorOffset = this.model.getOffsetAt(modelAnchor);\n\t\tconst resultOffset = modelAnchorOffset + deltaOffset;\n\t\treturn this.model.getPositionAt(resultOffset);\n\t}\n\n\tpublic getPlainTextToCopy(modelRanges: Range[], emptySelectionClipboard: boolean, forceCRLF: boolean): string | string[] {\n\t\tconst newLineCharacter = forceCRLF ? '\\r\\n' : this.model.getEOL();\n\n\t\tmodelRanges = modelRanges.slice(0);\n\t\tmodelRanges.sort(Range.compareRangesUsingStarts);\n\n\t\tlet hasEmptyRange = false;\n\t\tlet hasNonEmptyRange = false;\n\t\tfor (const range of modelRanges) {\n\t\t\tif (range.isEmpty()) {\n\t\t\t\thasEmptyRange = true;\n\t\t\t} else {\n\t\t\t\thasNonEmptyRange = true;\n\t\t\t}\n\t\t}\n\n\t\tif (!hasNonEmptyRange) {\n\t\t\t// all ranges are empty\n\t\t\tif (!emptySelectionClipboard) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tconst modelLineNumbers = modelRanges.map((r) => r.startLineNumber);\n\n\t\t\tlet result = '';\n\t\t\tfor (let i = 0; i < modelLineNumbers.length; i++) {\n\t\t\t\tif (i > 0 && modelLineNumbers[i - 1] === modelLineNumbers[i]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tresult += this.model.getLineContent(modelLineNumbers[i]) + newLineCharacter;\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tif (hasEmptyRange && emptySelectionClipboard) {\n\t\t\t// mixed empty selections and non-empty selections\n\t\t\tconst result: string[] = [];\n\t\t\tlet prevModelLineNumber = 0;\n\t\t\tfor (const modelRange of modelRanges) {\n\t\t\t\tconst modelLineNumber = modelRange.startLineNumber;\n\t\t\t\tif (modelRange.isEmpty()) {\n\t\t\t\t\tif (modelLineNumber !== prevModelLineNumber) {\n\t\t\t\t\t\tresult.push(this.model.getLineContent(modelLineNumber));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresult.push(this.model.getValueInRange(modelRange, forceCRLF ? EndOfLinePreference.CRLF : EndOfLinePreference.TextDefined));\n\t\t\t\t}\n\t\t\t\tprevModelLineNumber = modelLineNumber;\n\t\t\t}\n\t\t\treturn result.length === 1 ? result[0] : result;\n\t\t}\n\n\t\tconst result: string[] = [];\n\t\tfor (const modelRange of modelRanges) {\n\t\t\tif (!modelRange.isEmpty()) {\n\t\t\t\tresult.push(this.model.getValueInRange(modelRange, forceCRLF ? EndOfLinePreference.CRLF : EndOfLinePreference.TextDefined));\n\t\t\t}\n\t\t}\n\t\treturn result.length === 1 ? result[0] : result;\n\t}\n\n\tpublic getRichTextToCopy(modelRanges: Range[], emptySelectionClipboard: boolean): { html: string; mode: string } | null {\n\t\tconst languageId = this.model.getLanguageId();\n\t\tif (languageId === PLAINTEXT_LANGUAGE_ID) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (modelRanges.length !== 1) {\n\t\t\t// no multiple selection support at this time\n\t\t\treturn null;\n\t\t}\n\n\t\tlet range = modelRanges[0];\n\t\tif (range.isEmpty()) {\n\t\t\tif (!emptySelectionClipboard) {\n\t\t\t\t// nothing to copy\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst lineNumber = range.startLineNumber;\n\t\t\trange = new Range(lineNumber, this.model.getLineMinColumn(lineNumber), lineNumber, this.model.getLineMaxColumn(lineNumber));\n\t\t}\n\n\t\tconst fontInfo = this._configuration.options.get(EditorOption.fontInfo);\n\t\tconst colorMap = this._getColorMap();\n\t\tconst hasBadChars = (/[:;\\\\\\/<>]/.test(fontInfo.fontFamily));\n\t\tconst useDefaultFontFamily = (hasBadChars || fontInfo.fontFamily === EDITOR_FONT_DEFAULTS.fontFamily);\n\t\tlet fontFamily: string;\n\t\tif (useDefaultFontFamily) {\n\t\t\tfontFamily = EDITOR_FONT_DEFAULTS.fontFamily;\n\t\t} else {\n\t\t\tfontFamily = fontInfo.fontFamily;\n\t\t\tfontFamily = fontFamily.replace(/\"/g, '\\'');\n\t\t\tconst hasQuotesOrIsList = /[,']/.test(fontFamily);\n\t\t\tif (!hasQuotesOrIsList) {\n\t\t\t\tconst needsQuotes = /[+ ]/.test(fontFamily);\n\t\t\t\tif (needsQuotes) {\n\t\t\t\t\tfontFamily = `'${fontFamily}'`;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfontFamily = `${fontFamily}, ${EDITOR_FONT_DEFAULTS.fontFamily}`;\n\t\t}\n\n\t\treturn {\n\t\t\tmode: languageId,\n\t\t\thtml: (\n\t\t\t\t`<div style=\"`\n\t\t\t\t+ `color: ${colorMap[ColorId.DefaultForeground]};`\n\t\t\t\t+ `background-color: ${colorMap[ColorId.DefaultBackground]};`\n\t\t\t\t+ `font-family: ${fontFamily};`\n\t\t\t\t+ `font-weight: ${fontInfo.fontWeight};`\n\t\t\t\t+ `font-size: ${fontInfo.fontSize}px;`\n\t\t\t\t+ `line-height: ${fontInfo.lineHeight}px;`\n\t\t\t\t+ `white-space: pre;`\n\t\t\t\t+ `\">`\n\t\t\t\t+ this._getHTMLToCopy(range, colorMap)\n\t\t\t\t+ '</div>'\n\t\t\t)\n\t\t};\n\t}\n\n\tprivate _getHTMLToCopy(modelRange: Range, colorMap: string[]): string {\n\t\tconst startLineNumber = modelRange.startLineNumber;\n\t\tconst startColumn = modelRange.startColumn;\n\t\tconst endLineNumber = modelRange.endLineNumber;\n\t\tconst endColumn = modelRange.endColumn;\n\n\t\tconst tabSize = this.getTabSize();\n\n\t\tlet result = '';\n\n\t\tfor (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n\t\t\tconst lineTokens = this.model.tokenization.getLineTokens(lineNumber);\n\t\t\tconst lineContent = lineTokens.getLineContent();\n\t\t\tconst startOffset = (lineNumber === startLineNumber ? startColumn - 1 : 0);\n\t\t\tconst endOffset = (lineNumber === endLineNumber ? endColumn - 1 : lineContent.length);\n\n\t\t\tif (lineContent === '') {\n\t\t\t\tresult += '<br>';\n\t\t\t} else {\n\t\t\t\tresult += tokenizeLineToHTML(lineContent, lineTokens.inflate(), colorMap, startOffset, endOffset, tabSize, platform.isWindows);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate _getColorMap(): string[] {\n\t\tconst colorMap = TokenizationRegistry.getColorMap();\n\t\tconst result: string[] = ['#000000'];\n\t\tif (colorMap) {\n\t\t\tfor (let i = 1, len = colorMap.length; i < len; i++) {\n\t\t\t\tresult[i] = Color.Format.CSS.formatHex(colorMap[i]);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t//#region cursor operations\n\n\tpublic getPrimaryCursorState(): CursorState {\n\t\treturn this._cursor.getPrimaryCursorState();\n\t}\n\tpublic getLastAddedCursorIndex(): number {\n\t\treturn this._cursor.getLastAddedCursorIndex();\n\t}\n\tpublic getCursorStates(): CursorState[] {\n\t\treturn this._cursor.getCursorStates();\n\t}\n\tpublic setCursorStates(source: string | null | undefined, reason: CursorChangeReason, states: PartialCursorState[] | null): boolean {\n\t\treturn this._withViewEventsCollector(eventsCollector => this._cursor.setStates(eventsCollector, source, reason, states));\n\t}\n\tpublic getCursorColumnSelectData(): IColumnSelectData {\n\t\treturn this._cursor.getCursorColumnSelectData();\n\t}\n\tpublic getCursorAutoClosedCharacters(): Range[] {\n\t\treturn this._cursor.getAutoClosedCharacters();\n\t}\n\tpublic setCursorColumnSelectData(columnSelectData: IColumnSelectData): void {\n\t\tthis._cursor.setCursorColumnSelectData(columnSelectData);\n\t}\n\tpublic getPrevEditOperationType(): EditOperationType {\n\t\treturn this._cursor.getPrevEditOperationType();\n\t}\n\tpublic setPrevEditOperationType(type: EditOperationType): void {\n\t\tthis._cursor.setPrevEditOperationType(type);\n\t}\n\tpublic getSelection(): Selection {\n\t\treturn this._cursor.getSelection();\n\t}\n\tpublic getSelections(): Selection[] {\n\t\treturn this._cursor.getSelections();\n\t}\n\tpublic getPosition(): Position {\n\t\treturn this._cursor.getPrimaryCursorState().modelState.position;\n\t}\n\tpublic setSelections(source: string | null | undefined, selections: readonly ISelection[], reason = CursorChangeReason.NotSet): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.setSelections(eventsCollector, source, selections, reason));\n\t}\n\tpublic saveCursorState(): ICursorState[] {\n\t\treturn this._cursor.saveState();\n\t}\n\tpublic restoreCursorState(states: ICursorState[]): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.restoreState(eventsCollector, states));\n\t}\n\n\tprivate _executeCursorEdit(callback: (eventsCollector: ViewModelEventsCollector) => void): void {\n\t\tif (this._cursor.context.cursorConfig.readOnly) {\n\t\t\t// we cannot edit when read only...\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ReadOnlyEditAttemptEvent());\n\t\t\treturn;\n\t\t}\n\t\tthis._withViewEventsCollector(callback);\n\t}\n\tpublic executeEdits(source: string | null | undefined, edits: IIdentifiedSingleEditOperation[], cursorStateComputer: ICursorStateComputer, reason: TextModelEditSource): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.executeEdits(eventsCollector, source, edits, cursorStateComputer, reason));\n\t}\n\tpublic startComposition(): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.startComposition(eventsCollector));\n\t}\n\tpublic endComposition(source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.endComposition(eventsCollector, source));\n\t}\n\tpublic type(text: string, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.type(eventsCollector, text, source));\n\t}\n\tpublic compositionType(text: string, replacePrevCharCnt: number, replaceNextCharCnt: number, positionDelta: number, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.compositionType(eventsCollector, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source));\n\t}\n\tpublic paste(text: string, pasteOnNewLine: boolean, multicursorText?: string[] | null | undefined, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.paste(eventsCollector, text, pasteOnNewLine, multicursorText, source));\n\t}\n\tpublic cut(source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.cut(eventsCollector, source));\n\t}\n\tpublic executeCommand(command: ICommand, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.executeCommand(eventsCollector, command, source));\n\t}\n\tpublic executeCommands(commands: ICommand[], source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.executeCommands(eventsCollector, commands, source));\n\t}\n\tpublic revealAllCursors(source: string | null | undefined, revealHorizontal: boolean, minimalReveal: boolean = false): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.revealAll(eventsCollector, source, minimalReveal, viewEvents.VerticalRevealType.Simple, revealHorizontal, ScrollType.Smooth));\n\t}\n\tpublic revealPrimaryCursor(source: string | null | undefined, revealHorizontal: boolean, minimalReveal: boolean = false): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.revealPrimary(eventsCollector, source, minimalReveal, viewEvents.VerticalRevealType.Simple, revealHorizontal, ScrollType.Smooth));\n\t}\n\tpublic revealTopMostCursor(source: string | null | undefined): void {\n\t\tconst viewPosition = this._cursor.getTopMostViewPosition();\n\t\tconst viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column);\n\t\tthis._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new viewEvents.ViewRevealRangeRequestEvent(source, false, viewRange, null, viewEvents.VerticalRevealType.Simple, true, ScrollType.Smooth)));\n\t}\n\tpublic revealBottomMostCursor(source: string | null | undefined): void {\n\t\tconst viewPosition = this._cursor.getBottomMostViewPosition();\n\t\tconst viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column);\n\t\tthis._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new viewEvents.ViewRevealRangeRequestEvent(source, false, viewRange, null, viewEvents.VerticalRevealType.Simple, true, ScrollType.Smooth)));\n\t}\n\tpublic revealRange(source: string | null | undefined, revealHorizontal: boolean, viewRange: Range, verticalType: viewEvents.VerticalRevealType, scrollType: ScrollType): void {\n\t\tthis._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new viewEvents.ViewRevealRangeRequestEvent(source, false, viewRange, null, verticalType, revealHorizontal, scrollType)));\n\t}\n\n\t//#endregion\n\n\t//#region viewLayout\n\tpublic changeWhitespace(callback: (accessor: IWhitespaceChangeAccessor) => void): void {\n\t\tconst hadAChange = this.viewLayout.changeWhitespace(callback);\n\t\tif (hadAChange) {\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewZonesChangedEvent());\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ViewZonesChangedEvent());\n\t\t}\n\t}\n\t//#endregion\n\n\tprivate _withViewEventsCollector<T>(callback: (eventsCollector: ViewModelEventsCollector) => T): T {\n\t\treturn this._transactionalTarget.batchChanges(() => {\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\treturn callback(eventsCollector);\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic batchEvents(callback: () => void): void {\n\t\tthis._withViewEventsCollector(() => { callback(); });\n\t}\n\n\tnormalizePosition(position: Position, affinity: PositionAffinity): Position {\n\t\treturn this._lines.normalizePosition(position, affinity);\n\t}\n\n\t/**\n\t * Gets the column at which indentation stops at a given line.\n\t * @internal\n\t*/\n\tgetLineIndentColumn(lineNumber: number): number {\n\t\treturn this._lines.getLineIndentColumn(lineNumber);\n\t}\n}\n\nexport interface IBatchableTarget {\n\t/**\n\t * Allows the target to apply the changes introduced by the callback in a batch.\n\t*/\n\tbatchChanges<T>(cb: () => T): T;\n}\n\nclass ViewportStart implements IDisposable {\n\n\tpublic static create(model: ITextModel): ViewportStart {\n\t\tconst viewportStartLineTrackedRange = model._setTrackedRange(null, new Range(1, 1, 1, 1), TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges);\n\t\treturn new ViewportStart(model, 1, false, viewportStartLineTrackedRange, 0);\n\t}\n\n\tpublic get viewLineNumber(): number {\n\t\treturn this._viewLineNumber;\n\t}\n\n\tpublic get isValid(): boolean {\n\t\treturn this._isValid;\n\t}\n\n\tpublic get modelTrackedRange(): string {\n\t\treturn this._modelTrackedRange;\n\t}\n\n\tpublic get startLineDelta(): number {\n\t\treturn this._startLineDelta;\n\t}\n\n\tprivate constructor(\n\t\tprivate readonly _model: ITextModel,\n\t\tprivate _viewLineNumber: number,\n\t\tprivate _isValid: boolean,\n\t\tprivate _modelTrackedRange: string,\n\t\tprivate _startLineDelta: number,\n\t) { }\n\n\tpublic dispose(): void {\n\t\tthis._model._setTrackedRange(this._modelTrackedRange, null, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges);\n\t}\n\n\tpublic update(viewModel: IViewModel, startLineNumber: number): void {\n\t\tconst position = viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(startLineNumber, viewModel.getLineMinColumn(startLineNumber)));\n\t\tconst viewportStartLineTrackedRange = viewModel.model._setTrackedRange(this._modelTrackedRange, new Range(position.lineNumber, position.column, position.lineNumber, position.column), TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges);\n\t\tconst viewportStartLineTop = viewModel.viewLayout.getVerticalOffsetForLineNumber(startLineNumber);\n\t\tconst scrollTop = viewModel.viewLayout.getCurrentScrollTop();\n\n\t\tthis._viewLineNumber = startLineNumber;\n\t\tthis._isValid = true;\n\t\tthis._modelTrackedRange = viewportStartLineTrackedRange;\n\t\tthis._startLineDelta = scrollTop - viewportStartLineTop;\n\t}\n\n\tpublic invalidate(): void {\n\t\tthis._isValid = false;\n\t}\n}\n\nclass OverviewRulerDecorations {\n\n\tprivate readonly _asMap: { [color: string]: OverviewRulerDecorationsGroup } = Object.create(null);\n\treadonly asArray: OverviewRulerDecorationsGroup[] = [];\n\n\tpublic accept(color: string, zIndex: number, startLineNumber: number, endLineNumber: number, lane: number): void {\n\t\tconst prevGroup = this._asMap[color];\n\n\t\tif (prevGroup) {\n\t\t\tconst prevData = prevGroup.data;\n\t\t\tconst prevLane = prevData[prevData.length - 3];\n\t\t\tconst prevEndLineNumber = prevData[prevData.length - 1];\n\t\t\tif (prevLane === lane && prevEndLineNumber + 1 >= startLineNumber) {\n\t\t\t\t// merge into prev\n\t\t\t\tif (endLineNumber > prevEndLineNumber) {\n\t\t\t\t\tprevData[prevData.length - 1] = endLineNumber;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// push\n\t\t\tprevData.push(lane, startLineNumber, endLineNumber);\n\t\t} else {\n\t\t\tconst group = new OverviewRulerDecorationsGroup(color, zIndex, [lane, startLineNumber, endLineNumber]);\n\t\t\tthis._asMap[color] = group;\n\t\t\tthis.asArray.push(group);\n\t\t}\n\t}\n}\n\nclass HiddenAreasModel {\n\tprivate readonly hiddenAreas = new Map<unknown, Range[]>();\n\tprivate shouldRecompute = false;\n\tprivate ranges: Range[] = [];\n\n\tsetHiddenAreas(source: unknown, ranges: Range[]): void {\n\t\tconst existing = this.hiddenAreas.get(source);\n\t\tif (existing && rangeArraysEqual(existing, ranges)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.hiddenAreas.set(source, ranges);\n\t\tthis.shouldRecompute = true;\n\t}\n\n\t/**\n\t * The returned array is immutable.\n\t*/\n\tgetMergedRanges(): readonly Range[] {\n\t\tif (!this.shouldRecompute) {\n\t\t\treturn this.ranges;\n\t\t}\n\t\tthis.shouldRecompute = false;\n\t\tconst newRanges = Array.from(this.hiddenAreas.values()).reduce((r, hiddenAreas) => mergeLineRangeArray(r, hiddenAreas), []);\n\t\tif (rangeArraysEqual(this.ranges, newRanges)) {\n\t\t\treturn this.ranges;\n\t\t}\n\t\tthis.ranges = newRanges;\n\t\treturn this.ranges;\n\t}\n}\n\nfunction mergeLineRangeArray(arr1: Range[], arr2: Range[]): Range[] {\n\tconst result: Range[] = [];\n\tlet i = 0;\n\tlet j = 0;\n\twhile (i < arr1.length && j < arr2.length) {\n\t\tconst item1 = arr1[i];\n\t\tconst item2 = arr2[j];\n\n\t\tif (item1.endLineNumber < item2.startLineNumber - 1) {\n\t\t\tresult.push(arr1[i++]);\n\t\t} else if (item2.endLineNumber < item1.startLineNumber - 1) {\n\t\t\tresult.push(arr2[j++]);\n\t\t} else {\n\t\t\tconst startLineNumber = Math.min(item1.startLineNumber, item2.startLineNumber);\n\t\t\tconst endLineNumber = Math.max(item1.endLineNumber, item2.endLineNumber);\n\t\t\tresult.push(new Range(startLineNumber, 1, endLineNumber, 1));\n\t\t\ti++;\n\t\t\tj++;\n\t\t}\n\t}\n\twhile (i < arr1.length) {\n\t\tresult.push(arr1[i++]);\n\t}\n\twhile (j < arr2.length) {\n\t\tresult.push(arr2[j++]);\n\t}\n\treturn result;\n}\n\nfunction rangeArraysEqual(arr1: Range[], arr2: Range[]): boolean {\n\tif (arr1.length !== arr2.length) {\n\t\treturn false;\n\t}\n\tfor (let i = 0; i < arr1.length; i++) {\n\t\tif (!arr1[i].equalsRange(arr2[i])) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Maintain a stable viewport by trying to keep the first line in the viewport constant.\n */\nclass StableViewport {\n\tconstructor(\n\t\tpublic readonly viewportStartModelPosition: Position | null,\n\t\tpublic readonly startLineDelta: number\n\t) { }\n\n\tpublic recoverViewportStart(coordinatesConverter: ICoordinatesConverter, viewLayout: ViewLayout): void {\n\t\tif (!this.viewportStartModelPosition) {\n\t\t\treturn;\n\t\t}\n\t\tconst viewPosition = coordinatesConverter.convertModelPositionToViewPosition(this.viewportStartModelPosition);\n\t\tconst viewPositionTop = viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber);\n\t\tviewLayout.setScrollPosition({ scrollTop: viewPositionTop + this.startLineDelta }, ScrollType.Immediate);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/common/viewModel/viewModelImpl.ts","vs/editor/common/viewModel/viewModelImpl.ts"],"names":[],"mappings":"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","file":"viewModelImpl.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ArrayQueue } from '../../../base/common/arrays.js';\nimport { RunOnceScheduler } from '../../../base/common/async.js';\nimport { Color } from '../../../base/common/color.js';\nimport { Event } from '../../../base/common/event.js';\nimport { Disposable, IDisposable } from '../../../base/common/lifecycle.js';\nimport * as platform from '../../../base/common/platform.js';\nimport * as strings from '../../../base/common/strings.js';\nimport { ConfigurationChangedEvent, EditorOption, filterValidationDecorations, filterFontDecorations } from '../config/editorOptions.js';\nimport { EDITOR_FONT_DEFAULTS } from '../config/fontInfo.js';\nimport { CursorsController } from '../cursor/cursor.js';\nimport { CursorConfiguration, CursorState, EditOperationType, IColumnSelectData, PartialCursorState } from '../cursorCommon.js';\nimport { CursorChangeReason } from '../cursorEvents.js';\nimport { IPosition, Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { ISelection, Selection } from '../core/selection.js';\nimport { ICommand, ICursorState, IViewState, ScrollType } from '../editorCommon.js';\nimport { IEditorConfiguration } from '../config/editorConfiguration.js';\nimport { EndOfLinePreference, IAttachedView, ICursorStateComputer, IGlyphMarginLanesModel, IIdentifiedSingleEditOperation, ITextModel, PositionAffinity, TextDirection, TrackedRangeStickiness } from '../model.js';\nimport { IActiveIndentGuideInfo, BracketGuideOptions, IndentGuide } from '../textModelGuides.js';\nimport { ModelDecorationMinimapOptions, ModelDecorationOptions, ModelDecorationOverviewRulerOptions } from '../model/textModel.js';\nimport * as textModelEvents from '../textModelEvents.js';\nimport { TokenizationRegistry } from '../languages.js';\nimport { ColorId } from '../encodedTokenAttributes.js';\nimport { ILanguageConfigurationService } from '../languages/languageConfigurationRegistry.js';\nimport { PLAINTEXT_LANGUAGE_ID } from '../languages/modesRegistry.js';\nimport { tokenizeLineToHTML } from '../languages/textToHtmlTokenizer.js';\nimport { EditorTheme } from '../editorTheme.js';\nimport * as viewEvents from '../viewEvents.js';\nimport { ViewLayout } from '../viewLayout/viewLayout.js';\nimport { MinimapTokensColorTracker } from './minimapTokensColorTracker.js';\nimport { ILineBreaksComputer, ILineBreaksComputerFactory, InjectedText } from '../modelLineProjectionData.js';\nimport { ViewEventHandler } from '../viewEventHandler.js';\nimport { ILineHeightChangeAccessor, IViewModel, IWhitespaceChangeAccessor, MinimapLinesRenderingData, OverviewRulerDecorationsGroup, ViewLineData, ViewLineRenderingData, ViewModelDecoration } from '../viewModel.js';\nimport { ViewModelDecorations } from './viewModelDecorations.js';\nimport { FocusChangedEvent, HiddenAreasChangedEvent, ModelContentChangedEvent, ModelDecorationsChangedEvent, ModelFontChangedEvent, ModelLanguageChangedEvent, ModelLanguageConfigurationChangedEvent, ModelLineHeightChangedEvent, ModelOptionsChangedEvent, ModelTokensChangedEvent, OutgoingViewModelEvent, ReadOnlyEditAttemptEvent, ScrollChangedEvent, ViewModelEventDispatcher, ViewModelEventsCollector, ViewZonesChangedEvent, WidgetFocusChangedEvent } from '../viewModelEventDispatcher.js';\nimport { IViewModelLines, ViewModelLinesFromModelAsIs, ViewModelLinesFromProjectedModel } from './viewModelLines.js';\nimport { IThemeService } from '../../../platform/theme/common/themeService.js';\nimport { GlyphMarginLanesModel } from './glyphLanesModel.js';\nimport { ICustomLineHeightData } from '../viewLayout/lineHeights.js';\nimport { TextModelEditSource } from '../textModelEditSource.js';\nimport { InlineDecoration } from './inlineDecorations.js';\nimport { ICoordinatesConverter } from '../coordinatesConverter.js';\n\nconst USE_IDENTITY_LINES_COLLECTION = true;\n\nexport class ViewModel extends Disposable implements IViewModel {\n\n\tprivate readonly _editorId: number;\n\tprivate readonly _configuration: IEditorConfiguration;\n\tpublic readonly model: ITextModel;\n\tprivate readonly _eventDispatcher: ViewModelEventDispatcher;\n\tpublic readonly onEvent: Event<OutgoingViewModelEvent>;\n\tpublic cursorConfig: CursorConfiguration;\n\tprivate readonly _updateConfigurationViewLineCount: RunOnceScheduler;\n\tprivate _hasFocus: boolean;\n\tprivate readonly _viewportStart: ViewportStart;\n\tprivate readonly _lines: IViewModelLines;\n\tpublic readonly coordinatesConverter: ICoordinatesConverter;\n\tpublic readonly viewLayout: ViewLayout;\n\tprivate readonly _cursor: CursorsController;\n\tprivate readonly _decorations: ViewModelDecorations;\n\tpublic readonly glyphLanes: IGlyphMarginLanesModel;\n\n\tconstructor(\n\t\teditorId: number,\n\t\tconfiguration: IEditorConfiguration,\n\t\tmodel: ITextModel,\n\t\tdomLineBreaksComputerFactory: ILineBreaksComputerFactory,\n\t\tmonospaceLineBreaksComputerFactory: ILineBreaksComputerFactory,\n\t\tscheduleAtNextAnimationFrame: (callback: () => void) => IDisposable,\n\t\tprivate readonly languageConfigurationService: ILanguageConfigurationService,\n\t\tprivate readonly _themeService: IThemeService,\n\t\tprivate readonly _attachedView: IAttachedView,\n\t\tprivate readonly _transactionalTarget: IBatchableTarget,\n\t) {\n\t\tsuper();\n\n\t\tthis._editorId = editorId;\n\t\tthis._configuration = configuration;\n\t\tthis.model = model;\n\t\tthis._eventDispatcher = new ViewModelEventDispatcher();\n\t\tthis.onEvent = this._eventDispatcher.onEvent;\n\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\tthis._updateConfigurationViewLineCount = this._register(new RunOnceScheduler(() => this._updateConfigurationViewLineCountNow(), 0));\n\t\tthis._hasFocus = false;\n\t\tthis._viewportStart = ViewportStart.create(this.model);\n\t\tthis.glyphLanes = new GlyphMarginLanesModel(0);\n\n\t\tif (USE_IDENTITY_LINES_COLLECTION && this.model.isTooLargeForTokenization()) {\n\n\t\t\tthis._lines = new ViewModelLinesFromModelAsIs(this.model);\n\n\t\t} else {\n\t\t\tconst options = this._configuration.options;\n\t\t\tconst fontInfo = options.get(EditorOption.fontInfo);\n\t\t\tconst wrappingStrategy = options.get(EditorOption.wrappingStrategy);\n\t\t\tconst wrappingInfo = options.get(EditorOption.wrappingInfo);\n\t\t\tconst wrappingIndent = options.get(EditorOption.wrappingIndent);\n\t\t\tconst wordBreak = options.get(EditorOption.wordBreak);\n\t\t\tconst wrapOnEscapedLineFeeds = options.get(EditorOption.wrapOnEscapedLineFeeds);\n\n\t\t\tthis._lines = new ViewModelLinesFromProjectedModel(\n\t\t\t\tthis._editorId,\n\t\t\t\tthis.model,\n\t\t\t\tdomLineBreaksComputerFactory,\n\t\t\t\tmonospaceLineBreaksComputerFactory,\n\t\t\t\tfontInfo,\n\t\t\t\tthis.model.getOptions().tabSize,\n\t\t\t\twrappingStrategy,\n\t\t\t\twrappingInfo.wrappingColumn,\n\t\t\t\twrappingIndent,\n\t\t\t\twordBreak,\n\t\t\t\twrapOnEscapedLineFeeds\n\t\t\t);\n\t\t}\n\n\t\tthis.coordinatesConverter = this._lines.createCoordinatesConverter();\n\n\t\tthis._cursor = this._register(new CursorsController(model, this, this.coordinatesConverter, this.cursorConfig));\n\n\t\tthis.viewLayout = this._register(new ViewLayout(this._configuration, this.getLineCount(), this._getCustomLineHeights(), scheduleAtNextAnimationFrame));\n\n\t\tthis._register(this.viewLayout.onDidScroll((e) => {\n\t\t\tif (e.scrollTopChanged) {\n\t\t\t\tthis._handleVisibleLinesChanged();\n\t\t\t}\n\t\t\tif (e.scrollTopChanged) {\n\t\t\t\tthis._viewportStart.invalidate();\n\t\t\t}\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewScrollChangedEvent(e));\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ScrollChangedEvent(\n\t\t\t\te.oldScrollWidth, e.oldScrollLeft, e.oldScrollHeight, e.oldScrollTop,\n\t\t\t\te.scrollWidth, e.scrollLeft, e.scrollHeight, e.scrollTop\n\t\t\t));\n\t\t}));\n\n\t\tthis._register(this.viewLayout.onDidContentSizeChange((e) => {\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(e);\n\t\t}));\n\n\t\tthis._decorations = new ViewModelDecorations(this._editorId, this.model, this._configuration, this._lines, this.coordinatesConverter);\n\n\t\tthis._registerModelEvents();\n\n\t\tthis._register(this._configuration.onDidChangeFast((e) => {\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\tthis._onConfigurationChanged(eventsCollector, e);\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(MinimapTokensColorTracker.getInstance().onDidChange(() => {\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewTokensColorsChangedEvent());\n\t\t}));\n\n\t\tthis._register(this._themeService.onDidColorThemeChange((theme) => {\n\t\t\tthis._invalidateDecorationsColorCache();\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewThemeChangedEvent(theme));\n\t\t}));\n\n\t\tthis._updateConfigurationViewLineCountNow();\n\t}\n\n\tpublic override dispose(): void {\n\t\t// First remove listeners, as disposing the lines might end up sending\n\t\t// model decoration changed events ... and we no longer care about them ...\n\t\tsuper.dispose();\n\t\tthis._decorations.dispose();\n\t\tthis._lines.dispose();\n\t\tthis._viewportStart.dispose();\n\t\tthis._eventDispatcher.dispose();\n\t}\n\n\tpublic createLineBreaksComputer(): ILineBreaksComputer {\n\t\treturn this._lines.createLineBreaksComputer();\n\t}\n\n\tpublic addViewEventHandler(eventHandler: ViewEventHandler): void {\n\t\tthis._eventDispatcher.addViewEventHandler(eventHandler);\n\t}\n\n\tpublic removeViewEventHandler(eventHandler: ViewEventHandler): void {\n\t\tthis._eventDispatcher.removeViewEventHandler(eventHandler);\n\t}\n\n\tprivate _getCustomLineHeights(): ICustomLineHeightData[] {\n\t\tconst allowVariableLineHeights = this._configuration.options.get(EditorOption.allowVariableLineHeights);\n\t\tif (!allowVariableLineHeights) {\n\t\t\treturn [];\n\t\t}\n\t\tconst decorations = this.model.getCustomLineHeightsDecorations(this._editorId);\n\t\treturn decorations.map((d) => {\n\t\t\tconst lineNumber = d.range.startLineNumber;\n\t\t\tconst viewRange = this.coordinatesConverter.convertModelRangeToViewRange(new Range(lineNumber, 1, lineNumber, this.model.getLineMaxColumn(lineNumber)));\n\t\t\treturn {\n\t\t\t\tdecorationId: d.id,\n\t\t\t\tstartLineNumber: viewRange.startLineNumber,\n\t\t\t\tendLineNumber: viewRange.endLineNumber,\n\t\t\t\tlineHeight: d.options.lineHeight || 0\n\t\t\t};\n\t\t});\n\t}\n\n\tprivate _updateConfigurationViewLineCountNow(): void {\n\t\tthis._configuration.setViewLineCount(this._lines.getViewLineCount());\n\t}\n\n\tprivate getModelVisibleRanges(): Range[] {\n\t\tconst linesViewportData = this.viewLayout.getLinesViewportData();\n\t\tconst viewVisibleRange = new Range(\n\t\t\tlinesViewportData.startLineNumber,\n\t\t\tthis.getLineMinColumn(linesViewportData.startLineNumber),\n\t\t\tlinesViewportData.endLineNumber,\n\t\t\tthis.getLineMaxColumn(linesViewportData.endLineNumber)\n\t\t);\n\t\tconst modelVisibleRanges = this._toModelVisibleRanges(viewVisibleRange);\n\t\treturn modelVisibleRanges;\n\t}\n\n\tpublic visibleLinesStabilized(): void {\n\t\tconst modelVisibleRanges = this.getModelVisibleRanges();\n\t\tthis._attachedView.setVisibleLines(modelVisibleRanges, true);\n\t}\n\n\tprivate _handleVisibleLinesChanged(): void {\n\t\tconst modelVisibleRanges = this.getModelVisibleRanges();\n\t\tthis._attachedView.setVisibleLines(modelVisibleRanges, false);\n\t}\n\n\tpublic setHasFocus(hasFocus: boolean): void {\n\t\tthis._hasFocus = hasFocus;\n\t\tthis._cursor.setHasFocus(hasFocus);\n\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewFocusChangedEvent(hasFocus));\n\t\tthis._eventDispatcher.emitOutgoingEvent(new FocusChangedEvent(!hasFocus, hasFocus));\n\t}\n\n\tpublic setHasWidgetFocus(hasWidgetFocus: boolean): void {\n\t\tthis._eventDispatcher.emitOutgoingEvent(new WidgetFocusChangedEvent(!hasWidgetFocus, hasWidgetFocus));\n\t}\n\n\tpublic onCompositionStart(): void {\n\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewCompositionStartEvent());\n\t}\n\n\tpublic onCompositionEnd(): void {\n\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewCompositionEndEvent());\n\t}\n\n\tprivate _captureStableViewport(): StableViewport {\n\t\t// We might need to restore the current start view range, so save it (if available)\n\t\t// But only if the scroll position is not at the top of the file\n\t\tif (this._viewportStart.isValid && this.viewLayout.getCurrentScrollTop() > 0) {\n\t\t\tconst previousViewportStartViewPosition = new Position(this._viewportStart.viewLineNumber, this.getLineMinColumn(this._viewportStart.viewLineNumber));\n\t\t\tconst previousViewportStartModelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(previousViewportStartViewPosition);\n\t\t\treturn new StableViewport(previousViewportStartModelPosition, this._viewportStart.startLineDelta);\n\t\t}\n\t\treturn new StableViewport(null, 0);\n\t}\n\n\tprivate _onConfigurationChanged(eventsCollector: ViewModelEventsCollector, e: ConfigurationChangedEvent): void {\n\t\tconst stableViewport = this._captureStableViewport();\n\t\tconst options = this._configuration.options;\n\t\tconst fontInfo = options.get(EditorOption.fontInfo);\n\t\tconst wrappingStrategy = options.get(EditorOption.wrappingStrategy);\n\t\tconst wrappingInfo = options.get(EditorOption.wrappingInfo);\n\t\tconst wrappingIndent = options.get(EditorOption.wrappingIndent);\n\t\tconst wordBreak = options.get(EditorOption.wordBreak);\n\n\t\tif (this._lines.setWrappingSettings(fontInfo, wrappingStrategy, wrappingInfo.wrappingColumn, wrappingIndent, wordBreak)) {\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\n\t\t\tthis._updateConfigurationViewLineCount.schedule();\n\t\t}\n\n\t\tif (e.hasChanged(EditorOption.readOnly)) {\n\t\t\t// Must read again all decorations due to readOnly filtering\n\t\t\tthis._decorations.reset();\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t}\n\n\t\tif (e.hasChanged(EditorOption.renderValidationDecorations)) {\n\t\t\tthis._decorations.reset();\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t}\n\n\t\teventsCollector.emitViewEvent(new viewEvents.ViewConfigurationChangedEvent(e));\n\t\tthis.viewLayout.onConfigurationChanged(e);\n\n\t\tstableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout);\n\n\t\tif (CursorConfiguration.shouldRecreate(e)) {\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\t\t}\n\t}\n\n\tprivate _registerModelEvents(): void {\n\n\t\tthis._register(this.model.onDidChangeContentOrInjectedText((e) => {\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\n\t\t\t\tlet hadOtherModelChange = false;\n\t\t\t\tlet hadModelLineChangeThatChangedLineMapping = false;\n\n\t\t\t\tconst changes = (e instanceof textModelEvents.InternalModelContentChangeEvent ? e.rawContentChangedEvent.changes : e.changes);\n\t\t\t\tconst versionId = (e instanceof textModelEvents.InternalModelContentChangeEvent ? e.rawContentChangedEvent.versionId : null);\n\n\t\t\t\t// Do a first pass to compute line mappings, and a second pass to actually interpret them\n\t\t\t\tconst lineBreaksComputer = this._lines.createLineBreaksComputer();\n\t\t\t\tfor (const change of changes) {\n\t\t\t\t\tswitch (change.changeType) {\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LinesInserted: {\n\t\t\t\t\t\t\tfor (let lineIdx = 0; lineIdx < change.detail.length; lineIdx++) {\n\t\t\t\t\t\t\t\tconst line = change.detail[lineIdx];\n\t\t\t\t\t\t\t\tlet injectedText = change.injectedTexts[lineIdx];\n\t\t\t\t\t\t\t\tif (injectedText) {\n\t\t\t\t\t\t\t\t\tinjectedText = injectedText.filter(element => (!element.ownerId || element.ownerId === this._editorId));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlineBreaksComputer.addRequest(line, injectedText, null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LineChanged: {\n\t\t\t\t\t\t\tlet injectedText: textModelEvents.LineInjectedText[] | null = null;\n\t\t\t\t\t\t\tif (change.injectedText) {\n\t\t\t\t\t\t\t\tinjectedText = change.injectedText.filter(element => (!element.ownerId || element.ownerId === this._editorId));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlineBreaksComputer.addRequest(change.detail, injectedText, null);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst lineBreaks = lineBreaksComputer.finalize();\n\t\t\t\tconst lineBreakQueue = new ArrayQueue(lineBreaks);\n\n\t\t\t\tfor (const change of changes) {\n\t\t\t\t\tswitch (change.changeType) {\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.Flush: {\n\t\t\t\t\t\t\tthis._lines.onModelFlushed();\n\t\t\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\t\t\t\t\tthis._decorations.reset();\n\t\t\t\t\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\t\t\t\t\t\t\thadOtherModelChange = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LinesDeleted: {\n\t\t\t\t\t\t\tconst linesDeletedEvent = this._lines.onModelLinesDeleted(versionId, change.fromLineNumber, change.toLineNumber);\n\t\t\t\t\t\t\tif (linesDeletedEvent !== null) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesDeletedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thadOtherModelChange = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LinesInserted: {\n\t\t\t\t\t\t\tconst insertedLineBreaks = lineBreakQueue.takeCount(change.detail.length);\n\t\t\t\t\t\t\tconst linesInsertedEvent = this._lines.onModelLinesInserted(versionId, change.fromLineNumber, change.toLineNumber, insertedLineBreaks);\n\t\t\t\t\t\t\tif (linesInsertedEvent !== null) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesInsertedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thadOtherModelChange = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LineChanged: {\n\t\t\t\t\t\t\tconst changedLineBreakData = lineBreakQueue.dequeue()!;\n\t\t\t\t\t\t\tconst [lineMappingChanged, linesChangedEvent, linesInsertedEvent, linesDeletedEvent] =\n\t\t\t\t\t\t\t\tthis._lines.onModelLineChanged(versionId, change.lineNumber, changedLineBreakData);\n\t\t\t\t\t\t\thadModelLineChangeThatChangedLineMapping = lineMappingChanged;\n\t\t\t\t\t\t\tif (linesChangedEvent) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesChangedEvent);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (linesInsertedEvent) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesInsertedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (linesDeletedEvent) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesDeletedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.EOLChanged: {\n\t\t\t\t\t\t\t// Nothing to do. The new version will be accepted below\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (versionId !== null) {\n\t\t\t\t\tthis._lines.acceptVersionId(versionId);\n\t\t\t\t}\n\t\t\t\tthis.viewLayout.onHeightMaybeChanged();\n\n\t\t\t\tif (!hadOtherModelChange && hadModelLineChangeThatChangedLineMapping) {\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\n\t\t\t// Update the configuration and reset the centered view line\n\t\t\tconst viewportStartWasValid = this._viewportStart.isValid;\n\t\t\tthis._viewportStart.invalidate();\n\t\t\tthis._configuration.setModelLineCount(this.model.getLineCount());\n\t\t\tthis._updateConfigurationViewLineCountNow();\n\n\t\t\t// Recover viewport\n\t\t\tif (!this._hasFocus && this.model.getAttachedEditorCount() >= 2 && viewportStartWasValid) {\n\t\t\t\tconst modelRange = this.model._getTrackedRange(this._viewportStart.modelTrackedRange);\n\t\t\t\tif (modelRange) {\n\t\t\t\t\tconst viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(modelRange.getStartPosition());\n\t\t\t\t\tconst viewPositionTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber);\n\t\t\t\t\tthis.viewLayout.setScrollPosition({ scrollTop: viewPositionTop + this._viewportStart.startLineDelta }, ScrollType.Immediate);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\tif (e instanceof textModelEvents.InternalModelContentChangeEvent) {\n\t\t\t\t\teventsCollector.emitOutgoingEvent(new ModelContentChangedEvent(e.contentChangedEvent));\n\t\t\t\t}\n\t\t\t\tthis._cursor.onModelContentChanged(eventsCollector, e);\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\n\t\t\tthis._handleVisibleLinesChanged();\n\t\t}));\n\n\t\tconst allowVariableLineHeights = this._configuration.options.get(EditorOption.allowVariableLineHeights);\n\t\tif (allowVariableLineHeights) {\n\t\t\tthis._register(this.model.onDidChangeLineHeight((e) => {\n\t\t\t\tconst filteredChanges = e.changes.filter((change) => change.ownerId === this._editorId || change.ownerId === 0);\n\n\t\t\t\tthis.viewLayout.changeSpecialLineHeights((accessor: ILineHeightChangeAccessor) => {\n\t\t\t\t\tfor (const change of filteredChanges) {\n\t\t\t\t\t\tconst { decorationId, lineNumber, lineHeight } = change;\n\t\t\t\t\t\tconst viewRange = this.coordinatesConverter.convertModelRangeToViewRange(new Range(lineNumber, 1, lineNumber, this.model.getLineMaxColumn(lineNumber)));\n\t\t\t\t\t\tif (lineHeight !== null) {\n\t\t\t\t\t\t\taccessor.insertOrChangeCustomLineHeight(decorationId, viewRange.startLineNumber, viewRange.endLineNumber, lineHeight);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\taccessor.removeCustomLineHeight(decorationId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// recreate the model event using the filtered changes\n\t\t\t\tif (filteredChanges.length > 0) {\n\t\t\t\t\tconst filteredEvent = new textModelEvents.ModelLineHeightChangedEvent(filteredChanges);\n\t\t\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelLineHeightChangedEvent(filteredEvent));\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\tconst allowVariableFonts = this._configuration.options.get(EditorOption.effectiveAllowVariableFonts);\n\t\tif (allowVariableFonts) {\n\t\t\tthis._register(this.model.onDidChangeFont((e) => {\n\t\t\t\tconst filteredChanges = e.changes.filter((change) => change.ownerId === this._editorId || change.ownerId === 0);\n\t\t\t\t// recreate the model event using the filtered changes\n\t\t\t\tif (filteredChanges.length > 0) {\n\t\t\t\t\tconst filteredEvent = new textModelEvents.ModelFontChangedEvent(filteredChanges);\n\t\t\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelFontChangedEvent(filteredEvent));\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\tthis._register(this.model.onDidChangeTokens((e) => {\n\t\t\tconst viewRanges: { fromLineNumber: number; toLineNumber: number }[] = [];\n\t\t\tfor (let j = 0, lenJ = e.ranges.length; j < lenJ; j++) {\n\t\t\t\tconst modelRange = e.ranges[j];\n\t\t\t\tconst viewStartLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.fromLineNumber, 1)).lineNumber;\n\t\t\t\tconst viewEndLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.toLineNumber, this.model.getLineMaxColumn(modelRange.toLineNumber))).lineNumber;\n\t\t\t\tviewRanges[j] = {\n\t\t\t\t\tfromLineNumber: viewStartLineNumber,\n\t\t\t\t\ttoLineNumber: viewEndLineNumber\n\t\t\t\t};\n\t\t\t}\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewTokensChangedEvent(viewRanges));\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelTokensChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeLanguageConfiguration((e) => {\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewLanguageConfigurationEvent());\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelLanguageConfigurationChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeLanguage((e) => {\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelLanguageChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeOptions((e) => {\n\t\t\t// A tab size change causes a line mapping changed event => all view parts will repaint OK, no further event needed here\n\t\t\tif (this._lines.setTabSize(this.model.getOptions().tabSize)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\t\t\t\t} finally {\n\t\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t\t}\n\t\t\t\tthis._updateConfigurationViewLineCount.schedule();\n\t\t\t}\n\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelOptionsChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeDecorations((e) => {\n\t\t\tthis._decorations.onModelDecorationsChanged();\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewDecorationsChangedEvent(e));\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelDecorationsChangedEvent(e));\n\t\t}));\n\t}\n\n\tprivate readonly hiddenAreasModel = new HiddenAreasModel();\n\tprivate previousHiddenAreas: readonly Range[] = [];\n\n\tpublic getFontSizeAtPosition(position: IPosition): string | null {\n\t\tconst allowVariableFonts = this._configuration.options.get(EditorOption.effectiveAllowVariableFonts);\n\t\tif (!allowVariableFonts) {\n\t\t\treturn null;\n\t\t}\n\t\tconst fontDecorations = this.model.getFontDecorationsInRange(Range.fromPositions(position), this._editorId);\n\t\tlet fontSize: string = this._configuration.options.get(EditorOption.fontInfo).fontSize + 'px';\n\t\tfor (const fontDecoration of fontDecorations) {\n\t\t\tif (fontDecoration.options.fontSize) {\n\t\t\t\tfontSize = fontDecoration.options.fontSize;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn fontSize;\n\t}\n\n\t/**\n\t * @param forceUpdate If true, the hidden areas will be updated even if the new ranges are the same as the previous ranges.\n\t * This is because the model might have changed, which resets the hidden areas, but not the last cached value.\n\t * This needs a better fix in the future.\n\t*/\n\tpublic setHiddenAreas(ranges: Range[], source?: unknown, forceUpdate?: boolean): void {\n\t\tthis.hiddenAreasModel.setHiddenAreas(source, ranges);\n\t\tconst mergedRanges = this.hiddenAreasModel.getMergedRanges();\n\t\tif (mergedRanges === this.previousHiddenAreas && !forceUpdate) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.previousHiddenAreas = mergedRanges;\n\n\t\tconst stableViewport = this._captureStableViewport();\n\n\t\tlet lineMappingChanged = false;\n\t\ttry {\n\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\tlineMappingChanged = this._lines.setHiddenAreas(mergedRanges);\n\t\t\tif (lineMappingChanged) {\n\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\t\t\t\tthis.viewLayout.onHeightMaybeChanged();\n\t\t\t}\n\n\t\t\tconst firstModelLineInViewPort = stableViewport.viewportStartModelPosition?.lineNumber;\n\t\t\tconst firstModelLineIsHidden = firstModelLineInViewPort && mergedRanges.some(range => range.startLineNumber <= firstModelLineInViewPort && firstModelLineInViewPort <= range.endLineNumber);\n\t\t\tif (!firstModelLineIsHidden) {\n\t\t\t\tstableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t}\n\t\tthis._updateConfigurationViewLineCount.schedule();\n\n\t\tif (lineMappingChanged) {\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new HiddenAreasChangedEvent());\n\t\t}\n\t}\n\n\tpublic getVisibleRangesPlusViewportAboveBelow(): Range[] {\n\t\tconst layoutInfo = this._configuration.options.get(EditorOption.layoutInfo);\n\t\tconst lineHeight = this._configuration.options.get(EditorOption.lineHeight);\n\t\tconst linesAround = Math.max(20, Math.round(layoutInfo.height / lineHeight));\n\t\tconst partialData = this.viewLayout.getLinesViewportData();\n\t\tconst startViewLineNumber = Math.max(1, partialData.completelyVisibleStartLineNumber - linesAround);\n\t\tconst endViewLineNumber = Math.min(this.getLineCount(), partialData.completelyVisibleEndLineNumber + linesAround);\n\n\t\treturn this._toModelVisibleRanges(new Range(\n\t\t\tstartViewLineNumber, this.getLineMinColumn(startViewLineNumber),\n\t\t\tendViewLineNumber, this.getLineMaxColumn(endViewLineNumber)\n\t\t));\n\t}\n\n\tpublic getVisibleRanges(): Range[] {\n\t\tconst visibleViewRange = this.getCompletelyVisibleViewRange();\n\t\treturn this._toModelVisibleRanges(visibleViewRange);\n\t}\n\n\tpublic getHiddenAreas(): Range[] {\n\t\treturn this._lines.getHiddenAreas();\n\t}\n\n\tprivate _toModelVisibleRanges(visibleViewRange: Range): Range[] {\n\t\tconst visibleRange = this.coordinatesConverter.convertViewRangeToModelRange(visibleViewRange);\n\t\tconst hiddenAreas = this._lines.getHiddenAreas();\n\n\t\tif (hiddenAreas.length === 0) {\n\t\t\treturn [visibleRange];\n\t\t}\n\n\t\tconst result: Range[] = [];\n\t\tlet resultLen = 0;\n\t\tlet startLineNumber = visibleRange.startLineNumber;\n\t\tlet startColumn = visibleRange.startColumn;\n\t\tconst endLineNumber = visibleRange.endLineNumber;\n\t\tconst endColumn = visibleRange.endColumn;\n\t\tfor (let i = 0, len = hiddenAreas.length; i < len; i++) {\n\t\t\tconst hiddenStartLineNumber = hiddenAreas[i].startLineNumber;\n\t\t\tconst hiddenEndLineNumber = hiddenAreas[i].endLineNumber;\n\n\t\t\tif (hiddenEndLineNumber < startLineNumber) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (hiddenStartLineNumber > endLineNumber) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (startLineNumber < hiddenStartLineNumber) {\n\t\t\t\tresult[resultLen++] = new Range(\n\t\t\t\t\tstartLineNumber, startColumn,\n\t\t\t\t\thiddenStartLineNumber - 1, this.model.getLineMaxColumn(hiddenStartLineNumber - 1)\n\t\t\t\t);\n\t\t\t}\n\t\t\tstartLineNumber = hiddenEndLineNumber + 1;\n\t\t\tstartColumn = 1;\n\t\t}\n\n\t\tif (startLineNumber < endLineNumber || (startLineNumber === endLineNumber && startColumn < endColumn)) {\n\t\t\tresult[resultLen++] = new Range(\n\t\t\t\tstartLineNumber, startColumn,\n\t\t\t\tendLineNumber, endColumn\n\t\t\t);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic getCompletelyVisibleViewRange(): Range {\n\t\tconst partialData = this.viewLayout.getLinesViewportData();\n\t\tconst startViewLineNumber = partialData.completelyVisibleStartLineNumber;\n\t\tconst endViewLineNumber = partialData.completelyVisibleEndLineNumber;\n\n\t\treturn new Range(\n\t\t\tstartViewLineNumber, this.getLineMinColumn(startViewLineNumber),\n\t\t\tendViewLineNumber, this.getLineMaxColumn(endViewLineNumber)\n\t\t);\n\t}\n\n\tpublic getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range {\n\t\tconst partialData = this.viewLayout.getLinesViewportDataAtScrollTop(scrollTop);\n\t\tconst startViewLineNumber = partialData.completelyVisibleStartLineNumber;\n\t\tconst endViewLineNumber = partialData.completelyVisibleEndLineNumber;\n\n\t\treturn new Range(\n\t\t\tstartViewLineNumber, this.getLineMinColumn(startViewLineNumber),\n\t\t\tendViewLineNumber, this.getLineMaxColumn(endViewLineNumber)\n\t\t);\n\t}\n\n\tpublic saveState(): IViewState {\n\t\tconst compatViewState = this.viewLayout.saveState();\n\n\t\tconst scrollTop = compatViewState.scrollTop;\n\t\tconst firstViewLineNumber = this.viewLayout.getLineNumberAtVerticalOffset(scrollTop);\n\t\tconst firstPosition = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(firstViewLineNumber, this.getLineMinColumn(firstViewLineNumber)));\n\t\tconst firstPositionDeltaTop = this.viewLayout.getVerticalOffsetForLineNumber(firstViewLineNumber) - scrollTop;\n\n\t\treturn {\n\t\t\tscrollLeft: compatViewState.scrollLeft,\n\t\t\tfirstPosition: firstPosition,\n\t\t\tfirstPositionDeltaTop: firstPositionDeltaTop\n\t\t};\n\t}\n\n\tpublic reduceRestoreState(state: IViewState): { scrollLeft: number; scrollTop: number } {\n\t\tif (typeof state.firstPosition === 'undefined') {\n\t\t\t// This is a view state serialized by an older version\n\t\t\treturn this._reduceRestoreStateCompatibility(state);\n\t\t}\n\n\t\tconst modelPosition = this.model.validatePosition(state.firstPosition);\n\t\tconst viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(modelPosition);\n\t\tconst scrollTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber) - state.firstPositionDeltaTop;\n\t\treturn {\n\t\t\tscrollLeft: state.scrollLeft,\n\t\t\tscrollTop: scrollTop\n\t\t};\n\t}\n\n\tprivate _reduceRestoreStateCompatibility(state: IViewState): { scrollLeft: number; scrollTop: number } {\n\t\treturn {\n\t\t\tscrollLeft: state.scrollLeft,\n\t\t\tscrollTop: state.scrollTopWithoutViewZones!\n\t\t};\n\t}\n\n\tprivate getTabSize(): number {\n\t\treturn this.model.getOptions().tabSize;\n\t}\n\n\tpublic getLineCount(): number {\n\t\treturn this._lines.getViewLineCount();\n\t}\n\n\t/**\n\t * Gives a hint that a lot of requests are about to come in for these line numbers.\n\t */\n\tpublic setViewport(startLineNumber: number, endLineNumber: number, centeredLineNumber: number): void {\n\t\tthis._viewportStart.update(this, startLineNumber);\n\t}\n\n\tpublic getActiveIndentGuide(lineNumber: number, minLineNumber: number, maxLineNumber: number): IActiveIndentGuideInfo {\n\t\treturn this._lines.getActiveIndentGuide(lineNumber, minLineNumber, maxLineNumber);\n\t}\n\n\tpublic getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[] {\n\t\treturn this._lines.getViewLinesIndentGuides(startLineNumber, endLineNumber);\n\t}\n\n\tpublic getBracketGuidesInRangeByLine(startLineNumber: number, endLineNumber: number, activePosition: IPosition | null, options: BracketGuideOptions): IndentGuide[][] {\n\t\treturn this._lines.getViewLinesBracketGuides(startLineNumber, endLineNumber, activePosition, options);\n\t}\n\n\tpublic getLineContent(lineNumber: number): string {\n\t\treturn this._lines.getViewLineContent(lineNumber);\n\t}\n\n\tpublic getLineLength(lineNumber: number): number {\n\t\treturn this._lines.getViewLineLength(lineNumber);\n\t}\n\n\tpublic getLineMinColumn(lineNumber: number): number {\n\t\treturn this._lines.getViewLineMinColumn(lineNumber);\n\t}\n\n\tpublic getLineMaxColumn(lineNumber: number): number {\n\t\treturn this._lines.getViewLineMaxColumn(lineNumber);\n\t}\n\n\tpublic getLineFirstNonWhitespaceColumn(lineNumber: number): number {\n\t\tconst result = strings.firstNonWhitespaceIndex(this.getLineContent(lineNumber));\n\t\tif (result === -1) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn result + 1;\n\t}\n\n\tpublic getLineLastNonWhitespaceColumn(lineNumber: number): number {\n\t\tconst result = strings.lastNonWhitespaceIndex(this.getLineContent(lineNumber));\n\t\tif (result === -1) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn result + 2;\n\t}\n\n\tpublic getMinimapDecorationsInRange(range: Range): ViewModelDecoration[] {\n\t\treturn this._decorations.getMinimapDecorationsInRange(range);\n\t}\n\n\tpublic getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[] {\n\t\treturn this._decorations.getDecorationsViewportData(visibleRange).decorations;\n\t}\n\n\tpublic getInjectedTextAt(viewPosition: Position): InjectedText | null {\n\t\treturn this._lines.getInjectedTextAt(viewPosition);\n\t}\n\n\tprivate _getTextDirection(lineNumber: number, decorations: ViewModelDecoration[]): TextDirection {\n\t\tlet rtlCount = 0;\n\n\t\tfor (const decoration of decorations) {\n\t\t\tconst range = decoration.range;\n\t\t\tif (range.startLineNumber > lineNumber || range.endLineNumber < lineNumber) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst textDirection = decoration.options.textDirection;\n\t\t\tif (textDirection === TextDirection.RTL) {\n\t\t\t\trtlCount++;\n\t\t\t} else if (textDirection === TextDirection.LTR) {\n\t\t\t\trtlCount--;\n\t\t\t}\n\t\t}\n\n\t\treturn rtlCount > 0 ? TextDirection.RTL : TextDirection.LTR;\n\t}\n\n\tpublic getTextDirection(lineNumber: number): TextDirection {\n\t\tconst decorationsCollection = this._decorations.getDecorationsOnLine(lineNumber);\n\t\treturn this._getTextDirection(lineNumber, decorationsCollection.decorations);\n\t}\n\n\tpublic getViewportViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData {\n\t\tconst viewportDecorationsCollection = this._decorations.getDecorationsViewportData(visibleRange);\n\t\tconst inlineDecorations = viewportDecorationsCollection.inlineDecorations[lineNumber - visibleRange.startLineNumber];\n\t\treturn this._getViewLineRenderingData(lineNumber, inlineDecorations, viewportDecorationsCollection.hasVariableFonts, viewportDecorationsCollection.decorations);\n\t}\n\n\tpublic getViewLineRenderingData(lineNumber: number): ViewLineRenderingData {\n\t\tconst decorationsCollection = this._decorations.getDecorationsOnLine(lineNumber);\n\t\treturn this._getViewLineRenderingData(lineNumber, decorationsCollection.inlineDecorations[0], decorationsCollection.hasVariableFonts, decorationsCollection.decorations);\n\t}\n\n\tprivate _getViewLineRenderingData(lineNumber: number, inlineDecorations: InlineDecoration[], hasVariableFonts: boolean, decorations: ViewModelDecoration[]): ViewLineRenderingData {\n\t\tconst mightContainRTL = this.model.mightContainRTL();\n\t\tconst mightContainNonBasicASCII = this.model.mightContainNonBasicASCII();\n\t\tconst tabSize = this.getTabSize();\n\t\tconst lineData = this._lines.getViewLineData(lineNumber);\n\n\t\tif (lineData.inlineDecorations) {\n\t\t\tinlineDecorations = [\n\t\t\t\t...inlineDecorations,\n\t\t\t\t...lineData.inlineDecorations.map(d =>\n\t\t\t\t\td.toInlineDecoration(lineNumber)\n\t\t\t\t)\n\t\t\t];\n\t\t}\n\n\t\treturn new ViewLineRenderingData(\n\t\t\tlineData.minColumn,\n\t\t\tlineData.maxColumn,\n\t\t\tlineData.content,\n\t\t\tlineData.continuesWithWrappedLine,\n\t\t\tmightContainRTL,\n\t\t\tmightContainNonBasicASCII,\n\t\t\tlineData.tokens,\n\t\t\tinlineDecorations,\n\t\t\ttabSize,\n\t\t\tlineData.startVisibleColumn,\n\t\t\tthis._getTextDirection(lineNumber, decorations),\n\t\t\thasVariableFonts\n\t\t);\n\t}\n\n\tpublic getViewLineData(lineNumber: number): ViewLineData {\n\t\treturn this._lines.getViewLineData(lineNumber);\n\t}\n\n\tpublic getMinimapLinesRenderingData(startLineNumber: number, endLineNumber: number, needed: boolean[]): MinimapLinesRenderingData {\n\t\tconst result = this._lines.getViewLinesData(startLineNumber, endLineNumber, needed);\n\t\treturn new MinimapLinesRenderingData(\n\t\t\tthis.getTabSize(),\n\t\t\tresult\n\t\t);\n\t}\n\n\tpublic getAllOverviewRulerDecorations(theme: EditorTheme): OverviewRulerDecorationsGroup[] {\n\t\tconst decorations = this.model.getOverviewRulerDecorations(this._editorId, filterValidationDecorations(this._configuration.options), filterFontDecorations(this._configuration.options));\n\t\tconst result = new OverviewRulerDecorations();\n\t\tfor (const decoration of decorations) {\n\t\t\tconst decorationOptions = <ModelDecorationOptions>decoration.options;\n\t\t\tconst opts = decorationOptions.overviewRuler;\n\t\t\tif (!opts) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst lane = <number>opts.position;\n\t\t\tif (lane === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst color = opts.getColor(theme.value);\n\t\t\tconst viewStartLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration.range.startLineNumber, decoration.range.startColumn);\n\t\t\tconst viewEndLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration.range.endLineNumber, decoration.range.endColumn);\n\n\t\t\tresult.accept(color, decorationOptions.zIndex, viewStartLineNumber, viewEndLineNumber, lane);\n\t\t}\n\t\treturn result.asArray;\n\t}\n\n\tprivate _invalidateDecorationsColorCache(): void {\n\t\tconst decorations = this.model.getOverviewRulerDecorations();\n\t\tfor (const decoration of decorations) {\n\t\t\tconst opts1 = <ModelDecorationOverviewRulerOptions>decoration.options.overviewRuler;\n\t\t\topts1?.invalidateCachedColor();\n\t\t\tconst opts2 = <ModelDecorationMinimapOptions>decoration.options.minimap;\n\t\t\topts2?.invalidateCachedColor();\n\t\t}\n\t}\n\n\tpublic getValueInRange(range: Range, eol: EndOfLinePreference): string {\n\t\tconst modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range);\n\t\treturn this.model.getValueInRange(modelRange, eol);\n\t}\n\n\tpublic getValueLengthInRange(range: Range, eol: EndOfLinePreference): number {\n\t\tconst modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range);\n\t\treturn this.model.getValueLengthInRange(modelRange, eol);\n\t}\n\n\tpublic modifyPosition(position: Position, offset: number): Position {\n\t\tconst modelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(position);\n\t\tconst resultModelPosition = this.model.modifyPosition(modelPosition, offset);\n\t\treturn this.coordinatesConverter.convertModelPositionToViewPosition(resultModelPosition);\n\t}\n\n\tpublic deduceModelPositionRelativeToViewPosition(viewAnchorPosition: Position, deltaOffset: number, lineFeedCnt: number): Position {\n\t\tconst modelAnchor = this.coordinatesConverter.convertViewPositionToModelPosition(viewAnchorPosition);\n\t\tif (this.model.getEOL().length === 2) {\n\t\t\t// This model uses CRLF, so the delta must take that into account\n\t\t\tif (deltaOffset < 0) {\n\t\t\t\tdeltaOffset -= lineFeedCnt;\n\t\t\t} else {\n\t\t\t\tdeltaOffset += lineFeedCnt;\n\t\t\t}\n\t\t}\n\n\t\tconst modelAnchorOffset = this.model.getOffsetAt(modelAnchor);\n\t\tconst resultOffset = modelAnchorOffset + deltaOffset;\n\t\treturn this.model.getPositionAt(resultOffset);\n\t}\n\n\tpublic getPlainTextToCopy(modelRanges: Range[], emptySelectionClipboard: boolean, forceCRLF: boolean): string | string[] {\n\t\tconst newLineCharacter = forceCRLF ? '\\r\\n' : this.model.getEOL();\n\n\t\tmodelRanges = modelRanges.slice(0);\n\t\tmodelRanges.sort(Range.compareRangesUsingStarts);\n\n\t\tlet hasEmptyRange = false;\n\t\tlet hasNonEmptyRange = false;\n\t\tfor (const range of modelRanges) {\n\t\t\tif (range.isEmpty()) {\n\t\t\t\thasEmptyRange = true;\n\t\t\t} else {\n\t\t\t\thasNonEmptyRange = true;\n\t\t\t}\n\t\t}\n\n\t\tif (!hasNonEmptyRange && !emptySelectionClipboard) {\n\t\t\t// all ranges are empty\n\t\t\treturn '';\n\t\t}\n\n\t\tif (hasEmptyRange && emptySelectionClipboard) {\n\t\t\t// some (maybe all) empty selections\n\t\t\tconst result: string[] = [];\n\t\t\tlet prevModelLineNumber = 0;\n\t\t\tfor (const modelRange of modelRanges) {\n\t\t\t\tconst modelLineNumber = modelRange.startLineNumber;\n\t\t\t\tif (modelRange.isEmpty()) {\n\t\t\t\t\tif (modelLineNumber !== prevModelLineNumber) {\n\t\t\t\t\t\tresult.push(this.model.getLineContent(modelLineNumber) + newLineCharacter);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresult.push(this.model.getValueInRange(modelRange, forceCRLF ? EndOfLinePreference.CRLF : EndOfLinePreference.TextDefined));\n\t\t\t\t}\n\t\t\t\tprevModelLineNumber = modelLineNumber;\n\t\t\t}\n\t\t\treturn result.length === 1 ? result[0] : result;\n\t\t}\n\n\t\tconst result: string[] = [];\n\t\tfor (const modelRange of modelRanges) {\n\t\t\tif (!modelRange.isEmpty()) {\n\t\t\t\tresult.push(this.model.getValueInRange(modelRange, forceCRLF ? EndOfLinePreference.CRLF : EndOfLinePreference.TextDefined));\n\t\t\t}\n\t\t}\n\t\treturn result.length === 1 ? result[0] : result;\n\t}\n\n\tpublic getRichTextToCopy(modelRanges: Range[], emptySelectionClipboard: boolean): { html: string; mode: string } | null {\n\t\tconst languageId = this.model.getLanguageId();\n\t\tif (languageId === PLAINTEXT_LANGUAGE_ID) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (modelRanges.length !== 1) {\n\t\t\t// no multiple selection support at this time\n\t\t\treturn null;\n\t\t}\n\n\t\tlet range = modelRanges[0];\n\t\tif (range.isEmpty()) {\n\t\t\tif (!emptySelectionClipboard) {\n\t\t\t\t// nothing to copy\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst lineNumber = range.startLineNumber;\n\t\t\trange = new Range(lineNumber, this.model.getLineMinColumn(lineNumber), lineNumber, this.model.getLineMaxColumn(lineNumber));\n\t\t}\n\n\t\tconst fontInfo = this._configuration.options.get(EditorOption.fontInfo);\n\t\tconst colorMap = this._getColorMap();\n\t\tconst hasBadChars = (/[:;\\\\\\/<>]/.test(fontInfo.fontFamily));\n\t\tconst useDefaultFontFamily = (hasBadChars || fontInfo.fontFamily === EDITOR_FONT_DEFAULTS.fontFamily);\n\t\tlet fontFamily: string;\n\t\tif (useDefaultFontFamily) {\n\t\t\tfontFamily = EDITOR_FONT_DEFAULTS.fontFamily;\n\t\t} else {\n\t\t\tfontFamily = fontInfo.fontFamily;\n\t\t\tfontFamily = fontFamily.replace(/\"/g, '\\'');\n\t\t\tconst hasQuotesOrIsList = /[,']/.test(fontFamily);\n\t\t\tif (!hasQuotesOrIsList) {\n\t\t\t\tconst needsQuotes = /[+ ]/.test(fontFamily);\n\t\t\t\tif (needsQuotes) {\n\t\t\t\t\tfontFamily = `'${fontFamily}'`;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfontFamily = `${fontFamily}, ${EDITOR_FONT_DEFAULTS.fontFamily}`;\n\t\t}\n\n\t\treturn {\n\t\t\tmode: languageId,\n\t\t\thtml: (\n\t\t\t\t`<div style=\"`\n\t\t\t\t+ `color: ${colorMap[ColorId.DefaultForeground]};`\n\t\t\t\t+ `background-color: ${colorMap[ColorId.DefaultBackground]};`\n\t\t\t\t+ `font-family: ${fontFamily};`\n\t\t\t\t+ `font-weight: ${fontInfo.fontWeight};`\n\t\t\t\t+ `font-size: ${fontInfo.fontSize}px;`\n\t\t\t\t+ `line-height: ${fontInfo.lineHeight}px;`\n\t\t\t\t+ `white-space: pre;`\n\t\t\t\t+ `\">`\n\t\t\t\t+ this._getHTMLToCopy(range, colorMap)\n\t\t\t\t+ '</div>'\n\t\t\t)\n\t\t};\n\t}\n\n\tprivate _getHTMLToCopy(modelRange: Range, colorMap: string[]): string {\n\t\tconst startLineNumber = modelRange.startLineNumber;\n\t\tconst startColumn = modelRange.startColumn;\n\t\tconst endLineNumber = modelRange.endLineNumber;\n\t\tconst endColumn = modelRange.endColumn;\n\n\t\tconst tabSize = this.getTabSize();\n\n\t\tlet result = '';\n\n\t\tfor (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n\t\t\tconst lineTokens = this.model.tokenization.getLineTokens(lineNumber);\n\t\t\tconst lineContent = lineTokens.getLineContent();\n\t\t\tconst startOffset = (lineNumber === startLineNumber ? startColumn - 1 : 0);\n\t\t\tconst endOffset = (lineNumber === endLineNumber ? endColumn - 1 : lineContent.length);\n\n\t\t\tif (lineContent === '') {\n\t\t\t\tresult += '<br>';\n\t\t\t} else {\n\t\t\t\tresult += tokenizeLineToHTML(lineContent, lineTokens.inflate(), colorMap, startOffset, endOffset, tabSize, platform.isWindows);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate _getColorMap(): string[] {\n\t\tconst colorMap = TokenizationRegistry.getColorMap();\n\t\tconst result: string[] = ['#000000'];\n\t\tif (colorMap) {\n\t\t\tfor (let i = 1, len = colorMap.length; i < len; i++) {\n\t\t\t\tresult[i] = Color.Format.CSS.formatHex(colorMap[i]);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t//#region cursor operations\n\n\tpublic getPrimaryCursorState(): CursorState {\n\t\treturn this._cursor.getPrimaryCursorState();\n\t}\n\tpublic getLastAddedCursorIndex(): number {\n\t\treturn this._cursor.getLastAddedCursorIndex();\n\t}\n\tpublic getCursorStates(): CursorState[] {\n\t\treturn this._cursor.getCursorStates();\n\t}\n\tpublic setCursorStates(source: string | null | undefined, reason: CursorChangeReason, states: PartialCursorState[] | null): boolean {\n\t\treturn this._withViewEventsCollector(eventsCollector => this._cursor.setStates(eventsCollector, source, reason, states));\n\t}\n\tpublic getCursorColumnSelectData(): IColumnSelectData {\n\t\treturn this._cursor.getCursorColumnSelectData();\n\t}\n\tpublic getCursorAutoClosedCharacters(): Range[] {\n\t\treturn this._cursor.getAutoClosedCharacters();\n\t}\n\tpublic setCursorColumnSelectData(columnSelectData: IColumnSelectData): void {\n\t\tthis._cursor.setCursorColumnSelectData(columnSelectData);\n\t}\n\tpublic getPrevEditOperationType(): EditOperationType {\n\t\treturn this._cursor.getPrevEditOperationType();\n\t}\n\tpublic setPrevEditOperationType(type: EditOperationType): void {\n\t\tthis._cursor.setPrevEditOperationType(type);\n\t}\n\tpublic getSelection(): Selection {\n\t\treturn this._cursor.getSelection();\n\t}\n\tpublic getSelections(): Selection[] {\n\t\treturn this._cursor.getSelections();\n\t}\n\tpublic getPosition(): Position {\n\t\treturn this._cursor.getPrimaryCursorState().modelState.position;\n\t}\n\tpublic setSelections(source: string | null | undefined, selections: readonly ISelection[], reason = CursorChangeReason.NotSet): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.setSelections(eventsCollector, source, selections, reason));\n\t}\n\tpublic saveCursorState(): ICursorState[] {\n\t\treturn this._cursor.saveState();\n\t}\n\tpublic restoreCursorState(states: ICursorState[]): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.restoreState(eventsCollector, states));\n\t}\n\n\tprivate _executeCursorEdit(callback: (eventsCollector: ViewModelEventsCollector) => void): void {\n\t\tif (this._cursor.context.cursorConfig.readOnly) {\n\t\t\t// we cannot edit when read only...\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ReadOnlyEditAttemptEvent());\n\t\t\treturn;\n\t\t}\n\t\tthis._withViewEventsCollector(callback);\n\t}\n\tpublic executeEdits(source: string | null | undefined, edits: IIdentifiedSingleEditOperation[], cursorStateComputer: ICursorStateComputer, reason: TextModelEditSource): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.executeEdits(eventsCollector, source, edits, cursorStateComputer, reason));\n\t}\n\tpublic startComposition(): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.startComposition(eventsCollector));\n\t}\n\tpublic endComposition(source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.endComposition(eventsCollector, source));\n\t}\n\tpublic type(text: string, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.type(eventsCollector, text, source));\n\t}\n\tpublic compositionType(text: string, replacePrevCharCnt: number, replaceNextCharCnt: number, positionDelta: number, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.compositionType(eventsCollector, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source));\n\t}\n\tpublic paste(text: string, pasteOnNewLine: boolean, multicursorText?: string[] | null | undefined, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.paste(eventsCollector, text, pasteOnNewLine, multicursorText, source));\n\t}\n\tpublic cut(source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.cut(eventsCollector, source));\n\t}\n\tpublic executeCommand(command: ICommand, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.executeCommand(eventsCollector, command, source));\n\t}\n\tpublic executeCommands(commands: ICommand[], source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.executeCommands(eventsCollector, commands, source));\n\t}\n\tpublic revealAllCursors(source: string | null | undefined, revealHorizontal: boolean, minimalReveal: boolean = false): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.revealAll(eventsCollector, source, minimalReveal, viewEvents.VerticalRevealType.Simple, revealHorizontal, ScrollType.Smooth));\n\t}\n\tpublic revealPrimaryCursor(source: string | null | undefined, revealHorizontal: boolean, minimalReveal: boolean = false): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.revealPrimary(eventsCollector, source, minimalReveal, viewEvents.VerticalRevealType.Simple, revealHorizontal, ScrollType.Smooth));\n\t}\n\tpublic revealTopMostCursor(source: string | null | undefined): void {\n\t\tconst viewPosition = this._cursor.getTopMostViewPosition();\n\t\tconst viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column);\n\t\tthis._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new viewEvents.ViewRevealRangeRequestEvent(source, false, viewRange, null, viewEvents.VerticalRevealType.Simple, true, ScrollType.Smooth)));\n\t}\n\tpublic revealBottomMostCursor(source: string | null | undefined): void {\n\t\tconst viewPosition = this._cursor.getBottomMostViewPosition();\n\t\tconst viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column);\n\t\tthis._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new viewEvents.ViewRevealRangeRequestEvent(source, false, viewRange, null, viewEvents.VerticalRevealType.Simple, true, ScrollType.Smooth)));\n\t}\n\tpublic revealRange(source: string | null | undefined, revealHorizontal: boolean, viewRange: Range, verticalType: viewEvents.VerticalRevealType, scrollType: ScrollType): void {\n\t\tthis._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new viewEvents.ViewRevealRangeRequestEvent(source, false, viewRange, null, verticalType, revealHorizontal, scrollType)));\n\t}\n\n\t//#endregion\n\n\t//#region viewLayout\n\tpublic changeWhitespace(callback: (accessor: IWhitespaceChangeAccessor) => void): void {\n\t\tconst hadAChange = this.viewLayout.changeWhitespace(callback);\n\t\tif (hadAChange) {\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewZonesChangedEvent());\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ViewZonesChangedEvent());\n\t\t}\n\t}\n\t//#endregion\n\n\tprivate _withViewEventsCollector<T>(callback: (eventsCollector: ViewModelEventsCollector) => T): T {\n\t\treturn this._transactionalTarget.batchChanges(() => {\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\treturn callback(eventsCollector);\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic batchEvents(callback: () => void): void {\n\t\tthis._withViewEventsCollector(() => { callback(); });\n\t}\n\n\tnormalizePosition(position: Position, affinity: PositionAffinity): Position {\n\t\treturn this._lines.normalizePosition(position, affinity);\n\t}\n\n\t/**\n\t * Gets the column at which indentation stops at a given line.\n\t * @internal\n\t*/\n\tgetLineIndentColumn(lineNumber: number): number {\n\t\treturn this._lines.getLineIndentColumn(lineNumber);\n\t}\n}\n\nexport interface IBatchableTarget {\n\t/**\n\t * Allows the target to apply the changes introduced by the callback in a batch.\n\t*/\n\tbatchChanges<T>(cb: () => T): T;\n}\n\nclass ViewportStart implements IDisposable {\n\n\tpublic static create(model: ITextModel): ViewportStart {\n\t\tconst viewportStartLineTrackedRange = model._setTrackedRange(null, new Range(1, 1, 1, 1), TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges);\n\t\treturn new ViewportStart(model, 1, false, viewportStartLineTrackedRange, 0);\n\t}\n\n\tpublic get viewLineNumber(): number {\n\t\treturn this._viewLineNumber;\n\t}\n\n\tpublic get isValid(): boolean {\n\t\treturn this._isValid;\n\t}\n\n\tpublic get modelTrackedRange(): string {\n\t\treturn this._modelTrackedRange;\n\t}\n\n\tpublic get startLineDelta(): number {\n\t\treturn this._startLineDelta;\n\t}\n\n\tprivate constructor(\n\t\tprivate readonly _model: ITextModel,\n\t\tprivate _viewLineNumber: number,\n\t\tprivate _isValid: boolean,\n\t\tprivate _modelTrackedRange: string,\n\t\tprivate _startLineDelta: number,\n\t) { }\n\n\tpublic dispose(): void {\n\t\tthis._model._setTrackedRange(this._modelTrackedRange, null, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges);\n\t}\n\n\tpublic update(viewModel: IViewModel, startLineNumber: number): void {\n\t\tconst position = viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(startLineNumber, viewModel.getLineMinColumn(startLineNumber)));\n\t\tconst viewportStartLineTrackedRange = viewModel.model._setTrackedRange(this._modelTrackedRange, new Range(position.lineNumber, position.column, position.lineNumber, position.column), TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges);\n\t\tconst viewportStartLineTop = viewModel.viewLayout.getVerticalOffsetForLineNumber(startLineNumber);\n\t\tconst scrollTop = viewModel.viewLayout.getCurrentScrollTop();\n\n\t\tthis._viewLineNumber = startLineNumber;\n\t\tthis._isValid = true;\n\t\tthis._modelTrackedRange = viewportStartLineTrackedRange;\n\t\tthis._startLineDelta = scrollTop - viewportStartLineTop;\n\t}\n\n\tpublic invalidate(): void {\n\t\tthis._isValid = false;\n\t}\n}\n\nclass OverviewRulerDecorations {\n\n\tprivate readonly _asMap: { [color: string]: OverviewRulerDecorationsGroup } = Object.create(null);\n\treadonly asArray: OverviewRulerDecorationsGroup[] = [];\n\n\tpublic accept(color: string, zIndex: number, startLineNumber: number, endLineNumber: number, lane: number): void {\n\t\tconst prevGroup = this._asMap[color];\n\n\t\tif (prevGroup) {\n\t\t\tconst prevData = prevGroup.data;\n\t\t\tconst prevLane = prevData[prevData.length - 3];\n\t\t\tconst prevEndLineNumber = prevData[prevData.length - 1];\n\t\t\tif (prevLane === lane && prevEndLineNumber + 1 >= startLineNumber) {\n\t\t\t\t// merge into prev\n\t\t\t\tif (endLineNumber > prevEndLineNumber) {\n\t\t\t\t\tprevData[prevData.length - 1] = endLineNumber;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// push\n\t\t\tprevData.push(lane, startLineNumber, endLineNumber);\n\t\t} else {\n\t\t\tconst group = new OverviewRulerDecorationsGroup(color, zIndex, [lane, startLineNumber, endLineNumber]);\n\t\t\tthis._asMap[color] = group;\n\t\t\tthis.asArray.push(group);\n\t\t}\n\t}\n}\n\nclass HiddenAreasModel {\n\tprivate readonly hiddenAreas = new Map<unknown, Range[]>();\n\tprivate shouldRecompute = false;\n\tprivate ranges: Range[] = [];\n\n\tsetHiddenAreas(source: unknown, ranges: Range[]): void {\n\t\tconst existing = this.hiddenAreas.get(source);\n\t\tif (existing && rangeArraysEqual(existing, ranges)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.hiddenAreas.set(source, ranges);\n\t\tthis.shouldRecompute = true;\n\t}\n\n\t/**\n\t * The returned array is immutable.\n\t*/\n\tgetMergedRanges(): readonly Range[] {\n\t\tif (!this.shouldRecompute) {\n\t\t\treturn this.ranges;\n\t\t}\n\t\tthis.shouldRecompute = false;\n\t\tconst newRanges = Array.from(this.hiddenAreas.values()).reduce((r, hiddenAreas) => mergeLineRangeArray(r, hiddenAreas), []);\n\t\tif (rangeArraysEqual(this.ranges, newRanges)) {\n\t\t\treturn this.ranges;\n\t\t}\n\t\tthis.ranges = newRanges;\n\t\treturn this.ranges;\n\t}\n}\n\nfunction mergeLineRangeArray(arr1: Range[], arr2: Range[]): Range[] {\n\tconst result: Range[] = [];\n\tlet i = 0;\n\tlet j = 0;\n\twhile (i < arr1.length && j < arr2.length) {\n\t\tconst item1 = arr1[i];\n\t\tconst item2 = arr2[j];\n\n\t\tif (item1.endLineNumber < item2.startLineNumber - 1) {\n\t\t\tresult.push(arr1[i++]);\n\t\t} else if (item2.endLineNumber < item1.startLineNumber - 1) {\n\t\t\tresult.push(arr2[j++]);\n\t\t} else {\n\t\t\tconst startLineNumber = Math.min(item1.startLineNumber, item2.startLineNumber);\n\t\t\tconst endLineNumber = Math.max(item1.endLineNumber, item2.endLineNumber);\n\t\t\tresult.push(new Range(startLineNumber, 1, endLineNumber, 1));\n\t\t\ti++;\n\t\t\tj++;\n\t\t}\n\t}\n\twhile (i < arr1.length) {\n\t\tresult.push(arr1[i++]);\n\t}\n\twhile (j < arr2.length) {\n\t\tresult.push(arr2[j++]);\n\t}\n\treturn result;\n}\n\nfunction rangeArraysEqual(arr1: Range[], arr2: Range[]): boolean {\n\tif (arr1.length !== arr2.length) {\n\t\treturn false;\n\t}\n\tfor (let i = 0; i < arr1.length; i++) {\n\t\tif (!arr1[i].equalsRange(arr2[i])) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Maintain a stable viewport by trying to keep the first line in the viewport constant.\n */\nclass StableViewport {\n\tconstructor(\n\t\tpublic readonly viewportStartModelPosition: Position | null,\n\t\tpublic readonly startLineDelta: number\n\t) { }\n\n\tpublic recoverViewportStart(coordinatesConverter: ICoordinatesConverter, viewLayout: ViewLayout): void {\n\t\tif (!this.viewportStartModelPosition) {\n\t\t\treturn;\n\t\t}\n\t\tconst viewPosition = coordinatesConverter.convertModelPositionToViewPosition(this.viewportStartModelPosition);\n\t\tconst viewPositionTop = viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber);\n\t\tviewLayout.setScrollPosition({ scrollTop: viewPositionTop + this.startLineDelta }, ScrollType.Immediate);\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ArrayQueue } from '../../../base/common/arrays.js';\nimport { RunOnceScheduler } from '../../../base/common/async.js';\nimport { Color } from '../../../base/common/color.js';\nimport { Event } from '../../../base/common/event.js';\nimport { Disposable, IDisposable } from '../../../base/common/lifecycle.js';\nimport * as platform from '../../../base/common/platform.js';\nimport * as strings from '../../../base/common/strings.js';\nimport { ConfigurationChangedEvent, EditorOption, filterValidationDecorations, filterFontDecorations } from '../config/editorOptions.js';\nimport { EDITOR_FONT_DEFAULTS } from '../config/fontInfo.js';\nimport { CursorsController } from '../cursor/cursor.js';\nimport { CursorConfiguration, CursorState, EditOperationType, IColumnSelectData, PartialCursorState } from '../cursorCommon.js';\nimport { CursorChangeReason } from '../cursorEvents.js';\nimport { IPosition, Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { ISelection, Selection } from '../core/selection.js';\nimport { ICommand, ICursorState, IViewState, ScrollType } from '../editorCommon.js';\nimport { IEditorConfiguration } from '../config/editorConfiguration.js';\nimport { EndOfLinePreference, IAttachedView, ICursorStateComputer, IGlyphMarginLanesModel, IIdentifiedSingleEditOperation, ITextModel, PositionAffinity, TextDirection, TrackedRangeStickiness } from '../model.js';\nimport { IActiveIndentGuideInfo, BracketGuideOptions, IndentGuide } from '../textModelGuides.js';\nimport { ModelDecorationMinimapOptions, ModelDecorationOptions, ModelDecorationOverviewRulerOptions } from '../model/textModel.js';\nimport * as textModelEvents from '../textModelEvents.js';\nimport { TokenizationRegistry } from '../languages.js';\nimport { ColorId } from '../encodedTokenAttributes.js';\nimport { ILanguageConfigurationService } from '../languages/languageConfigurationRegistry.js';\nimport { PLAINTEXT_LANGUAGE_ID } from '../languages/modesRegistry.js';\nimport { tokenizeLineToHTML } from '../languages/textToHtmlTokenizer.js';\nimport { EditorTheme } from '../editorTheme.js';\nimport * as viewEvents from '../viewEvents.js';\nimport { ViewLayout } from '../viewLayout/viewLayout.js';\nimport { MinimapTokensColorTracker } from './minimapTokensColorTracker.js';\nimport { ILineBreaksComputer, ILineBreaksComputerFactory, InjectedText } from '../modelLineProjectionData.js';\nimport { ViewEventHandler } from '../viewEventHandler.js';\nimport { ILineHeightChangeAccessor, IViewModel, IWhitespaceChangeAccessor, MinimapLinesRenderingData, OverviewRulerDecorationsGroup, ViewLineData, ViewLineRenderingData, ViewModelDecoration } from '../viewModel.js';\nimport { ViewModelDecorations } from './viewModelDecorations.js';\nimport { FocusChangedEvent, HiddenAreasChangedEvent, ModelContentChangedEvent, ModelDecorationsChangedEvent, ModelFontChangedEvent, ModelLanguageChangedEvent, ModelLanguageConfigurationChangedEvent, ModelLineHeightChangedEvent, ModelOptionsChangedEvent, ModelTokensChangedEvent, OutgoingViewModelEvent, ReadOnlyEditAttemptEvent, ScrollChangedEvent, ViewModelEventDispatcher, ViewModelEventsCollector, ViewZonesChangedEvent, WidgetFocusChangedEvent } from '../viewModelEventDispatcher.js';\nimport { IViewModelLines, ViewModelLinesFromModelAsIs, ViewModelLinesFromProjectedModel } from './viewModelLines.js';\nimport { IThemeService } from '../../../platform/theme/common/themeService.js';\nimport { GlyphMarginLanesModel } from './glyphLanesModel.js';\nimport { ICustomLineHeightData } from '../viewLayout/lineHeights.js';\nimport { TextModelEditSource } from '../textModelEditSource.js';\nimport { InlineDecoration } from './inlineDecorations.js';\nimport { ICoordinatesConverter } from '../coordinatesConverter.js';\n\nconst USE_IDENTITY_LINES_COLLECTION = true;\n\nexport class ViewModel extends Disposable implements IViewModel {\n\n\tprivate readonly _editorId: number;\n\tprivate readonly _configuration: IEditorConfiguration;\n\tpublic readonly model: ITextModel;\n\tprivate readonly _eventDispatcher: ViewModelEventDispatcher;\n\tpublic readonly onEvent: Event<OutgoingViewModelEvent>;\n\tpublic cursorConfig: CursorConfiguration;\n\tprivate readonly _updateConfigurationViewLineCount: RunOnceScheduler;\n\tprivate _hasFocus: boolean;\n\tprivate readonly _viewportStart: ViewportStart;\n\tprivate readonly _lines: IViewModelLines;\n\tpublic readonly coordinatesConverter: ICoordinatesConverter;\n\tpublic readonly viewLayout: ViewLayout;\n\tprivate readonly _cursor: CursorsController;\n\tprivate readonly _decorations: ViewModelDecorations;\n\tpublic readonly glyphLanes: IGlyphMarginLanesModel;\n\n\tconstructor(\n\t\teditorId: number,\n\t\tconfiguration: IEditorConfiguration,\n\t\tmodel: ITextModel,\n\t\tdomLineBreaksComputerFactory: ILineBreaksComputerFactory,\n\t\tmonospaceLineBreaksComputerFactory: ILineBreaksComputerFactory,\n\t\tscheduleAtNextAnimationFrame: (callback: () => void) => IDisposable,\n\t\tprivate readonly languageConfigurationService: ILanguageConfigurationService,\n\t\tprivate readonly _themeService: IThemeService,\n\t\tprivate readonly _attachedView: IAttachedView,\n\t\tprivate readonly _transactionalTarget: IBatchableTarget,\n\t) {\n\t\tsuper();\n\n\t\tthis._editorId = editorId;\n\t\tthis._configuration = configuration;\n\t\tthis.model = model;\n\t\tthis._eventDispatcher = new ViewModelEventDispatcher();\n\t\tthis.onEvent = this._eventDispatcher.onEvent;\n\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\tthis._updateConfigurationViewLineCount = this._register(new RunOnceScheduler(() => this._updateConfigurationViewLineCountNow(), 0));\n\t\tthis._hasFocus = false;\n\t\tthis._viewportStart = ViewportStart.create(this.model);\n\t\tthis.glyphLanes = new GlyphMarginLanesModel(0);\n\n\t\tif (USE_IDENTITY_LINES_COLLECTION && this.model.isTooLargeForTokenization()) {\n\n\t\t\tthis._lines = new ViewModelLinesFromModelAsIs(this.model);\n\n\t\t} else {\n\t\t\tconst options = this._configuration.options;\n\t\t\tconst fontInfo = options.get(EditorOption.fontInfo);\n\t\t\tconst wrappingStrategy = options.get(EditorOption.wrappingStrategy);\n\t\t\tconst wrappingInfo = options.get(EditorOption.wrappingInfo);\n\t\t\tconst wrappingIndent = options.get(EditorOption.wrappingIndent);\n\t\t\tconst wordBreak = options.get(EditorOption.wordBreak);\n\t\t\tconst wrapOnEscapedLineFeeds = options.get(EditorOption.wrapOnEscapedLineFeeds);\n\n\t\t\tthis._lines = new ViewModelLinesFromProjectedModel(\n\t\t\t\tthis._editorId,\n\t\t\t\tthis.model,\n\t\t\t\tdomLineBreaksComputerFactory,\n\t\t\t\tmonospaceLineBreaksComputerFactory,\n\t\t\t\tfontInfo,\n\t\t\t\tthis.model.getOptions().tabSize,\n\t\t\t\twrappingStrategy,\n\t\t\t\twrappingInfo.wrappingColumn,\n\t\t\t\twrappingIndent,\n\t\t\t\twordBreak,\n\t\t\t\twrapOnEscapedLineFeeds\n\t\t\t);\n\t\t}\n\n\t\tthis.coordinatesConverter = this._lines.createCoordinatesConverter();\n\n\t\tthis._cursor = this._register(new CursorsController(model, this, this.coordinatesConverter, this.cursorConfig));\n\n\t\tthis.viewLayout = this._register(new ViewLayout(this._configuration, this.getLineCount(), this._getCustomLineHeights(), scheduleAtNextAnimationFrame));\n\n\t\tthis._register(this.viewLayout.onDidScroll((e) => {\n\t\t\tif (e.scrollTopChanged) {\n\t\t\t\tthis._handleVisibleLinesChanged();\n\t\t\t}\n\t\t\tif (e.scrollTopChanged) {\n\t\t\t\tthis._viewportStart.invalidate();\n\t\t\t}\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewScrollChangedEvent(e));\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ScrollChangedEvent(\n\t\t\t\te.oldScrollWidth, e.oldScrollLeft, e.oldScrollHeight, e.oldScrollTop,\n\t\t\t\te.scrollWidth, e.scrollLeft, e.scrollHeight, e.scrollTop\n\t\t\t));\n\t\t}));\n\n\t\tthis._register(this.viewLayout.onDidContentSizeChange((e) => {\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(e);\n\t\t}));\n\n\t\tthis._decorations = new ViewModelDecorations(this._editorId, this.model, this._configuration, this._lines, this.coordinatesConverter);\n\n\t\tthis._registerModelEvents();\n\n\t\tthis._register(this._configuration.onDidChangeFast((e) => {\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\tthis._onConfigurationChanged(eventsCollector, e);\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(MinimapTokensColorTracker.getInstance().onDidChange(() => {\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewTokensColorsChangedEvent());\n\t\t}));\n\n\t\tthis._register(this._themeService.onDidColorThemeChange((theme) => {\n\t\t\tthis._invalidateDecorationsColorCache();\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewThemeChangedEvent(theme));\n\t\t}));\n\n\t\tthis._updateConfigurationViewLineCountNow();\n\t}\n\n\tpublic override dispose(): void {\n\t\t// First remove listeners, as disposing the lines might end up sending\n\t\t// model decoration changed events ... and we no longer care about them ...\n\t\tsuper.dispose();\n\t\tthis._decorations.dispose();\n\t\tthis._lines.dispose();\n\t\tthis._viewportStart.dispose();\n\t\tthis._eventDispatcher.dispose();\n\t}\n\n\tpublic createLineBreaksComputer(): ILineBreaksComputer {\n\t\treturn this._lines.createLineBreaksComputer();\n\t}\n\n\tpublic addViewEventHandler(eventHandler: ViewEventHandler): void {\n\t\tthis._eventDispatcher.addViewEventHandler(eventHandler);\n\t}\n\n\tpublic removeViewEventHandler(eventHandler: ViewEventHandler): void {\n\t\tthis._eventDispatcher.removeViewEventHandler(eventHandler);\n\t}\n\n\tprivate _getCustomLineHeights(): ICustomLineHeightData[] {\n\t\tconst allowVariableLineHeights = this._configuration.options.get(EditorOption.allowVariableLineHeights);\n\t\tif (!allowVariableLineHeights) {\n\t\t\treturn [];\n\t\t}\n\t\tconst decorations = this.model.getCustomLineHeightsDecorations(this._editorId);\n\t\treturn decorations.map((d) => {\n\t\t\tconst lineNumber = d.range.startLineNumber;\n\t\t\tconst viewRange = this.coordinatesConverter.convertModelRangeToViewRange(new Range(lineNumber, 1, lineNumber, this.model.getLineMaxColumn(lineNumber)));\n\t\t\treturn {\n\t\t\t\tdecorationId: d.id,\n\t\t\t\tstartLineNumber: viewRange.startLineNumber,\n\t\t\t\tendLineNumber: viewRange.endLineNumber,\n\t\t\t\tlineHeight: d.options.lineHeight || 0\n\t\t\t};\n\t\t});\n\t}\n\n\tprivate _updateConfigurationViewLineCountNow(): void {\n\t\tthis._configuration.setViewLineCount(this._lines.getViewLineCount());\n\t}\n\n\tprivate getModelVisibleRanges(): Range[] {\n\t\tconst linesViewportData = this.viewLayout.getLinesViewportData();\n\t\tconst viewVisibleRange = new Range(\n\t\t\tlinesViewportData.startLineNumber,\n\t\t\tthis.getLineMinColumn(linesViewportData.startLineNumber),\n\t\t\tlinesViewportData.endLineNumber,\n\t\t\tthis.getLineMaxColumn(linesViewportData.endLineNumber)\n\t\t);\n\t\tconst modelVisibleRanges = this._toModelVisibleRanges(viewVisibleRange);\n\t\treturn modelVisibleRanges;\n\t}\n\n\tpublic visibleLinesStabilized(): void {\n\t\tconst modelVisibleRanges = this.getModelVisibleRanges();\n\t\tthis._attachedView.setVisibleLines(modelVisibleRanges, true);\n\t}\n\n\tprivate _handleVisibleLinesChanged(): void {\n\t\tconst modelVisibleRanges = this.getModelVisibleRanges();\n\t\tthis._attachedView.setVisibleLines(modelVisibleRanges, false);\n\t}\n\n\tpublic setHasFocus(hasFocus: boolean): void {\n\t\tthis._hasFocus = hasFocus;\n\t\tthis._cursor.setHasFocus(hasFocus);\n\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewFocusChangedEvent(hasFocus));\n\t\tthis._eventDispatcher.emitOutgoingEvent(new FocusChangedEvent(!hasFocus, hasFocus));\n\t}\n\n\tpublic setHasWidgetFocus(hasWidgetFocus: boolean): void {\n\t\tthis._eventDispatcher.emitOutgoingEvent(new WidgetFocusChangedEvent(!hasWidgetFocus, hasWidgetFocus));\n\t}\n\n\tpublic onCompositionStart(): void {\n\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewCompositionStartEvent());\n\t}\n\n\tpublic onCompositionEnd(): void {\n\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewCompositionEndEvent());\n\t}\n\n\tprivate _captureStableViewport(): StableViewport {\n\t\t// We might need to restore the current start view range, so save it (if available)\n\t\t// But only if the scroll position is not at the top of the file\n\t\tif (this._viewportStart.isValid && this.viewLayout.getCurrentScrollTop() > 0) {\n\t\t\tconst previousViewportStartViewPosition = new Position(this._viewportStart.viewLineNumber, this.getLineMinColumn(this._viewportStart.viewLineNumber));\n\t\t\tconst previousViewportStartModelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(previousViewportStartViewPosition);\n\t\t\treturn new StableViewport(previousViewportStartModelPosition, this._viewportStart.startLineDelta);\n\t\t}\n\t\treturn new StableViewport(null, 0);\n\t}\n\n\tprivate _onConfigurationChanged(eventsCollector: ViewModelEventsCollector, e: ConfigurationChangedEvent): void {\n\t\tconst stableViewport = this._captureStableViewport();\n\t\tconst options = this._configuration.options;\n\t\tconst fontInfo = options.get(EditorOption.fontInfo);\n\t\tconst wrappingStrategy = options.get(EditorOption.wrappingStrategy);\n\t\tconst wrappingInfo = options.get(EditorOption.wrappingInfo);\n\t\tconst wrappingIndent = options.get(EditorOption.wrappingIndent);\n\t\tconst wordBreak = options.get(EditorOption.wordBreak);\n\n\t\tif (this._lines.setWrappingSettings(fontInfo, wrappingStrategy, wrappingInfo.wrappingColumn, wrappingIndent, wordBreak)) {\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\n\t\t\tthis._updateConfigurationViewLineCount.schedule();\n\t\t}\n\n\t\tif (e.hasChanged(EditorOption.readOnly)) {\n\t\t\t// Must read again all decorations due to readOnly filtering\n\t\t\tthis._decorations.reset();\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t}\n\n\t\tif (e.hasChanged(EditorOption.renderValidationDecorations)) {\n\t\t\tthis._decorations.reset();\n\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t}\n\n\t\teventsCollector.emitViewEvent(new viewEvents.ViewConfigurationChangedEvent(e));\n\t\tthis.viewLayout.onConfigurationChanged(e);\n\n\t\tstableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout);\n\n\t\tif (CursorConfiguration.shouldRecreate(e)) {\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\t\t}\n\t}\n\n\tprivate _registerModelEvents(): void {\n\n\t\tthis._register(this.model.onDidChangeContentOrInjectedText((e) => {\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\n\t\t\t\tlet hadOtherModelChange = false;\n\t\t\t\tlet hadModelLineChangeThatChangedLineMapping = false;\n\n\t\t\t\tconst changes = (e instanceof textModelEvents.InternalModelContentChangeEvent ? e.rawContentChangedEvent.changes : e.changes);\n\t\t\t\tconst versionId = (e instanceof textModelEvents.InternalModelContentChangeEvent ? e.rawContentChangedEvent.versionId : null);\n\n\t\t\t\t// Do a first pass to compute line mappings, and a second pass to actually interpret them\n\t\t\t\tconst lineBreaksComputer = this._lines.createLineBreaksComputer();\n\t\t\t\tfor (const change of changes) {\n\t\t\t\t\tswitch (change.changeType) {\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LinesInserted: {\n\t\t\t\t\t\t\tfor (let lineIdx = 0; lineIdx < change.detail.length; lineIdx++) {\n\t\t\t\t\t\t\t\tconst line = change.detail[lineIdx];\n\t\t\t\t\t\t\t\tlet injectedText = change.injectedTexts[lineIdx];\n\t\t\t\t\t\t\t\tif (injectedText) {\n\t\t\t\t\t\t\t\t\tinjectedText = injectedText.filter(element => (!element.ownerId || element.ownerId === this._editorId));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlineBreaksComputer.addRequest(line, injectedText, null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LineChanged: {\n\t\t\t\t\t\t\tlet injectedText: textModelEvents.LineInjectedText[] | null = null;\n\t\t\t\t\t\t\tif (change.injectedText) {\n\t\t\t\t\t\t\t\tinjectedText = change.injectedText.filter(element => (!element.ownerId || element.ownerId === this._editorId));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlineBreaksComputer.addRequest(change.detail, injectedText, null);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst lineBreaks = lineBreaksComputer.finalize();\n\t\t\t\tconst lineBreakQueue = new ArrayQueue(lineBreaks);\n\n\t\t\t\tfor (const change of changes) {\n\t\t\t\t\tswitch (change.changeType) {\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.Flush: {\n\t\t\t\t\t\t\tthis._lines.onModelFlushed();\n\t\t\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\t\t\t\t\tthis._decorations.reset();\n\t\t\t\t\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\t\t\t\t\t\t\thadOtherModelChange = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LinesDeleted: {\n\t\t\t\t\t\t\tconst linesDeletedEvent = this._lines.onModelLinesDeleted(versionId, change.fromLineNumber, change.toLineNumber);\n\t\t\t\t\t\t\tif (linesDeletedEvent !== null) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesDeletedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thadOtherModelChange = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LinesInserted: {\n\t\t\t\t\t\t\tconst insertedLineBreaks = lineBreakQueue.takeCount(change.detail.length);\n\t\t\t\t\t\t\tconst linesInsertedEvent = this._lines.onModelLinesInserted(versionId, change.fromLineNumber, change.toLineNumber, insertedLineBreaks);\n\t\t\t\t\t\t\tif (linesInsertedEvent !== null) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesInsertedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thadOtherModelChange = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.LineChanged: {\n\t\t\t\t\t\t\tconst changedLineBreakData = lineBreakQueue.dequeue()!;\n\t\t\t\t\t\t\tconst [lineMappingChanged, linesChangedEvent, linesInsertedEvent, linesDeletedEvent] =\n\t\t\t\t\t\t\t\tthis._lines.onModelLineChanged(versionId, change.lineNumber, changedLineBreakData);\n\t\t\t\t\t\t\thadModelLineChangeThatChangedLineMapping = lineMappingChanged;\n\t\t\t\t\t\t\tif (linesChangedEvent) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesChangedEvent);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (linesInsertedEvent) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesInsertedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (linesDeletedEvent) {\n\t\t\t\t\t\t\t\teventsCollector.emitViewEvent(linesDeletedEvent);\n\t\t\t\t\t\t\t\tthis.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase textModelEvents.RawContentChangedType.EOLChanged: {\n\t\t\t\t\t\t\t// Nothing to do. The new version will be accepted below\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (versionId !== null) {\n\t\t\t\t\tthis._lines.acceptVersionId(versionId);\n\t\t\t\t}\n\t\t\t\tthis.viewLayout.onHeightMaybeChanged();\n\n\t\t\t\tif (!hadOtherModelChange && hadModelLineChangeThatChangedLineMapping) {\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\n\t\t\t// Update the configuration and reset the centered view line\n\t\t\tconst viewportStartWasValid = this._viewportStart.isValid;\n\t\t\tthis._viewportStart.invalidate();\n\t\t\tthis._configuration.setModelLineCount(this.model.getLineCount());\n\t\t\tthis._updateConfigurationViewLineCountNow();\n\n\t\t\t// Recover viewport\n\t\t\tif (!this._hasFocus && this.model.getAttachedEditorCount() >= 2 && viewportStartWasValid) {\n\t\t\t\tconst modelRange = this.model._getTrackedRange(this._viewportStart.modelTrackedRange);\n\t\t\t\tif (modelRange) {\n\t\t\t\t\tconst viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(modelRange.getStartPosition());\n\t\t\t\t\tconst viewPositionTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber);\n\t\t\t\t\tthis.viewLayout.setScrollPosition({ scrollTop: viewPositionTop + this._viewportStart.startLineDelta }, ScrollType.Immediate);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\tif (e instanceof textModelEvents.InternalModelContentChangeEvent) {\n\t\t\t\t\teventsCollector.emitOutgoingEvent(new ModelContentChangedEvent(e.contentChangedEvent));\n\t\t\t\t}\n\t\t\t\tthis._cursor.onModelContentChanged(eventsCollector, e);\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\n\t\t\tthis._handleVisibleLinesChanged();\n\t\t}));\n\n\t\tconst allowVariableLineHeights = this._configuration.options.get(EditorOption.allowVariableLineHeights);\n\t\tif (allowVariableLineHeights) {\n\t\t\tthis._register(this.model.onDidChangeLineHeight((e) => {\n\t\t\t\tconst filteredChanges = e.changes.filter((change) => change.ownerId === this._editorId || change.ownerId === 0);\n\n\t\t\t\tthis.viewLayout.changeSpecialLineHeights((accessor: ILineHeightChangeAccessor) => {\n\t\t\t\t\tfor (const change of filteredChanges) {\n\t\t\t\t\t\tconst { decorationId, lineNumber, lineHeight } = change;\n\t\t\t\t\t\tconst viewRange = this.coordinatesConverter.convertModelRangeToViewRange(new Range(lineNumber, 1, lineNumber, this.model.getLineMaxColumn(lineNumber)));\n\t\t\t\t\t\tif (lineHeight !== null) {\n\t\t\t\t\t\t\taccessor.insertOrChangeCustomLineHeight(decorationId, viewRange.startLineNumber, viewRange.endLineNumber, lineHeight);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\taccessor.removeCustomLineHeight(decorationId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// recreate the model event using the filtered changes\n\t\t\t\tif (filteredChanges.length > 0) {\n\t\t\t\t\tconst filteredEvent = new textModelEvents.ModelLineHeightChangedEvent(filteredChanges);\n\t\t\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelLineHeightChangedEvent(filteredEvent));\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\tconst allowVariableFonts = this._configuration.options.get(EditorOption.effectiveAllowVariableFonts);\n\t\tif (allowVariableFonts) {\n\t\t\tthis._register(this.model.onDidChangeFont((e) => {\n\t\t\t\tconst filteredChanges = e.changes.filter((change) => change.ownerId === this._editorId || change.ownerId === 0);\n\t\t\t\t// recreate the model event using the filtered changes\n\t\t\t\tif (filteredChanges.length > 0) {\n\t\t\t\t\tconst filteredEvent = new textModelEvents.ModelFontChangedEvent(filteredChanges);\n\t\t\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelFontChangedEvent(filteredEvent));\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\tthis._register(this.model.onDidChangeTokens((e) => {\n\t\t\tconst viewRanges: { fromLineNumber: number; toLineNumber: number }[] = [];\n\t\t\tfor (let j = 0, lenJ = e.ranges.length; j < lenJ; j++) {\n\t\t\t\tconst modelRange = e.ranges[j];\n\t\t\t\tconst viewStartLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.fromLineNumber, 1)).lineNumber;\n\t\t\t\tconst viewEndLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.toLineNumber, this.model.getLineMaxColumn(modelRange.toLineNumber))).lineNumber;\n\t\t\t\tviewRanges[j] = {\n\t\t\t\t\tfromLineNumber: viewStartLineNumber,\n\t\t\t\t\ttoLineNumber: viewEndLineNumber\n\t\t\t\t};\n\t\t\t}\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewTokensChangedEvent(viewRanges));\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelTokensChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeLanguageConfiguration((e) => {\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewLanguageConfigurationEvent());\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelLanguageConfigurationChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeLanguage((e) => {\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelLanguageChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeOptions((e) => {\n\t\t\t// A tab size change causes a line mapping changed event => all view parts will repaint OK, no further event needed here\n\t\t\tif (this._lines.setTabSize(this.model.getOptions().tabSize)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\t\t\t\t} finally {\n\t\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t\t}\n\t\t\t\tthis._updateConfigurationViewLineCount.schedule();\n\t\t\t}\n\n\t\t\tthis.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);\n\t\t\tthis._cursor.updateConfiguration(this.cursorConfig);\n\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelOptionsChangedEvent(e));\n\t\t}));\n\n\t\tthis._register(this.model.onDidChangeDecorations((e) => {\n\t\t\tthis._decorations.onModelDecorationsChanged();\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewDecorationsChangedEvent(e));\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ModelDecorationsChangedEvent(e));\n\t\t}));\n\t}\n\n\tprivate readonly hiddenAreasModel = new HiddenAreasModel();\n\tprivate previousHiddenAreas: readonly Range[] = [];\n\n\tpublic getFontSizeAtPosition(position: IPosition): string | null {\n\t\tconst allowVariableFonts = this._configuration.options.get(EditorOption.effectiveAllowVariableFonts);\n\t\tif (!allowVariableFonts) {\n\t\t\treturn null;\n\t\t}\n\t\tconst fontDecorations = this.model.getFontDecorationsInRange(Range.fromPositions(position), this._editorId);\n\t\tlet fontSize: string = this._configuration.options.get(EditorOption.fontInfo).fontSize + 'px';\n\t\tfor (const fontDecoration of fontDecorations) {\n\t\t\tif (fontDecoration.options.fontSize) {\n\t\t\t\tfontSize = fontDecoration.options.fontSize;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn fontSize;\n\t}\n\n\t/**\n\t * @param forceUpdate If true, the hidden areas will be updated even if the new ranges are the same as the previous ranges.\n\t * This is because the model might have changed, which resets the hidden areas, but not the last cached value.\n\t * This needs a better fix in the future.\n\t*/\n\tpublic setHiddenAreas(ranges: Range[], source?: unknown, forceUpdate?: boolean): void {\n\t\tthis.hiddenAreasModel.setHiddenAreas(source, ranges);\n\t\tconst mergedRanges = this.hiddenAreasModel.getMergedRanges();\n\t\tif (mergedRanges === this.previousHiddenAreas && !forceUpdate) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.previousHiddenAreas = mergedRanges;\n\n\t\tconst stableViewport = this._captureStableViewport();\n\n\t\tlet lineMappingChanged = false;\n\t\ttry {\n\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\tlineMappingChanged = this._lines.setHiddenAreas(mergedRanges);\n\t\t\tif (lineMappingChanged) {\n\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewFlushedEvent());\n\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewLineMappingChangedEvent());\n\t\t\t\teventsCollector.emitViewEvent(new viewEvents.ViewDecorationsChangedEvent(null));\n\t\t\t\tthis._cursor.onLineMappingChanged(eventsCollector);\n\t\t\t\tthis._decorations.onLineMappingChanged();\n\t\t\t\tthis.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());\n\t\t\t\tthis.viewLayout.onHeightMaybeChanged();\n\t\t\t}\n\n\t\t\tconst firstModelLineInViewPort = stableViewport.viewportStartModelPosition?.lineNumber;\n\t\t\tconst firstModelLineIsHidden = firstModelLineInViewPort && mergedRanges.some(range => range.startLineNumber <= firstModelLineInViewPort && firstModelLineInViewPort <= range.endLineNumber);\n\t\t\tif (!firstModelLineIsHidden) {\n\t\t\t\tstableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t}\n\t\tthis._updateConfigurationViewLineCount.schedule();\n\n\t\tif (lineMappingChanged) {\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new HiddenAreasChangedEvent());\n\t\t}\n\t}\n\n\tpublic getVisibleRangesPlusViewportAboveBelow(): Range[] {\n\t\tconst layoutInfo = this._configuration.options.get(EditorOption.layoutInfo);\n\t\tconst lineHeight = this._configuration.options.get(EditorOption.lineHeight);\n\t\tconst linesAround = Math.max(20, Math.round(layoutInfo.height / lineHeight));\n\t\tconst partialData = this.viewLayout.getLinesViewportData();\n\t\tconst startViewLineNumber = Math.max(1, partialData.completelyVisibleStartLineNumber - linesAround);\n\t\tconst endViewLineNumber = Math.min(this.getLineCount(), partialData.completelyVisibleEndLineNumber + linesAround);\n\n\t\treturn this._toModelVisibleRanges(new Range(\n\t\t\tstartViewLineNumber, this.getLineMinColumn(startViewLineNumber),\n\t\t\tendViewLineNumber, this.getLineMaxColumn(endViewLineNumber)\n\t\t));\n\t}\n\n\tpublic getVisibleRanges(): Range[] {\n\t\tconst visibleViewRange = this.getCompletelyVisibleViewRange();\n\t\treturn this._toModelVisibleRanges(visibleViewRange);\n\t}\n\n\tpublic getHiddenAreas(): Range[] {\n\t\treturn this._lines.getHiddenAreas();\n\t}\n\n\tprivate _toModelVisibleRanges(visibleViewRange: Range): Range[] {\n\t\tconst visibleRange = this.coordinatesConverter.convertViewRangeToModelRange(visibleViewRange);\n\t\tconst hiddenAreas = this._lines.getHiddenAreas();\n\n\t\tif (hiddenAreas.length === 0) {\n\t\t\treturn [visibleRange];\n\t\t}\n\n\t\tconst result: Range[] = [];\n\t\tlet resultLen = 0;\n\t\tlet startLineNumber = visibleRange.startLineNumber;\n\t\tlet startColumn = visibleRange.startColumn;\n\t\tconst endLineNumber = visibleRange.endLineNumber;\n\t\tconst endColumn = visibleRange.endColumn;\n\t\tfor (let i = 0, len = hiddenAreas.length; i < len; i++) {\n\t\t\tconst hiddenStartLineNumber = hiddenAreas[i].startLineNumber;\n\t\t\tconst hiddenEndLineNumber = hiddenAreas[i].endLineNumber;\n\n\t\t\tif (hiddenEndLineNumber < startLineNumber) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (hiddenStartLineNumber > endLineNumber) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (startLineNumber < hiddenStartLineNumber) {\n\t\t\t\tresult[resultLen++] = new Range(\n\t\t\t\t\tstartLineNumber, startColumn,\n\t\t\t\t\thiddenStartLineNumber - 1, this.model.getLineMaxColumn(hiddenStartLineNumber - 1)\n\t\t\t\t);\n\t\t\t}\n\t\t\tstartLineNumber = hiddenEndLineNumber + 1;\n\t\t\tstartColumn = 1;\n\t\t}\n\n\t\tif (startLineNumber < endLineNumber || (startLineNumber === endLineNumber && startColumn < endColumn)) {\n\t\t\tresult[resultLen++] = new Range(\n\t\t\t\tstartLineNumber, startColumn,\n\t\t\t\tendLineNumber, endColumn\n\t\t\t);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic getCompletelyVisibleViewRange(): Range {\n\t\tconst partialData = this.viewLayout.getLinesViewportData();\n\t\tconst startViewLineNumber = partialData.completelyVisibleStartLineNumber;\n\t\tconst endViewLineNumber = partialData.completelyVisibleEndLineNumber;\n\n\t\treturn new Range(\n\t\t\tstartViewLineNumber, this.getLineMinColumn(startViewLineNumber),\n\t\t\tendViewLineNumber, this.getLineMaxColumn(endViewLineNumber)\n\t\t);\n\t}\n\n\tpublic getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range {\n\t\tconst partialData = this.viewLayout.getLinesViewportDataAtScrollTop(scrollTop);\n\t\tconst startViewLineNumber = partialData.completelyVisibleStartLineNumber;\n\t\tconst endViewLineNumber = partialData.completelyVisibleEndLineNumber;\n\n\t\treturn new Range(\n\t\t\tstartViewLineNumber, this.getLineMinColumn(startViewLineNumber),\n\t\t\tendViewLineNumber, this.getLineMaxColumn(endViewLineNumber)\n\t\t);\n\t}\n\n\tpublic saveState(): IViewState {\n\t\tconst compatViewState = this.viewLayout.saveState();\n\n\t\tconst scrollTop = compatViewState.scrollTop;\n\t\tconst firstViewLineNumber = this.viewLayout.getLineNumberAtVerticalOffset(scrollTop);\n\t\tconst firstPosition = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(firstViewLineNumber, this.getLineMinColumn(firstViewLineNumber)));\n\t\tconst firstPositionDeltaTop = this.viewLayout.getVerticalOffsetForLineNumber(firstViewLineNumber) - scrollTop;\n\n\t\treturn {\n\t\t\tscrollLeft: compatViewState.scrollLeft,\n\t\t\tfirstPosition: firstPosition,\n\t\t\tfirstPositionDeltaTop: firstPositionDeltaTop\n\t\t};\n\t}\n\n\tpublic reduceRestoreState(state: IViewState): { scrollLeft: number; scrollTop: number } {\n\t\tif (typeof state.firstPosition === 'undefined') {\n\t\t\t// This is a view state serialized by an older version\n\t\t\treturn this._reduceRestoreStateCompatibility(state);\n\t\t}\n\n\t\tconst modelPosition = this.model.validatePosition(state.firstPosition);\n\t\tconst viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(modelPosition);\n\t\tconst scrollTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber) - state.firstPositionDeltaTop;\n\t\treturn {\n\t\t\tscrollLeft: state.scrollLeft,\n\t\t\tscrollTop: scrollTop\n\t\t};\n\t}\n\n\tprivate _reduceRestoreStateCompatibility(state: IViewState): { scrollLeft: number; scrollTop: number } {\n\t\treturn {\n\t\t\tscrollLeft: state.scrollLeft,\n\t\t\tscrollTop: state.scrollTopWithoutViewZones!\n\t\t};\n\t}\n\n\tprivate getTabSize(): number {\n\t\treturn this.model.getOptions().tabSize;\n\t}\n\n\tpublic getLineCount(): number {\n\t\treturn this._lines.getViewLineCount();\n\t}\n\n\t/**\n\t * Gives a hint that a lot of requests are about to come in for these line numbers.\n\t */\n\tpublic setViewport(startLineNumber: number, endLineNumber: number, centeredLineNumber: number): void {\n\t\tthis._viewportStart.update(this, startLineNumber);\n\t}\n\n\tpublic getActiveIndentGuide(lineNumber: number, minLineNumber: number, maxLineNumber: number): IActiveIndentGuideInfo {\n\t\treturn this._lines.getActiveIndentGuide(lineNumber, minLineNumber, maxLineNumber);\n\t}\n\n\tpublic getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[] {\n\t\treturn this._lines.getViewLinesIndentGuides(startLineNumber, endLineNumber);\n\t}\n\n\tpublic getBracketGuidesInRangeByLine(startLineNumber: number, endLineNumber: number, activePosition: IPosition | null, options: BracketGuideOptions): IndentGuide[][] {\n\t\treturn this._lines.getViewLinesBracketGuides(startLineNumber, endLineNumber, activePosition, options);\n\t}\n\n\tpublic getLineContent(lineNumber: number): string {\n\t\treturn this._lines.getViewLineContent(lineNumber);\n\t}\n\n\tpublic getLineLength(lineNumber: number): number {\n\t\treturn this._lines.getViewLineLength(lineNumber);\n\t}\n\n\tpublic getLineMinColumn(lineNumber: number): number {\n\t\treturn this._lines.getViewLineMinColumn(lineNumber);\n\t}\n\n\tpublic getLineMaxColumn(lineNumber: number): number {\n\t\treturn this._lines.getViewLineMaxColumn(lineNumber);\n\t}\n\n\tpublic getLineFirstNonWhitespaceColumn(lineNumber: number): number {\n\t\tconst result = strings.firstNonWhitespaceIndex(this.getLineContent(lineNumber));\n\t\tif (result === -1) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn result + 1;\n\t}\n\n\tpublic getLineLastNonWhitespaceColumn(lineNumber: number): number {\n\t\tconst result = strings.lastNonWhitespaceIndex(this.getLineContent(lineNumber));\n\t\tif (result === -1) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn result + 2;\n\t}\n\n\tpublic getMinimapDecorationsInRange(range: Range): ViewModelDecoration[] {\n\t\treturn this._decorations.getMinimapDecorationsInRange(range);\n\t}\n\n\tpublic getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[] {\n\t\treturn this._decorations.getDecorationsViewportData(visibleRange).decorations;\n\t}\n\n\tpublic getInjectedTextAt(viewPosition: Position): InjectedText | null {\n\t\treturn this._lines.getInjectedTextAt(viewPosition);\n\t}\n\n\tprivate _getTextDirection(lineNumber: number, decorations: ViewModelDecoration[]): TextDirection {\n\t\tlet rtlCount = 0;\n\n\t\tfor (const decoration of decorations) {\n\t\t\tconst range = decoration.range;\n\t\t\tif (range.startLineNumber > lineNumber || range.endLineNumber < lineNumber) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst textDirection = decoration.options.textDirection;\n\t\t\tif (textDirection === TextDirection.RTL) {\n\t\t\t\trtlCount++;\n\t\t\t} else if (textDirection === TextDirection.LTR) {\n\t\t\t\trtlCount--;\n\t\t\t}\n\t\t}\n\n\t\treturn rtlCount > 0 ? TextDirection.RTL : TextDirection.LTR;\n\t}\n\n\tpublic getTextDirection(lineNumber: number): TextDirection {\n\t\tconst decorationsCollection = this._decorations.getDecorationsOnLine(lineNumber);\n\t\treturn this._getTextDirection(lineNumber, decorationsCollection.decorations);\n\t}\n\n\tpublic getViewportViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData {\n\t\tconst viewportDecorationsCollection = this._decorations.getDecorationsViewportData(visibleRange);\n\t\tconst inlineDecorations = viewportDecorationsCollection.inlineDecorations[lineNumber - visibleRange.startLineNumber];\n\t\treturn this._getViewLineRenderingData(lineNumber, inlineDecorations, viewportDecorationsCollection.hasVariableFonts, viewportDecorationsCollection.decorations);\n\t}\n\n\tpublic getViewLineRenderingData(lineNumber: number): ViewLineRenderingData {\n\t\tconst decorationsCollection = this._decorations.getDecorationsOnLine(lineNumber);\n\t\treturn this._getViewLineRenderingData(lineNumber, decorationsCollection.inlineDecorations[0], decorationsCollection.hasVariableFonts, decorationsCollection.decorations);\n\t}\n\n\tprivate _getViewLineRenderingData(lineNumber: number, inlineDecorations: InlineDecoration[], hasVariableFonts: boolean, decorations: ViewModelDecoration[]): ViewLineRenderingData {\n\t\tconst mightContainRTL = this.model.mightContainRTL();\n\t\tconst mightContainNonBasicASCII = this.model.mightContainNonBasicASCII();\n\t\tconst tabSize = this.getTabSize();\n\t\tconst lineData = this._lines.getViewLineData(lineNumber);\n\n\t\tif (lineData.inlineDecorations) {\n\t\t\tinlineDecorations = [\n\t\t\t\t...inlineDecorations,\n\t\t\t\t...lineData.inlineDecorations.map(d =>\n\t\t\t\t\td.toInlineDecoration(lineNumber)\n\t\t\t\t)\n\t\t\t];\n\t\t}\n\n\t\treturn new ViewLineRenderingData(\n\t\t\tlineData.minColumn,\n\t\t\tlineData.maxColumn,\n\t\t\tlineData.content,\n\t\t\tlineData.continuesWithWrappedLine,\n\t\t\tmightContainRTL,\n\t\t\tmightContainNonBasicASCII,\n\t\t\tlineData.tokens,\n\t\t\tinlineDecorations,\n\t\t\ttabSize,\n\t\t\tlineData.startVisibleColumn,\n\t\t\tthis._getTextDirection(lineNumber, decorations),\n\t\t\thasVariableFonts\n\t\t);\n\t}\n\n\tpublic getViewLineData(lineNumber: number): ViewLineData {\n\t\treturn this._lines.getViewLineData(lineNumber);\n\t}\n\n\tpublic getMinimapLinesRenderingData(startLineNumber: number, endLineNumber: number, needed: boolean[]): MinimapLinesRenderingData {\n\t\tconst result = this._lines.getViewLinesData(startLineNumber, endLineNumber, needed);\n\t\treturn new MinimapLinesRenderingData(\n\t\t\tthis.getTabSize(),\n\t\t\tresult\n\t\t);\n\t}\n\n\tpublic getAllOverviewRulerDecorations(theme: EditorTheme): OverviewRulerDecorationsGroup[] {\n\t\tconst decorations = this.model.getOverviewRulerDecorations(this._editorId, filterValidationDecorations(this._configuration.options), filterFontDecorations(this._configuration.options));\n\t\tconst result = new OverviewRulerDecorations();\n\t\tfor (const decoration of decorations) {\n\t\t\tconst decorationOptions = <ModelDecorationOptions>decoration.options;\n\t\t\tconst opts = decorationOptions.overviewRuler;\n\t\t\tif (!opts) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst lane = <number>opts.position;\n\t\t\tif (lane === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst color = opts.getColor(theme.value);\n\t\t\tconst viewStartLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration.range.startLineNumber, decoration.range.startColumn);\n\t\t\tconst viewEndLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration.range.endLineNumber, decoration.range.endColumn);\n\n\t\t\tresult.accept(color, decorationOptions.zIndex, viewStartLineNumber, viewEndLineNumber, lane);\n\t\t}\n\t\treturn result.asArray;\n\t}\n\n\tprivate _invalidateDecorationsColorCache(): void {\n\t\tconst decorations = this.model.getOverviewRulerDecorations();\n\t\tfor (const decoration of decorations) {\n\t\t\tconst opts1 = <ModelDecorationOverviewRulerOptions>decoration.options.overviewRuler;\n\t\t\topts1?.invalidateCachedColor();\n\t\t\tconst opts2 = <ModelDecorationMinimapOptions>decoration.options.minimap;\n\t\t\topts2?.invalidateCachedColor();\n\t\t}\n\t}\n\n\tpublic getValueInRange(range: Range, eol: EndOfLinePreference): string {\n\t\tconst modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range);\n\t\treturn this.model.getValueInRange(modelRange, eol);\n\t}\n\n\tpublic getValueLengthInRange(range: Range, eol: EndOfLinePreference): number {\n\t\tconst modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range);\n\t\treturn this.model.getValueLengthInRange(modelRange, eol);\n\t}\n\n\tpublic modifyPosition(position: Position, offset: number): Position {\n\t\tconst modelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(position);\n\t\tconst resultModelPosition = this.model.modifyPosition(modelPosition, offset);\n\t\treturn this.coordinatesConverter.convertModelPositionToViewPosition(resultModelPosition);\n\t}\n\n\tpublic deduceModelPositionRelativeToViewPosition(viewAnchorPosition: Position, deltaOffset: number, lineFeedCnt: number): Position {\n\t\tconst modelAnchor = this.coordinatesConverter.convertViewPositionToModelPosition(viewAnchorPosition);\n\t\tif (this.model.getEOL().length === 2) {\n\t\t\t// This model uses CRLF, so the delta must take that into account\n\t\t\tif (deltaOffset < 0) {\n\t\t\t\tdeltaOffset -= lineFeedCnt;\n\t\t\t} else {\n\t\t\t\tdeltaOffset += lineFeedCnt;\n\t\t\t}\n\t\t}\n\n\t\tconst modelAnchorOffset = this.model.getOffsetAt(modelAnchor);\n\t\tconst resultOffset = modelAnchorOffset + deltaOffset;\n\t\treturn this.model.getPositionAt(resultOffset);\n\t}\n\n\tpublic getPlainTextToCopy(modelRanges: Range[], emptySelectionClipboard: boolean, forceCRLF: boolean): string | string[] {\n\t\tconst newLineCharacter = forceCRLF ? '\\r\\n' : this.model.getEOL();\n\n\t\tmodelRanges = modelRanges.slice(0);\n\t\tmodelRanges.sort(Range.compareRangesUsingStarts);\n\n\t\tlet hasEmptyRange = false;\n\t\tlet hasNonEmptyRange = false;\n\t\tfor (const range of modelRanges) {\n\t\t\tif (range.isEmpty()) {\n\t\t\t\thasEmptyRange = true;\n\t\t\t} else {\n\t\t\t\thasNonEmptyRange = true;\n\t\t\t}\n\t\t}\n\n\t\tif (!hasNonEmptyRange && !emptySelectionClipboard) {\n\t\t\t// all ranges are empty\n\t\t\treturn '';\n\t\t}\n\n\t\tif (hasEmptyRange && emptySelectionClipboard) {\n\t\t\t// some (maybe all) empty selections\n\t\t\tconst result: string[] = [];\n\t\t\tlet prevModelLineNumber = 0;\n\t\t\tfor (const modelRange of modelRanges) {\n\t\t\t\tconst modelLineNumber = modelRange.startLineNumber;\n\t\t\t\tif (modelRange.isEmpty()) {\n\t\t\t\t\tif (modelLineNumber !== prevModelLineNumber) {\n\t\t\t\t\t\tresult.push(this.model.getLineContent(modelLineNumber) + newLineCharacter);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresult.push(this.model.getValueInRange(modelRange, forceCRLF ? EndOfLinePreference.CRLF : EndOfLinePreference.TextDefined));\n\t\t\t\t}\n\t\t\t\tprevModelLineNumber = modelLineNumber;\n\t\t\t}\n\t\t\treturn result.length === 1 ? result[0] : result;\n\t\t}\n\n\t\tconst result: string[] = [];\n\t\tfor (const modelRange of modelRanges) {\n\t\t\tif (!modelRange.isEmpty()) {\n\t\t\t\tresult.push(this.model.getValueInRange(modelRange, forceCRLF ? EndOfLinePreference.CRLF : EndOfLinePreference.TextDefined));\n\t\t\t}\n\t\t}\n\t\treturn result.length === 1 ? result[0] : result;\n\t}\n\n\tpublic getRichTextToCopy(modelRanges: Range[], emptySelectionClipboard: boolean): { html: string; mode: string } | null {\n\t\tconst languageId = this.model.getLanguageId();\n\t\tif (languageId === PLAINTEXT_LANGUAGE_ID) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (modelRanges.length !== 1) {\n\t\t\t// no multiple selection support at this time\n\t\t\treturn null;\n\t\t}\n\n\t\tlet range = modelRanges[0];\n\t\tif (range.isEmpty()) {\n\t\t\tif (!emptySelectionClipboard) {\n\t\t\t\t// nothing to copy\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst lineNumber = range.startLineNumber;\n\t\t\trange = new Range(lineNumber, this.model.getLineMinColumn(lineNumber), lineNumber, this.model.getLineMaxColumn(lineNumber));\n\t\t}\n\n\t\tconst fontInfo = this._configuration.options.get(EditorOption.fontInfo);\n\t\tconst colorMap = this._getColorMap();\n\t\tconst hasBadChars = (/[:;\\\\\\/<>]/.test(fontInfo.fontFamily));\n\t\tconst useDefaultFontFamily = (hasBadChars || fontInfo.fontFamily === EDITOR_FONT_DEFAULTS.fontFamily);\n\t\tlet fontFamily: string;\n\t\tif (useDefaultFontFamily) {\n\t\t\tfontFamily = EDITOR_FONT_DEFAULTS.fontFamily;\n\t\t} else {\n\t\t\tfontFamily = fontInfo.fontFamily;\n\t\t\tfontFamily = fontFamily.replace(/\"/g, '\\'');\n\t\t\tconst hasQuotesOrIsList = /[,']/.test(fontFamily);\n\t\t\tif (!hasQuotesOrIsList) {\n\t\t\t\tconst needsQuotes = /[+ ]/.test(fontFamily);\n\t\t\t\tif (needsQuotes) {\n\t\t\t\t\tfontFamily = `'${fontFamily}'`;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfontFamily = `${fontFamily}, ${EDITOR_FONT_DEFAULTS.fontFamily}`;\n\t\t}\n\n\t\treturn {\n\t\t\tmode: languageId,\n\t\t\thtml: (\n\t\t\t\t`<div style=\"`\n\t\t\t\t+ `color: ${colorMap[ColorId.DefaultForeground]};`\n\t\t\t\t+ `background-color: ${colorMap[ColorId.DefaultBackground]};`\n\t\t\t\t+ `font-family: ${fontFamily};`\n\t\t\t\t+ `font-weight: ${fontInfo.fontWeight};`\n\t\t\t\t+ `font-size: ${fontInfo.fontSize}px;`\n\t\t\t\t+ `line-height: ${fontInfo.lineHeight}px;`\n\t\t\t\t+ `white-space: pre;`\n\t\t\t\t+ `\">`\n\t\t\t\t+ this._getHTMLToCopy(range, colorMap)\n\t\t\t\t+ '</div>'\n\t\t\t)\n\t\t};\n\t}\n\n\tprivate _getHTMLToCopy(modelRange: Range, colorMap: string[]): string {\n\t\tconst startLineNumber = modelRange.startLineNumber;\n\t\tconst startColumn = modelRange.startColumn;\n\t\tconst endLineNumber = modelRange.endLineNumber;\n\t\tconst endColumn = modelRange.endColumn;\n\n\t\tconst tabSize = this.getTabSize();\n\n\t\tlet result = '';\n\n\t\tfor (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {\n\t\t\tconst lineTokens = this.model.tokenization.getLineTokens(lineNumber);\n\t\t\tconst lineContent = lineTokens.getLineContent();\n\t\t\tconst startOffset = (lineNumber === startLineNumber ? startColumn - 1 : 0);\n\t\t\tconst endOffset = (lineNumber === endLineNumber ? endColumn - 1 : lineContent.length);\n\n\t\t\tif (lineContent === '') {\n\t\t\t\tresult += '<br>';\n\t\t\t} else {\n\t\t\t\tresult += tokenizeLineToHTML(lineContent, lineTokens.inflate(), colorMap, startOffset, endOffset, tabSize, platform.isWindows);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate _getColorMap(): string[] {\n\t\tconst colorMap = TokenizationRegistry.getColorMap();\n\t\tconst result: string[] = ['#000000'];\n\t\tif (colorMap) {\n\t\t\tfor (let i = 1, len = colorMap.length; i < len; i++) {\n\t\t\t\tresult[i] = Color.Format.CSS.formatHex(colorMap[i]);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t//#region cursor operations\n\n\tpublic getPrimaryCursorState(): CursorState {\n\t\treturn this._cursor.getPrimaryCursorState();\n\t}\n\tpublic getLastAddedCursorIndex(): number {\n\t\treturn this._cursor.getLastAddedCursorIndex();\n\t}\n\tpublic getCursorStates(): CursorState[] {\n\t\treturn this._cursor.getCursorStates();\n\t}\n\tpublic setCursorStates(source: string | null | undefined, reason: CursorChangeReason, states: PartialCursorState[] | null): boolean {\n\t\treturn this._withViewEventsCollector(eventsCollector => this._cursor.setStates(eventsCollector, source, reason, states));\n\t}\n\tpublic getCursorColumnSelectData(): IColumnSelectData {\n\t\treturn this._cursor.getCursorColumnSelectData();\n\t}\n\tpublic getCursorAutoClosedCharacters(): Range[] {\n\t\treturn this._cursor.getAutoClosedCharacters();\n\t}\n\tpublic setCursorColumnSelectData(columnSelectData: IColumnSelectData): void {\n\t\tthis._cursor.setCursorColumnSelectData(columnSelectData);\n\t}\n\tpublic getPrevEditOperationType(): EditOperationType {\n\t\treturn this._cursor.getPrevEditOperationType();\n\t}\n\tpublic setPrevEditOperationType(type: EditOperationType): void {\n\t\tthis._cursor.setPrevEditOperationType(type);\n\t}\n\tpublic getSelection(): Selection {\n\t\treturn this._cursor.getSelection();\n\t}\n\tpublic getSelections(): Selection[] {\n\t\treturn this._cursor.getSelections();\n\t}\n\tpublic getPosition(): Position {\n\t\treturn this._cursor.getPrimaryCursorState().modelState.position;\n\t}\n\tpublic setSelections(source: string | null | undefined, selections: readonly ISelection[], reason = CursorChangeReason.NotSet): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.setSelections(eventsCollector, source, selections, reason));\n\t}\n\tpublic saveCursorState(): ICursorState[] {\n\t\treturn this._cursor.saveState();\n\t}\n\tpublic restoreCursorState(states: ICursorState[]): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.restoreState(eventsCollector, states));\n\t}\n\n\tprivate _executeCursorEdit(callback: (eventsCollector: ViewModelEventsCollector) => void): void {\n\t\tif (this._cursor.context.cursorConfig.readOnly) {\n\t\t\t// we cannot edit when read only...\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ReadOnlyEditAttemptEvent());\n\t\t\treturn;\n\t\t}\n\t\tthis._withViewEventsCollector(callback);\n\t}\n\tpublic executeEdits(source: string | null | undefined, edits: IIdentifiedSingleEditOperation[], cursorStateComputer: ICursorStateComputer, reason: TextModelEditSource): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.executeEdits(eventsCollector, source, edits, cursorStateComputer, reason));\n\t}\n\tpublic startComposition(): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.startComposition(eventsCollector));\n\t}\n\tpublic endComposition(source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.endComposition(eventsCollector, source));\n\t}\n\tpublic type(text: string, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.type(eventsCollector, text, source));\n\t}\n\tpublic compositionType(text: string, replacePrevCharCnt: number, replaceNextCharCnt: number, positionDelta: number, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.compositionType(eventsCollector, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source));\n\t}\n\tpublic paste(text: string, pasteOnNewLine: boolean, multicursorText?: string[] | null | undefined, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.paste(eventsCollector, text, pasteOnNewLine, multicursorText, source));\n\t}\n\tpublic cut(source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.cut(eventsCollector, source));\n\t}\n\tpublic executeCommand(command: ICommand, source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.executeCommand(eventsCollector, command, source));\n\t}\n\tpublic executeCommands(commands: ICommand[], source?: string | null | undefined): void {\n\t\tthis._executeCursorEdit(eventsCollector => this._cursor.executeCommands(eventsCollector, commands, source));\n\t}\n\tpublic revealAllCursors(source: string | null | undefined, revealHorizontal: boolean, minimalReveal: boolean = false): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.revealAll(eventsCollector, source, minimalReveal, viewEvents.VerticalRevealType.Simple, revealHorizontal, ScrollType.Smooth));\n\t}\n\tpublic revealPrimaryCursor(source: string | null | undefined, revealHorizontal: boolean, minimalReveal: boolean = false): void {\n\t\tthis._withViewEventsCollector(eventsCollector => this._cursor.revealPrimary(eventsCollector, source, minimalReveal, viewEvents.VerticalRevealType.Simple, revealHorizontal, ScrollType.Smooth));\n\t}\n\tpublic revealTopMostCursor(source: string | null | undefined): void {\n\t\tconst viewPosition = this._cursor.getTopMostViewPosition();\n\t\tconst viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column);\n\t\tthis._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new viewEvents.ViewRevealRangeRequestEvent(source, false, viewRange, null, viewEvents.VerticalRevealType.Simple, true, ScrollType.Smooth)));\n\t}\n\tpublic revealBottomMostCursor(source: string | null | undefined): void {\n\t\tconst viewPosition = this._cursor.getBottomMostViewPosition();\n\t\tconst viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column);\n\t\tthis._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new viewEvents.ViewRevealRangeRequestEvent(source, false, viewRange, null, viewEvents.VerticalRevealType.Simple, true, ScrollType.Smooth)));\n\t}\n\tpublic revealRange(source: string | null | undefined, revealHorizontal: boolean, viewRange: Range, verticalType: viewEvents.VerticalRevealType, scrollType: ScrollType): void {\n\t\tthis._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new viewEvents.ViewRevealRangeRequestEvent(source, false, viewRange, null, verticalType, revealHorizontal, scrollType)));\n\t}\n\n\t//#endregion\n\n\t//#region viewLayout\n\tpublic changeWhitespace(callback: (accessor: IWhitespaceChangeAccessor) => void): void {\n\t\tconst hadAChange = this.viewLayout.changeWhitespace(callback);\n\t\tif (hadAChange) {\n\t\t\tthis._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewZonesChangedEvent());\n\t\t\tthis._eventDispatcher.emitOutgoingEvent(new ViewZonesChangedEvent());\n\t\t}\n\t}\n\t//#endregion\n\n\tprivate _withViewEventsCollector<T>(callback: (eventsCollector: ViewModelEventsCollector) => T): T {\n\t\treturn this._transactionalTarget.batchChanges(() => {\n\t\t\ttry {\n\t\t\t\tconst eventsCollector = this._eventDispatcher.beginEmitViewEvents();\n\t\t\t\treturn callback(eventsCollector);\n\t\t\t} finally {\n\t\t\t\tthis._eventDispatcher.endEmitViewEvents();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic batchEvents(callback: () => void): void {\n\t\tthis._withViewEventsCollector(() => { callback(); });\n\t}\n\n\tnormalizePosition(position: Position, affinity: PositionAffinity): Position {\n\t\treturn this._lines.normalizePosition(position, affinity);\n\t}\n\n\t/**\n\t * Gets the column at which indentation stops at a given line.\n\t * @internal\n\t*/\n\tgetLineIndentColumn(lineNumber: number): number {\n\t\treturn this._lines.getLineIndentColumn(lineNumber);\n\t}\n}\n\nexport interface IBatchableTarget {\n\t/**\n\t * Allows the target to apply the changes introduced by the callback in a batch.\n\t*/\n\tbatchChanges<T>(cb: () => T): T;\n}\n\nclass ViewportStart implements IDisposable {\n\n\tpublic static create(model: ITextModel): ViewportStart {\n\t\tconst viewportStartLineTrackedRange = model._setTrackedRange(null, new Range(1, 1, 1, 1), TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges);\n\t\treturn new ViewportStart(model, 1, false, viewportStartLineTrackedRange, 0);\n\t}\n\n\tpublic get viewLineNumber(): number {\n\t\treturn this._viewLineNumber;\n\t}\n\n\tpublic get isValid(): boolean {\n\t\treturn this._isValid;\n\t}\n\n\tpublic get modelTrackedRange(): string {\n\t\treturn this._modelTrackedRange;\n\t}\n\n\tpublic get startLineDelta(): number {\n\t\treturn this._startLineDelta;\n\t}\n\n\tprivate constructor(\n\t\tprivate readonly _model: ITextModel,\n\t\tprivate _viewLineNumber: number,\n\t\tprivate _isValid: boolean,\n\t\tprivate _modelTrackedRange: string,\n\t\tprivate _startLineDelta: number,\n\t) { }\n\n\tpublic dispose(): void {\n\t\tthis._model._setTrackedRange(this._modelTrackedRange, null, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges);\n\t}\n\n\tpublic update(viewModel: IViewModel, startLineNumber: number): void {\n\t\tconst position = viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(startLineNumber, viewModel.getLineMinColumn(startLineNumber)));\n\t\tconst viewportStartLineTrackedRange = viewModel.model._setTrackedRange(this._modelTrackedRange, new Range(position.lineNumber, position.column, position.lineNumber, position.column), TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges);\n\t\tconst viewportStartLineTop = viewModel.viewLayout.getVerticalOffsetForLineNumber(startLineNumber);\n\t\tconst scrollTop = viewModel.viewLayout.getCurrentScrollTop();\n\n\t\tthis._viewLineNumber = startLineNumber;\n\t\tthis._isValid = true;\n\t\tthis._modelTrackedRange = viewportStartLineTrackedRange;\n\t\tthis._startLineDelta = scrollTop - viewportStartLineTop;\n\t}\n\n\tpublic invalidate(): void {\n\t\tthis._isValid = false;\n\t}\n}\n\nclass OverviewRulerDecorations {\n\n\tprivate readonly _asMap: { [color: string]: OverviewRulerDecorationsGroup } = Object.create(null);\n\treadonly asArray: OverviewRulerDecorationsGroup[] = [];\n\n\tpublic accept(color: string, zIndex: number, startLineNumber: number, endLineNumber: number, lane: number): void {\n\t\tconst prevGroup = this._asMap[color];\n\n\t\tif (prevGroup) {\n\t\t\tconst prevData = prevGroup.data;\n\t\t\tconst prevLane = prevData[prevData.length - 3];\n\t\t\tconst prevEndLineNumber = prevData[prevData.length - 1];\n\t\t\tif (prevLane === lane && prevEndLineNumber + 1 >= startLineNumber) {\n\t\t\t\t// merge into prev\n\t\t\t\tif (endLineNumber > prevEndLineNumber) {\n\t\t\t\t\tprevData[prevData.length - 1] = endLineNumber;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// push\n\t\t\tprevData.push(lane, startLineNumber, endLineNumber);\n\t\t} else {\n\t\t\tconst group = new OverviewRulerDecorationsGroup(color, zIndex, [lane, startLineNumber, endLineNumber]);\n\t\t\tthis._asMap[color] = group;\n\t\t\tthis.asArray.push(group);\n\t\t}\n\t}\n}\n\nclass HiddenAreasModel {\n\tprivate readonly hiddenAreas = new Map<unknown, Range[]>();\n\tprivate shouldRecompute = false;\n\tprivate ranges: Range[] = [];\n\n\tsetHiddenAreas(source: unknown, ranges: Range[]): void {\n\t\tconst existing = this.hiddenAreas.get(source);\n\t\tif (existing && rangeArraysEqual(existing, ranges)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.hiddenAreas.set(source, ranges);\n\t\tthis.shouldRecompute = true;\n\t}\n\n\t/**\n\t * The returned array is immutable.\n\t*/\n\tgetMergedRanges(): readonly Range[] {\n\t\tif (!this.shouldRecompute) {\n\t\t\treturn this.ranges;\n\t\t}\n\t\tthis.shouldRecompute = false;\n\t\tconst newRanges = Array.from(this.hiddenAreas.values()).reduce((r, hiddenAreas) => mergeLineRangeArray(r, hiddenAreas), []);\n\t\tif (rangeArraysEqual(this.ranges, newRanges)) {\n\t\t\treturn this.ranges;\n\t\t}\n\t\tthis.ranges = newRanges;\n\t\treturn this.ranges;\n\t}\n}\n\nfunction mergeLineRangeArray(arr1: Range[], arr2: Range[]): Range[] {\n\tconst result: Range[] = [];\n\tlet i = 0;\n\tlet j = 0;\n\twhile (i < arr1.length && j < arr2.length) {\n\t\tconst item1 = arr1[i];\n\t\tconst item2 = arr2[j];\n\n\t\tif (item1.endLineNumber < item2.startLineNumber - 1) {\n\t\t\tresult.push(arr1[i++]);\n\t\t} else if (item2.endLineNumber < item1.startLineNumber - 1) {\n\t\t\tresult.push(arr2[j++]);\n\t\t} else {\n\t\t\tconst startLineNumber = Math.min(item1.startLineNumber, item2.startLineNumber);\n\t\t\tconst endLineNumber = Math.max(item1.endLineNumber, item2.endLineNumber);\n\t\t\tresult.push(new Range(startLineNumber, 1, endLineNumber, 1));\n\t\t\ti++;\n\t\t\tj++;\n\t\t}\n\t}\n\twhile (i < arr1.length) {\n\t\tresult.push(arr1[i++]);\n\t}\n\twhile (j < arr2.length) {\n\t\tresult.push(arr2[j++]);\n\t}\n\treturn result;\n}\n\nfunction rangeArraysEqual(arr1: Range[], arr2: Range[]): boolean {\n\tif (arr1.length !== arr2.length) {\n\t\treturn false;\n\t}\n\tfor (let i = 0; i < arr1.length; i++) {\n\t\tif (!arr1[i].equalsRange(arr2[i])) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Maintain a stable viewport by trying to keep the first line in the viewport constant.\n */\nclass StableViewport {\n\tconstructor(\n\t\tpublic readonly viewportStartModelPosition: Position | null,\n\t\tpublic readonly startLineDelta: number\n\t) { }\n\n\tpublic recoverViewportStart(coordinatesConverter: ICoordinatesConverter, viewLayout: ViewLayout): void {\n\t\tif (!this.viewportStartModelPosition) {\n\t\t\treturn;\n\t\t}\n\t\tconst viewPosition = coordinatesConverter.convertModelPositionToViewPosition(this.viewportStartModelPosition);\n\t\tconst viewPositionTop = viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber);\n\t\tviewLayout.setScrollPosition({ scrollTop: viewPositionTop + this.startLineDelta }, ScrollType.Immediate);\n\t}\n}\n"]}
|