提交 2540182a 编写于 作者: S Sandeep Somavarapu

Fix #66598

上级 0ad67db1
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
import { localize } from 'vs/nls'; import { localize } from 'vs/nls';
import { forEach } from 'vs/base/common/collections'; import { forEach } from 'vs/base/common/collections';
import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { IJSONSchema } from 'vs/base/common/jsonSchema';
import { ExtensionMessageCollector, ExtensionsRegistry, IExtensionPoint } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { ExtensionMessageCollector, ExtensionsRegistry, IExtensionPoint, IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry';
import { ViewContainer, ViewsRegistry, ICustomViewDescriptor, IViewContainersRegistry, Extensions as ViewContainerExtensions } from 'vs/workbench/common/views'; import { ViewContainer, ViewsRegistry, ICustomViewDescriptor, IViewContainersRegistry, Extensions as ViewContainerExtensions } from 'vs/workbench/common/views';
import { CustomTreeViewPanel, CustomTreeView } from 'vs/workbench/browser/parts/views/customView'; import { CustomTreeViewPanel, CustomTreeView } from 'vs/workbench/browser/parts/views/customView';
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
...@@ -82,11 +82,12 @@ const viewsContribution: IJSONSchema = { ...@@ -82,11 +82,12 @@ const viewsContribution: IJSONSchema = {
} }
}; };
type ViewExtensionPointType = { [loc: string]: IUserFriendlyViewDescriptor[] };
const viewsExtensionPoint: IExtensionPoint<{ [loc: string]: IUserFriendlyViewDescriptor[] }> = ExtensionsRegistry.registerExtensionPoint<{ [loc: string]: IUserFriendlyViewDescriptor[] }>({ const viewsExtensionPoint: IExtensionPoint<ViewExtensionPointType> = ExtensionsRegistry.registerExtensionPoint<ViewExtensionPointType>({
extensionPoint: 'views', extensionPoint: 'views',
deps: [viewsContainersExtensionPoint], deps: [viewsContainersExtensionPoint],
jsonSchema: viewsContribution jsonSchema: viewsContribution,
isDynamic: true
}); });
class ViewsContainersExtensionHandler implements IWorkbenchContribution { class ViewsContainersExtensionHandler implements IWorkbenchContribution {
...@@ -101,52 +102,72 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { ...@@ -101,52 +102,72 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution {
} }
private handleAndRegisterCustomViews() { private handleAndRegisterCustomViews() {
viewsExtensionPoint.setHandler(extensions => { viewsExtensionPoint.setHandler((extensions, { added, removed }) => {
for (let extension of extensions) { if (removed.length) {
const { value, collector } = extension; this.removeViews(removed);
}
if (added.length) {
this.addViews(added);
}
});
}
forEach(value, entry => { private addViews(extensions: IExtensionPointUser<ViewExtensionPointType>[]): void {
if (!this.isValidViewDescriptors(entry.value, collector)) { for (const extension of extensions) {
return; const { value, collector } = extension;
forEach(value, entry => {
if (!this.isValidViewDescriptors(entry.value, collector)) {
return;
}
let container = this.getViewContainer(entry.key);
if (!container) {
collector.warn(localize('ViewContainerDoesnotExist', "View container '{0}' does not exist and all views registered to it will be added to 'Explorer'.", entry.key));
container = this.viewContainersRegistry.get(EXPLORER);
}
const registeredViews = ViewsRegistry.getViews(container);
const viewIds: string[] = [];
const viewDescriptors = coalesce(entry.value.map((item, index) => {
// validate
if (viewIds.indexOf(item.id) !== -1) {
collector.error(localize('duplicateView1', "Cannot register multiple views with same id `{0}` in the view container `{1}`", item.id, container.id));
return null;
} }
if (registeredViews.some(v => v.id === item.id)) {
let container = this.getViewContainer(entry.key); collector.error(localize('duplicateView2', "A view with id `{0}` is already registered in the view container `{1}`", item.id, container.id));
if (!container) { return null;
collector.warn(localize('ViewContainerDoesnotExist', "View container '{0}' does not exist and all views registered to it will be added to 'Explorer'.", entry.key));
container = this.viewContainersRegistry.get(EXPLORER);
} }
const registeredViews = ViewsRegistry.getViews(container);
const viewIds: string[] = []; const viewDescriptor = <ICustomViewDescriptor>{
const viewDescriptors = coalesce(entry.value.map((item, index) => { id: item.id,
// validate name: item.name,
if (viewIds.indexOf(item.id) !== -1) { ctor: CustomTreeViewPanel,
collector.error(localize('duplicateView1', "Cannot register multiple views with same id `{0}` in the view container `{1}`", item.id, container.id)); container,
return null; when: ContextKeyExpr.deserialize(item.when),
} canToggleVisibility: true,
if (registeredViews.some(v => v.id === item.id)) { collapsed: this.showCollapsed(container),
collector.error(localize('duplicateView2', "A view with id `{0}` is already registered in the view container `{1}`", item.id, container.id)); treeView: this.instantiationService.createInstance(CustomTreeView, item.id, container),
return null; order: ExtensionIdentifier.equals(extension.description.identifier, container.extensionId) ? index + 1 : undefined,
} extensionId: extension.description.identifier
};
const viewDescriptor = <ICustomViewDescriptor>{
id: item.id, viewIds.push(viewDescriptor.id);
name: item.name, return viewDescriptor;
ctor: CustomTreeViewPanel, }));
container, ViewsRegistry.registerViews(viewDescriptors);
when: ContextKeyExpr.deserialize(item.when), });
canToggleVisibility: true, }
collapsed: this.showCollapsed(container), }
treeView: this.instantiationService.createInstance(CustomTreeView, item.id, container),
order: ExtensionIdentifier.equals(extension.description.identifier, container.extensionId) ? index + 1 : undefined private removeViews(extensions: IExtensionPointUser<ViewExtensionPointType>[]): void {
}; const removedExtensions: Set<string> = extensions.reduce((result, e) => { result.add(ExtensionIdentifier.toKey(e.description.identifier)); return result; }, new Set<string>());
for (const viewContainer of this.viewContainersRegistry.all) {
viewIds.push(viewDescriptor.id); const removedViews = ViewsRegistry.getViews(viewContainer).filter((v: ICustomViewDescriptor) => v.extensionId && removedExtensions.has(ExtensionIdentifier.toKey(v.extensionId)));
return viewDescriptor; if (removedViews.length) {
})); ViewsRegistry.deregisterViews(removedViews.map(v => v.id), viewContainer);
ViewsRegistry.registerViews(viewDescriptors);
});
} }
}); }
} }
private isValidViewDescriptors(viewDescriptors: IUserFriendlyViewDescriptor[], collector: ExtensionMessageCollector): boolean { private isValidViewDescriptors(viewDescriptors: IUserFriendlyViewDescriptor[], collector: ExtensionMessageCollector): boolean {
...@@ -173,7 +194,6 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { ...@@ -173,7 +194,6 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution {
return true; return true;
} }
private getViewContainer(value: string): ViewContainer { private getViewContainer(value: string): ViewContainer {
switch (value) { switch (value) {
case 'explorer': return this.viewContainersRegistry.get(EXPLORER); case 'explorer': return this.viewContainersRegistry.get(EXPLORER);
......
...@@ -297,7 +297,7 @@ export interface IRevealOptions { ...@@ -297,7 +297,7 @@ export interface IRevealOptions {
export interface ICustomViewDescriptor extends IViewDescriptor { export interface ICustomViewDescriptor extends IViewDescriptor {
readonly treeView: ITreeView; readonly treeView: ITreeView;
readonly extensionId: ExtensionIdentifier;
} }
export type TreeViewItemHandleArg = { export type TreeViewItemHandleArg = {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册