UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

205 lines (161 loc) 4.56 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2008 1&1 Internet AG, Germany, http://www.1und1.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Sebastian Werner (wpbasti) * Andreas Ecker (ecker) ************************************************************************ */ /** * A menubar button */ qx.Class.define("qx.ui.menubar.Button", { extend : qx.ui.form.MenuButton, /* ***************************************************************************** CONSTRUCTOR ***************************************************************************** */ construct : function(label, icon, menu) { this.base(arguments, label, icon, menu); this.removeListener("keydown", this._onKeyDown); this.removeListener("keyup", this._onKeyUp); }, /* ***************************************************************************** PROPERTIES ***************************************************************************** */ properties : { appearance : { refine : true, init : "menubar-button" }, show : { refine : true, init : "inherit" }, focusable : { refine : true, init : false } }, /* ***************************************************************************** MEMBERS ***************************************************************************** */ members : { /* --------------------------------------------------------------------------- HELPER METHODS --------------------------------------------------------------------------- */ /** * Inspects the parent chain to find the MenuBar * * @return {qx.ui.menubar.MenuBar} MenuBar instance or <code>null</code>. */ getMenuBar : function() { var parent = this; while (parent) { /* this method is also used by toolbar.MenuButton, so we need to check for a ToolBar instance. */ if (parent instanceof qx.ui.toolbar.ToolBar) { return parent; } parent = parent.getLayoutParent(); } return null; }, // overridden open : function(selectFirst) { this.base(arguments, selectFirst); var menubar = this.getMenuBar(); if (menubar) { menubar._setAllowMenuOpenHover(true); } }, /* --------------------------------------------------------------------------- EVENT LISTENERS --------------------------------------------------------------------------- */ /** * Listener for visibility property changes of the attached menu * * @param e {qx.event.type.Data} Property change event */ _onMenuChange : function(e) { var menu = this.getMenu(); var menubar = this.getMenuBar(); if (menu.isVisible()) { this.addState("pressed"); // Sync with open menu property if (menubar) { menubar.setOpenMenu(menu); } } else { this.removeState("pressed"); // Sync with open menu property if (menubar && menubar.getOpenMenu() == menu) { menubar.resetOpenMenu(); menubar._setAllowMenuOpenHover(false); } } }, // overridden _onPointerUp : function(e) { this.base(arguments, e); // Set state 'pressed' to visualize that the menu is open. var menu = this.getMenu(); if (menu && menu.isVisible() && !this.hasState("pressed")) { this.addState("pressed"); } }, /** * Event listener for pointerover event * * @param e {qx.event.type.Pointer} pointerover event object */ _onPointerOver : function(e) { // Add hovered state this.addState("hovered"); // Open submenu if (this.getMenu() && e.getPointerType() == "mouse") { var menubar = this.getMenuBar(); if (menubar && menubar._isAllowMenuOpenHover()) { // Hide all open menus qx.ui.menu.Manager.getInstance().hideAll(); // Set it again, because hideAll remove it. menubar._setAllowMenuOpenHover(true); // Then show the attached menu if (this.isEnabled()) { this.open(); } } } } } });