Skip to content

Commit f7f3bdb

Browse files
authored
Revamp server status bar item. (#3478)
* Revamp server status bar item Signed-off-by: Sheng Chen <[email protected]>
1 parent d3bcbaa commit f7f3bdb

File tree

5 files changed

+118
-46
lines changed

5 files changed

+118
-46
lines changed

src/commands.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,4 +350,18 @@ export namespace Commands {
350350
*/
351351
export const RESOLVE_PASTED_TEXT = "java.project.resolveText";
352352

353+
/**
354+
* The command when clicking the server status bar item.
355+
*/
356+
export const OPEN_STATUS_SHORTCUT = "_java.openShortcuts";
357+
358+
}
359+
360+
/**
361+
* Command titles used to render in the UI
362+
*/
363+
export namespace CommandTitle {
364+
export const OPEN_JAVA_SETTINGS = "$(settings-gear) Open Java Settings";
365+
export const OPEN_LOGS = "$(output) Open Logs...";
366+
export const CLEAN_WORKSPACE_CACHE = "$(trash) Clean Workspace Cache";
353367
}

src/extension.ts

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ import * as fs from 'fs';
55
import * as fse from 'fs-extra';
66
import * as os from 'os';
77
import * as path from 'path';
8-
import { CodeActionContext, commands, ConfigurationTarget, Diagnostic, env, EventEmitter, ExtensionContext, extensions, IndentAction, InputBoxOptions, languages, RelativePattern, TextDocument, UIKind, Uri, ViewColumn, window, workspace, WorkspaceConfiguration } from 'vscode';
8+
import { CodeActionContext, commands, ConfigurationTarget, Diagnostic, env, EventEmitter, ExtensionContext, extensions, IndentAction, InputBoxOptions, languages, QuickPickItemKind, RelativePattern, TextDocument, UIKind, Uri, ViewColumn, window, workspace, WorkspaceConfiguration } from 'vscode';
99
import { CancellationToken, CodeActionParams, CodeActionRequest, Command, CompletionRequest, DidChangeConfigurationNotification, ExecuteCommandParams, ExecuteCommandRequest, LanguageClientOptions, RevealOutputChannelOn } from 'vscode-languageclient';
1010
import { LanguageClient } from 'vscode-languageclient/node';
1111
import { apiManager } from './apiManager';
1212
import { ClientErrorHandler } from './clientErrorHandler';
13-
import { Commands } from './commands';
13+
import { Commands, CommandTitle } from './commands';
1414
import { ClientStatus, ExtensionAPI, TraceEvent } from './extension.api';
1515
import * as fileEventHandler from './fileEventHandler';
1616
import { getSharedIndexCache, HEAP_DUMP_LOCATION, prepareExecutable } from './javaServerStarter';
@@ -23,7 +23,7 @@ import { registerClientProviders } from './providerDispatcher';
2323
import { initialize as initializeRecommendation } from './recommendation';
2424
import * as requirements from './requirements';
2525
import { languageStatusBarProvider } from './runtimeStatusBarProvider';
26-
import { serverStatusBarProvider } from './serverStatusBarProvider';
26+
import { serverStatusBarProvider, ShortcutQuickPickItem } from './serverStatusBarProvider';
2727
import { ACTIVE_BUILD_TOOL_STATE, cleanWorkspaceFileName, getJavaServerMode, handleTextDocumentChanges, getImportMode, onConfigurationChange, ServerMode, ImportMode } from './settings';
2828
import { snippetCompletionProvider } from './snippetCompletionProvider';
2929
import { JavaClassEditorProvider } from './javaClassEditor';
@@ -38,6 +38,7 @@ import { activationProgressNotification } from "./serverTaskPresenter";
3838
import { loadSupportedJreNames } from './jdkUtils';
3939
import { BuildFileSelector, PICKED_BUILD_FILES, cleanupProjectPickerCache } from './buildFilesSelector';
4040
import { pasteFile } from './pasteAction';
41+
import { ServerStatusKind } from './serverStatus';
4142

4243
const syntaxClient: SyntaxLanguageClient = new SyntaxLanguageClient();
4344
const standardClient: StandardLanguageClient = new StandardLanguageClient();
@@ -343,6 +344,50 @@ export async function activate(context: ExtensionContext): Promise<ExtensionAPI>
343344
}
344345

