Upgrade to ExtJS 4.0.7 - Released 10/19/2011
[extjs.git] / docs / source / Manager.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5   <title>The source code</title>
6   <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
7   <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
8   <style type="text/css">
9     .highlight { display: block; background-color: #ddd; }
10   </style>
11   <script type="text/javascript">
12     function highlight() {
13       document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
14     }
15   </script>
16 </head>
17 <body onload="prettyPrint(); highlight();">
18   <pre class="prettyprint lang-js"><span id='Ext-menu-Manager'>/**
19 </span> * @class Ext.menu.Manager
20  * Provides a common registry of all menus on a page.
21  * @singleton
22  */
23 Ext.define('Ext.menu.Manager', {
24     singleton: true,
25     requires: [
26         'Ext.util.MixedCollection',
27         'Ext.util.KeyMap'
28     ],
29     alternateClassName: 'Ext.menu.MenuMgr',
30
31     uses: ['Ext.menu.Menu'],
32
33     menus: {},
34     groups: {},
35     attached: false,
36     lastShow: new Date(),
37
38     init: function() {
39         var me = this;
40         
41         me.active = Ext.create('Ext.util.MixedCollection');
42         Ext.getDoc().addKeyListener(27, function() {
43             if (me.active.length &gt; 0) {
44                 me.hideAll();
45             }
46         }, me);
47     },
48
49 <span id='Ext-menu-Manager-method-hideAll'>    /**
50 </span>     * Hides all menus that are currently visible
51      * @return {Boolean} success True if any active menus were hidden.
52      */
53     hideAll: function() {
54         var active = this.active,
55             c;
56         if (active &amp;&amp; active.length &gt; 0) {
57             c = active.clone();
58             c.each(function(m) {
59                 m.hide();
60             });
61             return true;
62         }
63         return false;
64     },
65
66     onHide: function(m) {
67         var me = this,
68             active = me.active;
69         active.remove(m);
70         if (active.length &lt; 1) {
71             Ext.getDoc().un('mousedown', me.onMouseDown, me);
72             me.attached = false;
73         }
74     },
75
76     onShow: function(m) {
77         var me = this,
78             active   = me.active,
79             last     = active.last(),
80             attached = me.attached,
81             menuEl   = m.getEl(),
82             zIndex;
83
84         me.lastShow = new Date();
85         active.add(m);
86         if (!attached) {
87             Ext.getDoc().on('mousedown', me.onMouseDown, me);
88             me.attached = true;
89         }
90         m.toFront();
91     },
92
93     onBeforeHide: function(m) {
94         if (m.activeChild) {
95             m.activeChild.hide();
96         }
97         if (m.autoHideTimer) {
98             clearTimeout(m.autoHideTimer);
99             delete m.autoHideTimer;
100         }
101     },
102
103     onBeforeShow: function(m) {
104         var active = this.active,
105             parentMenu = m.parentMenu;
106             
107         active.remove(m);
108         if (!parentMenu &amp;&amp; !m.allowOtherMenus) {
109             this.hideAll();
110         }
111         else if (parentMenu &amp;&amp; parentMenu.activeChild &amp;&amp; m != parentMenu.activeChild) {
112             parentMenu.activeChild.hide();
113         }
114     },
115
116     // private
117     onMouseDown: function(e) {
118         var me = this,
119             active = me.active,
120             lastShow = me.lastShow,
121             target = e.target;
122
123         if (Ext.Date.getElapsed(lastShow) &gt; 50 &amp;&amp; active.length &gt; 0 &amp;&amp; !e.getTarget('.' + Ext.baseCSSPrefix + 'menu')) {
124             me.hideAll();
125             // in IE, if we mousedown on a focusable element, the focus gets cancelled and the focus event is never
126             // fired on the element, so we'll focus it here
127             if (Ext.isIE &amp;&amp; Ext.fly(target).focusable()) {
128                 target.focus();
129             }
130         }
131     },
132
133     // private
134     register: function(menu) {
135         var me = this;
136
137         if (!me.active) {
138             me.init();
139         }
140
141         if (menu.floating) {
142             me.menus[menu.id] = menu;
143             menu.on({
144                 beforehide: me.onBeforeHide,
145                 hide: me.onHide,
146                 beforeshow: me.onBeforeShow,
147                 show: me.onShow,
148                 scope: me
149             });
150         }
151     },
152
153 <span id='Ext-menu-Manager-method-get'>    /**
154 </span>     * Returns a {@link Ext.menu.Menu} object
155      * @param {String/Object} menu The string menu id, an existing menu object reference, or a Menu config that will
156      * be used to generate and return a new Menu this.
157      * @return {Ext.menu.Menu} The specified menu, or null if none are found
158      */
159     get: function(menu) {
160         var menus = this.menus;
161         
162         if (typeof menu == 'string') { // menu id
163             if (!menus) {  // not initialized, no menus to return
164                 return null;
165             }
166             return menus[menu];
167         } else if (menu.isMenu) {  // menu instance
168             return menu;
169         } else if (Ext.isArray(menu)) { // array of menu items
170             return Ext.create('Ext.menu.Menu', {items:menu});
171         } else { // otherwise, must be a config
172             return Ext.ComponentManager.create(menu, 'menu');
173         }
174     },
175
176     // private
177     unregister: function(menu) {
178         var me = this,
179             menus = me.menus,
180             active = me.active;
181
182         delete menus[menu.id];
183         active.remove(menu);
184         menu.un({
185             beforehide: me.onBeforeHide,
186             hide: me.onHide,
187             beforeshow: me.onBeforeShow,
188             show: me.onShow,
189             scope: me
190         });
191     },
192
193     // private
194     registerCheckable: function(menuItem) {
195         var groups  = this.groups,
196             groupId = menuItem.group;
197
198         if (groupId) {
199             if (!groups[groupId]) {
200                 groups[groupId] = [];
201             }
202
203             groups[groupId].push(menuItem);
204         }
205     },
206
207     // private
208     unregisterCheckable: function(menuItem) {
209         var groups  = this.groups,
210             groupId = menuItem.group;
211
212         if (groupId) {
213             Ext.Array.remove(groups[groupId], menuItem);
214         }
215     },
216
217     onCheckChange: function(menuItem, state) {
218         var groups  = this.groups,
219             groupId = menuItem.group,
220             i       = 0,
221             group, ln, curr;
222
223         if (groupId &amp;&amp; state) {
224             group = groups[groupId];
225             ln = group.length;
226             for (; i &lt; ln; i++) {
227                 curr = group[i];
228                 if (curr != menuItem) {
229                     curr.setChecked(false);
230                 }
231             }
232         }
233     }
234 });</pre>
235 </body>
236 </html>