/** * @class Ext.layout.BoxLayout * @extends Ext.layout.ContainerLayout *

Base Class for HBoxLayout and VBoxLayout Classes. Generally it should not need to be used directly.

*/ Ext.layout.BoxLayout = Ext.extend(Ext.layout.ContainerLayout, {
/** * @cfg {Object} defaultMargins *

If the individual contained items do not have a margins * property specified, the default margins from this property will be * applied to each item.

*

This property may be specified as an object containing margins * to apply in the format:


{
    top: (top margin),
    right: (right margin),
    bottom: (bottom margin),
    left: (left margin)
}
*

This property may also be specified as a string containing * space-separated, numeric margin values. The order of the sides associated * with each value matches the way CSS processes margin values:

*
*

Defaults to:


     * {top:0, right:0, bottom:0, left:0}
     * 
*/ defaultMargins : {left:0,top:0,right:0,bottom:0},
/** * @cfg {String} padding *

Sets the padding to be applied to all child items managed by this layout.

*

This property must be specified as a string containing * space-separated, numeric padding values. The order of the sides associated * with each value matches the way CSS processes padding values:

*
*

Defaults to: "0"

*/ padding : '0', // documented in subclasses pack : 'start', // private monitorResize : true, type: 'box', scrollOffset : 0, extraCls : 'x-box-item', targetCls : 'x-box-layout-ct', innerCls : 'x-box-inner', constructor : function(config){ Ext.layout.BoxLayout.superclass.constructor.call(this, config); if(Ext.isString(this.defaultMargins)){ this.defaultMargins = this.parseMargins(this.defaultMargins); } }, // private isValidParent : function(c, target){ return this.innerCt && c.getPositionEl().dom.parentNode == this.innerCt.dom; }, // private renderAll : function(ct, target){ if(!this.innerCt){ // the innerCt prevents wrapping and shuffling while // the container is resizing this.innerCt = target.createChild({cls:this.innerCls}); this.padding = this.parseMargins(this.padding); } Ext.layout.BoxLayout.superclass.renderAll.call(this, ct, this.innerCt); }, onLayout : function(ct, target){ this.renderAll(ct, target); }, getLayoutTargetSize : function(){ var target = this.container.getLayoutTarget(), ret; if (target) { ret = target.getViewSize(); ret.width -= target.getPadding('lr'); ret.height -= target.getPadding('tb'); } return ret; }, // private renderItem : function(c){ if(Ext.isString(c.margins)){ c.margins = this.parseMargins(c.margins); }else if(!c.margins){ c.margins = this.defaultMargins; } Ext.layout.BoxLayout.superclass.renderItem.apply(this, arguments); } });
/** * @class Ext.layout.VBoxLayout * @extends Ext.layout.BoxLayout *

A layout that arranges items vertically down a Container. This layout optionally divides available vertical * space between child items containing a numeric flex configuration.

* This layout may also be used to set the widths of child items by configuring it with the {@link #align} option. */ Ext.layout.VBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
/** * @cfg {String} align * Controls how the child items of the container are aligned. Acceptable configuration values for this * property are: *
*/ align : 'left', // left, center, stretch, strechmax type: 'vbox',
/** * @cfg {String} pack * Controls how the child items of the container are packed together. Acceptable configuration values * for this property are: *
*/
/** * @cfg {Number} flex * This configuation option is to be applied to child items of the container managed * by this layout. Each child item with a flex property will be flexed vertically * according to each item's relative flex value compared to the sum of all items with * a flex value specified. Any child items that have either a flex = 0 or * flex = undefined will not be 'flexed' (the initial size will not be changed). */ // private onLayout : function(ct, target){ Ext.layout.VBoxLayout.superclass.onLayout.call(this, ct, target); var cs = this.getRenderedItems(ct), csLen = cs.length, c, i, cm, ch, margin, cl, diff, aw, availHeight, size = this.getLayoutTargetSize(), w = size.width, h = size.height - this.scrollOffset, l = this.padding.left, t = this.padding.top, isStart = this.pack == 'start', extraHeight = 0, maxWidth = 0, totalFlex = 0, usedHeight = 0, idx = 0, heights = [], restore = []; // Do only width calculations and apply those first, as they can affect height for (i = 0 ; i < csLen; i++) { c = cs[i]; cm = c.margins; margin = cm.top + cm.bottom; // Max height for align maxWidth = Math.max(maxWidth, c.getWidth() + cm.left + cm.right); } var innerCtWidth = maxWidth + this.padding.left + this.padding.right; switch(this.align){ case 'stretch': this.innerCt.setSize(w, h); break; case 'stretchmax': case 'left': this.innerCt.setSize(innerCtWidth, h); break; case 'center': this.innerCt.setSize(w = Math.max(w, innerCtWidth), h); break; } var availableWidth = Math.max(0, w - this.padding.left - this.padding.right); // Apply widths for (i = 0 ; i < csLen; i++) { c = cs[i]; cm = c.margins; if(this.align == 'stretch'){ c.setWidth(((w - (this.padding.left + this.padding.right)) - (cm.left + cm.right)).constrain( c.minWidth || 0, c.maxWidth || 1000000)); }else if(this.align == 'stretchmax'){ c.setWidth((maxWidth - (cm.left + cm.right)).constrain( c.minWidth || 0, c.maxWidth || 1000000)); }else if(isStart && c.flex){ c.setWidth(); } } // Height calculations for (i = 0 ; i < csLen; i++) { c = cs[i]; // Total of all the flex values totalFlex += c.flex || 0; // Don't run height calculations on flexed items if (!c.flex) { // Render and layout sub-containers without a flex or height, once if (!c.height && !c.hasLayout && c.doLayout) { c.doLayout(); } ch = c.getHeight(); } else { ch = 0; } cm = c.margins; // Determine how much height is available to flex extraHeight += ch + cm.top + cm.bottom; } // Final avail height calc availHeight = Math.max(0, (h - extraHeight - this.padding.top - this.padding.bottom)); var leftOver = availHeight; for (i = 0 ; i < csLen; i++) { c = cs[i]; if(isStart && c.flex){ ch = Math.floor(availHeight * (c.flex / totalFlex)); leftOver -= ch; heights.push(ch); } } if(this.pack == 'center'){ t += availHeight ? availHeight / 2 : 0; }else if(this.pack == 'end'){ t += availHeight; } idx = 0; // Apply heights for (i = 0 ; i < csLen; i++) { c = cs[i]; cm = c.margins; t += cm.top; aw = availableWidth; cl = l + cm.left // default left pos // Adjust left pos for centering if(this.align == 'center'){ if((diff = availableWidth - (c.getWidth() + cm.left + cm.right)) > 0){ cl += (diff/2); aw -= diff; } } c.setPosition(cl, t); if(isStart && c.flex){ ch = Math.max(0, heights[idx++] + (leftOver-- > 0 ? 1 : 0)); c.setSize(aw, ch); }else{ ch = c.getHeight(); } t += ch + cm.bottom; } // Putting a box layout into an overflowed container is NOT correct and will make a second layout pass necessary. if (i = target.getStyle('overflow') && i != 'hidden' && !this.adjustmentPass) { var ts = this.getLayoutTargetSize(); if (ts.width != size.width || ts.height != size.height){ this.adjustmentPass = true; this.onLayout(ct, target); } } delete this.adjustmentPass; } }); Ext.Container.LAYOUTS.vbox = Ext.layout.VBoxLayout;
/** * @class Ext.layout.HBoxLayout * @extends Ext.layout.BoxLayout *

A layout that arranges items horizontally across a Container. This layout optionally divides available horizontal * space between child items containing a numeric flex configuration.

* This layout may also be used to set the heights of child items by configuring it with the {@link #align} option. */ Ext.layout.HBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
/** * @cfg {String} align * Controls how the child items of the container are aligned. Acceptable configuration values for this * property are: *