Upgrade to ExtJS 3.0.0 - Released 07/06/2009
[extjs.git] / docs / source / MenuMgr.html
1 <html>\r
2 <head>\r
3   <title>The source code</title>\r
4     <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />\r
5     <script type="text/javascript" src="../resources/prettify/prettify.js"></script>\r
6 </head>\r
7 <body  onload="prettyPrint();">\r
8     <pre class="prettyprint lang-js"><div id="cls-Ext.menu.MenuMgr"></div>/**
9  * @class Ext.menu.MenuMgr
10  * Provides a common registry of all menu items on a page so that they can be easily accessed by id.
11  * @singleton
12  */
13 Ext.menu.MenuMgr = function(){
14    var menus, active, groups = {}, attached = false, lastShow = new Date();
15
16    // private - called when first menu is created
17    function init(){
18        menus = {};
19        active = new Ext.util.MixedCollection();
20        Ext.getDoc().addKeyListener(27, function(){
21            if(active.length > 0){
22                hideAll();
23            }
24        });
25    }
26
27    // private
28    function hideAll(){
29        if(active && active.length > 0){
30            var c = active.clone();
31            c.each(function(m){
32                m.hide();
33            });
34        }
35    }
36
37    // private
38    function onHide(m){
39        active.remove(m);
40        if(active.length < 1){
41            Ext.getDoc().un("mousedown", onMouseDown);
42            attached = false;
43        }
44    }
45
46    // private
47    function onShow(m){
48        var last = active.last();
49        lastShow = new Date();
50        active.add(m);
51        if(!attached){
52            Ext.getDoc().on("mousedown", onMouseDown);
53            attached = true;
54        }
55        if(m.parentMenu){
56           m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3);
57           m.parentMenu.activeChild = m;
58        }else if(last && last.isVisible()){
59           m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3);
60        }
61    }
62
63    // private
64    function onBeforeHide(m){
65        if(m.activeChild){
66            m.activeChild.hide();
67        }
68        if(m.autoHideTimer){
69            clearTimeout(m.autoHideTimer);
70            delete m.autoHideTimer;
71        }
72    }
73
74    // private
75    function onBeforeShow(m){
76        var pm = m.parentMenu;
77        if(!pm && !m.allowOtherMenus){
78            hideAll();
79        }else if(pm && pm.activeChild){
80            pm.activeChild.hide();
81        }
82    }
83
84    // private
85    function onMouseDown(e){
86        if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){
87            hideAll();
88        }
89    }
90
91    // private
92    function onBeforeCheck(mi, state){
93        if(state){
94            var g = groups[mi.group];
95            for(var i = 0, l = g.length; i < l; i++){
96                if(g[i] != mi){
97                    g[i].setChecked(false);
98                }
99            }
100        }
101    }
102
103    return {
104
105        <div id="method-Ext.menu.MenuMgr-hideAll"></div>/**
106         * Hides all menus that are currently visible
107         */
108        hideAll : function(){
109             hideAll();  
110        },
111
112        // private
113        register : function(menu){
114            if(!menus){
115                init();
116            }
117            menus[menu.id] = menu;
118            menu.on("beforehide", onBeforeHide);
119            menu.on("hide", onHide);
120            menu.on("beforeshow", onBeforeShow);
121            menu.on("show", onShow);
122            var g = menu.group;
123            if(g && menu.events["checkchange"]){
124                if(!groups[g]){
125                    groups[g] = [];
126                }
127                groups[g].push(menu);
128                menu.on("checkchange", onCheck);
129            }
130        },
131
132         <div id="method-Ext.menu.MenuMgr-get"></div>/**
133          * Returns a {@link Ext.menu.Menu} object
134          * @param {String/Object} menu The string menu id, an existing menu object reference, or a Menu config that will
135          * be used to generate and return a new Menu instance.
136          * @return {Ext.menu.Menu} The specified menu, or null if none are found
137          */
138        get : function(menu){
139            if(typeof menu == "string"){ // menu id
140                if(!menus){  // not initialized, no menus to return
141                    return null;
142                }
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 Ext.menu.Menu({items:menu});
148            }else{ // otherwise, must be a config
149                return Ext.create(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        getCheckedItem : function(groupId){
189            var g = groups[groupId];
190            if(g){
191                for(var i = 0, l = g.length; i < l; i++){
192                    if(g[i].checked){
193                        return g[i];
194                    }
195                }
196            }
197            return null;
198        },
199
200        setCheckedItem : function(groupId, itemId){
201            var g = groups[groupId];
202            if(g){
203                for(var i = 0, l = g.length; i < l; i++){
204                    if(g[i].id == itemId){
205                        g[i].setChecked(true);
206                    }
207                }
208            }
209            return null;
210        }
211    };
212 }();
213 </pre>    \r
214 </body>\r
215 </html>