提交 a54912ca 编写于 作者: S Sandeep Somavarapu

Fix #96695

上级 656920b1
......@@ -368,6 +368,9 @@ class ViewsExtensionHandler implements IWorkbenchContribution {
}
private addViews(extensions: readonly IExtensionPointUser<ViewExtensionPointType>[]): void {
const viewIds: Set<string> = new Set<string>();
const allViewDescriptors: { views: IViewDescriptor[], viewContainer: ViewContainer }[] = [];
for (const extension of extensions) {
const { value, collector } = extension;
......@@ -386,10 +389,9 @@ class ViewsExtensionHandler implements IWorkbenchContribution {
collector.warn(localize('ViewContainerDoesnotExist', "View container '{0}' does not exist and all views registered to it will be added to 'Explorer'.", entry.key));
}
const container = viewContainer || this.getDefaultViewContainer();
const viewIds: string[] = [];
const viewDescriptors = coalesce(entry.value.map((item, index) => {
// validate
if (viewIds.indexOf(item.id) !== -1) {
if (viewIds.has(item.id)) {
collector.error(localize('duplicateView1', "Cannot register multiple views with same id `{0}`", item.id));
return null;
}
......@@ -421,12 +423,16 @@ class ViewsExtensionHandler implements IWorkbenchContribution {
remoteAuthority: item.remoteName || (<any>item).remoteAuthority // TODO@roblou - delete after remote extensions are updated
};
viewIds.push(viewDescriptor.id);
viewIds.add(viewDescriptor.id);
return viewDescriptor;
}));
this.viewsRegistry.registerViews(viewDescriptors, container);
allViewDescriptors.push({ viewContainer: container, views: viewDescriptors });
});
}
this.viewsRegistry.registerViews2(allViewDescriptors);
}
private getDefaultViewContainer(): ViewContainer {
......
......@@ -282,7 +282,7 @@ export interface IViewContentDescriptor {
export interface IViewsRegistry {
readonly onViewsRegistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }>;
readonly onViewsRegistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }[]>;
readonly onViewsDeregistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }>;
......@@ -290,6 +290,8 @@ export interface IViewsRegistry {
registerViews(views: IViewDescriptor[], viewContainer: ViewContainer): void;
registerViews2(views: { views: IViewDescriptor[], viewContainer: ViewContainer }[]): void;
deregisterViews(views: IViewDescriptor[], viewContainer: ViewContainer): void;
moveViews(views: IViewDescriptor[], viewContainer: ViewContainer): void;
......@@ -319,8 +321,8 @@ function compareViewContentDescriptors(a: IViewContentDescriptor, b: IViewConten
class ViewsRegistry extends Disposable implements IViewsRegistry {
private readonly _onViewsRegistered: Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }> = this._register(new Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }>());
readonly onViewsRegistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }> = this._onViewsRegistered.event;
private readonly _onViewsRegistered = this._register(new Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }[]>());
readonly onViewsRegistered = this._onViewsRegistered.event;
private readonly _onViewsDeregistered: Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }> = this._register(new Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }>());
readonly onViewsDeregistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }> = this._onViewsDeregistered.event;
......@@ -336,8 +338,12 @@ class ViewsRegistry extends Disposable implements IViewsRegistry {
private _viewWelcomeContents = new SetMap<string, IViewContentDescriptor>();
registerViews(views: IViewDescriptor[], viewContainer: ViewContainer): void {
this.addViews(views, viewContainer);
this._onViewsRegistered.fire({ views: views, viewContainer });
this.registerViews2([{ views, viewContainer }]);
}
registerViews2(views: { views: IViewDescriptor[], viewContainer: ViewContainer }[]): void {
views.forEach(({ views, viewContainer }) => this.addViews(views, viewContainer));
this._onViewsRegistered.fire(views);
}
deregisterViews(viewDescriptors: IViewDescriptor[], viewContainer: ViewContainer): void {
......
......@@ -119,7 +119,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor
// Try generating all generated containers that don't need extensions
this.tryGenerateContainers();
this._register(this.viewsRegistry.onViewsRegistered(({ views, viewContainer }) => this.onDidRegisterViews(views, viewContainer)));
this._register(this.viewsRegistry.onViewsRegistered(views => this.onDidRegisterViews(views)));
this._register(this.viewsRegistry.onViewsDeregistered(({ views, viewContainer }) => this.onDidDeregisterViews(views, viewContainer)));
this._register(this.viewsRegistry.onDidChangeContainer(({ views, from, to }) => this.moveViews(views, from, to)));
......@@ -212,16 +212,18 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor
this.tryGenerateContainers(true);
}
private onDidRegisterViews(views: IViewDescriptor[], viewContainer: ViewContainer): void {
// When views are registered, we need to regroup them based on the cache
const regroupedViews = this.regroupViews(viewContainer.id, views);
private onDidRegisterViews(views: { views: IViewDescriptor[], viewContainer: ViewContainer }[]): void {
views.forEach(({ views, viewContainer }) => {
// When views are registered, we need to regroup them based on the cache
const regroupedViews = this.regroupViews(viewContainer.id, views);
// Once they are grouped, try registering them which occurs
// if the container has already been registered within this service
// or we can generate the container from the source view id
this.registerGroupedViews(regroupedViews);
// Once they are grouped, try registering them which occurs
// if the container has already been registered within this service
// or we can generate the container from the source view id
this.registerGroupedViews(regroupedViews);
views.forEach(viewDescriptor => this.getOrCreateMovableViewContextKey(viewDescriptor).set(!!viewDescriptor.canMoveView));
views.forEach(viewDescriptor => this.getOrCreateMovableViewContextKey(viewDescriptor).set(!!viewDescriptor.canMoveView));
});
}
private shouldGenerateContainer(containerInfo: ICachedViewContainerInfo): boolean {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册