diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 845cbe3135da15bc44577965e1f8ca69f61b633c..25b87fbb851d1c3391bf5a4b0d4205fadfabb62d 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -48,6 +48,7 @@ export class ActivitybarPart extends Part { private globalActivityIdToActions: { [globalActivityId: string]: GlobalActivityAction; }; private compositeBar: CompositeBar; + private compositeActions: { [compositeId: string]: { activityAction: ViewletActivityAction, pinnedAction: ToggleCompositePinnedAction } }; constructor( id: string, @@ -60,14 +61,15 @@ export class ActivitybarPart extends Part { this.globalActivityIdToActions = Object.create(null); + this.compositeActions = Object.create(null); this.compositeBar = this.instantiationService.createInstance(CompositeBar, { icon: true, storageId: ActivitybarPart.PINNED_VIEWLETS, orientation: ActionsOrientation.VERTICAL, composites: this.viewletService.getViewlets().filter(v => this.canShow(v)), openComposite: (compositeId: string) => this.viewletService.openViewlet(compositeId, true), - getActivityAction: (compositeId: string) => this.instantiationService.createInstance(ViewletActivityAction, this.viewletService.getViewlet(compositeId)), - getCompositePinnedAction: (compositeId: string) => new ToggleCompositePinnedAction(this.viewletService.getViewlet(compositeId), this.compositeBar), + getActivityAction: (compositeId: string) => this.getCompositeActions(compositeId).activityAction, + getCompositePinnedAction: (compositeId: string) => this.getCompositeActions(compositeId).pinnedAction, getOnCompositeClickAction: (compositeId: string) => this.instantiationService.createInstance(ToggleViewletAction, this.viewletService.getViewlet(compositeId)), getContextMenuActions: () => [this.instantiationService.createInstance(ToggleActivityBarVisibilityAction, ToggleActivityBarVisibilityAction.ID, nls.localize('hideActivitBar', "Hide Activity Bar"))], getDefaultCompositeId: () => this.viewletService.getDefaultViewletId(), @@ -96,7 +98,7 @@ export class ActivitybarPart extends Part { if (enabled) { this.compositeBar.addComposite(this.viewletService.getViewlet(id), true); } else { - this.compositeBar.removeComposite(id); + this.removeComposite(id); } })); } @@ -177,6 +179,18 @@ export class ActivitybarPart extends Part { }); } + private getCompositeActions(compositeId: string): { activityAction: ViewletActivityAction, pinnedAction: ToggleCompositePinnedAction } { + let compositeActions = this.compositeActions[compositeId]; + if (!compositeActions) { + compositeActions = { + activityAction: this.instantiationService.createInstance(ViewletActivityAction, this.viewletService.getViewlet(compositeId)), + pinnedAction: new ToggleCompositePinnedAction(this.viewletService.getViewlet(compositeId), this.compositeBar) + }; + this.compositeActions[compositeId] = compositeActions; + } + return compositeActions; + } + private updateCompositebar(): void { const viewlets = this.viewletService.getViewlets(); for (const viewlet of viewlets) { @@ -189,11 +203,21 @@ export class ActivitybarPart extends Part { this.compositeBar.activateComposite(viewlet.id); } } else { - this.compositeBar.removeComposite(viewlet.id); + this.removeComposite(viewlet.id); } } } + private removeComposite(compositeId: string): void { + this.compositeBar.removeComposite(compositeId); + const compositeActions = this.compositeActions[compositeId]; + if (compositeActions) { + compositeActions.activityAction.dispose(); + compositeActions.pinnedAction.dispose(); + delete this.compositeActions[compositeId]; + } + } + private canShow(viewlet: ViewletDescriptor): boolean { const viewLocation = ViewLocation.get(viewlet.id); if (viewLocation) { diff --git a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts index 20bd3c4a8581ecc5c58c6fbff12e28117b5bf099..0a542c0d61b2392c3b8bac18a64e8f6a9e887a28 100644 --- a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts +++ b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts @@ -478,7 +478,7 @@ interface ISerializedCompositeBarItem { order: number; } -interface ICompositeBarItem extends ISerializedCompositeBarItem, IDisposable { +interface ICompositeBarItem extends ISerializedCompositeBarItem { name: string; activityAction: ActivityAction; pinnedAction: Action; @@ -494,28 +494,13 @@ class CompositeBarModel { private createCompositeBarItem(id: string, name: string, order: number, pinned: boolean): ICompositeBarItem { const options = this.options; - let activityAction, pinnedAction; return { id, name, pinned, order, activity: [], get activityAction() { - if (!activityAction) { - activityAction = options.getActivityAction(id); - } - return activityAction; + return options.getActivityAction(id); }, get pinnedAction() { - if (!pinnedAction) { - pinnedAction = options.getCompositePinnedAction(id); - } - return pinnedAction; - }, - dispose: () => { - if (activityAction) { - activityAction.dispose(); - } - if (pinnedAction) { - pinnedAction.dispose(); - } + return options.getCompositePinnedAction(id); } }; } @@ -541,8 +526,7 @@ class CompositeBarModel { remove(id: string): boolean { for (let index = 0; index < this.items.length; index++) { if (this.items[index].id === id) { - const item = this.items.splice(index, 1)[0]; - item.dispose(); + this.items.splice(index, 1); return true; } } diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index aaca0778ba72b63c11117c2debafeecaf0edc387..ff4240cb97ad966e371fbb7dd504d02fd054a5ae 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -42,6 +42,7 @@ export class PanelPart extends CompositePart implements IPanelService { private blockOpeningPanel: boolean; private compositeBar: CompositeBar; + private compositeActions: { [compositeId: string]: { activityAction: PanelActivityAction, pinnedAction: ToggleCompositePinnedAction } }; private dimension: Dimension; constructor( @@ -74,14 +75,15 @@ export class PanelPart extends CompositePart implements IPanelService { { hasTitle: true } ); + this.compositeActions = Object.create(null); this.compositeBar = this.instantiationService.createInstance(CompositeBar, { icon: false, storageId: PanelPart.PINNED_PANELS, orientation: ActionsOrientation.HORIZONTAL, composites: this.getPanels(), openComposite: (compositeId: string) => this.openPanel(compositeId, true), - getActivityAction: (compositeId: string) => this.instantiationService.createInstance(PanelActivityAction, this.getPanel(compositeId)), - getCompositePinnedAction: (compositeId: string) => new ToggleCompositePinnedAction(this.getPanel(compositeId), this.compositeBar), + getActivityAction: (compositeId: string) => this.getCompositeActions(compositeId).activityAction, + getCompositePinnedAction: (compositeId: string) => this.getCompositeActions(compositeId).pinnedAction, getOnCompositeClickAction: (compositeId: string) => this.instantiationService.createInstance(PanelActivityAction, this.getPanel(compositeId)), getContextMenuActions: () => [this.instantiationService.createInstance(TogglePanelAction, TogglePanelAction.ID, localize('hidePanel', "Hide Panel"))], getDefaultCompositeId: () => Registry.as(PanelExtensions.Panels).getDefaultPanelId(), @@ -178,7 +180,7 @@ export class PanelPart extends CompositePart implements IPanelService { this.compositeBar.activateComposite(descriptor.id); }); } else { - this.compositeBar.removeComposite(id); + this.removeComposite(id); } } } @@ -253,6 +255,28 @@ export class PanelPart extends CompositePart implements IPanelService { } } + private getCompositeActions(compositeId: string): { activityAction: PanelActivityAction, pinnedAction: ToggleCompositePinnedAction } { + let compositeActions = this.compositeActions[compositeId]; + if (!compositeActions) { + compositeActions = { + activityAction: this.instantiationService.createInstance(PanelActivityAction, this.getPanel(compositeId)), + pinnedAction: new ToggleCompositePinnedAction(this.getPanel(compositeId), this.compositeBar) + }; + this.compositeActions[compositeId] = compositeActions; + } + return compositeActions; + } + + private removeComposite(compositeId: string): void { + this.compositeBar.removeComposite(compositeId); + const compositeActions = this.compositeActions[compositeId]; + if (compositeActions) { + compositeActions.activityAction.dispose(); + compositeActions.pinnedAction.dispose(); + delete this.compositeActions[compositeId]; + } + } + private getToolbarWidth(): number { const activePanel = this.getActivePanel(); if (!activePanel) {