Skip to content

Commit

Permalink
Revamp server status bar item
Browse files Browse the repository at this point in the history
  • Loading branch information
jdneo committed Jan 26, 2024
1 parent d3bcbaa commit 24766b6
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 43 deletions.
14 changes: 14 additions & 0 deletions src/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -350,4 +350,18 @@ export namespace Commands {
*/
export const RESOLVE_PASTED_TEXT = "java.project.resolveText";

/**
* The command when clicking the server status bar item.
*/
export const OPEN_STATUS_SHORTCUT = "_java.openShortcuts";

}

/**
* Command titles used to render in the UI
*/
export namespace CommandTitle {
export const OPEN_JAVA_SETTINGS = "$(settings-gear) Open Java Settings";
export const OPEN_LOGS = "$(output) Open Logs...";
export const CLEAN_WORKSPACE_CACHE = "$(trash) Clean Workspace Cache";
}
2 changes: 1 addition & 1 deletion src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,7 @@ async function startStandardServer(context: ExtensionContext, requirements: requ
standardClient.start().then(async () => {
standardClient.registerLanguageClientActions(context, await fse.pathExists(path.join(workspacePath, ".metadata", ".plugins")), jdtEventEmitter);
});
serverStatusBarProvider.showStandardStatus();
serverStatusBarProvider.setBusy("Activating...");
}

