BoxLayout.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:16k
源码类别:

中间件编程

开发平台:

JavaScript

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