diff --git a/packages/core/src/common/menu/composite-menu-node.ts b/packages/core/src/common/menu/composite-menu-node.ts index 5677b7178aa0e..d5c0886b1b362 100644 --- a/packages/core/src/common/menu/composite-menu-node.ts +++ b/packages/core/src/common/menu/composite-menu-node.ts @@ -75,12 +75,9 @@ export class CompositeMenuNode implements MenuNode, CompoundMenuNode, CompoundMe * @param id node id. */ public removeNode(id: string): void { - const node = this._children.find(n => n.id === id); - if (node) { - const idx = this._children.indexOf(node); - if (idx >= 0) { - this._children.splice(idx, 1); - } + const idx = this._children.findIndex(n => n.id === id); + if (idx >= 0) { + this._children.splice(idx, 1); } } diff --git a/packages/plugin-ext/src/main/browser/menus/menus-contribution-handler.ts b/packages/plugin-ext/src/main/browser/menus/menus-contribution-handler.ts index e57e647a3abea..fca9a17f718dd 100644 --- a/packages/plugin-ext/src/main/browser/menus/menus-contribution-handler.ts +++ b/packages/plugin-ext/src/main/browser/menus/menus-contribution-handler.ts @@ -17,7 +17,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { inject, injectable, optional } from '@theia/core/shared/inversify'; -import { MenuPath, CommandRegistry, Disposable, DisposableCollection, ActionMenuNode, MenuCommandAdapterRegistry, Emitter, CompoundMenuNodeRole } from '@theia/core'; +import { MenuPath, CommandRegistry, Disposable, DisposableCollection, ActionMenuNode, MenuCommandAdapterRegistry, Emitter } from '@theia/core'; import { MenuModelRegistry } from '@theia/core/lib/common'; import { TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; import { DeployedPlugin, IconUrl, Menu } from '../../../common'; @@ -25,7 +25,7 @@ import { ScmWidget } from '@theia/scm/lib/browser/scm-widget'; import { PluginViewWidget } from '../view/plugin-view-widget'; import { QuickCommandService } from '@theia/core/lib/browser'; import { - CodeEditorWidgetUtil, codeToTheiaMappings, ContributionPoint, implementedVSCodeContributionPoints, + CodeEditorWidgetUtil, codeToTheiaMappings, ContributionPoint, PLUGIN_EDITOR_TITLE_MENU, PLUGIN_SCM_TITLE_MENU, PLUGIN_VIEW_TITLE_MENU } from './vscode-theia-menu-mappings'; import { PluginMenuCommandAdapter, ReferenceCountingSet } from './plugin-menu-command-adapter'; @@ -55,10 +55,6 @@ export class MenusContributionPointHandler { private initialize(): void { this.initialized = true; this.commandAdapterRegistry.registerAdapter(this.commandAdapter); - for (const contributionPoint of implementedVSCodeContributionPoints) { - this.menuRegistry.registerIndependentSubmenu(contributionPoint, ''); - this.getMatchingMenu(contributionPoint)!.forEach(([menu, when]) => this.menuRegistry.linkSubmenu(menu, contributionPoint, { role: CompoundMenuNodeRole.Flat, when })); - } this.tabBarToolbar.registerMenuDelegate(PLUGIN_EDITOR_TITLE_MENU, widget => this.codeEditorWidgetUtil.is(widget)); this.tabBarToolbar.registerMenuDelegate(PLUGIN_SCM_TITLE_MENU, widget => widget instanceof ScmWidget); this.tabBarToolbar.registerMenuDelegate(PLUGIN_VIEW_TITLE_MENU, widget => widget instanceof PluginViewWidget); @@ -70,7 +66,7 @@ export class MenusContributionPointHandler { }); } - private getMatchingMenu(contributionPoint: ContributionPoint): Array<[MenuPath] | [MenuPath, string]> | undefined { + private getMatchingMenu(contributionPoint: ContributionPoint): MenuPath[] | undefined { return codeToTheiaMappings.get(contributionPoint); } @@ -96,20 +92,22 @@ export class MenusContributionPointHandler { toDispose.push(this.registerCommandPaletteAction(item)); } else { this.checkTitleContribution(contributionPoint, item, toDispose); - if (item.submenu) { - const targets = this.getMatchingMenu(contributionPoint as ContributionPoint) ?? [contributionPoint]; - const { group, order } = this.parseGroup(item.group); - targets.forEach(([target]) => toDispose.push(this.menuRegistry.linkSubmenu(target, item.submenu!, { order, when: item.when }, group))); - } else if (item.command) { - toDispose.push(this.commandAdapter.addCommand(item.command)); - const { group, order } = this.parseGroup(item.group); - const node = new ActionMenuNode({ - commandId: item.command, - when: item.when, - order, - }, this.commands); - const parent = this.menuRegistry.getMenuNode(contributionPoint, group); - toDispose.push(parent.addNode(node)); + const targets = this.getMatchingMenu(contributionPoint as ContributionPoint) ?? [contributionPoint]; + const { group, order } = this.parseGroup(item.group); + const { submenu, command } = item; + if (submenu) { + targets.forEach(target => toDispose.push(this.menuRegistry.linkSubmenu(target, submenu!, { order, when: item.when }, group))); + } else if (command) { + toDispose.push(this.commandAdapter.addCommand(command)); + targets.forEach(target => { + const node = new ActionMenuNode({ + commandId: command, + when: item.when, + order, + }, this.commands); + const parent = this.menuRegistry.getMenuNode(target, group); + toDispose.push(parent.addNode(node)); + }); } } } catch (error) { diff --git a/packages/plugin-ext/src/main/browser/menus/plugin-menu-command-adapter.ts b/packages/plugin-ext/src/main/browser/menus/plugin-menu-command-adapter.ts index ef896cf093352..79f8d8700aa40 100644 --- a/packages/plugin-ext/src/main/browser/menus/plugin-menu-command-adapter.ts +++ b/packages/plugin-ext/src/main/browser/menus/plugin-menu-command-adapter.ts @@ -105,7 +105,7 @@ export class PluginMenuCommandAdapter implements MenuCommandAdapter { if (adapter) { const paths = codeToTheiaMappings.get(contributionPoint); if (paths) { - paths.forEach(([path]) => this.addArgumentAdapter(path, adapter)); + paths.forEach(path => this.addArgumentAdapter(path, adapter)); } } }); diff --git a/packages/plugin-ext/src/main/browser/menus/vscode-theia-menu-mappings.ts b/packages/plugin-ext/src/main/browser/menus/vscode-theia-menu-mappings.ts index e1c4aa4426342..4b7c47f157871 100644 --- a/packages/plugin-ext/src/main/browser/menus/vscode-theia-menu-mappings.ts +++ b/packages/plugin-ext/src/main/browser/menus/vscode-theia-menu-mappings.ts @@ -53,23 +53,23 @@ export const implementedVSCodeContributionPoints = [ export type ContributionPoint = (typeof implementedVSCodeContributionPoints)[number]; -/** The values are combinations of MenuPath and `when` clause, if any */ -export const codeToTheiaMappings = new Map>([ - ['comments/comment/context', [[COMMENT_CONTEXT]]], - ['comments/comment/title', [[COMMENT_TITLE]]], - ['comments/commentThread/context', [[COMMENT_THREAD_CONTEXT]]], - ['debug/callstack/context', [[DebugStackFramesWidget.CONTEXT_MENU], [DebugThreadsWidget.CONTEXT_MENU]]], - ['editor/context', [[EDITOR_CONTEXT_MENU]]], - ['editor/title', [[PLUGIN_EDITOR_TITLE_MENU]]], - ['editor/title/context', [[SHELL_TABBAR_CONTEXT_MENU, 'resourceSet']]], - ['explorer/context', [[NAVIGATOR_CONTEXT_MENU]]], - ['scm/resourceFolder/context', [[ScmTreeWidget.RESOURCE_FOLDER_CONTEXT_MENU]]], - ['scm/resourceGroup/context', [[ScmTreeWidget.RESOURCE_GROUP_CONTEXT_MENU]]], - ['scm/resourceState/context', [[ScmTreeWidget.RESOURCE_CONTEXT_MENU]]], - ['scm/title', [[PLUGIN_SCM_TITLE_MENU]]], - ['timeline/item/context', [[TIMELINE_ITEM_CONTEXT_MENU]]], - ['view/item/context', [[VIEW_ITEM_CONTEXT_MENU]]], - ['view/title', [[PLUGIN_VIEW_TITLE_MENU]]], +/** The values are menu paths to which the VSCode contribution points correspond */ +export const codeToTheiaMappings = new Map([ + ['comments/comment/context', [COMMENT_CONTEXT]], + ['comments/comment/title', [COMMENT_TITLE]], + ['comments/commentThread/context', [COMMENT_THREAD_CONTEXT]], + ['debug/callstack/context', [DebugStackFramesWidget.CONTEXT_MENU, DebugThreadsWidget.CONTEXT_MENU]], + ['editor/context', [EDITOR_CONTEXT_MENU]], + ['editor/title', [PLUGIN_EDITOR_TITLE_MENU]], + ['editor/title/context', [SHELL_TABBAR_CONTEXT_MENU]], + ['explorer/context', [NAVIGATOR_CONTEXT_MENU]], + ['scm/resourceFolder/context', [ScmTreeWidget.RESOURCE_FOLDER_CONTEXT_MENU]], + ['scm/resourceGroup/context', [ScmTreeWidget.RESOURCE_GROUP_CONTEXT_MENU]], + ['scm/resourceState/context', [ScmTreeWidget.RESOURCE_CONTEXT_MENU]], + ['scm/title', [PLUGIN_SCM_TITLE_MENU]], + ['timeline/item/context', [TIMELINE_ITEM_CONTEXT_MENU]], + ['view/item/context', [VIEW_ITEM_CONTEXT_MENU]], + ['view/title', [PLUGIN_VIEW_TITLE_MENU]], ]); type CodeEditorWidget = EditorWidget | WebviewWidget; diff --git a/packages/plugin-ext/src/main/browser/view/tree-view-widget.tsx b/packages/plugin-ext/src/main/browser/view/tree-view-widget.tsx index e93bd87bf2f5a..c4e3233a39251 100644 --- a/packages/plugin-ext/src/main/browser/view/tree-view-widget.tsx +++ b/packages/plugin-ext/src/main/browser/view/tree-view-widget.tsx @@ -52,7 +52,7 @@ import { WidgetDecoration } from '@theia/core/lib/browser/widget-decoration'; export const TREE_NODE_HYPERLINK = 'theia-TreeNodeHyperlink'; export const VIEW_ITEM_CONTEXT_MENU: MenuPath = ['view-item-context-menu']; -export const VIEW_ITEM_INLINE_MENU: MenuPath = ['view-item-inline-menu']; +export const VIEW_ITEM_INLINE_MENU: MenuPath = ['view-item-context-menu', 'inline']; export interface SelectionEventHandler { readonly node: SelectableTreeNode; @@ -288,6 +288,7 @@ export class TreeViewWidget extends TreeViewWelcomeWidget { this.model.onDidChangeWelcomeState(this.update, this); this.toDispose.push(this.model.onDidChangeWelcomeState(this.update, this)); this.toDispose.push(this.onDidChangeVisibilityEmitter); + this.toDispose.push(this.contextKeyService.onDidChange(() => this.update())); } protected markdownItPlugin(): void {