From 9eafe033cad44e37ecb0727208556bcc96a88a88 Mon Sep 17 00:00:00 2001 From: vince-fugnitto Date: Tue, 19 Oct 2021 10:57:34 -0400 Subject: [PATCH] menu: update `go` main-menu The commit updates the `go` main-menu to add missing items used for navigation, location, language-features and problems. Signed-off-by: vince-fugnitto --- packages/editor/src/browser/editor-command.ts | 5 ++ .../editor/src/browser/editor-contribution.ts | 4 +- packages/editor/src/browser/editor-menu.ts | 30 ++++++++++-- .../browser/file-search-frontend-module.ts | 4 +- .../browser/quick-file-open-contribution.ts | 13 ++++- .../src/browser/monaco-frontend-module.ts | 2 +- packages/monaco/src/browser/monaco-menu.ts | 47 ++++++++++++++++++- .../src/browser/workspace-symbol-command.ts | 12 ++++- .../plugin-vscode-commands-contribution.ts | 2 +- 9 files changed, 104 insertions(+), 15 deletions(-) diff --git a/packages/editor/src/browser/editor-command.ts b/packages/editor/src/browser/editor-command.ts index ba2e4d874caf9..95cf652a0d419 100644 --- a/packages/editor/src/browser/editor-command.ts +++ b/packages/editor/src/browser/editor-command.ts @@ -30,6 +30,11 @@ export namespace EditorCommands { const EDITOR_CATEGORY = 'Editor'; const VIEW_CATEGORY = 'View'; + export const GOTO_LINE_COLUMN: Command = { + id: 'editor.action.gotoLine', + label: 'Go to line/column' + }; + /** * Show editor references */ diff --git a/packages/editor/src/browser/editor-contribution.ts b/packages/editor/src/browser/editor-contribution.ts index 00f30cc51c722..7fedfd59b1637 100644 --- a/packages/editor/src/browser/editor-contribution.ts +++ b/packages/editor/src/browser/editor-contribution.ts @@ -122,8 +122,8 @@ export class EditorContribution implements FrontendApplicationContribution, Comm text: `Ln ${cursor.line + 1}, Col ${editor.getVisibleColumn(cursor)}`, alignment: StatusBarAlignment.RIGHT, priority: 100, - tooltip: 'Go To Line', - command: 'editor.action.gotoLine' + tooltip: EditorCommands.GOTO_LINE_COLUMN.label, + command: EditorCommands.GOTO_LINE_COLUMN.id }); } diff --git a/packages/editor/src/browser/editor-menu.ts b/packages/editor/src/browser/editor-menu.ts index 3eaab68fff497..68661bf279f3b 100644 --- a/packages/editor/src/browser/editor-menu.ts +++ b/packages/editor/src/browser/editor-menu.ts @@ -41,10 +41,24 @@ export namespace EditorMainMenu { export const GO = [...MAIN_MENU_BAR, '5_go']; /** - * Navigation menu group in the `Go` menu. + * Navigation menu group in the `Go` main-menu. */ export const NAVIGATION_GROUP = [...GO, '1_navigation_group']; + /** + * Workspace menu group in the `Go` main-menu. + */ + export const WORKSPACE_GROUP = [...GO, '2_workspace_group']; + + /** + * Language features menu group in the `Go` main-menu. + */ + export const LANGUAGE_FEATURES_GROUP = [...GO, '3_language_features_group']; + + /** + * Location menu group in the `Go` main-menu. + */ + export const LOCATION_GROUP = [...GO, '4_locations']; } @injectable() @@ -75,15 +89,23 @@ export class EditorMenuContribution implements MenuContribution { registry.registerSubmenu(EditorMainMenu.GO, 'Go'); registry.registerMenuAction(EditorMainMenu.NAVIGATION_GROUP, { commandId: EditorCommands.GO_BACK.id, - label: 'Back' + label: 'Back', + order: '1' }); registry.registerMenuAction(EditorMainMenu.NAVIGATION_GROUP, { commandId: EditorCommands.GO_FORWARD.id, - label: 'Forward' + label: 'Forward', + order: '2' }); registry.registerMenuAction(EditorMainMenu.NAVIGATION_GROUP, { commandId: EditorCommands.GO_LAST_EDIT.id, - label: 'Last Edit Location' + label: 'Last Edit Location', + order: '3' + }); + + registry.registerMenuAction(EditorMainMenu.LOCATION_GROUP, { + commandId: EditorCommands.GOTO_LINE_COLUMN.id, + order: '1' }); // Toggle Commands. diff --git a/packages/file-search/src/browser/file-search-frontend-module.ts b/packages/file-search/src/browser/file-search-frontend-module.ts index 9cf6ba3dbe063..b09807bf5d583 100644 --- a/packages/file-search/src/browser/file-search-frontend-module.ts +++ b/packages/file-search/src/browser/file-search-frontend-module.ts @@ -15,7 +15,7 @@ ********************************************************************************/ import { ContainerModule, interfaces } from '@theia/core/shared/inversify'; -import { CommandContribution } from '@theia/core/lib/common'; +import { CommandContribution, MenuContribution } from '@theia/core/lib/common'; import { WebSocketConnectionProvider, KeybindingContribution } from '@theia/core/lib/browser'; import { QuickFileOpenFrontendContribution } from './quick-file-open-contribution'; import { QuickFileOpenService } from './quick-file-open'; @@ -29,7 +29,7 @@ export default new ContainerModule((bind: interfaces.Bind) => { }).inSingletonScope(); bind(QuickFileOpenFrontendContribution).toSelf().inSingletonScope(); - [CommandContribution, KeybindingContribution, QuickAccessContribution].forEach(serviceIdentifier => + [CommandContribution, KeybindingContribution, MenuContribution, QuickAccessContribution].forEach(serviceIdentifier => bind(serviceIdentifier).toService(QuickFileOpenFrontendContribution) ); diff --git a/packages/file-search/src/browser/quick-file-open-contribution.ts b/packages/file-search/src/browser/quick-file-open-contribution.ts index 40091a2b87a20..ceae55ce30643 100644 --- a/packages/file-search/src/browser/quick-file-open-contribution.ts +++ b/packages/file-search/src/browser/quick-file-open-contribution.ts @@ -17,11 +17,12 @@ import { injectable, inject } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; import { QuickFileOpenService, quickFileOpen } from './quick-file-open'; -import { CommandRegistry, CommandContribution } from '@theia/core/lib/common'; +import { CommandRegistry, CommandContribution, MenuContribution, MenuModelRegistry } from '@theia/core/lib/common'; import { KeybindingRegistry, KeybindingContribution, QuickAccessContribution } from '@theia/core/lib/browser'; +import { EditorMainMenu } from '@theia/editor/lib/browser'; @injectable() -export class QuickFileOpenFrontendContribution implements QuickAccessContribution, CommandContribution, KeybindingContribution { +export class QuickFileOpenFrontendContribution implements QuickAccessContribution, CommandContribution, KeybindingContribution, MenuContribution { @inject(QuickFileOpenService) protected readonly quickFileOpenService: QuickFileOpenService; @@ -50,6 +51,14 @@ export class QuickFileOpenFrontendContribution implements QuickAccessContributio }); } + registerMenus(menus: MenuModelRegistry): void { + menus.registerMenuAction(EditorMainMenu.WORKSPACE_GROUP, { + commandId: quickFileOpen.id, + label: 'Go to File...', + order: '1', + }); + } + registerQuickAccessProvider(): void { this.quickFileOpenService.registerQuickAccessProvider(); } diff --git a/packages/monaco/src/browser/monaco-frontend-module.ts b/packages/monaco/src/browser/monaco-frontend-module.ts index 22fbd9b72d5f9..ff63bb8d657f3 100644 --- a/packages/monaco/src/browser/monaco-frontend-module.ts +++ b/packages/monaco/src/browser/monaco-frontend-module.ts @@ -86,7 +86,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(MonacoLanguages).toSelf().inSingletonScope(); rebind(LanguageService).toService(MonacoLanguages); bind(WorkspaceSymbolCommand).toSelf().inSingletonScope(); - for (const identifier of [CommandContribution, KeybindingContribution, QuickAccessContribution]) { + for (const identifier of [CommandContribution, KeybindingContribution, MenuContribution, QuickAccessContribution]) { bind(identifier).toService(WorkspaceSymbolCommand); } diff --git a/packages/monaco/src/browser/monaco-menu.ts b/packages/monaco/src/browser/monaco-menu.ts index e0c02baaf4f44..fc04b25050427 100644 --- a/packages/monaco/src/browser/monaco-menu.ts +++ b/packages/monaco/src/browser/monaco-menu.ts @@ -16,7 +16,7 @@ import { injectable, inject } from '@theia/core/shared/inversify'; import { MenuContribution, MenuModelRegistry, MAIN_MENU_BAR, MenuPath } from '@theia/core/lib/common'; -import { EDITOR_CONTEXT_MENU } from '@theia/editor/lib/browser'; +import { EditorMainMenu, EDITOR_CONTEXT_MENU } from '@theia/editor/lib/browser'; import { MonacoCommandRegistry } from './monaco-command-registry'; import MenuRegistry = monaco.actions.MenuRegistry; @@ -27,6 +27,7 @@ export interface MonacoActionGroup { export namespace MonacoMenus { export const SELECTION = [...MAIN_MENU_BAR, '3_selection']; export const PEEK_CONTEXT_SUBMENU: MenuPath = [...EDITOR_CONTEXT_MENU, 'navigation', 'peek_submenu']; + export const MARKERS_GROUP = [...EditorMainMenu.GO, '5_markers_group']; } @injectable() @@ -64,6 +65,50 @@ export class MonacoEditorMenuContribution implements MenuContribution { registry.registerMenuAction(menuPath, { commandId, order, label }); } } + + // Builtin monaco language-features commands. + registry.registerMenuAction(EditorMainMenu.LANGUAGE_FEATURES_GROUP, { + commandId: 'editor.action.quickOutline', + label: 'Go to Symbol in Editor...', + order: '1' + }); + registry.registerMenuAction(EditorMainMenu.LANGUAGE_FEATURES_GROUP, { + commandId: 'editor.action.revealDefinition', + order: '2' + }); + registry.registerMenuAction(EditorMainMenu.LANGUAGE_FEATURES_GROUP, { + commandId: 'editor.action.revealDeclaration', + order: '3' + }); + registry.registerMenuAction(EditorMainMenu.LANGUAGE_FEATURES_GROUP, { + commandId: 'editor.action.goToTypeDefinition', + order: '4' + }); + registry.registerMenuAction(EditorMainMenu.LANGUAGE_FEATURES_GROUP, { + commandId: 'editor.action.goToImplementation', + order: '5' + }); + registry.registerMenuAction(EditorMainMenu.LANGUAGE_FEATURES_GROUP, { + commandId: 'editor.action.goToReferences', + order: '6' + }); + + registry.registerMenuAction(EditorMainMenu.LOCATION_GROUP, { + commandId: 'editor.action.jumpToBracket', + order: '2' + }); + + // Builtin monaco problem commands. + registry.registerMenuAction(MonacoMenus.MARKERS_GROUP, { + commandId: 'editor.action.marker.nextInFiles', + label: 'Next Problem', + order: '1' + }); + registry.registerMenuAction(MonacoMenus.MARKERS_GROUP, { + commandId: 'editor.action.marker.prevInFiles', + label: 'Previous Problem', + order: '2' + }); } protected registerPeekSubmenu(registry: MenuModelRegistry): void { diff --git a/packages/monaco/src/browser/workspace-symbol-command.ts b/packages/monaco/src/browser/workspace-symbol-command.ts index 3ade3079ac0a8..80f6c5b6a1175 100644 --- a/packages/monaco/src/browser/workspace-symbol-command.ts +++ b/packages/monaco/src/browser/workspace-symbol-command.ts @@ -19,14 +19,15 @@ import { environment } from '@theia/core/shared/@theia/application-package/lib/e import { KeybindingContribution, KeybindingRegistry, OpenerService, LabelProvider } from '@theia/core/lib/browser'; import { QuickAccessContribution, QuickAccessProvider, QuickInputService, QuickAccessRegistry, QuickPicks, QuickPickItem, findMatches } from '@theia/core/lib/browser/quick-input'; -import { CommandRegistry, CommandHandler, Command, SelectionService, CancellationToken, CommandContribution } from '@theia/core/lib/common'; +import { CommandRegistry, CommandHandler, Command, SelectionService, CancellationToken, CommandContribution, MenuContribution, MenuModelRegistry } from '@theia/core/lib/common'; import { Range, Position, SymbolInformation } from '@theia/core/shared/vscode-languageserver-types'; import { WorkspaceSymbolParams } from '@theia/core/shared/vscode-languageserver-protocol'; import { MonacoLanguages, WorkspaceSymbolProvider } from './monaco-languages'; import URI from '@theia/core/lib/common/uri'; +import { EditorMainMenu } from '@theia/editor/lib/browser'; @injectable() -export class WorkspaceSymbolCommand implements QuickAccessProvider, CommandContribution, KeybindingContribution, CommandHandler, QuickAccessContribution { +export class WorkspaceSymbolCommand implements QuickAccessProvider, CommandContribution, KeybindingContribution, MenuContribution, CommandHandler, QuickAccessContribution { public static readonly PREFIX = '#'; private command: Command = { @@ -53,6 +54,13 @@ export class WorkspaceSymbolCommand implements QuickAccessProvider, CommandContr commands.registerCommand(this.command, this); } + registerMenus(menus: MenuModelRegistry): void { + menus.registerMenuAction(EditorMainMenu.WORKSPACE_GROUP, { + commandId: this.command.id, + order: '2' + }); + } + private isElectron(): boolean { return environment.electron.is(); } diff --git a/packages/plugin-ext-vscode/src/browser/plugin-vscode-commands-contribution.ts b/packages/plugin-ext-vscode/src/browser/plugin-vscode-commands-contribution.ts index 31c64497c5d5b..d53185864b793 100755 --- a/packages/plugin-ext-vscode/src/browser/plugin-vscode-commands-contribution.ts +++ b/packages/plugin-ext-vscode/src/browser/plugin-vscode-commands-contribution.ts @@ -289,7 +289,7 @@ export class PluginVscodeCommandsContribution implements CommandContribution { execute: () => commands.executeCommand(WorkspaceCommands.ADD_FOLDER.id) }); commands.registerCommand({ id: 'workbench.action.gotoLine' }, { - execute: () => commands.executeCommand('editor.action.gotoLine') + execute: () => commands.executeCommand(EditorCommands.GOTO_LINE_COLUMN.id) }); commands.registerCommand({ id: 'workbench.action.quickOpen' }, { execute: (prefix?: unknown) => this.quickInput.open(typeof prefix === 'string' ? prefix : '')