initial import
[roojs1] / Roo / menu / MenuMgr.js
1 /*
2  * Based on:
3  * Ext JS Library 1.1.1
4  * Copyright(c) 2006-2007, Ext JS, LLC.
5  *
6  * Originally Released Under LGPL - original licence link has changed is not relivant.
7  *
8  * Fork - LGPL
9  * <script type="text/javascript">
10  */
11  
12 /**
13  * @class Roo.menu.MenuMgr
14  * Provides a common registry of all menu items on a page so that they can be easily accessed by id.
15  * @singleton
16  */
17 Roo.menu.MenuMgr = function(){
18    var menus, active, groups = {}, attached = false, lastShow = new Date();
19
20    // private - called when first menu is created
21    function init(){
22        menus = {};
23        active = new Roo.util.MixedCollection();
24        Roo.get(document).addKeyListener(27, function(){
25            if(active.length > 0){
26                hideAll();
27            }
28        });
29    }
30
31    // private
32    function hideAll(){
33        if(active && active.length > 0){
34            var c = active.clone();
35            c.each(function(m){
36                m.hide();
37            });
38        }
39    }
40
41    // private
42    function onHide(m){
43        active.remove(m);
44        if(active.length < 1){
45            Roo.get(document).un("mousedown", onMouseDown);
46            attached = false;
47        }
48    }
49
50    // private
51    function onShow(m){
52        var last = active.last();
53        lastShow = new Date();
54        active.add(m);
55        if(!attached){
56            Roo.get(document).on("mousedown", onMouseDown);
57            attached = true;
58        }
59        if(m.parentMenu){
60           m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3);
61           m.parentMenu.activeChild = m;
62        }else if(last && last.isVisible()){
63           m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3);
64        }
65    }
66
67    // private
68    function onBeforeHide(m){
69        if(m.activeChild){
70            m.activeChild.hide();
71        }
72        if(m.autoHideTimer){
73            clearTimeout(m.autoHideTimer);
74            delete m.autoHideTimer;
75        }
76    }
77
78    // private
79    function onBeforeShow(m){
80        var pm = m.parentMenu;
81        if(!pm && !m.allowOtherMenus){
82            hideAll();
83        }else if(pm && pm.activeChild && active != m){
84            pm.activeChild.hide();
85        }
86    }
87
88    // private
89    function onMouseDown(e){
90        if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){
91            hideAll();
92        }
93    }
94
95    // private
96    function onBeforeCheck(mi, state){
97        if(state){
98            var g = groups[mi.group];
99            for(var i = 0, l = g.length; i < l; i++){
100                if(g[i] != mi){
101                    g[i].setChecked(false);
102                }
103            }
104        }
105    }
106
107    return {
108
109        /**
110         * Hides all menus that are currently visible
111         */
112        hideAll : function(){
113             hideAll();  
114        },
115
116        // private
117        register : function(menu){
118            if(!menus){
119                init();
120            }
121            menus[menu.id] = menu;
122            menu.on("beforehide", onBeforeHide);
123            menu.on("hide", onHide);
124            menu.on("beforeshow", onBeforeShow);
125            menu.on("show", onShow);
126            var g = menu.group;
127            if(g && menu.events["checkchange"]){
128                if(!groups[g]){
129                    groups[g] = [];
130                }
131                groups[g].push(menu);
132                menu.on("checkchange", onCheck);
133            }
134        },
135
136         /**
137          * Returns a {@link Roo.menu.Menu} object
138          * @param {String/Object} menu The string menu id, an existing menu object reference, or a Menu config that will
139          * be used to generate and return a new Menu instance.
140          */
141        get : function(menu){
142            if(typeof menu == "string"){ // menu id
143                return menus[menu];
144            }else if(menu.events){  // menu instance
145                return menu;
146            }else if(typeof menu.length == 'number'){ // array of menu items?
147                return new Roo.menu.Menu({items:menu});
148            }else{ // otherwise, must be a config
149                return new Roo.menu.Menu(menu);
150            }
151        },
152
153        // private
154        unregister : function(menu){
155            delete menus[menu.id];
156            menu.un("beforehide", onBeforeHide);
157            menu.un("hide", onHide);
158            menu.un("beforeshow", onBeforeShow);
159            menu.un("show", onShow);
160            var g = menu.group;
161            if(g && menu.events["checkchange"]){
162                groups[g].remove(menu);
163                menu.un("checkchange", onCheck);
164            }
165        },
166
167        // private
168        registerCheckable : function(menuItem){
169            var g = menuItem.group;
170            if(g){
171                if(!groups[g]){
172                    groups[g] = [];
173                }
174                groups[g].push(menuItem);
175                menuItem.on("beforecheckchange", onBeforeCheck);
176            }
177        },
178
179        // private
180        unregisterCheckable : function(menuItem){
181            var g = menuItem.group;
182            if(g){
183                groups[g].remove(menuItem);
184                menuItem.un("beforecheckchange", onBeforeCheck);
185            }
186        }
187    };
188 }();