示例#1
0
    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
        });
    };
示例#2
0
            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;
            }, []);
示例#3
0
    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);
    };