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

JavaScript

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.1.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.     targetCls: 'x-table-layout-ct',
  70.     /**
  71.      * @cfg {Object} tableAttrs
  72.      * <p>An object containing properties which are added to the {@link Ext.DomHelper DomHelper} specification
  73.      * used to create the layout's <tt>&lt;table&gt;</tt> element. Example:</p><pre><code>
  74. {
  75.     xtype: 'panel',
  76.     layout: 'table',
  77.     layoutConfig: {
  78.         tableAttrs: {
  79.          style: {
  80.          width: '100%'
  81.          }
  82.         },
  83.         columns: 3
  84.     }
  85. }</code></pre>
  86.      */
  87.     tableAttrs:null,
  88.     
  89.     // private
  90.     setContainer : function(ct){
  91.         Ext.layout.TableLayout.superclass.setContainer.call(this, ct);
  92.         this.currentRow = 0;
  93.         this.currentColumn = 0;
  94.         this.cells = [];
  95.     },
  96.     // private
  97.     onLayout : function(ct, target){
  98.         var cs = ct.items.items, len = cs.length, c, i;
  99.         if(!this.table){
  100.             this.table = target.createChild(
  101.                 Ext.apply({tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, this.tableAttrs), null, true);
  102.         }
  103.         this.renderAll(ct, target);
  104.     },
  105.     // private
  106.     getRow : function(index){
  107.         var row = this.table.tBodies[0].childNodes[index];
  108.         if(!row){
  109.             row = document.createElement('tr');
  110.             this.table.tBodies[0].appendChild(row);
  111.         }
  112.         return row;
  113.     },
  114.     // private
  115.     getNextCell : function(c){
  116.         var cell = this.getNextNonSpan(this.currentColumn, this.currentRow);
  117.         var curCol = this.currentColumn = cell[0], curRow = this.currentRow = cell[1];
  118.         for(var rowIndex = curRow; rowIndex < curRow + (c.rowspan || 1); rowIndex++){
  119.             if(!this.cells[rowIndex]){
  120.                 this.cells[rowIndex] = [];
  121.             }
  122.             for(var colIndex = curCol; colIndex < curCol + (c.colspan || 1); colIndex++){
  123.                 this.cells[rowIndex][colIndex] = true;
  124.             }
  125.         }
  126.         var td = document.createElement('td');
  127.         if(c.cellId){
  128.             td.id = c.cellId;
  129.         }
  130.         var cls = 'x-table-layout-cell';
  131.         if(c.cellCls){
  132.             cls += ' ' + c.cellCls;
  133.         }
  134.         td.className = cls;
  135.         if(c.colspan){
  136.             td.colSpan = c.colspan;
  137.         }
  138.         if(c.rowspan){
  139.             td.rowSpan = c.rowspan;
  140.         }
  141.         this.getRow(curRow).appendChild(td);
  142.         return td;
  143.     },
  144.     
  145.     // private
  146.     getNextNonSpan: function(colIndex, rowIndex){
  147.         var cols = this.columns;
  148.         while((cols && colIndex >= cols) || (this.cells[rowIndex] && this.cells[rowIndex][colIndex])) {
  149.             if(cols && colIndex >= cols){
  150.                 rowIndex++;
  151.                 colIndex = 0;
  152.             }else{
  153.                 colIndex++;
  154.             }
  155.         }
  156.         return [colIndex, rowIndex];
  157.     },
  158.     // private
  159.     renderItem : function(c, position, target){
  160.         if(c && !c.rendered){
  161.             c.render(this.getNextCell(c));
  162.             this.configureItem(c, position);
  163.         }else if(c && !this.isValidParent(c, target)){
  164.             var container = this.getNextCell(c);
  165.             container.insertBefore(c.getPositionEl().dom, null);
  166.             c.container = Ext.get(container);
  167.             this.configureItem(c, position);
  168.         }
  169.     },
  170.     // private
  171.     isValidParent : function(c, target){
  172.         return c.getPositionEl().up('table', 5).dom.parentNode === (target.dom || target);
  173.     }
  174.     /**
  175.      * @property activeItem
  176.      * @hide
  177.      */
  178. });
  179. Ext.Container.LAYOUTS['table'] = Ext.layout.TableLayout;