diff --git a/src/vs/editor/contrib/clipboard/clipboard.ts b/src/vs/editor/contrib/clipboard/clipboard.ts index 20dd744ca2f..4b26bc013c8 100644 --- a/src/vs/editor/contrib/clipboard/clipboard.ts +++ b/src/vs/editor/contrib/clipboard/clipboard.ts @@ -12,7 +12,7 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, registerEditorAction, Command, MultiCommand } from 'vs/editor/browser/editorExtensions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { MenuId } from 'vs/platform/actions/common/actions'; +import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; @@ -94,6 +94,9 @@ export const CopyAction = supportsCopy ? registerCommand(new MultiCommand({ }] })) : undefined; +MenuRegistry.appendMenuItem(MenuId.MenubarEditMenu, { submenu: MenuId.MenubarCopy, title: { value: nls.localize('copy as', "Copy As..."), original: 'Copy As...', }, group: '2_ccp', order: 3 }); +MenuRegistry.appendMenuItem(MenuId.EditorContext, { submenu: MenuId.EditorContextCopy, title: { value: nls.localize('copy as', "Copy As..."), original: 'Copy As...', }, group: CLIPBOARD_CONTEXT_MENU_GROUP, order: 3 }); + export const PasteAction = supportsPaste ? registerCommand(new MultiCommand({ id: 'editor.action.clipboardPasteAction', precondition: undefined, @@ -111,13 +114,13 @@ export const PasteAction = supportsPaste ? registerCommand(new MultiCommand({ menuId: MenuId.MenubarEditMenu, group: '2_ccp', title: nls.localize({ key: 'miPaste', comment: ['&& denotes a mnemonic'] }, "&&Paste"), - order: 3 + order: 4 }, { menuId: MenuId.EditorContext, group: CLIPBOARD_CONTEXT_MENU_GROUP, title: nls.localize('actions.clipboard.pasteLabel', "Paste"), when: EditorContextKeys.writable, - order: 3, + order: 4, }, { menuId: MenuId.CommandPalette, group: '', diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index e2d0e3a2cb2..51fa6146e9c 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -87,6 +87,7 @@ export class MenuId { static readonly DebugWatchContext = new MenuId('DebugWatchContext'); static readonly DebugToolBar = new MenuId('DebugToolBar'); static readonly EditorContext = new MenuId('EditorContext'); + static readonly EditorContextCopy = new MenuId('EditorContextCopy'); static readonly EditorContextPeek = new MenuId('EditorContextPeek'); static readonly EditorTitle = new MenuId('EditorTitle'); static readonly EditorTitleRun = new MenuId('EditorTitleRun'); @@ -98,6 +99,7 @@ export class MenuId { static readonly MenubarAppearanceMenu = new MenuId('MenubarAppearanceMenu'); static readonly MenubarDebugMenu = new MenuId('MenubarDebugMenu'); static readonly MenubarEditMenu = new MenuId('MenubarEditMenu'); + static readonly MenubarCopy = new MenuId('MenubarCopy'); static readonly MenubarFileMenu = new MenuId('MenubarFileMenu'); static readonly MenubarGoMenu = new MenuId('MenubarGoMenu'); static readonly MenubarHelpMenu = new MenuId('MenubarHelpMenu'); diff --git a/src/vs/workbench/api/common/menusExtensionPoint.ts b/src/vs/workbench/api/common/menusExtensionPoint.ts index 1303242e0ad..c1e8000031b 100644 --- a/src/vs/workbench/api/common/menusExtensionPoint.ts +++ b/src/vs/workbench/api/common/menusExtensionPoint.ts @@ -53,6 +53,11 @@ const apiMenus: IAPIMenu[] = [ id: MenuId.EditorContext, description: localize('menus.editorContext', "The editor context menu") }, + { + key: 'editor/context/copy', + id: MenuId.EditorContextCopy, + description: localize('menus.editorContextCopyAs', "'Copy as' submenu in the editor context menu") + }, { key: 'explorer/context', id: MenuId.ExplorerContext, @@ -91,6 +96,11 @@ const apiMenus: IAPIMenu[] = [ proposed: true, supportsSubmenus: false }, + { + key: 'menuBar/edit/copy', + id: MenuId.MenubarCopy, + description: localize('menus.opy', "'Copy as' submenu in the top level Edit menu") + }, { key: 'scm/title', id: MenuId.SCMTitle, diff --git a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts index 8bb30219d53..bc20eca2daf 100644 --- a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts @@ -594,6 +594,7 @@ export class CustomMenubarControl extends MenubarControl { const updateActions = (menu: IMenu, target: IAction[], topLevelTitle: string) => { target.splice(0); let groups = menu.getActions(); + for (let group of groups) { const [, actions] = group; @@ -622,7 +623,10 @@ export class CustomMenubarControl extends MenubarControl { const submenuActions: SubmenuAction[] = []; updateActions(submenu, submenuActions, topLevelTitle); - target.push(new SubmenuAction(action.id, mnemonicMenuLabel(title), submenuActions)); + + if (submenuActions.length > 0) { + target.push(new SubmenuAction(action.id, mnemonicMenuLabel(title), submenuActions)); + } } else { const newAction = new Action(action.id, mnemonicMenuLabel(title), action.class, action.enabled, () => this.commandService.executeCommand(action.id)); newAction.tooltip = action.tooltip; diff --git a/src/vs/workbench/electron-sandbox/parts/titlebar/menubarControl.ts b/src/vs/workbench/electron-sandbox/parts/titlebar/menubarControl.ts index d7989c75cbb..406fefe55e5 100644 --- a/src/vs/workbench/electron-sandbox/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/electron-sandbox/parts/titlebar/menubarControl.ts @@ -106,6 +106,7 @@ export class NativeMenubarControl extends MenubarControl { private populateMenuItems(menu: IMenu, menuToPopulate: IMenubarMenu, keybindings: { [id: string]: IMenubarKeybinding | undefined }) { let groups = menu.getActions(); + for (let group of groups) { const [, actions] = group; @@ -127,13 +128,16 @@ export class NativeMenubarControl extends MenubarControl { const menuToDispose = this.menuService.createMenu(menuItem.item.submenu, this.contextKeyService); this.populateMenuItems(menuToDispose, submenu, keybindings); - let menubarSubmenuItem: IMenubarMenuItemSubmenu = { - id: menuItem.id, - label: title, - submenu: submenu - }; + if (submenu.items.length > 0) { + let menubarSubmenuItem: IMenubarMenuItemSubmenu = { + id: menuItem.id, + label: title, + submenu: submenu + }; + + menuToPopulate.items.push(menubarSubmenuItem); + } - menuToPopulate.items.push(menubarSubmenuItem); menuToDispose.dispose(); } else { if (menuItem.id === 'workbench.action.openRecent') {