Upgrade to ExtJS 4.0.2 - Released 06/09/2011
[extjs.git] / docs / source / AbstractContainer2.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="../prettify/prettify.css" type="text/css" rel="stylesheet" />
7   <script type="text/javascript" src="../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-container-AbstractContainer'>/**
19 </span> * @class Ext.container.AbstractContainer
20  * @extends Ext.Component
21  * &lt;p&gt;An abstract base class which provides shared methods for Containers across the Sencha product line.&lt;/p&gt;
22  * Please refer to sub class's documentation
23  */
24 Ext.define('Ext.container.AbstractContainer', {
25
26     /* Begin Definitions */
27
28     extend: 'Ext.Component',
29
30     requires: [
31         'Ext.util.MixedCollection',
32         'Ext.layout.container.Auto',
33         'Ext.ZIndexManager'
34     ],
35
36     /* End Definitions */
37 <span id='Ext-container-AbstractContainer-cfg-layout'>    /**
38 </span>     * @cfg {String/Object} layout
39      * &lt;p&gt;&lt;b&gt;*Important&lt;/b&gt;: In order for child items to be correctly sized and
40      * positioned, typically a layout manager &lt;b&gt;must&lt;/b&gt; be specified through
41      * the &lt;code&gt;layout&lt;/code&gt; configuration option.&lt;/p&gt;
42      * &lt;br&gt;&lt;p&gt;The sizing and positioning of child {@link #items} is the responsibility of
43      * the Container's layout manager which creates and manages the type of layout
44      * you have in mind.  For example:&lt;/p&gt;
45      * &lt;p&gt;If the {@link #layout} configuration is not explicitly specified for
46      * a general purpose container (e.g. Container or Panel) the
47      * {@link Ext.layout.container.Auto default layout manager} will be used
48      * which does nothing but render child components sequentially into the
49      * Container (no sizing or positioning will be performed in this situation).&lt;/p&gt;
50      * &lt;br&gt;&lt;p&gt;&lt;b&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/b&gt; may be specified as either as an Object or
51      * as a String:&lt;/p&gt;&lt;div&gt;&lt;ul class=&quot;mdetail-params&quot;&gt;
52      *
53      * &lt;li&gt;&lt;u&gt;Specify as an Object&lt;/u&gt;&lt;/li&gt;
54      * &lt;div&gt;&lt;ul class=&quot;mdetail-params&quot;&gt;
55      * &lt;li&gt;Example usage:&lt;/li&gt;
56      * &lt;pre&gt;&lt;code&gt;
57 layout: {
58     type: 'vbox',
59     align: 'left'
60 }
61        &lt;/code&gt;&lt;/pre&gt;
62      *
63      * &lt;li&gt;&lt;code&gt;&lt;b&gt;type&lt;/b&gt;&lt;/code&gt;&lt;/li&gt;
64      * &lt;br/&gt;&lt;p&gt;The layout type to be used for this container.  If not specified,
65      * a default {@link Ext.layout.container.Auto} will be created and used.&lt;/p&gt;
66      * &lt;br/&gt;&lt;p&gt;Valid layout &lt;code&gt;type&lt;/code&gt; values are:&lt;/p&gt;
67      * &lt;div class=&quot;sub-desc&quot;&gt;&lt;ul class=&quot;mdetail-params&quot;&gt;
68      * &lt;li&gt;&lt;code&gt;&lt;b&gt;{@link Ext.layout.container.Auto Auto}&lt;/b&gt;&lt;/code&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Default&lt;/b&gt;&lt;/li&gt;
69      * &lt;li&gt;&lt;code&gt;&lt;b&gt;{@link Ext.layout.container.Card card}&lt;/b&gt;&lt;/code&gt;&lt;/li&gt;
70      * &lt;li&gt;&lt;code&gt;&lt;b&gt;{@link Ext.layout.container.Fit fit}&lt;/b&gt;&lt;/code&gt;&lt;/li&gt;
71      * &lt;li&gt;&lt;code&gt;&lt;b&gt;{@link Ext.layout.container.HBox hbox}&lt;/b&gt;&lt;/code&gt;&lt;/li&gt;
72      * &lt;li&gt;&lt;code&gt;&lt;b&gt;{@link Ext.layout.container.VBox vbox}&lt;/b&gt;&lt;/code&gt;&lt;/li&gt;
73      * &lt;li&gt;&lt;code&gt;&lt;b&gt;{@link Ext.layout.container.Anchor anchor}&lt;/b&gt;&lt;/code&gt;&lt;/li&gt;
74      * &lt;li&gt;&lt;code&gt;&lt;b&gt;{@link Ext.layout.container.Table table}&lt;/b&gt;&lt;/code&gt;&lt;/li&gt;
75      * &lt;/ul&gt;&lt;/div&gt;
76      *
77      * &lt;li&gt;Layout specific configuration properties&lt;/li&gt;
78      * &lt;br/&gt;&lt;p&gt;Additional layout specific configuration properties may also be
79      * specified. For complete details regarding the valid config options for
80      * each layout type, see the layout class corresponding to the &lt;code&gt;type&lt;/code&gt;
81      * specified.&lt;/p&gt;
82      *
83      * &lt;/ul&gt;&lt;/div&gt;
84      *
85      * &lt;li&gt;&lt;u&gt;Specify as a String&lt;/u&gt;&lt;/li&gt;
86      * &lt;div&gt;&lt;ul class=&quot;mdetail-params&quot;&gt;
87      * &lt;li&gt;Example usage:&lt;/li&gt;
88      * &lt;pre&gt;&lt;code&gt;
89 layout: {
90     type: 'vbox',
91     padding: '5',
92     align: 'left'
93 }
94        &lt;/code&gt;&lt;/pre&gt;
95      * &lt;li&gt;&lt;code&gt;&lt;b&gt;layout&lt;/b&gt;&lt;/code&gt;&lt;/li&gt;
96      * &lt;br/&gt;&lt;p&gt;The layout &lt;code&gt;type&lt;/code&gt; to be used for this container (see list
97      * of valid layout type values above).&lt;/p&gt;&lt;br/&gt;
98      * &lt;br/&gt;&lt;p&gt;Additional layout specific configuration properties. For complete
99      * details regarding the valid config options for each layout type, see the
100      * layout class corresponding to the &lt;code&gt;layout&lt;/code&gt; specified.&lt;/p&gt;
101      * &lt;/ul&gt;&lt;/div&gt;&lt;/ul&gt;&lt;/div&gt;
102      */
103
104 <span id='Ext-container-AbstractContainer-cfg-activeItem'>    /**
105 </span>     * @cfg {String/Number} activeItem
106      * A string component id or the numeric index of the component that should be initially activated within the
107      * container's layout on render.  For example, activeItem: 'item-1' or activeItem: 0 (index 0 = the first
108      * item in the container's collection).  activeItem only applies to layout styles that can display
109      * items one at a time (like {@link Ext.layout.container.Card} and {@link Ext.layout.container.Fit}).
110      */
111 <span id='Ext-container-AbstractContainer-cfg-items'>    /**
112 </span>     * @cfg {Object/Array} items
113      * &lt;p&gt;A single item, or an array of child Components to be added to this container&lt;/p&gt;
114      * &lt;p&gt;&lt;b&gt;Unless configured with a {@link #layout}, a Container simply renders child Components serially into
115      * its encapsulating element and performs no sizing or positioning upon them.&lt;/b&gt;&lt;p&gt;
116      * &lt;p&gt;Example:&lt;/p&gt;
117      * &lt;pre&gt;&lt;code&gt;
118 // specifying a single item
119 items: {...},
120 layout: 'fit',    // The single items is sized to fit
121
122 // specifying multiple items
123 items: [{...}, {...}],
124 layout: 'hbox', // The items are arranged horizontally
125        &lt;/code&gt;&lt;/pre&gt;
126      * &lt;p&gt;Each item may be:&lt;/p&gt;
127      * &lt;ul&gt;
128      * &lt;li&gt;A {@link Ext.Component Component}&lt;/li&gt;
129      * &lt;li&gt;A Component configuration object&lt;/li&gt;
130      * &lt;/ul&gt;
131      * &lt;p&gt;If a configuration object is specified, the actual type of Component to be
132      * instantiated my be indicated by using the {@link Ext.Component#xtype xtype} option.&lt;/p&gt;
133      * &lt;p&gt;Every Component class has its own {@link Ext.Component#xtype xtype}.&lt;/p&gt;
134      * &lt;p&gt;If an {@link Ext.Component#xtype xtype} is not explicitly
135      * specified, the {@link #defaultType} for the Container is used, which by default is usually &lt;code&gt;panel&lt;/code&gt;.&lt;/p&gt;
136      * &lt;p&gt;&lt;b&gt;Notes&lt;/b&gt;:&lt;/p&gt;
137      * &lt;p&gt;Ext uses lazy rendering. Child Components will only be rendered
138      * should it become necessary. Items are automatically laid out when they are first
139      * shown (no sizing is done while hidden), or in response to a {@link #doLayout} call.&lt;/p&gt;
140      * &lt;p&gt;Do not specify &lt;code&gt;{@link Ext.panel.Panel#contentEl contentEl}&lt;/code&gt; or 
141      * &lt;code&gt;{@link Ext.panel.Panel#html html}&lt;/code&gt; with &lt;code&gt;items&lt;/code&gt;.&lt;/p&gt;
142      */
143 <span id='Ext-container-AbstractContainer-cfg-defaults'>    /**
144 </span>     * @cfg {Object|Function} defaults
145      * &lt;p&gt;This option is a means of applying default settings to all added items whether added through the {@link #items}
146      * config or via the {@link #add} or {@link #insert} methods.&lt;/p&gt;
147      * &lt;p&gt;If an added item is a config object, and &lt;b&gt;not&lt;/b&gt; an instantiated Component, then the default properties are
148      * unconditionally applied. If the added item &lt;b&gt;is&lt;/b&gt; an instantiated Component, then the default properties are
149      * applied conditionally so as not to override existing properties in the item.&lt;/p&gt;
150      * &lt;p&gt;If the defaults option is specified as a function, then the function will be called using this Container as the
151      * scope (&lt;code&gt;this&lt;/code&gt; reference) and passing the added item as the first parameter. Any resulting object
152      * from that call is then applied to the item as default properties.&lt;/p&gt;
153      * &lt;p&gt;For example, to automatically apply padding to the body of each of a set of
154      * contained {@link Ext.panel.Panel} items, you could pass: &lt;code&gt;defaults: {bodyStyle:'padding:15px'}&lt;/code&gt;.&lt;/p&gt;
155      * &lt;p&gt;Usage:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;
156 defaults: {               // defaults are applied to items, not the container
157     autoScroll:true
158 },
159 items: [
160     {
161         xtype: 'panel',   // defaults &lt;b&gt;do not&lt;/b&gt; have precedence over
162         id: 'panel1',     // options in config objects, so the defaults
163         autoScroll: false // will not be applied here, panel1 will be autoScroll:false
164     },
165     new Ext.panel.Panel({       // defaults &lt;b&gt;do&lt;/b&gt; have precedence over options
166         id: 'panel2',     // options in components, so the defaults
167         autoScroll: false // will be applied here, panel2 will be autoScroll:true.
168     })
169 ]&lt;/code&gt;&lt;/pre&gt;
170      */
171
172 <span id='Ext-container-AbstractContainer-cfg-suspendLayout'>    /** @cfg {Boolean} suspendLayout
173 </span>     * If true, suspend calls to doLayout.  Useful when batching multiple adds to a container and not passing them
174      * as multiple arguments or an array.
175      */
176     suspendLayout : false,
177
178 <span id='Ext-container-AbstractContainer-cfg-autoDestroy'>    /** @cfg {Boolean} autoDestroy
179 </span>     * If true the container will automatically destroy any contained component that is removed from it, else
180      * destruction must be handled manually.
181      * Defaults to true.
182      */
183     autoDestroy : true,
184
185 <span id='Ext-container-AbstractContainer-cfg-defaultType'>     /** @cfg {String} defaultType
186 </span>      * &lt;p&gt;The default {@link Ext.Component xtype} of child Components to create in this Container when
187       * a child item is specified as a raw configuration object, rather than as an instantiated Component.&lt;/p&gt;
188       * &lt;p&gt;Defaults to &lt;code&gt;'panel'&lt;/code&gt;.&lt;/p&gt;
189       */
190     defaultType: 'panel',
191
192     isContainer : true,
193
194     baseCls: Ext.baseCSSPrefix + 'container',
195
196 <span id='Ext-container-AbstractContainer-cfg-bubbleEvents'>    /**
197 </span>     * @cfg {Array} bubbleEvents
198      * &lt;p&gt;An array of events that, when fired, should be bubbled to any parent container.
199      * See {@link Ext.util.Observable#enableBubble}.
200      * Defaults to &lt;code&gt;['add', 'remove']&lt;/code&gt;.
201      */
202     bubbleEvents: ['add', 'remove'],
203     
204     // @private
205     initComponent : function(){
206         var me = this;
207         me.addEvents(
208 <span id='Ext-container-AbstractContainer-event-afterlayout'>            /**
209 </span>             * @event afterlayout
210              * Fires when the components in this container are arranged by the associated layout manager.
211              * @param {Ext.container.Container} this
212              * @param {ContainerLayout} layout The ContainerLayout implementation for this container
213              */
214             'afterlayout',
215 <span id='Ext-container-AbstractContainer-event-beforeadd'>            /**
216 </span>             * @event beforeadd
217              * Fires before any {@link Ext.Component} is added or inserted into the container.
218              * A handler can return false to cancel the add.
219              * @param {Ext.container.Container} this
220              * @param {Ext.Component} component The component being added
221              * @param {Number} index The index at which the component will be added to the container's items collection
222              */
223             'beforeadd',
224 <span id='Ext-container-AbstractContainer-event-beforeremove'>            /**
225 </span>             * @event beforeremove
226              * Fires before any {@link Ext.Component} is removed from the container.  A handler can return
227              * false to cancel the remove.
228              * @param {Ext.container.Container} this
229              * @param {Ext.Component} component The component being removed
230              */
231             'beforeremove',
232 <span id='Ext-container-AbstractContainer-event-add'>            /**
233 </span>             * @event add
234              * @bubbles
235              * Fires after any {@link Ext.Component} is added or inserted into the container.
236              * @param {Ext.container.Container} this
237              * @param {Ext.Component} component The component that was added
238              * @param {Number} index The index at which the component was added to the container's items collection
239              */
240             'add',
241 <span id='Ext-container-AbstractContainer-event-remove'>            /**
242 </span>             * @event remove
243              * @bubbles
244              * Fires after any {@link Ext.Component} is removed from the container.
245              * @param {Ext.container.Container} this
246              * @param {Ext.Component} component The component that was removed
247              */
248             'remove',
249 <span id='Ext-container-AbstractContainer-event-beforecardswitch'>            /**
250 </span>             * @event beforecardswitch
251              * Fires before this container switches the active card. This event
252              * is only available if this container uses a CardLayout. Note that
253              * TabPanel and Carousel both get a CardLayout by default, so both
254              * will have this event.
255              * A handler can return false to cancel the card switch.
256              * @param {Ext.container.Container} this
257              * @param {Ext.Component} newCard The card that will be switched to
258              * @param {Ext.Component} oldCard The card that will be switched from
259              * @param {Number} index The index of the card that will be switched to
260              * @param {Boolean} animated True if this cardswitch will be animated
261              */
262             'beforecardswitch',
263 <span id='Ext-container-AbstractContainer-event-cardswitch'>            /**
264 </span>             * @event cardswitch
265              * Fires after this container switches the active card. If the card
266              * is switched using an animation, this event will fire after the
267              * animation has finished. This event is only available if this container
268              * uses a CardLayout. Note that TabPanel and Carousel both get a CardLayout
269              * by default, so both will have this event.
270              * @param {Ext.container.Container} this
271              * @param {Ext.Component} newCard The card that has been switched to
272              * @param {Ext.Component} oldCard The card that has been switched from
273              * @param {Number} index The index of the card that has been switched to
274              * @param {Boolean} animated True if this cardswitch was animated
275              */
276             'cardswitch'
277         );
278
279         // layoutOnShow stack
280         me.layoutOnShow = Ext.create('Ext.util.MixedCollection');
281         me.callParent();
282         me.initItems();
283     },
284
285     // @private
286     initItems : function() {
287         var me = this,
288             items = me.items;
289
290 <span id='Ext-container-AbstractContainer-property-items'>        /**
291 </span>         * The MixedCollection containing all the child items of this container.
292          * @property items
293          * @type Ext.util.MixedCollection
294          */
295         me.items = Ext.create('Ext.util.MixedCollection', false, me.getComponentId);
296
297         if (items) {
298             if (!Ext.isArray(items)) {
299                 items = [items];
300             }
301
302             me.add(items);
303         }
304     },
305
306     // @private
307     afterRender : function() {
308         this.getLayout();
309         this.callParent();
310     },
311
312     // @private
313     setLayout : function(layout) {
314         var currentLayout = this.layout;
315
316         if (currentLayout &amp;&amp; currentLayout.isLayout &amp;&amp; currentLayout != layout) {
317             currentLayout.setOwner(null);
318         }
319
320         this.layout = layout;
321         layout.setOwner(this);
322     },
323
324 <span id='Ext-container-AbstractContainer-method-getLayout'>    /**
325 </span>     * Returns the {@link Ext.layout.container.AbstractContainer layout} instance currently associated with this Container.
326      * If a layout has not been instantiated yet, that is done first
327      * @return {Ext.layout.container.AbstractContainer} The layout
328      */
329     getLayout : function() {
330         var me = this;
331         if (!me.layout || !me.layout.isLayout) {
332             me.setLayout(Ext.layout.Layout.create(me.layout, 'autocontainer'));
333         }
334
335         return me.layout;
336     },
337
338 <span id='Ext-container-AbstractContainer-method-doLayout'>    /**
339 </span>     * Manually force this container's layout to be recalculated.  The framwork uses this internally to refresh layouts
340      * form most cases.
341      * @return {Ext.container.Container} this
342      */
343     doLayout : function() {
344         var me = this,
345             layout = me.getLayout();
346
347         if (me.rendered &amp;&amp; layout &amp;&amp; !me.suspendLayout) {
348             // If either dimension is being auto-set, then it requires a ComponentLayout to be run.
349             if (!me.isFixedWidth() || !me.isFixedHeight()) {
350                 // Only run the ComponentLayout if it is not already in progress
351                 if (me.componentLayout.layoutBusy !== true) {
352                     me.doComponentLayout();
353                     if (me.componentLayout.layoutCancelled === true) {
354                         layout.layout();
355                     }
356                 }
357             }
358             // Both dimensions set, either by configuration, or by an owning layout, run a ContainerLayout
359             else {
360                 // Only run the ContainerLayout if it is not already in progress
361                 if (layout.layoutBusy !== true) {
362                     layout.layout();
363                 }
364             }
365         }
366
367         return me;
368     },
369
370     // @private
371     afterLayout : function(layout) {
372         this.fireEvent('afterlayout', this, layout);
373     },
374
375     // @private
376     prepareItems : function(items, applyDefaults) {
377         if (!Ext.isArray(items)) {
378             items = [items];
379         }
380
381         // Make sure defaults are applied and item is initialized
382         var i = 0,
383             len = items.length,
384             item;
385
386         for (; i &lt; len; i++) {
387             item = items[i];
388             if (applyDefaults) {
389                 item = this.applyDefaults(item);
390             }
391             items[i] = this.lookupComponent(item);
392         }
393         return items;
394     },
395
396     // @private
397     applyDefaults : function(config) {
398         var defaults = this.defaults;
399
400         if (defaults) {
401             if (Ext.isFunction(defaults)) {
402                 defaults = defaults.call(this, config);
403             }
404
405             if (Ext.isString(config)) {
406                 config = Ext.ComponentManager.get(config);
407                 Ext.applyIf(config, defaults);
408             } else if (!config.isComponent) {
409                 Ext.applyIf(config, defaults);
410             } else {
411                 Ext.applyIf(config, defaults);
412             }
413         }
414
415         return config;
416     },
417
418     // @private
419     lookupComponent : function(comp) {
420         return Ext.isString(comp) ? Ext.ComponentManager.get(comp) : this.createComponent(comp);
421     },
422
423     // @private
424     createComponent : function(config, defaultType) {
425         // // add in ownerCt at creation time but then immediately
426         // // remove so that onBeforeAdd can handle it
427         // var component = Ext.create(Ext.apply({ownerCt: this}, config), defaultType || this.defaultType);
428         //
429         // delete component.initialConfig.ownerCt;
430         // delete component.ownerCt;
431
432         return Ext.ComponentManager.create(config, defaultType || this.defaultType);
433     },
434
435     // @private - used as the key lookup function for the items collection
436     getComponentId : function(comp) {
437         return comp.getItemId();
438     },
439
440 <span id='Ext-container-AbstractContainer-method-add'>    /**
441 </span>
442 Adds {@link Ext.Component Component}(s) to this Container.
443
444 ##Description:##
445
446 - Fires the {@link #beforeadd} event before adding.
447 - The Container's {@link #defaults default config values} will be applied
448   accordingly (see `{@link #defaults}` for details).
449 - Fires the `{@link #add}` event after the component has been added.
450
451 ##Notes:##
452
453 If the Container is __already rendered__ when `add`
454 is called, it will render the newly added Component into its content area.
455
456 __**If**__ the Container was configured with a size-managing {@link #layout} manager, the Container
457 will recalculate its internal layout at this time too.
458
459 Note that the default layout manager simply renders child Components sequentially into the content area and thereafter performs no sizing.
460
461 If adding multiple new child Components, pass them as an array to the `add` method, so that only one layout recalculation is performed.
462
463     tb = new {@link Ext.toolbar.Toolbar}({
464         renderTo: document.body
465     });  // toolbar is rendered
466     tb.add([{text:'Button 1'}, {text:'Button 2'}]); // add multiple items. ({@link #defaultType} for {@link Ext.toolbar.Toolbar Toolbar} is 'button')
467
468 ##Warning:## 
469
470 Components directly managed by the BorderLayout layout manager
471 may not be removed or added.  See the Notes for {@link Ext.layout.container.Border BorderLayout}
472 for more details.
473
474      * @param {...Object/Array} Component
475      * Either one or more Components to add or an Array of Components to add.
476      * See `{@link #items}` for additional information.
477      *
478      * @return {Ext.Component/Array} The Components that were added.
479      * @markdown
480      */
481     add : function() {
482         var me = this,
483             args = Array.prototype.slice.call(arguments),
484             hasMultipleArgs,
485             items,
486             results = [],
487             i,
488             ln,
489             item,
490             index = -1,
491             cmp;
492
493         if (typeof args[0] == 'number') {
494             index = args.shift();
495         }
496
497         hasMultipleArgs = args.length &gt; 1;
498         if (hasMultipleArgs || Ext.isArray(args[0])) {
499
500             items = hasMultipleArgs ? args : args[0];
501             // Suspend Layouts while we add multiple items to the container
502             me.suspendLayout = true;
503             for (i = 0, ln = items.length; i &lt; ln; i++) {
504                 item = items[i];
505                 
506                 //&lt;debug&gt;
507                 if (!item) {
508                     Ext.Error.raise(&quot;Trying to add a null item as a child of Container with itemId/id: &quot; + me.getItemId());
509                 }
510                 //&lt;/debug&gt;
511                 
512                 if (index != -1) {
513                     item = me.add(index + i, item);
514                 } else {
515                     item = me.add(item);
516                 }
517                 results.push(item);
518             }
519             // Resume Layouts now that all items have been added and do a single layout for all the items just added
520             me.suspendLayout = false;
521             me.doLayout();
522             return results;
523         }
524
525         cmp = me.prepareItems(args[0], true)[0];
526
527         // Floating Components are not added into the items collection
528         // But they do get an upward ownerCt link so that they can traverse
529         // up to their z-index parent.
530         if (cmp.floating) {
531             cmp.onAdded(me, index);
532         } else {
533             index = (index !== -1) ? index : me.items.length;
534             if (me.fireEvent('beforeadd', me, cmp, index) !== false &amp;&amp; me.onBeforeAdd(cmp) !== false) {
535                 me.items.insert(index, cmp);
536                 cmp.onAdded(me, index);
537                 me.onAdd(cmp, index);
538                 me.fireEvent('add', me, cmp, index);
539             }
540             me.doLayout();
541         }
542         return cmp;
543     },
544
545 <span id='Ext-container-AbstractContainer-method-registerFloatingItem'>    /**
546 </span>     * @private
547      * &lt;p&gt;Called by Component#doAutoRender&lt;/p&gt;
548      * &lt;p&gt;Register a Container configured &lt;code&gt;floating: true&lt;/code&gt; with this Container's {@link Ext.ZIndexManager ZIndexManager}.&lt;/p&gt;
549      * &lt;p&gt;Components added in ths way will not participate in the layout, but will be rendered
550      * upon first show in the way that {@link Ext.window.Window Window}s are.&lt;/p&gt;
551      * &lt;p&gt;&lt;/p&gt;
552      */
553     registerFloatingItem: function(cmp) {
554         var me = this;
555         if (!me.floatingItems) {
556             me.floatingItems = Ext.create('Ext.ZIndexManager', me);
557         }
558         me.floatingItems.register(cmp);
559     },
560
561     onAdd : Ext.emptyFn,
562     onRemove : Ext.emptyFn,
563
564 <span id='Ext-container-AbstractContainer-method-insert'>    /**
565 </span>     * Inserts a Component into this Container at a specified index. Fires the
566      * {@link #beforeadd} event before inserting, then fires the {@link #add} event after the
567      * Component has been inserted.
568      * @param {Number} index The index at which the Component will be inserted
569      * into the Container's items collection
570      * @param {Ext.Component} component The child Component to insert.&lt;br&gt;&lt;br&gt;
571      * Ext uses lazy rendering, and will only render the inserted Component should
572      * it become necessary.&lt;br&gt;&lt;br&gt;
573      * A Component config object may be passed in order to avoid the overhead of
574      * constructing a real Component object if lazy rendering might mean that the
575      * inserted Component will not be rendered immediately. To take advantage of
576      * this 'lazy instantiation', set the {@link Ext.Component#xtype} config
577      * property to the registered type of the Component wanted.&lt;br&gt;&lt;br&gt;
578      * For a list of all available xtypes, see {@link Ext.Component}.
579      * @return {Ext.Component} component The Component (or config object) that was
580      * inserted with the Container's default config values applied.
581      */
582     insert : function(index, comp) {
583         return this.add(index, comp);
584     },
585
586 <span id='Ext-container-AbstractContainer-method-move'>    /**
587 </span>     * Moves a Component within the Container
588      * @param {Number} fromIdx The index the Component you wish to move is currently at.
589      * @param {Number} toIdx The new index for the Component.
590      * @return {Ext.Component} component The Component (or config object) that was moved.
591      */
592     move : function(fromIdx, toIdx) {
593         var items = this.items,
594             item;
595         item = items.removeAt(fromIdx);
596         if (item === false) {
597             return false;
598         }
599         items.insert(toIdx, item);
600         this.doLayout();
601         return item;
602     },
603
604     // @private
605     onBeforeAdd : function(item) {
606         var me = this;
607         
608         if (item.ownerCt) {
609             item.ownerCt.remove(item, false);
610         }
611
612         if (me.border === false || me.border === 0) {
613             item.border = (item.border === true);
614         }
615     },
616
617 <span id='Ext-container-AbstractContainer-method-remove'>    /**
618 </span>     * Removes a component from this container.  Fires the {@link #beforeremove} event before removing, then fires
619      * the {@link #remove} event after the component has been removed.
620      * @param {Component/String} component The component reference or id to remove.
621      * @param {Boolean} autoDestroy (optional) True to automatically invoke the removed Component's {@link Ext.Component#destroy} function.
622      * Defaults to the value of this Container's {@link #autoDestroy} config.
623      * @return {Ext.Component} component The Component that was removed.
624      */
625     remove : function(comp, autoDestroy) {
626         var me = this,
627             c = me.getComponent(comp);
628         //&lt;debug&gt;
629             if (Ext.isDefined(Ext.global.console) &amp;&amp; !c) {
630                 console.warn(&quot;Attempted to remove a component that does not exist. Ext.container.Container: remove takes an argument of the component to remove. cmp.remove() is incorrect usage.&quot;);
631             }
632         //&lt;/debug&gt;
633
634         if (c &amp;&amp; me.fireEvent('beforeremove', me, c) !== false) {
635             me.doRemove(c, autoDestroy);
636             me.fireEvent('remove', me, c);
637         }
638
639         return c;
640     },
641
642     // @private
643     doRemove : function(component, autoDestroy) {
644         var me = this,
645             layout = me.layout,
646             hasLayout = layout &amp;&amp; me.rendered;
647
648         me.items.remove(component);
649         component.onRemoved();
650
651         if (hasLayout) {
652             layout.onRemove(component);
653         }
654
655         me.onRemove(component, autoDestroy);
656
657         if (autoDestroy === true || (autoDestroy !== false &amp;&amp; me.autoDestroy)) {
658             component.destroy();
659         }
660
661         if (hasLayout &amp;&amp; !autoDestroy) {
662             layout.afterRemove(component);
663         }
664
665         if (!me.destroying) {
666             me.doLayout();
667         }
668     },
669
670 <span id='Ext-container-AbstractContainer-method-removeAll'>    /**
671 </span>     * Removes all components from this container.
672      * @param {Boolean} autoDestroy (optional) True to automatically invoke the removed Component's {@link Ext.Component#destroy} function.
673      * Defaults to the value of this Container's {@link #autoDestroy} config.
674      * @return {Array} Array of the destroyed components
675      */
676     removeAll : function(autoDestroy) {
677         var me = this,
678             removeItems = me.items.items.slice(),
679             items = [],
680             i = 0,
681             len = removeItems.length,
682             item;
683
684         // Suspend Layouts while we remove multiple items from the container
685         me.suspendLayout = true;
686         for (; i &lt; len; i++) {
687             item = removeItems[i];
688             me.remove(item, autoDestroy);
689
690             if (item.ownerCt !== me) {
691                 items.push(item);
692             }
693         }
694
695         // Resume Layouts now that all items have been removed and do a single layout (if we removed anything!)
696         me.suspendLayout = false;
697         if (len) {
698             me.doLayout();
699         }
700         return items;
701     },
702
703     // Used by ComponentQuery to retrieve all of the items
704     // which can potentially be considered a child of this Container.
705     // This should be overriden by components which have child items
706     // that are not contained in items. For example dockedItems, menu, etc
707     // IMPORTANT note for maintainers:
708     //  Items are returned in tree traversal order. Each item is appended to the result array
709     //  followed by the results of that child's getRefItems call.
710     //  Floating child items are appended after internal child items.
711     getRefItems : function(deep) {
712         var me = this,
713             items = me.items.items,
714             len = items.length,
715             i = 0,
716             item,
717             result = [];
718
719         for (; i &lt; len; i++) {
720             item = items[i];
721             result.push(item);
722             if (deep &amp;&amp; item.getRefItems) {
723                 result.push.apply(result, item.getRefItems(true));
724             }
725         }
726
727         // Append floating items to the list.
728         // These will only be present after they are rendered.
729         if (me.floatingItems &amp;&amp; me.floatingItems.accessList) {
730             result.push.apply(result, me.floatingItems.accessList);
731         }
732
733         return result;
734     },
735
736 <span id='Ext-container-AbstractContainer-method-cascade'>    /**
737 </span>     * Cascades down the component/container heirarchy from this component (passed in the first call), calling the specified function with
738      * each component. The scope (&lt;code&gt;this&lt;/code&gt; reference) of the
739      * function call will be the scope provided or the current component. The arguments to the function
740      * will be the args provided or the current component. If the function returns false at any point,
741      * the cascade is stopped on that branch.
742      * @param {Function} fn The function to call
743      * @param {Object} scope (optional) The scope of the function (defaults to current component)
744      * @param {Array} args (optional) The args to call the function with. The current component always passed as the last argument.
745      * @return {Ext.Container} this
746      */
747     cascade : function(fn, scope, origArgs){
748         var me = this,
749             cs = me.items ? me.items.items : [],
750             len = cs.length,
751             i = 0,
752             c,
753             args = origArgs ? origArgs.concat(me) : [me],
754             componentIndex = args.length - 1;
755
756         if (fn.apply(scope || me, args) !== false) {
757             for(; i &lt; len; i++){
758                 c = cs[i];
759                 if (c.cascade) {
760                     c.cascade(fn, scope, origArgs);
761                 } else {
762                     args[componentIndex] = c;
763                     fn.apply(scope || cs, args);
764                 }
765             }
766         }
767         return this;
768     },
769
770 <span id='Ext-container-AbstractContainer-method-getComponent'>    /**
771 </span>     * Examines this container's &lt;code&gt;{@link #items}&lt;/code&gt; &lt;b&gt;property&lt;/b&gt;
772      * and gets a direct child component of this container.
773      * @param {String/Number} comp This parameter may be any of the following:
774      * &lt;div&gt;&lt;ul class=&quot;mdetail-params&quot;&gt;
775      * &lt;li&gt;a &lt;b&gt;&lt;code&gt;String&lt;/code&gt;&lt;/b&gt; : representing the &lt;code&gt;{@link Ext.Component#itemId itemId}&lt;/code&gt;
776      * or &lt;code&gt;{@link Ext.Component#id id}&lt;/code&gt; of the child component &lt;/li&gt;
777      * &lt;li&gt;a &lt;b&gt;&lt;code&gt;Number&lt;/code&gt;&lt;/b&gt; : representing the position of the child component
778      * within the &lt;code&gt;{@link #items}&lt;/code&gt; &lt;b&gt;property&lt;/b&gt;&lt;/li&gt;
779      * &lt;/ul&gt;&lt;/div&gt;
780      * &lt;p&gt;For additional information see {@link Ext.util.MixedCollection#get}.
781      * @return Ext.Component The component (if found).
782      */
783     getComponent : function(comp) {
784         if (Ext.isObject(comp)) {
785             comp = comp.getItemId();
786         }
787
788         return this.items.get(comp);
789     },
790
791 <span id='Ext-container-AbstractContainer-method-query'>    /**
792 </span>     * Retrieves all descendant components which match the passed selector.
793      * Executes an Ext.ComponentQuery.query using this container as its root.
794      * @param {String} selector Selector complying to an Ext.ComponentQuery selector
795      * @return {Array} Ext.Component's which matched the selector
796      */
797     query : function(selector) {
798         return Ext.ComponentQuery.query(selector, this);
799     },
800
801 <span id='Ext-container-AbstractContainer-method-child'>    /**
802 </span>     * Retrieves the first direct child of this container which matches the passed selector.
803      * The passed in selector must comply with an Ext.ComponentQuery selector.
804      * @param {String} selector An Ext.ComponentQuery selector
805      * @return Ext.Component
806      */
807     child : function(selector) {
808         return this.query('&gt; ' + selector)[0] || null;
809     },
810
811 <span id='Ext-container-AbstractContainer-method-down'>    /**
812 </span>     * Retrieves the first descendant of this container which matches the passed selector.
813      * The passed in selector must comply with an Ext.ComponentQuery selector.
814      * @param {String} selector An Ext.ComponentQuery selector
815      * @return Ext.Component
816      */
817     down : function(selector) {
818         return this.query(selector)[0] || null;
819     },
820
821     // inherit docs
822     show : function() {
823         this.callParent(arguments);
824         this.performDeferredLayouts();
825         return this;
826     },
827
828     // Lay out any descendant containers who queued a layout operation during the time this was hidden
829     // This is also called by Panel after it expands because descendants of a collapsed Panel allso queue any layout ops.
830     performDeferredLayouts: function() {
831         var layoutCollection = this.layoutOnShow,
832             ln = layoutCollection.getCount(),
833             i = 0,
834             needsLayout,
835             item;
836
837         for (; i &lt; ln; i++) {
838             item = layoutCollection.get(i);
839             needsLayout = item.needsLayout;
840
841             if (Ext.isObject(needsLayout)) {
842                 item.doComponentLayout(needsLayout.width, needsLayout.height, needsLayout.isSetSize, needsLayout.ownerCt);
843             }
844         }
845         layoutCollection.clear();
846     },    
847     
848     //@private
849     // Enable all immediate children that was previously disabled
850     onEnable: function() {
851         Ext.Array.each(this.query('[isFormField]'), function(item) {
852             if (item.resetDisable) {
853                 item.enable();
854                 delete item.resetDisable;             
855             }
856         });
857         this.callParent();
858     },
859     
860     // @private
861     // Disable all immediate children that was previously disabled
862     onDisable: function() {
863         Ext.Array.each(this.query('[isFormField]'), function(item) {
864             if (item.resetDisable !== false &amp;&amp; !item.disabled) {
865                 item.disable();
866                 item.resetDisable = true;
867             }
868         });
869         this.callParent();
870     },
871
872 <span id='Ext-container-AbstractContainer-method-beforeLayout'>    /**
873 </span>     * Occurs before componentLayout is run. Returning false from this method will prevent the containerLayout
874      * from being executed.
875      */
876     beforeLayout: function() {
877         return true;
878     },
879
880     // @private
881     beforeDestroy : function() {
882         var me = this,
883             items = me.items,
884             c;
885
886         if (items) {
887             while ((c = items.first())) {
888                 me.doRemove(c, true);
889             }
890         }
891
892         Ext.destroy(
893             me.layout,
894             me.floatingItems
895         );
896         me.callParent();
897     }
898 });</pre>
899 </body>
900 </html>