345346
// Register commands here to make it available even when the language client fails
347+
context.subscriptions.push(commands.registerCommand(Commands.OPEN_STATUS_SHORTCUT, async (status: string) => {
348+
const items: ShortcutQuickPickItem[] = [];
349+
let statusCommand: string;
350+
if (status === ServerStatusKind.error || status === ServerStatusKind.warning) {
351+
statusCommand = "workbench.panel.markers.view.focus";
352+
} else {
353+
statusCommand = Commands.SHOW_SERVER_TASK_STATUS;
354+
}
355+
356+
items.push({
357+
label: `$(coffee) Java Status: ${status}`,
358+
command: statusCommand,
359+
}, {
360+
label: "",
361+
kind: QuickPickItemKind.Separator,
362+
command: "",
363+
}, {
364+
label: CommandTitle.OPEN_JAVA_SETTINGS,
365+
command: "workbench.action.openSettings",
366+
args: ["java"],
367+
}, {
368+
label: CommandTitle.OPEN_LOGS,
369+
command: Commands.OPEN_LOGS,
370+
}, {
371+
label: CommandTitle.CLEAN_WORKSPACE_CACHE,
372+
command: Commands.CLEAN_WORKSPACE
373+
});
374+
375+
const choice = await window.showQuickPick(items);
376+
if (!choice) {
377+
return;
378+
}
379+
380+
apiManager.fireTraceEvent({
381+
name: "triggerShortcutCommand",
382+
properties: {
383+
message: choice.command,
384+
},
385+
});
386+
387+
if (choice.command) {
388+
commands.executeCommand(choice.command, ...(choice.args || []));
389+
}
390+
}));
346391
context.subscriptions.push(commands.registerCommand(Commands.OPEN_SERVER_LOG, (column: ViewColumn) => openServerLogFile(storagePath, column)));
347392
context.subscriptions.push(commands.registerCommand(Commands.OPEN_SERVER_STDOUT_LOG, (column: ViewColumn) => openRollingServerLogFile(storagePath, '.out-jdt.ls', column)));
348393
context.subscriptions.push(commands.registerCommand(Commands.OPEN_SERVER_STDERR_LOG, (column: ViewColumn) => openRollingServerLogFile(storagePath, '.error-jdt.ls', column)));
@@ -510,7 +555,7 @@ async function startStandardServer(context: ExtensionContext, requirements: requ
510555
standardClient.start().then(async () => {
511556
standardClient.registerLanguageClientActions(context, await fse.pathExists(path.join(workspacePath, ".metadata", ".plugins")), jdtEventEmitter);
512557
});
513-
serverStatusBarProvider.showStandardStatus();
558+
serverStatusBarProvider.setBusy("Activating...");
514559
}
515560

