123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140 |
- <!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-component-Dock'>/**
- </span> * This ComponentLayout handles docking for Panels. It takes care of panels that are
- * part of a ContainerLayout that sets this Panel's size and Panels that are part of
- * an AutoContainerLayout in which this panel get his height based of the CSS or
- * or its content.
- * @private
- */
- Ext.define('Ext.layout.component.Dock', {
- /* Begin Definitions */
- extend: 'Ext.layout.component.Component',
- alias: 'layout.dock',
- alternateClassName: 'Ext.layout.component.AbstractDock',
- /* End Definitions */
- type: 'dock',
- initializedBorders: -1,
- horizontalCollapsePolicy: { width: true, x: true },
- verticalCollapsePolicy: { height: true, y: true },
- finishRender: function () {
- var me = this,
- target, items;
- me.callParent();
- target = me.getRenderTarget();
- items = me.getDockedItems();
- me.finishRenderItems(target, items);
- },
- isItemBoxParent: function (itemContext) {
- return true;
- },
- isItemShrinkWrap: function (item) {
- return true;
- },
- dockOpposites: {
- top: 'bottom',
- right: 'left',
- bottom: 'top',
- left: 'right'
- },
- handleItemBorders: function() {
- var me = this,
- owner = me.owner,
- borders, docked,
- oldBorders = me.borders,
- opposites = me.dockOpposites,
- currentGeneration = owner.dockedItems.generation,
- i, ln, item, dock, side, borderItem,
- collapsed = me.collapsed;
- if (me.initializedBorders == currentGeneration || (owner.border && !owner.manageBodyBorders)) {
- return;
- }
- me.initializedBorders = currentGeneration;
- // Borders have to be calculated using expanded docked item collection.
- me.collapsed = false;
- docked = me.getLayoutItems();
- me.collapsed = collapsed;
- borders = { top: [], right: [], bottom: [], left: [] };
- for (i = 0, ln = docked.length; i < ln; i++) {
- item = docked[i];
- dock = item.dock;
- if (item.ignoreBorderManagement) {
- continue;
- }
- if (!borders[dock].satisfied) {
- borders[dock].push(item);
- borders[dock].satisfied = true;
- }
- if (!borders.top.satisfied && opposites[dock] !== 'top') {
- borders.top.push(item);
- }
- if (!borders.right.satisfied && opposites[dock] !== 'right') {
- borders.right.push(item);
- }
- if (!borders.bottom.satisfied && opposites[dock] !== 'bottom') {
- borders.bottom.push(item);
- }
- if (!borders.left.satisfied && opposites[dock] !== 'left') {
- borders.left.push(item);
- }
- }
- if (oldBorders) {
- for (side in oldBorders) {
- if (oldBorders.hasOwnProperty(side)) {
- ln = oldBorders[side].length;
- if (!owner.manageBodyBorders) {
- for (i = 0; i < ln; i++) {
- borderItem = oldBorders[side][i];
- if (!borderItem.isDestroyed) {
- borderItem.removeCls(Ext.baseCSSPrefix + 'docked-noborder-' + side);
- }
- }
- if (!oldBorders[side].satisfied && !owner.bodyBorder) {
- owner.removeBodyCls(Ext.baseCSSPrefix + 'docked-noborder-' + side);
- }
- }
- else if (oldBorders[side].satisfied) {
- owner.setBodyStyle('border-' + side + '-width', '');
- }
- }
- }
- }
- for (side in borders) {
- if (borders.hasOwnProperty(side)) {
- ln = borders[side].length;
- if (!owner.manageBodyBorders) {
- for (i = 0; i < ln; i++) {
- borders[side][i].addCls(Ext.baseCSSPrefix + 'docked-noborder-' + side);
- }
- if ((!borders[side].satisfied && !owner.bodyBorder) || owner.bodyBorder === false) {
- owner.addBodyCls(Ext.baseCSSPrefix + 'docked-noborder-' + side);
- }
- }
- else if (borders[side].satisfied) {
- owner.setBodyStyle('border-' + side + '-width', '1px');
- }
- }
- }
- me.borders = borders;
- },
- beforeLayoutCycle: function (ownerContext) {
- var me = this,
- owner = me.owner,
- shrinkWrap = me.sizeModels.shrinkWrap,
- collapsedHorz, collapsedVert;
- if (owner.collapsed) {
- if (owner.collapsedVertical()) {
- collapsedVert = true;
- ownerContext.measureDimensions = 1;
- } else {
- collapsedHorz = true;
- ownerContext.measureDimensions = 2;
- }
- }
- ownerContext.collapsedVert = collapsedVert;
- ownerContext.collapsedHorz = collapsedHorz;
- // If we are collapsed, we want to auto-layout using the placeholder/expander
- // instead of the normal items/dockedItems. This must be done here since we could
- // be in a box layout w/stretchmax which sets the width/heightModel to allow it to
- // control the size.
- if (collapsedVert) {
- ownerContext.heightModel = shrinkWrap;
- } else if (collapsedHorz) {
- ownerContext.widthModel = shrinkWrap;
- }
- },
- beginLayout: function(ownerContext) {
- var me = this,
- owner = me.owner,
- docked = me.getLayoutItems(),
- layoutContext = ownerContext.context,
- dockedItemCount = docked.length,
- dockedItems, i, item, itemContext, offsets,
- collapsed;
- me.callParent(arguments);
- me.handleItemBorders();
- // Cache the children as ContextItems (like a Container). Also setup to handle
- // collapsed state:
- collapsed = owner.getCollapsed();
- if (collapsed !== me.lastCollapsedState && Ext.isDefined(me.lastCollapsedState)) {
- // If we are collapsing...
- if (me.owner.collapsed) {
- ownerContext.isCollapsingOrExpanding = 1;
- // Add the collapsed class now, so that collapsed CSS rules are applied before measurements are taken by the layout.
- owner.addClsWithUI(owner.collapsedCls);
- } else {
- ownerContext.isCollapsingOrExpanding = 2;
- // Remove the collapsed class now, before layout calculations are done.
- owner.removeClsWithUI(owner.collapsedCls);
- ownerContext.lastCollapsedState = me.lastCollapsedState;
- }
- }
- me.lastCollapsedState = collapsed;
- ownerContext.dockedItems = dockedItems = [];
- for (i = 0; i < dockedItemCount; i++) {
- item = docked[i];
- if (item.rendered) {
- itemContext = layoutContext.getCmp(item);
- itemContext.dockedAt = { x: 0, y: 0 };
- itemContext.offsets = offsets = Ext.Element.parseBox(item.offsets || {});
- offsets.width = offsets.left + offsets.right;
- offsets.height = offsets.top + offsets.bottom;
- dockedItems.push(itemContext);
- }
- }
- ownerContext.bodyContext = ownerContext.getEl('body');
- },
- beginLayoutCycle: function(ownerContext) {
- var me = this,
- docked = ownerContext.dockedItems,
- len = docked.length,
- owner = me.owner,
- frameBody = owner.frameBody,
- lastHeightModel = me.lastHeightModel,
- i, item, dock;
- me.callParent(arguments);
- if (lastHeightModel && lastHeightModel.shrinkWrap &&
- !ownerContext.heightModel.shrinkWrap && !me.owner.manageHeight) {
- owner.body.dom.style.marginBottom = '';
- }
- if (ownerContext.widthModel.auto) {
- if (ownerContext.widthModel.shrinkWrap) {
- owner.el.setWidth(null);
- }
- owner.body.setWidth(null);
- if (frameBody) {
- frameBody.setWidth(null);
- }
- }
- if (ownerContext.heightModel.auto) {
- owner.body.setHeight(null);
- //owner.el.setHeight(null); Disable this for now
- if (frameBody) {
- frameBody.setHeight(null);
- }
- }
- // Each time we begin (2nd+ would be due to invalidate) we need to publish the
- // known contentWidth/Height if we are collapsed:
- if (ownerContext.collapsedVert) {
- ownerContext.setContentHeight(0);
- } else if (ownerContext.collapsedHorz) {
- ownerContext.setContentWidth(0);
- }
- // dock: 'right' items, when a panel gets narrower get "squished". Moving them to
- // left:0px avoids this!
- for (i = 0; i < len; i++) {
- item = docked[i].target;
- dock = item.dock;
- if (dock == 'right') {
- item.el.setLeft(0);
- } else if (dock != 'left') {
- continue;
- }
- // TODO - clear width/height?
- }
- },
- calculate: function (ownerContext) {
- var me = this,
- measure = me.measureAutoDimensions(ownerContext, ownerContext.measureDimensions),
- state = ownerContext.state,
- horzDone = state.horzDone,
- vertDone = state.vertDone,
- bodyContext = ownerContext.bodyContext,
- horz, vert, forward, backward;
- // make sure we can use these value w/o calling methods to get them
- ownerContext.borderInfo || ownerContext.getBorderInfo();
- ownerContext.paddingInfo || ownerContext.getPaddingInfo();
- ownerContext.framingInfo || ownerContext.getFraming();
- bodyContext.borderInfo || bodyContext.getBorderInfo();
- bodyContext.paddingInfo || bodyContext.getPaddingInfo();
- // Start the axes so they are ready to proceed inwards (fixed-size) or outwards
- // (shrinkWrap) and stash key property names as well:
- horz = !horzDone &&
- me.createAxis(ownerContext, measure.contentWidth, ownerContext.widthModel,
- 'left', 'right', 'x', 'width', 'Width', ownerContext.collapsedHorz);
- vert = !vertDone &&
- me.createAxis(ownerContext, measure.contentHeight, ownerContext.heightModel,
- 'top', 'bottom', 'y', 'height', 'Height', ownerContext.collapsedVert);
- // We iterate forward and backward over the dockedItems at the same time based on
- // whether an axis is shrinkWrap or fixed-size. For a fixed-size axis, the outer box
- // axis is allocated to docked items in forward order and is reduced accordingly.
- // To handle a shrinkWrap axis, the box starts at the inner (body) size and is used to
- // size docked items in backwards order. This is because the last docked item shares
- // an edge with the body. The item size is used to adjust the shrinkWrap axis outwards
- // until the first docked item (at the outermost edge) is processed. This backwards
- // order ensures that docked items never get an incorrect size for any dimension.
- for (forward = 0, backward = ownerContext.dockedItems.length; backward--; ++forward) {
- if (horz) {
- me.dockChild(ownerContext, horz, backward, forward);
- }
- if (vert) {
- me.dockChild(ownerContext, vert, backward, forward);
- }
- }
- if (horz && me.finishAxis(ownerContext, horz)) {
- state.horzDone = horzDone = horz;
- }
- if (vert && me.finishAxis(ownerContext, vert)) {
- state.vertDone = vertDone = vert;
- }
- // Once all items are docked, the final size of the outer panel or inner body can
- // be determined. If we can determine both width and height, we are done.
- if (horzDone && vertDone && me.finishConstraints(ownerContext, horzDone, vertDone)) {
- // Size information is published as we dock items but position is hard to do
- // that way (while avoiding published multiple times) so we publish all the
- // positions at the end.
- me.finishPositions(ownerContext, horzDone, vertDone);
- } else {
- me.done = false;
- }
- },
- <span id='Ext-layout-component-Dock-method-createAxis'> /**
- </span> * Creates an axis object given the particulars.
- * @private
- */
- createAxis: function (ownerContext, contentSize, sizeModel, dockBegin, dockEnd, posProp,
- sizeProp, sizePropCap, collapsedAxis) {
- var begin = 0,
- owner = this.owner,
- maxSize = owner['max' + sizePropCap],
- minSize = owner['min' + sizePropCap] || 0,
- hasMaxSize = maxSize != null, // exactly the same as "maxSize !== null && maxSize !== undefined"
- setSize = 'set' + sizePropCap,
- border, bodyContext, frameSize, padding, end;
- if (sizeModel.shrinkWrap) {
- // End position before adding docks around the content is content size plus the body borders in this axis.
- // If collapsed in this axis, the body borders will not be shown.
- if (collapsedAxis) {
- end = 0;
- } else {
- bodyContext = ownerContext.bodyContext;
- end = contentSize + bodyContext.borderInfo[sizeProp];
- }
- } else {
- border = ownerContext.borderInfo;
- frameSize = ownerContext.framingInfo;
- padding = ownerContext.paddingInfo;
- end = ownerContext.getProp(sizeProp);
- end -= border[dockEnd] + padding[dockEnd] + frameSize[dockEnd];
- begin = border[dockBegin] + padding[dockBegin] + frameSize[dockBegin];
- }
- return {
- shrinkWrap: sizeModel.shrinkWrap,
- sizeModel: sizeModel,
- // An axis tracks start and end+1 px positions. eg 0 to 10 for 10px high
- begin: begin,
- end: end,
- collapsed: collapsedAxis,
- horizontal: posProp == 'x',
- ignoreFrameBegin: false,
- ignoreFrameEnd: false,
- initialSize: end - begin,
- hasMinMaxConstraints: (minSize || hasMaxSize) && sizeModel.shrinkWrap,
- minSize: minSize,
- maxSize: hasMaxSize ? maxSize : 1e9,
- bodyPosProp: this.owner.manageHeight ? posProp : ('margin-' + dockBegin), // 'margin-left' or 'margin-top'
- dockBegin: dockBegin, // 'left' or 'top'
- dockEnd: dockEnd, // 'right' or 'end'
- posProp: posProp, // 'x' or 'y'
- sizeProp: sizeProp, // 'width' or 'height'
- sizePropCap: sizePropCap, // 'Width' or 'Height'
- setSize: setSize,
- dockedPixelsEnd: 0
- };
- },
- <span id='Ext-layout-component-Dock-method-dockChild'> /**
- </span> * Docks a child item on the specified axis. This boils down to determining if the item
- * is docked at the "beginning" of the axis ("left" if horizontal, "top" if vertical),
- * the "end" of the axis ("right" if horizontal, "bottom" if vertical) or stretches
- * along the axis ("top" or "bottom" if horizontal, "left" or "right" if vertical). It
- * also has to differentiate between fixed and shrinkWrap sized dimensions.
- * @private
- */
- dockChild: function (ownerContext, axis, backward, forward) {
- var me = this,
- itemContext = ownerContext.dockedItems[axis.shrinkWrap ? backward : forward],
- item = itemContext.target,
- dock = item.dock, // left/top/right/bottom
- pos;
- if(item.ignoreParentFrame && ownerContext.isCollapsingOrExpanding) {
- // collapsed window header margins may differ from expanded window header margins
- // so we need to make sure the old cached values are not used in axis calculations
- itemContext.clearMarginCache();
- }
- if (dock == axis.dockBegin) {
- if (axis.shrinkWrap) {
- pos = me.dockOutwardBegin(ownerContext, itemContext, item, axis);
- } else {
- pos = me.dockInwardBegin(ownerContext, itemContext, item, axis);
- }
- } else if (dock == axis.dockEnd) {
- if (axis.shrinkWrap) {
- pos = me.dockOutwardEnd(ownerContext, itemContext, item, axis);
- } else {
- pos = me.dockInwardEnd(ownerContext, itemContext, item, axis);
- }
- } else {
- pos = me.dockStretch(ownerContext, itemContext, item, axis);
- }
- itemContext.dockedAt[axis.posProp] = pos;
- },
- <span id='Ext-layout-component-Dock-method-dockInwardBegin'> /**
- </span> * Docks an item on a fixed-size axis at the "beginning". The "beginning" of the horizontal
- * axis is "left" and the vertical is "top". For a fixed-size axis, the size works from
- * the outer element (the panel) towards the body.
- * @private
- */
- dockInwardBegin: function (ownerContext, itemContext, item, axis) {
- var pos = axis.begin,
- sizeProp = axis.sizeProp,
- size,
- dock;
- if (item.ignoreParentFrame) {
- dock = item.dock;
- pos -= ownerContext.borderInfo[dock] + ownerContext.paddingInfo[dock] +
- ownerContext.framingInfo[dock];
- }
- if (!item.overlay) {
- size = itemContext.getProp(sizeProp) + itemContext.getMarginInfo()[sizeProp];
- axis.begin += size;
- }
- return pos;
- },
- <span id='Ext-layout-component-Dock-method-dockInwardEnd'> /**
- </span> * Docks an item on a fixed-size axis at the "end". The "end" of the horizontal axis is
- * "right" and the vertical is "bottom".
- * @private
- */
- dockInwardEnd: function (ownerContext, itemContext, item, axis) {
- var sizeProp = axis.sizeProp,
- size = itemContext.getProp(sizeProp) + itemContext.getMarginInfo()[sizeProp],
- pos = axis.end - size;
- if (!item.overlay) {
- axis.end = pos;
- }
- if (item.ignoreParentFrame) {
- pos += ownerContext.borderInfo[item.dock] + ownerContext.paddingInfo[item.dock] +
- ownerContext.framingInfo[item.dock];
- }
- return pos;
- },
- <span id='Ext-layout-component-Dock-method-dockOutwardBegin'> /**
- </span> * Docks an item on a shrinkWrap axis at the "beginning". The "beginning" of the horizontal
- * axis is "left" and the vertical is "top". For a shrinkWrap axis, the size works from
- * the body outward to the outermost element (the panel).
- *
- * During the docking process, coordinates are allowed to be negative. We start with the
- * body at (0,0) so items docked "top" or "left" will simply be assigned negative x/y. In
- * the {@link #finishPositions} method these are corrected and framing is added. This way
- * the correction is applied as a simple translation of delta x/y on all coordinates to
- * bring the origin back to (0,0).
- * @private
- */
- dockOutwardBegin: function (ownerContext, itemContext, item, axis) {
- var pos = axis.begin,
- sizeProp = axis.sizeProp,
- dock, size;
- if (axis.collapsed) {
- axis.ignoreFrameBegin = axis.ignoreFrameEnd = true;
- } else if (item.ignoreParentFrame) {
- dock = item.dock;
- pos -= ownerContext.borderInfo[dock] + ownerContext.paddingInfo[dock] +
- ownerContext.framingInfo[dock];
- axis.ignoreFrameBegin = true;
- }
- if (!item.overlay) {
- size = itemContext.getProp(sizeProp) + itemContext.getMarginInfo()[sizeProp];
- pos -= size;
- axis.begin = pos;
- }
- return pos;
- },
- <span id='Ext-layout-component-Dock-method-dockOutwardEnd'> /**
- </span> * Docks an item on a shrinkWrap axis at the "end". The "end" of the horizontal axis is
- * "right" and the vertical is "bottom".
- * @private
- */
- dockOutwardEnd: function (ownerContext, itemContext, item, axis) {
- var pos = axis.end,
- sizeProp = axis.sizeProp,
- dock, size;
- size = itemContext.getProp(sizeProp) + itemContext.getMarginInfo()[sizeProp];
- if (axis.collapsed) {
- axis.ignoreFrameBegin = axis.ignoreFrameEnd = true;
- } else if (item.ignoreParentFrame) {
- dock = item.dock;
- pos += ownerContext.borderInfo[dock] + ownerContext.paddingInfo[dock] +
- ownerContext.framingInfo[dock];
- axis.ignoreFrameEnd = true;
- }
- if (!item.overlay) {
- axis.end = pos + size;
- axis.dockedPixelsEnd += size;
- }
- return pos;
- },
- <span id='Ext-layout-component-Dock-method-dockStretch'> /**
- </span> * Docks an item that might stretch across an axis. This is done for dock "top" and
- * "bottom" items on the horizontal axis and dock "left" and "right" on the vertical.
- * @private
- */
- dockStretch: function (ownerContext, itemContext, item, axis) {
- var dock = item.dock, // left/top/right/bottom (also used to index padding/border)
- sizeProp = axis.sizeProp, // 'width' or 'height'
- horizontal = dock == 'top' || dock == 'bottom',
- offsets = itemContext.offsets,
- border = ownerContext.borderInfo,
- padding = ownerContext.paddingInfo,
- endProp = horizontal ? 'right' : 'bottom',
- startProp = horizontal ? 'left' : 'top',
- pos = axis.begin + offsets[startProp],
- margin, size, framing;
- if (item.stretch !== false) {
- size = axis.end - pos - offsets[endProp];
- if (item.ignoreParentFrame) {
- framing = ownerContext.framingInfo;
- pos -= border[startProp] + padding[startProp] + framing[startProp];
- size += border[sizeProp] + padding[sizeProp] + framing[sizeProp];
- }
- margin = itemContext.getMarginInfo();
- size -= margin[sizeProp];
- itemContext[axis.setSize](size);
- }
- return pos;
- },
- <span id='Ext-layout-component-Dock-method-finishAxis'> /**
- </span> * Finishes the calculation of an axis by determining its size. In non-shrink-wrap
- * cases, this is also where we set the body size.
- * @private
- */
- finishAxis: function (ownerContext, axis) {
- var size = axis.end - axis.begin,
- setSizeMethod = axis.setSize,
- beginName = axis.dockBegin, // left or top
- endName = axis.dockEnd, // right or bottom
- border = ownerContext.borderInfo,
- padding = ownerContext.paddingInfo,
- framing = ownerContext.framingInfo,
- frameSize = padding[beginName] + border[beginName] + framing[beginName],
- bodyContext = ownerContext.bodyContext,
- bodyPos, bodySize, dirty;
- if (axis.shrinkWrap) {
- // Since items docked left/top on a shrinkWrap axis go into negative coordinates,
- // we apply a delta to all coordinates to adjust their relative origin back to
- // (0,0).
- axis.delta = -axis.begin; // either 0 or a positive number
- bodySize = axis.initialSize;
- if (axis.ignoreFrameBegin) {
- axis.delta -= border[beginName];
- bodyPos = -axis.begin - frameSize;
- } else {
- size += frameSize;
- axis.delta += padding[beginName] + framing[beginName];
- bodyPos = -axis.begin;
- }
- if (!axis.ignoreFrameEnd) {
- size += padding[endName] + border[endName] + framing[endName];
- }
- axis.size = size; // we have to wait for min/maxWidth/Height processing
- if (!axis.horizontal && !this.owner.manageHeight) {
- // the height of the bodyEl will give the proper height to the outerEl so
- // we don't need to set heights in the DOM
- dirty = false;
- }
- } else {
- // For a fixed-size axis, we started at the outer box and already have the
- // proper origin... almost... except for the owner's border.
- axis.delta = -border[axis.dockBegin]; // 'left' or 'top'
- // Body size is remaining space between ends of Axis.
- bodySize = size;
- bodyPos = axis.begin - frameSize;
- }
- bodyContext[setSizeMethod](bodySize, dirty);
- bodyContext.setProp(axis.bodyPosProp, bodyPos);
- return !isNaN(size);
- },
- <span id='Ext-layout-component-Dock-method-finishConstraints'> /**
- </span> * Finishes processing of each axis by applying the min/max size constraints.
- * @private
- */
- finishConstraints: function (ownerContext, horz, vert) {
- var sizeModels = this.sizeModels,
- publishWidth = horz.shrinkWrap,
- publishHeight = vert.shrinkWrap,
- dirty, height, width, heightModel, widthModel, size;
- if (publishWidth) {
- size = horz.size;
- if (size < horz.minSize) {
- widthModel = sizeModels.constrainedMin;
- width = horz.minSize;
- } else if (size > horz.maxSize) {
- widthModel = sizeModels.constrainedMax;
- width = horz.maxSize;
- } else {
- width = size;
- }
- }
- if (publishHeight) {
- size = vert.size;
- if (size < vert.minSize) {
- heightModel = sizeModels.constrainedMin;
- height = vert.minSize;
- } else if (size > vert.maxSize) {
- heightModel = sizeModels.constrainedMax;
- height = vert.maxSize;
- } else {
- if (!ownerContext.collapsedVert && !this.owner.manageHeight) {
- // height of the outerEl is provided by the height (including margins)
- // of the bodyEl, so this value does not need to be written to the DOM
- dirty = false;
- // so long as we set top and bottom margins on the bodyEl!
- ownerContext.bodyContext.setProp('margin-bottom', vert.dockedPixelsEnd);
- }
- height = size;
- }
- }
- // Handle the constraints...
- if (widthModel || heightModel) {
- // See ContextItem#init for an analysis of why this case is special. Basically,
- // in this case, we only know the width and the height could be anything.
- if (widthModel && heightModel &&
- widthModel.constrainedMax && heightModel.constrainedMin) {
- ownerContext.invalidate({ widthModel: widthModel });
- return false;
- }
- // To process a width or height other than that to which we have shrinkWrapped,
- // we need to invalidate our component and carry forward w/these constrains...
- // unless the ownerLayout wants these results and will invalidate us anyway.
- if (!ownerContext.widthModel.calculatedFromShrinkWrap &&
- !ownerContext.heightModel.calculatedFromShrinkWrap) {
- // nope, just us to handle the constraint...
- ownerContext.invalidate({ widthModel: widthModel, heightModel: heightModel });
- return false;
- }
- // We have a constraint to deal with, so we just adjust the size models and
- // allow the ownerLayout to invalidate us with its contribution to our final
- // size...
- }
- // we only publish the sizes if we are not invalidating the result...
- if (publishWidth) {
- ownerContext.setWidth(width);
- if (widthModel) {
- ownerContext.widthModel = widthModel; // important to the ownerLayout
- }
- }
- if (publishHeight) {
- ownerContext.setHeight(height, dirty);
- if (heightModel) {
- ownerContext.heightModel = heightModel; // important to the ownerLayout
- }
- }
- return true;
- },
- <span id='Ext-layout-component-Dock-method-finishPositions'> /**
- </span> * Finishes the calculation by setting positions on the body and all of the items.
- * @private
- */
- finishPositions: function (ownerContext, horz, vert) {
- var dockedItems = ownerContext.dockedItems,
- length = dockedItems.length,
- deltaX = horz.delta,
- deltaY = vert.delta,
- index, itemContext;
- for (index = 0; index < length; ++index) {
- itemContext = dockedItems[index];
- itemContext.setProp('x', deltaX + itemContext.dockedAt.x);
- itemContext.setProp('y', deltaY + itemContext.dockedAt.y);
- }
- },
- finishedLayout: function(ownerContext) {
- var me = this,
- target = ownerContext.target;
- me.callParent(arguments);
- if (!ownerContext.animatePolicy) {
- if (ownerContext.isCollapsingOrExpanding === 1) {
- target.afterCollapse(false);
- } else if (ownerContext.isCollapsingOrExpanding === 2) {
- target.afterExpand(false);
- }
- }
- },
- getAnimatePolicy: function(ownerContext) {
- var me = this,
- lastCollapsedState, policy;
- if (ownerContext.isCollapsingOrExpanding == 1) {
- lastCollapsedState = me.lastCollapsedState;
- } else if (ownerContext.isCollapsingOrExpanding == 2) {
- lastCollapsedState = ownerContext.lastCollapsedState;
- }
- if (lastCollapsedState == 'left' || lastCollapsedState == 'right') {
- policy = me.horizontalCollapsePolicy;
- } else if (lastCollapsedState == 'top' || lastCollapsedState == 'bottom') {
- policy = me.verticalCollapsePolicy;
- }
- return policy;
- },
- <span id='Ext-layout-component-Dock-method-getDockedItems'> /**
- </span> * Retrieve an ordered and/or filtered array of all docked Components.
- * @param {String} [order='render'] The desired ordering of the items ('render' or 'visual').
- * @param {Boolean} [beforeBody] An optional flag to limit the set of items to only those
- * before the body (true) or after the body (false). All components are returned by
- * default.
- * @return {Ext.Component[]} An array of components.
- * @protected
- */
- getDockedItems: function(order, beforeBody) {
- var me = this,
- renderedOnly = (order === 'visual'),
- all = renderedOnly ? Ext.ComponentQuery.query('[rendered]', me.owner.dockedItems.items) : me.owner.dockedItems.items,
- sort = all && all.length && order !== false,
- renderOrder,
- dock, dockedItems, i, isBefore, length;
- if (beforeBody == null) {
- dockedItems = sort && !renderedOnly ? all.slice() : all;
- } else {
- dockedItems = [];
- for (i = 0, length = all.length; i < length; ++i) {
- dock = all[i].dock;
- isBefore = (dock == 'top' || dock == 'left');
- if (beforeBody ? isBefore : !isBefore) {
- dockedItems.push(all[i]);
- }
- }
- sort = sort && dockedItems.length;
- }
- if (sort) {
- renderOrder = (order = order || 'render') == 'render';
- Ext.Array.sort(dockedItems, function(a, b) {
- var aw,
- bw;
- // If the two items are on opposite sides of the body, they must not be sorted by any weight value:
- // For rendering purposes, left/top *always* sorts before right/bottom
- if (renderOrder && ((aw = me.owner.dockOrder[a.dock]) !== (bw = me.owner.dockOrder[b.dock]))) {
- // The two dockOrder values cancel out when two items are on opposite sides.
- if (!(aw + bw)) {
- return aw - bw;
- }
- }
- aw = me.getItemWeight(a, order);
- bw = me.getItemWeight(b, order);
- if ((aw !== undefined) && (bw !== undefined)) {
- return aw - bw;
- }
- return 0;
- });
- }
- return dockedItems || [];
- },
- getItemWeight: function (item, order) {
- var weight = item.weight || this.owner.defaultDockWeights[item.dock];
- return weight[order] || weight;
- },
- <span id='Ext-layout-component-Dock-method-getLayoutItems'> /**
- </span> * @protected
- * Returns an array containing all the **visible** docked items inside this layout's owner Panel
- * @return {Array} An array containing all the **visible** docked items of the Panel
- */
- getLayoutItems : function() {
- var me = this,
- items,
- itemCount,
- item,
- i,
- result;
- if (me.owner.collapsed) {
- result = me.owner.getCollapsedDockedItems();
- } else {
- items = me.getDockedItems('visual');
- itemCount = items.length;
- result = [];
- for (i = 0; i < itemCount; i++) {
- item = items[i];
- if (!item.hidden) {
- result.push(item);
- }
- }
- }
- return result;
- },
- // Content size includes padding but not borders, so subtract them off
- measureContentWidth: function (ownerContext) {
- var bodyContext = ownerContext.bodyContext;
- return bodyContext.el.getWidth() - bodyContext.getBorderInfo().width;
- },
- measureContentHeight: function (ownerContext) {
- var bodyContext = ownerContext.bodyContext;
- return bodyContext.el.getHeight() - bodyContext.getBorderInfo().height;
- },
-
- redoLayout: function(ownerContext) {
- var me = this,
- owner = me.owner;
-
- // If we are collapsing...
- if (ownerContext.isCollapsingOrExpanding == 1) {
- if (owner.reExpander) {
- owner.reExpander.el.show();
- }
- // Add the collapsed class now, so that collapsed CSS rules are applied before measurements are taken by the layout.
- owner.addClsWithUI(owner.collapsedCls);
- ownerContext.redo(true);
- } else if (ownerContext.isCollapsingOrExpanding == 2) {
- // Remove the collapsed class now, before layout calculations are done.
- owner.removeClsWithUI(owner.collapsedCls);
- ownerContext.bodyContext.redo();
- }
- },
- // @private override inherited.
- // We need to render in the correct order, top/left before bottom/right
- renderChildren: function() {
- var me = this,
- items = me.getDockedItems(),
- target = me.getRenderTarget();
- me.renderItems(items, target);
- },
- <span id='Ext-layout-component-Dock-method-renderItems'> /**
- </span> * @protected
- * Render the top and left docked items before any existing DOM nodes in our render target,
- * and then render the right and bottom docked items after. This is important, for such things
- * as tab stops and ARIA readers, that the DOM nodes are in a meaningful order.
- * Our collection of docked items will already be ordered via Panel.getDockedItems().
- */
- renderItems: function(items, target) {
- var me = this,
- dockedItemCount = items.length,
- itemIndex = 0,
- correctPosition = 0,
- staticNodeCount = 0,
- targetNodes = me.getRenderTarget().dom.childNodes,
- targetChildCount = targetNodes.length,
- i, j, targetChildNode, item;
- // Calculate the number of DOM nodes in our target that are not our docked items
- for (i = 0, j = 0; i < targetChildCount; i++) {
- targetChildNode = targetNodes[i];
- if (Ext.fly(targetChildNode).hasCls('x-resizable-handle')) {
- break;
- }
- for (j = 0; j < dockedItemCount; j++) {
- item = items[j];
- if (item.rendered && item.el.dom === targetChildNode) {
- break;
- }
- }
- // Walked off the end of the docked items without matching the found child node;
- // Then it's a static node.
- if (j === dockedItemCount) {
- staticNodeCount++;
- }
- }
- // Now we go through our docked items and render/move them
- for (; itemIndex < dockedItemCount; itemIndex++, correctPosition++) {
- item = items[itemIndex];
- // If we're now at the first right/bottom docked item, we jump over the body element.
- //
- // TODO: This is affected if users provide custom weight values to their
- // docked items, which puts it out of (t,l,r,b) order. Avoiding a second
- // sort operation here, for now, in the name of performance. getDockedItems()
- // needs the sort operation not just for this layout-time rendering, but
- // also for getRefItems() to return a logical ordering (FocusManager, CQ, et al).
- if (itemIndex === correctPosition && (item.dock === 'right' || item.dock === 'bottom')) {
- correctPosition += staticNodeCount;
- }
- // Same logic as Layout.renderItems()
- if (item && !item.rendered) {
- me.renderItem(item, target, correctPosition);
- }
- else if (!me.isValidParent(item, target, correctPosition)) {
- me.moveItem(item, target, correctPosition);
- }
- }
- },
- undoLayout: function(ownerContext) {
- var me = this,
- owner = me.owner;
-
- // If we are collapsing...
- if (ownerContext.isCollapsingOrExpanding == 1) {
- // We do not want to see the re-expander header until the final collapse is complete
- if (owner.reExpander) {
- owner.reExpander.el.hide();
- }
- // Add the collapsed class now, so that collapsed CSS rules are applied before measurements are taken by the layout.
- owner.removeClsWithUI(owner.collapsedCls);
- ownerContext.undo(true);
- } else if (ownerContext.isCollapsingOrExpanding == 2) {
- // Remove the collapsed class now, before layout calculations are done.
- owner.addClsWithUI(owner.collapsedCls);
- ownerContext.bodyContext.undo();
- }
- },
- sizePolicy: {
- nostretch: {
- setsWidth: 0,
- setsHeight: 0
- },
- stretchH: {
- setsWidth: 1,
- setsHeight: 0
- },
- stretchV: {
- setsWidth: 0,
- setsHeight: 1
- },
- // Circular dependency with partial auto-sized panels:
- //
- // If we have an autoHeight docked item being stretched horizontally (top/bottom),
- // that stretching will determine its width and its width must be set before its
- // autoHeight can be determined. If that item is docked in an autoWidth panel, the
- // body will need its height set before it can determine its width, but the height
- // of the docked item is needed to subtract from the panel height in order to set
- // the body height.
- //
- // This same pattern occurs with autoHeight panels with autoWidth docked items on
- // left or right. If the panel is fully auto or fully fixed, these problems don't
- // come up because there is no dependency between the dimensions.
- //
- // Cutting the Gordian Knot: In these cases, we have to allow something to measure
- // itself without full context. This is OK as long as the managed dimension doesn't
- // effect the auto-dimension, which is often the case for things like toolbars. The
- // managed dimension only effects overflow handlers and such and does not change the
- // auto-dimension. To encourage the item to measure itself without waiting for the
- // managed dimension, we have to tell it that the layout will also be reading that
- // dimension. This is similar to how stretchmax works.
- autoStretchH: {
- readsWidth: 1,
- setsWidth: 1,
- setsHeight: 0
- },
- autoStretchV: {
- readsHeight: 1,
- setsWidth: 0,
- setsHeight: 1
- }
- },
- getItemSizePolicy: function (item) {
- var policy = this.sizePolicy,
- dock, vertical;
- if (item.stretch === false) {
- return policy.nostretch;
- }
- dock = item.dock;
- vertical = (dock == 'left' || dock == 'right');
- /*
- owner = this.owner;
- autoWidth = !owner.isFixedWidth();
- autoHeight = !owner.isFixedHeight();
- if (autoWidth !== autoHeight) { // if (partial auto)
- // see above...
- if (vertical) {
- if (autoHeight) {
- return policy.autoStretchV;
- }
- } else if (autoWidth) {
- return policy.autoStretchH;
- }
- }*/
- if (vertical) {
- return policy.stretchV;
- }
- return policy.stretchH;
- },
- <span id='Ext-layout-component-Dock-method-configureItem'> /**
- </span> * @protected
- * We are overriding the Ext.layout.Layout configureItem method to also add a class that
- * indicates the position of the docked item. We use the itemCls (x-docked) as a prefix.
- * An example of a class added to a dock: right item is x-docked-right
- * @param {Ext.Component} item The item we are configuring
- */
- configureItem : function(item, pos) {
- this.callParent(arguments);
- item.addCls(Ext.baseCSSPrefix + 'docked');
- item.addClsWithUI('docked-' + item.dock);
- },
- afterRemove : function(item) {
- this.callParent(arguments);
- if (this.itemCls) {
- item.el.removeCls(this.itemCls + '-' + item.dock);
- }
- var dom = item.el.dom;
- if (!item.destroying && dom) {
- dom.parentNode.removeChild(dom);
- }
- this.childrenChanged = true;
- }
- });
- </pre>
- </body>
- </html>
|