diff --git a/packages/property-view/src/browser/empty-property-view-widget-provider.tsx b/packages/property-view/src/browser/empty-property-view-widget-provider.tsx
index 351162c5ea13b..15f6bdc7f5da3 100644
--- a/packages/property-view/src/browser/empty-property-view-widget-provider.tsx
+++ b/packages/property-view/src/browser/empty-property-view-widget-provider.tsx
@@ -39,9 +39,11 @@ class EmptyPropertyViewWidget extends ReactWidget implements PropertyViewContent
}
protected render(): React.ReactNode {
- return
{'No properties available.'}
;
+ return this.emptyComponent;
}
+ protected emptyComponent: JSX.Element = No properties available.
;
+
}
/**
diff --git a/packages/property-view/src/browser/property-view-frontend-module.ts b/packages/property-view/src/browser/property-view-frontend-module.ts
index 0598cd1d1cb51..5912e5d850ab4 100644
--- a/packages/property-view/src/browser/property-view-frontend-module.ts
+++ b/packages/property-view/src/browser/property-view-frontend-module.ts
@@ -32,7 +32,8 @@ export default new ContainerModule(bind => {
bindContributionProvider(bind, PropertyDataService);
bindContributionProvider(bind, PropertyViewWidgetProvider);
- bind(PropertyViewWidgetProvider).to(EmptyPropertyViewWidgetProvider).inSingletonScope();
+ bind(EmptyPropertyViewWidgetProvider).toSelf().inSingletonScope();
+ bind(PropertyViewWidgetProvider).to(EmptyPropertyViewWidgetProvider);
bind(PropertyViewWidget).toSelf();
bind(WidgetFactory).toDynamicValue(({ container }) => ({
diff --git a/packages/property-view/src/browser/property-view-service.ts b/packages/property-view/src/browser/property-view-service.ts
index 8282edc20601c..6097f1e39a917 100644
--- a/packages/property-view/src/browser/property-view-service.ts
+++ b/packages/property-view/src/browser/property-view-service.ts
@@ -28,6 +28,9 @@ export class PropertyViewService {
@inject(ContributionProvider) @named(PropertyViewWidgetProvider)
private readonly contributions: ContributionProvider;
+ @inject(EmptyPropertyViewWidgetProvider)
+ private readonly emptyWidgetProvider: EmptyPropertyViewWidgetProvider;
+
private providers: PropertyViewWidgetProvider[] = [];
@postConstruct()
@@ -41,7 +44,7 @@ export class PropertyViewService {
*/
async getProvider(selection: Object | undefined): Promise {
const provider = await this.prioritize(selection);
- return provider ?? this.getEmptyProvider();
+ return provider ?? this.emptyWidgetProvider;
}
protected async prioritize(selection: Object | undefined): Promise {
@@ -55,8 +58,4 @@ export class PropertyViewService {
return prioritized.length !== 0 ? prioritized[0].value : undefined;
}
- private getEmptyProvider(): PropertyViewWidgetProvider {
- return this.providers.find(p => p.id === EmptyPropertyViewWidgetProvider.ID) as EmptyPropertyViewWidgetProvider;
- }
-
}
diff --git a/packages/property-view/src/browser/property-view-widget.tsx b/packages/property-view/src/browser/property-view-widget.tsx
index af7aaf3d69f41..6f256f86a850f 100644
--- a/packages/property-view/src/browser/property-view-widget.tsx
+++ b/packages/property-view/src/browser/property-view-widget.tsx
@@ -46,11 +46,15 @@ export class PropertyViewWidget extends BaseWidget {
this.addClass('theia-property-view-widget');
this.node.tabIndex = 0;
+ let disposed = false;
+ this.toDispose.push(Disposable.create(() => disposed = true));
this.toDispose.push(this.selectionService.onSelectionChanged((selection: Object | undefined) => {
this.propertyViewService.getProvider(selection).then(provider => {
provider.provideWidget(selection).then(contentWidget => {
- this.replaceContentWidget(contentWidget);
- provider.updateContentWidget(selection);
+ if (!disposed) {
+ this.replaceContentWidget(contentWidget);
+ provider.updateContentWidget(selection);
+ }
});
});
}));