MenuBar.prototype.updateOpenDocuments = function (documents, currentDocument, appIsModal) { var windowMenu = this.getMenuItem("WINDOW"), newActions = this.actions, newEnablers = this.enablers, shortcutModifiers = system.isMac ? _switchDocModifiersMac : _switchDocModifiersWin, shortcutModifierBits = keyutil.modifiersToBits(shortcutModifiers); var openDocumentItems = _.values(documents).map(function (document, index) { var name = document.name, label = name.length < 60 ? name : name.substr(0, 30) + "\u2026" + name.substr(-29), id = "WINDOW.OPEN_DOCUMENT." + index, itemDescriptor = { "id": id, "itemID": index.toString(), "label": label, "command": id, "enabled": !appIsModal, "checked": currentDocument && document.id === currentDocument.id, "shortcut": (index < 9) ? new MenuShortcut({ "keyChar": (index + 1).toString(), "modifiers": shortcutModifierBits }) : null }; newEnablers = newEnablers.set(id, Immutable.List.of("always")); newActions = newActions.set(id, Immutable.Map({ "$action": "documents.selectDocument", "$payload": document.id, "$dontLog": true })); return new MenuItem(itemDescriptor); }); var newWindowMenu = windowMenu.update(function (menu) { var submenu = menu.submenu, submenuStart = submenu.takeUntil(function (item) { return (_.startsWith(item.id, "WINDOW.OPEN_DOCUMENT.")); }), newsubmenu = submenuStart.concat(openDocumentItems); // Since these are dynamic items in WINDOW menu, we don't update the mapping return menu.merge({ submenu: newsubmenu }); }), // Update roots to point to new File menu windowMenuIndex = this.roots.findIndex(function (root) { return root.id === "WINDOW"; }), newRoots = this.roots.set(windowMenuIndex, newWindowMenu); return this.merge({ roots: newRoots, actions: newActions, enablers: newEnablers }); };
return this._shortcuts.reduce(function (handlers, shortcut) { if ((shortcut.key !== keyCode && shortcut.key !== keyChar) || shortcut.capture !== capture) { return handlers; } var shortcutModifierBits = keyUtil.modifiersToBits(shortcut.modifiers); if (event.modifierBits !== shortcutModifierBits) { return handlers; } handlers.push(shortcut.fn); return handlers; }, []);
MenuItem.fromDescriptor = function (rawMenu, prefix, shortcutTable) { if (shortcutTable === undefined) { shortcutTable = {}; } var processedMenu = {}; if (rawMenu.separator) { processedMenu.type = "separator"; return new MenuItem(processedMenu); } if (!rawMenu.hasOwnProperty("id")) { throw new Error("Missing menu id"); } processedMenu.id = rawMenu.id; var id; if (prefix === undefined) { id = rawMenu.id; } else { id = prefix + "." + rawMenu.id; } processedMenu.id = id; processedMenu.itemID = rawMenu.id; if (rawMenu.hasOwnProperty("enabled")) { processedMenu.enabled = rawMenu.enabled; } if (rawMenu.hasOwnProperty("submenu")) { processedMenu.label = _getLabelForSubmenu(id); var rawSubMenu = rawMenu.submenu; // Filter out debug-only menu entries in non-debug mode if (!__PG_DEBUG__) { rawSubMenu = rawSubMenu.filter(function (subMenu) { return !subMenu.debug; }); } rawSubMenu = rawSubMenu.map(function (rawSubMenu) { return MenuItem.fromDescriptor(rawSubMenu, id, shortcutTable); }, this); processedMenu.submenu = Immutable.List(rawSubMenu); } else { processedMenu.label = _getLabelForEntry(id); processedMenu.command = id; } if (rawMenu.hasOwnProperty("commandKind")) { processedMenu.commandKind = UI.commandKind[rawMenu.commandKind]; } if (rawMenu.hasOwnProperty("shortcut")) { var rawKeyChar = rawMenu.shortcut.keyChar, rawKeyCode = rawMenu.shortcut.keyCode, rawModifiers = rawMenu.shortcut.modifiers || {}, rawModifierBits = keyutil.modifiersToBits(rawModifiers), rawShortcut = { modifiers: rawModifierBits }, shortcutTableKey; if (rawKeyChar && rawKeyCode) { throw new Error("Menu entry specifies both key char and code"); } if (rawKeyChar) { rawShortcut.keyChar = rawKeyChar; shortcutTableKey = "char-" + rawKeyChar; } else if (rawKeyCode) { if (!os.eventKeyCode.hasOwnProperty(rawKeyCode)) { throw new Error("Menu entry specifies unknown key code: " + rawKeyCode); } rawShortcut.keyCode = os.eventKeyCode[rawKeyCode]; shortcutTableKey = "code-" + rawKeyCode; } else { throw new Error("Menu entry does not specify a key for its shortcut"); } // Check for conflicting menu shortcuts if (!shortcutTable.hasOwnProperty(shortcutTableKey)) { shortcutTable[shortcutTableKey] = {}; } if (shortcutTable[shortcutTableKey][rawModifierBits]) { throw new Error("Menu entry shortcut duplicate: " + shortcutTableKey); } else { shortcutTable[shortcutTableKey][rawModifierBits] = true; } processedMenu.shortcut = new MenuShortcut(rawShortcut); } return new MenuItem(processedMenu); };