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