| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-container-AbstractContainer'>/**</span> * An abstract base class which provides shared methods for Containers across the Sencha product line. * * Please refer to sub class's documentation * * @private */Ext.define('Ext.container.AbstractContainer', {    /* Begin Definitions */    extend: 'Ext.Component',    requires: [        'Ext.util.MixedCollection',        'Ext.layout.container.Auto',        'Ext.ZIndexManager'    ],    /* End Definitions */    renderTpl: '{%this.renderContainer(out,values)%}',<span id='Ext-container-AbstractContainer-cfg-layout'>    /**</span>     * @cfg {String/Object} layout     * **Important**: In order for child items to be correctly sized and     * positioned, typically a layout manager **must** be specified through     * the `layout` configuration option.     *     * The sizing and positioning of child {@link #cfg-items} is the responsibility of     * the Container's layout manager which creates and manages the type of layout     * you have in mind.  For example:     *     * If the {@link #layout} configuration is not explicitly specified for     * a general purpose container (e.g. Container or Panel) the     * {@link Ext.layout.container.Auto default layout manager} will be used     * which does nothing but render child components sequentially into the     * Container (no sizing or positioning will be performed in this situation).     *     * **layout** may be specified as either as an Object or as a String:     *     * # Specify as an Object     *     * Example usage:     *     *     layout: {     *         type: 'vbox',     *         align: 'left'     *     }     *     *   - **type**     *     *     The layout type to be used for this container.  If not specified,     *     a default {@link Ext.layout.container.Auto} will be created and used.     *     *     Valid layout <code>type</code> values are:     *     *     - {@link Ext.layout.container.Auto Auto} - **Default**     *     - {@link Ext.layout.container.Card card}     *     - {@link Ext.layout.container.Fit fit}     *     - {@link Ext.layout.container.HBox hbox}     *     - {@link Ext.layout.container.VBox vbox}     *     - {@link Ext.layout.container.Anchor anchor}     *     - {@link Ext.layout.container.Table table}     *     *   - Layout specific configuration properties     *     *     Additional layout specific configuration properties may also be     *     specified. For complete details regarding the valid config options for     *     each layout type, see the layout class corresponding to the `type`     *     specified.     *     * # Specify as a String     *     * Example usage:     *     *     layout: 'vbox'     *     *   - **layout**     *     *     The layout `type` to be used for this container (see list     *     of valid layout type values above).     *     *     Additional layout specific configuration properties. For complete     *     details regarding the valid config options for each layout type, see the     *     layout class corresponding to the `layout` specified.     *     * # Configuring the default layout type     *     *     If a certain Container class has a default layout (For example a {@link Ext.toolbar.Toolbar Toolbar}     *     with a default `Box` layout), then to simply configure the default layout,     *     use an object, but without the `type` property:     *     *     *     xtype: 'toolbar',     *     layout: {     *         pack: 'center'     *     }     */<span id='Ext-container-AbstractContainer-cfg-activeItem'>    /**</span>     * @cfg {String/Number} activeItem     * A string component id or the numeric index of the component that should be     * initially activated within the container's layout on render.  For example,     * activeItem: 'item-1' or activeItem: 0 (index 0 = the first item in the     * container's collection).  activeItem only applies to layout styles that can     * display items one at a time (like {@link Ext.layout.container.Card} and     * {@link Ext.layout.container.Fit}).     */<span id='Ext-container-AbstractContainer-cfg-items'>    /**</span>     * @cfg {Object/Object[]} items     * A single item, or an array of child Components to be added to this container     *     * **Unless configured with a {@link #layout}, a Container simply renders child     * Components serially into its encapsulating element and performs no sizing or     * positioning upon them.**     *     * Example:     *     *     // specifying a single item     *     items: {...},     *     layout: 'fit',    // The single items is sized to fit     *           *     // specifying multiple items     *     items: [{...}, {...}],     *     layout: 'hbox', // The items are arranged horizontally     *     * Each item may be:     *     * - A {@link Ext.Component Component}     * - A Component configuration object     *     * If a configuration object is specified, the actual type of Component to be     * instantiated my be indicated by using the {@link Ext.Component#xtype xtype} option.     *     * Every Component class has its own {@link Ext.Component#xtype xtype}.     *     * If an {@link Ext.Component#xtype xtype} is not explicitly specified, the     * {@link #defaultType} for the Container is used, which by default is usually `panel`.     *     * # Notes:     *     * Ext uses lazy rendering. Child Components will only be rendered     * should it become necessary. Items are automatically laid out when they are first     * shown (no sizing is done while hidden), or in response to a {@link #doLayout} call.     *     * Do not specify {@link Ext.panel.Panel#contentEl contentEl} or     * {@link Ext.panel.Panel#html html} with `items`.     */<span id='Ext-container-AbstractContainer-cfg-defaults'>    /**</span>     * @cfg {Object/Function} defaults     * This option is a means of applying default settings to all added items whether added     * through the {@link #cfg-items} config or via the {@link #method-add} or {@link #insert} methods.     *     * Defaults are applied to both config objects and instantiated components conditionally     * so as not to override existing properties in the item (see {@link Ext#applyIf}).     *     * If the defaults option is specified as a function, then the function will be called     * using this Container as the scope (`this` reference) and passing the added item as     * the first parameter. Any resulting object from that call is then applied to the item     * as default properties.     *     * For example, to automatically apply padding to the body of each of a set of     * contained {@link Ext.panel.Panel} items, you could pass:     * `defaults: {bodyStyle:'padding:15px'}`.     *     * Usage:     *     *     defaults: { // defaults are applied to items, not the container     *         autoScroll: true     *     },     *     items: [     *         // default will not be applied here, panel1 will be autoScroll: false     *         {     *             xtype: 'panel',     *             id: 'panel1',     *             autoScroll: false     *         },     *         // this component will have autoScroll: true     *         new Ext.panel.Panel({     *             id: 'panel2'     *         })     *     ]     */<span id='Ext-container-AbstractContainer-cfg-suspendLayout'>    /**</span>     * @cfg {Boolean} suspendLayout     * If true, suspend calls to doLayout. Useful when batching multiple adds to a container     * and not passing them as multiple arguments or an array.     */    suspendLayout : false,<span id='Ext-container-AbstractContainer-cfg-autoDestroy'>    /**</span>     * @cfg {Boolean} [autoDestroy=true]     * If true the container will automatically destroy any contained component that is removed     * from it, else destruction must be handled manually.     */    autoDestroy : true,<span id='Ext-container-AbstractContainer-cfg-defaultType'>     /**</span>      * @cfg {String} [defaultType="panel"]      * The default {@link Ext.Component xtype} of child Components to create in this Container when      * a child item is specified as a raw configuration object, rather than as an instantiated Component.      */    defaultType: 'panel',    <span id='Ext-container-AbstractContainer-cfg-detachOnRemove'>    /**</span>     * @cfg {Boolean} [detachOnRemove=true]     * True to move any component to the {@link Ext#getDetachedBody detachedBody} when the component is     * removed from this container. This option is only applicable when the component is not destroyed while     * being removed, see {@link #autoDestroy} and {@link #method-remove}. If this option is set to false, the DOM     * of the component will remain in the current place until it is explicitly moved.     */    detachOnRemove: true,    /*     * @property {Boolean} isContainer     * `true` in this class to identify an object as an instantiated Container, or subclass thereof.     */    isContainer : true,<span id='Ext-container-AbstractContainer-property-layoutCounter'>    /**</span>     * @property {Number} layoutCounter     * The number of container layout calls made on this object.     * @private     */    layoutCounter : 0,    baseCls: Ext.baseCSSPrefix + 'container',<span id='Ext-container-AbstractContainer-cfg-bubbleEvents'>    /**</span>     * @cfg {String[]} bubbleEvents     * An array of events that, when fired, should be bubbled to any parent container.     * See {@link Ext.util.Observable#enableBubble}.     */    bubbleEvents: ['add', 'remove'],    // @private    initComponent : function(){        var me = this;        me.addEvents(<span id='Ext-container-AbstractContainer-event-afterlayout'>            /**</span>             * @event afterlayout             * Fires when the components in this container are arranged by the associated layout manager.             * @param {Ext.container.Container} this             * @param {Ext.layout.container.Container} layout The ContainerLayout implementation for this container             */            'afterlayout',<span id='Ext-container-AbstractContainer-event-beforeadd'>            /**</span>             * @event beforeadd             * Fires before any {@link Ext.Component} is added or inserted into the container.             * A handler can return false to cancel the add.             * @param {Ext.container.Container} this             * @param {Ext.Component} component The component being added             * @param {Number} index The index at which the component will be added to the container's items collection             */            'beforeadd',<span id='Ext-container-AbstractContainer-event-beforeremove'>            /**</span>             * @event beforeremove             * Fires before any {@link Ext.Component} is removed from the container.  A handler can return             * false to cancel the remove.             * @param {Ext.container.Container} this             * @param {Ext.Component} component The component being removed             */            'beforeremove',<span id='Ext-container-AbstractContainer-event-add'>            /**</span>             * @event add             * Fires after any {@link Ext.Component} is added or inserted into the container.             *              * **This event bubbles:** 'add' will also be fired when Component is added to any of             * the child containers or their childern or ...             * @param {Ext.container.Container} this             * @param {Ext.Component} component The component that was added             * @param {Number} index The index at which the component was added to the container's items collection             */            'add',<span id='Ext-container-AbstractContainer-event-remove'>            /**</span>             * @event remove             * Fires after any {@link Ext.Component} is removed from the container.             *             * **This event bubbles:** 'remove' will also be fired when Component is removed from any of             * the child containers or their children or ...             * @param {Ext.container.Container} this             * @param {Ext.Component} component The component that was removed             */            'remove'        );        me.callParent();        me.getLayout();        me.initItems();    },    // @private    initItems : function() {        var me = this,            items = me.items;<span id='Ext-container-AbstractContainer-property-items'>        /**</span>         * The MixedCollection containing all the child items of this container.         * @property items         * @type Ext.util.AbstractMixedCollection         */        me.items = new Ext.util.AbstractMixedCollection(false, me.getComponentId);        if (items) {            if (!Ext.isArray(items)) {                items = [items];            }            me.add(items);        }    },<span id='Ext-container-AbstractContainer-method-getFocusEl'>    /**</span>     * @private     * Returns the focus holder element associated with this Container. By default, this is the Container's target     * element. Subclasses which use embedded focusable elements (such as Window and Button) should override this for use     * by the {@link #method-focus} method.     * @returns {Ext.Element} the focus holding element.     */    getFocusEl: function() {        return this.getTargetEl();    },    finishRenderChildren: function () {        this.callParent();        var layout = this.getLayout();        if (layout) {            layout.finishRender();        }    },    beforeRender: function () {        var me = this,            layout = me.getLayout();        me.callParent();        if (!layout.initialized) {            layout.initLayout();        }    },        setupRenderTpl: function (renderTpl) {        var layout = this.getLayout();        this.callParent(arguments);        layout.setupRenderTpl(renderTpl);    },    // @private    setLayout : function(layout) {        var currentLayout = this.layout;        if (currentLayout && currentLayout.isLayout && currentLayout != layout) {            currentLayout.setOwner(null);        }        this.layout = layout;        layout.setOwner(this);    },<span id='Ext-container-AbstractContainer-method-getLayout'>    /**</span>     * Returns the {@link Ext.layout.container.Container layout} instance currently associated with this Container.     * If a layout has not been instantiated yet, that is done first     * @return {Ext.layout.container.Container} The layout     */    getLayout : function() {        var me = this;        if (!me.layout || !me.layout.isLayout) {            // Pass any configured in layout property, defaulting to the prototype's layout property, falling back to Auto.            me.setLayout(Ext.layout.Layout.create(me.layout, me.self.prototype.layout || 'autocontainer'));        }        return me.layout;    },<span id='Ext-container-AbstractContainer-method-doLayout'>    /**</span>     * Manually force this container's layout to be recalculated. The framework uses this internally to refresh layouts     * form most cases.     * @return {Ext.container.Container} this     */    doLayout : function() {        this.updateLayout();        return this;    },<span id='Ext-container-AbstractContainer-method-afterLayout'>    /**</span>     * Invoked after the Container has laid out (and rendered if necessary)     * its child Components.     *     * @param {Ext.layout.container.Container} layout     *     * @template     * @protected     */    afterLayout : function(layout) {        var me = this;        ++me.layoutCounter;        if (me.hasListeners.afterlayout) {            me.fireEvent('afterlayout', me, layout);        }    },    // @private    prepareItems : function(items, applyDefaults) {        // Create an Array which does not refer to the passed array.        // The passed array is a reference to a user's config object and MUST NOT be mutated.        if (Ext.isArray(items)) {            items = items.slice();        } else {            items = [items];        }        // Make sure defaults are applied and item is initialized        var me = this,            i = 0,            len = items.length,            item;        for (; i < len; i++) {            item = items[i];            if (item == null) {                Ext.Array.erase(items, i, 1);                --i;                --len;            } else {                if (applyDefaults) {                    item = this.applyDefaults(item);                }                // Tell the item we're in a container during construction                item.isContained = me;                items[i] = me.lookupComponent(item);                delete item.isContained;            }        }        return items;    },    // @private    applyDefaults : function(config) {        var defaults = this.defaults;        if (defaults) {            if (Ext.isFunction(defaults)) {                defaults = defaults.call(this, config);            }            if (Ext.isString(config)) {                config = Ext.ComponentManager.get(config);            }            Ext.applyIf(config, defaults);        }        return config;    },    // @private    lookupComponent : function(comp) {        return (typeof comp == 'string') ? Ext.ComponentManager.get(comp)                                         : Ext.ComponentManager.create(comp, this.defaultType);    },    // @private - used as the key lookup function for the items collection    getComponentId : function(comp) {        return comp.getItemId();    },<span id='Ext-container-AbstractContainer-method-add'>    /**</span>     * Adds {@link Ext.Component Component}(s) to this Container.     *     * ## Description:     *     * - Fires the {@link #beforeadd} event before adding.     * - The Container's {@link #defaults default config values} will be applied     *   accordingly (see `{@link #defaults}` for details).     * - Fires the `{@link #event-add}` event after the component has been added.     *     * ## Notes:     *     * If the Container is __already rendered__ when `add`     * is called, it will render the newly added Component into its content area.     *     * **If** the Container was configured with a size-managing {@link #layout} manager,     * the Container will recalculate its internal layout at this time too.     *       * Note that the default layout manager simply renders child Components sequentially     * into the content area and thereafter performs no sizing.     *       * If adding multiple new child Components, pass them as an array to the `add` method,     * so that only one layout recalculation is performed.     *       *     tb = new {@link Ext.toolbar.Toolbar}({     *         renderTo: document.body     *     });  // toolbar is rendered     *     // add multiple items.     *     // ({@link #defaultType} for {@link Ext.toolbar.Toolbar Toolbar} is 'button')     *     tb.add([{text:'Button 1'}, {text:'Button 2'}]);     *     * To inject components between existing ones, use the {@link #insert} method.     *     * ## Warning:     *     * Components directly managed by the BorderLayout layout manager may not be removed     * or added.  See the Notes for {@link Ext.layout.container.Border BorderLayout} for     * more details.     *     * @param {Ext.Component[]/Ext.Component...} component     * Either one or more Components to add or an Array of Components to add.     * See `{@link #cfg-items}` for additional information.     *     * @return {Ext.Component[]/Ext.Component} The Components that were added.     */    add : function() {        var me = this,            args = Ext.Array.slice(arguments),            index = (typeof args[0] == 'number') ? args.shift() : -1,            layout = me.getLayout(),            addingArray, items, i, length, item, pos, ret;        if (args.length == 1 && Ext.isArray(args[0])) {            items = args[0];            addingArray = true;        } else {            items = args;        }        ret = items = me.prepareItems(items, true);        length = items.length;        if (me.rendered) {            Ext.suspendLayouts(); // suspend layouts while adding items...        }        if (!addingArray && length == 1) { // an array of 1 should still return an array...            ret = items[0];        }        // loop        for (i = 0; i < length; i++) {            item = items[i];            //<debug>            if (!item) {                Ext.Error.raise("Cannot add null item to Container with itemId/id: " + me.getItemId());            }            //</debug>            pos = (index < 0) ? me.items.length : (index + i);            // Floating Components are not added into the items collection, but to a separate floatingItems collection            if (item.floating) {                me.floatingItems = me.floatingItems || new Ext.util.MixedCollection();                me.floatingItems.add(item);                item.onAdded(me, pos);            } else if ((!me.hasListeners.beforeadd || me.fireEvent('beforeadd', me, item, pos) !== false) && me.onBeforeAdd(item) !== false) {                me.items.insert(pos, item);                item.onAdded(me, pos);                me.onAdd(item, pos);                layout.onAdd(item, pos);                if (me.hasListeners.add) {                    me.fireEvent('add', me, item, pos);                }            }        }        // We need to update our layout after adding all passed items        me.updateLayout();        if (me.rendered) {            Ext.resumeLayouts(true);        }        return ret;    },<span id='Ext-container-AbstractContainer-method-onAdd'>    /**</span>     * This method is invoked after a new Component has been added. It     * is passed the Component which has been added. This method may     * be used to update any internal structure which may depend upon     * the state of the child items.     *     * @param {Ext.Component} component     * @param {Number} position     *     * @template     * @protected     */    onAdd : Ext.emptyFn,<span id='Ext-container-AbstractContainer-method-onRemove'>    /**</span>     * This method is invoked after a new Component has been     * removed. It is passed the Component which has been     * removed. This method may be used to update any internal     * structure which may depend upon the state of the child items.     *     * @param {Ext.Component} component     * @param {Boolean} autoDestroy     *     * @template     * @protected     */    onRemove : Ext.emptyFn,<span id='Ext-container-AbstractContainer-method-insert'>    /**</span>     * Inserts a Component into this Container at a specified index. Fires the     * {@link #beforeadd} event before inserting, then fires the {@link #event-add}     * event after the Component has been inserted.     *     * @param {Number} index The index at which the Component will be inserted     * into the Container's items collection     *     * @param {Ext.Component} component The child Component to insert.     *     * Ext uses lazy rendering, and will only render the inserted Component should     * it become necessary.     *     * A Component config object may be passed in order to avoid the overhead of     * constructing a real Component object if lazy rendering might mean that the     * inserted Component will not be rendered immediately. To take advantage of     * this 'lazy instantiation', set the {@link Ext.Component#xtype} config     * property to the registered type of the Component wanted.     *     * For a list of all available xtypes, see {@link Ext.Component}.     *     * @return {Ext.Component} component The Component (or config object) that was     * inserted with the Container's default config values applied.     */    insert : function(index, comp) {        return this.add(index, comp);    },<span id='Ext-container-AbstractContainer-method-move'>    /**</span>     * Moves a Component within the Container     * @param {Number} fromIdx The index the Component you wish to move is currently at.     * @param {Number} toIdx The new index for the Component.     * @return {Ext.Component} component The Component (or config object) that was moved.     */    move : function(fromIdx, toIdx) {        var items = this.items,            item;        item = items.removeAt(fromIdx);        if (item === false) {            return false;        }        items.insert(toIdx, item);        this.doLayout();        return item;    },<span id='Ext-container-AbstractContainer-method-onBeforeAdd'>    /**</span>     * This method is invoked before adding a new child Component. It     * is passed the new Component, and may be used to modify the     * Component, or prepare the Container in some way. Returning     * false aborts the add operation.     *     * @param {Ext.Component} item     *     * @template     * @protected     */    onBeforeAdd : function(item) {        var me = this,            border = item.border;        // Remove from current container if it's not us.        if (item.ownerCt && item.ownerCt !== me) {            item.ownerCt.remove(item, false);        }        if (me.border === false || me.border === 0) {            // If the parent has no border, only use an explicitly defined border            item.border = Ext.isDefined(border) && border !== false && border !== 0;        }    },<span id='Ext-container-AbstractContainer-method-remove'>    /**</span>     * Removes a component from this container.  Fires the {@link #beforeremove} event     * before removing, then fires the {@link #event-remove} event after the component has     * been removed.     *     * @param {Ext.Component/String} component The component reference or id to remove.     *     * @param {Boolean} [autoDestroy] True to automatically invoke the removed Component's     * {@link Ext.Component#method-destroy} function.     *     * Defaults to the value of this Container's {@link #autoDestroy} config.     *     * @return {Ext.Component} component The Component that was removed.     */    remove : function(comp, autoDestroy) {        var me = this,            c = me.getComponent(comp);        //<debug>            if (Ext.isDefined(Ext.global.console) && !c) {                Ext.global.console.warn("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.");            }        //</debug>        if (c && (!me.hasListeners.beforeremove || me.fireEvent('beforeremove', me, c) !== false)) {            me.doRemove(c, autoDestroy);            if (me.hasListeners.remove) {                me.fireEvent('remove', me, c);            }            if (!me.destroying) {                me.doLayout();            }        }        return c;    },    // @private    doRemove : function(component, autoDestroy) {        var me = this,            layout = me.layout,            hasLayout = layout && me.rendered,            destroying = autoDestroy === true || (autoDestroy !== false && me.autoDestroy);        autoDestroy = autoDestroy === true || (autoDestroy !== false && me.autoDestroy);        me.items.remove(component);        // Inform ownerLayout of removal before deleting the ownerLayout & ownerCt references in the onRemoved call        if (hasLayout) {            // Removing a component from a running layout has to cancel the layout            if (layout.running) {                Ext.AbstractComponent.cancelLayout(component, destroying);            }            layout.onRemove(component, destroying);        }        component.onRemoved(destroying);        me.onRemove(component, destroying);        // Destroy if we were explicitly told to, or we're defaulting to our autoDestroy configuration        if (destroying) {            component.destroy();        }        // Only have the layout perform remove postprocessing if the Component is not being destroyed        else {            if (hasLayout) {                layout.afterRemove(component);                   }            if (me.detachOnRemove && component.rendered) {                Ext.getDetachedBody().appendChild(component.getEl());            }        }    },<span id='Ext-container-AbstractContainer-method-removeAll'>    /**</span>     * Removes all components from this container.     * @param {Boolean} [autoDestroy] True to automatically invoke the removed     * Component's {@link Ext.Component#method-destroy} function.     * Defaults to the value of this Container's {@link #autoDestroy} config.     * @return {Ext.Component[]} Array of the removed components     */    removeAll : function(autoDestroy) {        var me = this,            removeItems = me.items.items.slice(),            items = [],            i = 0,            len = removeItems.length,            item;        // Suspend Layouts while we remove multiple items from the container        me.suspendLayouts();        for (; i < len; i++) {            item = removeItems[i];            me.remove(item, autoDestroy);            if (item.ownerCt !== me) {                items.push(item);            }        }        // Resume Layouts now that all items have been removed and do a single layout (if we removed anything!)        me.resumeLayouts(!!len);        return items;    },    // Used by ComponentQuery to retrieve all of the items    // which can potentially be considered a child of this Container.    // This should be overriden by components which have child items    // that are not contained in items. For example dockedItems, menu, etc    // IMPORTANT note for maintainers:    //  Items are returned in tree traversal order. Each item is appended to the result array    //  followed by the results of that child's getRefItems call.    //  Floating child items are appended after internal child items.    getRefItems : function(deep) {        var me = this,            items = me.items.items,            len = items.length,            i = 0,            item,            result = [];        for (; i < len; i++) {            item = items[i];            result.push(item);            if (deep && item.getRefItems) {                result.push.apply(result, item.getRefItems(true));            }        }        // Append floating items to the list.        if (me.floatingItems) {            result.push.apply(result, me.floatingItems.items);        }        return result;    },<span id='Ext-container-AbstractContainer-method-cascade'>    /**</span>     * Cascades down the component/container heirarchy from this component (passed in     * the first call), calling the specified function with each component. The scope     * (this reference) of the function call will be the scope provided or the current     * component. The arguments to the function will be the args provided or the current     * component. If the function returns false at any point, the cascade is stopped on     * that branch.     * @param {Function} fn The function to call     * @param {Object} [scope] The scope of the function (defaults to current component)     * @param {Array} [args] The args to call the function with. The current component     * always passed as the last argument.     * @return {Ext.Container} this     */    cascade : function(fn, scope, origArgs){        var me = this,            cs = me.items ? me.items.items : [],            len = cs.length,            i = 0,            c,            args = origArgs ? origArgs.concat(me) : [me],            componentIndex = args.length - 1;        if (fn.apply(scope || me, args) !== false) {            for (; i < len; i++){                c = cs[i];                if (c.cascade) {                    c.cascade(fn, scope, origArgs);                } else {                    args[componentIndex] = c;                    fn.apply(scope || cs, args);                }            }        }        return this;    },<span id='Ext-container-AbstractContainer-method-isAncestor'>    /**</span>     * Determines whether **this Container** is an ancestor of the passed Component.     * This will return `true` if the passed Component is anywhere within the subtree     * beneath this Container.     * @param {Ext.Component} possibleDescendant The Component to test for presence     * within this Container's subtree.     */    isAncestor: function(possibleDescendant) {        while (possibleDescendant) {            if (possibleDescendant.ownerCt === this) {                return true;            }            possibleDescendant = possibleDescendant.ownerCt;        }    },<span id='Ext-container-AbstractContainer-method-getComponent'>    /**</span>     * Examines this container's {@link #property-items} **property** and gets a direct child     * component of this container.     *     * @param {String/Number} comp This parameter may be any of the following:     *     * - a **String** : representing the {@link Ext.Component#itemId itemId}     *   or {@link Ext.Component#id id} of the child component.     * - a **Number** : representing the position of the child component     *   within the {@link #property-items} **property**     *     * For additional information see {@link Ext.util.MixedCollection#get}.     *     * @return {Ext.Component} The component (if found).     */    getComponent : function(comp) {        if (Ext.isObject(comp)) {            comp = comp.getItemId();        }        return this.items.get(comp);    },<span id='Ext-container-AbstractContainer-method-query'>    /**</span>     * Retrieves all descendant components which match the passed selector.     * Executes an Ext.ComponentQuery.query using this container as its root.     * @param {String} [selector] Selector complying to an Ext.ComponentQuery selector.     * If no selector is specified all items will be returned.     * @return {Ext.Component[]} Components which matched the selector     */    query : function(selector) {        selector = selector || '*';        return Ext.ComponentQuery.query(selector, this);    },    <span id='Ext-container-AbstractContainer-method-queryBy'>    /**</span>     * Retrieves all descendant components which match the passed function.     * The function should return false for components that are to be     * excluded from the selection.     * @param {Function} fn The matcher function. It will be called with a single argument,     * the component being tested.     * @param {Object} [scope] The scope in which to run the function. If not specified,     * it will default to the active component.     * @return {Ext.Component[]} Components matched by the passed function     */    queryBy: function(fn, scope) {        var out = [],            items = this.getRefItems(true),            i = 0,            len = items.length,            item;                    for (; i < len; ++i) {            item = items[i];            if (fn.call(scope || item, item) !== false) {                out.push(item);            }        }        return out;    },    <span id='Ext-container-AbstractContainer-method-queryById'>    /**</span>     * Finds a component at any level under this container matching the id/itemId.     * This is a shorthand for calling ct.down('#' + id);     * @param {String} id The id to find     * @return {Ext.Component} The matching id, null if not found     */    queryById: function(id){        return this.down('#' + id);    },<span id='Ext-container-AbstractContainer-method-child'>    /**</span>     * Retrieves the first direct child of this container which matches the passed selector.     * The passed in selector must comply with an Ext.ComponentQuery selector.     * @param {String} [selector] An Ext.ComponentQuery selector. If no selector is     * specified, the first child will be returned.     * @return Ext.Component     */    child : function(selector) {        selector = selector || '';        return this.query('> ' + selector)[0] || null;    },    nextChild: function(child, selector) {        var me = this,            result,            childIndex = me.items.indexOf(child);        if (childIndex !== -1) {            result = selector ? Ext.ComponentQuery(selector, me.items.items.slice(childIndex + 1)) : me.items.getAt(childIndex + 1);            if (!result && me.ownerCt) {                result = me.ownerCt.nextChild(me, selector);            }        }        return result;    },    prevChild: function(child, selector) {        var me = this,            result,            childIndex = me.items.indexOf(child);        if (childIndex !== -1) {            result = selector ? Ext.ComponentQuery(selector, me.items.items.slice(childIndex + 1)) : me.items.getAt(childIndex + 1);            if (!result && me.ownerCt) {                result = me.ownerCt.nextChild(me, selector);            }        }        return result;    },<span id='Ext-container-AbstractContainer-method-down'>    /**</span>     * Retrieves the first descendant of this container which matches the passed selector.     * The passed in selector must comply with an Ext.ComponentQuery selector.     * @param {String} [selector] An Ext.ComponentQuery selector. If no selector is     * specified, the first child will be returned.     * @return Ext.Component     */    down : function(selector) {        return this.query(selector)[0] || null;    },    // @private    // Enable all immediate children that was previously disabled    // Override enable because onEnable only gets called when rendered    enable: function() {        this.callParent(arguments);        var itemsToDisable = this.getChildItemsToDisable(),            length         = itemsToDisable.length,            item, i;        for (i = 0; i < length; i++) {            item = itemsToDisable[i];            if (item.resetDisable) {                item.enable();            }        }        return this;    },    // Inherit docs    // Disable all immediate children that was previously disabled    // Override disable because onDisable only gets called when rendered    disable: function() {        this.callParent(arguments);        var itemsToDisable = this.getChildItemsToDisable(),            length         = itemsToDisable.length,            item, i;        for (i = 0; i < length; i++) {            item = itemsToDisable[i];            if (item.resetDisable !== false && !item.disabled) {                item.disable();                item.resetDisable = true;            }        }        return this;    },    <span id='Ext-container-AbstractContainer-method-getChildItemsToDisable'>    /**</span>     * Gets a list of child components to enable/disable when the container is     * enabled/disabled     * @private     * @return {Ext.Component[]} Items to be enabled/disabled     */    getChildItemsToDisable: function(){        return this.query('[isFormField],button');    },<span id='Ext-container-AbstractContainer-method-beforeLayout'>    /**</span>     * Occurs before componentLayout is run. Returning false from this method     * will prevent the containerLayout from being executed.     *     * @template     * @protected     */    beforeLayout: function() {        return true;    },    // @private    beforeDestroy : function() {        var me = this,            items = me.items,            c;        if (items) {            while ((c = items.first())) {                me.doRemove(c, true);            }        }        Ext.destroy(            me.layout        );        me.callParent();    }});</pre></body></html>
 |