monaco-editor11 1.0.7 → 1.0.9
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/dist/assets/css.worker-C7FogG4G.js +93 -0
- package/dist/assets/editor.worker-iXcRX1Tq.js +26 -0
- package/dist/assets/html.worker-C8VxctEJ.js +470 -0
- package/dist/assets/json.worker-CMC9kgPL.js +58 -0
- package/dist/assets/ts.worker-CtTJ3hNN.js +67731 -0
- package/dist/index.d.ts +0 -6
- package/dist/monaco-editor11.es.js +49 -78
- package/dist/monaco-editor11.umd.js +1 -50
- package/dist/monaco.d.ts +8 -0
- package/dist/workers/common/initialize.js +16 -0
- package/dist/workers/common/workers.js +141 -0
- package/dist/workers/editor/common/abstractSyntaxTokenBackend.js +128 -0
- package/dist/workers/editor/common/abstractText.js +89 -0
- package/dist/workers/editor/common/ast.js +485 -0
- package/dist/workers/editor/common/autoIndent.js +390 -0
- package/dist/workers/editor/common/beforeEditPositionMapper.js +110 -0
- package/dist/workers/editor/common/bracketPairsImpl.js +717 -0
- package/dist/workers/editor/common/bracketPairsTree.js +343 -0
- package/dist/workers/editor/common/brackets.js +108 -0
- package/dist/workers/editor/common/characterClassifier.js +59 -0
- package/dist/workers/editor/common/characterPair.js +40 -0
- package/dist/workers/editor/common/colorizedBracketPairsDecorationProvider.js +97 -0
- package/dist/workers/editor/common/columnRange.js +35 -0
- package/dist/workers/editor/common/combineTextEditInfos.js +124 -0
- package/dist/workers/editor/common/common.js +20 -0
- package/dist/workers/editor/common/computeMovedLines.js +249 -0
- package/dist/workers/editor/common/concat23Trees.js +192 -0
- package/dist/workers/editor/common/contiguousMultilineTokens.js +32 -0
- package/dist/workers/editor/common/contiguousMultilineTokensBuilder.js +23 -0
- package/dist/workers/editor/common/contiguousTokensEditing.js +128 -0
- package/dist/workers/editor/common/contiguousTokensStore.js +207 -0
- package/dist/workers/editor/common/coordinatesConverter.js +51 -0
- package/dist/workers/editor/common/cursor.js +899 -0
- package/dist/workers/editor/common/cursorAtomicMoveOperations.js +145 -0
- package/dist/workers/editor/common/cursorCollection.js +194 -0
- package/dist/workers/editor/common/cursorColumnSelection.js +93 -0
- package/dist/workers/editor/common/cursorColumns.js +112 -0
- package/dist/workers/editor/common/cursorCommon.js +250 -0
- package/dist/workers/editor/common/cursorContext.js +15 -0
- package/dist/workers/editor/common/cursorDeleteOperations.js +231 -0
- package/dist/workers/editor/common/cursorMoveCommands.js +676 -0
- package/dist/workers/editor/common/cursorMoveOperations.js +290 -0
- package/dist/workers/editor/common/cursorTypeEditOperations.js +968 -0
- package/dist/workers/editor/common/cursorTypeOperations.js +173 -0
- package/dist/workers/editor/common/cursorUtils.js +75 -0
- package/dist/workers/editor/common/cursorWordOperations.js +720 -0
- package/dist/workers/editor/common/defaultDocumentColorsComputer.js +138 -0
- package/dist/workers/editor/common/defaultLinesDiffComputer.js +188 -0
- package/dist/workers/editor/common/diffAlgorithm.js +139 -0
- package/dist/workers/editor/common/diffEditor.js +38 -0
- package/dist/workers/editor/common/dynamicProgrammingDiffing.js +101 -0
- package/dist/workers/editor/common/edit.js +183 -0
- package/dist/workers/editor/common/editOperation.js +36 -0
- package/dist/workers/editor/common/editStack.js +363 -0
- package/dist/workers/editor/common/editorAction.js +26 -0
- package/dist/workers/editor/common/editorBaseApi.js +43 -0
- package/dist/workers/editor/common/editorColorRegistry.js +102 -0
- package/dist/workers/editor/common/editorCommon.js +13 -0
- package/dist/workers/editor/common/editorConfigurationSchema.js +338 -0
- package/dist/workers/editor/common/editorContextKeys.js +84 -0
- package/dist/workers/editor/common/editorFeatures.js +17 -0
- package/dist/workers/editor/common/editorOptions.js +3440 -0
- package/dist/workers/editor/common/editorTheme.js +23 -0
- package/dist/workers/editor/common/editorWebWorker.js +299 -0
- package/dist/workers/editor/common/editorWorker.js +9 -0
- package/dist/workers/editor/common/editorWorkerHost.js +15 -0
- package/dist/workers/editor/common/editorZoom.js +26 -0
- package/dist/workers/editor/common/electricCharacter.js +55 -0
- package/dist/workers/editor/common/encodedTokenAttributes.js +79 -0
- package/dist/workers/editor/common/enterAction.js +53 -0
- package/dist/workers/editor/common/eolCounter.js +44 -0
- package/dist/workers/editor/common/findSectionHeaders.js +128 -0
- package/dist/workers/editor/common/fixBrackets.js +67 -0
- package/dist/workers/editor/common/fixedArray.js +70 -0
- package/dist/workers/editor/common/fontInfo.js +172 -0
- package/dist/workers/editor/common/fontInfoFromSettings.js +29 -0
- package/dist/workers/editor/common/getIconClasses.js +106 -0
- package/dist/workers/editor/common/getPositionOffsetTransformerFromTextModel.js +24 -0
- package/dist/workers/editor/common/glyphLanesModel.js +61 -0
- package/dist/workers/editor/common/guidesTextModelPart.js +405 -0
- package/dist/workers/editor/common/heuristicSequenceOptimizations.js +374 -0
- package/dist/workers/editor/common/indentRules.js +63 -0
- package/dist/workers/editor/common/indentation.js +39 -0
- package/dist/workers/editor/common/indentationGuesser.js +178 -0
- package/dist/workers/editor/common/indentationLineProcessor.js +193 -0
- package/dist/workers/editor/common/inlineDecorations.js +26 -0
- package/dist/workers/editor/common/inplaceReplaceSupport.js +87 -0
- package/dist/workers/editor/common/inputMode.js +22 -0
- package/dist/workers/editor/common/intervalTree.js +1002 -0
- package/dist/workers/editor/common/language.js +9 -0
- package/dist/workers/editor/common/languageBracketsConfiguration.js +133 -0
- package/dist/workers/editor/common/languageConfiguration.js +138 -0
- package/dist/workers/editor/common/languageConfigurationRegistry.js +361 -0
- package/dist/workers/editor/common/languageFeatureDebounce.js +137 -0
- package/dist/workers/editor/common/languageFeatureRegistry.js +180 -0
- package/dist/workers/editor/common/languageFeatures.js +9 -0
- package/dist/workers/editor/common/languageFeaturesService.js +47 -0
- package/dist/workers/editor/common/languageSelector.js +112 -0
- package/dist/workers/editor/common/languageService.js +92 -0
- package/dist/workers/editor/common/languages.js +522 -0
- package/dist/workers/editor/common/languagesAssociations.js +193 -0
- package/dist/workers/editor/common/languagesRegistry.js +237 -0
- package/dist/workers/editor/common/legacyLinesDiffComputer.js +468 -0
- package/dist/workers/editor/common/length.js +129 -0
- package/dist/workers/editor/common/lineDecorations.js +208 -0
- package/dist/workers/editor/common/lineEdit.js +75 -0
- package/dist/workers/editor/common/lineHeights.js +370 -0
- package/dist/workers/editor/common/linePart.js +25 -0
- package/dist/workers/editor/common/lineRange.js +312 -0
- package/dist/workers/editor/common/lineSequence.js +36 -0
- package/dist/workers/editor/common/lineTokens.js +405 -0
- package/dist/workers/editor/common/linesDiffComputer.js +29 -0
- package/dist/workers/editor/common/linesDiffComputers.js +13 -0
- package/dist/workers/editor/common/linesLayout.js +765 -0
- package/dist/workers/editor/common/linesSliceCharSequence.js +205 -0
- package/dist/workers/editor/common/linkComputer.js +269 -0
- package/dist/workers/editor/common/markerDecorations.js +9 -0
- package/dist/workers/editor/common/markerDecorationsService.js +248 -0
- package/dist/workers/editor/common/minimapTokensColorTracker.js +58 -0
- package/dist/workers/editor/common/mirrorTextModel.js +117 -0
- package/dist/workers/editor/common/model.js +9 -0
- package/dist/workers/editor/common/modelLineProjection.js +350 -0
- package/dist/workers/editor/common/modelLineProjectionData.js +297 -0
- package/dist/workers/editor/common/modelService.js +413 -0
- package/dist/workers/editor/common/modesRegistry.js +75 -0
- package/dist/workers/editor/common/monospaceLineBreaksComputer.js +473 -0
- package/dist/workers/editor/common/myersDiffAlgorithm.js +159 -0
- package/dist/workers/editor/common/nodeReader.js +127 -0
- package/dist/workers/editor/common/nullTokenize.js +29 -0
- package/dist/workers/editor/common/offsetRange.js +225 -0
- package/dist/workers/editor/common/onEnter.js +109 -0
- package/dist/workers/editor/common/oneCursor.js +117 -0
- package/dist/workers/editor/common/overviewZoneManager.js +176 -0
- package/dist/workers/editor/common/parser.js +121 -0
- package/dist/workers/editor/common/pieceTreeBase.js +1473 -0
- package/dist/workers/editor/common/pieceTreeTextBuffer.js +461 -0
- package/dist/workers/editor/common/pieceTreeTextBufferBuilder.js +140 -0
- package/dist/workers/editor/common/point.js +50 -0
- package/dist/workers/editor/common/position.js +142 -0
- package/dist/workers/editor/common/positionToOffset.js +17 -0
- package/dist/workers/editor/common/positionToOffsetImpl.js +98 -0
- package/dist/workers/editor/common/prefixSumComputer.js +226 -0
- package/dist/workers/editor/common/range.js +421 -0
- package/dist/workers/editor/common/rangeMapping.js +229 -0
- package/dist/workers/editor/common/rangeSingleLine.js +17 -0
- package/dist/workers/editor/common/rbTreeBase.js +362 -0
- package/dist/workers/editor/common/rect.js +163 -0
- package/dist/workers/editor/common/replaceCommand.js +158 -0
- package/dist/workers/editor/common/resolverService.js +5 -0
- package/dist/workers/editor/common/rgba.js +35 -0
- package/dist/workers/editor/common/richEditBrackets.js +356 -0
- package/dist/workers/editor/common/selection.js +145 -0
- package/dist/workers/editor/common/semanticTokensDto.js +82 -0
- package/dist/workers/editor/common/semanticTokensProviderStyling.js +263 -0
- package/dist/workers/editor/common/semanticTokensStyling.js +9 -0
- package/dist/workers/editor/common/semanticTokensStylingService.js +47 -0
- package/dist/workers/editor/common/shiftCommand.js +241 -0
- package/dist/workers/editor/common/smallImmutableSet.js +108 -0
- package/dist/workers/editor/common/sparseMultilineTokens.js +548 -0
- package/dist/workers/editor/common/sparseTokensStore.js +210 -0
- package/dist/workers/editor/common/standaloneEnums.js +1017 -0
- package/dist/workers/editor/common/standaloneStrings.js +42 -0
- package/dist/workers/editor/common/stringBuilder.js +122 -0
- package/dist/workers/editor/common/stringEdit.js +165 -0
- package/dist/workers/editor/common/supports.js +58 -0
- package/dist/workers/editor/common/surroundSelectionCommand.js +44 -0
- package/dist/workers/editor/common/textChange.js +248 -0
- package/dist/workers/editor/common/textEdit.js +269 -0
- package/dist/workers/editor/common/textLength.js +87 -0
- package/dist/workers/editor/common/textModel.js +2031 -0
- package/dist/workers/editor/common/textModelBracketPairs.js +45 -0
- package/dist/workers/editor/common/textModelDefaults.js +18 -0
- package/dist/workers/editor/common/textModelEditSource.js +166 -0
- package/dist/workers/editor/common/textModelEvents.js +216 -0
- package/dist/workers/editor/common/textModelGuides.js +40 -0
- package/dist/workers/editor/common/textModelPart.js +23 -0
- package/dist/workers/editor/common/textModelSearch.js +455 -0
- package/dist/workers/editor/common/textModelStringEdit.js +11 -0
- package/dist/workers/editor/common/textModelSync.impl.js +307 -0
- package/dist/workers/editor/common/textModelText.js +26 -0
- package/dist/workers/editor/common/textModelTokens.js +436 -0
- package/dist/workers/editor/common/textResourceConfiguration.js +6 -0
- package/dist/workers/editor/common/textToHtmlTokenizer.js +139 -0
- package/dist/workers/editor/common/tokenStore.js +407 -0
- package/dist/workers/editor/common/tokenWithTextArray.js +73 -0
- package/dist/workers/editor/common/tokenization.js +287 -0
- package/dist/workers/editor/common/tokenizationRegistry.js +123 -0
- package/dist/workers/editor/common/tokenizationTextModelPart.js +275 -0
- package/dist/workers/editor/common/tokenizer.js +301 -0
- package/dist/workers/editor/common/tokenizerSyntaxTokenBackend.js +261 -0
- package/dist/workers/editor/common/treeSitterLibraryService.js +9 -0
- package/dist/workers/editor/common/treeSitterSyntaxTokenBackend.js +167 -0
- package/dist/workers/editor/common/treeSitterThemeService.js +9 -0
- package/dist/workers/editor/common/treeSitterTokenizationImpl.js +713 -0
- package/dist/workers/editor/common/treeSitterTree.js +395 -0
- package/dist/workers/editor/common/treeViewsDnd.js +24 -0
- package/dist/workers/editor/common/treeViewsDndService.js +12 -0
- package/dist/workers/editor/common/trimTrailingWhitespaceCommand.js +98 -0
- package/dist/workers/editor/common/unicodeTextModelHighlighter.js +188 -0
- package/dist/workers/editor/common/utils.js +62 -0
- package/dist/workers/editor/common/viewContext.js +22 -0
- package/dist/workers/editor/common/viewEventHandler.js +186 -0
- package/dist/workers/editor/common/viewEvents.js +180 -0
- package/dist/workers/editor/common/viewLayout.js +368 -0
- package/dist/workers/editor/common/viewLineRenderer.js +948 -0
- package/dist/workers/editor/common/viewLinesViewportData.js +30 -0
- package/dist/workers/editor/common/viewModel.js +98 -0
- package/dist/workers/editor/common/viewModelDecoration.js +55 -0
- package/dist/workers/editor/common/viewModelDecorations.js +132 -0
- package/dist/workers/editor/common/viewModelEventDispatcher.js +398 -0
- package/dist/workers/editor/common/viewModelImpl.js +1163 -0
- package/dist/workers/editor/common/viewModelLines.js +938 -0
- package/dist/workers/editor/common/wordCharacterClassifier.js +87 -0
- package/dist/workers/editor/common/wordHelper.js +127 -0
- package/dist/workers/editor/editor.worker.js +11 -0
- package/dist/workers/language/css.worker.js +8 -0
- package/dist/workers/language/cssMode.js +198 -0
- package/dist/workers/language/cssWorker.js +183 -0
- package/dist/workers/language/html.worker.js +8 -0
- package/dist/workers/language/htmlMode.js +213 -0
- package/dist/workers/language/htmlWorker.js +126 -0
- package/dist/workers/language/json.worker.js +8 -0
- package/dist/workers/language/jsonMode.js +224 -0
- package/dist/workers/language/jsonWorker.js +187 -0
- package/dist/workers/language/languageFeatures.js +1009 -0
- package/dist/workers/language/lib.index.js +103 -0
- package/dist/workers/language/lib.js +1107 -0
- package/dist/workers/language/lspLanguageFeatures.js +716 -0
- package/dist/workers/language/monaco.contribution.js +144 -0
- package/dist/workers/language/tokenization.js +189 -0
- package/dist/workers/language/ts.worker.js +14 -0
- package/dist/workers/language/tsMode.js +212 -0
- package/dist/workers/language/tsWorker.js +352 -0
- package/dist/workers/language/typescriptServices.js +210154 -0
- package/dist/workers/language/typescriptServicesMetadata.js +3 -0
- package/dist/workers/language/workerManager.js +65 -0
- package/package.json +3 -2
|
@@ -0,0 +1,1163 @@
|
|
|
1
|
+
import { ArrayQueue } from '../../../base/common/arrays.js';
|
|
2
|
+
import { RunOnceScheduler } from '../../../base/common/async.js';
|
|
3
|
+
import { Color } from '../../../base/common/color.js';
|
|
4
|
+
import { Disposable } from '../../../base/common/lifecycle.js';
|
|
5
|
+
import { isWindows } from '../../../base/common/platform.js';
|
|
6
|
+
import { firstNonWhitespaceIndex, lastNonWhitespaceIndex } from '../../../base/common/strings.js';
|
|
7
|
+
import { filterValidationDecorations, filterFontDecorations } from '../config/editorOptions.js';
|
|
8
|
+
import { EDITOR_FONT_DEFAULTS } from '../config/fontInfo.js';
|
|
9
|
+
import { CursorsController } from '../cursor/cursor.js';
|
|
10
|
+
import { CursorConfiguration } from '../cursorCommon.js';
|
|
11
|
+
import { Position } from '../core/position.js';
|
|
12
|
+
import { Range } from '../core/range.js';
|
|
13
|
+
import { TextDirection } from '../model.js';
|
|
14
|
+
import { InternalModelContentChangeEvent, ModelLineHeightChangedEvent as ModelLineHeightChangedEvent$1, ModelFontChangedEvent as ModelFontChangedEvent$1 } from '../textModelEvents.js';
|
|
15
|
+
import { TokenizationRegistry } from '../languages.js';
|
|
16
|
+
import { PLAINTEXT_LANGUAGE_ID } from '../languages/modesRegistry.js';
|
|
17
|
+
import { tokenizeLineToHTML } from '../languages/textToHtmlTokenizer.js';
|
|
18
|
+
import { ViewScrollChangedEvent, ViewTokensColorsChangedEvent, ViewThemeChangedEvent, ViewFocusChangedEvent, ViewCompositionStartEvent, ViewCompositionEndEvent, ViewFlushedEvent, ViewLineMappingChangedEvent, ViewDecorationsChangedEvent, ViewConfigurationChangedEvent, ViewTokensChangedEvent, ViewLanguageConfigurationEvent, ViewRevealRangeRequestEvent, ViewZonesChangedEvent } from '../viewEvents.js';
|
|
19
|
+
import { ViewLayout } from '../viewLayout/viewLayout.js';
|
|
20
|
+
import { MinimapTokensColorTracker } from './minimapTokensColorTracker.js';
|
|
21
|
+
import { ViewLineRenderingData, MinimapLinesRenderingData, OverviewRulerDecorationsGroup } from '../viewModel.js';
|
|
22
|
+
import { ViewModelDecorations } from './viewModelDecorations.js';
|
|
23
|
+
import { ViewModelEventDispatcher, ScrollChangedEvent, FocusChangedEvent, WidgetFocusChangedEvent, ModelContentChangedEvent, ModelLineHeightChangedEvent, ModelFontChangedEvent, ModelTokensChangedEvent, ModelLanguageConfigurationChangedEvent, ModelLanguageChangedEvent, ModelOptionsChangedEvent, ModelDecorationsChangedEvent, HiddenAreasChangedEvent, ReadOnlyEditAttemptEvent, ViewZonesChangedEvent as ViewZonesChangedEvent$1 } from '../viewModelEventDispatcher.js';
|
|
24
|
+
import { ViewModelLinesFromModelAsIs, ViewModelLinesFromProjectedModel } from './viewModelLines.js';
|
|
25
|
+
import { GlyphMarginLanesModel } from './glyphLanesModel.js';
|
|
26
|
+
|
|
27
|
+
/*---------------------------------------------------------------------------------------------
|
|
28
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
29
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
30
|
+
*--------------------------------------------------------------------------------------------*/
|
|
31
|
+
class ViewModel extends Disposable {
|
|
32
|
+
constructor(editorId, configuration, model, domLineBreaksComputerFactory, monospaceLineBreaksComputerFactory, scheduleAtNextAnimationFrame, languageConfigurationService, _themeService, _attachedView, _transactionalTarget) {
|
|
33
|
+
super();
|
|
34
|
+
this.languageConfigurationService = languageConfigurationService;
|
|
35
|
+
this._themeService = _themeService;
|
|
36
|
+
this._attachedView = _attachedView;
|
|
37
|
+
this._transactionalTarget = _transactionalTarget;
|
|
38
|
+
this.hiddenAreasModel = new HiddenAreasModel();
|
|
39
|
+
this.previousHiddenAreas = [];
|
|
40
|
+
this._editorId = editorId;
|
|
41
|
+
this._configuration = configuration;
|
|
42
|
+
this.model = model;
|
|
43
|
+
this._eventDispatcher = new ViewModelEventDispatcher();
|
|
44
|
+
this.onEvent = this._eventDispatcher.onEvent;
|
|
45
|
+
this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);
|
|
46
|
+
this._updateConfigurationViewLineCount = this._register(new RunOnceScheduler(() => this._updateConfigurationViewLineCountNow(), 0));
|
|
47
|
+
this._hasFocus = false;
|
|
48
|
+
this._viewportStart = ViewportStart.create(this.model);
|
|
49
|
+
this.glyphLanes = new GlyphMarginLanesModel(0);
|
|
50
|
+
if (this.model.isTooLargeForTokenization()) {
|
|
51
|
+
this._lines = new ViewModelLinesFromModelAsIs(this.model);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const options = this._configuration.options;
|
|
55
|
+
const fontInfo = options.get(59 /* EditorOption.fontInfo */);
|
|
56
|
+
const wrappingStrategy = options.get(156 /* EditorOption.wrappingStrategy */);
|
|
57
|
+
const wrappingInfo = options.get(166 /* EditorOption.wrappingInfo */);
|
|
58
|
+
const wrappingIndent = options.get(155 /* EditorOption.wrappingIndent */);
|
|
59
|
+
const wordBreak = options.get(146 /* EditorOption.wordBreak */);
|
|
60
|
+
const wrapOnEscapedLineFeeds = options.get(160 /* EditorOption.wrapOnEscapedLineFeeds */);
|
|
61
|
+
this._lines = new ViewModelLinesFromProjectedModel(this._editorId, this.model, domLineBreaksComputerFactory, monospaceLineBreaksComputerFactory, fontInfo, this.model.getOptions().tabSize, wrappingStrategy, wrappingInfo.wrappingColumn, wrappingIndent, wordBreak, wrapOnEscapedLineFeeds);
|
|
62
|
+
}
|
|
63
|
+
this.coordinatesConverter = this._lines.createCoordinatesConverter();
|
|
64
|
+
this._cursor = this._register(new CursorsController(model, this, this.coordinatesConverter, this.cursorConfig));
|
|
65
|
+
this.viewLayout = this._register(new ViewLayout(this._configuration, this.getLineCount(), this._getCustomLineHeights(), scheduleAtNextAnimationFrame));
|
|
66
|
+
this._register(this.viewLayout.onDidScroll((e) => {
|
|
67
|
+
if (e.scrollTopChanged) {
|
|
68
|
+
this._handleVisibleLinesChanged();
|
|
69
|
+
}
|
|
70
|
+
if (e.scrollTopChanged) {
|
|
71
|
+
this._viewportStart.invalidate();
|
|
72
|
+
}
|
|
73
|
+
this._eventDispatcher.emitSingleViewEvent(new ViewScrollChangedEvent(e));
|
|
74
|
+
this._eventDispatcher.emitOutgoingEvent(new ScrollChangedEvent(e.oldScrollWidth, e.oldScrollLeft, e.oldScrollHeight, e.oldScrollTop, e.scrollWidth, e.scrollLeft, e.scrollHeight, e.scrollTop));
|
|
75
|
+
}));
|
|
76
|
+
this._register(this.viewLayout.onDidContentSizeChange((e) => {
|
|
77
|
+
this._eventDispatcher.emitOutgoingEvent(e);
|
|
78
|
+
}));
|
|
79
|
+
this._decorations = new ViewModelDecorations(this._editorId, this.model, this._configuration, this._lines, this.coordinatesConverter);
|
|
80
|
+
this._registerModelEvents();
|
|
81
|
+
this._register(this._configuration.onDidChangeFast((e) => {
|
|
82
|
+
try {
|
|
83
|
+
const eventsCollector = this._eventDispatcher.beginEmitViewEvents();
|
|
84
|
+
this._onConfigurationChanged(eventsCollector, e);
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
this._eventDispatcher.endEmitViewEvents();
|
|
88
|
+
}
|
|
89
|
+
}));
|
|
90
|
+
this._register(MinimapTokensColorTracker.getInstance().onDidChange(() => {
|
|
91
|
+
this._eventDispatcher.emitSingleViewEvent(new ViewTokensColorsChangedEvent());
|
|
92
|
+
}));
|
|
93
|
+
this._register(this._themeService.onDidColorThemeChange((theme) => {
|
|
94
|
+
this._invalidateDecorationsColorCache();
|
|
95
|
+
this._eventDispatcher.emitSingleViewEvent(new ViewThemeChangedEvent(theme));
|
|
96
|
+
}));
|
|
97
|
+
this._updateConfigurationViewLineCountNow();
|
|
98
|
+
}
|
|
99
|
+
dispose() {
|
|
100
|
+
// First remove listeners, as disposing the lines might end up sending
|
|
101
|
+
// model decoration changed events ... and we no longer care about them ...
|
|
102
|
+
super.dispose();
|
|
103
|
+
this._decorations.dispose();
|
|
104
|
+
this._lines.dispose();
|
|
105
|
+
this._viewportStart.dispose();
|
|
106
|
+
this._eventDispatcher.dispose();
|
|
107
|
+
}
|
|
108
|
+
createLineBreaksComputer() {
|
|
109
|
+
return this._lines.createLineBreaksComputer();
|
|
110
|
+
}
|
|
111
|
+
addViewEventHandler(eventHandler) {
|
|
112
|
+
this._eventDispatcher.addViewEventHandler(eventHandler);
|
|
113
|
+
}
|
|
114
|
+
removeViewEventHandler(eventHandler) {
|
|
115
|
+
this._eventDispatcher.removeViewEventHandler(eventHandler);
|
|
116
|
+
}
|
|
117
|
+
_getCustomLineHeights() {
|
|
118
|
+
const allowVariableLineHeights = this._configuration.options.get(5 /* EditorOption.allowVariableLineHeights */);
|
|
119
|
+
if (!allowVariableLineHeights) {
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
const decorations = this.model.getCustomLineHeightsDecorations(this._editorId);
|
|
123
|
+
return decorations.map((d) => {
|
|
124
|
+
const lineNumber = d.range.startLineNumber;
|
|
125
|
+
const viewRange = this.coordinatesConverter.convertModelRangeToViewRange(new Range(lineNumber, 1, lineNumber, this.model.getLineMaxColumn(lineNumber)));
|
|
126
|
+
return {
|
|
127
|
+
decorationId: d.id,
|
|
128
|
+
startLineNumber: viewRange.startLineNumber,
|
|
129
|
+
endLineNumber: viewRange.endLineNumber,
|
|
130
|
+
lineHeight: d.options.lineHeight || 0
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
_updateConfigurationViewLineCountNow() {
|
|
135
|
+
this._configuration.setViewLineCount(this._lines.getViewLineCount());
|
|
136
|
+
}
|
|
137
|
+
getModelVisibleRanges() {
|
|
138
|
+
const linesViewportData = this.viewLayout.getLinesViewportData();
|
|
139
|
+
const viewVisibleRange = new Range(linesViewportData.startLineNumber, this.getLineMinColumn(linesViewportData.startLineNumber), linesViewportData.endLineNumber, this.getLineMaxColumn(linesViewportData.endLineNumber));
|
|
140
|
+
const modelVisibleRanges = this._toModelVisibleRanges(viewVisibleRange);
|
|
141
|
+
return modelVisibleRanges;
|
|
142
|
+
}
|
|
143
|
+
visibleLinesStabilized() {
|
|
144
|
+
const modelVisibleRanges = this.getModelVisibleRanges();
|
|
145
|
+
this._attachedView.setVisibleLines(modelVisibleRanges, true);
|
|
146
|
+
}
|
|
147
|
+
_handleVisibleLinesChanged() {
|
|
148
|
+
const modelVisibleRanges = this.getModelVisibleRanges();
|
|
149
|
+
this._attachedView.setVisibleLines(modelVisibleRanges, false);
|
|
150
|
+
}
|
|
151
|
+
setHasFocus(hasFocus) {
|
|
152
|
+
this._hasFocus = hasFocus;
|
|
153
|
+
this._cursor.setHasFocus(hasFocus);
|
|
154
|
+
this._eventDispatcher.emitSingleViewEvent(new ViewFocusChangedEvent(hasFocus));
|
|
155
|
+
this._eventDispatcher.emitOutgoingEvent(new FocusChangedEvent(!hasFocus, hasFocus));
|
|
156
|
+
}
|
|
157
|
+
setHasWidgetFocus(hasWidgetFocus) {
|
|
158
|
+
this._eventDispatcher.emitOutgoingEvent(new WidgetFocusChangedEvent(!hasWidgetFocus, hasWidgetFocus));
|
|
159
|
+
}
|
|
160
|
+
onCompositionStart() {
|
|
161
|
+
this._eventDispatcher.emitSingleViewEvent(new ViewCompositionStartEvent());
|
|
162
|
+
}
|
|
163
|
+
onCompositionEnd() {
|
|
164
|
+
this._eventDispatcher.emitSingleViewEvent(new ViewCompositionEndEvent());
|
|
165
|
+
}
|
|
166
|
+
_captureStableViewport() {
|
|
167
|
+
// We might need to restore the current start view range, so save it (if available)
|
|
168
|
+
// But only if the scroll position is not at the top of the file
|
|
169
|
+
if (this._viewportStart.isValid && this.viewLayout.getCurrentScrollTop() > 0) {
|
|
170
|
+
const previousViewportStartViewPosition = new Position(this._viewportStart.viewLineNumber, this.getLineMinColumn(this._viewportStart.viewLineNumber));
|
|
171
|
+
const previousViewportStartModelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(previousViewportStartViewPosition);
|
|
172
|
+
return new StableViewport(previousViewportStartModelPosition, this._viewportStart.startLineDelta);
|
|
173
|
+
}
|
|
174
|
+
return new StableViewport(null, 0);
|
|
175
|
+
}
|
|
176
|
+
_onConfigurationChanged(eventsCollector, e) {
|
|
177
|
+
const stableViewport = this._captureStableViewport();
|
|
178
|
+
const options = this._configuration.options;
|
|
179
|
+
const fontInfo = options.get(59 /* EditorOption.fontInfo */);
|
|
180
|
+
const wrappingStrategy = options.get(156 /* EditorOption.wrappingStrategy */);
|
|
181
|
+
const wrappingInfo = options.get(166 /* EditorOption.wrappingInfo */);
|
|
182
|
+
const wrappingIndent = options.get(155 /* EditorOption.wrappingIndent */);
|
|
183
|
+
const wordBreak = options.get(146 /* EditorOption.wordBreak */);
|
|
184
|
+
if (this._lines.setWrappingSettings(fontInfo, wrappingStrategy, wrappingInfo.wrappingColumn, wrappingIndent, wordBreak)) {
|
|
185
|
+
eventsCollector.emitViewEvent(new ViewFlushedEvent());
|
|
186
|
+
eventsCollector.emitViewEvent(new ViewLineMappingChangedEvent());
|
|
187
|
+
eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null));
|
|
188
|
+
this._cursor.onLineMappingChanged(eventsCollector);
|
|
189
|
+
this._decorations.onLineMappingChanged();
|
|
190
|
+
this.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());
|
|
191
|
+
this._updateConfigurationViewLineCount.schedule();
|
|
192
|
+
}
|
|
193
|
+
if (e.hasChanged(104 /* EditorOption.readOnly */)) {
|
|
194
|
+
// Must read again all decorations due to readOnly filtering
|
|
195
|
+
this._decorations.reset();
|
|
196
|
+
eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null));
|
|
197
|
+
}
|
|
198
|
+
if (e.hasChanged(112 /* EditorOption.renderValidationDecorations */)) {
|
|
199
|
+
this._decorations.reset();
|
|
200
|
+
eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null));
|
|
201
|
+
}
|
|
202
|
+
eventsCollector.emitViewEvent(new ViewConfigurationChangedEvent(e));
|
|
203
|
+
this.viewLayout.onConfigurationChanged(e);
|
|
204
|
+
stableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout);
|
|
205
|
+
if (CursorConfiguration.shouldRecreate(e)) {
|
|
206
|
+
this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);
|
|
207
|
+
this._cursor.updateConfiguration(this.cursorConfig);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
_registerModelEvents() {
|
|
211
|
+
this._register(this.model.onDidChangeContentOrInjectedText((e) => {
|
|
212
|
+
try {
|
|
213
|
+
const eventsCollector = this._eventDispatcher.beginEmitViewEvents();
|
|
214
|
+
let hadOtherModelChange = false;
|
|
215
|
+
let hadModelLineChangeThatChangedLineMapping = false;
|
|
216
|
+
const changes = (e instanceof InternalModelContentChangeEvent ? e.rawContentChangedEvent.changes : e.changes);
|
|
217
|
+
const versionId = (e instanceof InternalModelContentChangeEvent ? e.rawContentChangedEvent.versionId : null);
|
|
218
|
+
// Do a first pass to compute line mappings, and a second pass to actually interpret them
|
|
219
|
+
const lineBreaksComputer = this._lines.createLineBreaksComputer();
|
|
220
|
+
for (const change of changes) {
|
|
221
|
+
switch (change.changeType) {
|
|
222
|
+
case 4 /* textModelEvents.RawContentChangedType.LinesInserted */: {
|
|
223
|
+
for (let lineIdx = 0; lineIdx < change.detail.length; lineIdx++) {
|
|
224
|
+
const line = change.detail[lineIdx];
|
|
225
|
+
let injectedText = change.injectedTexts[lineIdx];
|
|
226
|
+
if (injectedText) {
|
|
227
|
+
injectedText = injectedText.filter(element => (!element.ownerId || element.ownerId === this._editorId));
|
|
228
|
+
}
|
|
229
|
+
lineBreaksComputer.addRequest(line, injectedText, null);
|
|
230
|
+
}
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
case 2 /* textModelEvents.RawContentChangedType.LineChanged */: {
|
|
234
|
+
let injectedText = null;
|
|
235
|
+
if (change.injectedText) {
|
|
236
|
+
injectedText = change.injectedText.filter(element => (!element.ownerId || element.ownerId === this._editorId));
|
|
237
|
+
}
|
|
238
|
+
lineBreaksComputer.addRequest(change.detail, injectedText, null);
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const lineBreaks = lineBreaksComputer.finalize();
|
|
244
|
+
const lineBreakQueue = new ArrayQueue(lineBreaks);
|
|
245
|
+
for (const change of changes) {
|
|
246
|
+
switch (change.changeType) {
|
|
247
|
+
case 1 /* textModelEvents.RawContentChangedType.Flush */: {
|
|
248
|
+
this._lines.onModelFlushed();
|
|
249
|
+
eventsCollector.emitViewEvent(new ViewFlushedEvent());
|
|
250
|
+
this._decorations.reset();
|
|
251
|
+
this.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());
|
|
252
|
+
hadOtherModelChange = true;
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
case 3 /* textModelEvents.RawContentChangedType.LinesDeleted */: {
|
|
256
|
+
const linesDeletedEvent = this._lines.onModelLinesDeleted(versionId, change.fromLineNumber, change.toLineNumber);
|
|
257
|
+
if (linesDeletedEvent !== null) {
|
|
258
|
+
eventsCollector.emitViewEvent(linesDeletedEvent);
|
|
259
|
+
this.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber);
|
|
260
|
+
}
|
|
261
|
+
hadOtherModelChange = true;
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
case 4 /* textModelEvents.RawContentChangedType.LinesInserted */: {
|
|
265
|
+
const insertedLineBreaks = lineBreakQueue.takeCount(change.detail.length);
|
|
266
|
+
const linesInsertedEvent = this._lines.onModelLinesInserted(versionId, change.fromLineNumber, change.toLineNumber, insertedLineBreaks);
|
|
267
|
+
if (linesInsertedEvent !== null) {
|
|
268
|
+
eventsCollector.emitViewEvent(linesInsertedEvent);
|
|
269
|
+
this.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber);
|
|
270
|
+
}
|
|
271
|
+
hadOtherModelChange = true;
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
case 2 /* textModelEvents.RawContentChangedType.LineChanged */: {
|
|
275
|
+
const changedLineBreakData = lineBreakQueue.dequeue();
|
|
276
|
+
const [lineMappingChanged, linesChangedEvent, linesInsertedEvent, linesDeletedEvent] = this._lines.onModelLineChanged(versionId, change.lineNumber, changedLineBreakData);
|
|
277
|
+
hadModelLineChangeThatChangedLineMapping = lineMappingChanged;
|
|
278
|
+
if (linesChangedEvent) {
|
|
279
|
+
eventsCollector.emitViewEvent(linesChangedEvent);
|
|
280
|
+
}
|
|
281
|
+
if (linesInsertedEvent) {
|
|
282
|
+
eventsCollector.emitViewEvent(linesInsertedEvent);
|
|
283
|
+
this.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber);
|
|
284
|
+
}
|
|
285
|
+
if (linesDeletedEvent) {
|
|
286
|
+
eventsCollector.emitViewEvent(linesDeletedEvent);
|
|
287
|
+
this.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber);
|
|
288
|
+
}
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
291
|
+
case 5 /* textModelEvents.RawContentChangedType.EOLChanged */: {
|
|
292
|
+
// Nothing to do. The new version will be accepted below
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (versionId !== null) {
|
|
298
|
+
this._lines.acceptVersionId(versionId);
|
|
299
|
+
}
|
|
300
|
+
this.viewLayout.onHeightMaybeChanged();
|
|
301
|
+
if (!hadOtherModelChange && hadModelLineChangeThatChangedLineMapping) {
|
|
302
|
+
eventsCollector.emitViewEvent(new ViewLineMappingChangedEvent());
|
|
303
|
+
eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null));
|
|
304
|
+
this._cursor.onLineMappingChanged(eventsCollector);
|
|
305
|
+
this._decorations.onLineMappingChanged();
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
finally {
|
|
309
|
+
this._eventDispatcher.endEmitViewEvents();
|
|
310
|
+
}
|
|
311
|
+
// Update the configuration and reset the centered view line
|
|
312
|
+
const viewportStartWasValid = this._viewportStart.isValid;
|
|
313
|
+
this._viewportStart.invalidate();
|
|
314
|
+
this._configuration.setModelLineCount(this.model.getLineCount());
|
|
315
|
+
this._updateConfigurationViewLineCountNow();
|
|
316
|
+
// Recover viewport
|
|
317
|
+
if (!this._hasFocus && this.model.getAttachedEditorCount() >= 2 && viewportStartWasValid) {
|
|
318
|
+
const modelRange = this.model._getTrackedRange(this._viewportStart.modelTrackedRange);
|
|
319
|
+
if (modelRange) {
|
|
320
|
+
const viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(modelRange.getStartPosition());
|
|
321
|
+
const viewPositionTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber);
|
|
322
|
+
this.viewLayout.setScrollPosition({ scrollTop: viewPositionTop + this._viewportStart.startLineDelta }, 1 /* ScrollType.Immediate */);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
try {
|
|
326
|
+
const eventsCollector = this._eventDispatcher.beginEmitViewEvents();
|
|
327
|
+
if (e instanceof InternalModelContentChangeEvent) {
|
|
328
|
+
eventsCollector.emitOutgoingEvent(new ModelContentChangedEvent(e.contentChangedEvent));
|
|
329
|
+
}
|
|
330
|
+
this._cursor.onModelContentChanged(eventsCollector, e);
|
|
331
|
+
}
|
|
332
|
+
finally {
|
|
333
|
+
this._eventDispatcher.endEmitViewEvents();
|
|
334
|
+
}
|
|
335
|
+
this._handleVisibleLinesChanged();
|
|
336
|
+
}));
|
|
337
|
+
const allowVariableLineHeights = this._configuration.options.get(5 /* EditorOption.allowVariableLineHeights */);
|
|
338
|
+
if (allowVariableLineHeights) {
|
|
339
|
+
this._register(this.model.onDidChangeLineHeight((e) => {
|
|
340
|
+
const filteredChanges = e.changes.filter((change) => change.ownerId === this._editorId || change.ownerId === 0);
|
|
341
|
+
this.viewLayout.changeSpecialLineHeights((accessor) => {
|
|
342
|
+
for (const change of filteredChanges) {
|
|
343
|
+
const { decorationId, lineNumber, lineHeight } = change;
|
|
344
|
+
const viewRange = this.coordinatesConverter.convertModelRangeToViewRange(new Range(lineNumber, 1, lineNumber, this.model.getLineMaxColumn(lineNumber)));
|
|
345
|
+
if (lineHeight !== null) {
|
|
346
|
+
accessor.insertOrChangeCustomLineHeight(decorationId, viewRange.startLineNumber, viewRange.endLineNumber, lineHeight);
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
accessor.removeCustomLineHeight(decorationId);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
// recreate the model event using the filtered changes
|
|
354
|
+
if (filteredChanges.length > 0) {
|
|
355
|
+
const filteredEvent = new ModelLineHeightChangedEvent$1(filteredChanges);
|
|
356
|
+
this._eventDispatcher.emitOutgoingEvent(new ModelLineHeightChangedEvent(filteredEvent));
|
|
357
|
+
}
|
|
358
|
+
}));
|
|
359
|
+
}
|
|
360
|
+
const allowVariableFonts = this._configuration.options.get(172 /* EditorOption.effectiveAllowVariableFonts */);
|
|
361
|
+
if (allowVariableFonts) {
|
|
362
|
+
this._register(this.model.onDidChangeFont((e) => {
|
|
363
|
+
const filteredChanges = e.changes.filter((change) => change.ownerId === this._editorId || change.ownerId === 0);
|
|
364
|
+
// recreate the model event using the filtered changes
|
|
365
|
+
if (filteredChanges.length > 0) {
|
|
366
|
+
const filteredEvent = new ModelFontChangedEvent$1(filteredChanges);
|
|
367
|
+
this._eventDispatcher.emitOutgoingEvent(new ModelFontChangedEvent(filteredEvent));
|
|
368
|
+
}
|
|
369
|
+
}));
|
|
370
|
+
}
|
|
371
|
+
this._register(this.model.onDidChangeTokens((e) => {
|
|
372
|
+
const viewRanges = [];
|
|
373
|
+
for (let j = 0, lenJ = e.ranges.length; j < lenJ; j++) {
|
|
374
|
+
const modelRange = e.ranges[j];
|
|
375
|
+
const viewStartLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.fromLineNumber, 1)).lineNumber;
|
|
376
|
+
const viewEndLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.toLineNumber, this.model.getLineMaxColumn(modelRange.toLineNumber))).lineNumber;
|
|
377
|
+
viewRanges[j] = {
|
|
378
|
+
fromLineNumber: viewStartLineNumber,
|
|
379
|
+
toLineNumber: viewEndLineNumber
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
this._eventDispatcher.emitSingleViewEvent(new ViewTokensChangedEvent(viewRanges));
|
|
383
|
+
this._eventDispatcher.emitOutgoingEvent(new ModelTokensChangedEvent(e));
|
|
384
|
+
}));
|
|
385
|
+
this._register(this.model.onDidChangeLanguageConfiguration((e) => {
|
|
386
|
+
this._eventDispatcher.emitSingleViewEvent(new ViewLanguageConfigurationEvent());
|
|
387
|
+
this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);
|
|
388
|
+
this._cursor.updateConfiguration(this.cursorConfig);
|
|
389
|
+
this._eventDispatcher.emitOutgoingEvent(new ModelLanguageConfigurationChangedEvent(e));
|
|
390
|
+
}));
|
|
391
|
+
this._register(this.model.onDidChangeLanguage((e) => {
|
|
392
|
+
this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);
|
|
393
|
+
this._cursor.updateConfiguration(this.cursorConfig);
|
|
394
|
+
this._eventDispatcher.emitOutgoingEvent(new ModelLanguageChangedEvent(e));
|
|
395
|
+
}));
|
|
396
|
+
this._register(this.model.onDidChangeOptions((e) => {
|
|
397
|
+
// A tab size change causes a line mapping changed event => all view parts will repaint OK, no further event needed here
|
|
398
|
+
if (this._lines.setTabSize(this.model.getOptions().tabSize)) {
|
|
399
|
+
try {
|
|
400
|
+
const eventsCollector = this._eventDispatcher.beginEmitViewEvents();
|
|
401
|
+
eventsCollector.emitViewEvent(new ViewFlushedEvent());
|
|
402
|
+
eventsCollector.emitViewEvent(new ViewLineMappingChangedEvent());
|
|
403
|
+
eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null));
|
|
404
|
+
this._cursor.onLineMappingChanged(eventsCollector);
|
|
405
|
+
this._decorations.onLineMappingChanged();
|
|
406
|
+
this.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());
|
|
407
|
+
}
|
|
408
|
+
finally {
|
|
409
|
+
this._eventDispatcher.endEmitViewEvents();
|
|
410
|
+
}
|
|
411
|
+
this._updateConfigurationViewLineCount.schedule();
|
|
412
|
+
}
|
|
413
|
+
this.cursorConfig = new CursorConfiguration(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService);
|
|
414
|
+
this._cursor.updateConfiguration(this.cursorConfig);
|
|
415
|
+
this._eventDispatcher.emitOutgoingEvent(new ModelOptionsChangedEvent(e));
|
|
416
|
+
}));
|
|
417
|
+
this._register(this.model.onDidChangeDecorations((e) => {
|
|
418
|
+
this._decorations.onModelDecorationsChanged();
|
|
419
|
+
this._eventDispatcher.emitSingleViewEvent(new ViewDecorationsChangedEvent(e));
|
|
420
|
+
this._eventDispatcher.emitOutgoingEvent(new ModelDecorationsChangedEvent(e));
|
|
421
|
+
}));
|
|
422
|
+
}
|
|
423
|
+
getFontSizeAtPosition(position) {
|
|
424
|
+
const allowVariableFonts = this._configuration.options.get(172 /* EditorOption.effectiveAllowVariableFonts */);
|
|
425
|
+
if (!allowVariableFonts) {
|
|
426
|
+
return null;
|
|
427
|
+
}
|
|
428
|
+
const fontDecorations = this.model.getFontDecorationsInRange(Range.fromPositions(position), this._editorId);
|
|
429
|
+
let fontSize = this._configuration.options.get(59 /* EditorOption.fontInfo */).fontSize + 'px';
|
|
430
|
+
for (const fontDecoration of fontDecorations) {
|
|
431
|
+
if (fontDecoration.options.fontSize) {
|
|
432
|
+
fontSize = fontDecoration.options.fontSize;
|
|
433
|
+
break;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
return fontSize;
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* @param forceUpdate If true, the hidden areas will be updated even if the new ranges are the same as the previous ranges.
|
|
440
|
+
* This is because the model might have changed, which resets the hidden areas, but not the last cached value.
|
|
441
|
+
* This needs a better fix in the future.
|
|
442
|
+
*/
|
|
443
|
+
setHiddenAreas(ranges, source, forceUpdate) {
|
|
444
|
+
this.hiddenAreasModel.setHiddenAreas(source, ranges);
|
|
445
|
+
const mergedRanges = this.hiddenAreasModel.getMergedRanges();
|
|
446
|
+
if (mergedRanges === this.previousHiddenAreas && !forceUpdate) {
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
this.previousHiddenAreas = mergedRanges;
|
|
450
|
+
const stableViewport = this._captureStableViewport();
|
|
451
|
+
let lineMappingChanged = false;
|
|
452
|
+
try {
|
|
453
|
+
const eventsCollector = this._eventDispatcher.beginEmitViewEvents();
|
|
454
|
+
lineMappingChanged = this._lines.setHiddenAreas(mergedRanges);
|
|
455
|
+
if (lineMappingChanged) {
|
|
456
|
+
eventsCollector.emitViewEvent(new ViewFlushedEvent());
|
|
457
|
+
eventsCollector.emitViewEvent(new ViewLineMappingChangedEvent());
|
|
458
|
+
eventsCollector.emitViewEvent(new ViewDecorationsChangedEvent(null));
|
|
459
|
+
this._cursor.onLineMappingChanged(eventsCollector);
|
|
460
|
+
this._decorations.onLineMappingChanged();
|
|
461
|
+
this.viewLayout.onFlushed(this.getLineCount(), this._getCustomLineHeights());
|
|
462
|
+
this.viewLayout.onHeightMaybeChanged();
|
|
463
|
+
}
|
|
464
|
+
const firstModelLineInViewPort = stableViewport.viewportStartModelPosition?.lineNumber;
|
|
465
|
+
const firstModelLineIsHidden = firstModelLineInViewPort && mergedRanges.some(range => range.startLineNumber <= firstModelLineInViewPort && firstModelLineInViewPort <= range.endLineNumber);
|
|
466
|
+
if (!firstModelLineIsHidden) {
|
|
467
|
+
stableViewport.recoverViewportStart(this.coordinatesConverter, this.viewLayout);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
finally {
|
|
471
|
+
this._eventDispatcher.endEmitViewEvents();
|
|
472
|
+
}
|
|
473
|
+
this._updateConfigurationViewLineCount.schedule();
|
|
474
|
+
if (lineMappingChanged) {
|
|
475
|
+
this._eventDispatcher.emitOutgoingEvent(new HiddenAreasChangedEvent());
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
getVisibleRangesPlusViewportAboveBelow() {
|
|
479
|
+
const layoutInfo = this._configuration.options.get(165 /* EditorOption.layoutInfo */);
|
|
480
|
+
const lineHeight = this._configuration.options.get(75 /* EditorOption.lineHeight */);
|
|
481
|
+
const linesAround = Math.max(20, Math.round(layoutInfo.height / lineHeight));
|
|
482
|
+
const partialData = this.viewLayout.getLinesViewportData();
|
|
483
|
+
const startViewLineNumber = Math.max(1, partialData.completelyVisibleStartLineNumber - linesAround);
|
|
484
|
+
const endViewLineNumber = Math.min(this.getLineCount(), partialData.completelyVisibleEndLineNumber + linesAround);
|
|
485
|
+
return this._toModelVisibleRanges(new Range(startViewLineNumber, this.getLineMinColumn(startViewLineNumber), endViewLineNumber, this.getLineMaxColumn(endViewLineNumber)));
|
|
486
|
+
}
|
|
487
|
+
getVisibleRanges() {
|
|
488
|
+
const visibleViewRange = this.getCompletelyVisibleViewRange();
|
|
489
|
+
return this._toModelVisibleRanges(visibleViewRange);
|
|
490
|
+
}
|
|
491
|
+
getHiddenAreas() {
|
|
492
|
+
return this._lines.getHiddenAreas();
|
|
493
|
+
}
|
|
494
|
+
_toModelVisibleRanges(visibleViewRange) {
|
|
495
|
+
const visibleRange = this.coordinatesConverter.convertViewRangeToModelRange(visibleViewRange);
|
|
496
|
+
const hiddenAreas = this._lines.getHiddenAreas();
|
|
497
|
+
if (hiddenAreas.length === 0) {
|
|
498
|
+
return [visibleRange];
|
|
499
|
+
}
|
|
500
|
+
const result = [];
|
|
501
|
+
let resultLen = 0;
|
|
502
|
+
let startLineNumber = visibleRange.startLineNumber;
|
|
503
|
+
let startColumn = visibleRange.startColumn;
|
|
504
|
+
const endLineNumber = visibleRange.endLineNumber;
|
|
505
|
+
const endColumn = visibleRange.endColumn;
|
|
506
|
+
for (let i = 0, len = hiddenAreas.length; i < len; i++) {
|
|
507
|
+
const hiddenStartLineNumber = hiddenAreas[i].startLineNumber;
|
|
508
|
+
const hiddenEndLineNumber = hiddenAreas[i].endLineNumber;
|
|
509
|
+
if (hiddenEndLineNumber < startLineNumber) {
|
|
510
|
+
continue;
|
|
511
|
+
}
|
|
512
|
+
if (hiddenStartLineNumber > endLineNumber) {
|
|
513
|
+
continue;
|
|
514
|
+
}
|
|
515
|
+
if (startLineNumber < hiddenStartLineNumber) {
|
|
516
|
+
result[resultLen++] = new Range(startLineNumber, startColumn, hiddenStartLineNumber - 1, this.model.getLineMaxColumn(hiddenStartLineNumber - 1));
|
|
517
|
+
}
|
|
518
|
+
startLineNumber = hiddenEndLineNumber + 1;
|
|
519
|
+
startColumn = 1;
|
|
520
|
+
}
|
|
521
|
+
if (startLineNumber < endLineNumber || (startLineNumber === endLineNumber && startColumn < endColumn)) {
|
|
522
|
+
result[resultLen++] = new Range(startLineNumber, startColumn, endLineNumber, endColumn);
|
|
523
|
+
}
|
|
524
|
+
return result;
|
|
525
|
+
}
|
|
526
|
+
getCompletelyVisibleViewRange() {
|
|
527
|
+
const partialData = this.viewLayout.getLinesViewportData();
|
|
528
|
+
const startViewLineNumber = partialData.completelyVisibleStartLineNumber;
|
|
529
|
+
const endViewLineNumber = partialData.completelyVisibleEndLineNumber;
|
|
530
|
+
return new Range(startViewLineNumber, this.getLineMinColumn(startViewLineNumber), endViewLineNumber, this.getLineMaxColumn(endViewLineNumber));
|
|
531
|
+
}
|
|
532
|
+
getCompletelyVisibleViewRangeAtScrollTop(scrollTop) {
|
|
533
|
+
const partialData = this.viewLayout.getLinesViewportDataAtScrollTop(scrollTop);
|
|
534
|
+
const startViewLineNumber = partialData.completelyVisibleStartLineNumber;
|
|
535
|
+
const endViewLineNumber = partialData.completelyVisibleEndLineNumber;
|
|
536
|
+
return new Range(startViewLineNumber, this.getLineMinColumn(startViewLineNumber), endViewLineNumber, this.getLineMaxColumn(endViewLineNumber));
|
|
537
|
+
}
|
|
538
|
+
saveState() {
|
|
539
|
+
const compatViewState = this.viewLayout.saveState();
|
|
540
|
+
const scrollTop = compatViewState.scrollTop;
|
|
541
|
+
const firstViewLineNumber = this.viewLayout.getLineNumberAtVerticalOffset(scrollTop);
|
|
542
|
+
const firstPosition = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(firstViewLineNumber, this.getLineMinColumn(firstViewLineNumber)));
|
|
543
|
+
const firstPositionDeltaTop = this.viewLayout.getVerticalOffsetForLineNumber(firstViewLineNumber) - scrollTop;
|
|
544
|
+
return {
|
|
545
|
+
scrollLeft: compatViewState.scrollLeft,
|
|
546
|
+
firstPosition: firstPosition,
|
|
547
|
+
firstPositionDeltaTop: firstPositionDeltaTop
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
reduceRestoreState(state) {
|
|
551
|
+
if (typeof state.firstPosition === 'undefined') {
|
|
552
|
+
// This is a view state serialized by an older version
|
|
553
|
+
return this._reduceRestoreStateCompatibility(state);
|
|
554
|
+
}
|
|
555
|
+
const modelPosition = this.model.validatePosition(state.firstPosition);
|
|
556
|
+
const viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(modelPosition);
|
|
557
|
+
const scrollTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber) - state.firstPositionDeltaTop;
|
|
558
|
+
return {
|
|
559
|
+
scrollLeft: state.scrollLeft,
|
|
560
|
+
scrollTop: scrollTop
|
|
561
|
+
};
|
|
562
|
+
}
|
|
563
|
+
_reduceRestoreStateCompatibility(state) {
|
|
564
|
+
return {
|
|
565
|
+
scrollLeft: state.scrollLeft,
|
|
566
|
+
scrollTop: state.scrollTopWithoutViewZones
|
|
567
|
+
};
|
|
568
|
+
}
|
|
569
|
+
getTabSize() {
|
|
570
|
+
return this.model.getOptions().tabSize;
|
|
571
|
+
}
|
|
572
|
+
getLineCount() {
|
|
573
|
+
return this._lines.getViewLineCount();
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Gives a hint that a lot of requests are about to come in for these line numbers.
|
|
577
|
+
*/
|
|
578
|
+
setViewport(startLineNumber, endLineNumber, centeredLineNumber) {
|
|
579
|
+
this._viewportStart.update(this, startLineNumber);
|
|
580
|
+
}
|
|
581
|
+
getActiveIndentGuide(lineNumber, minLineNumber, maxLineNumber) {
|
|
582
|
+
return this._lines.getActiveIndentGuide(lineNumber, minLineNumber, maxLineNumber);
|
|
583
|
+
}
|
|
584
|
+
getLinesIndentGuides(startLineNumber, endLineNumber) {
|
|
585
|
+
return this._lines.getViewLinesIndentGuides(startLineNumber, endLineNumber);
|
|
586
|
+
}
|
|
587
|
+
getBracketGuidesInRangeByLine(startLineNumber, endLineNumber, activePosition, options) {
|
|
588
|
+
return this._lines.getViewLinesBracketGuides(startLineNumber, endLineNumber, activePosition, options);
|
|
589
|
+
}
|
|
590
|
+
getLineContent(lineNumber) {
|
|
591
|
+
return this._lines.getViewLineContent(lineNumber);
|
|
592
|
+
}
|
|
593
|
+
getLineLength(lineNumber) {
|
|
594
|
+
return this._lines.getViewLineLength(lineNumber);
|
|
595
|
+
}
|
|
596
|
+
getLineMinColumn(lineNumber) {
|
|
597
|
+
return this._lines.getViewLineMinColumn(lineNumber);
|
|
598
|
+
}
|
|
599
|
+
getLineMaxColumn(lineNumber) {
|
|
600
|
+
return this._lines.getViewLineMaxColumn(lineNumber);
|
|
601
|
+
}
|
|
602
|
+
getLineFirstNonWhitespaceColumn(lineNumber) {
|
|
603
|
+
const result = firstNonWhitespaceIndex(this.getLineContent(lineNumber));
|
|
604
|
+
if (result === -1) {
|
|
605
|
+
return 0;
|
|
606
|
+
}
|
|
607
|
+
return result + 1;
|
|
608
|
+
}
|
|
609
|
+
getLineLastNonWhitespaceColumn(lineNumber) {
|
|
610
|
+
const result = lastNonWhitespaceIndex(this.getLineContent(lineNumber));
|
|
611
|
+
if (result === -1) {
|
|
612
|
+
return 0;
|
|
613
|
+
}
|
|
614
|
+
return result + 2;
|
|
615
|
+
}
|
|
616
|
+
getMinimapDecorationsInRange(range) {
|
|
617
|
+
return this._decorations.getMinimapDecorationsInRange(range);
|
|
618
|
+
}
|
|
619
|
+
getDecorationsInViewport(visibleRange) {
|
|
620
|
+
return this._decorations.getDecorationsViewportData(visibleRange).decorations;
|
|
621
|
+
}
|
|
622
|
+
getInjectedTextAt(viewPosition) {
|
|
623
|
+
return this._lines.getInjectedTextAt(viewPosition);
|
|
624
|
+
}
|
|
625
|
+
_getTextDirection(lineNumber, decorations) {
|
|
626
|
+
let rtlCount = 0;
|
|
627
|
+
for (const decoration of decorations) {
|
|
628
|
+
const range = decoration.range;
|
|
629
|
+
if (range.startLineNumber > lineNumber || range.endLineNumber < lineNumber) {
|
|
630
|
+
continue;
|
|
631
|
+
}
|
|
632
|
+
const textDirection = decoration.options.textDirection;
|
|
633
|
+
if (textDirection === TextDirection.RTL) {
|
|
634
|
+
rtlCount++;
|
|
635
|
+
}
|
|
636
|
+
else if (textDirection === TextDirection.LTR) {
|
|
637
|
+
rtlCount--;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
return rtlCount > 0 ? TextDirection.RTL : TextDirection.LTR;
|
|
641
|
+
}
|
|
642
|
+
getTextDirection(lineNumber) {
|
|
643
|
+
const decorationsCollection = this._decorations.getDecorationsOnLine(lineNumber);
|
|
644
|
+
return this._getTextDirection(lineNumber, decorationsCollection.decorations);
|
|
645
|
+
}
|
|
646
|
+
getViewportViewLineRenderingData(visibleRange, lineNumber) {
|
|
647
|
+
const viewportDecorationsCollection = this._decorations.getDecorationsViewportData(visibleRange);
|
|
648
|
+
const inlineDecorations = viewportDecorationsCollection.inlineDecorations[lineNumber - visibleRange.startLineNumber];
|
|
649
|
+
return this._getViewLineRenderingData(lineNumber, inlineDecorations, viewportDecorationsCollection.hasVariableFonts, viewportDecorationsCollection.decorations);
|
|
650
|
+
}
|
|
651
|
+
getViewLineRenderingData(lineNumber) {
|
|
652
|
+
const decorationsCollection = this._decorations.getDecorationsOnLine(lineNumber);
|
|
653
|
+
return this._getViewLineRenderingData(lineNumber, decorationsCollection.inlineDecorations[0], decorationsCollection.hasVariableFonts, decorationsCollection.decorations);
|
|
654
|
+
}
|
|
655
|
+
_getViewLineRenderingData(lineNumber, inlineDecorations, hasVariableFonts, decorations) {
|
|
656
|
+
const mightContainRTL = this.model.mightContainRTL();
|
|
657
|
+
const mightContainNonBasicASCII = this.model.mightContainNonBasicASCII();
|
|
658
|
+
const tabSize = this.getTabSize();
|
|
659
|
+
const lineData = this._lines.getViewLineData(lineNumber);
|
|
660
|
+
if (lineData.inlineDecorations) {
|
|
661
|
+
inlineDecorations = [
|
|
662
|
+
...inlineDecorations,
|
|
663
|
+
...lineData.inlineDecorations.map(d => d.toInlineDecoration(lineNumber))
|
|
664
|
+
];
|
|
665
|
+
}
|
|
666
|
+
return new ViewLineRenderingData(lineData.minColumn, lineData.maxColumn, lineData.content, lineData.continuesWithWrappedLine, mightContainRTL, mightContainNonBasicASCII, lineData.tokens, inlineDecorations, tabSize, lineData.startVisibleColumn, this._getTextDirection(lineNumber, decorations), hasVariableFonts);
|
|
667
|
+
}
|
|
668
|
+
getViewLineData(lineNumber) {
|
|
669
|
+
return this._lines.getViewLineData(lineNumber);
|
|
670
|
+
}
|
|
671
|
+
getMinimapLinesRenderingData(startLineNumber, endLineNumber, needed) {
|
|
672
|
+
const result = this._lines.getViewLinesData(startLineNumber, endLineNumber, needed);
|
|
673
|
+
return new MinimapLinesRenderingData(this.getTabSize(), result);
|
|
674
|
+
}
|
|
675
|
+
getAllOverviewRulerDecorations(theme) {
|
|
676
|
+
const decorations = this.model.getOverviewRulerDecorations(this._editorId, filterValidationDecorations(this._configuration.options), filterFontDecorations(this._configuration.options));
|
|
677
|
+
const result = new OverviewRulerDecorations();
|
|
678
|
+
for (const decoration of decorations) {
|
|
679
|
+
const decorationOptions = decoration.options;
|
|
680
|
+
const opts = decorationOptions.overviewRuler;
|
|
681
|
+
if (!opts) {
|
|
682
|
+
continue;
|
|
683
|
+
}
|
|
684
|
+
const lane = opts.position;
|
|
685
|
+
if (lane === 0) {
|
|
686
|
+
continue;
|
|
687
|
+
}
|
|
688
|
+
const color = opts.getColor(theme.value);
|
|
689
|
+
const viewStartLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration.range.startLineNumber, decoration.range.startColumn);
|
|
690
|
+
const viewEndLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration.range.endLineNumber, decoration.range.endColumn);
|
|
691
|
+
result.accept(color, decorationOptions.zIndex, viewStartLineNumber, viewEndLineNumber, lane);
|
|
692
|
+
}
|
|
693
|
+
return result.asArray;
|
|
694
|
+
}
|
|
695
|
+
_invalidateDecorationsColorCache() {
|
|
696
|
+
const decorations = this.model.getOverviewRulerDecorations();
|
|
697
|
+
for (const decoration of decorations) {
|
|
698
|
+
const opts1 = decoration.options.overviewRuler;
|
|
699
|
+
opts1?.invalidateCachedColor();
|
|
700
|
+
const opts2 = decoration.options.minimap;
|
|
701
|
+
opts2?.invalidateCachedColor();
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
getValueInRange(range, eol) {
|
|
705
|
+
const modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range);
|
|
706
|
+
return this.model.getValueInRange(modelRange, eol);
|
|
707
|
+
}
|
|
708
|
+
getValueLengthInRange(range, eol) {
|
|
709
|
+
const modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range);
|
|
710
|
+
return this.model.getValueLengthInRange(modelRange, eol);
|
|
711
|
+
}
|
|
712
|
+
modifyPosition(position, offset) {
|
|
713
|
+
const modelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(position);
|
|
714
|
+
const resultModelPosition = this.model.modifyPosition(modelPosition, offset);
|
|
715
|
+
return this.coordinatesConverter.convertModelPositionToViewPosition(resultModelPosition);
|
|
716
|
+
}
|
|
717
|
+
deduceModelPositionRelativeToViewPosition(viewAnchorPosition, deltaOffset, lineFeedCnt) {
|
|
718
|
+
const modelAnchor = this.coordinatesConverter.convertViewPositionToModelPosition(viewAnchorPosition);
|
|
719
|
+
if (this.model.getEOL().length === 2) {
|
|
720
|
+
// This model uses CRLF, so the delta must take that into account
|
|
721
|
+
if (deltaOffset < 0) {
|
|
722
|
+
deltaOffset -= lineFeedCnt;
|
|
723
|
+
}
|
|
724
|
+
else {
|
|
725
|
+
deltaOffset += lineFeedCnt;
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
const modelAnchorOffset = this.model.getOffsetAt(modelAnchor);
|
|
729
|
+
const resultOffset = modelAnchorOffset + deltaOffset;
|
|
730
|
+
return this.model.getPositionAt(resultOffset);
|
|
731
|
+
}
|
|
732
|
+
getPlainTextToCopy(modelRanges, emptySelectionClipboard, forceCRLF) {
|
|
733
|
+
const newLineCharacter = forceCRLF ? '\r\n' : this.model.getEOL();
|
|
734
|
+
modelRanges = modelRanges.slice(0);
|
|
735
|
+
modelRanges.sort(Range.compareRangesUsingStarts);
|
|
736
|
+
let hasEmptyRange = false;
|
|
737
|
+
let hasNonEmptyRange = false;
|
|
738
|
+
for (const range of modelRanges) {
|
|
739
|
+
if (range.isEmpty()) {
|
|
740
|
+
hasEmptyRange = true;
|
|
741
|
+
}
|
|
742
|
+
else {
|
|
743
|
+
hasNonEmptyRange = true;
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
if (!hasNonEmptyRange) {
|
|
747
|
+
// all ranges are empty
|
|
748
|
+
if (!emptySelectionClipboard) {
|
|
749
|
+
return '';
|
|
750
|
+
}
|
|
751
|
+
const modelLineNumbers = modelRanges.map((r) => r.startLineNumber);
|
|
752
|
+
let result = '';
|
|
753
|
+
for (let i = 0; i < modelLineNumbers.length; i++) {
|
|
754
|
+
if (i > 0 && modelLineNumbers[i - 1] === modelLineNumbers[i]) {
|
|
755
|
+
continue;
|
|
756
|
+
}
|
|
757
|
+
result += this.model.getLineContent(modelLineNumbers[i]) + newLineCharacter;
|
|
758
|
+
}
|
|
759
|
+
return result;
|
|
760
|
+
}
|
|
761
|
+
if (hasEmptyRange && emptySelectionClipboard) {
|
|
762
|
+
// mixed empty selections and non-empty selections
|
|
763
|
+
const result = [];
|
|
764
|
+
let prevModelLineNumber = 0;
|
|
765
|
+
for (const modelRange of modelRanges) {
|
|
766
|
+
const modelLineNumber = modelRange.startLineNumber;
|
|
767
|
+
if (modelRange.isEmpty()) {
|
|
768
|
+
if (modelLineNumber !== prevModelLineNumber) {
|
|
769
|
+
result.push(this.model.getLineContent(modelLineNumber));
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
else {
|
|
773
|
+
result.push(this.model.getValueInRange(modelRange, forceCRLF ? 2 /* EndOfLinePreference.CRLF */ : 0 /* EndOfLinePreference.TextDefined */));
|
|
774
|
+
}
|
|
775
|
+
prevModelLineNumber = modelLineNumber;
|
|
776
|
+
}
|
|
777
|
+
return result.length === 1 ? result[0] : result;
|
|
778
|
+
}
|
|
779
|
+
const result = [];
|
|
780
|
+
for (const modelRange of modelRanges) {
|
|
781
|
+
if (!modelRange.isEmpty()) {
|
|
782
|
+
result.push(this.model.getValueInRange(modelRange, forceCRLF ? 2 /* EndOfLinePreference.CRLF */ : 0 /* EndOfLinePreference.TextDefined */));
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
return result.length === 1 ? result[0] : result;
|
|
786
|
+
}
|
|
787
|
+
getRichTextToCopy(modelRanges, emptySelectionClipboard) {
|
|
788
|
+
const languageId = this.model.getLanguageId();
|
|
789
|
+
if (languageId === PLAINTEXT_LANGUAGE_ID) {
|
|
790
|
+
return null;
|
|
791
|
+
}
|
|
792
|
+
if (modelRanges.length !== 1) {
|
|
793
|
+
// no multiple selection support at this time
|
|
794
|
+
return null;
|
|
795
|
+
}
|
|
796
|
+
let range = modelRanges[0];
|
|
797
|
+
if (range.isEmpty()) {
|
|
798
|
+
if (!emptySelectionClipboard) {
|
|
799
|
+
// nothing to copy
|
|
800
|
+
return null;
|
|
801
|
+
}
|
|
802
|
+
const lineNumber = range.startLineNumber;
|
|
803
|
+
range = new Range(lineNumber, this.model.getLineMinColumn(lineNumber), lineNumber, this.model.getLineMaxColumn(lineNumber));
|
|
804
|
+
}
|
|
805
|
+
const fontInfo = this._configuration.options.get(59 /* EditorOption.fontInfo */);
|
|
806
|
+
const colorMap = this._getColorMap();
|
|
807
|
+
const hasBadChars = (/[:;\\\/<>]/.test(fontInfo.fontFamily));
|
|
808
|
+
const useDefaultFontFamily = (hasBadChars || fontInfo.fontFamily === EDITOR_FONT_DEFAULTS.fontFamily);
|
|
809
|
+
let fontFamily;
|
|
810
|
+
if (useDefaultFontFamily) {
|
|
811
|
+
fontFamily = EDITOR_FONT_DEFAULTS.fontFamily;
|
|
812
|
+
}
|
|
813
|
+
else {
|
|
814
|
+
fontFamily = fontInfo.fontFamily;
|
|
815
|
+
fontFamily = fontFamily.replace(/"/g, '\'');
|
|
816
|
+
const hasQuotesOrIsList = /[,']/.test(fontFamily);
|
|
817
|
+
if (!hasQuotesOrIsList) {
|
|
818
|
+
const needsQuotes = /[+ ]/.test(fontFamily);
|
|
819
|
+
if (needsQuotes) {
|
|
820
|
+
fontFamily = `'${fontFamily}'`;
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
fontFamily = `${fontFamily}, ${EDITOR_FONT_DEFAULTS.fontFamily}`;
|
|
824
|
+
}
|
|
825
|
+
return {
|
|
826
|
+
mode: languageId,
|
|
827
|
+
html: (`<div style="`
|
|
828
|
+
+ `color: ${colorMap[1 /* ColorId.DefaultForeground */]};`
|
|
829
|
+
+ `background-color: ${colorMap[2 /* ColorId.DefaultBackground */]};`
|
|
830
|
+
+ `font-family: ${fontFamily};`
|
|
831
|
+
+ `font-weight: ${fontInfo.fontWeight};`
|
|
832
|
+
+ `font-size: ${fontInfo.fontSize}px;`
|
|
833
|
+
+ `line-height: ${fontInfo.lineHeight}px;`
|
|
834
|
+
+ `white-space: pre;`
|
|
835
|
+
+ `">`
|
|
836
|
+
+ this._getHTMLToCopy(range, colorMap)
|
|
837
|
+
+ '</div>')
|
|
838
|
+
};
|
|
839
|
+
}
|
|
840
|
+
_getHTMLToCopy(modelRange, colorMap) {
|
|
841
|
+
const startLineNumber = modelRange.startLineNumber;
|
|
842
|
+
const startColumn = modelRange.startColumn;
|
|
843
|
+
const endLineNumber = modelRange.endLineNumber;
|
|
844
|
+
const endColumn = modelRange.endColumn;
|
|
845
|
+
const tabSize = this.getTabSize();
|
|
846
|
+
let result = '';
|
|
847
|
+
for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) {
|
|
848
|
+
const lineTokens = this.model.tokenization.getLineTokens(lineNumber);
|
|
849
|
+
const lineContent = lineTokens.getLineContent();
|
|
850
|
+
const startOffset = (lineNumber === startLineNumber ? startColumn - 1 : 0);
|
|
851
|
+
const endOffset = (lineNumber === endLineNumber ? endColumn - 1 : lineContent.length);
|
|
852
|
+
if (lineContent === '') {
|
|
853
|
+
result += '<br>';
|
|
854
|
+
}
|
|
855
|
+
else {
|
|
856
|
+
result += tokenizeLineToHTML(lineContent, lineTokens.inflate(), colorMap, startOffset, endOffset, tabSize, isWindows);
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
return result;
|
|
860
|
+
}
|
|
861
|
+
_getColorMap() {
|
|
862
|
+
const colorMap = TokenizationRegistry.getColorMap();
|
|
863
|
+
const result = ['#000000'];
|
|
864
|
+
if (colorMap) {
|
|
865
|
+
for (let i = 1, len = colorMap.length; i < len; i++) {
|
|
866
|
+
result[i] = Color.Format.CSS.formatHex(colorMap[i]);
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
return result;
|
|
870
|
+
}
|
|
871
|
+
//#region cursor operations
|
|
872
|
+
getPrimaryCursorState() {
|
|
873
|
+
return this._cursor.getPrimaryCursorState();
|
|
874
|
+
}
|
|
875
|
+
getLastAddedCursorIndex() {
|
|
876
|
+
return this._cursor.getLastAddedCursorIndex();
|
|
877
|
+
}
|
|
878
|
+
getCursorStates() {
|
|
879
|
+
return this._cursor.getCursorStates();
|
|
880
|
+
}
|
|
881
|
+
setCursorStates(source, reason, states) {
|
|
882
|
+
return this._withViewEventsCollector(eventsCollector => this._cursor.setStates(eventsCollector, source, reason, states));
|
|
883
|
+
}
|
|
884
|
+
getCursorColumnSelectData() {
|
|
885
|
+
return this._cursor.getCursorColumnSelectData();
|
|
886
|
+
}
|
|
887
|
+
getCursorAutoClosedCharacters() {
|
|
888
|
+
return this._cursor.getAutoClosedCharacters();
|
|
889
|
+
}
|
|
890
|
+
setCursorColumnSelectData(columnSelectData) {
|
|
891
|
+
this._cursor.setCursorColumnSelectData(columnSelectData);
|
|
892
|
+
}
|
|
893
|
+
getPrevEditOperationType() {
|
|
894
|
+
return this._cursor.getPrevEditOperationType();
|
|
895
|
+
}
|
|
896
|
+
setPrevEditOperationType(type) {
|
|
897
|
+
this._cursor.setPrevEditOperationType(type);
|
|
898
|
+
}
|
|
899
|
+
getSelection() {
|
|
900
|
+
return this._cursor.getSelection();
|
|
901
|
+
}
|
|
902
|
+
getSelections() {
|
|
903
|
+
return this._cursor.getSelections();
|
|
904
|
+
}
|
|
905
|
+
getPosition() {
|
|
906
|
+
return this._cursor.getPrimaryCursorState().modelState.position;
|
|
907
|
+
}
|
|
908
|
+
setSelections(source, selections, reason = 0 /* CursorChangeReason.NotSet */) {
|
|
909
|
+
this._withViewEventsCollector(eventsCollector => this._cursor.setSelections(eventsCollector, source, selections, reason));
|
|
910
|
+
}
|
|
911
|
+
saveCursorState() {
|
|
912
|
+
return this._cursor.saveState();
|
|
913
|
+
}
|
|
914
|
+
restoreCursorState(states) {
|
|
915
|
+
this._withViewEventsCollector(eventsCollector => this._cursor.restoreState(eventsCollector, states));
|
|
916
|
+
}
|
|
917
|
+
_executeCursorEdit(callback) {
|
|
918
|
+
if (this._cursor.context.cursorConfig.readOnly) {
|
|
919
|
+
// we cannot edit when read only...
|
|
920
|
+
this._eventDispatcher.emitOutgoingEvent(new ReadOnlyEditAttemptEvent());
|
|
921
|
+
return;
|
|
922
|
+
}
|
|
923
|
+
this._withViewEventsCollector(callback);
|
|
924
|
+
}
|
|
925
|
+
executeEdits(source, edits, cursorStateComputer, reason) {
|
|
926
|
+
this._executeCursorEdit(eventsCollector => this._cursor.executeEdits(eventsCollector, source, edits, cursorStateComputer, reason));
|
|
927
|
+
}
|
|
928
|
+
startComposition() {
|
|
929
|
+
this._executeCursorEdit(eventsCollector => this._cursor.startComposition(eventsCollector));
|
|
930
|
+
}
|
|
931
|
+
endComposition(source) {
|
|
932
|
+
this._executeCursorEdit(eventsCollector => this._cursor.endComposition(eventsCollector, source));
|
|
933
|
+
}
|
|
934
|
+
type(text, source) {
|
|
935
|
+
this._executeCursorEdit(eventsCollector => this._cursor.type(eventsCollector, text, source));
|
|
936
|
+
}
|
|
937
|
+
compositionType(text, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source) {
|
|
938
|
+
this._executeCursorEdit(eventsCollector => this._cursor.compositionType(eventsCollector, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source));
|
|
939
|
+
}
|
|
940
|
+
paste(text, pasteOnNewLine, multicursorText, source) {
|
|
941
|
+
this._executeCursorEdit(eventsCollector => this._cursor.paste(eventsCollector, text, pasteOnNewLine, multicursorText, source));
|
|
942
|
+
}
|
|
943
|
+
cut(source) {
|
|
944
|
+
this._executeCursorEdit(eventsCollector => this._cursor.cut(eventsCollector, source));
|
|
945
|
+
}
|
|
946
|
+
executeCommand(command, source) {
|
|
947
|
+
this._executeCursorEdit(eventsCollector => this._cursor.executeCommand(eventsCollector, command, source));
|
|
948
|
+
}
|
|
949
|
+
executeCommands(commands, source) {
|
|
950
|
+
this._executeCursorEdit(eventsCollector => this._cursor.executeCommands(eventsCollector, commands, source));
|
|
951
|
+
}
|
|
952
|
+
revealAllCursors(source, revealHorizontal, minimalReveal = false) {
|
|
953
|
+
this._withViewEventsCollector(eventsCollector => this._cursor.revealAll(eventsCollector, source, minimalReveal, 0 /* viewEvents.VerticalRevealType.Simple */, revealHorizontal, 0 /* ScrollType.Smooth */));
|
|
954
|
+
}
|
|
955
|
+
revealPrimaryCursor(source, revealHorizontal, minimalReveal = false) {
|
|
956
|
+
this._withViewEventsCollector(eventsCollector => this._cursor.revealPrimary(eventsCollector, source, minimalReveal, 0 /* viewEvents.VerticalRevealType.Simple */, revealHorizontal, 0 /* ScrollType.Smooth */));
|
|
957
|
+
}
|
|
958
|
+
revealTopMostCursor(source) {
|
|
959
|
+
const viewPosition = this._cursor.getTopMostViewPosition();
|
|
960
|
+
const viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column);
|
|
961
|
+
this._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new ViewRevealRangeRequestEvent(source, false, viewRange, null, 0 /* viewEvents.VerticalRevealType.Simple */, true, 0 /* ScrollType.Smooth */)));
|
|
962
|
+
}
|
|
963
|
+
revealBottomMostCursor(source) {
|
|
964
|
+
const viewPosition = this._cursor.getBottomMostViewPosition();
|
|
965
|
+
const viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column);
|
|
966
|
+
this._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new ViewRevealRangeRequestEvent(source, false, viewRange, null, 0 /* viewEvents.VerticalRevealType.Simple */, true, 0 /* ScrollType.Smooth */)));
|
|
967
|
+
}
|
|
968
|
+
revealRange(source, revealHorizontal, viewRange, verticalType, scrollType) {
|
|
969
|
+
this._withViewEventsCollector(eventsCollector => eventsCollector.emitViewEvent(new ViewRevealRangeRequestEvent(source, false, viewRange, null, verticalType, revealHorizontal, scrollType)));
|
|
970
|
+
}
|
|
971
|
+
//#endregion
|
|
972
|
+
//#region viewLayout
|
|
973
|
+
changeWhitespace(callback) {
|
|
974
|
+
const hadAChange = this.viewLayout.changeWhitespace(callback);
|
|
975
|
+
if (hadAChange) {
|
|
976
|
+
this._eventDispatcher.emitSingleViewEvent(new ViewZonesChangedEvent());
|
|
977
|
+
this._eventDispatcher.emitOutgoingEvent(new ViewZonesChangedEvent$1());
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
//#endregion
|
|
981
|
+
_withViewEventsCollector(callback) {
|
|
982
|
+
return this._transactionalTarget.batchChanges(() => {
|
|
983
|
+
try {
|
|
984
|
+
const eventsCollector = this._eventDispatcher.beginEmitViewEvents();
|
|
985
|
+
return callback(eventsCollector);
|
|
986
|
+
}
|
|
987
|
+
finally {
|
|
988
|
+
this._eventDispatcher.endEmitViewEvents();
|
|
989
|
+
}
|
|
990
|
+
});
|
|
991
|
+
}
|
|
992
|
+
batchEvents(callback) {
|
|
993
|
+
this._withViewEventsCollector(() => { callback(); });
|
|
994
|
+
}
|
|
995
|
+
normalizePosition(position, affinity) {
|
|
996
|
+
return this._lines.normalizePosition(position, affinity);
|
|
997
|
+
}
|
|
998
|
+
/**
|
|
999
|
+
* Gets the column at which indentation stops at a given line.
|
|
1000
|
+
* @internal
|
|
1001
|
+
*/
|
|
1002
|
+
getLineIndentColumn(lineNumber) {
|
|
1003
|
+
return this._lines.getLineIndentColumn(lineNumber);
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
class ViewportStart {
|
|
1007
|
+
static create(model) {
|
|
1008
|
+
const viewportStartLineTrackedRange = model._setTrackedRange(null, new Range(1, 1, 1, 1), 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */);
|
|
1009
|
+
return new ViewportStart(model, 1, false, viewportStartLineTrackedRange, 0);
|
|
1010
|
+
}
|
|
1011
|
+
get viewLineNumber() {
|
|
1012
|
+
return this._viewLineNumber;
|
|
1013
|
+
}
|
|
1014
|
+
get isValid() {
|
|
1015
|
+
return this._isValid;
|
|
1016
|
+
}
|
|
1017
|
+
get modelTrackedRange() {
|
|
1018
|
+
return this._modelTrackedRange;
|
|
1019
|
+
}
|
|
1020
|
+
get startLineDelta() {
|
|
1021
|
+
return this._startLineDelta;
|
|
1022
|
+
}
|
|
1023
|
+
constructor(_model, _viewLineNumber, _isValid, _modelTrackedRange, _startLineDelta) {
|
|
1024
|
+
this._model = _model;
|
|
1025
|
+
this._viewLineNumber = _viewLineNumber;
|
|
1026
|
+
this._isValid = _isValid;
|
|
1027
|
+
this._modelTrackedRange = _modelTrackedRange;
|
|
1028
|
+
this._startLineDelta = _startLineDelta;
|
|
1029
|
+
}
|
|
1030
|
+
dispose() {
|
|
1031
|
+
this._model._setTrackedRange(this._modelTrackedRange, null, 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */);
|
|
1032
|
+
}
|
|
1033
|
+
update(viewModel, startLineNumber) {
|
|
1034
|
+
const position = viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(startLineNumber, viewModel.getLineMinColumn(startLineNumber)));
|
|
1035
|
+
const viewportStartLineTrackedRange = viewModel.model._setTrackedRange(this._modelTrackedRange, new Range(position.lineNumber, position.column, position.lineNumber, position.column), 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */);
|
|
1036
|
+
const viewportStartLineTop = viewModel.viewLayout.getVerticalOffsetForLineNumber(startLineNumber);
|
|
1037
|
+
const scrollTop = viewModel.viewLayout.getCurrentScrollTop();
|
|
1038
|
+
this._viewLineNumber = startLineNumber;
|
|
1039
|
+
this._isValid = true;
|
|
1040
|
+
this._modelTrackedRange = viewportStartLineTrackedRange;
|
|
1041
|
+
this._startLineDelta = scrollTop - viewportStartLineTop;
|
|
1042
|
+
}
|
|
1043
|
+
invalidate() {
|
|
1044
|
+
this._isValid = false;
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
class OverviewRulerDecorations {
|
|
1048
|
+
constructor() {
|
|
1049
|
+
this._asMap = Object.create(null);
|
|
1050
|
+
this.asArray = [];
|
|
1051
|
+
}
|
|
1052
|
+
accept(color, zIndex, startLineNumber, endLineNumber, lane) {
|
|
1053
|
+
const prevGroup = this._asMap[color];
|
|
1054
|
+
if (prevGroup) {
|
|
1055
|
+
const prevData = prevGroup.data;
|
|
1056
|
+
const prevLane = prevData[prevData.length - 3];
|
|
1057
|
+
const prevEndLineNumber = prevData[prevData.length - 1];
|
|
1058
|
+
if (prevLane === lane && prevEndLineNumber + 1 >= startLineNumber) {
|
|
1059
|
+
// merge into prev
|
|
1060
|
+
if (endLineNumber > prevEndLineNumber) {
|
|
1061
|
+
prevData[prevData.length - 1] = endLineNumber;
|
|
1062
|
+
}
|
|
1063
|
+
return;
|
|
1064
|
+
}
|
|
1065
|
+
// push
|
|
1066
|
+
prevData.push(lane, startLineNumber, endLineNumber);
|
|
1067
|
+
}
|
|
1068
|
+
else {
|
|
1069
|
+
const group = new OverviewRulerDecorationsGroup(color, zIndex, [lane, startLineNumber, endLineNumber]);
|
|
1070
|
+
this._asMap[color] = group;
|
|
1071
|
+
this.asArray.push(group);
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
class HiddenAreasModel {
|
|
1076
|
+
constructor() {
|
|
1077
|
+
this.hiddenAreas = new Map();
|
|
1078
|
+
this.shouldRecompute = false;
|
|
1079
|
+
this.ranges = [];
|
|
1080
|
+
}
|
|
1081
|
+
setHiddenAreas(source, ranges) {
|
|
1082
|
+
const existing = this.hiddenAreas.get(source);
|
|
1083
|
+
if (existing && rangeArraysEqual(existing, ranges)) {
|
|
1084
|
+
return;
|
|
1085
|
+
}
|
|
1086
|
+
this.hiddenAreas.set(source, ranges);
|
|
1087
|
+
this.shouldRecompute = true;
|
|
1088
|
+
}
|
|
1089
|
+
/**
|
|
1090
|
+
* The returned array is immutable.
|
|
1091
|
+
*/
|
|
1092
|
+
getMergedRanges() {
|
|
1093
|
+
if (!this.shouldRecompute) {
|
|
1094
|
+
return this.ranges;
|
|
1095
|
+
}
|
|
1096
|
+
this.shouldRecompute = false;
|
|
1097
|
+
const newRanges = Array.from(this.hiddenAreas.values()).reduce((r, hiddenAreas) => mergeLineRangeArray(r, hiddenAreas), []);
|
|
1098
|
+
if (rangeArraysEqual(this.ranges, newRanges)) {
|
|
1099
|
+
return this.ranges;
|
|
1100
|
+
}
|
|
1101
|
+
this.ranges = newRanges;
|
|
1102
|
+
return this.ranges;
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
function mergeLineRangeArray(arr1, arr2) {
|
|
1106
|
+
const result = [];
|
|
1107
|
+
let i = 0;
|
|
1108
|
+
let j = 0;
|
|
1109
|
+
while (i < arr1.length && j < arr2.length) {
|
|
1110
|
+
const item1 = arr1[i];
|
|
1111
|
+
const item2 = arr2[j];
|
|
1112
|
+
if (item1.endLineNumber < item2.startLineNumber - 1) {
|
|
1113
|
+
result.push(arr1[i++]);
|
|
1114
|
+
}
|
|
1115
|
+
else if (item2.endLineNumber < item1.startLineNumber - 1) {
|
|
1116
|
+
result.push(arr2[j++]);
|
|
1117
|
+
}
|
|
1118
|
+
else {
|
|
1119
|
+
const startLineNumber = Math.min(item1.startLineNumber, item2.startLineNumber);
|
|
1120
|
+
const endLineNumber = Math.max(item1.endLineNumber, item2.endLineNumber);
|
|
1121
|
+
result.push(new Range(startLineNumber, 1, endLineNumber, 1));
|
|
1122
|
+
i++;
|
|
1123
|
+
j++;
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
while (i < arr1.length) {
|
|
1127
|
+
result.push(arr1[i++]);
|
|
1128
|
+
}
|
|
1129
|
+
while (j < arr2.length) {
|
|
1130
|
+
result.push(arr2[j++]);
|
|
1131
|
+
}
|
|
1132
|
+
return result;
|
|
1133
|
+
}
|
|
1134
|
+
function rangeArraysEqual(arr1, arr2) {
|
|
1135
|
+
if (arr1.length !== arr2.length) {
|
|
1136
|
+
return false;
|
|
1137
|
+
}
|
|
1138
|
+
for (let i = 0; i < arr1.length; i++) {
|
|
1139
|
+
if (!arr1[i].equalsRange(arr2[i])) {
|
|
1140
|
+
return false;
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
return true;
|
|
1144
|
+
}
|
|
1145
|
+
/**
|
|
1146
|
+
* Maintain a stable viewport by trying to keep the first line in the viewport constant.
|
|
1147
|
+
*/
|
|
1148
|
+
class StableViewport {
|
|
1149
|
+
constructor(viewportStartModelPosition, startLineDelta) {
|
|
1150
|
+
this.viewportStartModelPosition = viewportStartModelPosition;
|
|
1151
|
+
this.startLineDelta = startLineDelta;
|
|
1152
|
+
}
|
|
1153
|
+
recoverViewportStart(coordinatesConverter, viewLayout) {
|
|
1154
|
+
if (!this.viewportStartModelPosition) {
|
|
1155
|
+
return;
|
|
1156
|
+
}
|
|
1157
|
+
const viewPosition = coordinatesConverter.convertModelPositionToViewPosition(this.viewportStartModelPosition);
|
|
1158
|
+
const viewPositionTop = viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber);
|
|
1159
|
+
viewLayout.setScrollPosition({ scrollTop: viewPositionTop + this.startLineDelta }, 1 /* ScrollType.Immediate */);
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
export { ViewModel };
|