3 * Copyright(c) 2006-2009 Ext JS, LLC
5 * http://www.extjs.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();
39 if(active.length < 1){
40 Ext.getDoc().un("mousedown", onMouseDown);
47 var last = active.last();
48 lastShow = new Date();
51 Ext.getDoc().on("mousedown", onMouseDown);
55 m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3);
56 m.parentMenu.activeChild = m;
57 }else if(last && last.isVisible()){
58 m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3);
63 function onBeforeHide(m){
68 clearTimeout(m.autoHideTimer);
69 delete m.autoHideTimer;
74 function onBeforeShow(m){
75 var pm = m.parentMenu;
76 if(!pm && !m.allowOtherMenus){
78 }else if(pm && pm.activeChild){
79 pm.activeChild.hide();
84 function onMouseDown(e){
85 if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){
91 function onBeforeCheck(mi, state){
93 var g = groups[mi.group];
94 for(var i = 0, l = g.length; i < l; i++){
96 g[i].setChecked(false);
105 * Hides all menus that are currently visible
107 hideAll : function(){
112 register : function(menu){
116 menus[menu.id] = menu;
117 menu.on("beforehide", onBeforeHide);
118 menu.on("hide", onHide);
119 menu.on("beforeshow", onBeforeShow);
120 menu.on("show", onShow);
122 if(g && menu.events["checkchange"]){
126 groups[g].push(menu);
127 menu.on("checkchange", onCheck);
132 * Returns a {@link Ext.menu.Menu} object
133 * @param {String/Object} menu The string menu id, an existing menu object reference, or a Menu config that will
134 * be used to generate and return a new Menu instance.
135 * @return {Ext.menu.Menu} The specified menu, or null if none are found
137 get : function(menu){
138 if(typeof menu == "string"){ // menu id
139 if(!menus){ // not initialized, no menus to return
143 }else if(menu.events){ // menu instance
145 }else if(typeof menu.length == 'number'){ // array of menu items?
146 return new Ext.menu.Menu({items:menu});
147 }else{ // otherwise, must be a config
148 return Ext.create(menu, 'menu');
153 unregister : function(menu){
154 delete menus[menu.id];
155 menu.un("beforehide", onBeforeHide);
156 menu.un("hide", onHide);
157 menu.un("beforeshow", onBeforeShow);
158 menu.un("show", onShow);
160 if(g && menu.events["checkchange"]){
161 groups[g].remove(menu);
162 menu.un("checkchange", onCheck);
167 registerCheckable : function(menuItem){
168 var g = menuItem.group;
173 groups[g].push(menuItem);
174 menuItem.on("beforecheckchange", onBeforeCheck);
179 unregisterCheckable : function(menuItem){
180 var g = menuItem.group;
182 groups[g].remove(menuItem);
183 menuItem.un("beforecheckchange", onBeforeCheck);
187 getCheckedItem : function(groupId){
188 var g = groups[groupId];
190 for(var i = 0, l = g.length; i < l; i++){
199 setCheckedItem : function(groupId, itemId){
200 var g = groups[groupId];
202 for(var i = 0, l = g.length; i < l; i++){
203 if(g[i].id == itemId){
204 g[i].setChecked(true);