chromium/third_party/google-closure-library/closure/goog/demos/menubutton.html

<!DOCTYPE html>
<html>
<!--
Copyright The Closure Library Authors. All Rights Reserved.

Use of this source code is governed by the Apache License, Version 2.0.
See the COPYING file for details.
-->
<head>
  <title>goog.ui.MenuButton Demo</title>
  <script src="../base.js"></script>
  <script>
    goog.require('goog.array');
    goog.require('goog.debug.DivConsole');
    goog.require('goog.events');
    goog.require('goog.events.EventType');
    goog.require('goog.log');
    goog.require('goog.object');
    goog.require('goog.ui.CustomButton');
    goog.require('goog.ui.Menu');
    goog.require('goog.ui.MenuButton');
    goog.require('goog.ui.MenuItem');
    goog.require('goog.ui.Separator');
    goog.require('goog.ui.decorate');
  </script>
  <link rel="stylesheet" href="css/demo.css">
  <link rel="stylesheet" href="../css/custombutton.css">
  <link rel="stylesheet" href="../css/menu.css">
  <link rel="stylesheet" href="../css/menuitem.css">
  <link rel="stylesheet" href="../css/menuseparator.css">
  <link rel="stylesheet" href="../css/menubutton.css">
  <style>
    /* Base class for all icon elements. */
    .icon {
      height: 16px;
      width: 16px;
      margin: 0 1px;
      background-image: url(../images/toolbar_icons.gif);
      background-repeat: no-repeat;
      vertical-align: middle;
    }

    /* "Format" icon. */
    .format-icon {
      background-position: -64px;
    }

    .positioning-frame {
      height: 250px;
      overflow: auto;
      width: 100%;
    }
  </style>
