Make tree view data providers disposable
On main tree views disposed
- Deregister and dispose data providers
This commit is contained in:
Sandeep Somavarapu
2017-08-22 19:06:15 +02:00
parent 55413ced76
commit c0b509ed0b
4 changed files with 34 additions and 14 deletions

View File

@@ -6,6 +6,7 @@
import Event, { Emitter } from 'vs/base/common/event';
import { TPromise } from 'vs/base/common/winjs.base';
import { Disposable } from 'vs/base/common/lifecycle';
import { ExtHostContext, MainThreadTreeViewsShape, ExtHostTreeViewsShape, MainContext, IExtHostContext } from '../node/extHost.protocol';
import { IMessageService, Severity } from 'vs/platform/message/common/message';
import { ViewsRegistry } from 'vs/workbench/parts/views/browser/viewsRegistry';
@@ -13,7 +14,7 @@ import { ITreeViewDataProvider, ITreeItem, TreeItemCollapsibleState } from 'vs/w
import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers';
@extHostNamedCustomer(MainContext.MainThreadTreeViews)
export class MainThreadTreeViews implements MainThreadTreeViewsShape {
export class MainThreadTreeViews extends Disposable implements MainThreadTreeViewsShape {
private _proxy: ExtHostTreeViewsShape;
@@ -21,16 +22,12 @@ export class MainThreadTreeViews implements MainThreadTreeViewsShape {
extHostContext: IExtHostContext,
@IMessageService private messageService: IMessageService
) {
super();
this._proxy = extHostContext.get(ExtHostContext.ExtHostTreeViews);
}
public dispose(): void {
// TODO@Sandeep: please implement this
// will be called when the extension host process is gone.
}
$registerView(treeViewId: string): void {
ViewsRegistry.registerTreeViewDataProvider(treeViewId, new TreeViewDataProvider(treeViewId, this._proxy, this.messageService));
ViewsRegistry.registerTreeViewDataProvider(treeViewId, this._register(new TreeViewDataProvider(treeViewId, this._proxy, this.messageService)));
}
$refresh(treeViewId: string, treeItemHandles: number[]): void {
@@ -39,6 +36,11 @@ export class MainThreadTreeViews implements MainThreadTreeViewsShape {
treeViewDataProvider.refresh(treeItemHandles);
}
}
dispose(): void {
ViewsRegistry.deregisterTreeViewDataProviders();
super.dispose();
}
}
type TreeItemHandle = number;
@@ -48,6 +50,9 @@ class TreeViewDataProvider implements ITreeViewDataProvider {
private _onDidChange: Emitter<ITreeItem[] | undefined | null> = new Emitter<ITreeItem[] | undefined | null>();
readonly onDidChange: Event<ITreeItem[] | undefined | null> = this._onDidChange.event;
private _onDispose: Emitter<void> = new Emitter<void>();
readonly onDispose: Event<void> = this._onDispose.event;
private childrenMap: Map<TreeItemHandle, TreeItemHandle[]> = new Map<TreeItemHandle, TreeItemHandle[]>();
private itemsMap: Map<TreeItemHandle, ITreeItem> = new Map<TreeItemHandle, ITreeItem>();
@@ -94,6 +99,10 @@ class TreeViewDataProvider implements ITreeViewDataProvider {
}
}
dispose(): void {
this._onDispose.fire();
}
private clearChildren(treeItemHandle: TreeItemHandle): void {
const children = this.childrenMap.get(treeItemHandle);
if (children) {