From 12bc26b6b4176056248cafdf1112c9bc6f145d18 Mon Sep 17 00:00:00 2001 From: Asher Date: Tue, 3 Sep 2019 16:38:53 -0500 Subject: [PATCH] Implement status bar API --- scripts/vscode.patch | 21 +++------ src/api.ts | 104 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 109 insertions(+), 16 deletions(-) diff --git a/scripts/vscode.patch b/scripts/vscode.patch index f9985443..dd2f9631 100644 --- a/scripts/vscode.patch +++ b/scripts/vscode.patch @@ -355,7 +355,7 @@ index add4dfb2fc..18fc71df51 100644 get onDidLanguagesChange(): Event { return this.channel.listen('onDidLanguagesChange'); } diff --git a/src/vs/platform/log/common/logIpc.ts b/src/vs/platform/log/common/logIpc.ts -index 9f68b645b6..b422a3c809 100644 +index 9f68b645b6..1e224cc29a 100644 --- a/src/vs/platform/log/common/logIpc.ts +++ b/src/vs/platform/log/common/logIpc.ts @@ -26,6 +26,7 @@ export class LogLevelSetterChannel implements IServerChannel { @@ -377,13 +377,6 @@ index 9f68b645b6..b422a3c809 100644 } export class FollowerLogService extends DelegatedLogService implements ILogService { -@@ -56,4 +61,4 @@ export class FollowerLogService extends DelegatedLogService implements ILogServi - setLevel(level: LogLevel): void { - this.master.setLevel(level); - } --} -\ No newline at end of file -+} diff --git a/src/vs/platform/product/node/package.ts b/src/vs/platform/product/node/package.ts index d39c5877d6..c189d6f19f 100644 --- a/src/vs/platform/product/node/package.ts @@ -562,7 +555,7 @@ index 9fdeeeb1a1..db2dc002c3 100644 } diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts -index f5944ce974..a3fcc391fd 100644 +index f5944ce974..f2094de18b 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -45,6 +45,7 @@ import { FileLogService } from 'vs/platform/log/common/fileLogService'; @@ -573,14 +566,14 @@ index f5944ce974..a3fcc391fd 100644 class CodeRendererMain extends Disposable { -@@ -57,6 +58,7 @@ class CodeRendererMain extends Disposable { +@@ -94,6 +95,7 @@ class CodeRendererMain extends Disposable { - async open(): Promise { - const services = await this.initServices(); + // Startup + workbench.startup(); + await initialize(services.serviceCollection); + } - await domContentLoaded(); - mark('willStartWorkbench'); + private restoreBaseTheme(): void { @@ -204,6 +206,7 @@ class CodeRendererMain extends Disposable { const channel = connection.getChannel(REMOTE_FILE_SYSTEM_CHANNEL_NAME); const remoteFileSystemProvider = this._register(new RemoteExtensionsFileSystemProvider(channel, remoteAgentService.getEnvironment())); diff --git a/src/api.ts b/src/api.ts index cee4450b..f3b48375 100644 --- a/src/api.ts +++ b/src/api.ts @@ -1,3 +1,4 @@ +import * as vscode from "vscode"; import { createCSSRule } from "vs/base/browser/dom"; import { Emitter, Event } from "vs/base/common/event"; import { IDisposable } from "vs/base/common/lifecycle"; @@ -13,6 +14,7 @@ import { IInstantiationService, ServiceIdentifier } from "vs/platform/instantiat import { ServiceCollection } from "vs/platform/instantiation/common/serviceCollection"; import { INotificationService } from "vs/platform/notification/common/notification"; import { Registry } from "vs/platform/registry/common/platform"; +import { IStatusbarEntry, IStatusbarEntryAccessor, IStatusbarService, StatusbarAlignment } from "vs/platform/statusbar/common/statusbar"; import { IStorageService } from "vs/platform/storage/common/storage"; import { ITelemetryService } from "vs/platform/telemetry/common/telemetry"; import { IThemeService } from "vs/platform/theme/common/themeService"; @@ -28,7 +30,6 @@ import { IEditorService } from "vs/workbench/services/editor/common/editorServic import { IExtensionService } from "vs/workbench/services/extensions/common/extensions"; import { IWorkbenchLayoutService } from "vs/workbench/services/layout/browser/layoutService"; import { IViewletService } from "vs/workbench/services/viewlet/browser/viewlet"; -import * as vscode from "vscode"; /** * Client-side implementation of VS Code's API. @@ -42,6 +43,7 @@ export const vscodeApi = (serviceCollection: ServiceCollection): Partial(ViewsExtensions.ViewsRegistry); + const statusbarService = getService(IStatusbarService); // It would be nice to just export what VS Code creates but it looks to me // that it assumes it's running in the extension host and wouldn't work here. @@ -52,8 +54,10 @@ export const vscodeApi = (serviceCollection: ServiceCollection): Partial(commandId: string, ...args: any[]): Promise => { return commandService.executeCommand(commandId, ...args); @@ -63,6 +67,9 @@ export const vscodeApi = (serviceCollection: ServiceCollection): Partial, window: { + createStatusBarItem: (alignment?: vscode.StatusBarAlignment, priority?: number): vscode.StatusBarItem => { + return new StatusBarEntry(statusbarService, alignment, priority); + }, registerTreeDataProvider: (id: string, dataProvider: vscode.TreeDataProvider): IDisposable => { const tree = new TreeViewDataProvider(dataProvider); const view = viewsRegistry.getView(id); @@ -267,3 +274,96 @@ class TreeViewDataProvider implements ITreeViewDataProvider { : `coder-tree-item-uuid/${generateUuid()}`; } } + +class ThemeColor { + public id: string; + constructor(id: string) { + this.id = id; + } +} + +interface IStatusBarEntry extends IStatusbarEntry { + alignment: StatusbarAlignment; + priority?: number; +} + +enum StatusBarAlignment { + Left = 1, + Right = 2 +} + +class StatusBarEntry implements vscode.StatusBarItem { + private static ID = 0; + + private _id: number; + private entry: IStatusBarEntry; + private _visible: boolean; + private disposed: boolean; + private statusId: string; + private statusName: string; + private accessor?: IStatusbarEntryAccessor; + private timeout: any; + + constructor(private readonly statusbarService: IStatusbarService, alignment?: vscode.StatusBarAlignment, priority?: number) { + this._id = StatusBarEntry.ID--; + this.statusId = "web-api"; + this.statusName = "Web API"; + this.entry = { + alignment: alignment && alignment === StatusBarAlignment.Left + ? StatusbarAlignment.LEFT : StatusbarAlignment.RIGHT, + text: "", + priority, + }; + } + + public get alignment(): vscode.StatusBarAlignment { + return this.entry.alignment === StatusbarAlignment.LEFT + ? StatusBarAlignment.Left : StatusBarAlignment.Right; + } + + public get id(): number { return this._id; } + public get priority(): number | undefined { return this.entry.priority; } + public get text(): string { return this.entry.text; } + public get tooltip(): string | undefined { return this.entry.tooltip; } + public get color(): string | ThemeColor | undefined { return this.entry.color; } + public get command(): string | undefined { return this.entry.command; } + + public set text(text: string) { this.update({ text }); } + public set tooltip(tooltip: string | undefined) { this.update({ tooltip }); } + public set color(color: string | ThemeColor | undefined) { this.update({ color }); } + public set command(command: string | undefined) { this.update({ command }); } + + public show(): void { + this._visible = true; + this.update(); + } + + public hide(): void { + clearTimeout(this.timeout); + this._visible = false; + if (this.accessor) { + this.accessor.dispose(); + this.accessor = undefined; + } + } + + private update(values?: Partial): void { + this.entry = { ...this.entry, ...values }; + if (this.disposed || !this._visible) { + return; + } + clearTimeout(this.timeout); + this.timeout = setTimeout(() => { + if (!this.accessor) { + this.accessor = this.statusbarService.addEntry(this.entry, this.statusId, this.statusName, this.entry.alignment, this.priority); + } else { + this.accessor.update(this.entry); + } + }, 0); + } + + public dispose(): void { + this.hide(); + this.disposed = true; + } +}