3 * Copyright(c) 2006-2010 Sencha Inc.
5 * http://www.sencha.com/license
8 * @class Ext.menu.MenuMgr
9 * Provides a common registry of all menu items on a page so that they can be easily accessed by id.
12 Ext.menu.MenuMgr = function(){
13 var menus, active, groups = {}, attached = false, lastShow = new Date();
15 // private - called when first menu is created
18 active = new Ext.util.MixedCollection();
19 Ext.getDoc().addKeyListener(27, function(){
20 if(active.length > 0){
28 if(active && active.length > 0){
29 var c = active.clone();
41 if(active.length < 1){
42 Ext.getDoc().un("mousedown", onMouseDown);
49 var last = active.last();
50 lastShow = new Date();
53 Ext.getDoc().on("mousedown", onMouseDown);
57 m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3);
58 m.parentMenu.activeChild = m;
59 }else if(last && !last.isDestroyed && last.isVisible()){
60 m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3);
65 function onBeforeHide(m){
70 clearTimeout(m.autoHideTimer);
71 delete m.autoHideTimer;
76 function onBeforeShow(m){
77 var pm = m.parentMenu;
78 if(!pm && !m.allowOtherMenus){
80 }else if(pm && pm.activeChild){
81 pm.activeChild.hide();
86 function onMouseDown(e){
87 if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){
95 * Hides all menus that are currently visible
96 * @return {Boolean} success True if any active menus were hidden.
103 register : function(menu){
107 menus[menu.id] = menu;
109 beforehide: onBeforeHide,
111 beforeshow: onBeforeShow,
117 * Returns a {@link Ext.menu.Menu} object
118 * @param {String/Object} menu The string menu id, an existing menu object reference, or a Menu config that will
119 * be used to generate and return a new Menu instance.
120 * @return {Ext.menu.Menu} The specified menu, or null if none are found
122 get : function(menu){
123 if(typeof menu == "string"){ // menu id
124 if(!menus){ // not initialized, no menus to return
128 }else if(menu.events){ // menu instance
130 }else if(typeof menu.length == 'number'){ // array of menu items?
131 return new Ext.menu.Menu({items:menu});
132 }else{ // otherwise, must be a config
133 return Ext.create(menu, 'menu');
138 unregister : function(menu){
139 delete menus[menu.id];
140 menu.un("beforehide", onBeforeHide);
141 menu.un("hide", onHide);
142 menu.un("beforeshow", onBeforeShow);
143 menu.un("show", onShow);
147 registerCheckable : function(menuItem){
148 var g = menuItem.group;
153 groups[g].push(menuItem);
158 unregisterCheckable : function(menuItem){
159 var g = menuItem.group;
161 groups[g].remove(menuItem);
166 onCheckChange: function(item, state){
167 if(item.group && state){
168 var group = groups[item.group],
176 current.setChecked(false);
182 getCheckedItem : function(groupId){
183 var g = groups[groupId];
185 for(var i = 0, l = g.length; i < l; i++){
194 setCheckedItem : function(groupId, itemId){
195 var g = groups[groupId];
197 for(var i = 0, l = g.length; i < l; i++){
198 if(g[i].id == itemId){
199 g[i].setChecked(true);