monaco-editor
Version:
A browser based code editor
1,093 lines (1,092 loc) • 85.2 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
var CodeEditorWidget_1;
import '../services/markerDecorations.js';
import './media/editor.css';
import * as nls from '../../../nls.js';
import * as dom from '../../../base/browser/dom.js';
import { onUnexpectedError } from '../../../base/common/errors.js';
import { Emitter, createEventDeliveryQueue } from '../../../base/common/event.js';
import { Disposable, dispose } from '../../../base/common/lifecycle.js';
import { Schemas } from '../../../base/common/network.js';
import { EditorConfiguration } from '../config/editorConfiguration.js';
import { EditorExtensionsRegistry } from '../editorExtensions.js';
import { ICodeEditorService } from '../services/codeEditorService.js';
import { View } from '../view.js';
import { ViewUserInputEvents } from '../view/viewUserInputEvents.js';
import { filterValidationDecorations } from '../../common/config/editorOptions.js';
import { CursorColumns } from '../../common/core/cursorColumns.js';
import { Position } from '../../common/core/position.js';
import { Range } from '../../common/core/range.js';
import { Selection } from '../../common/core/selection.js';
import { InternalEditorAction } from '../../common/editorAction.js';
import * as editorCommon from '../../common/editorCommon.js';
import { EditorContextKeys } from '../../common/editorContextKeys.js';
import { ModelDecorationOptions } from '../../common/model/textModel.js';
import { editorUnnecessaryCodeOpacity } from '../../common/core/editorColorRegistry.js';
import { editorErrorForeground, editorHintForeground, editorInfoForeground, editorWarningForeground } from '../../../platform/theme/common/colorRegistry.js';
import { ViewModel } from '../../common/viewModel/viewModelImpl.js';
import { ICommandService } from '../../../platform/commands/common/commands.js';
import { IContextKeyService } from '../../../platform/contextkey/common/contextkey.js';
import { IInstantiationService } from '../../../platform/instantiation/common/instantiation.js';
import { ServiceCollection } from '../../../platform/instantiation/common/serviceCollection.js';
import { INotificationService, Severity } from '../../../platform/notification/common/notification.js';
import { IThemeService, registerThemingParticipant } from '../../../platform/theme/common/themeService.js';
import { IAccessibilityService } from '../../../platform/accessibility/common/accessibility.js';
import { MonospaceLineBreaksComputerFactory } from '../../common/viewModel/monospaceLineBreaksComputer.js';
import { DOMLineBreaksComputerFactory } from '../view/domLineBreaksComputer.js';
import { WordOperations } from '../../common/cursor/cursorWordOperations.js';
import { ILanguageConfigurationService } from '../../common/languages/languageConfigurationRegistry.js';
import { applyFontInfo } from '../config/domFontInfo.js';
import { ILanguageFeaturesService } from '../../common/services/languageFeatures.js';
import { CodeEditorContributions } from './codeEditorContributions.js';
import { TabFocus } from '../config/tabFocus.js';
let EDITOR_ID = 0;
class ModelData {
constructor(model, viewModel, view, hasRealView, listenersToRemove, attachedView) {
this.model = model;
this.viewModel = viewModel;
this.view = view;
this.hasRealView = hasRealView;
this.listenersToRemove = listenersToRemove;
this.attachedView = attachedView;
}
dispose() {
dispose(this.listenersToRemove);
this.model.onBeforeDetached(this.attachedView);
if (this.hasRealView) {
this.view.dispose();
}
this.viewModel.dispose();
}
}
let CodeEditorWidget = CodeEditorWidget_1 = class CodeEditorWidget extends Disposable {
//#endregion
get isSimpleWidget() {
return this._configuration.isSimpleWidget;
}
constructor(domElement, _options, codeEditorWidgetOptions, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService) {
var _a;
super();
this.languageConfigurationService = languageConfigurationService;
//#region Eventing
this._deliveryQueue = createEventDeliveryQueue();
this._contributions = this._register(new CodeEditorContributions());
this._onDidDispose = this._register(new Emitter());
this.onDidDispose = this._onDidDispose.event;
this._onDidChangeModelContent = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidChangeModelContent = this._onDidChangeModelContent.event;
this._onDidChangeModelLanguage = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidChangeModelLanguage = this._onDidChangeModelLanguage.event;
this._onDidChangeModelLanguageConfiguration = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidChangeModelLanguageConfiguration = this._onDidChangeModelLanguageConfiguration.event;
this._onDidChangeModelOptions = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidChangeModelOptions = this._onDidChangeModelOptions.event;
this._onDidChangeModelDecorations = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidChangeModelDecorations = this._onDidChangeModelDecorations.event;
this._onDidChangeModelTokens = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidChangeModelTokens = this._onDidChangeModelTokens.event;
this._onDidChangeConfiguration = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidChangeConfiguration = this._onDidChangeConfiguration.event;
this._onWillChangeModel = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onWillChangeModel = this._onWillChangeModel.event;
this._onDidChangeModel = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidChangeModel = this._onDidChangeModel.event;
this._onDidChangeCursorPosition = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidChangeCursorPosition = this._onDidChangeCursorPosition.event;
this._onDidChangeCursorSelection = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidChangeCursorSelection = this._onDidChangeCursorSelection.event;
this._onDidAttemptReadOnlyEdit = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onDidAttemptReadOnlyEdit = this._onDidAttemptReadOnlyEdit.event;
this._onDidLayoutChange = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidLayoutChange = this._onDidLayoutChange.event;
this._editorTextFocus = this._register(new BooleanEventEmitter({ deliveryQueue: this._deliveryQueue }));
this.onDidFocusEditorText = this._editorTextFocus.onDidChangeToTrue;
this.onDidBlurEditorText = this._editorTextFocus.onDidChangeToFalse;
this._editorWidgetFocus = this._register(new BooleanEventEmitter({ deliveryQueue: this._deliveryQueue }));
this.onDidFocusEditorWidget = this._editorWidgetFocus.onDidChangeToTrue;
this.onDidBlurEditorWidget = this._editorWidgetFocus.onDidChangeToFalse;
this._onWillType = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onWillType = this._onWillType.event;
this._onDidType = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onDidType = this._onDidType.event;
this._onDidCompositionStart = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onDidCompositionStart = this._onDidCompositionStart.event;
this._onDidCompositionEnd = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onDidCompositionEnd = this._onDidCompositionEnd.event;
this._onDidPaste = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onDidPaste = this._onDidPaste.event;
this._onMouseUp = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onMouseUp = this._onMouseUp.event;
this._onMouseDown = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onMouseDown = this._onMouseDown.event;
this._onMouseDrag = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onMouseDrag = this._onMouseDrag.event;
this._onMouseDrop = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onMouseDrop = this._onMouseDrop.event;
this._onMouseDropCanceled = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onMouseDropCanceled = this._onMouseDropCanceled.event;
this._onDropIntoEditor = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onDropIntoEditor = this._onDropIntoEditor.event;
this._onContextMenu = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onContextMenu = this._onContextMenu.event;
this._onMouseMove = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onMouseMove = this._onMouseMove.event;
this._onMouseLeave = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onMouseLeave = this._onMouseLeave.event;
this._onMouseWheel = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onMouseWheel = this._onMouseWheel.event;
this._onKeyUp = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onKeyUp = this._onKeyUp.event;
this._onKeyDown = this._register(new InteractionEmitter(this._contributions, this._deliveryQueue));
this.onKeyDown = this._onKeyDown.event;
this._onDidContentSizeChange = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidContentSizeChange = this._onDidContentSizeChange.event;
this._onDidScrollChange = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidScrollChange = this._onDidScrollChange.event;
this._onDidChangeViewZones = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidChangeViewZones = this._onDidChangeViewZones.event;
this._onDidChangeHiddenAreas = this._register(new Emitter({ deliveryQueue: this._deliveryQueue }));
this.onDidChangeHiddenAreas = this._onDidChangeHiddenAreas.event;
this._actions = new Map();
this._bannerDomNode = null;
this._dropIntoEditorDecorations = this.createDecorationsCollection();
codeEditorService.willCreateCodeEditor();
const options = { ..._options };
this._domElement = domElement;
this._overflowWidgetsDomNode = options.overflowWidgetsDomNode;
delete options.overflowWidgetsDomNode;
this._id = (++EDITOR_ID);
this._decorationTypeKeysToIds = {};
this._decorationTypeSubtypes = {};
this._telemetryData = codeEditorWidgetOptions.telemetryData;
this._configuration = this._register(this._createConfiguration(codeEditorWidgetOptions.isSimpleWidget || false, options, accessibilityService));
this._register(this._configuration.onDidChange((e) => {
this._onDidChangeConfiguration.fire(e);
const options = this._configuration.options;
if (e.hasChanged(143 /* EditorOption.layoutInfo */)) {
const layoutInfo = options.get(143 /* EditorOption.layoutInfo */);
this._onDidLayoutChange.fire(layoutInfo);
}
}));
this._contextKeyService = this._register(contextKeyService.createScoped(this._domElement));
this._notificationService = notificationService;
this._codeEditorService = codeEditorService;
this._commandService = commandService;
this._themeService = themeService;
this._register(new EditorContextKeysManager(this, this._contextKeyService));
this._register(new EditorModeContext(this, this._contextKeyService, languageFeaturesService));
this._instantiationService = instantiationService.createChild(new ServiceCollection([IContextKeyService, this._contextKeyService]));
this._modelData = null;
this._focusTracker = new CodeEditorWidgetFocusTracker(domElement, this._overflowWidgetsDomNode);
this._register(this._focusTracker.onChange(() => {
this._editorWidgetFocus.setValue(this._focusTracker.hasFocus());
}));
this._contentWidgets = {};
this._overlayWidgets = {};
this._glyphMarginWidgets = {};
let contributions;
if (Array.isArray(codeEditorWidgetOptions.contributions)) {
contributions = codeEditorWidgetOptions.contributions;
}
else {
contributions = EditorExtensionsRegistry.getEditorContributions();
}
this._contributions.initialize(this, contributions, this._instantiationService);
for (const action of EditorExtensionsRegistry.getEditorActions()) {
if (this._actions.has(action.id)) {
onUnexpectedError(new Error(`Cannot have two actions with the same id ${action.id}`));
continue;
}
const internalAction = new InternalEditorAction(action.id, action.label, action.alias, action.metadata, (_a = action.precondition) !== null && _a !== void 0 ? _a : undefined, (args) => {
return this._instantiationService.invokeFunction((accessor) => {
return Promise.resolve(action.runEditorCommand(accessor, this, args));
});
}, this._contextKeyService);
this._actions.set(internalAction.id, internalAction);
}
const isDropIntoEnabled = () => {
return !this._configuration.options.get(90 /* EditorOption.readOnly */)
&& this._configuration.options.get(36 /* EditorOption.dropIntoEditor */).enabled;
};
this._register(new dom.DragAndDropObserver(this._domElement, {
onDragOver: e => {
if (!isDropIntoEnabled()) {
return;
}
const target = this.getTargetAtClientPoint(e.clientX, e.clientY);
if (target === null || target === void 0 ? void 0 : target.position) {
this.showDropIndicatorAt(target.position);
}
},
onDrop: async (e) => {
if (!isDropIntoEnabled()) {
return;
}
this.removeDropIndicator();
if (!e.dataTransfer) {
return;
}
const target = this.getTargetAtClientPoint(e.clientX, e.clientY);
if (target === null || target === void 0 ? void 0 : target.position) {
this._onDropIntoEditor.fire({ position: target.position, event: e });
}
},
onDragLeave: () => {
this.removeDropIndicator();
},
onDragEnd: () => {
this.removeDropIndicator();
},
}));
this._codeEditorService.addCodeEditor(this);
}
writeScreenReaderContent(reason) {
var _a;
(_a = this._modelData) === null || _a === void 0 ? void 0 : _a.view.writeScreenReaderContent(reason);
}
_createConfiguration(isSimpleWidget, options, accessibilityService) {
return new EditorConfiguration(isSimpleWidget, options, this._domElement, accessibilityService);
}
getId() {
return this.getEditorType() + ':' + this._id;
}
getEditorType() {
return editorCommon.EditorType.ICodeEditor;
}
dispose() {
this._codeEditorService.removeCodeEditor(this);
this._focusTracker.dispose();
this._actions.clear();
this._contentWidgets = {};
this._overlayWidgets = {};
this._removeDecorationTypes();
this._postDetachModelCleanup(this._detachModel());
this._onDidDispose.fire();
super.dispose();
}
invokeWithinContext(fn) {
return this._instantiationService.invokeFunction(fn);
}
updateOptions(newOptions) {
this._configuration.updateOptions(newOptions || {});
}
getOptions() {
return this._configuration.options;
}
getOption(id) {
return this._configuration.options.get(id);
}
getRawOptions() {
return this._configuration.getRawOptions();
}
getOverflowWidgetsDomNode() {
return this._overflowWidgetsDomNode;
}
getConfiguredWordAtPosition(position) {
if (!this._modelData) {
return null;
}
return WordOperations.getWordAtPosition(this._modelData.model, this._configuration.options.get(129 /* EditorOption.wordSeparators */), position);
}
getValue(options = null) {
if (!this._modelData) {
return '';
}
const preserveBOM = (options && options.preserveBOM) ? true : false;
let eolPreference = 0 /* EndOfLinePreference.TextDefined */;
if (options && options.lineEnding && options.lineEnding === '\n') {
eolPreference = 1 /* EndOfLinePreference.LF */;
}
else if (options && options.lineEnding && options.lineEnding === '\r\n') {
eolPreference = 2 /* EndOfLinePreference.CRLF */;
}
return this._modelData.model.getValue(eolPreference, preserveBOM);
}
setValue(newValue) {
if (!this._modelData) {
return;
}
this._modelData.model.setValue(newValue);
}
getModel() {
if (!this._modelData) {
return null;
}
return this._modelData.model;
}
setModel(_model = null) {
var _a;
const model = _model;
if (this._modelData === null && model === null) {
// Current model is the new model
return;
}
if (this._modelData && this._modelData.model === model) {
// Current model is the new model
return;
}
const e = {
oldModelUrl: ((_a = this._modelData) === null || _a === void 0 ? void 0 : _a.model.uri) || null,
newModelUrl: (model === null || model === void 0 ? void 0 : model.uri) || null
};
this._onWillChangeModel.fire(e);
const hasTextFocus = this.hasTextFocus();
const detachedModel = this._detachModel();
this._attachModel(model);
if (hasTextFocus && this.hasModel()) {
this.focus();
}
this._removeDecorationTypes();
this._onDidChangeModel.fire(e);
this._postDetachModelCleanup(detachedModel);
this._contributions.onAfterModelAttached();
}
_removeDecorationTypes() {
this._decorationTypeKeysToIds = {};
if (this._decorationTypeSubtypes) {
for (const decorationType in this._decorationTypeSubtypes) {
const subTypes = this._decorationTypeSubtypes[decorationType];
for (const subType in subTypes) {
this._removeDecorationType(decorationType + '-' + subType);
}
}
this._decorationTypeSubtypes = {};
}
}
getVisibleRanges() {
if (!this._modelData) {
return [];
}
return this._modelData.viewModel.getVisibleRanges();
}
getVisibleRangesPlusViewportAboveBelow() {
if (!this._modelData) {
return [];
}
return this._modelData.viewModel.getVisibleRangesPlusViewportAboveBelow();
}
getWhitespaces() {
if (!this._modelData) {
return [];
}
return this._modelData.viewModel.viewLayout.getWhitespaces();
}
static _getVerticalOffsetAfterPosition(modelData, modelLineNumber, modelColumn, includeViewZones) {
const modelPosition = modelData.model.validatePosition({
lineNumber: modelLineNumber,
column: modelColumn
});
const viewPosition = modelData.viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition);
return modelData.viewModel.viewLayout.getVerticalOffsetAfterLineNumber(viewPosition.lineNumber, includeViewZones);
}
getTopForLineNumber(lineNumber, includeViewZones = false) {
if (!this._modelData) {
return -1;
}
return CodeEditorWidget_1._getVerticalOffsetForPosition(this._modelData, lineNumber, 1, includeViewZones);
}
getTopForPosition(lineNumber, column) {
if (!this._modelData) {
return -1;
}
return CodeEditorWidget_1._getVerticalOffsetForPosition(this._modelData, lineNumber, column, false);
}
static _getVerticalOffsetForPosition(modelData, modelLineNumber, modelColumn, includeViewZones = false) {
const modelPosition = modelData.model.validatePosition({
lineNumber: modelLineNumber,
column: modelColumn
});
const viewPosition = modelData.viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition);
return modelData.viewModel.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber, includeViewZones);
}
getBottomForLineNumber(lineNumber, includeViewZones = false) {
if (!this._modelData) {
return -1;
}
return CodeEditorWidget_1._getVerticalOffsetAfterPosition(this._modelData, lineNumber, 1, includeViewZones);
}
setHiddenAreas(ranges, source) {
var _a;
(_a = this._modelData) === null || _a === void 0 ? void 0 : _a.viewModel.setHiddenAreas(ranges.map(r => Range.lift(r)), source);
}
getVisibleColumnFromPosition(rawPosition) {
if (!this._modelData) {
return rawPosition.column;
}
const position = this._modelData.model.validatePosition(rawPosition);
const tabSize = this._modelData.model.getOptions().tabSize;
return CursorColumns.visibleColumnFromColumn(this._modelData.model.getLineContent(position.lineNumber), position.column, tabSize) + 1;
}
getPosition() {
if (!this._modelData) {
return null;
}
return this._modelData.viewModel.getPosition();
}
setPosition(position, source = 'api') {
if (!this._modelData) {
return;
}
if (!Position.isIPosition(position)) {
throw new Error('Invalid arguments');
}
this._modelData.viewModel.setSelections(source, [{
selectionStartLineNumber: position.lineNumber,
selectionStartColumn: position.column,
positionLineNumber: position.lineNumber,
positionColumn: position.column
}]);
}
_sendRevealRange(modelRange, verticalType, revealHorizontal, scrollType) {
if (!this._modelData) {
return;
}
if (!Range.isIRange(modelRange)) {
throw new Error('Invalid arguments');
}
const validatedModelRange = this._modelData.model.validateRange(modelRange);
const viewRange = this._modelData.viewModel.coordinatesConverter.convertModelRangeToViewRange(validatedModelRange);
this._modelData.viewModel.revealRange('api', revealHorizontal, viewRange, verticalType, scrollType);
}
revealLine(lineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealLine(lineNumber, 0 /* VerticalRevealType.Simple */, scrollType);
}
revealLineInCenter(lineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealLine(lineNumber, 1 /* VerticalRevealType.Center */, scrollType);
}
revealLineInCenterIfOutsideViewport(lineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealLine(lineNumber, 2 /* VerticalRevealType.CenterIfOutsideViewport */, scrollType);
}
revealLineNearTop(lineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealLine(lineNumber, 5 /* VerticalRevealType.NearTop */, scrollType);
}
_revealLine(lineNumber, revealType, scrollType) {
if (typeof lineNumber !== 'number') {
throw new Error('Invalid arguments');
}
this._sendRevealRange(new Range(lineNumber, 1, lineNumber, 1), revealType, false, scrollType);
}
revealPosition(position, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealPosition(position, 0 /* VerticalRevealType.Simple */, true, scrollType);
}
revealPositionInCenter(position, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealPosition(position, 1 /* VerticalRevealType.Center */, true, scrollType);
}
revealPositionInCenterIfOutsideViewport(position, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealPosition(position, 2 /* VerticalRevealType.CenterIfOutsideViewport */, true, scrollType);
}
revealPositionNearTop(position, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealPosition(position, 5 /* VerticalRevealType.NearTop */, true, scrollType);
}
_revealPosition(position, verticalType, revealHorizontal, scrollType) {
if (!Position.isIPosition(position)) {
throw new Error('Invalid arguments');
}
this._sendRevealRange(new Range(position.lineNumber, position.column, position.lineNumber, position.column), verticalType, revealHorizontal, scrollType);
}
getSelection() {
if (!this._modelData) {
return null;
}
return this._modelData.viewModel.getSelection();
}
getSelections() {
if (!this._modelData) {
return null;
}
return this._modelData.viewModel.getSelections();
}
setSelection(something, source = 'api') {
const isSelection = Selection.isISelection(something);
const isRange = Range.isIRange(something);
if (!isSelection && !isRange) {
throw new Error('Invalid arguments');
}
if (isSelection) {
this._setSelectionImpl(something, source);
}
else if (isRange) {
// act as if it was an IRange
const selection = {
selectionStartLineNumber: something.startLineNumber,
selectionStartColumn: something.startColumn,
positionLineNumber: something.endLineNumber,
positionColumn: something.endColumn
};
this._setSelectionImpl(selection, source);
}
}
_setSelectionImpl(sel, source) {
if (!this._modelData) {
return;
}
const selection = new Selection(sel.selectionStartLineNumber, sel.selectionStartColumn, sel.positionLineNumber, sel.positionColumn);
this._modelData.viewModel.setSelections(source, [selection]);
}
revealLines(startLineNumber, endLineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealLines(startLineNumber, endLineNumber, 0 /* VerticalRevealType.Simple */, scrollType);
}
revealLinesInCenter(startLineNumber, endLineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealLines(startLineNumber, endLineNumber, 1 /* VerticalRevealType.Center */, scrollType);
}
revealLinesInCenterIfOutsideViewport(startLineNumber, endLineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealLines(startLineNumber, endLineNumber, 2 /* VerticalRevealType.CenterIfOutsideViewport */, scrollType);
}
revealLinesNearTop(startLineNumber, endLineNumber, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealLines(startLineNumber, endLineNumber, 5 /* VerticalRevealType.NearTop */, scrollType);
}
_revealLines(startLineNumber, endLineNumber, verticalType, scrollType) {
if (typeof startLineNumber !== 'number' || typeof endLineNumber !== 'number') {
throw new Error('Invalid arguments');
}
this._sendRevealRange(new Range(startLineNumber, 1, endLineNumber, 1), verticalType, false, scrollType);
}
revealRange(range, scrollType = 0 /* editorCommon.ScrollType.Smooth */, revealVerticalInCenter = false, revealHorizontal = true) {
this._revealRange(range, revealVerticalInCenter ? 1 /* VerticalRevealType.Center */ : 0 /* VerticalRevealType.Simple */, revealHorizontal, scrollType);
}
revealRangeInCenter(range, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealRange(range, 1 /* VerticalRevealType.Center */, true, scrollType);
}
revealRangeInCenterIfOutsideViewport(range, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealRange(range, 2 /* VerticalRevealType.CenterIfOutsideViewport */, true, scrollType);
}
revealRangeNearTop(range, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealRange(range, 5 /* VerticalRevealType.NearTop */, true, scrollType);
}
revealRangeNearTopIfOutsideViewport(range, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealRange(range, 6 /* VerticalRevealType.NearTopIfOutsideViewport */, true, scrollType);
}
revealRangeAtTop(range, scrollType = 0 /* editorCommon.ScrollType.Smooth */) {
this._revealRange(range, 3 /* VerticalRevealType.Top */, true, scrollType);
}
_revealRange(range, verticalType, revealHorizontal, scrollType) {
if (!Range.isIRange(range)) {
throw new Error('Invalid arguments');
}
this._sendRevealRange(Range.lift(range), verticalType, revealHorizontal, scrollType);
}
setSelections(ranges, source = 'api', reason = 0 /* CursorChangeReason.NotSet */) {
if (!this._modelData) {
return;
}
if (!ranges || ranges.length === 0) {
throw new Error('Invalid arguments');
}
for (let i = 0, len = ranges.length; i < len; i++) {
if (!Selection.isISelection(ranges[i])) {
throw new Error('Invalid arguments');
}
}
this._modelData.viewModel.setSelections(source, ranges, reason);
}
getContentWidth() {
if (!this._modelData) {
return -1;
}
return this._modelData.viewModel.viewLayout.getContentWidth();
}
getScrollWidth() {
if (!this._modelData) {
return -1;
}
return this._modelData.viewModel.viewLayout.getScrollWidth();
}
getScrollLeft() {
if (!this._modelData) {
return -1;
}
return this._modelData.viewModel.viewLayout.getCurrentScrollLeft();
}
getContentHeight() {
if (!this._modelData) {
return -1;
}
return this._modelData.viewModel.viewLayout.getContentHeight();
}
getScrollHeight() {
if (!this._modelData) {
return -1;
}
return this._modelData.viewModel.viewLayout.getScrollHeight();
}
getScrollTop() {
if (!this._modelData) {
return -1;
}
return this._modelData.viewModel.viewLayout.getCurrentScrollTop();
}
setScrollLeft(newScrollLeft, scrollType = 1 /* editorCommon.ScrollType.Immediate */) {
if (!this._modelData) {
return;
}
if (typeof newScrollLeft !== 'number') {
throw new Error('Invalid arguments');
}
this._modelData.viewModel.viewLayout.setScrollPosition({
scrollLeft: newScrollLeft
}, scrollType);
}
setScrollTop(newScrollTop, scrollType = 1 /* editorCommon.ScrollType.Immediate */) {
if (!this._modelData) {
return;
}
if (typeof newScrollTop !== 'number') {
throw new Error('Invalid arguments');
}
this._modelData.viewModel.viewLayout.setScrollPosition({
scrollTop: newScrollTop
}, scrollType);
}
setScrollPosition(position, scrollType = 1 /* editorCommon.ScrollType.Immediate */) {
if (!this._modelData) {
return;
}
this._modelData.viewModel.viewLayout.setScrollPosition(position, scrollType);
}
hasPendingScrollAnimation() {
if (!this._modelData) {
return false;
}
return this._modelData.viewModel.viewLayout.hasPendingScrollAnimation();
}
saveViewState() {
if (!this._modelData) {
return null;
}
const contributionsState = this._contributions.saveViewState();
const cursorState = this._modelData.viewModel.saveCursorState();
const viewState = this._modelData.viewModel.saveState();
return {
cursorState: cursorState,
viewState: viewState,
contributionsState: contributionsState
};
}
restoreViewState(s) {
if (!this._modelData || !this._modelData.hasRealView) {
return;
}
const codeEditorState = s;
if (codeEditorState && codeEditorState.cursorState && codeEditorState.viewState) {
const cursorState = codeEditorState.cursorState;
if (Array.isArray(cursorState)) {
if (cursorState.length > 0) {
this._modelData.viewModel.restoreCursorState(cursorState);
}
}
else {
// Backwards compatibility
this._modelData.viewModel.restoreCursorState([cursorState]);
}
this._contributions.restoreViewState(codeEditorState.contributionsState || {});
const reducedState = this._modelData.viewModel.reduceRestoreState(codeEditorState.viewState);
this._modelData.view.restoreState(reducedState);
}
}
handleInitialized() {
var _a;
(_a = this._getViewModel()) === null || _a === void 0 ? void 0 : _a.visibleLinesStabilized();
}
getContribution(id) {
return this._contributions.get(id);
}
getActions() {
return Array.from(this._actions.values());
}
getSupportedActions() {
let result = this.getActions();
result = result.filter(action => action.isSupported());
return result;
}
getAction(id) {
return this._actions.get(id) || null;
}
trigger(source, handlerId, payload) {
payload = payload || {};
switch (handlerId) {
case "compositionStart" /* editorCommon.Handler.CompositionStart */:
this._startComposition();
return;
case "compositionEnd" /* editorCommon.Handler.CompositionEnd */:
this._endComposition(source);
return;
case "type" /* editorCommon.Handler.Type */: {
const args = payload;
this._type(source, args.text || '');
return;
}
case "replacePreviousChar" /* editorCommon.Handler.ReplacePreviousChar */: {
const args = payload;
this._compositionType(source, args.text || '', args.replaceCharCnt || 0, 0, 0);
return;
}
case "compositionType" /* editorCommon.Handler.CompositionType */: {
const args = payload;
this._compositionType(source, args.text || '', args.replacePrevCharCnt || 0, args.replaceNextCharCnt || 0, args.positionDelta || 0);
return;
}
case "paste" /* editorCommon.Handler.Paste */: {
const args = payload;
this._paste(source, args.text || '', args.pasteOnNewLine || false, args.multicursorText || null, args.mode || null);
return;
}
case "cut" /* editorCommon.Handler.Cut */:
this._cut(source);
return;
}
const action = this.getAction(handlerId);
if (action) {
Promise.resolve(action.run(payload)).then(undefined, onUnexpectedError);
return;
}
if (!this._modelData) {
return;
}
if (this._triggerEditorCommand(source, handlerId, payload)) {
return;
}
this._triggerCommand(handlerId, payload);
}
_triggerCommand(handlerId, payload) {
this._commandService.executeCommand(handlerId, payload);
}
_startComposition() {
if (!this._modelData) {
return;
}
this._modelData.viewModel.startComposition();
this._onDidCompositionStart.fire();
}
_endComposition(source) {
if (!this._modelData) {
return;
}
this._modelData.viewModel.endComposition(source);
this._onDidCompositionEnd.fire();
}
_type(source, text) {
if (!this._modelData || text.length === 0) {
return;
}
if (source === 'keyboard') {
this._onWillType.fire(text);
}
this._modelData.viewModel.type(text, source);
if (source === 'keyboard') {
this._onDidType.fire(text);
}
}
_compositionType(source, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta) {
if (!this._modelData) {
return;
}
this._modelData.viewModel.compositionType(text, replacePrevCharCnt, replaceNextCharCnt, positionDelta, source);
}
_paste(source, text, pasteOnNewLine, multicursorText, mode) {
if (!this._modelData || text.length === 0) {
return;
}
const viewModel = this._modelData.viewModel;
const startPosition = viewModel.getSelection().getStartPosition();
viewModel.paste(text, pasteOnNewLine, multicursorText, source);
const endPosition = viewModel.getSelection().getStartPosition();
if (source === 'keyboard') {
this._onDidPaste.fire({
range: new Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column),
languageId: mode
});
}
}
_cut(source) {
if (!this._modelData) {
return;
}
this._modelData.viewModel.cut(source);
}
_triggerEditorCommand(source, handlerId, payload) {
const command = EditorExtensionsRegistry.getEditorCommand(handlerId);
if (command) {
payload = payload || {};
payload.source = source;
this._instantiationService.invokeFunction((accessor) => {
Promise.resolve(command.runEditorCommand(accessor, this, payload)).then(undefined, onUnexpectedError);
});
return true;
}
return false;
}
_getViewModel() {
if (!this._modelData) {
return null;
}
return this._modelData.viewModel;
}
pushUndoStop() {
if (!this._modelData) {
return false;
}
if (this._configuration.options.get(90 /* EditorOption.readOnly */)) {
// read only editor => sorry!
return false;
}
this._modelData.model.pushStackElement();
return true;
}
popUndoStop() {
if (!this._modelData) {
return false;
}
if (this._configuration.options.get(90 /* EditorOption.readOnly */)) {
// read only editor => sorry!
return false;
}
this._modelData.model.popStackElement();
return true;
}
executeEdits(source, edits, endCursorState) {
if (!this._modelData) {
return false;
}
if (this._configuration.options.get(90 /* EditorOption.readOnly */)) {
// read only editor => sorry!
return false;
}
let cursorStateComputer;
if (!endCursorState) {
cursorStateComputer = () => null;
}
else if (Array.isArray(endCursorState)) {
cursorStateComputer = () => endCursorState;
}
else {
cursorStateComputer = endCursorState;
}
this._modelData.viewModel.executeEdits(source, edits, cursorStateComputer);
return true;
}
executeCommand(source, command) {
if (!this._modelData) {
return;
}
this._modelData.viewModel.executeCommand(command, source);
}
executeCommands(source, commands) {
if (!this._modelData) {
return;
}
this._modelData.viewModel.executeCommands(commands, source);
}
createDecorationsCollection(decorations) {
return new EditorDecorationsCollection(this, decorations);
}
changeDecorations(callback) {
if (!this._modelData) {
// callback will not be called
return null;
}
return this._modelData.model.changeDecorations(callback, this._id);
}
getLineDecorations(lineNumber) {
if (!this._modelData) {
return null;
}
return this._modelData.model.getLineDecorations(lineNumber, this._id, filterValidationDecorations(this._configuration.options));
}
getDecorationsInRange(range) {
if (!this._modelData) {
return null;
}
return this._modelData.model.getDecorationsInRange(range, this._id, filterValidationDecorations(this._configuration.options));
}
/**
* @deprecated
*/
deltaDecorations(oldDecorations, newDecorations) {
if (!this._modelData) {
return [];
}
if (oldDecorations.length === 0 && newDecorations.length === 0) {
return oldDecorations;
}
return this._modelData.model.deltaDecorations(oldDecorations, newDecorations, this._id);
}
removeDecorations(decorationIds) {
if (!this._modelData || decorationIds.length === 0) {
return;
}
this._modelData.model.changeDecorations((changeAccessor) => {
changeAccessor.deltaDecorations(decorationIds, []);
});
}
removeDecorationsByType(decorationTypeKey) {
// remove decorations for type and sub type
const oldDecorationsIds = this._decorationTypeKeysToIds[decorationTypeKey];
if (oldDecorationsIds) {
this.deltaDecorations(oldDecorationsIds, []);
}
if (this._decorationTypeKeysToIds.hasOwnProperty(decorationTypeKey)) {
delete this._decorationTypeKeysToIds[decorationTypeKey];
}
if (this._decorationTypeSubtypes.hasOwnProperty(decorationTypeKey)) {
delete this._decorationTypeSubtypes[decorationTypeKey];
}
}
getLayoutInfo() {
const options = this._configuration.options;
const layoutInfo = options.get(143 /* EditorOption.layoutInfo */);
return layoutInfo;
}
createOverviewRuler(cssClassName) {
if (!this._modelData || !this._modelData.hasRealView) {
return null;
}
return this._modelData.view.createOverviewRuler(cssClassName);
}
getContainerDomNode() {
return this._domElement;
}
getDomNode() {
if (!this._modelData || !this._modelData.hasRealView) {
return null;
}
return this._modelData.view.domNode.domNode;
}
delegateVerticalScrollbarPointerDown(browserEvent) {
if (!this._modelData || !this._modelData.hasRealView) {
return;
}
this._modelData.view.delegateVerticalScrollbarPointerDown(browserEvent);
}
delegateScrollFromMouseWheelEvent(browserEvent) {
if (!this._modelData || !this._modelData.hasRealView) {
return;
}
this._modelData.view.delegateScrollFromMouseWheelEvent(browserEvent);
}
layout(dimension, postponeRendering = false) {
this._configuration.observeContainer(dimension);
if (!postponeRendering) {
this.render();
}
}
focus() {
if (!this._modelData || !this._modelData.hasRealView) {
return;
}
this._modelData.view.focus();
}
hasTextFocus() {
if (!this._modelData || !this._modelData.hasRealView) {
return false;
}
return this._modelData.view.isFocused();
}
hasWidgetFocus() {
return this._focusTracker && this._focusTracker.hasFocus();
}
addContentWidget(widget) {
const widgetData = {
widget: widget,
position: widget.getPosition()
};
if (this._contentWidgets.hasOwnProperty(widget.getId())) {
console.warn('Overwriting a content widget with the same id:' + widget.getId());
}
this._contentWidgets[widget.getId()] = widgetData;
if (this._modelData && this._modelData.hasRealView) {
this._modelData.view.addContentWidget(widgetData);
}
}
layoutContentWidget(widget) {
const widgetId = widget.getId();
if (this._contentWidgets.hasOwnProperty(widgetId)) {
const widgetData = this._contentWidgets[widgetId];
widgetData.position = widget.getPosition();
if (this._modelData && this._modelData.hasRealView) {
this._modelData.view.layoutContentWidget(widgetData);
}
}
}
removeContentWidget(widget) {
const widgetId = widget.getId();
if (this._contentWidgets.hasOwnProperty(widgetId)) {
const widgetData = this._contentWidgets[widgetId];
delete this._contentWidgets[widgetId];
if (this._modelData && this._modelData.hasRealView) {
this._modelData.view.removeContentWidget(widgetData);
}
}
}
addOverlayWidget(widget) {
const widgetData = {
widget: widget,
position: widget.getPosition()
};
if (this._overlayWidgets.hasOwnProperty(widget.getId())) {
console.warn('Overwriting an overlay widget with the same id.');
}
this._overlayWidgets[widget.getId()] = widgetData;
if (this._modelData && this._modelData.hasRealView) {
this._modelData.view.addOverlayWidget(widgetData);
}
}
layoutOverlayWidget(widget) {
const widgetId = widget.getId();
if (this._overlayWidgets.hasOwnProperty(widgetId)) {
const widgetData = this._overlayWidgets[widgetId];
widgetData.position = widget.getPosition();
if (this._modelData && this._modelData.hasRealView) {
this._modelData.view.layoutOverlayWidget(widgetData);
}
}
}
removeOverlayWidget(widget) {
const widgetId = widget.getId();
if (this._overlayWidgets.hasOwnProperty(widgetId)) {
const widgetData = this._overlayWidgets[widgetId];
delete this._overlayWidgets[widgetId];
if (this._modelData && this._modelData.hasRealView) {
this._modelData.view.removeOverlayWidget(widgetData);
}
}
}
addGlyphMarginWidget(widget) {
const widgetData = {
widget: widget,
position: widget.getPosition()
};
if (this._glyphMarginWidgets.hasOwnProperty(widget.getId())) {
console.warn('Overwriting a glyph margin widget with the same id.');
}
this._glyphMarginWidgets[widget.getId()] = widgetData;
if (this._modelData && this._modelData.hasRealView) {
this._modelData.view.addGlyphMarginWidget(widgetData);
}
}
layoutGlyphMarginWidget(widget) {
const widgetId = widget.getId();
if (this._glyphMarginWidgets.hasOwnProperty(widgetId)) {
const widgetData = this._glyphMarginWidgets[widgetId];
widgetData.position = widget.getPosition();
if (this._modelData && this._modelData.hasRealView) {
this._modelData.view.layoutGlyphMarginWidget(widgetData);
}
}
}
removeGlyphMarginWidget(widget) {
const widgetId = widget.getId();
if (this._glyphMarginWidgets.hasOwnProperty(widgetId)) {
const widgetData = this._glyphMarginWidgets[widgetId];
delete this._glyphMarginWidgets[widgetId];