From a890e1c83db8d00e7af7cde9c01afed04d2412f0 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 23 Feb 2018 18:17:16 +0100 Subject: [PATCH] viewlet, panel: remove notion of search.location, instead add api to enableViewlet enablePanel --- src/vs/workbench/browser/composite.ts | 2 ++ .../parts/activitybar/activitybarPart.ts | 19 ++++-------- .../browser/parts/panel/panelPart.ts | 31 +++++++++---------- .../parts/search/browser/replaceService.ts | 28 ++++++++++++++++- .../services/panel/common/panelService.ts | 6 ++++ .../progress/test/progressService.test.ts | 5 +++ .../services/viewlet/browser/viewlet.ts | 7 +++++ .../viewlet/browser/viewletService.ts | 21 ++++++++----- 8 files changed, 80 insertions(+), 39 deletions(-) diff --git a/src/vs/workbench/browser/composite.ts b/src/vs/workbench/browser/composite.ts index a8ae09dfc71..c213bacd720 100644 --- a/src/vs/workbench/browser/composite.ts +++ b/src/vs/workbench/browser/composite.ts @@ -203,6 +203,7 @@ export abstract class CompositeDescriptor { public cssClass: string; public order: number; public keybindingId: string; + public enabled: boolean; private ctor: IConstructorSignature0; @@ -212,6 +213,7 @@ export abstract class CompositeDescriptor { this.name = name; this.cssClass = cssClass; this.order = order; + this.enabled = true; this.keybindingId = keybindingId; } diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index d0018ceac5c..3a006681555 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -29,8 +29,6 @@ import { ACTIVITY_BAR_BACKGROUND, ACTIVITY_BAR_BORDER, ACTIVITY_BAR_FOREGROUND, import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { CompositeBar } from 'vs/workbench/browser/parts/compositebar/compositeBar'; import { ToggleCompositePinnedAction } from 'vs/workbench/browser/parts/compositebar/compositeBarActions'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ISearchConfiguration, VIEW_ID as SEARCH_VIEW_ID } from 'vs/platform/search/common/search'; export class ActivitybarPart extends Part { @@ -58,8 +56,7 @@ export class ActivitybarPart extends Part { @IContextMenuService private contextMenuService: IContextMenuService, @IInstantiationService private instantiationService: IInstantiationService, @IPartService private partService: IPartService, - @IThemeService themeService: IThemeService, - @IConfigurationService private configurationService: IConfigurationService + @IThemeService themeService: IThemeService ) { super(id, { hasTitle: false }, themeService); @@ -89,15 +86,11 @@ export class ActivitybarPart extends Part { // Deactivate viewlet action on close this.toUnbind.push(this.viewletService.onDidViewletClose(viewlet => this.compositeBar.deactivateComposite(viewlet.getId()))); this.toUnbind.push(this.compositeBar.onDidContextMenu(e => this.showContextMenu(e))); - - this.toUnbind.push(this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration('search.location')) { - const location = this.configurationService.getValue().search.location; - if (location === 'sidebar') { - this.compositeBar.addComposite(this.viewletService.getViewlet(SEARCH_VIEW_ID)); - } else { - this.compositeBar.removeComposite(SEARCH_VIEW_ID); - } + this.toUnbind.push(this.viewletService.onDidViewletEnable(({ id, enabled }) => { + if (enabled) { + this.compositeBar.addComposite(this.viewletService.getViewlet(id)); + } else { + this.compositeBar.removeComposite(id); } })); } diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index a8a017a4a10..bd7143f497b 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -30,8 +30,6 @@ import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { IBadge } from 'vs/workbench/services/activity/common/activity'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ISearchConfiguration, VIEW_ID as SEARCH_VIEW_ID } from 'vs/platform/search/common/search'; export class PanelPart extends CompositePart implements IPanelService { @@ -55,8 +53,7 @@ export class PanelPart extends CompositePart implements IPanelService { @IPartService partService: IPartService, @IKeybindingService keybindingService: IKeybindingService, @IInstantiationService instantiationService: IInstantiationService, - @IThemeService themeService: IThemeService, - @IConfigurationService private configurationService: IConfigurationService + @IThemeService themeService: IThemeService ) { super( notificationService, @@ -113,16 +110,6 @@ export class PanelPart extends CompositePart implements IPanelService { // Deactivate panel action on close this.toUnbind.push(this.onDidPanelClose(panel => this.compositeBar.deactivateComposite(panel.getId()))); - this.toUnbind.push(this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration('search.location')) { - const location = this.configurationService.getValue().search.location; - if (location === 'panel') { - this.compositeBar.addComposite(this.getPanel(SEARCH_VIEW_ID)); - } else { - this.compositeBar.removeComposite(SEARCH_VIEW_ID); - } - } - })); } public get onDidPanelOpen(): Event { @@ -183,13 +170,23 @@ export class PanelPart extends CompositePart implements IPanelService { } public getPanels(): IPanelIdentifier[] { - const searchConfig = this.configurationService.getValue(); - const excludeSearch = searchConfig.search.location !== 'panel'; return Registry.as(PanelExtensions.Panels).getPanels() - .filter(p => !(p.id === SEARCH_VIEW_ID && excludeSearch)) + .filter(p => p.enabled) .sort((v1, v2) => v1.order - v2.order); } + public enablePanel(id: string, enabled: boolean): void { + const descriptor = Registry.as(PanelExtensions.Panels).getPanels().filter(p => p.id === id).pop(); + if (descriptor && descriptor.enabled !== enabled) { + descriptor.enabled = enabled; + if (enabled) { + this.compositeBar.addComposite(descriptor); + } else { + this.compositeBar.removeComposite(id); + } + } + } + protected getActions(): IAction[] { return [ this.instantiationService.createInstance(ToggleMaximizedPanelAction, ToggleMaximizedPanelAction.ID, ToggleMaximizedPanelAction.LABEL), diff --git a/src/vs/workbench/parts/search/browser/replaceService.ts b/src/vs/workbench/parts/search/browser/replaceService.ts index 5abd6630a1c..c120cb59ab6 100644 --- a/src/vs/workbench/parts/search/browser/replaceService.ts +++ b/src/vs/workbench/parts/search/browser/replaceService.ts @@ -26,6 +26,10 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IFileService } from 'vs/platform/files/common/files'; import { ResourceTextEdit } from 'vs/editor/common/modes'; import { createTextBufferFactoryFromSnapshot } from 'vs/editor/common/model/textModel'; +import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; +import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { ISearchConfiguration, VIEW_ID } from 'vs/platform/search/common/search'; const REPLACE_PREVIEW = 'replacePreview'; @@ -96,8 +100,30 @@ export class ReplaceService implements IReplaceService { constructor( @IFileService private fileService: IFileService, @IEditorService private editorService: IWorkbenchEditorService, - @ITextModelService private textModelResolverService: ITextModelService + @ITextModelService private textModelResolverService: ITextModelService, + @IViewletService viewletService: IViewletService, + @IPanelService panelService: IPanelService, + @IConfigurationService configurationService: IConfigurationService ) { + + const updateSearchViewLocation = () => { + const config = configurationService.getValue(); + if (config.search.location === 'panel') { + viewletService.enableViewlet(VIEW_ID, false); + panelService.enablePanel(VIEW_ID, true); + } + if (config.search.location === 'sidebar') { + panelService.enablePanel(VIEW_ID, false); + viewletService.enableViewlet(VIEW_ID, true); + } + }; + configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('search.location')) { + updateSearchViewLocation(); + + } + }); + updateSearchViewLocation(); } public replace(match: Match): TPromise; diff --git a/src/vs/workbench/services/panel/common/panelService.ts b/src/vs/workbench/services/panel/common/panelService.ts index bee988e6477..ab9a41d2f10 100644 --- a/src/vs/workbench/services/panel/common/panelService.ts +++ b/src/vs/workbench/services/panel/common/panelService.ts @@ -37,4 +37,10 @@ export interface IPanelService { * Returns all enabled panels */ getPanels(): IPanelIdentifier[]; + + /** + * Enables or disables a panel. Disabled panels are completly hidden from UI. + * By default all panels are enabled. + */ + enablePanel(id: string, enabled: boolean): void; } diff --git a/src/vs/workbench/services/progress/test/progressService.test.ts b/src/vs/workbench/services/progress/test/progressService.test.ts index ef327a11f63..11dc5122571 100644 --- a/src/vs/workbench/services/progress/test/progressService.test.ts +++ b/src/vs/workbench/services/progress/test/progressService.test.ts @@ -24,9 +24,11 @@ class TestViewletService implements IViewletService { onDidViewletOpenEmitter = new Emitter(); onDidViewletCloseEmitter = new Emitter(); + onDidViewletEnableEmitter = new Emitter<{ id: string, enabled: boolean }>(); onDidViewletOpen = this.onDidViewletOpenEmitter.event; onDidViewletClose = this.onDidViewletCloseEmitter.event; + onDidViewletEnable = this.onDidViewletEnableEmitter.event; public openViewlet(id: string, focus?: boolean): TPromise { return TPromise.as(null); @@ -39,6 +41,7 @@ class TestViewletService implements IViewletService { public getActiveViewlet(): IViewlet { return activeViewlet; } + public enableViewlet(id: string, enabled: boolean): void { } public dispose() { } @@ -74,6 +77,8 @@ class TestPanelService implements IPanelService { return activeViewlet; } + public enablePanel(id: string, enabled: boolean): void { } + public dispose() { } } diff --git a/src/vs/workbench/services/viewlet/browser/viewlet.ts b/src/vs/workbench/services/viewlet/browser/viewlet.ts index a7605929591..75e3e4708e6 100644 --- a/src/vs/workbench/services/viewlet/browser/viewlet.ts +++ b/src/vs/workbench/services/viewlet/browser/viewlet.ts @@ -18,6 +18,7 @@ export interface IViewletService { onDidViewletOpen: Event; onDidViewletClose: Event; + onDidViewletEnable: Event<{ id: string, enabled: boolean }>; /** * Opens a viewlet with the given identifier and pass keyboard focus to it if specified. @@ -44,6 +45,12 @@ export interface IViewletService { */ getViewlets(): ViewletDescriptor[]; + /** + * Enables or disables a viewlet. Disabled viewlets are completly hidden from UI. + * By default all viewlets are enabled. + */ + enableViewlet(id: string, enabled: boolean): void; + /** * */ diff --git a/src/vs/workbench/services/viewlet/browser/viewletService.ts b/src/vs/workbench/services/viewlet/browser/viewletService.ts index f9e03fe68e6..6f5d71b1412 100644 --- a/src/vs/workbench/services/viewlet/browser/viewletService.ts +++ b/src/vs/workbench/services/viewlet/browser/viewletService.ts @@ -7,7 +7,7 @@ import { TPromise, ValueCallback } from 'vs/base/common/winjs.base'; import { IViewlet } from 'vs/workbench/common/viewlet'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import Event from 'vs/base/common/event'; +import Event, { Emitter } from 'vs/base/common/event'; import { SidebarPart } from 'vs/workbench/browser/parts/sidebar/sidebarPart'; import { Registry } from 'vs/platform/registry/common/platform'; import { ViewletDescriptor, ViewletRegistry, Extensions as ViewletExtensions } from 'vs/workbench/browser/viewlet'; @@ -15,8 +15,6 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { IProgressService } from 'vs/platform/progress/common/progress'; import { IContextKeyService, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; -import { ISearchConfiguration, VIEW_ID as SEARCH_VIEW_ID } from 'vs/platform/search/common/search'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; const ActiveViewletContextId = 'activeViewlet'; export const ActiveViewletContext = new RawContextKey(ActiveViewletContextId, ''); @@ -32,16 +30,17 @@ export class ViewletService implements IViewletService { private extensionViewletsLoaded: TPromise; private extensionViewletsLoadedPromiseComplete: ValueCallback; private activeViewletContextKey: IContextKey; + private _onDidViewletEnable = new Emitter<{ id: string, enabled: boolean }>(); private disposables: IDisposable[] = []; public get onDidViewletOpen(): Event { return this.sidebarPart.onDidViewletOpen; } public get onDidViewletClose(): Event { return this.sidebarPart.onDidViewletClose; } + public get onDidViewletEnable(): Event<{ id: string, enabled: boolean }> { return this._onDidViewletEnable.event; } constructor( sidebarPart: SidebarPart, @IExtensionService private extensionService: IExtensionService, - @IContextKeyService contextKeyService: IContextKeyService, - @IConfigurationService private configurationService: IConfigurationService + @IContextKeyService contextKeyService: IContextKeyService ) { this.sidebarPart = sidebarPart; this.viewletRegistry = Registry.as(ViewletExtensions.Viewlets); @@ -85,6 +84,14 @@ export class ViewletService implements IViewletService { }); } + public enableViewlet(id: string, enabled: boolean): void { + const descriptor = this.getBuiltInViewlets().filter(desc => desc.id === id).pop(); + if (descriptor && descriptor.enabled !== enabled) { + descriptor.enabled = enabled; + this._onDidViewletEnable.fire({ id, enabled }); + } + } + public openViewlet(id: string, focus?: boolean): TPromise { // Built in viewlets do not need to wait for extensions to be loaded @@ -112,10 +119,8 @@ export class ViewletService implements IViewletService { public getViewlets(): ViewletDescriptor[] { const builtInViewlets = this.getBuiltInViewlets(); const viewlets = builtInViewlets.concat(this.extensionViewlets); - const searchConfig = this.configurationService.getValue(); - const excludeSearch = searchConfig.search.location !== 'sidebar'; - return viewlets.filter(v => !(v.id === SEARCH_VIEW_ID && excludeSearch)); + return viewlets.filter(v => v.enabled); } private getBuiltInViewlets(): ViewletDescriptor[] { -- GitLab