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