diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 7712c9887b8..2b32b890461 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -2865,12 +2865,10 @@ declare module 'vscode' { interface LanguageStatusItem { selector: DocumentSelector; - + severity: LanguageStatusSeverity; text: string; detail: string; // tooltip! - // command: string | Command | undefined; - - severity: LanguageStatusSeverity; + command: Command | undefined; dispose(): void; } diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 8a401cd930c..1499d0d83e8 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -186,7 +186,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I const extHostMessageService = new ExtHostMessageService(rpcProtocol, extHostLogService); const extHostDialogs = new ExtHostDialogs(rpcProtocol); const extHostStatusBar = new ExtHostStatusBar(rpcProtocol, extHostCommands.converter); - const extHostLanguages = new ExtHostLanguages(rpcProtocol, extHostDocuments); + const extHostLanguages = new ExtHostLanguages(rpcProtocol, extHostDocuments, extHostCommands.converter); // Register API-ish commands ExtHostApiCommands.register(extHostCommands); diff --git a/src/vs/workbench/api/common/extHostLanguages.ts b/src/vs/workbench/api/common/extHostLanguages.ts index 9aa3dda450c..296fd17dc65 100644 --- a/src/vs/workbench/api/common/extHostLanguages.ts +++ b/src/vs/workbench/api/common/extHostLanguages.ts @@ -10,20 +10,20 @@ import * as typeConvert from 'vs/workbench/api/common/extHostTypeConverters'; import { StandardTokenType, Range, Position, LanguageStatusSeverity } from 'vs/workbench/api/common/extHostTypes'; import Severity from 'vs/base/common/severity'; import { disposableTimeout } from 'vs/base/common/async'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { CommandsConverter } from 'vs/workbench/api/common/extHostCommands'; export class ExtHostLanguages { private readonly _proxy: MainThreadLanguagesShape; - private readonly _documents: ExtHostDocuments; constructor( mainContext: IMainContext, - documents: ExtHostDocuments + private readonly _documents: ExtHostDocuments, + private readonly _commands: CommandsConverter ) { this._proxy = mainContext.getProxy(MainContext.MainThreadLanguages); - this._documents = documents; } getLanguages(): Promise { @@ -73,28 +73,39 @@ export class ExtHostLanguages { const handle = this._handlePool++; const proxy = this._proxy; - const data: { selector: any, text: string, detail: string, severity: vscode.LanguageStatusSeverity } = { + const data: Omit = { selector, + severity: LanguageStatusSeverity.Information, + command: undefined, text: '', detail: '', - severity: LanguageStatusSeverity.Information, }; let soonHandle: IDisposable | undefined; + let commandDisposables = new DisposableStore(); const updateAsync = () => { soonHandle?.dispose(); soonHandle = disposableTimeout(() => { + + commandDisposables.clear(); + this._proxy.$setLanguageStatus(handle, { source: extension.displayName ?? extension.name, selector: data.selector, label: data.text, detail: data.detail, - severity: data.severity === LanguageStatusSeverity.Error ? Severity.Error : data.severity === LanguageStatusSeverity.Warning ? Severity.Warning : Severity.Info + severity: data.severity === LanguageStatusSeverity.Error ? Severity.Error : data.severity === LanguageStatusSeverity.Warning ? Severity.Warning : Severity.Info, + command: data.command && this._commands.toInternal(data.command, commandDisposables) }); }, 0); }; const result: vscode.LanguageStatusItem = { + dispose() { + commandDisposables.dispose(); + soonHandle?.dispose(); + proxy.$removeLanguageStatus(handle); + }, get selector() { return data.selector; }, @@ -123,9 +134,12 @@ export class ExtHostLanguages { data.severity = value; updateAsync(); }, - dispose() { - soonHandle?.dispose(); - proxy.$removeLanguageStatus(handle); + get command() { + return data.command; + }, + set command(value) { + data.command = value; + updateAsync(); } }; updateAsync(); diff --git a/src/vs/workbench/contrib/languageStatus/browser/languageStatus.contribution.ts b/src/vs/workbench/contrib/languageStatus/browser/languageStatus.contribution.ts index bd1fdd457a8..52fb84ab510 100644 --- a/src/vs/workbench/contrib/languageStatus/browser/languageStatus.contribution.ts +++ b/src/vs/workbench/contrib/languageStatus/browser/languageStatus.contribution.ts @@ -11,7 +11,7 @@ import Severity from 'vs/base/common/severity'; import { getCodeEditor } from 'vs/editor/browser/editorBrowser'; import { localize } from 'vs/nls'; import { Registry } from 'vs/platform/registry/common/platform'; -import { registerThemingParticipant, ThemeColor, themeColorFromId, ThemeIcon } from 'vs/platform/theme/common/themeService'; +import { registerThemingParticipant, ThemeColor, themeColorFromId } from 'vs/platform/theme/common/themeService'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { NOTIFICATIONS_BORDER, STATUS_BAR_ERROR_ITEM_BACKGROUND, STATUS_BAR_ERROR_ITEM_FOREGROUND, STATUS_BAR_WARNING_ITEM_BACKGROUND, STATUS_BAR_WARNING_ITEM_FOREGROUND } from 'vs/workbench/common/theme'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -21,9 +21,8 @@ import { IStatusbarEntry, IStatusbarEntryAccessor, IStatusbarService, StatusbarA import { parseLinkedText } from 'vs/base/common/linkedText'; import { Link } from 'vs/platform/opener/browser/link'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; -import { Action } from 'vs/base/common/actions'; -import { Codicon } from 'vs/base/common/codicons'; +import { Button } from 'vs/base/browser/ui/button/button'; +import { ICommandService } from 'vs/platform/commands/common/commands'; class EditorStatusContribution implements IWorkbenchContribution { @@ -39,6 +38,7 @@ class EditorStatusContribution implements IWorkbenchContribution { @IStatusbarService private readonly _statusBarService: IStatusbarService, @IEditorService private readonly _editorService: IEditorService, @IOpenerService private readonly _openerService: IOpenerService, + @ICommandService private readonly _commandService: ICommandService, ) { _languageStatusService.onDidChange(this._update, this, this._disposables); _editorService.onDidActiveEditorChange(this._update, this, this._disposables); @@ -120,16 +120,18 @@ class EditorStatusContribution implements IWorkbenchContribution { const right = document.createElement('div'); node.appendChild(right); - const actions = new ActionBar(right, {}); - actions.push(new Action( - 'pin', - localize('label.pin', 'Pin'), - ThemeIcon.asClassName(Codicon.pin), - true, - () => { - console.log(status); - } - ), { icon: true, label: false }); + const { command } = status; + if (command) { + const btn = new Button(right, { title: command.tooltip }); + btn.label = command.title; + btn.onDidClick(_e => { + if (command.arguments) { + this._commandService.executeCommand(command.id, ...command.arguments); + } else { + this._commandService.executeCommand(command.id); + } + }); + } return node; } diff --git a/src/vs/workbench/contrib/languageStatus/browser/media/languageStatus.css b/src/vs/workbench/contrib/languageStatus/browser/media/languageStatus.css index ba4ab75e7ad..7ddf6836dcf 100644 --- a/src/vs/workbench/contrib/languageStatus/browser/media/languageStatus.css +++ b/src/vs/workbench/contrib/languageStatus/browser/media/languageStatus.css @@ -13,6 +13,7 @@ border-bottom: 1px solid var(--code-notifications-border); } -.monaco-workbench .hover-language-status-element .monaco-action-bar { - padding-left: 8px; +.monaco-workbench .hover-language-status-element .monaco-button.monaco-text-button { + font-size: smaller; + padding: 2px 4px } diff --git a/src/vs/workbench/services/languageStatus/common/languageStatusService.ts b/src/vs/workbench/services/languageStatus/common/languageStatusService.ts index 2fc2a423646..bd02bf7b3a9 100644 --- a/src/vs/workbench/services/languageStatus/common/languageStatusService.ts +++ b/src/vs/workbench/services/languageStatus/common/languageStatusService.ts @@ -8,6 +8,7 @@ import { Event } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; import Severity from 'vs/base/common/severity'; import { ITextModel } from 'vs/editor/common/model'; +import { Command } from 'vs/editor/common/modes'; import { LanguageFeatureRegistry } from 'vs/editor/common/modes/languageFeatureRegistry'; import { LanguageSelector } from 'vs/editor/common/modes/languageSelector'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -20,6 +21,7 @@ export interface ILanguageStatus { label: string; detail: string; source: string; + command: Command | undefined; } export interface ILanguageStatusProvider {