diff --git a/src/vs/base/browser/ui/messagelist/messageList.ts b/src/vs/base/browser/ui/messagelist/messageList.ts index f4fd2588017..192b11d8ccf 100644 --- a/src/vs/base/browser/ui/messagelist/messageList.ts +++ b/src/vs/base/browser/ui/messagelist/messageList.ts @@ -12,8 +12,7 @@ import {Builder, withElementById, $} from 'vs/base/browser/builder'; import DOM = require('vs/base/browser/dom'); import errors = require('vs/base/common/errors'); import types = require('vs/base/common/types'); -import {EventProvider} from 'vs/base/common/eventProvider'; -import {EventSource} from 'vs/base/common/eventSource'; +import Event, {Emitter} from 'vs/base/common/event'; import {Action} from 'vs/base/common/actions'; import htmlRenderer = require('vs/base/browser/htmlContentRenderer'); @@ -61,8 +60,8 @@ export class MessageList { private options: IMessageListOptions; private usageLogger: IUsageLogger; - private _onMessagesShowing: EventSource<() => void>; - private _onMessagesCleared: EventSource<() => void>; + private _onMessagesShowing: Emitter; + private _onMessagesCleared: Emitter; constructor(containerElementId: string, usageLogger?: IUsageLogger, options: IMessageListOptions = { purgeInterval: MessageList.DEFAULT_MESSAGE_PURGER_INTERVAL, maxMessages: MessageList.DEFAULT_MAX_MESSAGES, maxMessageLength: MessageList.DEFAULT_MAX_MESSAGE_LENGTH }) { this.messages = []; @@ -71,16 +70,16 @@ export class MessageList { this.usageLogger = usageLogger; this.options = options; - this._onMessagesShowing = new EventSource<() => void>(); - this._onMessagesCleared = new EventSource<() => void>(); + this._onMessagesShowing = new Emitter(); + this._onMessagesCleared = new Emitter(); } - public get onMessagesShowing(): EventProvider<() => void> { - return this._onMessagesShowing.value; + public get onMessagesShowing(): Event { + return this._onMessagesShowing.event; } - public get onMessagesCleared(): EventProvider<() => void> { - return this._onMessagesCleared.value; + public get onMessagesCleared(): Event { + return this._onMessagesCleared.event; } public showMessage(severity: Severity, message: string): () => void; diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index b7be2ec4399..b7d7baf87a7 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -102,7 +102,7 @@ export class Emitter { * To be kept private to fire an event to * subscribers */ - fire(event: T): any { + fire(event?: T): any { if (this._callbacks) { this._callbacks.invoke.call(this._callbacks, event); } diff --git a/src/vs/editor/common/services/modeService.ts b/src/vs/editor/common/services/modeService.ts index f870f5702ac..6cc624740f4 100644 --- a/src/vs/editor/common/services/modeService.ts +++ b/src/vs/editor/common/services/modeService.ts @@ -6,7 +6,6 @@ import {createDecorator, ServiceIdentifier} from 'vs/platform/instantiation/common/instantiation'; import EditorCommon = require('vs/editor/common/editorCommon'); -import {EventProvider} from 'vs/base/common/eventProvider'; import {TPromise} from 'vs/base/common/winjs.base'; import URI from 'vs/base/common/uri'; import Modes = require('vs/editor/common/modes'); diff --git a/src/vs/editor/common/services/modelServiceImpl.ts b/src/vs/editor/common/services/modelServiceImpl.ts index e703f22186a..63940b5700f 100644 --- a/src/vs/editor/common/services/modelServiceImpl.ts +++ b/src/vs/editor/common/services/modelServiceImpl.ts @@ -19,7 +19,6 @@ import {IHTMLContentElement} from 'vs/base/common/htmlContent'; import Event, {Emitter} from 'vs/base/common/event'; import URI from 'vs/base/common/uri'; import Severity from 'vs/base/common/severity'; -import {EventProvider} from 'vs/base/common/eventProvider'; import {IDisposable, disposeAll} from 'vs/base/common/lifecycle'; import {TPromise} from 'vs/base/common/winjs.base'; import Errors = require('vs/base/common/errors'); diff --git a/src/vs/editor/common/services/resourceService.ts b/src/vs/editor/common/services/resourceService.ts index 003c5e7ea21..711b8472583 100644 --- a/src/vs/editor/common/services/resourceService.ts +++ b/src/vs/editor/common/services/resourceService.ts @@ -7,7 +7,6 @@ import {createDecorator, ServiceIdentifier} from 'vs/platform/instantiation/common/instantiation'; import {ListenerUnbind, ListenerCallback, IEventEmitter, IEmitterEvent} from 'vs/base/common/eventEmitter'; import EditorCommon = require('vs/editor/common/editorCommon'); -import {EventProvider} from 'vs/base/common/eventProvider'; import URI from 'vs/base/common/uri'; import {IDisposable} from 'vs/base/common/lifecycle'; diff --git a/src/vs/platform/lifecycle/common/baseLifecycleService.ts b/src/vs/platform/lifecycle/common/baseLifecycleService.ts index 6bf767f28d4..665c7261cad 100644 --- a/src/vs/platform/lifecycle/common/baseLifecycleService.ts +++ b/src/vs/platform/lifecycle/common/baseLifecycleService.ts @@ -6,8 +6,7 @@ import arrays = require('vs/base/common/arrays'); import winjs = require('vs/base/common/winjs.base'); -import {EventProvider} from 'vs/base/common/eventProvider'; -import {EventSource} from 'vs/base/common/eventSource'; +import Event, {Emitter} from 'vs/base/common/event'; import {ILifecycleService, IBeforeShutdownParticipant} from './lifecycle'; @@ -15,14 +14,14 @@ export class BaseLifecycleService implements ILifecycleService { public serviceId = ILifecycleService; private _beforeShutdownParticipants: IBeforeShutdownParticipant[]; - private _onShutdown: EventSource<() => void>; + private _onShutdown: Emitter; constructor() { this._beforeShutdownParticipants = []; - this._onShutdown = new EventSource<() => void>(); + this._onShutdown = new Emitter(); } - protected fireShutdown(): void{ + protected fireShutdown(): void { this._onShutdown.fire(); } @@ -34,7 +33,7 @@ export class BaseLifecycleService implements ILifecycleService { return this._beforeShutdownParticipants; } - public get onShutdown(): EventProvider<() => void> { - return this._onShutdown.value; + public get onShutdown(): Event { + return this._onShutdown.event; } } diff --git a/src/vs/platform/lifecycle/common/lifecycle.ts b/src/vs/platform/lifecycle/common/lifecycle.ts index bf0bbb2ef43..b80396f6755 100644 --- a/src/vs/platform/lifecycle/common/lifecycle.ts +++ b/src/vs/platform/lifecycle/common/lifecycle.ts @@ -5,7 +5,7 @@ 'use strict'; import winjs = require('vs/base/common/winjs.base'); -import {EventProvider} from 'vs/base/common/eventProvider'; +import Event, {Emitter} from 'vs/base/common/event'; import {createDecorator, ServiceIdentifier} from 'vs/platform/instantiation/common/instantiation'; export var ILifecycleService = createDecorator('lifecycleService'); @@ -20,7 +20,7 @@ export interface IBeforeShutdownParticipant { * Note: It is absolutely important to avoid long running promises on this call. Please try hard to return * a boolean directly. Returning a promise has quite an impact on the shutdown sequence! */ - beforeShutdown(): boolean|winjs.TPromise; + beforeShutdown(): boolean | winjs.TPromise; } /** @@ -40,5 +40,5 @@ export interface ILifecycleService { * Fired when no client is preventing the shutdown from happening. Can be used to dispose heavy resources * like running processes. Can also be used to save UI state to storage. */ - onShutdown: EventProvider<() => void>; + onShutdown: Event; } \ No newline at end of file diff --git a/src/vs/platform/lifecycle/common/nullLifecycleService.ts b/src/vs/platform/lifecycle/common/nullLifecycleService.ts index c85f60cf9fc..3f1e2681462 100644 --- a/src/vs/platform/lifecycle/common/nullLifecycleService.ts +++ b/src/vs/platform/lifecycle/common/nullLifecycleService.ts @@ -4,24 +4,25 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import {EventProvider} from 'vs/base/common/eventProvider'; -import {EventSource} from 'vs/base/common/eventSource'; +import Event, {Emitter} from 'vs/base/common/event'; import {ILifecycleService, IBeforeShutdownParticipant} from 'vs/platform/lifecycle/common/lifecycle'; import {IThreadService} from 'vs/platform/thread/common/thread'; class NullLifecycleService implements ILifecycleService { + public serviceId = ILifecycleService; - private _onBeforeShutdown: EventSource<() => any> = new EventSource<() => any>(); - private _onShutdown: EventSource<() => any> = new EventSource<() => any>(); + + private _onBeforeShutdown: Emitter = new Emitter(); + private _onShutdown: Emitter = new Emitter(); public addBeforeShutdownParticipant(p: IBeforeShutdownParticipant): void { } - public get onShutdown(): EventProvider<() => any> { - return this._onShutdown.value; + public get onShutdown(): Event { + return this._onShutdown.event; } - public setThreadService(service:IThreadService): void { + public setThreadService(service: IThreadService): void { } } diff --git a/src/vs/platform/services.ts b/src/vs/platform/services.ts index 38544c9290d..2e97ebd2b43 100644 --- a/src/vs/platform/services.ts +++ b/src/vs/platform/services.ts @@ -24,7 +24,6 @@ import types = require('vs/base/common/types'); import http = require('vs/base/common/http'); import events = require('vs/base/common/events'); -import {EventProvider} from 'vs/base/common/eventProvider'; import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; import {IContextViewService, IContextMenuService} from 'vs/platform/contextview/browser/contextView'; import {IEditorService} from 'vs/platform/editor/common/editor'; diff --git a/src/vs/workbench/browser/actionRegistry.ts b/src/vs/workbench/browser/actionRegistry.ts index 66965a7e3f9..9f81142559a 100644 --- a/src/vs/workbench/browser/actionRegistry.ts +++ b/src/vs/workbench/browser/actionRegistry.ts @@ -9,7 +9,6 @@ import {TPromise} from 'vs/base/common/winjs.base'; import collections = require('vs/base/common/collections'); import {Registry} from 'vs/platform/platform'; import {IAction} from 'vs/base/common/actions'; -import {EventProvider} from 'vs/base/common/eventProvider'; import {KeybindingsRegistry,ICommandDescriptor} from 'vs/platform/keybinding/common/keybindingsRegistry'; import {KeybindingsUtils} from 'vs/platform/keybinding/common/keybindingsUtils'; import {IPartService} from 'vs/workbench/services/part/common/partService'; diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index 34124b92610..fc02dd07b39 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -21,8 +21,7 @@ import {ITree, IElementCallback} from 'vs/base/parts/tree/common/tree'; import {Registry} from 'vs/platform/platform'; import {WorkbenchComponent} from 'vs/workbench/browser/component'; import {EditorEvent, EventType} from 'vs/workbench/browser/events'; -import {EventProvider} from 'vs/base/common/eventProvider'; -import {EventSource} from 'vs/base/common/eventSource'; +import Event, {Emitter} from 'vs/base/common/event'; import {Identifiers} from 'vs/workbench/common/constants'; import {Scope} from 'vs/workbench/common/memento'; import {QuickOpenHandler, QuickOpenHandlerDescriptor, IQuickOpenRegistry, Extensions} from 'vs/workbench/browser/quickopen'; @@ -58,8 +57,8 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe public serviceId = IQuickOpenService; - private _onShow: EventSource<() => void>; - private _onHide: EventSource<() => void>; + private _onShow: Emitter; + private _onHide: Emitter; private instantiationService: IInstantiationService; private quickOpenWidget: QuickOpenWidget; @@ -97,16 +96,16 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe this.inQuickOpenMode = keybindingService.createKey(QUICK_OPEN_MODE, false); - this._onShow = new EventSource<() => void>(); - this._onHide = new EventSource<() => void>(); + this._onShow = new Emitter(); + this._onHide = new Emitter(); } - public get onShow(): EventProvider<() => void> { - return this._onShow.value; + public get onShow(): Event { + return this._onShow.event; } - public get onHide(): EventProvider<() => void> { - return this._onHide.value; + public get onHide(): Event { + return this._onHide.event; } public setInstantiationService(service: IInstantiationService): void { diff --git a/src/vs/workbench/browser/workbench.ts b/src/vs/workbench/browser/workbench.ts index 9f672894138..1315311da20 100644 --- a/src/vs/workbench/browser/workbench.ts +++ b/src/vs/workbench/browser/workbench.ts @@ -282,7 +282,7 @@ export class Workbench implements IPartService { let threadService = this.instantiationService.getInstance(IThreadService); let pluginService = this.instantiationService.getInstance(IPluginService); this.lifecycleService = this.instantiationService.getInstance(ILifecycleService); - this.lifecycleService.onShutdown.add(this.shutdownComponents, this); + this.toDispose.push(this.lifecycleService.onShutdown(this.shutdownComponents, this)); let contextMenuService = this.instantiationService.getInstance(IContextMenuService); this.untitledEditorService = this.instantiationService.getInstance(IUntitledEditorService); @@ -554,9 +554,6 @@ export class Workbench implements IPartService { // Dispose all this.toDispose = disposeAll(this.toDispose); - // Unhook listener - this.lifecycleService.onShutdown.remove(this.shutdownComponents, this); - // Event this.eventService.emit(EventType.WORKBENCH_DISPOSED); } diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 0278b4bfc27..11a76364d7b 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -296,10 +296,10 @@ export class WorkbenchShell { this.contextViewService = new ContextViewService(this.container, this.telemetryService, this.messageService); let lifecycleService = new LifecycleService(this.messageService, this.windowService); - lifecycleService.onShutdown.add(() => fileService.dispose()); + lifecycleService.onShutdown(() => fileService.dispose()); this.threadService = new MainThreadService(this.contextService, this.messageService, this.windowService); - lifecycleService.onShutdown.add(() => this.threadService.dispose()); + lifecycleService.onShutdown(() => this.threadService.dispose()); let requestService = new RequestService( this.contextService, @@ -307,7 +307,7 @@ export class WorkbenchShell { this.telemetryService ); this.threadService.registerInstance(requestService); - lifecycleService.onShutdown.add(() => requestService.dispose()); + lifecycleService.onShutdown(() => requestService.dispose()); let markerService = new MarkerService(this.threadService); diff --git a/src/vs/workbench/electron-main/windows.ts b/src/vs/workbench/electron-main/windows.ts index 7f8a654b06f..5f903d5121c 100644 --- a/src/vs/workbench/electron-main/windows.ts +++ b/src/vs/workbench/electron-main/windows.ts @@ -150,7 +150,7 @@ export class WindowsManager { }, 100); }); - settings.manager.onChange.add((newSettings) => { + settings.manager.onChange((newSettings) => { this.sendToAll('vscode:optionsChange', JSON.stringify({ globalSettings: newSettings })); }, this); diff --git a/src/vs/workbench/node/userSettings.ts b/src/vs/workbench/node/userSettings.ts index 34b65ac6552..4c02c997c10 100644 --- a/src/vs/workbench/node/userSettings.ts +++ b/src/vs/workbench/node/userSettings.ts @@ -11,9 +11,8 @@ import path = require('path'); import json = require('vs/base/common/json'); import objects = require('vs/base/common/objects'); -import {EventProvider} from 'vs/base/common/eventProvider'; import {TPromise} from 'vs/base/common/winjs.base'; -import {EventSource} from 'vs/base/common/eventSource'; +import Event, {Emitter} from 'vs/base/common/event'; import {IWorkspaceContextService} from 'vs/workbench/services/workspace/common/contextService'; export interface ISettings { @@ -33,12 +32,12 @@ export class UserSettings { private appSettingsPath: string; private appKeybindingsPath: string; - private _onChange: EventSource<(settings: ISettings) => void>; + private _onChange: Emitter; constructor(appSettingsPath: string, appKeybindingsPath: string) { this.appSettingsPath = appSettingsPath; this.appKeybindingsPath = appKeybindingsPath; - this._onChange = new EventSource<(settings: ISettings) => void>(); + this._onChange = new Emitter(); this.registerWatchers(); } @@ -67,8 +66,8 @@ export class UserSettings { }); } - public get onChange(): EventProvider<(settings: ISettings) => void> { - return this._onChange.value; + public get onChange(): Event { + return this._onChange.event; } public getValue(key: string, fallback?: any): any { diff --git a/src/vs/workbench/parts/debug/browser/replEditor.ts b/src/vs/workbench/parts/debug/browser/replEditor.ts index 49b6229e8e1..a693eea5d7d 100644 --- a/src/vs/workbench/parts/debug/browser/replEditor.ts +++ b/src/vs/workbench/parts/debug/browser/replEditor.ts @@ -75,7 +75,7 @@ export class Repl extends baseeditor.BaseEditor { this.toDispose.push(this.debugService.getModel().addListener2(debug.ModelEvents.REPL_ELEMENTS_UPDATED, (re: debug.ITreeElement|debug.ITreeElement[]) => { this.onReplElementsUpdated(re); })); - lifecycleService.onShutdown.add(this.onShutdown, this); + lifecycleService.onShutdown(this.onShutdown, this); } private onReplElementsUpdated(re: debug.ITreeElement | debug.ITreeElement[]): void { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index c7dc6acdc07..eac15d0f55e 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -125,10 +125,10 @@ export class DebugService extends ee.EventEmitter implements debug.IDebugService })); } - lifecycleService.onShutdown.add(this.store, this); - lifecycleService.onShutdown.add(this.dispose, this); + lifecycleService.onShutdown(this.store, this); + lifecycleService.onShutdown(this.dispose, this); - this.windowService.onBroadcast.add(this.onBroadcast, this); + this.windowService.onBroadcast(this.onBroadcast, this); } private onBroadcast(broadcast: IBroadcast): void { diff --git a/src/vs/workbench/parts/files/browser/fileActions.ts b/src/vs/workbench/parts/files/browser/fileActions.ts index 26a0c7c461e..6ca8f313e69 100644 --- a/src/vs/workbench/parts/files/browser/fileActions.ts +++ b/src/vs/workbench/parts/files/browser/fileActions.ts @@ -1897,6 +1897,7 @@ export class CloseWorkingFileAction extends Action { private model: WorkingFilesModel; private element: WorkingFileEntry; + private listenerToDispose: IDisposable; constructor( model: WorkingFilesModel, @@ -1914,7 +1915,7 @@ export class CloseWorkingFileAction extends Action { if (this.model) { this.enabled = (this.model.count() > 0); - this.model.onModelChange.add(this.onModelChange, this); + this.listenerToDispose = this.model.onModelChange(this.onModelChange, this); } } @@ -1999,8 +2000,9 @@ export class CloseWorkingFileAction extends Action { } public dispose(): void { - if (this.model) { - this.model.onModelChange.remove(this.onModelChange, this); + if (this.listenerToDispose) { + this.listenerToDispose.dispose(); + delete this.listenerToDispose; } super.dispose(); diff --git a/src/vs/workbench/parts/files/browser/textFileServices.ts b/src/vs/workbench/parts/files/browser/textFileServices.ts index 6fa3e86e652..de06b2ac5b0 100644 --- a/src/vs/workbench/parts/files/browser/textFileServices.ts +++ b/src/vs/workbench/parts/files/browser/textFileServices.ts @@ -45,7 +45,7 @@ export abstract class TextFileService implements ITextFileService { this.listenerToUnbind = this.eventService.addListener(EventType.WORKBENCH_OPTIONS_CHANGED, () => this.onOptionsChanged()); if (this.lifecycleService) { this.lifecycleService.addBeforeShutdownParticipant(this); - this.lifecycleService.onShutdown.add(this.dispose, this); + this.lifecycleService.onShutdown(this.dispose, this); } } diff --git a/src/vs/workbench/parts/files/browser/views/workingFilesView.ts b/src/vs/workbench/parts/files/browser/views/workingFilesView.ts index 57ee8ab4767..44a5f3b61c1 100644 --- a/src/vs/workbench/parts/files/browser/views/workingFilesView.ts +++ b/src/vs/workbench/parts/files/browser/views/workingFilesView.ts @@ -14,6 +14,7 @@ import workbenchEditorCommon = require('vs/workbench/common/editor'); import {CollapsibleState} from 'vs/base/browser/ui/splitview/splitview'; import {IWorkingFileEntry, IWorkingFilesModel, IWorkingFileModelChangeEvent, LocalFileChangeEvent, EventType as FileEventType, IFilesConfiguration, ITextFileService} from 'vs/workbench/parts/files/common/files'; import dom = require('vs/base/browser/dom'); +import {disposeAll, IDisposable} from 'vs/base/common/lifecycle'; import errors = require('vs/base/common/errors'); import {EditorEvent, EventType as WorkbenchEventType, UntitledEditorEvent} from 'vs/workbench/browser/events'; import {AdaptiveCollapsibleViewletView} from 'vs/workbench/browser/viewlet'; @@ -46,6 +47,8 @@ export class WorkingFilesView extends AdaptiveCollapsibleViewletView { private dirtyCountElement: HTMLElement; private lastDirtyCount: number; + private disposeables: IDisposable[]; + constructor(actionRunner: IActionRunner, settings: any, @IEventService private eventService: IEventService, @IWorkspaceContextService private contextService: IWorkspaceContextService, @@ -63,6 +66,7 @@ export class WorkingFilesView extends AdaptiveCollapsibleViewletView { this.settings = settings; this.model = this.textFileService.getWorkingFilesModel(); this.lastDirtyCount = 0; + this.disposeables = []; } public renderHeader(container: HTMLElement): void { @@ -129,8 +133,8 @@ export class WorkingFilesView extends AdaptiveCollapsibleViewletView { private registerListeners(): void { // update on model changes - this.model.onModelChange.add(this.onWorkingFilesModelChange, this); - this.model.onWorkingFileChange.add(this.onWorkingFileChange, this); + this.disposeables.push(this.model.onModelChange(this.onWorkingFilesModelChange, this)); + this.disposeables.push(this.model.onWorkingFileChange(this.onWorkingFileChange, this)); // listen to untitled this.toDispose.push(this.eventService.addListener2(WorkbenchEventType.UNTITLED_FILE_DIRTY, (e: UntitledEditorEvent) => this.onUntitledFileDirty())); @@ -313,7 +317,8 @@ export class WorkingFilesView extends AdaptiveCollapsibleViewletView { public dispose(): void { super.dispose(); - this.model.onModelChange.remove(this.onWorkingFilesModelChange, this); - this.model.onWorkingFileChange.remove(this.onWorkingFileChange, this); + while (this.disposeables.length) { + this.disposeables.pop().dispose(); + } } } \ No newline at end of file diff --git a/src/vs/workbench/parts/files/browser/workingFilesModel.ts b/src/vs/workbench/parts/files/browser/workingFilesModel.ts index 48bc1360730..480a4c42742 100644 --- a/src/vs/workbench/parts/files/browser/workingFilesModel.ts +++ b/src/vs/workbench/parts/files/browser/workingFilesModel.ts @@ -6,8 +6,7 @@ import arrays = require('vs/base/common/arrays'); import uri from 'vs/base/common/uri'; -import {EventSource} from 'vs/base/common/eventSource'; -import {EventProvider} from 'vs/base/common/eventProvider'; +import Event, {Emitter} from 'vs/base/common/event'; import paths = require('vs/base/common/paths'); import errors = require('vs/base/common/errors'); import labels = require('vs/base/common/labels'); @@ -31,8 +30,8 @@ export class WorkingFilesModel implements filesCommon.IWorkingFilesModel { private entries: WorkingFileEntry[]; private pathLabelProvider: labels.PathLabelProvider; private mapEntryToResource: { [resource: string]: WorkingFileEntry; }; - private _onModelChange: EventSource<(event: filesCommon.IWorkingFileModelChangeEvent) => void>; - private _onWorkingFileChange: EventSource<(file: WorkingFileEntry) => void>; + private _onModelChange: Emitter; + private _onWorkingFileChange: Emitter; private toDispose: IDisposable[]; constructor( @@ -47,8 +46,8 @@ export class WorkingFilesModel implements filesCommon.IWorkingFilesModel { this.entries = []; this.toDispose = []; this.mapEntryToResource = Object.create(null); - this._onModelChange = new EventSource<() => void>(); - this._onWorkingFileChange = new EventSource<() => void>(); + this._onModelChange = new Emitter(); + this._onWorkingFileChange = new Emitter(); this.load(); this.registerListeners(); @@ -146,12 +145,12 @@ export class WorkingFilesModel implements filesCommon.IWorkingFilesModel { } } - public get onModelChange(): EventProvider<(event: filesCommon.IWorkingFileModelChangeEvent) => void> { - return this._onModelChange.value; + public get onModelChange(): Event { + return this._onModelChange.event; } - public get onWorkingFileChange(): EventProvider<(file: WorkingFileEntry) => void> { - return this._onWorkingFileChange.value; + public get onWorkingFileChange(): Event { + return this._onWorkingFileChange.event; } public getEntries(excludeOutOfContext?: boolean): WorkingFileEntry[] { diff --git a/src/vs/workbench/parts/files/common/files.ts b/src/vs/workbench/parts/files/common/files.ts index ba415c0864f..e1eb0c4d18f 100644 --- a/src/vs/workbench/parts/files/common/files.ts +++ b/src/vs/workbench/parts/files/common/files.ts @@ -5,10 +5,10 @@ 'use strict'; import {TPromise} from 'vs/base/common/winjs.base'; -import {Event, PropertyChangeEvent} from 'vs/base/common/events'; +import {Event as BaseEvent, PropertyChangeEvent} from 'vs/base/common/events'; import URI from 'vs/base/common/uri'; +import Event, {Emitter} from 'vs/base/common/event'; import {guessMimeTypes} from 'vs/base/common/mime'; -import {EventProvider} from 'vs/base/common/eventProvider'; import {IModel, IEditorOptions} from 'vs/editor/common/editorCommon'; import {IDisposable} from 'vs/base/common/lifecycle'; import {EncodingMode, EditorInput, IFileEditorInput} from 'vs/workbench/common/editor'; @@ -79,9 +79,9 @@ export interface IWorkingFileModelChangeEvent { export interface IWorkingFilesModel { - onModelChange: EventProvider<(event: IWorkingFileModelChangeEvent) => void>; + onModelChange: Event; - onWorkingFileChange: EventProvider<(file: IWorkingFileEntry) => void>; + onWorkingFileChange: Event; getEntries(excludeOutOfContext?: boolean): IWorkingFileEntry[]; @@ -198,7 +198,7 @@ export const EventType = { */ export class LocalFileChangeEvent extends PropertyChangeEvent { - constructor(before?: IFileStat, after?: IFileStat, originalEvent?: Event) { + constructor(before?: IFileStat, after?: IFileStat, originalEvent?: BaseEvent) { super(null, before, after, originalEvent); } @@ -252,7 +252,7 @@ export class TextFileChangeEvent extends LocalFileChangeEvent { private _model: IModel; private _isAutoSaved: boolean; - constructor(model: IModel, before: IFileStat, after: IFileStat = before, originalEvent?: Event) { + constructor(model: IModel, before: IFileStat, after: IFileStat = before, originalEvent?: BaseEvent) { super(before, after, originalEvent); this._model = model; diff --git a/src/vs/workbench/parts/files/electron-browser/electronFileTracker.ts b/src/vs/workbench/parts/files/electron-browser/electronFileTracker.ts index 4fc1ba4f9a6..18b388c0bc8 100644 --- a/src/vs/workbench/parts/files/electron-browser/electronFileTracker.ts +++ b/src/vs/workbench/parts/files/electron-browser/electronFileTracker.ts @@ -78,8 +78,8 @@ export class FileTracker implements IWorkbenchContribution { this.toUnbind.push(this.eventService.addListener(FileEventType.FILE_REVERTED, (e: LocalFileChangeEvent) => this.onTextFileReverted(e))); // Working Files Model Change - this.textFileService.getWorkingFilesModel().onModelChange.add(this.onWorkingFilesModelChange, this); - this.toUnbind.push(() => this.textFileService.getWorkingFilesModel().onModelChange.remove(this.onWorkingFilesModelChange, this)); + const disposable = this.textFileService.getWorkingFilesModel().onModelChange(this.onWorkingFilesModelChange, this); + this.toUnbind.push(() => disposable.dispose()); // Support openFiles event for existing and new files ipc.on('vscode:openFiles', (request: IOpenFileRequest) => { @@ -100,7 +100,7 @@ export class FileTracker implements IWorkbenchContribution { } }); - this.lifecycleService.onShutdown.add(this.dispose, this); + this.lifecycleService.onShutdown(this.dispose, this); } private toInputs(paths: IPath[], isNew: boolean): IResourceInput[] { diff --git a/src/vs/workbench/parts/git/browser/gitServices.ts b/src/vs/workbench/parts/git/browser/gitServices.ts index d2e67e3756e..8667320355d 100644 --- a/src/vs/workbench/parts/git/browser/gitServices.ts +++ b/src/vs/workbench/parts/git/browser/gitServices.ts @@ -433,7 +433,7 @@ export class GitService extends ee.EventEmitter this.toDispose.push(this.eventService.addListener2(FileEventType.FILE_CHANGES,(e) => this.onFileChanges(e))); this.toDispose.push(this.eventService.addListener2(filesCommon.EventType.FILE_SAVED, (e) => this.onLocalFileChange(e))); this.toDispose.push(this.eventService.addListener2(filesCommon.EventType.FILE_REVERTED, (e) => this.onLocalFileChange(e))); - this.lifecycleService.onShutdown.add(this.dispose, this); + this.lifecycleService.onShutdown(this.dispose, this); } private triggerStatus(force: boolean = false): void { diff --git a/src/vs/workbench/parts/output/browser/outputActions.ts b/src/vs/workbench/parts/output/browser/outputActions.ts index b07c6695955..16874e7d56f 100644 --- a/src/vs/workbench/parts/output/browser/outputActions.ts +++ b/src/vs/workbench/parts/output/browser/outputActions.ts @@ -9,6 +9,7 @@ import nls = require('vs/nls'); import {Registry} from 'vs/platform/platform'; import errors = require('vs/base/common/errors'); import arrays = require('vs/base/common/arrays'); +import {disposeAll, IDisposable} from 'vs/base/common/lifecycle'; import {IAction, Action} from 'vs/base/common/actions'; import {EditorAction, Behaviour} from 'vs/editor/common/editorAction'; import {ICommonCodeEditor, IEditorActionDescriptorData} from 'vs/editor/common/editorCommon'; @@ -182,6 +183,7 @@ export class SwitchOutputAction extends EditorInputAction { export class SwitchOutputActionItem extends SelectActionItem { private input: OutputEditorInput; + private outputListenerDispose: IDisposable; constructor( action: IAction, @@ -192,7 +194,7 @@ export class SwitchOutputActionItem extends SelectActionItem { this.input = input; - this.outputService.onOutputChannel.add(this.onOutputChannel, this); + this.outputListenerDispose = this.outputService.onOutputChannel(this.onOutputChannel, this); } private onOutputChannel(): void { @@ -213,7 +215,11 @@ export class SwitchOutputActionItem extends SelectActionItem { public dispose(): void { super.dispose(); - this.outputService.onOutputChannel.remove(this.onOutputChannel, this); + if (this.outputListenerDispose) { + this.outputListenerDispose.dispose(); + delete this.outputListenerDispose; + } + delete this.input; } } \ No newline at end of file diff --git a/src/vs/workbench/parts/output/browser/outputEditorInput.ts b/src/vs/workbench/parts/output/browser/outputEditorInput.ts index 91156129997..0a3879a92a1 100644 --- a/src/vs/workbench/parts/output/browser/outputEditorInput.ts +++ b/src/vs/workbench/parts/output/browser/outputEditorInput.ts @@ -6,7 +6,6 @@ import {TPromise} from 'vs/base/common/winjs.base'; import nls = require('vs/nls'); -import {EventProvider} from 'vs/base/common/eventProvider'; import {EditorModel} from 'vs/workbench/common/editor'; import {LogEditorInput} from 'vs/workbench/browser/parts/editor/logEditorInput'; import {OUTPUT_EDITOR_INPUT_ID, IOutputEvent, OUTPUT_MIME, IOutputService} from 'vs/workbench/parts/output/common/output'; @@ -50,7 +49,8 @@ export class OutputEditorInput extends LogEditorInput { this.channel = channel; this.toUnbind = []; - this.outputService.onOutput.add(this.onOutputReceived, this); + const listenerUnbind = this.outputService.onOutput(this.onOutputReceived, this); + this.toUnbind.push(() => listenerUnbind.dispose()); } private onOutputReceived(e: IOutputEvent): void { @@ -109,8 +109,6 @@ export class OutputEditorInput extends LogEditorInput { this.toUnbind.pop()(); } - this.outputService.onOutput.remove(this.onOutputReceived, this); - super.dispose(); } } \ No newline at end of file diff --git a/src/vs/workbench/parts/output/browser/outputServices.ts b/src/vs/workbench/parts/output/browser/outputServices.ts index b8a0c75e271..acb2c8aa750 100644 --- a/src/vs/workbench/parts/output/browser/outputServices.ts +++ b/src/vs/workbench/parts/output/browser/outputServices.ts @@ -5,9 +5,8 @@ 'use strict'; import {Promise, TPromise} from 'vs/base/common/winjs.base'; -import {EventProvider} from 'vs/base/common/eventProvider'; import strings = require('vs/base/common/strings'); -import {EventSource} from 'vs/base/common/eventSource'; +import Event, {Emitter} from 'vs/base/common/event'; import {EditorOptions} from 'vs/workbench/common/editor'; import {StringEditor} from 'vs/workbench/browser/parts/editor/stringEditor'; import {OUTPUT_MIME, DEFAULT_OUTPUT_CHANNEL, IOutputEvent, IOutputService} from 'vs/workbench/parts/output/common/output'; @@ -30,8 +29,8 @@ export class OutputService implements IOutputService { private lastSentOutputEventsTime: number; private bufferedOutput: { [channel: string]: string; }; - private _onOutput: EventSource<(event: IOutputEvent) => void>; - private _onOutputChannel: EventSource<(channel: string) => void>; + private _onOutput: Emitter; + private _onOutputChannel: Emitter; constructor( @IInstantiationService private instantiationService: IInstantiationService, @@ -39,8 +38,8 @@ export class OutputService implements IOutputService { @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @ILifecycleService private lifecycleService: ILifecycleService ) { - this._onOutput = new EventSource<(event: IOutputEvent) => void>(); - this._onOutputChannel = new EventSource<(channel: string) => void>(); + this._onOutput = new Emitter(); + this._onOutputChannel = new Emitter(); this.receivedOutput = Object.create(null); @@ -51,16 +50,16 @@ export class OutputService implements IOutputService { this.registerListeners(); } - public get onOutput(): EventProvider<(event: IOutputEvent) => void> { - return this._onOutput.value; + public get onOutput(): Event { + return this._onOutput.event; } - public get onOutputChannel(): EventProvider<(channel: string) => void> { - return this._onOutputChannel.value; + public get onOutputChannel(): Event { + return this._onOutputChannel.event; } private registerListeners(): void { - this.lifecycleService.onShutdown.add(this.dispose, this); + this.lifecycleService.onShutdown(this.dispose, this); } public append(channelOrOutput: string, output?: string): void { diff --git a/src/vs/workbench/parts/output/common/output.ts b/src/vs/workbench/parts/output/common/output.ts index 2eb23b8bcf0..6ec8a8e5a55 100644 --- a/src/vs/workbench/parts/output/common/output.ts +++ b/src/vs/workbench/parts/output/common/output.ts @@ -6,7 +6,7 @@ import {TPromise} from 'vs/base/common/winjs.base'; import nls = require('vs/nls'); -import {EventProvider} from 'vs/base/common/eventProvider'; +import Event, {Emitter} from 'vs/base/common/event'; import {Registry} from 'vs/platform/platform'; import {createDecorator, ServiceIdentifier} from 'vs/platform/instantiation/common/instantiation'; import {IEditor, Position} from 'vs/platform/editor/common/editor'; @@ -90,12 +90,12 @@ export interface IOutputService { /** * Allows to register on Output events */ - onOutput: EventProvider<(event: IOutputEvent) => void>; + onOutput: Event; /** * Allows to register on a new Output channel getting filled with output */ - onOutputChannel: EventProvider<(channel: string) => void>; + onOutputChannel: Event; } export interface IOutputChannelRegistry { diff --git a/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.ts b/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.ts index 51e58b84c5d..a844c30b206 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.ts +++ b/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.ts @@ -69,7 +69,7 @@ export class SnippetsTracker implements workbenchExt.IWorkbenchContribution { // the path might not exist anymore, ignore this error and return } - this.lifecycleService.onShutdown.add(this.dispose, this); + this.lifecycleService.onShutdown(this.dispose, this); } private scanUserSnippets() : winjs.Promise { diff --git a/src/vs/workbench/services/message/browser/messageService.ts b/src/vs/workbench/services/message/browser/messageService.ts index 9577c0b5788..f33e510a844 100644 --- a/src/vs/workbench/services/message/browser/messageService.ts +++ b/src/vs/workbench/services/message/browser/messageService.ts @@ -29,6 +29,7 @@ export class WorkbenchMessageService implements IMessageService { public serviceId = IMessageService; private handler: MessageList; + private disposeables: IDisposable[]; private statusMsgDispose: IDisposable; private canShowMessages: boolean; @@ -48,6 +49,7 @@ export class WorkbenchMessageService implements IMessageService { this.messageBuffer = []; this.canShowMessages = true; + this.disposeables = []; this.registerListeners(); } @@ -56,13 +58,13 @@ export class WorkbenchMessageService implements IMessageService { this.statusbarService = statusbarService; this.quickOpenService = quickOpenService; - this.quickOpenService.onShow.add(this.onQuickOpenShowing, this); - this.quickOpenService.onHide.add(this.onQuickOpenHiding, this); + this.disposeables.push(this.quickOpenService.onShow(this.onQuickOpenShowing, this)); + this.disposeables.push(this.quickOpenService.onHide(this.onQuickOpenHiding, this)); } private registerListeners(): void { - this.handler.onMessagesShowing.add(this.onMessagesShowing, this); - this.handler.onMessagesCleared.add(this.onMessagesCleared, this); + this.disposeables.push(this.handler.onMessagesShowing(this.onMessagesShowing, this)); + this.disposeables.push(this.handler.onMessagesCleared(this.onMessagesCleared, this)); } private onMessagesShowing(): void { @@ -205,12 +207,8 @@ export class WorkbenchMessageService implements IMessageService { } public dispose(): void { - this.handler.onMessagesShowing.remove(this.onMessagesShowing, this); - this.handler.onMessagesCleared.remove(this.onMessagesCleared, this); - - if (this.quickOpenService) { - this.quickOpenService.onShow.remove(this.onQuickOpenShowing, this); - this.quickOpenService.onHide.remove(this.onQuickOpenHiding, this); + while (this.disposeables.length) { + this.disposeables.pop().dispose(); } } } \ No newline at end of file diff --git a/src/vs/workbench/services/quickopen/browser/quickOpenService.ts b/src/vs/workbench/services/quickopen/browser/quickOpenService.ts index ece782330ab..0314694c7b9 100644 --- a/src/vs/workbench/services/quickopen/browser/quickOpenService.ts +++ b/src/vs/workbench/services/quickopen/browser/quickOpenService.ts @@ -6,7 +6,7 @@ import {ITree, IElementCallback} from 'vs/base/parts/tree/common/tree'; import {TPromise} from 'vs/base/common/winjs.base'; -import {EventProvider} from 'vs/base/common/eventProvider'; +import Event, {Emitter} from 'vs/base/common/event'; import {IQuickNavigateConfiguration, IAutoFocus} from 'vs/base/parts/quickopen/browser/quickOpen'; import {createDecorator, ServiceIdentifier} from 'vs/platform/instantiation/common/instantiation'; import {IEditorInput} from 'vs/platform/editor/common/editor'; @@ -119,10 +119,10 @@ export interface IQuickOpenService { /** * Allows to register on the event that quick open is showing */ - onShow: EventProvider<() => void>; + onShow: Event; /** * Allows to register on the event that quick open is hiding */ - onHide: EventProvider<() => void>; + onHide: Event; } \ No newline at end of file diff --git a/src/vs/workbench/services/window/electron-browser/windowService.ts b/src/vs/workbench/services/window/electron-browser/windowService.ts index 24896b3b74d..0f45876662b 100644 --- a/src/vs/workbench/services/window/electron-browser/windowService.ts +++ b/src/vs/workbench/services/window/electron-browser/windowService.ts @@ -7,8 +7,7 @@ import {ElectronWindow} from 'vs/workbench/electron-browser/window'; import {createDecorator, ServiceIdentifier} from 'vs/platform/instantiation/common/instantiation'; -import {EventProvider} from 'vs/base/common/eventProvider'; -import {EventSource} from 'vs/base/common/eventSource'; +import Event, {Emitter} from 'vs/base/common/event'; import remote = require('remote'); import ipc = require('ipc'); @@ -35,17 +34,17 @@ export interface IWindowService { broadcast(b: IBroadcast, target?: string): void; - onBroadcast: EventProvider<(b: IBroadcast) => void>; + onBroadcast: Event; } export class WindowService implements IWindowService { public serviceId = IWindowService; private win: ElectronWindow; - private _onBroadcast: EventSource<(b: IBroadcast) => void>; + private _onBroadcast: Emitter; constructor() { - this._onBroadcast = new EventSource<(b: IBroadcast) => void>(); + this._onBroadcast = new Emitter(); this.registerListeners(); } @@ -56,8 +55,8 @@ export class WindowService implements IWindowService { }); } - public get onBroadcast(): EventProvider<(event: IBroadcast) => void> { - return this._onBroadcast.value; + public get onBroadcast(): Event { + return this._onBroadcast.event; } public getWindowId(): number { diff --git a/src/vs/workbench/test/browser/servicesTestUtils.ts b/src/vs/workbench/test/browser/servicesTestUtils.ts index 7316b2920b3..b737b37a1e8 100644 --- a/src/vs/workbench/test/browser/servicesTestUtils.ts +++ b/src/vs/workbench/test/browser/servicesTestUtils.ts @@ -18,10 +18,10 @@ import Storage = require('vs/workbench/browser/storage'); import WorkbenchEditorCommon = require('vs/workbench/common/editor'); import Viewlet = require('vs/workbench/browser/viewlet'); import InstantiationService = require('vs/platform/instantiation/common/instantiationService'); +import Event, {Emitter} from 'vs/base/common/event'; import LifecycleService = require('vs/platform/lifecycle/common/baseLifecycleService'); import Types = require('vs/base/common/types'); import Mime = require('vs/base/common/mime'); -import {EventProvider} from 'vs/base/common/eventProvider'; import Assert = require('vs/base/common/assert'); import Severity from 'vs/base/common/severity'; import Arrays = require('vs/base/common/arrays'); @@ -506,11 +506,11 @@ export class TestQuickOpenService implements QuickOpenService.IQuickOpenService return []; } - get onShow(): EventProvider<() => void> { + get onShow(): Event { return null; } - get onHide(): EventProvider<() => void> { + get onHide(): Event { return null; }