From 88f1e2d26d575ac93aa2a11355dde835216a7e02 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 18 Dec 2019 15:30:39 +0100 Subject: [PATCH] change view container registry to use location --- src/vs/workbench/browser/parts/views/views.ts | 4 +- src/vs/workbench/common/views.ts | 54 ++++++++++++------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/views.ts b/src/vs/workbench/browser/parts/views/views.ts index 2b35bf2b70c..2c5cf72cdfb 100644 --- a/src/vs/workbench/browser/parts/views/views.ts +++ b/src/vs/workbench/browser/parts/views/views.ts @@ -655,8 +655,8 @@ export class ViewsService extends Disposable implements IViewsService { this.viewDisposable.forEach(disposable => disposable.dispose()); this.viewDisposable.clear(); })); - this._register(viewContainersRegistry.onDidRegister(viewContainer => this.onDidRegisterViewContainer(viewContainer))); - this._register(viewContainersRegistry.onDidDeregister(viewContainer => this.onDidDeregisterViewContainer(viewContainer))); + this._register(viewContainersRegistry.onDidRegister(({ viewContainer }) => this.onDidRegisterViewContainer(viewContainer))); + this._register(viewContainersRegistry.onDidDeregister(({ viewContainer }) => this.onDidDeregisterViewContainer(viewContainer))); this._register(toDisposable(() => { this.viewDescriptorCollections.forEach(({ disposable }) => disposable.dispose()); this.viewDescriptorCollections.clear(); diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 2c729271e21..13473dadd3b 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -12,11 +12,12 @@ import { IViewlet } from 'vs/workbench/common/viewlet'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; -import { values, keys } from 'vs/base/common/map'; +import { values, keys, getOrSet } from 'vs/base/common/map'; import { Registry } from 'vs/platform/registry/common/platform'; import { IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IAction } from 'vs/base/common/actions'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { flatten } from 'vs/base/common/arrays'; export const TEST_VIEW_CONTAINER_ID = 'workbench.view.extension.test'; export const FocusedViewContext = new RawContextKey('focusedView', ''); @@ -47,12 +48,12 @@ export interface IViewContainersRegistry { /** * An event that is triggerred when a view container is registered. */ - readonly onDidRegister: Event; + readonly onDidRegister: Event<{ viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation }>; /** * An event that is triggerred when a view container is deregistered. */ - readonly onDidDeregister: Event; + readonly onDidDeregister: Event<{ viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation }>; /** * All registered view containers @@ -82,6 +83,11 @@ export interface IViewContainersRegistry { * @returns the view container with given id. */ get(id: string): ViewContainer | undefined; + + /** + * Returns all view containers in the given location + */ + getViewContainers(location: ViewContainerLocation): ViewContainer[]; } interface ViewOrderDelegate { @@ -100,20 +106,20 @@ export class ViewContainer { class ViewContainersRegistryImpl extends Disposable implements IViewContainersRegistry { - private readonly _onDidRegister = this._register(new Emitter()); - readonly onDidRegister: Event = this._onDidRegister.event; + private readonly _onDidRegister = this._register(new Emitter<{ viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation }>()); + readonly onDidRegister: Event<{ viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation }> = this._onDidRegister.event; - private readonly _onDidDeregister = this._register(new Emitter()); - readonly onDidDeregister: Event = this._onDidDeregister.event; + private readonly _onDidDeregister = this._register(new Emitter<{ viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation }>()); + readonly onDidDeregister: Event<{ viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation }> = this._onDidDeregister.event; - private viewContainers: Map = new Map(); + private viewContainers: Map = new Map(); get all(): ViewContainer[] { - return values(this.viewContainers); + return flatten(values(this.viewContainers)); } - registerViewContainer(viewContainerDescriptor: IViewContainerDescriptor, location: ViewContainerLocation): ViewContainer { - const existing = this.viewContainers.get(viewContainerDescriptor.id); + registerViewContainer(viewContainerDescriptor: IViewContainerDescriptor, viewContainerLocation: ViewContainerLocation): ViewContainer { + const existing = this.get(viewContainerDescriptor.id); if (existing) { return existing; } @@ -123,21 +129,33 @@ class ViewContainersRegistryImpl extends Disposable implements IViewContainersRe super(viewContainerDescriptor); } }; - this.viewContainers.set(viewContainerDescriptor.id, viewContainer); - this._onDidRegister.fire(viewContainer); + const viewContainers = getOrSet(this.viewContainers, viewContainerLocation, []); + viewContainers.push(viewContainer); + this._onDidRegister.fire({ viewContainer, viewContainerLocation }); return viewContainer; } deregisterViewContainer(viewContainer: ViewContainer): void { - const existing = this.viewContainers.get(viewContainer.id); - if (existing) { - this.viewContainers.delete(viewContainer.id); - this._onDidDeregister.fire(viewContainer); + for (const viewContainerLocation of keys(this.viewContainers)) { + const viewContainers = this.viewContainers.get(viewContainerLocation)!; + const index = viewContainers?.indexOf(viewContainer); + if (index !== -1) { + viewContainers?.splice(index, 1); + if (viewContainers.length === 0) { + this.viewContainers.delete(viewContainerLocation); + } + this._onDidDeregister.fire({ viewContainer, viewContainerLocation }); + return; + } } } get(id: string): ViewContainer | undefined { - return this.viewContainers.get(id); + return this.all.filter(viewContainer => viewContainer.id === id)[0]; + } + + getViewContainers(location: ViewContainerLocation): ViewContainer[] { + return [...(this.viewContainers.get(location) || [])]; } }