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