From 3ac84ba23e33b869bf0c161f89f9737d79e06026 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 13 Oct 2016 10:08:19 +0200 Subject: [PATCH] add new event `onDidChangeVisibleTextEditors`, #643 --- src/vs/vscode.d.ts | 6 ++++ src/vs/workbench/api/node/extHost.api.impl.ts | 3 ++ src/vs/workbench/api/node/extHostEditors.ts | 30 +++++++++++++++---- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index aee24f3fd5f..1ddfc16d4a5 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3376,6 +3376,12 @@ declare namespace vscode { */ export const onDidChangeActiveTextEditor: Event; + /** + * An [event](#Event) which fires when the array of [visible editors](#window.visibleTextEditors) + * has changed. + */ + export const onDidChangeVisibleTextEditors: Event; + /** * An [event](#Event) which fires when the selection in an editor has changed. */ diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 1dbaa95b7c0..07aeb51b37f 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -232,6 +232,9 @@ export class ExtHostAPIImplementation { return extHostEditors.createTextEditorDecorationType(options); }, onDidChangeActiveTextEditor: extHostEditors.onDidChangeActiveTextEditor.bind(extHostEditors), + onDidChangeVisibleTextEditors(listener, thisArg, disposables) { + return extHostEditors.onDidChangeVisibleTextEditors(listener, thisArg, disposables); + }, onDidChangeTextEditorSelection: (listener: (e: vscode.TextEditorSelectionChangeEvent) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) => { return extHostEditors.onDidChangeTextEditorSelection(listener, thisArgs, disposables); }, diff --git a/src/vs/workbench/api/node/extHostEditors.ts b/src/vs/workbench/api/node/extHostEditors.ts index 9be77826c68..1df0b9d287b 100644 --- a/src/vs/workbench/api/node/extHostEditors.ts +++ b/src/vs/workbench/api/node/extHostEditors.ts @@ -6,6 +6,7 @@ import URI from 'vs/base/common/uri'; import { readonly, illegalArgument } from 'vs/base/common/errors'; +import { equals as arrayEquals } from 'vs/base/common/arrays'; import { IdGenerator } from 'vs/base/common/idGenerator'; import Event, { Emitter } from 'vs/base/common/event'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -32,6 +33,7 @@ export class ExtHostEditors extends ExtHostEditorsShape { private _editors: { [id: string]: ExtHostTextEditor }; private _proxy: MainThreadEditorsShape; private _onDidChangeActiveTextEditor: Emitter; + private _onDidChangeVisibleTextEditors: Emitter; private _extHostDocuments: ExtHostDocuments; private _activeEditorId: string; private _visibleEditorIds: string[]; @@ -53,6 +55,7 @@ export class ExtHostEditors extends ExtHostEditorsShape { this._extHostDocuments = extHostDocuments; this._proxy = threadService.get(MainContext.MainThreadEditors); this._onDidChangeActiveTextEditor = new Emitter(); + this._onDidChangeVisibleTextEditors = new Emitter(); this._editors = Object.create(null); this._visibleEditorIds = []; @@ -70,6 +73,10 @@ export class ExtHostEditors extends ExtHostEditorsShape { return this._onDidChangeActiveTextEditor && this._onDidChangeActiveTextEditor.event; } + get onDidChangeVisibleTextEditors(): Event { + return this._onDidChangeVisibleTextEditors && this._onDidChangeVisibleTextEditors.event; + } + showTextDocument(document: TextDocument, column: ViewColumn, preserveFocus: boolean): TPromise { return this._proxy.$tryShowTextDocument(document.uri, TypeConverters.fromViewColumn(column), preserveFocus).then(id => { let editor = this._editors[id]; @@ -115,14 +122,25 @@ export class ExtHostEditors extends ExtHostEditorsShape { } $acceptActiveEditorAndVisibleEditors(id: string, visibleIds: string[]): void { - this._visibleEditorIds = visibleIds; + let visibleChanged = false; + let activeChanged = false; - if (this._activeEditorId === id) { - // nothing to do - return; + if (!arrayEquals(this._visibleEditorIds, visibleIds)) { + this._visibleEditorIds = visibleIds; + visibleChanged = true; + } + + if (this._activeEditorId !== id) { + this._activeEditorId = id; + activeChanged = true; + } + + if (visibleChanged) { + this._onDidChangeVisibleTextEditors.fire(this.getVisibleTextEditors()); + } + if (activeChanged) { + this._onDidChangeActiveTextEditor.fire(this.getActiveTextEditor()); } - this._activeEditorId = id; - this._onDidChangeActiveTextEditor.fire(this.getActiveTextEditor()); } $acceptEditorPositionData(data: ITextEditorPositionData): void { -- GitLab