/hippo/src/main/webapp/ext/src/widgets/layout/TableLayout.js

http://hdbc.googlecode.com/ · JavaScript · 194 lines · 81 code · 14 blank · 99 comment · 19 complexity · ae7e98a193dd862fc4c2a33e05168074 MD5 · raw file

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