MenuMgr.js
Ext.menu.MenuMgr = function(){
var menus, active, groups = {};
// private - called when first menu is created
function init(){
menus = {}, active = new Ext.util.MixedCollection();
var d = Ext.get(document);
d.on('mousedown', onMouseDown);
d.addKeyListener(27, function(){
if(active.length > 0){
hideAll();
}
});
}
function hideAll(){
var c = active.clone();
c.each(function(m){
m.hide();
});
}
function onHide(m){
active.remove(m);
}
function onShow(m){
var last = active.last();
active.add(m);
if(m.parentMenu){
m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle('z-index'), 10) + 3);
m.parentMenu.activeChild = m;
}else if(last && last.isVisible()){
m.getEl().setZIndex(parseInt(last.getEl().getStyle('z-index'), 10) + 3);
}
}
function onBeforeHide(m){
if(m.activeChild){
m.activeChild.hide();
}
if(m.autoHideTimer){
clearTimeout(m.autoHideTimer);
delete m.autoHideTimer;
}
}
function onBeforeShow(m){
var pm = m.parentMenu;
if(!pm && !m.allowOtherMenus){
hideAll();
}else if(pm && pm.activeChild){
pm.activeChild.hide();
}
}
function onMouseDown(e){
if(active.length > 0 && !e.getTarget('.x-menu')){
hideAll();
}
}
function onBeforeCheck(mi, state){
if(state){
var g = groups[mi.group];
for(var i = 0, l = g.length; i < l; i++){
if(g[i] != mi){
g[i].setChecked(false);
}
}
}
}
return {
register : function(menu){
if(!menus){
init();
}
menus[menu.id] = menu;
menu.on('beforehide', onBeforeHide);
menu.on('hide', onHide);
menu.on('beforeshow', onBeforeShow);
menu.on('show', onShow);
var g = menu.group;
if(g && menu.events['checkchange']){
if(!groups[g]){
groups[g] = [];
}
groups[g].push(menu);
menu.on('checkchange', onCheck);
}
},
get : function(menu){
if(typeof menu == 'string'){ // menu id
return menus[menuId];
}else if(menu.events){ // menu instance
return menu;
}else{ // otherwise, must be a config
return new Ext.menu.Menu(menu);
}
},
unregister : function(menu){
delete menus[menu.id];
menu.un('beforehide', onBeforeHide);
menu.un('hide', onHide);
menu.un('beforeshow', onBeforeShow);
menu.un('show', onShow);
var g = menu.group;
if(g && menu.events['checkchange']){
groups[g].remove(menu);
menu.un('checkchange', onCheck);
}
},
registerCheckable : function(menuItem){
var g = menuItem.group;
if(g){
if(!groups[g]){
groups[g] = [];
}
groups[g].push(menuItem);
menuItem.on('beforecheckchange', onBeforeCheck);
}
},
unregisterCheckable : function(menuItem){
var g = menuItem.group;
if(g){
groups[g].remove(menuItem);
menuItem.un('beforecheckchange', onBeforeCheck);
}
}
};
}();
yui-ext - Copyright © 2006 Jack Slocum. |
Yahoo! UI - Copyright © 2006 Yahoo! Inc.
All rights reserved.