| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864 | <!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-layout-container-Border'>/**</span> * This is a multi-pane, application-oriented UI layout style that supports multiple nested panels, automatic bars * between regions and built-in {@link Ext.panel.Panel#collapsible expanding and collapsing} of regions. * * This class is intended to be extended or created via the `layout:'border'` {@link Ext.container.Container#layout} * config, and should generally not need to be created directly via the new keyword. * *     @example *     Ext.create('Ext.panel.Panel', { *         width: 500, *         height: 300, *         title: 'Border Layout', *         layout: 'border', *         items: [{ *             title: 'South Region is resizable', *             region: 'south',     // position for region *             xtype: 'panel', *             height: 100, *             split: true,         // enable resizing *             margins: '0 5 5 5' *         },{ *             // xtype: 'panel' implied by default *             title: 'West Region is collapsible', *             region:'west', *             xtype: 'panel', *             margins: '5 0 0 5', *             width: 200, *             collapsible: true,   // make collapsible *             id: 'west-region-container', *             layout: 'fit' *         },{ *             title: 'Center Region', *             region: 'center',     // center region is required, no width/height specified *             xtype: 'panel', *             layout: 'fit', *             margins: '5 5 0 0' *         }], *         renderTo: Ext.getBody() *     }); * * # Notes *  *   - When using the split option, the layout will automatically insert a {@link Ext.resizer.Splitter} *     into the appropriate place. This will modify the underlying *     {@link Ext.container.Container#property-items items} collection in the container. * *   - Any Container using the Border layout **must** have a child item with `region:'center'`. *     The child item in the center region will always be resized to fill the remaining space *     not used by the other regions in the layout. * *   - Any child items with a region of `west` or `east` may be configured with either an initial *     `width`, or a {@link Ext.layout.container.Box#flex} value, or an initial percentage width *     **string** (Which is simply divided by 100 and used as a flex value). *     The 'center' region has a flex value of `1`. * *   - Any child items with a region of `north` or `south` may be configured with either an initial *     `height`, or a {@link Ext.layout.container.Box#flex} value, or an initial percentage height *     **string** (Which is simply divided by 100 and used as a flex value). *     The 'center' region has a flex value of `1`. * *   - **There is no BorderLayout.Region class in ExtJS 4.0+** */Ext.define('Ext.layout.container.Border', {    alias: 'layout.border',    extend: 'Ext.layout.container.Container',    requires: ['Ext.resizer.BorderSplitter', 'Ext.Component', 'Ext.fx.Anim'],    alternateClassName: 'Ext.layout.BorderLayout',    targetCls: Ext.baseCSSPrefix + 'border-layout-ct',    itemCls: [Ext.baseCSSPrefix + 'border-item', Ext.baseCSSPrefix + 'box-item'],    type: 'border',<span id='Ext-layout-container-Border-cfg-split'>    /**</span>     * @cfg {Boolean} split     * This configuration option is to be applied to the **child `items`** managed by this layout.     * Each region with `split:true` will get a {@link Ext.resizer.BorderSplitter Splitter} that     * allows for manual resizing of the container. Except for the `center` region.     */    <span id='Ext-layout-container-Border-cfg-splitterResize'>    /**</span>     * @cfg {Boolean} [splitterResize=true]     * This configuration option is to be applied to the **child `items`** managed by this layout and     * is used in conjunction with {@link #split}. By default, when specifying {@link #split}, the region     * can be dragged to be resized. Set this option to false to show the split bar but prevent resizing.     */<span id='Ext-layout-container-Border-cfg-padding'>    /**</span>     * @cfg {Number/String/Object} padding     * Sets the padding to be applied to all child items managed by this layout.     *      * This property can 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:     *     *  - If there is only one value, it applies to all sides.     *  - If there are two values, the top and bottom borders are set to the first value     *    and the right and left are set to the second.     *  - If there are three values, the top is set to the first value, the left and right     *    are set to the second, and the bottom is set to the third.     *  - If there are four values, they apply to the top, right, bottom, and left,     *    respectively.     *     */    padding: undefined,    percentageRe: /(\d+)%/,<span id='Ext-layout-container-Border-property-axisProps'>    /**</span>     * Reused meta-data objects that describe axis properties.     * @private     */    axisProps: {        horz: {            borderBegin: 'west',            borderEnd: 'east',            horizontal: true,            posProp: 'x',            sizeProp: 'width',            sizePropCap: 'Width'        },        vert: {            borderBegin: 'north',            borderEnd: 'south',            horizontal: false,            posProp: 'y',            sizeProp: 'height',            sizePropCap: 'Height'        }    },    // @private    centerRegion: null,<span id='Ext-layout-container-Border-property-collapseDirections'>    /**</span>     * Maps from region name to collapseDirection for panel.     * @private     */    collapseDirections: {        north: 'top',        south: 'bottom',        east: 'right',        west: 'left'    },    manageMargins: true,    panelCollapseAnimate: true,    panelCollapseMode: 'placeholder',<span id='Ext-layout-container-Border-cfg-regionWeights'>    /**</span>     * @cfg {Object} regionWeights     * The default weights to assign to regions in the border layout. These values are     * used when a region does not contain a `weight` property. This object must have     * properties for all regions ("north", "south", "east" and "west").     *      * **IMPORTANT:** Since this is an object, changing its properties will impact ALL     * instances of Border layout. If this is not desired, provide a replacement object as     * a config option instead:     *      *      layout: {     *          type: 'border',     *          regionWeights: {     *              west: 20,     *              north: 10,     *              south: -10,     *              east: -20     *          }     *      }     *     * The region with the highest weight is assigned space from the border before other     * regions. Regions of equal weight are assigned space based on their position in the     * owner's items list (first come, first served).     */    regionWeights: {        north: 20,        south: 10,        center: 0,        west: -10,        east: -20    },    //----------------------------------    // Layout processing<span id='Ext-layout-container-Border-method-beginAxis'>    /**</span>     * Creates the axis objects for the layout. These are only missing size information     * which is added during {@link #calculate}.     * @private     */    beginAxis: function (ownerContext, regions, name) {        var me = this,            props = me.axisProps[name],            isVert = !props.horizontal,            sizeProp = props.sizeProp,            totalFlex = 0,            childItems = ownerContext.childItems,            length = childItems.length,            center, i, childContext, centerFlex, comp, region, match, size, type, target, placeholder;        for (i = 0; i < length; ++i) {            childContext = childItems[i];            comp = childContext.target;            childContext.layoutPos = {};            if (comp.region) {                childContext.region = region = comp.region;                childContext.isCenter = comp.isCenter;                childContext.isHorz = comp.isHorz;                childContext.isVert = comp.isVert;                childContext.weight = comp.weight || me.regionWeights[region] || 0;                regions[comp.id] = childContext;                if (comp.isCenter) {                    center = childContext;                    centerFlex = comp.flex;                    ownerContext.centerRegion = center;                    continue;                }                if (isVert !== childContext.isVert) {                    continue;                }                // process regions "isVert ? north||south : east||center||west"                childContext.reverseWeighting = (region == props.borderEnd);                size = comp[sizeProp];                type = typeof size;                if (!comp.collapsed) {                    if (type == 'string' && (match = me.percentageRe.exec(size))) {                        childContext.percentage = parseInt(match[1], 10);                    } else if (comp.flex) {                        totalFlex += childContext.flex = comp.flex;                    }                }            }        }        // Special cases for a collapsed center region        if (center) {            target = center.target;            if (placeholder = target.placeholderFor) {                if (!centerFlex && isVert === placeholder.collapsedVertical()) {                    // The center region is a placeholder, collapsed in this axis                    centerFlex = 0;                    center.collapseAxis = name;                }            } else if (target.collapsed && (isVert === target.collapsedVertical())) {                // The center region is a collapsed header, collapsed in this axis                centerFlex = 0;                center.collapseAxis = name;            }        }        if (centerFlex == null) {            // If we still don't have a center flex, default to 1            centerFlex = 1;        }        totalFlex += centerFlex;        return Ext.apply({            before         : isVert ? 'top' : 'left',            totalFlex      : totalFlex        }, props);    },    beginLayout: function (ownerContext) {        var me = this,            items = me.getLayoutItems(),            pad = me.padding,            type = typeof pad,            padOnContainer = false,            childContext, item, length, i, regions, collapseTarget,            doShow, hidden, region;        // We sync the visibility state of splitters with their region:        if (pad) {            if (type == 'string' || type == 'number') {                pad = Ext.util.Format.parseBox(pad);            }        } else {            pad = ownerContext.getEl('getTargetEl').getPaddingInfo();            padOnContainer = true;        }        ownerContext.outerPad = pad;        ownerContext.padOnContainer = padOnContainer;        for (i = 0, length = items.length; i < length; ++i) {            item = items[i];            collapseTarget = me.getSplitterTarget(item);            if (collapseTarget) {                hidden = !!item.hidden;                if (!collapseTarget.split) {                    if (collapseTarget.isCollapsingOrExpanding) {                        doShow = !!collapseTarget.collapsed;                    }                } else if (hidden !== collapseTarget.hidden) {                    doShow = !collapseTarget.hidden;                }                                if (doShow === true) {                    item.show();                } else if (doShow === false) {                    item.hide();                }            }        }        // The above synchronized visibility of splitters with their regions, so we need        // to make this call after that so that childItems and visibleItems are correct:        //        me.callParent(arguments);        items = ownerContext.childItems;        length = items.length;        regions = {};        ownerContext.borderAxisHorz = me.beginAxis(ownerContext, regions, 'horz');        ownerContext.borderAxisVert = me.beginAxis(ownerContext, regions, 'vert');        // Now that weights are assigned to the region's contextItems, we assign those        // same weights to the contextItem for the splitters. We also cross link the        // contextItems for the collapseTarget and its splitter.        for (i = 0; i < length; ++i) {            childContext = items[i];            collapseTarget = me.getSplitterTarget(childContext.target);            if (collapseTarget) { // if (splitter)                region = regions[collapseTarget.id]                if (!region) {                        // if the region was hidden it will not be part of childItems, and                        // so beginAxis() won't add it to the regions object, so we have                        // to create the context item here.                        region = ownerContext.getEl(collapseTarget.el, me);                        region.region = collapseTarget.region;                }                childContext.collapseTarget = collapseTarget = region;                childContext.weight = collapseTarget.weight;                childContext.reverseWeighting = collapseTarget.reverseWeighting;                collapseTarget.splitter = childContext;                childContext.isHorz = collapseTarget.isHorz;                childContext.isVert = collapseTarget.isVert;            }        }        // Now we want to sort the childItems by their weight.        me.sortWeightedItems(items, 'reverseWeighting');        me.setupSplitterNeighbors(items);    },    calculate: function (ownerContext) {        var me = this,            containerSize = me.getContainerSize(ownerContext),            childItems = ownerContext.childItems,            length = childItems.length,            horz = ownerContext.borderAxisHorz,            vert = ownerContext.borderAxisVert,            pad = ownerContext.outerPad,            padOnContainer = ownerContext.padOnContainer,            i, childContext, childMargins, size, horzPercentTotal, vertPercentTotal;        horz.begin = pad.left;        vert.begin = pad.top;        // If the padding is already on the container we need to add it to the space        // If not on the container, it's "virtual" padding.        horzPercentTotal = horz.end = horz.flexSpace = containerSize.width + (padOnContainer ? pad.left : -pad.right);        vertPercentTotal = vert.end = vert.flexSpace = containerSize.height + (padOnContainer ? pad.top : -pad.bottom);        // Reduce flexSpace on each axis by the fixed/auto sized dimensions of items that        // aren't flexed along that axis.        for (i = 0; i < length; ++i) {            childContext = childItems[i];            childMargins = childContext.getMarginInfo();            // Margins are always fixed size and must be removed from the space used for percentages and flexes            if (childContext.isHorz || childContext.isCenter) {                horz.addUnflexed(childMargins.width);                horzPercentTotal -= childMargins.width;            }            if (childContext.isVert || childContext.isCenter) {                vert.addUnflexed(childMargins.height);                vertPercentTotal -= childMargins.height;            }            // Fixed size components must have their sizes removed from the space used for flex            if (!childContext.flex && !childContext.percentage) {                if (childContext.isHorz || (childContext.isCenter && childContext.collapseAxis === 'horz')) {                    size = childContext.getProp('width');                    horz.addUnflexed(size);                    // splitters should not count towards percentages                    if (childContext.collapseTarget) {                        horzPercentTotal -= size;                    }                } else if (childContext.isVert || (childContext.isCenter && childContext.collapseAxis === 'vert')) {                    size = childContext.getProp('height');                    vert.addUnflexed(size);                    // splitters should not count towards percentages                    if (childContext.collapseTarget) {                        vertPercentTotal -= size;                    }                }                // else ignore center since it is fully flexed            }        }        for (i = 0; i < length; ++i) {            childContext = childItems[i];            childMargins = childContext.getMarginInfo();            // Calculate the percentage sizes. After this calculation percentages are very similar to fixed sizes            if (childContext.percentage) {                if (childContext.isHorz) {                    size = Math.ceil(horzPercentTotal * childContext.percentage / 100);                    size = childContext.setWidth(size);                    horz.addUnflexed(size);                } else if (childContext.isVert) {                    size = Math.ceil(vertPercentTotal * childContext.percentage / 100);                    size = childContext.setHeight(size);                    vert.addUnflexed(size);                }                // center shouldn't have a percentage but if it does it should be ignored            }        }        // If we haven't gotten sizes for all unflexed dimensions on an axis, the flexSpace        // will be NaN so we won't be calculating flexed dimensions until that is resolved.        for (i = 0; i < length; ++i) {            childContext = childItems[i];            if (!childContext.isCenter) {                me.calculateChildAxis(childContext, horz);                me.calculateChildAxis(childContext, vert);            }        }        // Once all items are placed, the final size of the center can be determined. If we        // can determine both width and height, we are done. We use '+' instead of '&&' to        // avoid short-circuiting (we want to call both):        if (me.finishAxis(ownerContext, vert) + me.finishAxis(ownerContext, horz) < 2) {            me.done = false;        } else {            // Size information is published as we place regions but position is hard to do            // that way (while avoiding published multiple times) so we publish all the            // positions at the end.            me.finishPositions(childItems);        }    },<span id='Ext-layout-container-Border-method-calculateChildAxis'>    /**</span>     * Performs the calculations for a region on a specified axis.     * @private     */    calculateChildAxis: function (childContext, axis) {        var collapseTarget = childContext.collapseTarget,            setSizeMethod = 'set' + axis.sizePropCap,            sizeProp = axis.sizeProp,            childMarginSize = childContext.getMarginInfo()[sizeProp],            region, isBegin, flex, pos, size;        if (collapseTarget) { // if (splitter)            region = collapseTarget.region;        } else {            region = childContext.region;            flex = childContext.flex;        }        isBegin = region == axis.borderBegin;        if (!isBegin && region != axis.borderEnd) {            // a north/south region on the horizontal axis or an east/west region on the            // vertical axis: stretch to fill remaining space:            childContext[setSizeMethod](axis.end - axis.begin - childMarginSize);            pos = axis.begin;        } else {            if (flex) {                size = Math.ceil(axis.flexSpace * (flex / axis.totalFlex));                size = childContext[setSizeMethod](size);            } else if (childContext.percentage) {                // Like getProp but without registering a dependency - we calculated the size, we don't depend on it                size = childContext.peek(sizeProp);            } else {                size = childContext.getProp(sizeProp);            }            size += childMarginSize;            if (isBegin) {                pos = axis.begin;                axis.begin += size;            } else {                axis.end = pos = axis.end - size;            }        }        childContext.layoutPos[axis.posProp] = pos;    },<span id='Ext-layout-container-Border-method-finishAxis'>    /**</span>     * Finishes the calculations on an axis. This basically just assigns the remaining     * space to the center region.     * @private     */    finishAxis: function (ownerContext, axis) {        var size = axis.end - axis.begin,            center = ownerContext.centerRegion;        if (center) {            center['set' + axis.sizePropCap](size - center.getMarginInfo()[axis.sizeProp]);            center.layoutPos[axis.posProp] = axis.begin;        }        return Ext.isNumber(size) ? 1 : 0;    },<span id='Ext-layout-container-Border-method-finishPositions'>    /**</span>     * Finishes by setting the positions on the child items.     * @private     */    finishPositions: function (childItems) {        var length = childItems.length,            index, childContext;        for (index = 0; index < length; ++index) {            childContext = childItems[index];            childContext.setProp('x', childContext.layoutPos.x + childContext.marginInfo.left);            childContext.setProp('y', childContext.layoutPos.y + childContext.marginInfo.top);        }    },    getPlaceholder: function (comp) {        return comp.getPlaceholder && comp.getPlaceholder();    },    getSplitterTarget: function (splitter) {        var collapseTarget = splitter.collapseTarget;        if (collapseTarget && collapseTarget.collapsed) {            return collapseTarget.placeholder || collapseTarget;        }        return collapseTarget;    },    isItemBoxParent: function (itemContext) {        return true;    },    isItemShrinkWrap: function (item) {        return true;    },    //----------------------------------    // Event handlers<span id='Ext-layout-container-Border-method-insertSplitter'>    /**</span>     * Inserts the splitter for a given region. A reference to the splitter is also stored     * on the component as "splitter".     * @private     */    insertSplitter: function (item, index, hidden) {        var region = item.region,            splitter = {                xtype: 'bordersplitter',                collapseTarget: item,                id: item.id + '-splitter',                hidden: hidden,                canResize: item.splitterResize !== false            },            at = index + ((region == 'south' || region == 'east') ? 0 : 1);        // remove the default fixed width or height depending on orientation:        if (item.isHorz) {            splitter.height = null;        } else {            splitter.width = null;        }        if (item.collapseMode == 'mini') {            splitter.collapsedCls = item.collapsedCls;        }        item.splitter = this.owner.add(at, splitter);    },<span id='Ext-layout-container-Border-method-onAdd'>    /**</span>     * Called when a region (actually when any component) is added to the container. The     * region is decorated with some helpful properties (isCenter, isHorz, isVert) and its     * splitter is added if its "split" property is true.     * @private     */    onAdd: function (item, index) {        var me = this,            placeholderFor = item.placeholderFor,            region = item.region,            split,            hidden;        me.callParent(arguments);        if (region) {            Ext.apply(item, me.regionFlags[region]);            if (region == 'center') {                //<debug>                if (me.centerRegion) {                    Ext.Error.raise("Cannot have multiple center regions in a BorderLayout.");                }                //</debug>                me.centerRegion = item;            } else {                item.collapseDirection = this.collapseDirections[region];                split = item.split;                hidden = !!item.hidden;                if ((item.isHorz || item.isVert) && (split || item.collapseMode == 'mini')) {                    me.insertSplitter(item, index, hidden || !split);                }            }            if (!item.hasOwnProperty('collapseMode')) {                item.collapseMode = me.panelCollapseMode;            }            if (!item.hasOwnProperty('animCollapse')) {                if (item.collapseMode != 'placeholder') {                    // other collapse modes do not animate nicely in a border layout, so                    // default them to off:                    item.animCollapse = false;                } else {                    item.animCollapse = me.panelCollapseAnimate;                }            }        } else if (placeholderFor) {            Ext.apply(item, me.regionFlags[placeholderFor.region]);            item.region = placeholderFor.region;            item.weight = placeholderFor.weight;        }    },    onDestroy: function() {        this.centerRegion = null;        this.callParent();    },    onRemove: function (item) {        var me = this,            region = item.region,            splitter = item.splitter;        if (region) {            if (item.isCenter) {                me.centerRegion = null;            }            delete item.isCenter;            delete item.isHorz;            delete item.isVert;            if (splitter) {                me.owner.doRemove(splitter, true); // avoid another layout                delete item.splitter;            }        }        me.callParent(arguments);    },    //----------------------------------    // Misc    regionFlags: {        center: { isCenter: true, isHorz: false, isVert: false },        north: { isCenter: false, isHorz: false, isVert: true },        south: { isCenter: false, isHorz: false, isVert: true },        west: { isCenter: false, isHorz: true, isVert: false },        east: { isCenter: false, isHorz: true, isVert: false }    },    setupSplitterNeighbors: function (items) {        var edgeRegions = {                //north: null,                //south: null,                //east: null,                //west: null            },            length = items.length,            touchedRegions = this.touchedRegions,            i, j, center, count, edge, comp, region, splitter, touched;        for (i = 0; i < length; ++i) {            comp = items[i].target;            region = comp.region;            if (comp.isCenter) {                center = comp;            } else if (region) {                touched = touchedRegions[region];                for (j = 0, count = touched.length; j < count; ++j) {                    edge = edgeRegions[touched[j]];                    if (edge) {                        edge.neighbors.push(comp);                    }                }                                if (comp.placeholderFor) {                    // placeholder, so grab the splitter for the actual panel                    splitter = comp.placeholderFor.splitter;                } else {                    splitter = comp.splitter;                }                if (splitter) {                    splitter.neighbors = [];                }                edgeRegions[region] = splitter;            }        }        if (center) {            touched = touchedRegions.center;            for (j = 0, count = touched.length; j < count; ++j) {                edge = edgeRegions[touched[j]];                if (edge) {                    edge.neighbors.push(center);                }            }        }    },<span id='Ext-layout-container-Border-property-touchedRegions'>    /**</span>     * Lists the regions that would consider an interior region a neighbor. For example,     * a north region would consider an east or west region its neighbords (as well as     * an inner north region).     * @private     */    touchedRegions: {        center: [ 'north', 'south', 'east',  'west' ],        north:  [ 'north', 'east',  'west'  ],        south:  [ 'south', 'east',  'west'  ],        east:   [ 'east',  'north', 'south' ],        west:   [ 'west',  'north', 'south' ]    },    sizePolicies: {        vert: {            setsWidth: 1,            setsHeight: 0        },        horz: {            setsWidth: 0,            setsHeight: 1        },        flexAll: {            setsWidth: 1,            setsHeight: 1        }    },    getItemSizePolicy: function (item) {        var me = this,            policies = this.sizePolicies,            collapseTarget, size, policy, placeholderFor;        if (item.isCenter) {            placeholderFor = item.placeholderFor;            if (placeholderFor) {                if (placeholderFor.collapsedVertical()) {                    return policies.vert;                }                return policies.horz;            }            if (item.collapsed) {                if (item.collapsedVertical()) {                    return policies.vert;                }                return policies.horz;            }            return policies.flexAll;        }        collapseTarget = item.collapseTarget;        if (collapseTarget) {            return collapseTarget.isVert ? policies.vert : policies.horz;        }        if (item.region) {            if (item.isVert) {                size = item.height;                policy = policies.vert;            } else {                size = item.width;                policy = policies.horz;            }            if (item.flex || (typeof size == 'string' && me.percentageRe.test(size))) {                return policies.flexAll;            }            return policy;        }        return me.autoSizePolicy;    }}, function () {    var methods = {        addUnflexed: function (px) {            this.flexSpace = Math.max(this.flexSpace - px, 0);        }    },    props = this.prototype.axisProps;    Ext.apply(props.horz, methods);    Ext.apply(props.vert, methods);});</pre></body></html>
 |