diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index 905437314fb..ee611467c8c 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -8,6 +8,7 @@ import {TPromise} from 'vs/base/common/winjs.base'; import nls = require('vs/nls'); import {Registry} from 'vs/platform/platform'; import {Action} from 'vs/base/common/actions'; +import {IComposite} from 'vs/workbench/common/composite'; import {CompositePart} from 'vs/workbench/browser/parts/compositePart'; import {Viewlet, ViewletRegistry, Extensions as ViewletExtensions} from 'vs/workbench/browser/viewlet'; import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry'; @@ -24,11 +25,15 @@ import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; import {IKeybindingService} from 'vs/platform/keybinding/common/keybinding'; import {KeyMod, KeyCode} from 'vs/base/common/keyCodes'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; +import Event, {Emitter} from 'vs/base/common/event'; export class SidebarPart extends CompositePart implements IViewletService { public static activeViewletSettingsKey = 'workbench.sidebar.activeviewletid'; + private _onDidActiveViewletChange = new Emitter(); + onDidActiveViewletChange: Event = this._onDidActiveViewletChange.event; + public _serviceBrand: any; private blockOpeningViewlet: boolean; @@ -77,7 +82,10 @@ export class SidebarPart extends CompositePart implements IViewletServi } } - return this.openComposite(id, focus); + return this.openComposite(id, focus).then(composite => { + this._onDidActiveViewletChange.fire(composite as IComposite as IViewlet); + return composite; + }); } public getActiveViewlet(): IViewlet { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index 53bffd06564..9a785c06957 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -9,10 +9,12 @@ import 'vs/css!./media/extensionEditor'; import { localize } from 'vs/nls'; import { TPromise } from 'vs/base/common/winjs.base'; import { marked } from 'vs/base/common/marked/marked'; +import { onUnexpectedError } from 'vs/base/common/errors'; import { IDisposable, empty, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { Builder } from 'vs/base/browser/builder'; import { append, emmet as $, addClass, removeClass, finalHandler } from 'vs/base/browser/dom'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; +import { IViewlet } from 'vs/workbench/common/viewlet'; import { IViewletService } from 'vs/workbench/services/viewlet/common/viewletService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -30,6 +32,7 @@ import product from 'vs/platform/product'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { CombinedInstallAction, UpdateAction, EnableAction } from './extensionsActions'; import WebView from 'vs/workbench/parts/html/browser/webview'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; function renderBody(body: string): string { return ` @@ -70,12 +73,15 @@ export class ExtensionEditor extends BaseEditor { @IRequestService private requestService: IRequestService, @IViewletService private viewletService: IViewletService, @IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService, - @IThemeService private themeService: IThemeService + @IThemeService private themeService: IThemeService, + @IWorkbenchEditorService private editorService: IWorkbenchEditorService ) { super(ExtensionEditor.ID, telemetryService); this._highlight = null; this.highlightDisposable = empty; this.disposables = []; + + viewletService.onDidActiveViewletChange(this.onActiveViewletChange, this, this.disposables); } createEditor(parent: Builder): void { @@ -194,6 +200,14 @@ export class ExtensionEditor extends BaseEditor { return; } + private onActiveViewletChange(viewlet: IViewlet): void { + if (!viewlet || viewlet.getId() === VIEWLET_ID) { + return; + } + + this.editorService.closeEditor(this.position, this.input).done(null, onUnexpectedError); + } + dispose(): void { this._highlight = null; this.transientDisposables = dispose(this.transientDisposables); diff --git a/src/vs/workbench/services/viewlet/common/viewletService.ts b/src/vs/workbench/services/viewlet/common/viewletService.ts index 730e77e680c..3efeee0c0bb 100644 --- a/src/vs/workbench/services/viewlet/common/viewletService.ts +++ b/src/vs/workbench/services/viewlet/common/viewletService.ts @@ -5,6 +5,7 @@ 'use strict'; import {TPromise} from 'vs/base/common/winjs.base'; +import Event from 'vs/base/common/event'; import {IViewlet} from 'vs/workbench/common/viewlet'; import {createDecorator, ServiceIdentifier} from 'vs/platform/instantiation/common/instantiation'; @@ -13,6 +14,8 @@ export const IViewletService = createDecorator('viewletService' export interface IViewletService { _serviceBrand : ServiceIdentifier; + onDidActiveViewletChange: Event; + /** * Opens a viewlet with the given identifier and pass keyboard focus to it if specified. */ diff --git a/src/vs/workbench/test/browser/services.test.ts b/src/vs/workbench/test/browser/services.test.ts index ed527a31e5f..db1d3aa38b5 100644 --- a/src/vs/workbench/test/browser/services.test.ts +++ b/src/vs/workbench/test/browser/services.test.ts @@ -38,6 +38,7 @@ import {IViewletService} from 'vs/workbench/services/viewlet/common/viewletServi import {IViewlet} from 'vs/workbench/common/viewlet'; import {Position, Direction, IEditor} from 'vs/platform/editor/common/editor'; import {IEventService} from 'vs/platform/event/common/event'; +import {Emitter} from 'vs/base/common/event'; let activeViewlet: Viewlet = {}; let activeEditor: BaseEditor = { @@ -110,6 +111,9 @@ class TestEditorPart implements IEditorPart { class TestViewletService implements IViewletService { public _serviceBrand: any; + + onDidActiveViewletChange = new Emitter().event; + public openViewlet(id: string, focus?: boolean): Promise { return TPromise.as(null); }