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>
|