diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index ee29d02b4d0..c8a08f2f706 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -839,6 +839,11 @@ export class WorkbenchAsyncDataTree extends Async this.internals = new WorkbenchTreeInternals(this, treeOptions, getAutomaticKeyboardNavigation, options.overrideStyles, contextKeyService, listService, themeService, configurationService, accessibilityService); this.disposables.add(this.internals); } + + updateOptions(options: IWorkbenchAsyncDataTreeOptions = {}): void { + super.updateOptions(options); + this.internals.updateStyleOverrides(options.overrideStyles); + } } export interface IWorkbenchCompressibleAsyncDataTreeOptions extends ICompressibleAsyncDataTreeOptions { @@ -936,15 +941,16 @@ class WorkbenchTreeInternals { private hasMultiSelection: IContextKey; private _useAltAsMultipleSelectionModifier: boolean; private disposables: IDisposable[] = []; + private styler!: IDisposable; constructor( - tree: WorkbenchObjectTree | CompressibleObjectTree | WorkbenchDataTree | WorkbenchAsyncDataTree | WorkbenchCompressibleAsyncDataTree, + private tree: WorkbenchObjectTree | CompressibleObjectTree | WorkbenchDataTree | WorkbenchAsyncDataTree | WorkbenchCompressibleAsyncDataTree, options: IAbstractTreeOptions | IAsyncDataTreeOptions, getAutomaticKeyboardNavigation: () => boolean | undefined, overrideStyles: IColorMapping | undefined, @IContextKeyService contextKeyService: IContextKeyService, @IListService listService: IListService, - @IThemeService themeService: IThemeService, + @IThemeService private themeService: IThemeService, @IConfigurationService configurationService: IConfigurationService, @IAccessibilityService accessibilityService: IAccessibilityService, ) { @@ -970,10 +976,11 @@ class WorkbenchTreeInternals { }); }; + this.updateStyleOverrides(overrideStyles); + this.disposables.push( this.contextKeyService, (listService as ListService).register(tree), - overrideStyles ? attachListStyler(tree, themeService, overrideStyles) : Disposable.None, tree.onDidChangeSelection(() => { const selection = tree.getSelection(); const focus = tree.getFocus(); @@ -1023,8 +1030,14 @@ class WorkbenchTreeInternals { return this._useAltAsMultipleSelectionModifier; } + updateStyleOverrides(overrideStyles?: IColorMapping): void { + dispose(this.styler); + this.styler = overrideStyles ? attachListStyler(this.tree, this.themeService, overrideStyles) : Disposable.None; + } + dispose(): void { this.disposables = dispose(this.disposables); + this.styler = dispose(this.styler); } } diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index e198a29483d..d313f037550 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -37,6 +37,7 @@ import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/wor import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; +// import { SIDE_BAR_BACKGROUND, PANEL_BACKGROUND } from 'vs/workbench/common/theme'; export interface IUserFriendlyViewsContainerDescriptor { id: string; @@ -421,8 +422,9 @@ class ViewsExtensionHandler implements IWorkbenchContribution { ctorDescriptor: new SyncDescriptor(CustomTreeViewPane), when: ContextKeyExpr.deserialize(item.when), canToggleVisibility: true, + canMoveView: true, + treeView: this.instantiationService.createInstance(CustomTreeView, item.id, item.name), collapsed: this.showCollapsed(container), - treeView: this.instantiationService.createInstance(CustomTreeView, item.id, item.name, container), order: order, extensionId: extension.description.identifier, originalContainerId: entry.key, diff --git a/src/vs/workbench/browser/parts/views/customView.ts b/src/vs/workbench/browser/parts/views/customView.ts index eecea644351..a814eb0a15f 100644 --- a/src/vs/workbench/browser/parts/views/customView.ts +++ b/src/vs/workbench/browser/parts/views/customView.ts @@ -13,7 +13,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; import { ContextAwareMenuEntryActionViewItem, createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { ITreeView, ITreeItem, TreeItemCollapsibleState, ITreeViewDataProvider, TreeViewItemHandleArg, ITreeViewDescriptor, IViewsRegistry, ViewContainer, ITreeItemLabel, Extensions, IViewDescriptorService } from 'vs/workbench/common/views'; +import { ITreeView, ITreeItem, TreeItemCollapsibleState, ITreeViewDataProvider, TreeViewItemHandleArg, ITreeViewDescriptor, IViewsRegistry, ViewContainer, ITreeItemLabel, Extensions, IViewDescriptorService, IViewContainersRegistry, ViewContainerLocation } from 'vs/workbench/common/views'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -41,7 +41,7 @@ import { ITreeRenderer, ITreeNode, IAsyncDataSource, ITreeContextMenuEvent } fro import { FuzzyScore, createMatches } from 'vs/base/common/filters'; import { CollapseAllAction } from 'vs/base/browser/ui/tree/treeDefaults'; import { isFalsyOrWhitespace } from 'vs/base/common/strings'; -import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; +import { SIDE_BAR_BACKGROUND, PANEL_BACKGROUND } from 'vs/workbench/common/theme'; export class CustomTreeViewPane extends ViewPane { @@ -154,7 +154,6 @@ export class CustomTreeView extends Disposable implements ITreeView { constructor( private id: string, private _title: string, - private viewContainer: ViewContainer, @IExtensionService private readonly extensionService: IExtensionService, @IWorkbenchThemeService private readonly themeService: IWorkbenchThemeService, @IInstantiationService private readonly instantiationService: IInstantiationService, @@ -163,6 +162,7 @@ export class CustomTreeView extends Disposable implements ITreeView { @IProgressService private readonly progressService: IProgressService, @IContextMenuService private readonly contextMenuService: IContextMenuService, @IKeybindingService private readonly keybindingService: IKeybindingService, + @IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService, @INotificationService private readonly notificationService: INotificationService ) { super(); @@ -174,11 +174,7 @@ export class CustomTreeView extends Disposable implements ITreeView { this.doRefresh([this.root]); /** soft refresh **/ } })); - this._register(Registry.as(Extensions.ViewsRegistry).onDidChangeContainer(({ views, from, to }) => { - if (from === this.viewContainer && views.some(v => v.id === this.id)) { - this.viewContainer = to; - } - })); + this.create(); } diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 5a8f3edbd07..d5f1e856ea7 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -366,6 +366,8 @@ export interface IViewDescriptorService { _serviceBrand: undefined; + readonly onDidChangeContainer: Event<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }>; + moveViewToLocation(view: IViewDescriptor, location: ViewContainerLocation): void; moveViewsToContainer(views: IViewDescriptor[], viewContainer: ViewContainer): void; @@ -443,9 +445,7 @@ export interface IRevealOptions { } export interface ITreeViewDescriptor extends IViewDescriptor { - - readonly treeView: ITreeView; - + treeView: ITreeView; } export type TreeViewItemHandleArg = { diff --git a/src/vs/workbench/services/views/browser/viewDescriptorService.ts b/src/vs/workbench/services/views/browser/viewDescriptorService.ts index fb1d0b4e3bd..f4f0e77d123 100644 --- a/src/vs/workbench/services/views/browser/viewDescriptorService.ts +++ b/src/vs/workbench/services/views/browser/viewDescriptorService.ts @@ -181,6 +181,9 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor private static readonly CACHED_VIEW_POSITIONS = 'views.cachedViewPositions'; private static readonly COMMON_CONTAINER_ID_PREFIX = 'workbench.views.service'; + private readonly _onDidChangeContainer: Emitter<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }> = this._register(new Emitter<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }>()); + readonly onDidChangeContainer: Event<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }> = this._onDidChangeContainer.event; + private readonly viewDescriptorCollections: Map; private readonly activeViewContextKeys: Map>; private readonly movableViewContextKeys: Map>; @@ -230,7 +233,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor this._register(this.viewsRegistry.onViewsRegistered(({ views, viewContainer }) => this.onDidRegisterViews(views, viewContainer))); this._register(this.viewsRegistry.onViewsDeregistered(({ views, viewContainer }) => this.onDidDeregisterViews(views, viewContainer))); - this._register(this.viewsRegistry.onDidChangeContainer(({ views, from, to }) => { this.removeViews(from, views); this.addViews(to, views); })); + this._register(this.viewsRegistry.onDidChangeContainer(({ views, from, to }) => { this.removeViews(from, views); this.addViews(to, views); this._onDidChangeContainer.fire({ views, from, to }); })); this._register(this.viewContainersRegistry.onDidRegister(({ viewContainer }) => this.onDidRegisterViewContainer(viewContainer))); this._register(this.viewContainersRegistry.onDidDeregister(({ viewContainer }) => this.onDidDeregisterViewContainer(viewContainer))); @@ -357,6 +360,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor getViewContainer(viewId: string): ViewContainer | null { const containerId = this.cachedViewInfo.get(viewId)?.containerId; + return containerId ? this.viewContainersRegistry.get(containerId) ?? null : this.viewsRegistry.getViewContainer(viewId); @@ -395,6 +399,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor if (from && to && from !== to) { this.removeViews(from, views); this.addViews(to, views); + this._onDidChangeContainer.fire({ views, from, to }); this.saveViewPositionsToCache(); } }