/** * @class Ext.lib.Panel * @extends Ext.Container * Shared Panel class */ Ext.lib.Panel = Ext.extend(Ext.Container, {
/** * @cfg {String} baseCls * The base CSS class to apply to this panel's element (defaults to 'x-panel'). */ baseCls : 'x-panel',
/** * @cfg {Number/Boolean} bodyPadding * A shortcut for setting a padding style on the body element. The value can either be * a number to be applied to all sides, or a normal css string describing padding. * Defaults to undefined. */
/** * @cfg {Number/Boolean} bodyMargin * A shortcut for setting a margin style on the body element. The value can either be * a number to be applied to all sides, or a normal css string describing margins. * Defaults to undefined. */
/** * @cfg {Number/Boolean} bodyBorder * A shortcut for setting a border style on the body element. The value can either be * a number to be applied to all sides, or a normal css string describing borders. * Defaults to undefined. */ isPanel: true, componentLayout: 'dock', renderTpl: ['
{bodyCls}" style="{bodyStyle}">
'],
/** * @cfg {Object/Array} dockedItems * A component or series of components to be added as docked items to this panel. * The docked items can be docked to either the top, right, left or bottom of a panel. * This is typically used for things like toolbars or tab bars: *

var panel = new Ext.Panel({
    fullscreen: true,
    dockedItems: [{
        xtype: 'toolbar',
        dock: 'top',
        items: [{
            text: 'Docked to the bottom'
        }]
    }]
});
*/ initComponent : function() { this.addEvents(
/** * @event bodyresize * Fires after the Panel has been resized. * @param {Ext.Panel} p the Panel which has been resized. * @param {Number} width The Panel body's new width. * @param {Number} height The Panel body's new height. */ 'bodyresize' // // inherited // 'activate', // // inherited // 'deactivate' ); Ext.applyIf(this.renderSelectors, { body: '.' + this.baseCls + '-body' }); Ext.lib.Panel.superclass.initComponent.call(this); }, // @private initItems : function() { Ext.lib.Panel.superclass.initItems.call(this); var items = this.dockedItems; this.dockedItems = new Ext.util.MixedCollection(false, this.getComponentId); if (items) { this.addDocked(items); } },
/** * Finds a docked component by id, itemId or position * @param {String/Number} comp The id, itemId or position of the child component (see {@link #getComponent} for details) * @return {Ext.Component} The component (if found) */ getDockedComponent: function(comp) { if (Ext.isObject(comp)) { comp = comp.getItemId(); } return this.dockedItems.get(comp); },
/** * Attempts a default component lookup (see {@link Ext.Container#getComponent}). If the component is not found in the normal * items, the dockedItems are searched and the matched component (if any) returned (see {@loink #getDockedComponent}). * @param {String/Number} comp The docked component id or itemId to find * @return {Ext.Component} The docked component, if found */ getComponent: function(comp) { var component = Ext.lib.Panel.superclass.getComponent.call(this, comp); if (component == undefined) { component = this.getDockedComponent(comp); } return component; }, /** * Function description * @return {String} A CSS style string with style, padding, margin and border. * @private */ initBodyStyles: function() { var bodyStyle = Ext.isString(this.bodyStyle) ? this.bodyStyle.split(';') : [], Element = Ext.Element; if (this.bodyPadding != undefined) { bodyStyle.push('padding: ' + Element.unitizeBox((this.bodyPadding === true) ? 5 : this.bodyPadding)); } if (this.bodyMargin != undefined) { bodyStyle.push('margin: ' + Element.unitizeBox((this.bodyMargin === true) ? 5 : this.bodyMargin)); } if (this.bodyBorder != undefined) { bodyStyle.push('border-width: ' + Element.unitizeBox((this.bodyBorder === true) ? 1 : this.bodyBorder)); } delete this.bodyStyle; return bodyStyle.length ? bodyStyle.join(';') : undefined; }, /** * Initialized the renderData to be used when rendering the renderTpl. * @return {Object} Object with keys and values that are going to be applied to the renderTpl * @private */ initRenderData: function() { return Ext.applyIf(Ext.lib.Panel.superclass.initRenderData.call(this), { bodyStyle: this.initBodyStyles(), bodyCls: this.bodyCls }); },
/** * Adds docked item(s) to the panel. * @param {Object/Array} component. The Component or array of components to add. The components * must include a 'dock' paramater on each component to indicate where it should be docked ('top', 'right', * 'bottom', 'left'). * @param {Number} pos (optional) The index at which the Component will be added */ addDocked : function(items, pos) { items = this.prepareItems(items); var item, i, ln; for (i = 0, ln = items.length; i < ln; i++) { item = items[i]; item.dock = item.dock || 'top'; if (pos !== undefined) { this.dockedItems.insert(pos+i, item); } else { this.dockedItems.add(item); } item.onAdded(this, i); this.onDockedAdd(item); } if (this.rendered) { this.doComponentLayout(); } }, // Placeholder empty functions onDockedAdd : Ext.emptyFn, onDockedRemove : Ext.emptyFn,
/** * Inserts docked item(s) to the panel at the indicated position. * @param {Number} pos The index at which the Component will be inserted * @param {Object/Array} component. The Component or array of components to add. The components * must include a 'dock' paramater on each component to indicate where it should be docked ('top', 'right', * 'bottom', 'left'). */ insertDocked : function(pos, items) { this.addDocked(items, pos); },
/** * Removes the docked item from the panel. * @param {Ext.Component} item. The Component to remove. * @param {Boolean} autoDestroy (optional) Destroy the component after removal. */ removeDocked : function(item, autoDestroy) { if (!this.dockedItems.contains(item)) { return item; } var layout = this.componentLayout, hasLayout = layout && this.rendered; if (hasLayout) { layout.onRemove(item); } this.dockedItems.remove(item); item.onRemoved(); this.onDockedRemove(item); if (autoDestroy === true || (autoDestroy !== false && this.autoDestroy)) { item.destroy(); } if (hasLayout && !autoDestroy) { layout.afterRemove(item); } this.doComponentLayout(); return item; },
/** * Retrieve an array of all currently docked components. * @return {Array} An array of components. */ getDockedItems : function() { if (this.dockedItems && this.dockedItems.items.length) { return this.dockedItems.items.slice(); } return []; }, // @private getTargetEl : function() { return this.body; }, getRefItems: function(deep) { var refItems = Ext.lib.Panel.superclass.getRefItems.call(this, deep), // deep does not account for dockedItems within dockedItems. dockedItems = this.getDockedItems(), ln = dockedItems.length, i = 0, item; refItems = refItems.concat(dockedItems); if (deep) { for (; i < ln; i++) { item = dockedItems[i]; if (item.getRefItems) { refItems = refItems.concat(item.getRefItems(true)); } } } return refItems; }, beforeDestroy: function(){ var docked = this.dockedItems, c; if (docked) { while ((c = docked.first())) { this.removeDocked(c, true); } } Ext.lib.Panel.superclass.beforeDestroy.call(this); } });