516561
async function workspaceContainsBuildFiles(): Promise<boolean> {

src/serverStatus.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import { EventEmitter } from "vscode";
44
import { serverTasks } from "./serverTasks";
5-
import { ProgressKind } from "./protocol";
5+
import { serverStatusBarProvider } from "./serverStatusBarProvider";
66

77
export enum ServerStatusKind {
88
ready = "Ready",
@@ -32,7 +32,11 @@ export namespace serverStatus {
3232

3333
export function initialize() {
3434
serverTasks.onDidUpdateServerTask(tasks => {
35-
isBusy = tasks.some(task => !(task.complete));
35+
const busyTask = tasks.find(task => !task.complete);
36+
isBusy = !!busyTask;
37+
if (isBusy) {
38+
serverStatusBarProvider.setBusy(busyTask.value.message);
39+
}
3640
fireEvent();
3741
});
3842
}

src/serverStatusBarProvider.ts

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,75 @@
11
'use strict';
22

3-
import { StatusBarItem, window, StatusBarAlignment } from "vscode";
4-
import { Commands } from "./commands";
3+
import { StatusBarItem, window, StatusBarAlignment, ThemeColor, commands, QuickPickItem, QuickPickItemKind } from "vscode";
54
import { Disposable } from "vscode-languageclient";
65
import { StatusCommands } from "./languageStatusItemFactory";
6+
import { Commands } from "./commands";
7+
import { ServerStatusKind } from "./serverStatus";
78

89
class ServerStatusBarProvider implements Disposable {
910
private statusBarItem: StatusBarItem;
1011

1112
constructor() {
12-
this.statusBarItem = window.createStatusBarItem("java.serverStatus", StatusBarAlignment.Right, Number.MIN_VALUE);
13+
this.statusBarItem = window.createStatusBarItem("java.serverStatus", StatusBarAlignment.Left);
14+
this.statusBarItem.show();
1315
}
1416

1517
public showLightWeightStatus(): void {
1618
this.statusBarItem.name = "Java Server Mode";
17-
this.statusBarItem.text = StatusIcon.lightWeight;
19+
this.statusBarItem.text = `${StatusIcon.lightWeight} Java: Lightweight Mode`;
1820
this.statusBarItem.command = StatusCommands.switchToStandardCommand;
1921
this.statusBarItem.tooltip = "Java language server is running in LightWeight mode, click to switch to Standard mode";
20-
this.statusBarItem.show();
2122
}
2223

2324
public showNotImportedStatus(): void {
2425
this.statusBarItem.name = "No projects are imported";
25-
this.statusBarItem.text = StatusIcon.notImported;
26+
this.statusBarItem.text = `${StatusIcon.notImported} Java: No Projects Imported`;
2627
this.statusBarItem.command = StatusCommands.startStandardServerCommand;
2728
this.statusBarItem.tooltip = "No projects are imported, click to load projects";
28-
this.statusBarItem.show();
29-
}
30-
31-
public showStandardStatus(): void {
32-
this.statusBarItem.name = "Java Server Status";
33-
this.statusBarItem.text = StatusIcon.busy;
34-
this.statusBarItem.command = Commands.SHOW_SERVER_TASK_STATUS;
35-
this.statusBarItem.tooltip = "";
36-
this.statusBarItem.show();
3729
}
3830

39-
public setBusy(): void {
40-
this.statusBarItem.text = StatusIcon.busy;
31+
public setBusy(process: string): void {
32+
this.statusBarItem.text = `${StatusIcon.busy} Java: ${process}`;
33+
this.statusBarItem.tooltip = process;
34+
this.statusBarItem.command = {
35+
title: "Show Java status menu",
36+
command: Commands.OPEN_STATUS_SHORTCUT,
37+
tooltip: "Show Java status menu",
38+
arguments: [ServerStatusKind.busy],
39+
};
4140
}
4241

4342
public setError(): void {
44-
this.statusBarItem.text = StatusIcon.error;
45-
this.statusBarItem.command = Commands.OPEN_LOGS;
43+
this.statusBarItem.text = `${StatusIcon.java} Java: Error`;
44+
this.statusBarItem.tooltip = "Show Java status menu";
45+
this.statusBarItem.command = {
46+
title: "Show Java status menu",
47+
command: Commands.OPEN_STATUS_SHORTCUT,
48+
tooltip: "Show Java status menu",
49+
arguments: [ServerStatusKind.error],
50+
};
4651
}
4752

4853
public setWarning(): void {
49-
this.statusBarItem.text = StatusIcon.warning;
50-
this.statusBarItem.command = "workbench.panel.markers.view.focus";
51-
this.statusBarItem.tooltip = "Errors occurred in project configurations, click to show the PROBLEMS panel";
54+
this.statusBarItem.text = `${StatusIcon.java} Java: Warning`;
55+
this.statusBarItem.tooltip = "Show Java status menu";
56+
this.statusBarItem.command = {
57+
title: "Show Java status menu",
58+
command: Commands.OPEN_STATUS_SHORTCUT,
59+
tooltip: "Show Java status menu",
60+
arguments: [ServerStatusKind.warning],
61+
};
5262
}
5363

5464
public setReady(): void {
55-
this.statusBarItem.text = StatusIcon.ready;
56-
this.statusBarItem.command = Commands.SHOW_SERVER_TASK_STATUS;
57-
this.statusBarItem.tooltip = "ServiceReady";
58-
}
59-
60-
public updateTooltip(tooltip: string): void {
61-
this.statusBarItem.tooltip = tooltip;
65+
this.statusBarItem.text = `${StatusIcon.java} Java: Ready`;
66+
this.statusBarItem.tooltip = "Show Java status menu";
67+
this.statusBarItem.command = {
68+
title: "Show Java status menu",
69+
command: Commands.OPEN_STATUS_SHORTCUT,
70+
tooltip: "Show Java status menu",
71+
arguments: ["Ready"],
72+
};
6273
}
6374

6475
public dispose(): void {
@@ -68,11 +79,14 @@ class ServerStatusBarProvider implements Disposable {
6879

6980
export enum StatusIcon {
7081
lightWeight = "$(rocket)",
82+
notImported = "$(info)",
7183
busy = "$(sync~spin)",
72-
ready = "$(thumbsup)",
73-
warning = "$(thumbsdown)",
74-
error = "$(thumbsdown)",
75-
notImported = "$(info)"
84+
java = "$(coffee)",
85+
}
86+
87+
export interface ShortcutQuickPickItem extends QuickPickItem {
88+
command: string;
89+
args?: any[];
7690
}
7791

7892
export const serverStatusBarProvider: ServerStatusBarProvider = new ServerStatusBarProvider();

src/standardLanguageClient.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,11 @@ export class StandardLanguageClient {
7575

7676
serverStatus.initialize();
7777
serverStatus.onServerStatusChanged(status => {
78-
if (status === ServerStatusKind.busy) {
79-
serverStatusBarProvider.setBusy();
80-
} else if (status === ServerStatusKind.error) {
78+
if (status === ServerStatusKind.error) {
8179
serverStatusBarProvider.setError();
8280
} else if (status === ServerStatusKind.warning) {
8381
serverStatusBarProvider.setWarning();
84-
} else {
82+
} else if (status === ServerStatusKind.ready) {
8583
serverStatusBarProvider.setReady();
8684
}
8785
});
@@ -181,9 +179,6 @@ export class StandardLanguageClient {
181179
// message goes to progress report instead
182180
break;
183181
}
184-
if (!serverStatus.hasErrors()) {
185-
serverStatusBarProvider.updateTooltip(report.message);
186-
}
187182
});
188183

189184
this.languageClient.onNotification(ProgressNotification.type, (progress) => {

0 commit comments

Comments
 (0)