<!DOCTYPE html> <html> <!-- Copyright 2010 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.debug.LogManager'); 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: </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> Show second button: <input type="checkbox" id="b2_show" checked> </td> </tr> </tbody> </table> <label> </label> <br> </fieldset> <fieldset> <legend> This <strong>MenuButton</strong> decorates an element: </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> Show button: <input type="checkbox" id="formatButton_show" checked> </td> </tr> </tbody> </table> <label> </label> <br> </fieldset> <fieldset> <legend> This <strong>MenuButton</strong> accompanies a <strong>CustomButton</strong> to form a combo button: </legend> <div id="comboButtons"></div> <label> </label> <br> </fieldset> <fieldset> <legend> These <strong>MenuButtons</strong> demonstrate menu positioning options: </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.debug.LogManager.getRoot().setLevel(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>