async function workspaceContainsBuildFiles(): Promise<boolean> {
Expand Down
8 changes: 6 additions & 2 deletions src/serverStatus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import { EventEmitter } from "vscode";
import { serverTasks } from "./serverTasks";
import { ProgressKind } from "./protocol";
import { serverStatusBarProvider } from "./serverStatusBarProvider";

export enum ServerStatusKind {
ready = "Ready",
Expand Down Expand Up @@ -32,7 +32,11 @@ export namespace serverStatus {

export function initialize() {
serverTasks.onDidUpdateServerTask(tasks => {
isBusy = tasks.some(task => !(task.complete));
const busyTask = tasks.find(task => !task.complete);
isBusy = !!busyTask;
if (isBusy) {
serverStatusBarProvider.setBusy(busyTask.value.message);
}
fireEvent();
});
}
Expand Down
134 changes: 101 additions & 33 deletions src/serverStatusBarProvider.ts
Original file line number Diff line number Diff line change
@@ -1,64 +1,128 @@
'use strict';

import { StatusBarItem, window, StatusBarAlignment } from "vscode";
import { Commands } from "./commands";
import { StatusBarItem, window, StatusBarAlignment, ThemeColor, commands, QuickPickItem, QuickPickItemKind } from "vscode";
import { Disposable } from "vscode-languageclient";
import { StatusCommands } from "./languageStatusItemFactory";
import { CommandTitle, Commands } from "./commands";
import { ServerStatusKind } from "./serverStatus";
import { apiManager } from "./apiManager";

class ServerStatusBarProvider implements Disposable {
private statusBarItem: StatusBarItem;
private disposables: Disposable[] = [];

constructor() {
this.statusBarItem = window.createStatusBarItem("java.serverStatus", StatusBarAlignment.Right, Number.MIN_VALUE);
this.statusBarItem = window.createStatusBarItem("java.serverStatus", StatusBarAlignment.Left);
this.statusBarItem.show();
this.disposables.push(this.statusBarItem);

this.disposables.push(commands.registerCommand(Commands.OPEN_STATUS_SHORTCUT, async (status: string) => {
const items: ShortcutQuickPickItem[] = [];
let statusCommand: string;
if (status === ServerStatusKind.error || status === ServerStatusKind.warning) {
statusCommand = "workbench.panel.markers.view.focus";
} else {
statusCommand = Commands.SHOW_SERVER_TASK_STATUS;
}

items.push({
label: `$(coffee) Java Status: ${status}`,
command: statusCommand,
}, {
label: "",
kind: QuickPickItemKind.Separator,
command: "",
}, {
label: CommandTitle.OPEN_JAVA_SETTINGS,
command: "workbench.action.openSettings",
args: ["java"],
}, {
label: CommandTitle.OPEN_LOGS,
command: Commands.OPEN_LOGS,
}, {
label: CommandTitle.CLEAN_WORKSPACE_CACHE,
command: Commands.CLEAN_WORKSPACE
});

const choice = await window.showQuickPick(items);
if (!choice) {
return;
}

apiManager.fireTraceEvent({
name: "triggerShortcutCommand",
properties: {
message: choice.command,
},
});

if (choice.command) {
commands.executeCommand(choice.command, ...(choice.args || []));
}
}));
}

public showLightWeightStatus(): void {
this.statusBarItem.name = "Java Server Mode";
this.statusBarItem.text = StatusIcon.lightWeight;
this.statusBarItem.text = `${StatusIcon.lightWeight} Java: Lightweight Mode`;
this.statusBarItem.backgroundColor = new ThemeColor("statusBarItem.warningBackground");
this.statusBarItem.command = StatusCommands.switchToStandardCommand;
this.statusBarItem.tooltip = "Java language server is running in LightWeight mode, click to switch to Standard mode";
this.statusBarItem.show();
}

public showNotImportedStatus(): void {
this.statusBarItem.name = "No projects are imported";
this.statusBarItem.text = StatusIcon.notImported;
this.statusBarItem.text = `${StatusIcon.notImported} Java: No Projects Imported`;
this.statusBarItem.backgroundColor = new ThemeColor("statusBarItem.warningBackground");
this.statusBarItem.command = StatusCommands.startStandardServerCommand;
this.statusBarItem.tooltip = "No projects are imported, click to load projects";
this.statusBarItem.show();
}

public showStandardStatus(): void {
this.statusBarItem.name = "Java Server Status";
this.statusBarItem.text = StatusIcon.busy;
this.statusBarItem.command = Commands.SHOW_SERVER_TASK_STATUS;
this.statusBarItem.tooltip = "";
this.statusBarItem.show();
}

public setBusy(): void {
this.statusBarItem.text = StatusIcon.busy;
public setBusy(process: string): void {
this.statusBarItem.text = `${StatusIcon.busy} Java: ${process}`;
this.statusBarItem.tooltip = process;
this.statusBarItem.backgroundColor = undefined;
this.statusBarItem.command = {
title: "Show Java status menu",
command: Commands.OPEN_STATUS_SHORTCUT,
tooltip: "Show Java status menu",
arguments: [ServerStatusKind.busy],
};
}

public setError(): void {
this.statusBarItem.text = StatusIcon.error;
this.statusBarItem.command = Commands.OPEN_LOGS;
this.statusBarItem.text = `${StatusIcon.java} Java: Error`;
this.statusBarItem.backgroundColor = new ThemeColor("statusBarItem.errorBackground");
this.statusBarItem.tooltip = "Show Java status menu";
this.statusBarItem.command = {
title: "Show Java status menu",
command: Commands.OPEN_STATUS_SHORTCUT,
tooltip: "Show Java status menu",
arguments: [ServerStatusKind.error],
};
}

public setWarning(): void {
this.statusBarItem.text = StatusIcon.warning;
this.statusBarItem.command = "workbench.panel.markers.view.focus";
this.statusBarItem.tooltip = "Errors occurred in project configurations, click to show the PROBLEMS panel";
this.statusBarItem.text = `${StatusIcon.java} Java: Warning`;
this.statusBarItem.backgroundColor = new ThemeColor("statusBarItem.warningBackground");
this.statusBarItem.tooltip = "Show Java status menu";
this.statusBarItem.command = {
title: "Show Java status menu",
command: Commands.OPEN_STATUS_SHORTCUT,
tooltip: "Show Java status menu",
arguments: [ServerStatusKind.warning],
};
}

public setReady(): void {
this.statusBarItem.text = StatusIcon.ready;
this.statusBarItem.command = Commands.SHOW_SERVER_TASK_STATUS;
this.statusBarItem.tooltip = "ServiceReady";
}

public updateTooltip(tooltip: string): void {
this.statusBarItem.tooltip = tooltip;
this.statusBarItem.text = `${StatusIcon.java} Java: Ready`;
this.statusBarItem.tooltip = "Show Java status menu";
this.statusBarItem.command = {
title: "Show Java status menu",
command: Commands.OPEN_STATUS_SHORTCUT,
tooltip: "Show Java status menu",
arguments: ["Ready"],
};
}

public dispose(): void {
Expand All @@ -68,11 +132,15 @@ class ServerStatusBarProvider implements Disposable {

export enum StatusIcon {
lightWeight = "$(rocket)",
notImported = "$(info)",
busy = "$(sync~spin)",
ready = "$(thumbsup)",
warning = "$(thumbsdown)",
error = "$(thumbsdown)",
notImported = "$(info)"
java = "$(coffee)",
}

interface ShortcutQuickPickItem extends QuickPickItem {
command: string;
args?: any[];
}


export const serverStatusBarProvider: ServerStatusBarProvider = new ServerStatusBarProvider();
9 changes: 2 additions & 7 deletions src/standardLanguageClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,11 @@ export class StandardLanguageClient {

serverStatus.initialize();
serverStatus.onServerStatusChanged(status => {
if (status === ServerStatusKind.busy) {
serverStatusBarProvider.setBusy();
} else if (status === ServerStatusKind.error) {
if (status === ServerStatusKind.error) {
serverStatusBarProvider.setError();
} else if (status === ServerStatusKind.warning) {
serverStatusBarProvider.setWarning();
} else {
} else if (status === ServerStatusKind.ready) {
serverStatusBarProvider.setReady();
}
});
Expand Down Expand Up @@ -181,9 +179,6 @@ export class StandardLanguageClient {
// message goes to progress report instead
break;
}
if (!serverStatus.hasErrors()) {
serverStatusBarProvider.updateTooltip(report.message);
}
});

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

0 comments on commit 24766b6

Please sign in to comment.