From 8a692d0ce55108e28c0c42b80c1643c0b876625c Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 31 Mar 2021 08:55:13 +0200 Subject: [PATCH] ATL-1068: Escape ampersand in the menu label. Signed-off-by: Akos Kitta --- .../theia/core/electron-main-menu-factory.ts | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts b/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts index 5d4f2adf..9ca30ac3 100644 --- a/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts +++ b/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts @@ -1,7 +1,8 @@ import { injectable } from 'inversify' import { remote } from 'electron'; +import { isOSX } from '@theia/core/lib/common/os'; import { Keybinding } from '@theia/core/lib/common/keybinding'; -import { CompositeMenuNode } from '@theia/core/lib/common/menu'; +import { CompositeMenuNode, MAIN_MENU_BAR, MenuPath } from '@theia/core/lib/common/menu'; import { ElectronMainMenuFactory as TheiaElectronMainMenuFactory, ElectronMenuOptions } from '@theia/core/lib/electron-browser/menu/electron-main-menu-factory'; import { ArduinoMenus, PlaceholderMenuNode } from '../../../browser/menu/arduino-menus'; @@ -10,7 +11,33 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { createMenuBar(): Electron.Menu { this._toggledCommands.clear(); // https://github.com/eclipse-theia/theia/issues/8977 - return super.createMenuBar(); + const menuModel = this.menuProvider.getMenu(MAIN_MENU_BAR); + const template = this.fillMenuTemplate([], menuModel); + if (isOSX) { + template.unshift(this.createOSXMenu()); + } + const menu = remote.Menu.buildFromTemplate(this.escapeAmpersand(template)); + this._menu = menu; + return menu; + } + + createContextMenu(menuPath: MenuPath, args?: any[]): Electron.Menu { + const menuModel = this.menuProvider.getMenu(menuPath); + const template = this.fillMenuTemplate([], menuModel, args, { showDisabled: false }); + return remote.Menu.buildFromTemplate(this.escapeAmpersand(template)); + } + + // TODO: remove after https://github.com/eclipse-theia/theia/pull/9231 + private escapeAmpersand(template: Electron.MenuItemConstructorOptions[]): Electron.MenuItemConstructorOptions[] { + for (const option of template) { + if (option.label) { + option.label = option.label.replace(/\&+/g, '&$&'); + } + if (option.submenu) { + this.escapeAmpersand(option.submenu as Electron.MenuItemConstructorOptions[]); + } + } + return template; } protected acceleratorFor(keybinding: Keybinding): string {