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

中间件编程

开发平台:

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.TableLayout
  3.  * @extends Ext.layout.ContainerLayout
  4.  * <p>This layout allows you to easily render content into an HTML table.  The total number of columns can be
  5.  * specified, and rowspan and colspan can be used to create complex layouts within the table.
  6.  * This class is intended to be extended or created via the layout:'table' {@link Ext.Container#layout} config,
  7.  * and should generally not need to be created directly via the new keyword.</p>
  8.  * <p>Note that when creating a layout via config, the layout-specific config properties must be passed in via
  9.  * the {@link Ext.Container#layoutConfig} object which will then be applied internally to the layout.  In the
  10.  * case of TableLayout, the only valid layout config property is {@link #columns}.  However, the items added to a
  11.  * TableLayout can supply the following table-specific config properties:</p>
  12.  * <ul>
  13.  * <li><b>rowspan</b> Applied to the table cell containing the item.</li>
  14.  * <li><b>colspan</b> Applied to the table cell containing the item.</li>
  15.  * <li><b>cellId</b> An id applied to the table cell containing the item.</li>
  16.  * <li><b>cellCls</b> A CSS class name added to the table cell containing the item.</li>
  17.  * </ul>
  18.  * <p>The basic concept of building up a TableLayout is conceptually very similar to building up a standard
  19.  * HTML table.  You simply add each panel (or "cell") that you want to include along with any span attributes
  20.  * specified as the special config properties of rowspan and colspan which work exactly like their HTML counterparts.
  21.  * Rather than explicitly creating and nesting rows and columns as you would in HTML, you simply specify the
  22.  * total column count in the layoutConfig and start adding panels in their natural order from left to right,
  23.  * top to bottom.  The layout will automatically figure out, based on the column count, rowspans and colspans,
  24.  * how to position each panel within the table.  Just like with HTML tables, your rowspans and colspans must add
  25.  * up correctly in your overall layout or you'll end up with missing and/or extra cells!  Example usage:</p>
  26.  * <pre><code>
  27. // This code will generate a layout table that is 3 columns by 2 rows
  28. // with some spanning included.  The basic layout will be:
  29. // +--------+-----------------+
  30. // |   A    |   B             |
  31. // |        |--------+--------|
  32. // |        |   C    |   D    |
  33. // +--------+--------+--------+
  34. var table = new Ext.Panel({
  35.     title: 'Table Layout',
  36.     layout:'table',
  37.     defaults: {
  38.         // applied to each contained panel
  39.         bodyStyle:'padding:20px'
  40.     },
  41.     layoutConfig: {
  42.         // The total column count must be specified here
  43.         columns: 3
  44.     },
  45.     items: [{
  46.         html: '&lt;p&gt;Cell A content&lt;/p&gt;',
  47.         rowspan: 2
  48.     },{
  49.         html: '&lt;p&gt;Cell B content&lt;/p&gt;',
  50.         colspan: 2
  51.     },{
  52.         html: '&lt;p&gt;Cell C content&lt;/p&gt;',
  53.         cellCls: 'highlight'
  54.     },{
  55.         html: '&lt;p&gt;Cell D content&lt;/p&gt;'
  56.     }]
  57. });
  58. </code></pre>
  59.  */
  60. Ext.layout.TableLayout = Ext.extend(Ext.layout.ContainerLayout, {
  61.     /**
  62.      * @cfg {Number} columns
  63.      * The total number of columns to create in the table for this layout.  If not specified, all Components added to
  64.      * this layout will be rendered into a single row using one column per Component.
  65.      */
  66.     // private
  67.     monitorResize:false,
  68.     /**
  69.      * @cfg {Object} tableAttrs
  70.      * <p>An object containing properties which are added to the {@link Ext.DomHelper DomHelper} specification
  71.      * used to create the layout's <tt>&lt;table&gt;</tt> element. Example:</p><pre><code>
  72. {
  73.     xtype: 'panel',
  74.     layout: 'table',
  75.     layoutConfig: {
  76.         tableAttrs: {
  77.          style: {
  78.          width: '100%'
  79.          }
  80.         },
  81.         columns: 3
  82.     }
  83. }</code></pre>
  84.      */
  85.     tableAttrs:null,
  86.     
  87.     // private
  88.     setContainer : function(ct){
  89.         Ext.layout.TableLayout.superclass.setContainer.call(this, ct);
  90.         this.currentRow = 0;
  91.         this.currentColumn = 0;
  92.         this.cells = [];
  93.     },
  94.     // private
  95.     onLayout : function(ct, target){
  96.         var cs = ct.items.items, len = cs.length, c, i;
  97.         if(!this.table){
  98.             target.addClass('x-table-layout-ct');
  99.             this.table = target.createChild(
  100.                 Ext.apply({tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, this.tableAttrs), null, true);
  101.         }
  102.         this.renderAll(ct, target);
  103.     },
  104.     // private
  105.     getRow : function(index){
  106.         var row = this.table.tBodies[0].childNodes[index];
  107.         if(!row){
  108.             row = document.createElement('tr');
  109.             this.table.tBodies[0].appendChild(row);
  110.         }
  111.         return row;
  112.     },
  113.     // private
  114.     getNextCell : function(c){
  115.         var cell = this.getNextNonSpan(this.currentColumn, this.currentRow);
  116.         var curCol = this.currentColumn = cell[0], curRow = this.currentRow = cell[1];
  117.         for(var rowIndex = curRow; rowIndex < curRow + (c.rowspan || 1); rowIndex++){
  118.             if(!this.cells[rowIndex]){
  119.                 this.cells[rowIndex] = [];
  120.             }
  121.             for(var colIndex = curCol; colIndex < curCol + (c.colspan || 1); colIndex++){
  122.                 this.cells[rowIndex][colIndex] = true;
  123.             }
  124.         }
  125.         var td = document.createElement('td');
  126.         if(c.cellId){
  127.             td.id = c.cellId;
  128.         }
  129.         var cls = 'x-table-layout-cell';
  130.         if(c.cellCls){
  131.             cls += ' ' + c.cellCls;
  132.         }
  133.         td.className = cls;
  134.         if(c.colspan){
  135.             td.colSpan = c.colspan;
  136.         }
  137.         if(c.rowspan){
  138.             td.rowSpan = c.rowspan;
  139.         }
  140.         this.getRow(curRow).appendChild(td);
  141.         return td;
  142.     },
  143.     
  144.     // private
  145.     getNextNonSpan: function(colIndex, rowIndex){
  146.         var cols = this.columns;
  147.         while((cols && colIndex >= cols) || (this.cells[rowIndex] && this.cells[rowIndex][colIndex])) {
  148.             if(cols && colIndex >= cols){
  149.                 rowIndex++;
  150.                 colIndex = 0;
  151.             }else{
  152.                 colIndex++;
  153.             }
  154.         }
  155.         return [colIndex, rowIndex];
  156.     },
  157.     // private
  158.     renderItem : function(c, position, target){
  159.         if(c && !c.rendered){
  160.             c.render(this.getNextCell(c));
  161.             if(this.extraCls){
  162.                 var t = c.getPositionEl ? c.getPositionEl() : c;
  163.                 t.addClass(this.extraCls);
  164.             }
  165.         }
  166.     },
  167.     // private
  168.     isValidParent : function(c, target){
  169.         return true;
  170.     }
  171.     /**
  172.      * @property activeItem
  173.      * @hide
  174.      */
  175. });
  176. Ext.Container.LAYOUTS['table'] = Ext.layout.TableLayout;