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

中间件编程

开发平台:

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.AnchorLayout
  3.  * @extends Ext.layout.ContainerLayout
  4.  * <p>This is a layout that enables anchoring of contained elements relative to the container's dimensions.
  5.  * If the container is resized, all anchored items are automatically rerendered according to their
  6.  * <b><tt>{@link #anchor}</tt></b> rules.</p>
  7.  * <p>This class is intended to be extended or created via the layout:'anchor' {@link Ext.Container#layout}
  8.  * config, and should generally not need to be created directly via the new keyword.</p>
  9.  * <p>AnchorLayout does not have any direct config options (other than inherited ones). By default,
  10.  * AnchorLayout will calculate anchor measurements based on the size of the container itself. However, the
  11.  * container using the AnchorLayout can supply an anchoring-specific config property of <b>anchorSize</b>.
  12.  * If anchorSize is specifed, the layout will use it as a virtual container for the purposes of calculating
  13.  * anchor measurements based on it instead, allowing the container to be sized independently of the anchoring
  14.  * logic if necessary.  For example:</p>
  15.  * <pre><code>
  16. var viewport = new Ext.Viewport({
  17.     layout:'anchor',
  18.     anchorSize: {width:800, height:600},
  19.     items:[{
  20.         title:'Item 1',
  21.         html:'Content 1',
  22.         width:800,
  23.         anchor:'right 20%'
  24.     },{
  25.         title:'Item 2',
  26.         html:'Content 2',
  27.         width:300,
  28.         anchor:'50% 30%'
  29.     },{
  30.         title:'Item 3',
  31.         html:'Content 3',
  32.         width:600,
  33.         anchor:'-100 50%'
  34.     }]
  35. });
  36.  * </code></pre>
  37.  */
  38. Ext.layout.AnchorLayout = Ext.extend(Ext.layout.ContainerLayout, {
  39.     /**
  40.      * @cfg {String} anchor
  41.      * <p>This configuation option is to be applied to <b>child <tt>items</tt></b> of a container managed by
  42.      * this layout (ie. configured with <tt>layout:'anchor'</tt>).</p><br/>
  43.      * 
  44.      * <p>This value is what tells the layout how an item should be anchored to the container. <tt>items</tt>
  45.      * added to an AnchorLayout accept an anchoring-specific config property of <b>anchor</b> which is a string
  46.      * containing two values: the horizontal anchor value and the vertical anchor value (for example, '100% 50%').
  47.      * The following types of anchor values are supported:<div class="mdetail-params"><ul>
  48.      * 
  49.      * <li><b>Percentage</b> : Any value between 1 and 100, expressed as a percentage.<div class="sub-desc">
  50.      * The first anchor is the percentage width that the item should take up within the container, and the
  51.      * second is the percentage height.  For example:<pre><code>
  52. // two values specified
  53. anchor: '100% 50%' // render item complete width of the container and
  54.                    // 1/2 height of the container
  55. // one value specified
  56. anchor: '100%'     // the width value; the height will default to auto
  57.      * </code></pre></div></li>
  58.      * 
  59.      * <li><b>Offsets</b> : Any positive or negative integer value.<div class="sub-desc">
  60.      * This is a raw adjustment where the first anchor is the offset from the right edge of the container,
  61.      * and the second is the offset from the bottom edge. For example:<pre><code>
  62. // two values specified
  63. anchor: '-50 -100' // render item the complete width of the container
  64.                    // minus 50 pixels and
  65.                    // the complete height minus 100 pixels.
  66. // one value specified
  67. anchor: '-50'      // anchor value is assumed to be the right offset value
  68.                    // bottom offset will default to 0
  69.      * </code></pre></div></li>
  70.      * 
  71.      * <li><b>Sides</b> : Valid values are <tt>'right'</tt> (or <tt>'r'</tt>) and <tt>'bottom'</tt>
  72.      * (or <tt>'b'</tt>).<div class="sub-desc">
  73.      * Either the container must have a fixed size or an anchorSize config value defined at render time in
  74.      * order for these to have any effect.</div></li>
  75.      *
  76.      * <li><b>Mixed</b> : <div class="sub-desc">
  77.      * Anchor values can also be mixed as needed.  For example, to render the width offset from the container
  78.      * right edge by 50 pixels and 75% of the container's height use:
  79.      * <pre><code>
  80. anchor: '-50 75%' 
  81.      * </code></pre></div></li>
  82.      * 
  83.      * 
  84.      * </ul></div>
  85.      */
  86.     
  87.     // private
  88.     monitorResize:true,
  89.     // private
  90.     getAnchorViewSize : function(ct, target){
  91.         return target.dom == document.body ?
  92.                    target.getViewSize() : target.getStyleSize();
  93.     },
  94.     // private
  95.     onLayout : function(ct, target){
  96.         Ext.layout.AnchorLayout.superclass.onLayout.call(this, ct, target);
  97.         var size = this.getAnchorViewSize(ct, target);
  98.         var w = size.width, h = size.height;
  99.         if(w < 20 && h < 20){
  100.             return;
  101.         }
  102.         // find the container anchoring size
  103.         var aw, ah;
  104.         if(ct.anchorSize){
  105.             if(typeof ct.anchorSize == 'number'){
  106.                 aw = ct.anchorSize;
  107.             }else{
  108.                 aw = ct.anchorSize.width;
  109.                 ah = ct.anchorSize.height;
  110.             }
  111.         }else{
  112.             aw = ct.initialConfig.width;
  113.             ah = ct.initialConfig.height;
  114.         }
  115.         var cs = ct.items.items, len = cs.length, i, c, a, cw, ch;
  116.         for(i = 0; i < len; i++){
  117.             c = cs[i];
  118.             if(c.anchor){
  119.                 a = c.anchorSpec;
  120.                 if(!a){ // cache all anchor values
  121.                     var vs = c.anchor.split(' ');
  122.                     c.anchorSpec = a = {
  123.                         right: this.parseAnchor(vs[0], c.initialConfig.width, aw),
  124.                         bottom: this.parseAnchor(vs[1], c.initialConfig.height, ah)
  125.                     };
  126.                 }
  127.                 cw = a.right ? this.adjustWidthAnchor(a.right(w), c) : undefined;
  128.                 ch = a.bottom ? this.adjustHeightAnchor(a.bottom(h), c) : undefined;
  129.                 if(cw || ch){
  130.                     c.setSize(cw || undefined, ch || undefined);
  131.                 }
  132.             }
  133.         }
  134.     },
  135.     // private
  136.     parseAnchor : function(a, start, cstart){
  137.         if(a && a != 'none'){
  138.             var last;
  139.             if(/^(r|right|b|bottom)$/i.test(a)){   // standard anchor
  140.                 var diff = cstart - start;
  141.                 return function(v){
  142.                     if(v !== last){
  143.                         last = v;
  144.                         return v - diff;
  145.                     }
  146.                 }
  147.             }else if(a.indexOf('%') != -1){
  148.                 var ratio = parseFloat(a.replace('%', ''))*.01;   // percentage
  149.                 return function(v){
  150.                     if(v !== last){
  151.                         last = v;
  152.                         return Math.floor(v*ratio);
  153.                     }
  154.                 }
  155.             }else{
  156.                 a = parseInt(a, 10);
  157.                 if(!isNaN(a)){                            // simple offset adjustment
  158.                     return function(v){
  159.                         if(v !== last){
  160.                             last = v;
  161.                             return v + a;
  162.                         }
  163.                     }
  164.                 }
  165.             }
  166.         }
  167.         return false;
  168.     },
  169.     // private
  170.     adjustWidthAnchor : function(value, comp){
  171.         return value;
  172.     },
  173.     // private
  174.     adjustHeightAnchor : function(value, comp){
  175.         return value;
  176.     }
  177.     
  178.     /**
  179.      * @property activeItem
  180.      * @hide
  181.      */
  182. });
  183. Ext.Container.LAYOUTS['anchor'] = Ext.layout.AnchorLayout;