From 04f7485615cd5644333ed6b17e1aaad1d2a1dbf0 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 7 Mar 2019 14:35:52 +0100 Subject: [PATCH] debt - acitivtybar as declarative service --- src/vs/workbench/browser/part.ts | 4 +++ .../parts/activitybar/activitybarPart.ts | 7 ++++- .../workbench/browser/parts/compositePart.ts | 2 +- .../browser/parts/editor/editorPart.ts | 2 +- .../browser/parts/statusbar/statusbarPart.ts | 2 +- .../browser/parts/titlebar/titlebarPart.ts | 2 +- .../workbench/electron-browser/workbench.ts | 26 +++++++------------ .../activity/browser/activityService.ts | 15 ++++++----- .../activityBar/browser/activityBarService.ts | 7 +++++ .../test/browser/editorGroupsService.test.ts | 2 +- .../editor/test/browser/editorService.test.ts | 12 ++++----- .../services/panel/common/panelService.ts | 7 +++++ .../progress/test/progressService.test.ts | 6 +++++ src/vs/workbench/workbench.main.ts | 2 ++ 14 files changed, 60 insertions(+), 36 deletions(-) diff --git a/src/vs/workbench/browser/part.ts b/src/vs/workbench/browser/part.ts index 623c41d12ca..b1bfddb8012 100644 --- a/src/vs/workbench/browser/part.ts +++ b/src/vs/workbench/browser/part.ts @@ -49,6 +49,10 @@ export abstract class Part extends Component implements ISerializableView { } } + updateStyles(): void { + super.updateStyles(); + } + /** * Note: Clients should not call this method, the workbench calls this * method. Calling it otherwise may result in unexpected behavior. diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index d7fac27fac4..d97fcb4b693 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -32,6 +32,7 @@ import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/commo import { IViewlet } from 'vs/workbench/common/viewlet'; import { isUndefinedOrNull } from 'vs/base/common/types'; import { IActivityBarService } from 'vs/workbench/services/activityBar/browser/activityBarService'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; const SCM_VIEWLET_ID = 'workbench.view.scm'; @@ -75,7 +76,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { @IStorageService private readonly storageService: IStorageService, @IExtensionService private readonly extensionService: IExtensionService, @IViewsService private readonly viewsService: IViewsService, - @IContextKeyService private readonly contextKeyService: IContextKeyService + @IContextKeyService private readonly contextKeyService: IContextKeyService, ) { super(Parts.ACTIVITYBAR_PART, { hasTitle: false }, themeService, storageService); @@ -101,6 +102,8 @@ export class ActivitybarPart extends Part implements IActivityBarService { overflowActionSize: ActivitybarPart.ACTION_HEIGHT })); + this.layoutService.registerPart(this); + this.registerListeners(); this.onDidRegisterViewlets(viewletService.getViewlets()); } @@ -502,3 +505,5 @@ export class ActivitybarPart extends Part implements IActivityBarService { }; } } + +registerSingleton(IActivityBarService, ActivitybarPart); \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index b73bc893d8d..0e342dedcbd 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -421,7 +421,7 @@ export abstract class CompositePart extends Part { }; } - protected updateStyles(): void { + updateStyles(): void { super.updateStyles(); // Forward to title label diff --git a/src/vs/workbench/browser/parts/editor/editorPart.ts b/src/vs/workbench/browser/parts/editor/editorPart.ts index 284c7ecc947..042184bf65c 100644 --- a/src/vs/workbench/browser/parts/editor/editorPart.ts +++ b/src/vs/workbench/browser/parts/editor/editorPart.ts @@ -776,7 +776,7 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro return this.theme.getColor(EDITOR_GROUP_BORDER) || this.theme.getColor(contrastBorder) || Color.transparent; } - protected updateStyles(): void { + updateStyles(): void { this.container.style.backgroundColor = this.getColor(editorBackground); const separatorBorderStyle = { separatorBorder: this.gridSeparatorBorder, background: this.theme.getColor(EDITOR_PANE_BACKGROUND) || Color.transparent }; diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 08a94c855e3..5476be1865e 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -147,7 +147,7 @@ export class StatusbarPart extends Part implements IStatusbarService { return this.element; } - protected updateStyles(): void { + updateStyles(): void { super.updateStyles(); const container = this.getContainer(); diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index d415394947f..38a57b9aa84 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -459,7 +459,7 @@ export class TitlebarPart extends Part implements ITitleService { this.adjustTitleMarginToCenter(); } - protected updateStyles(): void { + updateStyles(): void { super.updateStyles(); // Part container diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 00e0c773148..afd7db5bdd3 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -20,7 +20,6 @@ import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; import { IResourceInput } from 'vs/platform/editor/common/editor'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { IEditorInputFactoryRegistry, Extensions as EditorExtensions, IUntitledResourceInput, IResourceDiffInput } from 'vs/workbench/common/editor'; -import { ActivitybarPart } from 'vs/workbench/browser/parts/activitybar/activitybarPart'; import { SidebarPart } from 'vs/workbench/browser/parts/sidebar/sidebarPart'; import { PanelPart } from 'vs/workbench/browser/parts/panel/panelPart'; import { StatusbarPart } from 'vs/workbench/browser/parts/statusbar/statusbarPart'; @@ -36,7 +35,6 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ContextKeyService } from 'vs/platform/contextkey/browser/contextKeyService'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { IActivityService } from 'vs/workbench/services/activity/common/activity'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IFileService } from 'vs/platform/files/common/files'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; @@ -49,7 +47,6 @@ import { IWindowService, IWindowConfiguration, IPath, MenuBarVisibility, getTitl import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { ActivityService } from 'vs/workbench/services/activity/browser/activityService'; import { IViewsService } from 'vs/workbench/common/views'; import { ViewsService } from 'vs/workbench/browser/parts/views/views'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -94,7 +91,6 @@ import { IProductService } from 'vs/platform/product/common/product'; import { WorkbenchContextKeysHandler } from 'vs/workbench/browser/contextkeys'; import { IDimension } from 'vs/platform/layout/browser/layoutService'; import { Part } from 'vs/workbench/browser/part'; -import { IActivityBarService } from 'vs/workbench/services/activityBar/browser/activityBarService'; // import@node import { getDelayedChannel } from 'vs/base/parts/ipc/node/ipc'; @@ -176,7 +172,6 @@ export class Workbench extends Disposable implements IWorkbenchLayoutService { private parts: Map = new Map(); - private activitybarPart: ActivitybarPart; private sidebarPart: SidebarPart; private panelPart: PanelPart; private statusbarPart: StatusbarPart; @@ -453,11 +448,6 @@ export class Workbench extends Disposable implements IWorkbenchLayoutService { // Views service serviceCollection.set(IViewsService, new SyncDescriptor(ViewsService)); - // Activity service (activitybar part) - this.activitybarPart = this.instantiationService.createInstance(ActivitybarPart); - serviceCollection.set(IActivityBarService, this.activitybarPart); // TODO@Ben use SyncDescriptor - serviceCollection.set(IActivityService, new SyncDescriptor(ActivityService, [this.activitybarPart, this.panelPart], true)); - // Contributed services const contributedServices = getServices(); for (let contributedService of contributedServices) { @@ -592,7 +582,7 @@ export class Workbench extends Disposable implements IWorkbenchLayoutService { private createActivityBarPart(): void { const activitybarPartContainer = this.createPart(Parts.ACTIVITYBAR_PART, 'navigation', 'activitybar', this.state.sideBar.position === Position.LEFT ? 'left' : 'right'); - this.activitybarPart.create(activitybarPartContainer); + this.parts.get(Parts.ACTIVITYBAR_PART).create(activitybarPartContainer); } private createSidebarPart(): void { @@ -946,6 +936,7 @@ export class Workbench extends Disposable implements IWorkbenchLayoutService { } private setSideBarPosition(position: Position): void { + const activityBar = this.parts.get(Parts.ACTIVITYBAR_PART); const wasHidden = this.state.sideBar.hidden; if (this.state.sideBar.hidden) { @@ -957,13 +948,13 @@ export class Workbench extends Disposable implements IWorkbenchLayoutService { this.state.sideBar.position = position; // Adjust CSS - removeClass(this.activitybarPart.getContainer(), oldPositionValue); + removeClass(activityBar.getContainer(), oldPositionValue); removeClass(this.sidebarPart.getContainer(), oldPositionValue); - addClass(this.activitybarPart.getContainer(), newPositionValue); + addClass(activityBar.getContainer(), newPositionValue); addClass(this.sidebarPart.getContainer(), newPositionValue); // Update Styles - this.activitybarPart.updateStyles(); + activityBar.updateStyles(); this.sidebarPart.updateStyles(); // Layout @@ -1164,7 +1155,7 @@ export class Workbench extends Disposable implements IWorkbenchLayoutService { case Parts.TITLEBAR_PART: return this.parts.get(Parts.TITLEBAR_PART).getContainer(); case Parts.ACTIVITYBAR_PART: - return this.activitybarPart.getContainer(); + return this.parts.get(Parts.ACTIVITYBAR_PART).getContainer(); case Parts.SIDEBAR_PART: return this.sidebarPart.getContainer(); case Parts.PANEL_PART: @@ -1342,13 +1333,14 @@ export class Workbench extends Disposable implements IWorkbenchLayoutService { private createWorkbenchLayout(): void { const titlePart = this.parts.get(Parts.TITLEBAR_PART); const editorPart = this.parts.get(Parts.EDITOR_PART); + const activityBar = this.parts.get(Parts.ACTIVITYBAR_PART); if (this.configurationService.getValue('workbench.useExperimentalGridLayout')) { // Create view wrappers for all parts this.titleBarPartView = new View(titlePart); this.sideBarPartView = new View(this.sidebarPart); - this.activityBarPartView = new View(this.activitybarPart); + this.activityBarPartView = new View(activityBar); this.editorPartView = new View(editorPart); this.panelPartView = new View(this.panelPart); this.statusBarPartView = new View(this.statusbarPart); @@ -1363,7 +1355,7 @@ export class Workbench extends Disposable implements IWorkbenchLayoutService { this.workbench, { titlebar: titlePart, - activitybar: this.activitybarPart, + activitybar: activityBar, editor: editorPart, sidebar: this.sidebarPart, panel: this.panelPart, diff --git a/src/vs/workbench/services/activity/browser/activityService.ts b/src/vs/workbench/services/activity/browser/activityService.ts index 900183a9797..47aa8030056 100644 --- a/src/vs/workbench/services/activity/browser/activityService.ts +++ b/src/vs/workbench/services/activity/browser/activityService.ts @@ -4,26 +4,27 @@ *--------------------------------------------------------------------------------------------*/ import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -import { ActivitybarPart } from 'vs/workbench/browser/parts/activitybar/activitybarPart'; -import { PanelPart } from 'vs/workbench/browser/parts/panel/panelPart'; import { IActivityService, IBadge } from 'vs/workbench/services/activity/common/activity'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { IActivityBarService } from 'vs/workbench/services/activityBar/browser/activityBarService'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class ActivityService implements IActivityService { public _serviceBrand: any; constructor( - private activitybarPart: ActivitybarPart, - private panelPart: PanelPart, - @IPanelService private readonly panelService: IPanelService + @IPanelService private readonly panelService: IPanelService, + @IActivityBarService private readonly activityBarService: IActivityBarService ) { } showActivity(compositeOrActionId: string, badge: IBadge, clazz?: string, priority?: number): IDisposable { if (this.panelService.getPanels().filter(p => p.id === compositeOrActionId).length) { - return this.panelPart.showActivity(compositeOrActionId, badge, clazz); + return this.panelService.showActivity(compositeOrActionId, badge, clazz); } - return this.activitybarPart.showActivity(compositeOrActionId, badge, clazz, priority); + return this.activityBarService.showActivity(compositeOrActionId, badge, clazz, priority); } } + +registerSingleton(IActivityService, ActivityService, true); \ No newline at end of file diff --git a/src/vs/workbench/services/activityBar/browser/activityBarService.ts b/src/vs/workbench/services/activityBar/browser/activityBarService.ts index d2241370569..a3527621d21 100644 --- a/src/vs/workbench/services/activityBar/browser/activityBarService.ts +++ b/src/vs/workbench/services/activityBar/browser/activityBarService.ts @@ -4,12 +4,19 @@ *--------------------------------------------------------------------------------------------*/ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IBadge } from 'vs/workbench/services/activity/common/activity'; +import { IDisposable } from 'vs/base/common/lifecycle'; export const IActivityBarService = createDecorator('activityBarService'); export interface IActivityBarService { _serviceBrand: any; + /** + * Show an activity in a viewlet. + */ + showActivity(viewletOrActionId: string, badge: IBadge, clazz?: string, priority?: number): IDisposable; + /** * Returns id of pinned viewlets following the visual order. */ diff --git a/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts b/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts index f4e6bcc049d..0fe83803a0c 100644 --- a/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts @@ -86,7 +86,7 @@ suite('Editor groups service', () => { function createPart(): EditorPart { const instantiationService = workbenchInstantiationService(); - const part = instantiationService.createInstance(EditorPart, false); + const part = instantiationService.createInstance(EditorPart); part.create(document.createElement('div')); part.layout(400, 300); diff --git a/src/vs/workbench/services/editor/test/browser/editorService.test.ts b/src/vs/workbench/services/editor/test/browser/editorService.test.ts index a9a89b3e1f7..c997d8e9fe6 100644 --- a/src/vs/workbench/services/editor/test/browser/editorService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorService.test.ts @@ -76,7 +76,7 @@ suite('Editor service', () => { test('basics', function () { const partInstantiator = workbenchInstantiationService(); - const part = partInstantiator.createInstance(EditorPart, false); + const part = partInstantiator.createInstance(EditorPart); part.create(document.createElement('div')); part.layout(400, 300); @@ -149,7 +149,7 @@ suite('Editor service', () => { test('openEditors() / replaceEditors()', function () { const partInstantiator = workbenchInstantiationService(); - const part = partInstantiator.createInstance(EditorPart, false); + const part = partInstantiator.createInstance(EditorPart); part.create(document.createElement('div')); part.layout(400, 300); @@ -290,7 +290,7 @@ suite('Editor service', () => { test('close editor does not dispose when editor opened in other group', function () { const partInstantiator = workbenchInstantiationService(); - const part = partInstantiator.createInstance(EditorPart, false); + const part = partInstantiator.createInstance(EditorPart); part.create(document.createElement('div')); part.layout(400, 300); @@ -329,7 +329,7 @@ suite('Editor service', () => { test('open to the side', function () { const partInstantiator = workbenchInstantiationService(); - const part = partInstantiator.createInstance(EditorPart, false); + const part = partInstantiator.createInstance(EditorPart); part.create(document.createElement('div')); part.layout(400, 300); @@ -363,7 +363,7 @@ suite('Editor service', () => { test('active editor change / visible editor change events', async function () { const partInstantiator = workbenchInstantiationService(); - const part = partInstantiator.createInstance(EditorPart, false); + const part = partInstantiator.createInstance(EditorPart); part.create(document.createElement('div')); part.layout(400, 300); @@ -573,7 +573,7 @@ suite('Editor service', () => { test('openEditor returns NULL when opening fails or is inactive', async function () { const partInstantiator = workbenchInstantiationService(); - const part = partInstantiator.createInstance(EditorPart, false); + const part = partInstantiator.createInstance(EditorPart); part.create(document.createElement('div')); part.layout(400, 300); diff --git a/src/vs/workbench/services/panel/common/panelService.ts b/src/vs/workbench/services/panel/common/panelService.ts index 9b4b359bfa4..b9c6b5236f3 100644 --- a/src/vs/workbench/services/panel/common/panelService.ts +++ b/src/vs/workbench/services/panel/common/panelService.ts @@ -6,6 +6,8 @@ import { Event } from 'vs/base/common/event'; import { IPanel } from 'vs/workbench/common/panel'; import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; +import { IBadge } from 'vs/workbench/services/activity/common/activity'; +import { IDisposable } from 'vs/base/common/lifecycle'; export const IPanelService = createDecorator('panelService'); @@ -41,4 +43,9 @@ export interface IPanelService { * Returns pinned panels following the visual order */ getPinnedPanels(): IPanelIdentifier[]; + + /** + * Show an activity in a panel. + */ + showActivity(panelId: string, badge: IBadge, clazz?: string): IDisposable; } diff --git a/src/vs/workbench/services/progress/test/progressService.test.ts b/src/vs/workbench/services/progress/test/progressService.test.ts index eb7a11a02ce..e9413dad830 100644 --- a/src/vs/workbench/services/progress/test/progressService.test.ts +++ b/src/vs/workbench/services/progress/test/progressService.test.ts @@ -13,6 +13,8 @@ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IViewlet } from 'vs/workbench/common/viewlet'; import { Emitter } from 'vs/base/common/event'; +import { IBadge } from 'vs/workbench/services/activity/common/activity'; +import { IDisposable } from 'vs/base/common/lifecycle'; let activeViewlet: Viewlet = {} as any; @@ -87,6 +89,10 @@ class TestPanelService implements IPanelService { public dispose() { } + + public showActivity(panelId: string, badge: IBadge, clazz?: string): IDisposable { + throw new Error('Method not implemented.'); + } } class TestViewlet implements IViewlet { diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index b2064a879f3..00a770ca2ce 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -79,10 +79,12 @@ import 'vs/platform/accessibility/node/accessibilityService'; import 'vs/workbench/services/editor/browser/editorService'; import 'vs/workbench/services/history/browser/history'; import 'vs/workbench/services/files/node/remoteFileService'; +import 'vs/workbench/services/activity/browser/activityService'; import 'vs/workbench/browser/parts/quickinput/quickInput'; import 'vs/workbench/browser/parts/quickopen/quickOpenController'; import 'vs/workbench/browser/parts/titlebar/titlebarPart'; import 'vs/workbench/browser/parts/editor/editorPart'; +import 'vs/workbench/browser/parts/activitybar/activitybarPart'; registerSingleton(IMenuService, MenuService, true); registerSingleton(IListService, ListService, true); -- GitLab