Path: blob/main/src/vs/editor/standalone/browser/standaloneCodeEditorService.ts
3294 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { windowOpenNoOpener } from '../../../base/browser/dom.js';6import { Schemas } from '../../../base/common/network.js';7import { URI } from '../../../base/common/uri.js';8import { ICodeEditor } from '../../browser/editorBrowser.js';9import { AbstractCodeEditorService } from '../../browser/services/abstractCodeEditorService.js';10import { ICodeEditorService } from '../../browser/services/codeEditorService.js';11import { IRange } from '../../common/core/range.js';12import { ScrollType } from '../../common/editorCommon.js';13import { ITextModel } from '../../common/model.js';14import { IContextKey, IContextKeyService } from '../../../platform/contextkey/common/contextkey.js';15import { ITextResourceEditorInput } from '../../../platform/editor/common/editor.js';16import { InstantiationType, registerSingleton } from '../../../platform/instantiation/common/extensions.js';17import { IThemeService } from '../../../platform/theme/common/themeService.js';1819export class StandaloneCodeEditorService extends AbstractCodeEditorService {2021private readonly _editorIsOpen: IContextKey<boolean>;22private _activeCodeEditor: ICodeEditor | null;2324constructor(25@IContextKeyService contextKeyService: IContextKeyService,26@IThemeService themeService: IThemeService,27) {28super(themeService);29this._register(this.onCodeEditorAdd(() => this._checkContextKey()));30this._register(this.onCodeEditorRemove(() => this._checkContextKey()));31this._editorIsOpen = contextKeyService.createKey('editorIsOpen', false);32this._activeCodeEditor = null;3334this._register(this.registerCodeEditorOpenHandler(async (input, source, sideBySide) => {35if (!source) {36return null;37}38return this.doOpenEditor(source, input);39}));40}4142private _checkContextKey(): void {43let hasCodeEditor = false;44for (const editor of this.listCodeEditors()) {45if (!editor.isSimpleWidget) {46hasCodeEditor = true;47break;48}49}50this._editorIsOpen.set(hasCodeEditor);51}5253public setActiveCodeEditor(activeCodeEditor: ICodeEditor | null): void {54this._activeCodeEditor = activeCodeEditor;55}5657public getActiveCodeEditor(): ICodeEditor | null {58return this._activeCodeEditor;59}606162private doOpenEditor(editor: ICodeEditor, input: ITextResourceEditorInput): ICodeEditor | null {63const model = this.findModel(editor, input.resource);64if (!model) {65if (input.resource) {6667const schema = input.resource.scheme;68if (schema === Schemas.http || schema === Schemas.https) {69// This is a fully qualified http or https URL70windowOpenNoOpener(input.resource.toString());71return editor;72}73}74return null;75}7677const selection = <IRange>(input.options ? input.options.selection : null);78if (selection) {79if (typeof selection.endLineNumber === 'number' && typeof selection.endColumn === 'number') {80editor.setSelection(selection);81editor.revealRangeInCenter(selection, ScrollType.Immediate);82} else {83const pos = {84lineNumber: selection.startLineNumber,85column: selection.startColumn86};87editor.setPosition(pos);88editor.revealPositionInCenter(pos, ScrollType.Immediate);89}90}9192return editor;93}9495private findModel(editor: ICodeEditor, resource: URI): ITextModel | null {96const model = editor.getModel();97if (model && model.uri.toString() !== resource.toString()) {98return null;99}100101return model;102}103}104105registerSingleton(ICodeEditorService, StandaloneCodeEditorService, InstantiationType.Eager);106107108