| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981 | 
							- <!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-Container'>/**
 
- </span> * This class is intended to be extended or created via the {@link Ext.container.Container#layout layout}
 
-  * configuration property.  See {@link Ext.container.Container#layout} for additional details.
 
-  */
 
- Ext.define('Ext.layout.container.Container', {
 
-     /* Begin Definitions */
 
-     extend: 'Ext.layout.Layout',
 
-     alternateClassName: 'Ext.layout.ContainerLayout',
 
-     mixins: {
 
-         elementCt: 'Ext.util.ElementContainer'
 
-     },
 
-     requires: [
 
-         'Ext.XTemplate'
 
-     ],
 
-     type: 'container',
 
-     /* End Definitions */
 
- <span id='Ext-layout-container-Container-cfg-itemCls'>    /**
 
- </span>     * @cfg {String} itemCls
 
-      * An optional extra CSS class that will be added to the container. This can be useful for
 
-      * adding customized styles to the container or any of its children using standard CSS
 
-      * rules. See {@link Ext.Component}.{@link Ext.Component#componentCls componentCls} also.
 
-      */
 
- <span id='Ext-layout-container-Container-cfg-manageOverflow'>    /**
 
- </span>     * @cfg {Number} [manageOverflow=0]
 
-      * One of the following values:
 
-      *
 
-      *  - 0 if the layout should ignore overflow.
 
-      *  - 1 if the layout should be rerun if scrollbars are needed.
 
-      *  - 2 if the layout should also correct padding when overflowed.
 
-      */
 
-     manageOverflow: 0,
 
- <span id='Ext-layout-container-Container-method-beginCollapse'>    /**
 
- </span>     * @private
 
-      * Called by an owning Panel before the Panel begins its collapse process.
 
-      * Most layouts will not need to override the default Ext.emptyFn implementation.
 
-      */
 
-     beginCollapse: Ext.emptyFn,
 
- <span id='Ext-layout-container-Container-method-beginExpand'>    /**
 
- </span>     * @private
 
-      * Called by an owning Panel before the Panel begins its expand process.
 
-      * Most layouts will not need to override the default Ext.emptyFn implementation.
 
-      */
 
-     beginExpand: Ext.emptyFn,
 
- <span id='Ext-layout-container-Container-property-animatePolicy'>    /**
 
- </span>     * An object which contains boolean properties specifying which properties are to be 
 
-      * animated upon flush of child Component ContextItems. For example, Accordion would
 
-      * have:
 
-      *
 
-      *      {
 
-      *          y: true,
 
-      *          height: true
 
-      *      }
 
-      *
 
-      * @private
 
-      */
 
-     animatePolicy: null,
 
-     childEls: [
 
- <span id='Ext-layout-container-Container-property-overflowPadderEl'>        /**
 
- </span>         * @property {Ext.Element} overflowPadderEl
 
-          * The element used to correct body padding during overflow.
 
-          */
 
-         'overflowPadderEl'
 
-     ],
 
-     renderTpl: [
 
-         '{%this.renderBody(out,values)%}'
 
-     ],
 
-     usesContainerHeight: true,
 
-     usesContainerWidth: true,
 
-     usesHeight: true,
 
-     usesWidth: true,
 
- <span id='Ext-layout-container-Container-cfg-reserveScrollbar'>    /**
 
- </span>     * @cfg {Boolean} [reserveScrollbar=false]
 
-      * Set to `true` to leave space for a vertical scrollbar (if the OS shows space-consuming scrollbars) regardless
 
-      * of whether a scrollbar is needed.
 
-      *
 
-      * This is useful if content height changes during application usage, but you do not want the calculated width
 
-      * of child items to change when a scrollbar appears or disappears. The scrollbar will appear in the reserved space,
 
-      * and the calculated width of child Components will not change.
 
-      *
 
-      *     @example
 
-      *     Ext.define('Employee', {
 
-      *         extend: 'Ext.data.Model',
 
-      *         fields: [
 
-      *            {name: 'rating', type: 'int'},
 
-      *            {name: 'salary', type: 'float'},
 
-      *            {name: 'name'}
 
-      *         ]
 
-      *     });
 
-      *
 
-      *     function createFakeData(count) {
 
-      *         var firstNames   = ['Ed', 'Tommy', 'Aaron', 'Abe', 'Jamie', 'Adam', 'Dave', 'David', 'Jay', 'Nicolas', 'Nige'],
 
-      *             lastNames    = ['Spencer', 'Maintz', 'Conran', 'Elias', 'Avins', 'Mishcon', 'Kaneda', 'Davis', 'Robinson', 'Ferrero', 'White'],
 
-      *             ratings      = [1, 2, 3, 4, 5],
 
-      *             salaries     = [100, 400, 900, 1500, 1000000];
 
-      *
 
-      *         var data = [];
 
-      *         for (var i = 0; i < (count || 25); i++) {
 
-      *             var ratingId    = Math.floor(Math.random() * ratings.length),
 
-      *                 salaryId    = Math.floor(Math.random() * salaries.length),
 
-      *                 firstNameId = Math.floor(Math.random() * firstNames.length),
 
-      *                 lastNameId  = Math.floor(Math.random() * lastNames.length),
 
-      *
 
-      *                 rating      = ratings[ratingId],
 
-      *                 salary      = salaries[salaryId],
 
-      *                 name        = Ext.String.format("{0} {1}", firstNames[firstNameId], lastNames[lastNameId]);
 
-      *
 
-      *             data.push({
 
-      *                 rating: rating,
 
-      *                 salary: salary,
 
-      *                 name: name
 
-      *             });
 
-      *         }
 
-      *         store.loadData(data);
 
-      *     }
 
-      *
 
-      *     // create the Data Store
 
-      *     var store = Ext.create('Ext.data.Store', {
 
-      *         id: 'store',
 
-      *         model: 'Employee',
 
-      *         proxy: {
 
-      *             type: 'memory'
 
-      *         }
 
-      *     });
 
-      *     createFakeData(10);
 
-      *
 
-      *     var grid = Ext.create('Ext.grid.Panel', {
 
-      *         title: 'Grid loaded with varying number of records',
 
-      *         anchor: '100%',
 
-      *         store: store,
 
-      *         columns: [{
 
-      *             xtype: 'rownumberer',
 
-      *             width: 40,
 
-      *             sortable: false
 
-      *         },{
 
-      *             text: 'Name',
 
-      *             flex: 1,
 
-      *             sortable: true,
 
-      *             dataIndex: 'name'
 
-      *         },{
 
-      *             text: 'Rating',
 
-      *             width: 125,
 
-      *             sortable: true,
 
-      *             dataIndex: 'rating'
 
-      *         },{
 
-      *             text: 'Salary',
 
-      *             width: 125,
 
-      *             sortable: true,
 
-      *             dataIndex: 'salary',
 
-      *             align: 'right',
 
-      *             renderer: Ext.util.Format.usMoney
 
-      *         }]
 
-      *     });
 
-      *
 
-      *     Ext.create('Ext.panel.Panel', {
 
-      *         renderTo: document.body,
 
-      *         width: 800,
 
-      *         height: 600,
 
-      *         layout: {
 
-      *             type: 'anchor',
 
-      *             reserveScrollbar: true // There will be a gap even when there's no scrollbar
 
-      *         },
 
-      *         autoScroll: true,
 
-      *         items: grid,
 
-      *         tbar: {
 
-      *             defaults: {
 
-      *                 handler: function(b) {
 
-      *                     createFakeData(b.count);
 
-      *                 }
 
-      *             },
 
-      *             items: [{
 
-      *                  text: '10 Items',
 
-      *                  count: 10
 
-      *             },{
 
-      *                  text: '100 Items',
 
-      *                  count: 100
 
-      *             },{
 
-      *                  text: '300 Items',
 
-      *                  count: 300
 
-      *             },{
 
-      *                  text: '1000 Items',
 
-      *                  count: 1000
 
-      *             },{
 
-      *                  text: '5000 Items',
 
-      *                  count: 5000
 
-      *             }]
 
-      *         }
 
-      *     });
 
-      *
 
-      */
 
-     reserveScrollbar: false,
 
-     // Begin with no previous adjustments
 
-     lastOverflowAdjust: {
 
-         width: 0,
 
-         height: 0
 
-     },
 
-     constructor: function () {
 
-         this.callParent(arguments);
 
-         this.mixins.elementCt.constructor.call(this);
 
-     },
 
-     destroy : function() {
 
-         this.callParent();
 
-         this.mixins.elementCt.destroy.call(this);
 
-     },
 
-     initLayout: function() {
 
-         var me = this,
 
-             scrollbarWidth = Ext.getScrollbarSize().width;
 
-         me.callParent();
 
-         // Create a default lastOverflowAdjust based upon scrolling configuration.
 
-         // If the Container is to overflow, or we *always* reserve space for a scrollbar
 
-         // then reserve space for a vertical scrollbar
 
-         if (scrollbarWidth && me.manageOverflow && !me.hasOwnProperty('lastOverflowAdjust')) {
 
-             if (me.owner.autoScroll || me.reserveScrollbar) {
 
-                 me.lastOverflowAdjust = {
 
-                     width: scrollbarWidth,
 
-                     height: 0
 
-                 };
 
-             }
 
-         }
 
-     },
 
- <span id='Ext-layout-container-Container-method-beginLayout'>    /**
 
- </span>     * In addition to work done by our base classes, containers benefit from some extra
 
-      * cached data. The following properties are added to the ownerContext:
 
-      * 
 
-      *  - visibleItems: the result of {@link #getVisibleItems}
 
-      *  - childItems: the ContextItem[] for each visible item
 
-      *  - targetContext: the ContextItem for the {@link #getTarget} element
 
-      */
 
-     beginLayout: function (ownerContext) {
 
-         this.callParent(arguments);
 
-         ownerContext.targetContext = ownerContext.getEl('getTarget', this);
 
-         this.cacheChildItems(ownerContext);
 
-     },
 
-     beginLayoutCycle: function (ownerContext, firstCycle) {
 
-         var me = this,
 
-             padEl = me.overflowPadderEl;
 
-         me.callParent(arguments);
 
-         // Begin with the scrollbar adjustment that we used last time - this is more likely to be correct
 
-         // than beginning with no adjustment at all
 
-         if (!ownerContext.state.overflowAdjust) {
 
-             ownerContext.state.overflowAdjust = me.lastOverflowAdjust;
 
-         }
 
-         if (firstCycle) {
 
-             if (me.usesContainerHeight) {
 
-                 ++ownerContext.consumersContainerHeight;
 
-             }
 
-             if (me.usesContainerWidth) {
 
-                 ++ownerContext.consumersContainerWidth;
 
-             }
 
-         }
 
-         if (padEl) {
 
-             padEl.setStyle('display', 'none');
 
-         }
 
-     },
 
-     completeLayout: function (ownerContext) {
 
-         // Cache the scrollbar adjustment
 
-         this.lastOverflowAdjust = ownerContext.state.overflowAdjust;
 
-     },
 
-     cacheChildItems: function (ownerContext) {
 
-         var context = ownerContext.context,
 
-             childItems = [],
 
-             items = this.getVisibleItems(),
 
-             length = items.length,
 
-             i;
 
-         ownerContext.childItems = childItems;
 
-         ownerContext.visibleItems = items;
 
-         for (i = 0; i < length; ++i) {
 
-             childItems.push(context.getCmp(items[i]));
 
-         }
 
-     },
 
-     cacheElements: function () {
 
-         var owner = this.owner;
 
-         this.applyChildEls(owner.el, owner.id); // from ElementContainer mixin
 
-     },
 
-     calculateContentSize: function (ownerContext, dimensions) {
 
-         var me = this,
 
-             containerDimensions = (dimensions || 0) | me.manageOverflow |
 
-                    ((ownerContext.widthModel.shrinkWrap ? 1 : 0) |
 
-                     (ownerContext.heightModel.shrinkWrap ? 2 : 0)),
 
-             calcWidth = (containerDimensions & 1) || undefined,
 
-             calcHeight = (containerDimensions & 2) || undefined,
 
-             childItems = ownerContext.childItems,
 
-             length = childItems.length,
 
-             contentHeight = 0,
 
-             contentWidth = 0,
 
-             needed = 0,
 
-             props = ownerContext.props,
 
-             targetXY, targetX, targetY, targetPadding,
 
-             borders, child, childContext, childX, childY, height, i, margins, width, xy;
 
-         if (calcWidth) {
 
-             if (isNaN(props.contentWidth)) {
 
-                 ++needed;
 
-             } else {
 
-                 calcWidth = undefined;
 
-             }
 
-         }
 
-         if (calcHeight) {
 
-             if (isNaN(props.contentHeight)) {
 
-                 ++needed;
 
-             } else {
 
-                 calcHeight = undefined;
 
-             }
 
-         }
 
-         if (needed) {
 
-             // TODO - this is rather brute force... maybe a wrapping el or clientHeight/Width
 
-             // trick might help. Whatever we do, it must either work for Absolute layout or
 
-             // at least be correctable by an overridden method in that derived class.
 
-             for (i = 0; i < length; ++i) {
 
-                 childContext = childItems[i];
 
-                 child = childContext.target;
 
-                 height = calcHeight && childContext.getProp('height');
 
-                 width = calcWidth && childContext.getProp('width');
 
-                 margins = childContext.getMarginInfo();
 
-                 // getXY is the root method here (meaning that we cannot avoid getting both
 
-                 // even if we need only one), so dip into the DOM if something is needed
 
-                 if ((calcWidth && isNaN(child.x)) || (calcHeight && isNaN(child.y))) {
 
-                     xy = child.el.getXY();
 
-                     if (!targetXY) {
 
-                         targetXY = ownerContext.targetContext.el.getXY();
 
-                         borders = ownerContext.targetContext.getBorderInfo();
 
-                         targetX = targetXY[0] + borders.left;
 
-                         targetY = targetXY[1] + borders.top;
 
-                     }
 
-                     // not worth avoiding the possibly useless calculation here:
 
-                     childX = xy[0] - targetX;
 
-                     childY = xy[1] - targetY;
 
-                 } else {
 
-                     // not worth avoiding these either:
 
-                     childX = child.x;
 
-                     childY = child.y;
 
-                 }
 
-                 // XY includes the top/left margin
 
-                 height += margins.bottom;
 
-                 width  += margins.right;
 
-                 contentHeight = Math.max(contentHeight, childY + height);
 
-                 contentWidth = Math.max(contentWidth, childX + width);
 
-                 if (isNaN(contentHeight) && isNaN(contentWidth)) {
 
-                     me.done = false;
 
-                     return;
 
-                 }
 
-             }
 
-             if (calcWidth || calcHeight) {
 
-                 targetPadding = ownerContext.targetContext.getPaddingInfo();
 
-             }
 
-             if (calcWidth && !ownerContext.setContentWidth(contentWidth + targetPadding.right)) {
 
-                 me.done = false;
 
-             }
 
-             if (calcHeight && !ownerContext.setContentHeight(contentHeight + targetPadding.bottom)) {
 
-                 me.done = false;
 
-             }
 
-             /* add a '/' to turn on this log ('//* enables, '/*' disables)
 
-             if (me.done) {
 
-                 var el = ownerContext.targetContext.el.dom;
 
-                 Ext.log(this.owner.id, '.contentSize: ', contentWidth, 'x', contentHeight,
 
-                     ' => scrollSize: ', el.scrollWidth, 'x', el.scrollHeight);
 
-             }/**/
 
-         }
 
-     },
 
- <span id='Ext-layout-container-Container-method-calculateOverflow'>    /**
 
- </span>     * Handles overflow processing for a container. This should be called once the layout
 
-      * has determined contentWidth/Height. In addition to the ownerContext passed to the
 
-      * {@link #calculate} method, this method also needs the containerSize (the object
 
-      * returned by {@link #getContainerSize}).
 
-      * 
 
-      * @param {Ext.layout.ContextItem} ownerContext
 
-      * @param {Object} containerSize
 
-      * @param {Number} dimensions A bit mask for the overflow managed dimensions. The 0-bit
 
-      * is for `width` and the 1-bit is for `height`. In other words, a value of 1 would be
 
-      * only `width`, 2 would be only `height` and 3 would be both.
 
-      */
 
-     calculateOverflow: function (ownerContext, containerSize, dimensions) {
 
-         var me = this,
 
-             owner = me.owner,
 
-             manageOverflow = me.manageOverflow,
 
-             state = ownerContext.state,
 
-             overflowAdjust = state.overflowAdjust,
 
-             padWidth, padHeight, padElContext, padding, scrollRangeFlags,
 
-             overflow, scrollbarSize, contentW, contentH, ownerW, ownerH, scrollbars,
 
-             xauto, yauto;
 
-         if (manageOverflow && !state.secondPass && !me.reserveScrollbar) {
 
-             // Determine the dimensions that have overflow:auto applied. If these come by
 
-             // way of component config, this does not require a DOM read:
 
-             if (owner.autoScroll) {
 
-                 xauto = yauto = true;
 
-             } else {
 
-                 if (owner.overflowX) {
 
-                     xauto = owner.overflowX == 'auto';
 
-                 } else {
 
-                     overflow = ownerContext.targetContext.getStyle('overflow-x');
 
-                     xauto = overflow && overflow != 'hidden' && overflow != 'scroll';
 
-                 }
 
-                 if (owner.overflowY) {
 
-                     yauto = owner.overflowY == 'auto';
 
-                 } else {
 
-                     overflow = ownerContext.targetContext.getStyle('overflow-y');
 
-                     yauto = overflow && overflow != 'hidden' && overflow != 'scroll';
 
-                 }
 
-             }
 
-             // If the container layout is not using width, we don't need to adjust for the
 
-             // vscroll (likewise for height). Perhaps we don't even need to run the layout
 
-             // again if the adjustments won't have any effect on the result!
 
-             if (!containerSize.gotWidth) {
 
-                 xauto = false;
 
-             }
 
-             if (!containerSize.gotHeight) {
 
-                 yauto = false;
 
-             }
 
-             if (xauto || yauto) {
 
-                 scrollbarSize = Ext.getScrollbarSize();
 
-                 // as a container we calculate contentWidth/Height, so we don't want
 
-                 // to use getProp and make it look like we are triggered by them...
 
-                 contentW = ownerContext.peek('contentWidth');
 
-                 contentH = ownerContext.peek('contentHeight');
 
-                 ownerW = containerSize.width;
 
-                 ownerH = containerSize.height;
 
-                 scrollbars = me.getScrollbarsNeeded(ownerW, ownerH, contentW, contentH);
 
-                 state.overflowState = scrollbars;
 
-                 if (typeof dimensions == 'number') {
 
-                     scrollbars &= ~dimensions; // ignore dimensions that have no effect
 
-                 }
 
-                 overflowAdjust = {
 
-                     width:  (xauto && (scrollbars & 2)) ? scrollbarSize.width : 0,
 
-                     height: (yauto && (scrollbars & 1)) ? scrollbarSize.height : 0
 
-                 };
 
-                 // We can have 0-sized scrollbars (new Mac OS) and so don't invalidate
 
-                 // the layout unless this will change something...
 
-                 if (overflowAdjust.width !== me.lastOverflowAdjust.width || overflowAdjust.height !== me.lastOverflowAdjust.height) {
 
-                     me.done = false;
 
-                     // we pass overflowAdjust and overflowState in as state for the next
 
-                     // cycle (these are discarded if one of our ownerCt's invalidates):
 
-                     ownerContext.invalidate({
 
-                         state: {
 
-                             overflowAdjust: overflowAdjust,
 
-                             overflowState: state.overflowState,
 
-                             secondPass: true
 
-                         }
 
-                     });
 
-                 }
 
-             }
 
-         }
 
-         if (!me.done) {
 
-             return;
 
-         }
 
-         padElContext = ownerContext.padElContext ||
 
-                       (ownerContext.padElContext = ownerContext.getEl('overflowPadderEl', me));
 
-         // Even if overflow does not effect the layout, we still do need the padEl to be
 
-         // sized or hidden appropriately...
 
-         if (padElContext) {
 
-             scrollbars = state.overflowState; // the true overflow state
 
-             padWidth = containerSize.width;
 
-             padHeight = 0;//  TODO me.padHeightAdj; // 0 or 1
 
-             if (scrollbars) {
 
-                 padding = ownerContext.targetContext.getPaddingInfo();
 
-                 scrollRangeFlags = me.scrollRangeFlags;
 
-                 if ((scrollbars & 2) && (scrollRangeFlags & 1)) { // if (vscroll and loses bottom)
 
-                     padHeight += padding.bottom;
 
-                 }
 
-                 if ((scrollbars & 1) && (scrollRangeFlags & 4)) { // if (hscroll and loses right)
 
-                     padWidth += padding.right;
 
-                 }
 
-                 padElContext.setProp('display', '');
 
-                 padElContext.setSize(padWidth, padHeight);
 
-             } else {
 
-                 padElContext.setProp('display', 'none');
 
-             }
 
-         }
 
-     },
 
- <span id='Ext-layout-container-Container-method-configureItem'>    /**
 
- </span>     * Adds layout's itemCls and owning Container's itemCls
 
-      * @protected
 
-      */
 
-     configureItem: function(item) {
 
-         var me = this,
 
-             ownerItemCls = me.owner.itemCls,
 
-             addClasses = [].concat(me.itemCls || []);
 
-         me.callParent(arguments);
 
-         if (ownerItemCls) {
 
-             addClasses = Ext.Array.push(addClasses, ownerItemCls);
 
-         }
 
-         item.addCls(addClasses);
 
-     },
 
-     doRenderBody: function (out, renderData) {
 
-         // Careful! This method is bolted on to the renderTpl so all we get for context is
 
-         // the renderData! The "this" pointer is the renderTpl instance!
 
-         this.renderItems(out, renderData);
 
-         this.renderContent(out, renderData);
 
-     },
 
-     doRenderContainer: function (out, renderData) {
 
-         // Careful! This method is bolted on to the renderTpl so all we get for context is
 
-         // the renderData! The "this" pointer is the renderTpl instance!
 
-         var me = renderData.$comp.layout,
 
-             tpl = me.getRenderTpl(),
 
-             data = me.getRenderData();
 
-         tpl.applyOut(data, out);
 
-     },
 
-     doRenderItems: function (out, renderData) {
 
-         // Careful! This method is bolted on to the renderTpl so all we get for context is
 
-         // the renderData! The "this" pointer is the renderTpl instance!
 
-         var me = renderData.$layout,
 
-             tree = me.getRenderTree();
 
-         if (tree) {
 
-             Ext.DomHelper.generateMarkup(tree, out);
 
-         }
 
-     },
 
- <span id='Ext-layout-container-Container-method-doRenderPadder'>    /**
 
- </span>     * Creates an element that makes bottom/right body padding consistent across browsers.
 
-      * This element is sized based on the need for scrollbars in {@link #calculateOverflow}.
 
-      * If the {@link #manageOverflow} option is false, this element is not created.
 
-      *
 
-      * See {@link #getScrollRangeFlags} for more details.
 
-      */
 
-     doRenderPadder: function (out, renderData) {
 
-         // Careful! This method is bolted on to the renderTpl so all we get for context is
 
-         // the renderData! The "this" pointer is the renderTpl instance!
 
-         var me = renderData.$layout,
 
-             owner = me.owner,
 
-             scrollRangeFlags = me.getScrollRangeFlags();
 
-         if (me.manageOverflow == 2) {
 
-             if (scrollRangeFlags & 5) { // if (loses parent bottom and/or right padding)
 
-                 out.push('<div id="',owner.id,'-overflowPadderEl" ',
 
-                     'style="font-size: 1px; width:1px; height: 1px;');
 
-                 // We won't want the height of the padder to cause problems when we only
 
-                 // want to adjust for right padding, so we relatively position it up 1px so
 
-                 // its height of 1px will have no vertical effect. This trick does not work
 
-                 // on IE due to bugs (the effects are worse than the off-by-1px in scroll
 
-                 // height).
 
-                 //
 
-                 /* turns out this does not work on FF (5) either... TODO
 
-                 if (Ext.isIE || Ext.isGecko) {
 
-                     me.padHeightAdj = 0;
 
-                 } else {
 
-                     me.padHeightAdj = 1;
 
-                     out.push('position: relative; top: -1px;');
 
-                 }/**/
 
-                 out.push('"></div>');
 
-                 me.scrollRangeFlags = scrollRangeFlags; // remember for calculateOverflow
 
-             }
 
-         }
 
-     }, 
 
-     finishRender: function () {
 
-         var me = this,
 
-             target, items;
 
-         me.callParent();
 
-         me.cacheElements();
 
-         target = me.getRenderTarget();
 
-         items = me.getLayoutItems();
 
-         if (me.targetCls) {
 
-             me.getTarget().addCls(me.targetCls);
 
-         }
 
-         me.finishRenderItems(target, items);
 
-     },
 
- <span id='Ext-layout-container-Container-method-notifyOwner'>    /**
 
- </span>     * @private
 
-      * Called for every layout in the layout context after all the layouts have been finally flushed
 
-      */
 
-     notifyOwner: function() {
 
-         this.owner.afterLayout(this);
 
-     },
 
- <span id='Ext-layout-container-Container-method-getContainerSize'>    /**
 
- </span>     * Returns the container size (that of the target). Only the fixed-sized dimensions can
 
-      * be returned because the shrinkWrap dimensions are based on the contentWidth/Height
 
-      * as determined by the container layout.
 
-      *
 
-      * If the {@link #calculateOverflow} method is used and if {@link #manageOverflow} is
 
-      * true, this may adjust the width/height by the size of scrollbars.
 
-      * 
 
-      * @param {Ext.layout.ContextItem} ownerContext The owner's context item.
 
-      * @param {Boolean} [inDom=false] True if the container size must be in the DOM.
 
-      * @return {Object} The size
 
-      * @return {Number} return.width The width
 
-      * @return {Number} return.height The height
 
-      * @protected
 
-      */
 
-     getContainerSize : function(ownerContext, inDom) {
 
-         // Subtle But Important:
 
-         // 
 
-         // We don't want to call getProp/hasProp et.al. unless we in fact need that value
 
-         // for our results! If we call it and don't need it, the layout manager will think
 
-         // we depend on it and will schedule us again should it change.
 
-         var targetContext = ownerContext.targetContext,
 
-             frameInfo = targetContext.getFrameInfo(),
 
-             padding = targetContext.getPaddingInfo(),
 
-             got = 0,
 
-             needed = 0,
 
-             overflowAdjust = ownerContext.state.overflowAdjust,
 
-             gotWidth, gotHeight, width, height;
 
-         // In an shrinkWrap width/height case, we must not ask for any of these dimensions
 
-         // because they will be determined by contentWidth/Height which is calculated by
 
-         // this layout...
 
-         // Fit/Card layouts are able to set just the width of children, allowing child's
 
-         // resulting height to autosize the Container.
 
-         // See examples/tabs/tabs.html for an example of this.
 
-         if (!ownerContext.widthModel.shrinkWrap) {
 
-             ++needed;
 
-             width = inDom ? targetContext.getDomProp('width') : targetContext.getProp('width');
 
-             gotWidth = (typeof width == 'number');
 
-             if (gotWidth) {
 
-                 ++got;
 
-                 width -= frameInfo.width + padding.width;
 
-                 if (overflowAdjust) {
 
-                     width -= overflowAdjust.width;
 
-                 }
 
-             }
 
-         }
 
-         if (!ownerContext.heightModel.shrinkWrap) {
 
-             ++needed;
 
-             height = inDom ? targetContext.getDomProp('height') : targetContext.getProp('height');
 
-             gotHeight = (typeof height == 'number');
 
-             if (gotHeight) {
 
-                 ++got;
 
-                 height -= frameInfo.height + padding.height;
 
-                 if (overflowAdjust) {
 
-                     height -= overflowAdjust.height;
 
-                 }
 
-             }
 
-         }
 
-         return {
 
-             width: width,
 
-             height: height,
 
-             needed: needed,
 
-             got: got,
 
-             gotAll: got == needed,
 
-             gotWidth: gotWidth,
 
-             gotHeight: gotHeight
 
-         };
 
-     },
 
- <span id='Ext-layout-container-Container-method-getLayoutItems'>    /**
 
- </span>     * Returns an array of child components either for a render phase (Performed in the beforeLayout
 
-      * method of the layout's base class), or the layout phase (onLayout).
 
-      * @return {Ext.Component[]} of child components
 
-      */
 
-     getLayoutItems: function() {
 
-         var owner = this.owner,
 
-             items = owner && owner.items;
 
-         return (items && items.items) || [];
 
-     },
 
-     getRenderData: function () {
 
-         var comp = this.owner;
 
-         return {
 
-             $comp: comp,
 
-             $layout: this,
 
-             ownerId: comp.id
 
-         };
 
-     },
 
- <span id='Ext-layout-container-Container-method-getRenderedItems'>    /**
 
- </span>     * @protected
 
-      * Returns all items that are rendered
 
-      * @return {Array} All matching items
 
-      */
 
-     getRenderedItems: function() {
 
-         var me = this,
 
-             target = me.getRenderTarget(),
 
-             items = me.getLayoutItems(),
 
-             ln = items.length,
 
-             renderedItems = [],
 
-             i, item;
 
-         for (i = 0; i < ln; i++) {
 
-             item = items[i];
 
-             if (item.rendered && me.isValidParent(item, target, i)) {
 
-                 renderedItems.push(item);
 
-             }
 
-         }
 
-         return renderedItems;
 
-     },
 
- <span id='Ext-layout-container-Container-method-getRenderTarget'>    /**
 
- </span>     * Returns the element into which rendering must take place. Defaults to the owner Container's
 
-      * target element.
 
-      *
 
-      * May be overridden in layout managers which implement an inner element.
 
-      *
 
-      * @return {Ext.Element}
 
-      */
 
-     getRenderTarget: function() {
 
-         return this.owner.getTargetEl();
 
-     },
 
- <span id='Ext-layout-container-Container-method-getElementTarget'>    /**
 
- </span>     * Returns the element into which extra functional DOM elements can be inserted. Defaults to the owner Component's encapsulating element.
 
-      *
 
-      * May be overridden in Component layout managers which implement a {@link #getRenderTarget component render target} which must only
 
-      * contain child components.
 
-      * @return {Ext.Element}
 
-      */
 
-     getElementTarget: function() {
 
-         return this.getRenderTarget();
 
-     },
 
-     getRenderTpl: function () {
 
-         var me = this,
 
-             renderTpl = Ext.XTemplate.getTpl(this, 'renderTpl');
 
-         // Make sure all standard callout methods for the owner component are placed on the
 
-         // XTemplate instance (but only once please):
 
-         if (!renderTpl.renderContent) {
 
-             me.owner.setupRenderTpl(renderTpl);
 
-         }
 
-         return renderTpl;
 
-     },
 
-     getRenderTree: function () {
 
-         var result,
 
-             items = this.owner.items,
 
-             itemsGen,
 
-             renderCfgs = {};
 
-         
 
-         do {
 
-             itemsGen = items.generation;
 
-             result = this.getItemsRenderTree(this.getLayoutItems(), renderCfgs);
 
-         } while (items.generation !== itemsGen);
 
-         return result;
 
-     },
 
-     getScrollbarsNeeded: function (width, height, contentWidth, contentHeight) {
 
-         var scrollbarSize = Ext.getScrollbarSize(),
 
-             hasWidth = typeof width == 'number',
 
-             hasHeight = typeof height == 'number',
 
-             needHorz = 0,
 
-             needVert = 0;
 
-         // No space-consuming scrollbars.
 
-         if (!scrollbarSize.width) {
 
-             return 0;
 
-         }
 
-         if (hasHeight && height < contentHeight) {
 
-             needVert = 2;
 
-             width -= scrollbarSize.width;
 
-         }
 
-         if (hasWidth && width < contentWidth) {
 
-             needHorz = 1;
 
-             if (!needVert && hasHeight) {
 
-                 height -= scrollbarSize.height;
 
-                 if (height < contentHeight) {
 
-                     needVert = 2;
 
-                 }
 
-             }
 
-         }
 
-         return needVert + needHorz;
 
-     },
 
- <span id='Ext-layout-container-Container-property-getScrollRangeFlags'>    /**
 
- </span>     * Returns flags indicating cross-browser handling of scrollHeight/Width. In particular,
 
-      * IE has issues with padding-bottom in a scrolling element (it does not include that
 
-      * padding in the scrollHeight). Also, margin-bottom on a child in a scrolling element
 
-      * can be lost.
 
-      * 
 
-      * All browsers seem to ignore margin-right on children and padding-right on the parent
 
-      * element (the one with the overflow)
 
-      * 
 
-      * This method returns a number with the follow bit positions set based on things not
 
-      * accounted for in scrollHeight and scrollWidth:
 
-      *
 
-      *  - 1: Scrolling element's padding-bottom is not included in scrollHeight.
 
-      *  - 2: Last child's margin-bottom is not included in scrollHeight.
 
-      *  - 4: Scrolling element's padding-right is not included in scrollWidth.
 
-      *  - 8: Child's margin-right is not included in scrollWidth.
 
-      *
 
-      * To work around the margin-bottom issue, it is sufficient to create a 0px tall last
 
-      * child that will "hide" the margin. This can also be handled by wrapping the children
 
-      * in an element, again "hiding" the margin. Wrapping the elements is about the only
 
-      * way to preserve their right margins. This is the strategy used by Column layout.
 
-      *
 
-      * To work around the padding-bottom problem, since it is comes from a style on the
 
-      * parent element, about the only simple fix is to create a last child with height
 
-      * equal to padding-bottom. To preserve the right padding, the sizing element needs to
 
-      * have a width that includes the right padding.
 
-      */
 
-     getScrollRangeFlags: (function () {
 
-         var flags = -1;
 
-         return function () {
 
-             if (flags < 0) {
 
-                 var div = Ext.getBody().createChild({
 
-                         //cls: 'x-border-box x-hide-offsets',
 
-                         cls: Ext.baseCSSPrefix + 'border-box',
 
-                         style: {
 
-                             width: '100px', height: '100px', padding: '10px',
 
-                             overflow: 'auto'
 
-                         },
 
-                         children: [{
 
-                             style: {
 
-                                 border: '1px solid red',
 
-                                 width: '150px', height: '150px',
 
-                                 margin: '0 5px 5px 0' // TRBL
 
-                             }
 
-                         }]
 
-                     }),
 
-                     scrollHeight = div.dom.scrollHeight,
 
-                     scrollWidth = div.dom.scrollWidth,
 
-                     heightFlags = {
 
-                         // right answer, nothing missing:
 
-                         175: 0,
 
-                         // missing parent padding-bottom:
 
-                         165: 1,
 
-                         // missing child margin-bottom:
 
-                         170: 2,
 
-                         // missing both
 
-                         160: 3
 
-                     },
 
-                     widthFlags = {
 
-                         // right answer, nothing missing:
 
-                         175: 0,
 
-                         // missing parent padding-right:
 
-                         165: 4,
 
-                         // missing child margin-right:
 
-                         170: 8,
 
-                         // missing both
 
-                         160: 12
 
-                     };
 
-                 flags = (heightFlags[scrollHeight] || 0) | (widthFlags[scrollWidth] || 0);
 
-                 //Ext.log('flags=',flags.toString(2));
 
-                 div.remove();
 
-             }
 
-             return flags;
 
-         };
 
-     }()),
 
- <span id='Ext-layout-container-Container-method-getTarget'>    /**
 
- </span>     * Returns the owner component's resize element.
 
-      * @return {Ext.Element}
 
-      */
 
-     getTarget: function() {
 
-         return this.owner.getTargetEl();
 
-     },
 
- <span id='Ext-layout-container-Container-method-getVisibleItems'>    /**
 
- </span>     * @protected
 
-      * Returns all items that are both rendered and visible
 
-      * @return {Array} All matching items
 
-      */
 
-     getVisibleItems: function() {
 
-         var target   = this.getRenderTarget(),
 
-             items = this.getLayoutItems(),
 
-             ln = items.length,
 
-             visibleItems = [],
 
-             i, item;
 
-         for (i = 0; i < ln; i++) {
 
-             item = items[i];
 
-             if (item.rendered && this.isValidParent(item, target, i) && item.hidden !== true) {
 
-                 visibleItems.push(item);
 
-             }
 
-         }
 
-         return visibleItems;
 
-     },
 
-     setupRenderTpl: function (renderTpl) {
 
-         var me = this;
 
-         renderTpl.renderBody = me.doRenderBody;
 
-         renderTpl.renderContainer = me.doRenderContainer;
 
-         renderTpl.renderItems = me.doRenderItems;
 
-         renderTpl.renderPadder = me.doRenderPadder;
 
-     }
 
- });
 
- </pre>
 
- </body>
 
- </html>
 
 
  |