-<!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-container.AbstractContainer'>/**
+<!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> * @class Ext.container.AbstractContainer
* @extends Ext.Component
- * <p>An abstract base class which provides shared methods for Containers across the Sencha product line.</p>
- * Please refer to sub class's documentation
+ * An abstract base class which provides shared methods for Containers across the Sencha product line.
+ * @private
*/
Ext.define('Ext.container.AbstractContainer', {
],
/* End Definitions */
-<span id='Ext-container.AbstractContainer-cfg-layout'> /**
+<span id='Ext-container-AbstractContainer-cfg-layout'> /**
</span> * @cfg {String/Object} layout
- * <p><b>*Important</b>: In order for child items to be correctly sized and
+ * <p><b>Important</b>: In order for child items to be correctly sized and
* positioned, typically a layout manager <b>must</b> be specified through
* the <code>layout</code> configuration option.</p>
- * <br><p>The sizing and positioning of child {@link #items} is the responsibility of
+ * <p>The sizing and positioning of child {@link #items} is the responsibility of
* the Container's layout manager which creates and manages the type of layout
* you have in mind. For example:</p>
* <p>If the {@link #layout} configuration is not explicitly specified for
* {@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).</p>
- * <br><p><b><code>layout</code></b> may be specified as either as an Object or
- * as a String:</p><div><ul class="mdetail-params">
- *
+ * <p><b><code>layout</code></b> may be specified as either as an Object or as a String:</p>
+ * <div><ul class="mdetail-params">
* <li><u>Specify as an Object</u></li>
* <div><ul class="mdetail-params">
* <li>Example usage:</li>
* <li><code><b>type</b></code></li>
* <br/><p>The layout type to be used for this container. If not specified,
* a default {@link Ext.layout.container.Auto} will be created and used.</p>
- * <br/><p>Valid layout <code>type</code> values are:</p>
+ * <p>Valid layout <code>type</code> values are:</p>
* <div class="sub-desc"><ul class="mdetail-params">
* <li><code><b>{@link Ext.layout.container.Auto Auto}</b></code> &nbsp;&nbsp;&nbsp; <b>Default</b></li>
* <li><code><b>{@link Ext.layout.container.Card card}</b></code></li>
* </ul></div>
*
* <li>Layout specific configuration properties</li>
- * <br/><p>Additional layout specific configuration properties may also be
+ * <p>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 <code>type</code>
* specified.</p>
* <div><ul class="mdetail-params">
* <li>Example usage:</li>
* <pre><code>
-layout: {
- type: 'vbox',
- padding: '5',
- align: 'left'
-}
+layout: 'vbox'
</code></pre>
* <li><code><b>layout</b></code></li>
- * <br/><p>The layout <code>type</code> to be used for this container (see list
- * of valid layout type values above).</p><br/>
- * <br/><p>Additional layout specific configuration properties. For complete
+ * <p>The layout <code>type</code> to be used for this container (see list
+ * of valid layout type values above).</p>
+ * <p>Additional layout specific configuration properties. For complete
* details regarding the valid config options for each layout type, see the
* layout class corresponding to the <code>layout</code> specified.</p>
* </ul></div></ul></div>
*/
-<span id='Ext-container.AbstractContainer-cfg-activeItem'> /**
+<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/Array} items
+<span id='Ext-container-AbstractContainer-cfg-items'> /**
+</span> * @cfg {Object/Object[]} items
* <p>A single item, or an array of child Components to be added to this container</p>
* <p><b>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.</b><p>
* <p>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.</p>
- * <p>Do not specify <code>{@link Ext.panel.Panel#contentEl contentEl}</code> or
+ * <p>Do not specify <code>{@link Ext.panel.Panel#contentEl contentEl}</code> or
* <code>{@link Ext.panel.Panel#html html}</code> with <code>items</code>.</p>
*/
-<span id='Ext-container.AbstractContainer-cfg-defaults'> /**
-</span> * @cfg {Object|Function} defaults
- * <p>This option is a means of applying default settings to all added items whether added through the {@link #items}
- * config or via the {@link #add} or {@link #insert} methods.</p>
- * <p>If an added item is a config object, and <b>not</b> an instantiated Component, then the default properties are
- * unconditionally applied. If the added item <b>is</b> an instantiated Component, then the default properties are
- * applied conditionally so as not to override existing properties in the item.</p>
- * <p>If the defaults option is specified as a function, then the function will be called using this Container as the
- * scope (<code>this</code> 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.</p>
- * <p>For example, to automatically apply padding to the body of each of a set of
- * contained {@link Ext.panel.Panel} items, you could pass: <code>defaults: {bodyStyle:'padding:15px'}</code>.</p>
- * <p>Usage:</p><pre><code>
-defaults: { // defaults are applied to items, not the container
- autoScroll:true
-},
-items: [
- {
- xtype: 'panel', // defaults <b>do not</b> have precedence over
- id: 'panel1', // options in config objects, so the defaults
- autoScroll: false // will not be applied here, panel1 will be autoScroll:false
- },
- new Ext.panel.Panel({ // defaults <b>do</b> have precedence over options
- id: 'panel2', // options in components, so the defaults
- autoScroll: false // will be applied here, panel2 will be autoScroll:true.
- })
-]</code></pre>
+<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 #items}
+ * config or via the {@link #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'> /** @cfg {Boolean} suspendLayout
+<span id='Ext-container-AbstractContainer-cfg-suspendLayout'> /** @cfg {Boolean} suspendLayout
</span> * 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'> /** @cfg {Boolean} autoDestroy
+<span id='Ext-container-AbstractContainer-cfg-autoDestroy'> /** @cfg {Boolean} autoDestroy
</span> * If true the container will automatically destroy any contained component that is removed from it, else
* destruction must be handled manually.
* Defaults to true.
*/
autoDestroy : true,
-<span id='Ext-container.AbstractContainer-cfg-defaultType'> /** @cfg {String} defaultType
+<span id='Ext-container-AbstractContainer-cfg-defaultType'> /** @cfg {String} defaultType
</span> * <p>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.</p>
* <p>Defaults to <code>'panel'</code>.</p>
isContainer : true,
+<span id='Ext-container-AbstractContainer-property-layoutCounter'> /**
+</span> * The number of container layout calls made on this object.
+ * @property layoutCounter
+ * @type {Number}
+ * @private
+ */
+ layoutCounter : 0,
+
baseCls: Ext.baseCSSPrefix + 'container',
-<span id='Ext-container.AbstractContainer-cfg-bubbleEvents'> /**
-</span> * @cfg {Array} bubbleEvents
+<span id='Ext-container-AbstractContainer-cfg-bubbleEvents'> /**
+</span> * @cfg {String[]} bubbleEvents
* <p>An array of events that, when fired, should be bubbled to any parent container.
* See {@link Ext.util.Observable#enableBubble}.
* Defaults to <code>['add', 'remove']</code>.
*/
bubbleEvents: ['add', 'remove'],
-
+
// @private
initComponent : function(){
var me = this;
me.addEvents(
-<span id='Ext-container.AbstractContainer-event-afterlayout'> /**
+<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 {ContainerLayout} layout The ContainerLayout implementation for this container
+ * @param {Ext.layout.container.Container} layout The ContainerLayout implementation for this container
*/
'afterlayout',
-<span id='Ext-container.AbstractContainer-event-beforeadd'> /**
+<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 {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 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.Component} component The component being removed
*/
'beforeremove',
-<span id='Ext-container.AbstractContainer-event-add'> /**
+<span id='Ext-container-AbstractContainer-event-add'> /**
</span> * @event add
* @bubbles
* Fires after any {@link Ext.Component} is added or inserted into the container.
* @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 id='Ext-container-AbstractContainer-event-remove'> /**
</span> * @event remove
* @bubbles
* Fires after any {@link Ext.Component} is removed from the container.
* @param {Ext.container.Container} this
* @param {Ext.Component} component The component that was removed
*/
- 'remove',
-<span id='Ext-container.AbstractContainer-event-beforecardswitch'> /**
-</span> * @event beforecardswitch
- * Fires before this container switches the active card. This event
- * is only available if this container uses a CardLayout. Note that
- * TabPanel and Carousel both get a CardLayout by default, so both
- * will have this event.
- * A handler can return false to cancel the card switch.
- * @param {Ext.container.Container} this
- * @param {Ext.Component} newCard The card that will be switched to
- * @param {Ext.Component} oldCard The card that will be switched from
- * @param {Number} index The index of the card that will be switched to
- * @param {Boolean} animated True if this cardswitch will be animated
- */
- 'beforecardswitch',
-<span id='Ext-container.AbstractContainer-event-cardswitch'> /**
-</span> * @event cardswitch
- * Fires after this container switches the active card. If the card
- * is switched using an animation, this event will fire after the
- * animation has finished. This event is only available if this container
- * uses a CardLayout. Note that TabPanel and Carousel both get a CardLayout
- * by default, so both will have this event.
- * @param {Ext.container.Container} this
- * @param {Ext.Component} newCard The card that has been switched to
- * @param {Ext.Component} oldCard The card that has been switched from
- * @param {Number} index The index of the card that has been switched to
- * @param {Boolean} animated True if this cardswitch was animated
- */
- 'cardswitch'
+ 'remove'
);
// layoutOnShow stack
var me = this,
items = me.items;
-<span id='Ext-container.AbstractContainer-property-items'> /**
+<span id='Ext-container-AbstractContainer-property-items'> /**
</span> * The MixedCollection containing all the child items of this container.
* @property items
* @type Ext.util.MixedCollection
this.callParent();
},
+ renderChildren: function () {
+ var me = this,
+ layout = me.getLayout();
+
+ me.callParent();
+ // this component's elements exist, so now create the child components' elements
+
+ if (layout) {
+ me.suspendLayout = true;
+ layout.renderChildren();
+ delete me.suspendLayout;
+ }
+ },
+
// @private
setLayout : function(layout) {
var currentLayout = this.layout;
layout.setOwner(this);
},
-<span id='Ext-container.AbstractContainer-method-getLayout'> /**
+<span id='Ext-container-AbstractContainer-method-getLayout'> /**
</span> * Returns the {@link Ext.layout.container.AbstractContainer layout} instance currently associated with this Container.
* If a layout has not been instantiated yet, that is done first
* @return {Ext.layout.container.AbstractContainer} The layout
return me.layout;
},
-<span id='Ext-container.AbstractContainer-method-doLayout'> /**
-</span> * Manually force this container's layout to be recalculated. The framwork uses this internally to refresh layouts
+<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
*/
if (me.rendered && layout && !me.suspendLayout) {
// If either dimension is being auto-set, then it requires a ComponentLayout to be run.
- if ((!Ext.isNumber(me.width) || !Ext.isNumber(me.height)) && me.componentLayout.type !== 'autocomponent') {
+ if (!me.isFixedWidth() || !me.isFixedHeight()) {
// Only run the ComponentLayout if it is not already in progress
if (me.componentLayout.layoutBusy !== true) {
me.doComponentLayout();
}
}
}
- // Both dimensions defined, run a ContainerLayout
+ // Both dimensions set, either by configuration, or by an owning layout, run a ContainerLayout
else {
// Only run the ContainerLayout if it is not already in progress
if (layout.layoutBusy !== true) {
// @private
afterLayout : function(layout) {
+ ++this.layoutCounter;
this.fireEvent('afterlayout', this, layout);
},
if (Ext.isString(config)) {
config = Ext.ComponentManager.get(config);
- Ext.applyIf(config, defaults);
- } else if (!config.isComponent) {
- Ext.applyIf(config, defaults);
- } else {
- Ext.applyIf(config, defaults);
}
+ Ext.applyIf(config, defaults);
}
return config;
return comp.getItemId();
},
-<span id='Ext-container.AbstractContainer-method-add'> /**
+<span id='Ext-container-AbstractContainer-method-add'> /**
</span>
Adds {@link Ext.Component Component}(s) to this Container.
}); // toolbar is rendered
tb.add([{text:'Button 1'}, {text:'Button 2'}]); // add multiple items. ({@link #defaultType} for {@link Ext.toolbar.Toolbar Toolbar} is 'button')
-##Warning:##
+##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 {...Object/Array} Component
+ * @param {Ext.Component[]/Ext.Component...} component
* Either one or more Components to add or an Array of Components to add.
* See `{@link #items}` for additional information.
*
- * @return {Ext.Component/Array} The Components that were added.
+ * @return {Ext.Component[]/Ext.Component} The Components that were added.
* @markdown
*/
add : function() {
me.suspendLayout = true;
for (i = 0, ln = items.length; i < ln; i++) {
item = items[i];
-
+
//<debug>
if (!item) {
Ext.Error.raise("Trying to add a null item as a child of Container with itemId/id: " + me.getItemId());
}
//</debug>
-
+
if (index != -1) {
item = me.add(index + i, item);
} else {
return cmp;
},
-<span id='Ext-container.AbstractContainer-method-registerFloatingItem'> /**
-</span> * @private
- * <p>Called by Component#doAutoRender</p>
- * <p>Register a Container configured <code>floating: true</code> with this Container's {@link Ext.ZIndexManager ZIndexManager}.</p>
- * <p>Components added in ths way will not participate in the layout, but will be rendered
- * upon first show in the way that {@link Ext.window.Window Window}s are.</p>
- * <p></p>
- */
- registerFloatingItem: function(cmp) {
- var me = this;
- if (!me.floatingItems) {
- me.floatingItems = Ext.create('Ext.ZIndexManager', me);
- }
- me.floatingItems.register(cmp);
- },
-
onAdd : Ext.emptyFn,
onRemove : Ext.emptyFn,
-<span id='Ext-container.AbstractContainer-method-insert'> /**
+<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 #add} event after the
* Component has been inserted.
return this.add(index, comp);
},
-<span id='Ext-container.AbstractContainer-method-move'> /**
+<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.
// @private
onBeforeAdd : function(item) {
var me = this;
-
+
if (item.ownerCt) {
item.ownerCt.remove(item, false);
}
}
},
-<span id='Ext-container.AbstractContainer-method-remove'> /**
+<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 #remove} event after the component has been removed.
- * @param {Component/String} component The component reference or id to remove.
+ * @param {Ext.Component/String} component The component reference or id to remove.
* @param {Boolean} autoDestroy (optional) True to automatically invoke the removed Component's {@link Ext.Component#destroy} function.
* Defaults to the value of this Container's {@link #autoDestroy} config.
* @return {Ext.Component} component The Component that was removed.
}
},
-<span id='Ext-container.AbstractContainer-method-removeAll'> /**
+<span id='Ext-container-AbstractContainer-method-removeAll'> /**
</span> * Removes all components from this container.
* @param {Boolean} autoDestroy (optional) True to automatically invoke the removed Component's {@link Ext.Component#destroy} function.
* Defaults to the value of this Container's {@link #autoDestroy} config.
- * @return {Array} Array of the destroyed components
+ * @return {Ext.Component[]} Array of the destroyed components
*/
removeAll : function(autoDestroy) {
var me = this,
}
}
- // Resume Layouts now that all items have been removed and do a single layout
+ // Resume Layouts now that all items have been removed and do a single layout (if we removed anything!)
me.suspendLayout = false;
- me.doLayout();
+ if (len) {
+ me.doLayout();
+ }
return items;
},
return result;
},
-<span id='Ext-container.AbstractContainer-method-cascade'> /**
+<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 (<code>this</code> 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 (optional) The scope of the function (defaults to current component)
- * @param {Array} args (optional) The args to call the function with. The current component always passed as the last argument.
+ * @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){
return this;
},
-<span id='Ext-container.AbstractContainer-method-getComponent'> /**
+<span id='Ext-container-AbstractContainer-method-getComponent'> /**
</span> * Examines this container's <code>{@link #items}</code> <b>property</b>
* and gets a direct child component of this container.
* @param {String/Number} comp This parameter may be any of the following:
return this.items.get(comp);
},
-<span id='Ext-container.AbstractContainer-method-query'> /**
+<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
- * @return {Array} Ext.Component's which matched the selector
+ * @param {String} selector (optional) 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-child'> /**
+<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
+ * @param {String} selector (optional) 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;
},
-<span id='Ext-container.AbstractContainer-method-down'> /**
+<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
+ * @param {String} selector (optional) An Ext.ComponentQuery selector. If no selector is
+ * specified, the first child will be returned.
* @return Ext.Component
*/
down : function(selector) {
}
}
layoutCollection.clear();
- },
-
+ },
+
//@private
// Enable all immediate children that was previously disabled
onEnable: function() {
Ext.Array.each(this.query('[isFormField]'), function(item) {
if (item.resetDisable) {
item.enable();
- delete item.resetDisable;
+ delete item.resetDisable;
}
});
this.callParent();
},
-
+
// @private
// Disable all immediate children that was previously disabled
onDisable: function() {
this.callParent();
},
-<span id='Ext-container.AbstractContainer-method-beforeLayout'> /**
+<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.
*/
}
Ext.destroy(
- me.layout,
- me.floatingItems
+ me.layout
);
me.callParent();
}
-});</pre></pre></body></html>
\ No newline at end of file
+});
+</pre>
+</body>
+</html>