BoxLayout.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:17k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.1.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. /**
  8.  * @class Ext.layout.BoxLayout
  9.  * @extends Ext.layout.ContainerLayout
  10.  * <p>Base Class for HBoxLayout and VBoxLayout Classes. Generally it should not need to be used directly.</p>
  11.  */
  12. Ext.layout.BoxLayout = Ext.extend(Ext.layout.ContainerLayout, {
  13.     /**
  14.      * @cfg {Object} defaultMargins
  15.      * <p>If the individual contained items do not have a <tt>margins</tt>
  16.      * property specified, the default margins from this property will be
  17.      * applied to each item.</p>
  18.      * <br><p>This property may be specified as an object containing margins
  19.      * to apply in the format:</p><pre><code>
  20. {
  21.     top: (top margin),
  22.     right: (right margin),
  23.     bottom: (bottom margin),
  24.     left: (left margin)
  25. }</code></pre>
  26.      * <p>This property may also be specified as a string containing
  27.      * space-separated, numeric margin values. The order of the sides associated
  28.      * with each value matches the way CSS processes margin values:</p>
  29.      * <div class="mdetail-params"><ul>
  30.      * <li>If there is only one value, it applies to all sides.</li>
  31.      * <li>If there are two values, the top and bottom borders are set to the
  32.      * first value and the right and left are set to the second.</li>
  33.      * <li>If there are three values, the top is set to the first value, the left
  34.      * and right are set to the second, and the bottom is set to the third.</li>
  35.      * <li>If there are four values, they apply to the top, right, bottom, and
  36.      * left, respectively.</li>
  37.      * </ul></div>
  38.      * <p>Defaults to:</p><pre><code>
  39.      * {top:0, right:0, bottom:0, left:0}
  40.      * </code></pre>
  41.      */
  42.     defaultMargins : {left:0,top:0,right:0,bottom:0},
  43.     /**
  44.      * @cfg {String} padding
  45.      * <p>Sets the padding to be applied to all child items managed by this layout.</p>
  46.      * <p>This property must be specified as a string containing
  47.      * space-separated, numeric padding values. The order of the sides associated
  48.      * with each value matches the way CSS processes padding values:</p>
  49.      * <div class="mdetail-params"><ul>
  50.      * <li>If there is only one value, it applies to all sides.</li>
  51.      * <li>If there are two values, the top and bottom borders are set to the
  52.      * first value and the right and left are set to the second.</li>
  53.      * <li>If there are three values, the top is set to the first value, the left
  54.      * and right are set to the second, and the bottom is set to the third.</li>
  55.      * <li>If there are four values, they apply to the top, right, bottom, and
  56.      * left, respectively.</li>
  57.      * </ul></div>
  58.      * <p>Defaults to: <code>"0"</code></p>
  59.      */
  60.     padding : '0',
  61.     // documented in subclasses
  62.     pack : 'start',
  63.     // private
  64.     monitorResize : true,
  65.     scrollOffset : 0,
  66.     extraCls : 'x-box-item',
  67.     targetCls : 'x-box-layout-ct',
  68.     innerCls : 'x-box-inner',
  69.     constructor : function(config){
  70.         Ext.layout.BoxLayout.superclass.constructor.call(this, config);
  71.         if(Ext.isString(this.defaultMargins)){
  72.             this.defaultMargins = this.parseMargins(this.defaultMargins);
  73.         }
  74.     },
  75.     // private
  76.     isValidParent : function(c, target){
  77.         return c.getPositionEl().dom.parentNode == this.innerCt.dom;
  78.     },
  79.     // private
  80.     onLayout : function(ct, target){
  81.         var cs = ct.items.items, len = cs.length, c, i, last = len-1, cm;
  82.         if(!this.innerCt){
  83.             // the innerCt prevents wrapping and shuffling while
  84.             // the container is resizing
  85.             this.innerCt = target.createChild({cls:this.innerCls});
  86.             this.padding = this.parseMargins(this.padding);
  87.         }
  88.         this.renderAll(ct, this.innerCt);
  89.     },
  90.     // private
  91.     renderItem : function(c){
  92.         if(Ext.isString(c.margins)){
  93.             c.margins = this.parseMargins(c.margins);
  94.         }else if(!c.margins){
  95.             c.margins = this.defaultMargins;
  96.         }
  97.         Ext.layout.BoxLayout.superclass.renderItem.apply(this, arguments);
  98.     },
  99.     // deprecate
  100.     getTargetSize : function(target){
  101.         return (Ext.isIE6 && Ext.isStrict && target.dom == document.body) ? target.getStyleSize() : target.getViewSize(true);
  102.     },
  103.     getItems: function(ct){
  104.         var items = [];
  105.         ct.items.each(function(c){
  106.             if(c.isVisible()){
  107.                 items.push(c);
  108.             }
  109.         });
  110.         return items;
  111.     }
  112. });
  113. /**
  114.  * @class Ext.layout.VBoxLayout
  115.  * @extends Ext.layout.BoxLayout
  116.  * <p>A layout that arranges items vertically down a Container. This layout optionally divides available vertical
  117.  * space between child items containing a numeric <code>flex</code> configuration.</p>
  118.  * This layout may also be used to set the widths of child items by configuring it with the {@link #align} option.
  119.  */
  120. Ext.layout.VBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
  121.     /**
  122.      * @cfg {String} align
  123.      * Controls how the child items of the container are aligned. Acceptable configuration values for this
  124.      * property are:
  125.      * <div class="mdetail-params"><ul>
  126.      * <li><b><tt>left</tt></b> : <b>Default</b><div class="sub-desc">child items are aligned horizontally
  127.      * at the <b>left</b> side of the container</div></li>
  128.      * <li><b><tt>center</tt></b> : <div class="sub-desc">child items are aligned horizontally at the
  129.      * <b>mid-width</b> of the container</div></li>
  130.      * <li><b><tt>stretch</tt></b> : <div class="sub-desc">child items are stretched horizontally to fill
  131.      * the width of the container</div></li>
  132.      * <li><b><tt>stretchmax</tt></b> : <div class="sub-desc">child items are stretched horizontally to
  133.      * the size of the largest item.</div></li>
  134.      * </ul></div>
  135.      */
  136.     align : 'left', // left, center, stretch, strechmax
  137.     /**
  138.      * @cfg {String} pack
  139.      * Controls how the child items of the container are packed together. Acceptable configuration values
  140.      * for this property are:
  141.      * <div class="mdetail-params"><ul>
  142.      * <li><b><tt>start</tt></b> : <b>Default</b><div class="sub-desc">child items are packed together at
  143.      * <b>top</b> side of container</div></li>
  144.      * <li><b><tt>center</tt></b> : <div class="sub-desc">child items are packed together at
  145.      * <b>mid-height</b> of container</div></li>
  146.      * <li><b><tt>end</tt></b> : <div class="sub-desc">child items are packed together at <b>bottom</b>
  147.      * side of container</div></li>
  148.      * </ul></div>
  149.      */
  150.     /**
  151.      * @cfg {Number} flex
  152.      * This configuation option is to be applied to <b>child <tt>items</tt></b> of the container managed
  153.      * by this layout. Each child item with a <tt>flex</tt> property will be flexed <b>vertically</b>
  154.      * according to each item's <b>relative</b> <tt>flex</tt> value compared to the sum of all items with
  155.      * a <tt>flex</tt> value specified.  Any child items that have either a <tt>flex = 0</tt> or
  156.      * <tt>flex = undefined</tt> will not be 'flexed' (the initial size will not be changed).
  157.      */
  158.     // private
  159.     onLayout : function(ct, target){
  160.         Ext.layout.VBoxLayout.superclass.onLayout.call(this, ct, target);
  161.         var cs = this.getItems(ct), cm, ch, margin, cl, diff, aw,
  162.             size = target.getViewSize(true),
  163.             w = size.width,
  164.             h = size.height - this.scrollOffset,
  165.             l = this.padding.left, t = this.padding.top,
  166.             isStart = this.pack == 'start',
  167.             stretchWidth = w - (this.padding.left + this.padding.right),
  168.             extraHeight = 0,
  169.             maxWidth = 0,
  170.             totalFlex = 0,
  171.             flexHeight = 0,
  172.             usedHeight = 0,
  173.             idx = 0,
  174.             heights = [],
  175.             restore = [],
  176.             c,
  177.             csLen = cs.length;
  178.         // Do only width calculations and apply those first, as they can affect height
  179.         for (i = 0 ; i < csLen; i++) {
  180.             c = cs[i];
  181.             cm = c.margins;
  182.             margin = cm.top + cm.bottom;
  183.             maxWidth = Math.max(maxWidth, c.getWidth() + cm.left + cm.right);
  184.         }
  185.         var innerCtWidth = maxWidth + this.padding.left + this.padding.right;
  186.         switch(this.align){
  187.             case 'stretch':
  188.                 this.innerCt.setSize(w, h);
  189.                 break;
  190.             case 'stretchmax':
  191.             case 'left':
  192.                 this.innerCt.setSize(innerCtWidth, h);
  193.                 break;
  194.             case 'center':
  195.                 this.innerCt.setSize(w = Math.max(w, innerCtWidth), h);
  196.                 break;
  197.         }
  198.         var availableWidth = Math.max(0, w - this.padding.left - this.padding.right);
  199.         // Apply widths
  200.         for (i = 0 ; i < csLen; i++) {
  201.             c = cs[i];
  202.             cm = c.margins;
  203.             if(this.align == 'stretch'){
  204.                 c.setWidth((stretchWidth - (cm.left + cm.right)).constrain(
  205.                     c.minWidth || 0, c.maxWidth || 1000000));
  206.             }else if(this.align == 'stretchmax'){
  207.                 c.setWidth((maxWidth - (cm.left + cm.right)).constrain(
  208.                     c.minWidth || 0, c.maxWidth || 1000000));
  209.             }else if(isStart && c.flex){
  210.                 c.setWidth();
  211.             }
  212.         }
  213.         // Do height calculations
  214.         for (i = 0 ; i < csLen; i++) {
  215.             c = cs[i];
  216.             cm = c.margins;
  217.             totalFlex += c.flex || 0;
  218.             ch = c.getHeight();
  219.             margin = cm.top + cm.bottom;
  220.             extraHeight += ch + margin;
  221.             flexHeight += margin + (c.flex ? 0 : ch);
  222.         }
  223.         extraHeight = h - extraHeight - this.padding.top - this.padding.bottom;
  224.         var availHeight = Math.max(0, h - this.padding.top - this.padding.bottom - flexHeight),
  225.             leftOver = availHeight;
  226.         for (i = 0 ; i < csLen; i++) {
  227.             c = cs[i];
  228.             if(isStart && c.flex){
  229.                 ch = Math.floor(availHeight * (c.flex / totalFlex));
  230.                 leftOver -= ch;
  231.                 heights.push(ch);
  232.             }
  233.         }
  234.         if(this.pack == 'center'){
  235.             t += extraHeight ? extraHeight / 2 : 0;
  236.         }else if(this.pack == 'end'){
  237.             t += extraHeight;
  238.         }
  239.         idx = 0;
  240.         // Apply heights
  241.         for (i = 0 ; i < csLen; i++) {
  242.             c = cs[i];
  243.             cm = c.margins;
  244.             t += cm.top;
  245.             aw = availableWidth;
  246.             cl = l + cm.left // default left pos
  247. //          Adjust left pos for centering
  248.             if(this.align == 'center'){
  249.                 if((diff = availableWidth - (c.getWidth() + cm.left + cm.right)) > 0){
  250.                     cl += (diff/2);
  251.                     aw -= diff;
  252.                 }
  253.             }
  254.             c.setPosition(cl, t);
  255.             if(isStart && c.flex){
  256.                 ch = Math.max(0, heights[idx++] + (leftOver-- > 0 ? 1 : 0));
  257.                 c.setSize(aw, ch);
  258.             }else{
  259.                 ch = c.getHeight();
  260.             }
  261.             t += ch + cm.bottom;
  262.         }
  263.     }
  264. });
  265. Ext.Container.LAYOUTS.vbox = Ext.layout.VBoxLayout;
  266. /**
  267.  * @class Ext.layout.HBoxLayout
  268.  * @extends Ext.layout.BoxLayout
  269.  * <p>A layout that arranges items horizontally across a Container. This layout optionally divides available horizontal
  270.  * space between child items containing a numeric <code>flex</code> configuration.</p>
  271.  * This layout may also be used to set the heights of child items by configuring it with the {@link #align} option.
  272.  */
  273. Ext.layout.HBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
  274.     /**
  275.      * @cfg {String} align
  276.      * Controls how the child items of the container are aligned. Acceptable configuration values for this
  277.      * property are:
  278.      * <div class="mdetail-params"><ul>
  279.      * <li><b><tt>top</tt></b> : <b>Default</b><div class="sub-desc">child items are aligned vertically
  280.      * at the <b>top</b> of the container</div></li>
  281.      * <li><b><tt>middle</tt></b> : <div class="sub-desc">child items are aligned vertically in the
  282.      * <b>middle</b> of the container</div></li>
  283.      * <li><b><tt>stretch</tt></b> : <div class="sub-desc">child items are stretched vertically to fill
  284.      * the height of the container</div></li>
  285.      * <li><b><tt>stretchmax</tt></b> : <div class="sub-desc">child items are stretched vertically to
  286.      * the height of the largest item.</div></li>
  287.      */
  288.     align : 'top', // top, middle, stretch, strechmax
  289.     /**
  290.      * @cfg {String} pack
  291.      * Controls how the child items of the container are packed together. Acceptable configuration values
  292.      * for this property are:
  293.      * <div class="mdetail-params"><ul>
  294.      * <li><b><tt>start</tt></b> : <b>Default</b><div class="sub-desc">child items are packed together at
  295.      * <b>left</b> side of container</div></li>
  296.      * <li><b><tt>center</tt></b> : <div class="sub-desc">child items are packed together at
  297.      * <b>mid-width</b> of container</div></li>
  298.      * <li><b><tt>end</tt></b> : <div class="sub-desc">child items are packed together at <b>right</b>
  299.      * side of container</div></li>
  300.      * </ul></div>
  301.      */
  302.     /**
  303.      * @cfg {Number} flex
  304.      * This configuation option is to be applied to <b>child <tt>items</tt></b> of the container managed
  305.      * by this layout. Each child item with a <tt>flex</tt> property will be flexed <b>horizontally</b>
  306.      * according to each item's <b>relative</b> <tt>flex</tt> value compared to the sum of all items with
  307.      * a <tt>flex</tt> value specified.  Any child items that have either a <tt>flex = 0</tt> or
  308.      * <tt>flex = undefined</tt> will not be 'flexed' (the initial size will not be changed).
  309.      */
  310.     // private
  311.     onLayout : function(ct, target){
  312.         Ext.layout.HBoxLayout.superclass.onLayout.call(this, ct, target);
  313.         var cs = this.getItems(ct), cm, cw, margin, ch, diff,
  314.             size = target.getViewSize(true),
  315.             w = size.width - this.scrollOffset,
  316.             h = size.height,
  317.             l = this.padding.left, t = this.padding.top,
  318.             isStart = this.pack == 'start',
  319.             isRestore = ['stretch', 'stretchmax'].indexOf(this.align) == -1,
  320.             stretchHeight = h - (this.padding.top + this.padding.bottom),
  321.             extraWidth = 0,
  322.             maxHeight = 0,
  323.             totalFlex = 0,
  324.             flexWidth = 0,
  325.             usedWidth = 0;
  326.         Ext.each(cs, function(c){
  327.             cm = c.margins;
  328.             totalFlex += c.flex || 0;
  329.             cw = c.getWidth();
  330.             margin = cm.left + cm.right;
  331.             extraWidth += cw + margin;
  332.             flexWidth += margin + (c.flex ? 0 : cw);
  333.             maxHeight = Math.max(maxHeight, c.getHeight() + cm.top + cm.bottom);
  334.         });
  335.         extraWidth = w - extraWidth - this.padding.left - this.padding.right;
  336.         var innerCtHeight = maxHeight + this.padding.top + this.padding.bottom;
  337.         switch(this.align){
  338.             case 'stretch':
  339.                 this.innerCt.setSize(w, h);
  340.                 break;
  341.             case 'stretchmax':
  342.             case 'top':
  343.                 this.innerCt.setSize(w, innerCtHeight);
  344.                 break;
  345.             case 'middle':
  346.                 this.innerCt.setSize(w, h = Math.max(h, innerCtHeight));
  347.                 break;
  348.         }
  349.         var availWidth = Math.max(0, w - this.padding.left - this.padding.right - flexWidth),
  350.             leftOver = availWidth,
  351.             widths = [],
  352.             restore = [],
  353.             idx = 0,
  354.             availableHeight = Math.max(0, h - this.padding.top - this.padding.bottom);
  355.         Ext.each(cs, function(c){
  356.             if(isStart && c.flex){
  357.                 cw = Math.floor(availWidth * (c.flex / totalFlex));
  358.                 leftOver -= cw;
  359.                 widths.push(cw);
  360.             }
  361.         });
  362.         if(this.pack == 'center'){
  363.             l += extraWidth ? extraWidth / 2 : 0;
  364.         }else if(this.pack == 'end'){
  365.             l += extraWidth;
  366.         }
  367.         Ext.each(cs, function(c){
  368.             cm = c.margins;
  369.             l += cm.left;
  370.             c.setPosition(l, t + cm.top);
  371.             if(isStart && c.flex){
  372.                 cw = Math.max(0, widths[idx++] + (leftOver-- > 0 ? 1 : 0));
  373.                 if(isRestore){
  374.                     restore.push(c.getHeight());
  375.                 }
  376.                 c.setSize(cw, availableHeight);
  377.             }else{
  378.                 cw = c.getWidth();
  379.             }
  380.             l += cw + cm.right;
  381.         });
  382.         idx = 0;
  383.         Ext.each(cs, function(c){
  384.             cm = c.margins;
  385.             ch = c.getHeight();
  386.             if(isStart && c.flex){
  387.                 ch = restore[idx++];
  388.             }
  389.             if(this.align == 'stretch'){
  390.                 c.setHeight((stretchHeight - (cm.top + cm.bottom)).constrain(
  391.                     c.minHeight || 0, c.maxHeight || 1000000));
  392.             }else if(this.align == 'stretchmax'){
  393.                 c.setHeight((maxHeight - (cm.top + cm.bottom)).constrain(
  394.                     c.minHeight || 0, c.maxHeight || 1000000));
  395.             }else{
  396.                 if(this.align == 'middle'){
  397.                     diff = availableHeight - (ch + cm.top + cm.bottom);
  398.                     ch = t + cm.top + (diff/2);
  399.                     if(diff > 0){
  400.                         c.setPosition(c.x, ch);
  401.                     }
  402.                 }
  403.                 if(isStart && c.flex){
  404.                     c.setHeight(ch);
  405.                 }
  406.             }
  407.         }, this);
  408.     }
  409. });
  410. Ext.Container.LAYOUTS.hbox = Ext.layout.HBoxLayout;