diff --git a/src/vs/editor/browser/standalone/standaloneCodeEditor.ts b/src/vs/editor/browser/standalone/standaloneCodeEditor.ts index 9fe1a25c9b5d1a8f7d1dda39fc2c4227384862bb..be7fa17d0ac0a6c01f921941573897e8b0642ec7 100644 --- a/src/vs/editor/browser/standalone/standaloneCodeEditor.ts +++ b/src/vs/editor/browser/standalone/standaloneCodeEditor.ts @@ -280,14 +280,15 @@ export class StandaloneDiffEditor extends DiffEditorWidget implements IStandalon @IKeybindingService keybindingService: IKeybindingService, @IContextViewService contextViewService: IContextViewService, @IStandaloneThemeService standaloneColorService: IStandaloneThemeService, - @IEditorWorkerService editorWorkerService: IEditorWorkerService + @IEditorWorkerService editorWorkerService: IEditorWorkerService, + @ICodeEditorService codeEditorService: ICodeEditorService ) { options = options || {}; if (typeof options.theme === 'string') { options.theme = standaloneColorService.setTheme(options.theme); } - super(domElement, options, editorWorkerService, contextKeyService, instantiationService); + super(domElement, options, editorWorkerService, contextKeyService, instantiationService, codeEditorService); if (keybindingService instanceof StandaloneKeybindingService) { this._standaloneKeybindingService = keybindingService; diff --git a/src/vs/editor/browser/standalone/standaloneEditor.ts b/src/vs/editor/browser/standalone/standaloneEditor.ts index 6478d3c8ffabcdbc0fced9e45ed7304b0339bbe8..35231e618ade69df2c0b7f12c839808c03f72aea 100644 --- a/src/vs/editor/browser/standalone/standaloneEditor.ts +++ b/src/vs/editor/browser/standalone/standaloneEditor.ts @@ -124,7 +124,8 @@ export function createDiffEditor(domElement: HTMLElement, options?: IDiffEditorC services.get(IKeybindingService), services.get(IContextViewService), services.get(IStandaloneThemeService), - services.get(IEditorWorkerService) + services.get(IEditorWorkerService), + services.get(ICodeEditorService) ); }); } diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index ed727bb7bcf527bfe61c4f0a0f7b98f448ecaf13..6756bd1d61066ff620a8419b7584df282cab3e73 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -15,6 +15,7 @@ import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { ISashEvent, IVerticalSashLayoutProvider, Sash } from 'vs/base/browser/ui/sash/sash'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; import { DefaultConfig } from 'vs/editor/common/config/defaultConfig'; import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; @@ -204,16 +205,19 @@ export class DiffEditorWidget extends EventEmitter implements editorBrowser.IDif private _editorWorkerService: IEditorWorkerService; protected _contextKeyService: IContextKeyService; + private _codeEditorService: ICodeEditorService; constructor( domElement: HTMLElement, options: editorCommon.IDiffEditorOptions, @IEditorWorkerService editorWorkerService: IEditorWorkerService, @IContextKeyService contextKeyService: IContextKeyService, - @IInstantiationService instantiationService: IInstantiationService + @IInstantiationService instantiationService: IInstantiationService, + @ICodeEditorService codeEditorService: ICodeEditorService ) { super(); this._editorWorkerService = editorWorkerService; + this._codeEditorService = codeEditorService; this._contextKeyService = contextKeyService.createScoped(domElement); this._contextKeyService.createKey('isInDiffEditor', true); @@ -314,6 +318,8 @@ export class DiffEditorWidget extends EventEmitter implements editorBrowser.IDif } else { this._setStrategy(new DiffEdtorWidgetInline(this._createDataSource(), this._enableSplitViewResizing)); } + + this._codeEditorService.addDiffEditor(this); } public get ignoreTrimWhitespace(): boolean { @@ -392,6 +398,8 @@ export class DiffEditorWidget extends EventEmitter implements editorBrowser.IDif } public dispose(): void { + this._codeEditorService.removeDiffEditor(this); + this._toDispose = dispose(this._toDispose); window.clearInterval(this._measureDomElementToken); diff --git a/src/vs/editor/common/services/abstractCodeEditorService.ts b/src/vs/editor/common/services/abstractCodeEditorService.ts index e84f7666e371b80fdc15812e9495d796bb6c57ea..d45c5f92b48de15995875085a6f6cf6e3a2662b3 100644 --- a/src/vs/editor/common/services/abstractCodeEditorService.ts +++ b/src/vs/editor/common/services/abstractCodeEditorService.ts @@ -5,51 +5,85 @@ 'use strict'; import Event, { Emitter } from 'vs/base/common/event'; -import { ICommonCodeEditor, IDecorationRenderOptions, IModelDecorationOptions } from 'vs/editor/common/editorCommon'; +import { ICommonCodeEditor, ICommonDiffEditor, IDecorationRenderOptions, IModelDecorationOptions } from 'vs/editor/common/editorCommon'; import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; export abstract class AbstractCodeEditorService implements ICodeEditorService { - public _serviceBrand: any; + + _serviceBrand: any; + private _onCodeEditorAdd: Emitter; private _onCodeEditorRemove: Emitter; - private _codeEditors: { - [editorId: string]: ICommonCodeEditor; - }; + private _codeEditors: { [editorId: string]: ICommonCodeEditor; }; + + private _onDiffEditorAdd: Emitter; + private _onDiffEditorRemove: Emitter; + private _diffEditors: { [editorId: string]: ICommonDiffEditor; }; constructor() { this._codeEditors = Object.create(null); + this._diffEditors = Object.create(null); this._onCodeEditorAdd = new Emitter(); this._onCodeEditorRemove = new Emitter(); + this._onDiffEditorAdd = new Emitter(); + this._onDiffEditorRemove = new Emitter(); } - public addCodeEditor(editor: ICommonCodeEditor): void { + addCodeEditor(editor: ICommonCodeEditor): void { this._codeEditors[editor.getId()] = editor; this._onCodeEditorAdd.fire(editor); } - public get onCodeEditorAdd(): Event { + get onCodeEditorAdd(): Event { return this._onCodeEditorAdd.event; } - public removeCodeEditor(editor: ICommonCodeEditor): void { + removeCodeEditor(editor: ICommonCodeEditor): void { if (delete this._codeEditors[editor.getId()]) { this._onCodeEditorRemove.fire(editor); } } - public get onCodeEditorRemove(): Event { + get onCodeEditorRemove(): Event { return this._onCodeEditorRemove.event; } - public getCodeEditor(editorId: string): ICommonCodeEditor { + getCodeEditor(editorId: string): ICommonCodeEditor { return this._codeEditors[editorId] || null; } - public listCodeEditors(): ICommonCodeEditor[] { + listCodeEditors(): ICommonCodeEditor[] { return Object.keys(this._codeEditors).map(id => this._codeEditors[id]); } - public getFocusedCodeEditor(): ICommonCodeEditor { + addDiffEditor(editor: ICommonDiffEditor): void { + this._diffEditors[editor.getId()] = editor; + this._onDiffEditorAdd.fire(editor); + } + + get onDiffEditorAdd(): Event { + return this._onDiffEditorAdd.event; + } + + removeDiffEditor(editor: ICommonDiffEditor): void { + if (delete this._diffEditors[editor.getId()]) { + this._onDiffEditorRemove.fire(editor); + } + } + + get onDiffEditorRemove(): Event { + return this._onDiffEditorRemove.event; + } + + getDiffEditor(editorId: string): ICommonDiffEditor { + return this._diffEditors[editorId] || null; + } + + listDiffEditors(): ICommonDiffEditor[] { + return Object.keys(this._diffEditors).map(id => this._diffEditors[id]); + } + + getFocusedCodeEditor(): ICommonCodeEditor { let editorWithWidgetFocus: ICommonCodeEditor = null; let editors = this.listCodeEditors(); @@ -69,7 +103,7 @@ export abstract class AbstractCodeEditorService implements ICodeEditorService { return editorWithWidgetFocus; } - public abstract registerDecorationType(key: string, options: IDecorationRenderOptions, parentTypeKey?: string): void; - public abstract removeDecorationType(key: string): void; - public abstract resolveDecorationOptions(decorationTypeKey: string, writable: boolean): IModelDecorationOptions; + abstract registerDecorationType(key: string, options: IDecorationRenderOptions, parentTypeKey?: string): void; + abstract removeDecorationType(key: string): void; + abstract resolveDecorationOptions(decorationTypeKey: string, writable: boolean): IModelDecorationOptions; } diff --git a/src/vs/editor/common/services/codeEditorService.ts b/src/vs/editor/common/services/codeEditorService.ts index 91742fe8163007885312950f14b3333ff748edc6..8c735caa27c62f59b929ee4f67d522f7c1cd8b5e 100644 --- a/src/vs/editor/common/services/codeEditorService.ts +++ b/src/vs/editor/common/services/codeEditorService.ts @@ -14,16 +14,22 @@ export var ICodeEditorService = createDecorator('codeEditorS export interface ICodeEditorService { _serviceBrand: any; - addCodeEditor(editor: ICommonCodeEditor): void; onCodeEditorAdd: Event; - - removeCodeEditor(editor: ICommonCodeEditor): void; onCodeEditorRemove: Event; - getCodeEditor(editorId: string): ICommonCodeEditor; + onDiffEditorAdd: Event; + onDiffEditorRemove: Event; + addCodeEditor(editor: ICommonCodeEditor): void; + removeCodeEditor(editor: ICommonCodeEditor): void; + getCodeEditor(editorId: string): ICommonCodeEditor; listCodeEditors(): ICommonCodeEditor[]; + addDiffEditor(editor: ICommonDiffEditor): void; + removeDiffEditor(editor: ICommonDiffEditor): void; + getDiffEditor(editorId: string): ICommonDiffEditor; + listDiffEditors(): ICommonDiffEditor[]; + /** * Returns the current focused code editor (if the focus is in the editor or in an editor widget) or null. */