diff --git a/src/vs/platform/extensionManagement/common/extensionEnablementService.ts b/src/vs/platform/extensionManagement/common/extensionEnablementService.ts index 067987d593a4f8bc2a9a612a4d82e4254a254620..c5969b330cb9de23d213396a5e835ac6e742adbb 100644 --- a/src/vs/platform/extensionManagement/common/extensionEnablementService.ts +++ b/src/vs/platform/extensionManagement/common/extensionEnablementService.ts @@ -6,6 +6,7 @@ import { localize } from 'vs/nls'; import { TPromise } from 'vs/base/common/winjs.base'; import { distinct } from 'vs/base/common/arrays'; +import Event, { Emitter } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IExtensionManagementService, DidUninstallExtensionEvent, IExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkspaceContextService, IWorkspace } from 'vs/platform/workspace/common/workspace'; @@ -22,6 +23,9 @@ export class ExtensionEnablementService implements IExtensionEnablementService { private workspace: IWorkspace; private disposables: IDisposable[] = []; + private _onEnablementChanged = new Emitter(); + public onEnablementChanged: Event = this._onEnablementChanged.event; + constructor( @IStorageService private storageService: IStorageService, @IWorkspaceContextService contextService: IWorkspaceContextService, @@ -98,7 +102,7 @@ export class ExtensionEnablementService implements IExtensionEnablementService { private disableExtension(identifier: string, scope: StorageScope): TPromise { let disabledExtensions = this._getDisabledExtensions(scope); disabledExtensions.push(identifier); - this._setDisabledExtensions(disabledExtensions, scope); + this._setDisabledExtensions(disabledExtensions, scope, identifier); return TPromise.wrap(true); } @@ -107,7 +111,7 @@ export class ExtensionEnablementService implements IExtensionEnablementService { const index = disabledExtensions.indexOf(identifier); if (index !== -1) { disabledExtensions.splice(index, 1); - this._setDisabledExtensions(disabledExtensions, scope); + this._setDisabledExtensions(disabledExtensions, scope, identifier); } return TPromise.wrap(true); } @@ -117,12 +121,13 @@ export class ExtensionEnablementService implements IExtensionEnablementService { return value ? distinct(value.split(',')) : []; } - private _setDisabledExtensions(disabledExtensions: string[], scope: StorageScope): void { + private _setDisabledExtensions(disabledExtensions: string[], scope: StorageScope, extension: string): void { if (disabledExtensions.length) { this.storageService.store(DISABLED_EXTENSIONS_STORAGE_PATH, disabledExtensions.join(','), scope); } else { this.storageService.remove(DISABLED_EXTENSIONS_STORAGE_PATH, scope); } + this._onEnablementChanged.fire(extension); } private onDidUninstallExtension({id, error}: DidUninstallExtensionEvent): void { diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 3f7f456fb01a2995866ea6f6d4fe702d24521d9b..411d199be386df49de30693b82e6f3cb8b3c2130 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -242,7 +242,7 @@ export interface IExtensionEnablementService { /** * Event to listen on for extension enablement changes */ - // onEnablementChanged: Event; + onEnablementChanged: Event; /** * Returns all globally disabled extension identifiers. diff --git a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts index 39d827ca5298a20c48e77a046701293c63e8be67..7211c9415b76c54e3d111f905d77de6411c8c523 100644 --- a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts @@ -319,6 +319,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { extensionService.onDidInstallExtension(this.onDidInstallExtension, this, this.disposables); extensionService.onUninstallExtension(this.onUninstallExtension, this, this.disposables); extensionService.onDidUninstallExtension(this.onDidUninstallExtension, this, this.disposables); + extensionEnablementService.onEnablementChanged(this.onEnablementChanged, this, this.disposables); this.syncDelayer = new ThrottledDelayer(ExtensionsWorkbenchService.SyncPeriod); this.autoUpdateDelayer = new ThrottledDelayer(1000); @@ -484,7 +485,6 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { } return this.doSetEnablement(extension, enable, workspace).then(reload => { - this.updatedDisableFlags(extension); this.telemetryService.publicLog(enable ? 'extension:enable' : 'extension:disable', extension.telemetryData); this._onChange.fire(); }); @@ -599,18 +599,20 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { } if (!error) { - this.updatedDisableFlags(uninstalling.extension); this.reportTelemetry(uninstalling, true); } this._onChange.fire(); } - private updatedDisableFlags(extension: IExtension) { - const globallyDisabledExtensions = this.extensionEnablementService.getGloballyDisabledExtensions(); - const workspaceDisabledExtensions = this.extensionEnablementService.getWorkspaceDisabledExtensions(); - extension.disabledGlobally = globallyDisabledExtensions.indexOf(extension.identifier) !== -1; - extension.disabledForWorkspace = workspaceDisabledExtensions.indexOf(extension.identifier) !== -1; + private onEnablementChanged(extensionIdentifier: string) { + const [extension] = this.local.filter(e => e.identifier === extensionIdentifier); + if (extension) { + const globallyDisabledExtensions = this.extensionEnablementService.getGloballyDisabledExtensions(); + const workspaceDisabledExtensions = this.extensionEnablementService.getWorkspaceDisabledExtensions(); + extension.disabledGlobally = globallyDisabledExtensions.indexOf(extension.identifier) !== -1; + extension.disabledForWorkspace = workspaceDisabledExtensions.indexOf(extension.identifier) !== -1; + } } private getExtensionState(extension: Extension): ExtensionState {