15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cr.define('cr.ui', function() {
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /** @const */ var Command = cr.ui.Command;
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Creates a new menu item element.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {Object=} opt_propertyBag Optional properties.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @constructor
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @extends {HTMLDivElement}
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var MenuItem = cr.ui.define('div');
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Creates a new menu separator element.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {cr.ui.MenuItem} The new separator element.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MenuItem.createSeparator = function() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var el = cr.doc.createElement('hr');
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MenuItem.decorate(el);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return el;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MenuItem.prototype = {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __proto__: HTMLButtonElement.prototype,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Initializes the menu item.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decorate: function() {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var commandId;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((commandId = this.getAttribute('command')))
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.command = commandId;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.addEventListener('mouseup', this.handleMouseUp_);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Adding the 'custom-appearance' class prevents widgets.css from changing
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the appearance of this element.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.classList.add('custom-appearance');
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      // Enable Text to Speech on the menu. Additionaly, ID has to be set, since
44bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      // it is used in element's aria-activedescendant attribute.
45bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      if (!this.isSeparator())
46bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        this.setAttribute('role', 'menuitem');
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var iconUrl;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((iconUrl = this.getAttribute('icon')))
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.iconUrl = iconUrl;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The command associated with this menu item. If this is set to a string
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * of the form "#element-id" then the element is looked up in the document
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * of the command.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {cr.ui.Command}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_: null,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get command() {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return this.command_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set command(command) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.command_) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.command_.removeEventListener('labelChange', this);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.command_.removeEventListener('disabledChange', this);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.command_.removeEventListener('hiddenChange', this);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.command_.removeEventListener('checkedChange', this);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (typeof command == 'string' && command[0] == '#') {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        command = this.ownerDocument.getElementById(command.slice(1));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cr.ui.decorate(command, Command);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.command_ = command;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (command) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (command.id)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.setAttribute('command', '#' + command.id);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        if (typeof command.label === 'string')
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          this.label = command.label;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.disabled = command.disabled;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.hidden = command.hidden;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.command_.addEventListener('labelChange', this);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.command_.addEventListener('disabledChange', this);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.command_.addEventListener('hiddenChange', this);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.command_.addEventListener('checkedChange', this);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.updateShortcut_();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The text label.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {string}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get label() {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return this.textContent;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set label(label) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.textContent = label;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Menu icon.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {string}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get iconUrl() {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return this.style.backgroundImage;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set iconUrl(url) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.style.backgroundImage = 'url(' + url + ')';
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return {boolean} Whether the menu item is a separator.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    isSeparator: function() {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return this.tagName == 'HR';
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Updates shortcut text according to associated command. If command has
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * multiple shortcuts, only first one is displayed.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    updateShortcut_: function() {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.removeAttribute('shortcutText');
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!(this.command_ && this.command_.shortcut))
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var shortcuts = this.command_.shortcut.split(/\s+/);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (shortcuts.length == 0)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var shortcut = shortcuts[0];
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var mods = {};
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var ident = '';
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shortcut.split('-').forEach(function(part) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var partUc = part.toUpperCase();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (partUc) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          case 'CTRL':
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          case 'ALT':
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          case 'SHIFT':
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          case 'META':
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mods[partUc] = true;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          default:
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            console.assert(!ident, 'Shortcut has two non-modifier keys');
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ident = part;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var shortcutText = '';
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(zvorygin): if more cornercases appear - optimize following
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // code. Currently 'Enter' keystroke is passed as 'Enter', and 'Space'
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // is passed as 'U+0020'
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ident == 'U+0020')
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ident = 'Space';
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ['CTRL', 'ALT', 'SHIFT', 'META'].forEach(function(mod) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (mods[mod])
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          shortcutText += loadTimeData.getString('SHORTCUT_' + mod) + '+';
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ident.indexOf('U+') != 0) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        shortcutText +=
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loadTimeData.getString('SHORTCUT_' + ident.toUpperCase());
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        shortcutText +=
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            String.fromCharCode(parseInt(ident.substring(2), 16));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.setAttribute('shortcutText', shortcutText);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Handles mouseup events. This dispatches an activate event; if there is an
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * associated command, that command is executed.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {Event} e The mouseup event object.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @private
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handleMouseUp_: function(e) {
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Only dispatch an activate event for left or middle click.
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (e.button > 1)
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return;
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!this.disabled && !this.isSeparator() && this.selected) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Store |contextElement| since it'll be removed by {Menu} on handling
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // 'activate' event.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var contextElement = this.parentNode.contextElement;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var activationEvent = cr.doc.createEvent('Event');
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        activationEvent.initEvent('activate', true, true);
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        activationEvent.originalEvent = e;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Dispatch command event followed by executing the command object.
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (this.dispatchEvent(activationEvent)) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var command = this.command;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (command) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            command.execute(contextElement);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cr.ui.swallowDoubleClick(e);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Updates command according to the node on which this menu was invoked.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {Node=} opt_node Node on which menu was opened.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    updateCommand: function(opt_node) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.command_) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.command_.canExecuteChange(opt_node);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Handles changes to the associated command.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {Event} e The event object.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handleEvent: function(e) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (e.type) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case 'disabledChange':
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.disabled = this.command.disabled;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case 'hiddenChange':
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.hidden = this.command.hidden;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case 'labelChange':
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.label = this.command.label;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case 'checkedChange':
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.checked = this.command.checked;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Whether the menu item is disabled or not.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @type {boolean}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cr.defineProperty(MenuItem, 'disabled', cr.PropertyKind.BOOL_ATTR);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Whether the menu item is hidden or not.
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @type {boolean}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cr.defineProperty(MenuItem, 'hidden', cr.PropertyKind.BOOL_ATTR);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Whether the menu item is selected or not.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @type {boolean}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cr.defineProperty(MenuItem, 'selected', cr.PropertyKind.BOOL_ATTR);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Whether the menu item is checked or not.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @type {boolean}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cr.defineProperty(MenuItem, 'checked', cr.PropertyKind.BOOL_ATTR);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Whether the menu item is checkable or not.
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @type {boolean}
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cr.defineProperty(MenuItem, 'checkable', cr.PropertyKind.BOOL_ATTR);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Export
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MenuItem: MenuItem
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
277