Upgrade to ExtJS 3.2.1 - Released 04/27/2010
[extjs.git] / docs / source / MenuMgr.html
1 <html>
2 <head>
3   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    
4   <title>The source code</title>
5     <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
6     <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
7 </head>
8 <body  onload="prettyPrint();">
9     <pre class="prettyprint lang-js">/*!
10  * Ext JS Library 3.2.1
11  * Copyright(c) 2006-2010 Ext JS, Inc.
12  * licensing@extjs.com
13  * http://www.extjs.com/license
14  */
15 <div id="cls-Ext.menu.MenuMgr"></div>/**
16  * @class Ext.menu.MenuMgr
17  * Provides a common registry of all menu items on a page so that they can be easily accessed by id.
18  * @singleton
19  */
20 Ext.menu.MenuMgr = function(){
21    var menus, active, groups = {}, attached = false, lastShow = new Date();
22
23    // private - called when first menu is created
24    function init(){
25        menus = {};
26        active = new Ext.util.MixedCollection();
27        Ext.getDoc().addKeyListener(27, function(){
28            if(active.length > 0){
29                hideAll();
30            }
31        });
32    }
33
34    // private
35    function hideAll(){
36        if(active && active.length > 0){
37            var c = active.clone();
38            c.each(function(m){
39                m.hide();
40            });
41            return true;
42        }
43        return false;
44    }
45
46    // private
47    function onHide(m){
48        active.remove(m);
49        if(active.length < 1){
50            Ext.getDoc().un("mousedown", onMouseDown);
51            attached = false;
52        }
53    }
54
55    // private
56    function onShow(m){
57        var last = active.last();
58        lastShow = new Date();
59        active.add(m);
60        if(!attached){
61            Ext.getDoc().on("mousedown", onMouseDown);
62            attached = true;
63        }
64        if(m.parentMenu){
65           m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3);
66           m.parentMenu.activeChild = m;
67        }else if(last && !last.isDestroyed && last.isVisible()){
68           m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3);
69        }
70    }
71
72    // private
73    function onBeforeHide(m){
74        if(m.activeChild){
75            m.activeChild.hide();
76        }
77        if(m.autoHideTimer){
78            clearTimeout(m.autoHideTimer);
79            delete m.autoHideTimer;
80        }
81    }
82
83    // private
84    function onBeforeShow(m){
85        var pm = m.parentMenu;
86        if(!pm && !m.allowOtherMenus){
87            hideAll();
88        }else if(pm && pm.activeChild){
89            pm.activeChild.hide();
90        }
91    }
92
93    // private
94    function onMouseDown(e){
95        if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){
96            hideAll();
97        }
98    }
99
100    // private
101    function onBeforeCheck(mi, state){
102        if(state){
103            var g = groups[mi.group];
104            for(var i = 0, l = g.length; i < l; i++){
105                if(g[i] != mi){
106                    g[i].setChecked(false);
107                }
108            }
109        }
110    }
111
112    return {
113
114        <div id="method-Ext.menu.MenuMgr-hideAll"></div>/**
115         * Hides all menus that are currently visible
116         * @return {Boolean} success True if any active menus were hidden.
117         */
118        hideAll : function(){
119             return hideAll();
120        },
121
122        // private
123        register : function(menu){
124            if(!menus){
125                init();
126            }
127            menus[menu.id] = menu;
128            menu.on({
129                beforehide: onBeforeHide,
130                hide: onHide,
131                beforeshow: onBeforeShow,
132                show: onShow
133            });
134        },
135
136         <div id="method-Ext.menu.MenuMgr-get"></div>/**
137          * Returns a {@link Ext.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          * @return {Ext.menu.Menu} The specified menu, or null if none are found
141          */
142        get : function(menu){
143            if(typeof menu == "string"){ // menu id
144                if(!menus){  // not initialized, no menus to return
145                    return null;
146                }
147                return menus[menu];
148            }else if(menu.events){  // menu instance
149                return menu;
150            }else if(typeof menu.length == 'number'){ // array of menu items?
151                return new Ext.menu.Menu({items:menu});
152            }else{ // otherwise, must be a config
153                return Ext.create(menu, 'menu');
154            }
155        },
156
157        // private
158        unregister : function(menu){
159            delete menus[menu.id];
160            menu.un("beforehide", onBeforeHide);
161            menu.un("hide", onHide);
162            menu.un("beforeshow", onBeforeShow);
163            menu.un("show", onShow);
164        },
165
166        // private
167        registerCheckable : function(menuItem){
168            var g = menuItem.group;
169            if(g){
170                if(!groups[g]){
171                    groups[g] = [];
172                }
173                groups[g].push(menuItem);
174                menuItem.on("beforecheckchange", onBeforeCheck);
175            }
176        },
177
178        // private
179        unregisterCheckable : function(menuItem){
180            var g = menuItem.group;
181            if(g){
182                groups[g].remove(menuItem);
183                menuItem.un("beforecheckchange", onBeforeCheck);
184            }
185        },
186
187        getCheckedItem : function(groupId){
188            var g = groups[groupId];
189            if(g){
190                for(var i = 0, l = g.length; i < l; i++){
191                    if(g[i].checked){
192                        return g[i];
193                    }
194                }
195            }
196            return null;
197        },
198
199        setCheckedItem : function(groupId, itemId){
200            var g = groups[groupId];
201            if(g){
202                for(var i = 0, l = g.length; i < l; i++){
203                    if(g[i].id == itemId){
204                        g[i].setChecked(true);
205                    }
206                }
207            }
208            return null;
209        }
210    };
211 }();
212 </pre>    
213 </body>
214 </html>