</head>
<body>
  <h1>goog.ui.MenuButton</h1>
  <table border="0" cellpadding="0" cellspacing="4" width="100%">
    <tbody>
      <tr valign="top">
        <td width="67%">
          <fieldset>
            <legend>
              These <strong>MenuButton</strong>s were created programmatically:
              &nbsp;
            </legend>
            <table border="0" cellpadding="0" cellspacing="4">
              <tbody>
                <tr valign="middle">
                  <td>
                    <div id="menuButtons"></div>
                  </td>
                  <td>
                    Enable first button:
                    <input type="checkbox" id="b1_enable" checked>
                    &nbsp;
                    Show second button:
                    <input type="checkbox" id="b2_show" checked>
                    &nbsp;
                  </td>
                </tr>
              </tbody>
            </table>
            <label>
            </label>
            <br>
          </fieldset>
          <fieldset>
            <legend>
              This <strong>MenuButton</strong> decorates an element:&nbsp;
            </legend>
            <table border="0" cellpadding="0" cellspacing="4">
              <tbody>
                <tr valign="middle">
                  <td>
                    <div id="formatButton" class="goog-menu-button"
                        title="Format">
                      <!-- These elements will become the button's caption. -->
                      <div class="icon format-icon goog-inline-block"></div>
                      <span style="vertical-align:middle">Format</span>
                      <!-- This DIV will be auto-decorated with a menu. -->
                      <div id="formatMenu" class="goog-menu">
                        <div class="goog-menuitem">Bold</div>
                        <div class="goog-menuitem">Italic</div>
                        <div class="goog-menuitem">Underline</div>
                        <div class="goog-menuseparator"></div>
                        <div class="goog-menuitem goog-menuitem-disabled">
                          Strikethrough
                        </div>
                        <div class="goog-menuseparator"></div>
                        <div class="goog-menuitem">Font...</div>
                        <div class="goog-menuitem">Color...</div>
                      </div>
                    </div>
                  </td>
                  <td>
                    Enable button:
                    <input type="checkbox" id="formatButton_enable" checked>
                    &nbsp;
                    Show button:
                    <input type="checkbox" id="formatButton_show" checked>
                    &nbsp;
                  </td>
                </tr>
              </tbody>
            </table>
            <label>
            </label>
            <br>
          </fieldset>
          <fieldset>
            <legend>
              This <strong>MenuButton</strong> accompanies a
              <strong>CustomButton</strong> to form a combo button:
              &nbsp;
            </legend>
            <div id="comboButtons"></div>
            <label>
            </label>
            <br>
          </fieldset>
          <fieldset>
            <legend>
              These <strong>MenuButtons</strong> demonstrate
              menu positioning options:
              &nbsp;
            </legend>
            <div></div>

            <input type="checkbox" id="pos_option_scroll">
            <label for="pos_option_scroll">
              Scroll on overflow
            </label>
            <iframe class="positioning-frame" id="positioning-frame"
                src="menubutton_frame.html">
            </iframe>
            <label>
            </label>
            <br>
          </fieldset>
        </td>
        <td width="33%">
          <!-- Event log. -->
          <fieldset class="goog-debug-panel">
            <legend>Event Log</legend>
            <div id="log"></div>
          </fieldset>
        </td>
      </tr>
    </tbody>
  </table>
  <br>
  <div id="perf"></div>
  <script>
    var timer = goog.now();

    // Set up a logger.
    goog.log.setLevel(goog.log.getRootLogger(), goog.log.Level.ALL);
    var logger = goog.log.getLogger('demo');
    var logconsole = new goog.debug.DivConsole(goog.dom.getElement('log'));
    logconsole.setCapturing(true);

    var EVENTS = goog.object.getValues(goog.ui.Component.EventType);
    goog.log.fine(logger, 'Listening for: ' + EVENTS.join(', ') + '.');

    function logEvent(e) {
      var component = e.target;
      var caption = (typeof component.getCaption == 'function') ?
          component.getCaption() : component.getId();
      goog.log.info(logger, '"' + caption + '" dispatched: ' + e.type);
    }

    // Create a sample menu.
    var m1 = new goog.ui.Menu();
    m1.setId('FileMenu');
    goog.array.forEach(['New', 'Open', 'Save', 'Save as', null, 'Change label'],
        function(label) {
          var item;
          if (label) {
            item = new goog.ui.MenuItem(label + '...');
            item.setId(label);
            item.setDispatchTransitionEvents(goog.ui.Component.State.ALL, true);
            if (label == 'Save as') {
              item.setEnabled(false);
            }
          } else {
            item = new goog.ui.MenuSeparator();
          }
          m1.addItem(item);
        });

    // Create the first button programmatically.
    var b1 = new goog.ui.MenuButton('File', m1);
    b1.setDispatchTransitionEvents(goog.ui.Component.State.ALL, true);
    b1.setId('FileButton');
    b1.render(goog.dom.getElement('menuButtons'));
    b1.setTooltip('File menu demo');
    goog.events.listen(b1, EVENTS, logEvent);

    goog.events.listen(goog.dom.getElement('b1_enable'),
        goog.events.EventType.CLICK,
        function(e) {
          b1.setEnabled(e.target.checked);
        });

    goog.events.listen(b1, goog.ui.Component.EventType.ACTION,
        function(e) {
          if (e.target && e.target.getCaption() == 'Change label...') {
            var label = window.prompt('Enter new menu label:', b1.getCaption());
            b1.setCaption(label || 'Empty');
          }
        });

    // Create another sample menu.
    var m2 = new goog.ui.Menu();
    m2.setId('EditMenu');
    goog.array.forEach(['Cut', 'Copy', 'Paste', null, 'Paste special'],
        function(label) {
          var item;
          if (label) {
            item = new goog.ui.MenuItem(label + '...');
            item.setId(label);
            item.setDispatchTransitionEvents(goog.ui.Component.State.ALL, true);
          } else {
            item = new goog.ui.MenuSeparator();
          }
          m2.addItem(item);
        });

    // Create the second button programmatically.
    var b2 = new goog.ui.MenuButton('Edit', m2);
    b2.setId('EditButton');
    b2.setDispatchTransitionEvents(goog.ui.Component.State.ALL, true);
    b2.render(goog.dom.getElement('menuButtons'));
    b2.setTooltip('Edit menu demo');
    goog.events.listen(b2, EVENTS, logEvent);

    goog.events.listen(goog.dom.getElement('b2_show'),
        goog.events.EventType.CLICK,
        function(e) {
          b2.setVisible(e.target.checked);
        });

    // Create another sample menu.
    var m3 = new goog.ui.Menu();
    m3.setId('WindowMenu');
    goog.array.forEach(['Tile', 'Cascade', null, 'Zoom in', 'Zoom out'],
        function(label) {
          var item;
          if (label) {
            item = new goog.ui.MenuItem(label + '...');
            item.setId(label);
            item.setDispatchTransitionEvents(goog.ui.Component.State.ALL, true);
          } else {
            item = new goog.ui.MenuSeparator();
          }
          m3.addItem(item);
        });
    var unhighlightable = new goog.ui.MenuItem('Zoom control:');
    // Disabled implies unhighlightable, unless the menu is specifically set
    // to allow highlighting disabled items (but it doesn't by default).
    unhighlightable.setEnabled(false);
    unhighlightable.setId('unhighlightable');
    m3.addItemAt(unhighlightable, 3);

    // Create a third button programmatically.
    var b3 = new goog.ui.MenuButton('Window', m3);
    b3.setId('WindowButton');
    b3.setDispatchTransitionEvents(goog.ui.Component.State.ALL, true);
    b3.render(goog.dom.getElement('menuButtons'));
    b3.setTooltip('Windowm menu demo');
    goog.events.listen(b3, EVENTS, logEvent);

    // Decorate a menu button.  Note that since one of the child nodes of the
    // menu button element can be decorated as a menu, it is auto-decorated and
    // attached to the button.
    var formatButton = goog.ui.decorate(goog.dom.getElement('formatButton'));

    goog.events.listen(goog.dom.getElement('formatButton_show'),
        goog.events.EventType.CLICK,
        function(e) {
          formatButton.setVisible(e.target.checked);
        });

    goog.events.listen(goog.dom.getElement('formatButton_enable'),
        goog.events.EventType.CLICK,
        function(e) {
          formatButton.setEnabled(e.target.checked);
        });

    goog.events.listen(formatButton, EVENTS, logEvent);


    // Create a combo button with a custom button and a menu button.
    // Create a sample menu.
    var cbb1 = new goog.ui.CustomButton('Add to Family');
    cbb1.render(goog.dom.getElement('comboButtons'));
    cbb1.addClassName('goog-custom-button-collapse-right');
    var cbm1 = new goog.ui.Menu();
    cbm1.setId('ComboMenu');
    goog.array.forEach(['Friends', 'Family', 'Coworkers'],
        function(label) {
          var item = new goog.ui.MenuItem(label);
          item.setId(label);
          item.setDispatchTransitionEvents(goog.ui.Component.State.ALL, true);
          cbm1.addItem(item);
        });
    var cb1 = new goog.ui.Button('Take action', cbm1);
    var cbmb1 = new goog.ui.MenuButton(null, cbm1);
    cbmb1.setPositionElement(cbb1.getElement());
    cbmb1.addClassName('goog-menu-button-collapse-left');
    cbmb1.setDispatchTransitionEvents(goog.ui.Component.State.ALL, true);
    cbmb1.setId('ComboMenuButton');
    cbmb1.render(goog.dom.getElement('comboButtons'));
    cbmb1.setTooltip('Combo button');
    goog.events.listen(cbmb1, EVENTS, logEvent);


    // Create two buttons with menus for the positioning demo inside the
    // positioning iframe.
    var positioningFrame = goog.dom.getElement('positioning-frame');
    var shortPosButton, longPosButton;
    goog.events.listen(positioningFrame, 'load', function() {
      var frameDocument = goog.dom.getFrameContentDocument(positioningFrame);
      var frameDomHelper = new goog.dom.DomHelper(frameDocument);

      var shortMenu = new goog.ui.Menu(frameDomHelper);
      shortMenu.setId('PositionMenuShort');
      for (var i = 1; i <= 5; i++) {
        shortMenu.addItem(new goog.ui.MenuItem('Item ' + i + '...'));
      }
      shortPosButton = new goog.ui.MenuButton('Short Menu', shortMenu);
      shortPosButton.setId('PositingButtonShort');
      shortPosButton.render(frameDocument.body);
      shortMenu.getElement().style.overflowY = 'auto';

      var longMenu = new goog.ui.Menu(frameDomHelper);
      longMenu.setId('PositionMenuLong');
      for (var i = 1; i <= 15; i++) {
        longMenu.addItem(new goog.ui.MenuItem('Item ' + i + '...'));
      }
      longPosButton = new goog.ui.MenuButton('Long Menu', longMenu);
      longPosButton.setId('PositingButtonLong');
      longPosButton.render(frameDocument.body);
      longMenu.getElement().style.overflowY = 'auto';
    });
    function updateScrollOption() {
      var checked = goog.dom.getElement('pos_option_scroll').checked;
      shortPosButton.setScrollOnOverflow(checked);
      longPosButton.setScrollOnOverflow(checked);
    }
    goog.events.listen(goog.dom.getElement('pos_option_scroll'), 'click',
        updateScrollOption);


    goog.dom.setTextContent(goog.dom.getElement('perf'),
        (goog.now() - timer) + 'ms');
  </script>
</body>
</html>