diff --git a/src/vs/workbench/api/browser/activitybarExtensionPoint.ts b/src/vs/workbench/api/browser/activitybarExtensionPoint.ts index 15aed855355735fca7c85a5da9c7b3386fcab957..09b6dfc961850093720843239f036d437d51b0f7 100644 --- a/src/vs/workbench/api/browser/activitybarExtensionPoint.ts +++ b/src/vs/workbench/api/browser/activitybarExtensionPoint.ts @@ -91,7 +91,7 @@ activityGroupExtensionPoint.setHandler((extensions) => { const id = `workbench.view.extension.${descriptor.id}`; const title = descriptor.title; const cssClass = `extensionViewlet-${descriptor.id}`; - const location: ViewLocation = ViewLocation.register(id); + const location: ViewLocation = ViewLocation.register(id, true); // Generate CSS to show the icon in the activity bar const iconClass = `.monaco-workbench > .activitybar .monaco-action-bar .action-label.${cssClass}`; diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 2382e8f95347f2597e5c64b4985904d77f51e412..014ff3268ceb021242da8fccbe293971d74b3a43 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -33,6 +33,8 @@ import { isMacintosh } from 'vs/base/common/platform'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Dimension, scheduleAtNextAnimationFrame } from 'vs/base/browser/dom'; import { Color } from 'vs/base/common/color'; +import { ViewLocation, ViewsRegistry } from 'vs/workbench/common/views'; +import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; export class ActivitybarPart extends Part { @@ -83,11 +85,14 @@ export class ActivitybarPart extends Part { }); this.registerListeners(); + this.updateCompositebar(); } private registerListeners(): void { - this.toUnbind.push(this.viewletService.onDidViewletRegister(viewletDescriptor => this.compositeBar.addComposite(viewletDescriptor, false))); + this.toUnbind.push(this.viewletService.onDidViewletRegister(() => this.updateCompositebar())); + this.toUnbind.push(ViewsRegistry.onViewsRegistered(() => this.updateCompositebar())); + this.toUnbind.push(ViewsRegistry.onViewsDeregistered(() => this.updateCompositebar())); // Activate viewlet action on opening of a viewlet this.toUnbind.push(this.viewletService.onDidViewletOpen(viewlet => this.compositeBar.activateComposite(viewlet.getId()))); @@ -183,7 +188,9 @@ export class ActivitybarPart extends Part { private showContextMenu(e: MouseEvent): void { const event = new StandardMouseEvent(e); - const actions: Action[] = this.viewletService.getViewlets().map(viewlet => this.instantiationService.createInstance(ToggleCompositePinnedAction, viewlet, this.compositeBar)); + const actions: Action[] = this.viewletService.getViewlets() + .filter(viewlet => this.canShow(viewlet)) + .map(viewlet => this.instantiationService.createInstance(ToggleCompositePinnedAction, viewlet, this.compositeBar)); actions.push(new Separator()); actions.push(this.instantiationService.createInstance(ToggleActivityBarVisibilityAction, ToggleActivityBarVisibilityAction.ID, nls.localize('hideActivitBar', "Hide Activity Bar"))); @@ -215,6 +222,26 @@ export class ActivitybarPart extends Part { }); } + private updateCompositebar(): void { + const viewlets = this.viewletService.getViewlets(); + for (const viewlet of viewlets) { + const canShow = this.canShow(viewlet); + if (canShow) { + this.compositeBar.addComposite(viewlet, false); + } else { + this.compositeBar.removeComposite(viewlet.id); + } + } + } + + private canShow(viewlet: ViewletDescriptor): boolean { + const viewLocation = ViewLocation.get(viewlet.id); + if (viewLocation && viewLocation.contributed) { + return ViewsRegistry.getViews(viewLocation).length > 0; + } + return true; + } + public getPinned(): string[] { return this.viewletService.getViewlets().map(v => v.id).filter(id => this.compositeBar.isPinned(id)); } diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index aa06fd035a291fbf3f53d9f0a6be3d2b7eef0e0b..4f7215965374d58cf887bf014f568aef18964f89 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -18,8 +18,8 @@ import { ThemeIcon } from 'vs/platform/theme/common/themeService'; export class ViewLocation { private static locations: Map = new Map(); - static register(id: string): ViewLocation { - const viewLocation = new ViewLocation(id); + static register(id: string, contributed: boolean): ViewLocation { + const viewLocation = new ViewLocation(id, contributed); ViewLocation.locations.set(id, viewLocation); return viewLocation; } @@ -27,12 +27,13 @@ export class ViewLocation { return ViewLocation.locations.get(value); } - static readonly Explorer: ViewLocation = ViewLocation.register('workbench.view.explorer'); - static readonly Debug: ViewLocation = ViewLocation.register('workbench.view.debug'); - static readonly Extensions: ViewLocation = ViewLocation.register('workbench.view.extensions'); + static readonly Explorer: ViewLocation = ViewLocation.register('workbench.view.explorer', false); + static readonly Debug: ViewLocation = ViewLocation.register('workbench.view.debug', false); + static readonly Extensions: ViewLocation = ViewLocation.register('workbench.view.extensions', false); - private constructor(private _id: string) { } + private constructor(private _id: string, private _contributed: boolean) { } get id(): string { return this._id; } + get contributed(): boolean { return this._contributed; } }