]> git.proxmox.com Git - extjs.git/blame - extjs/modern/modern/src/grid/HeaderContainer.js
add extjs 6.0.1 sources
[extjs.git] / extjs / modern / modern / src / grid / HeaderContainer.js
CommitLineData
6527f429
DM
1/**\r
2 * @class Ext.grid.HeaderContainer\r
3 * @extends Ext.Container\r
4 * Description\r
5 */\r
6Ext.define('Ext.grid.HeaderContainer', {\r
7 extend: 'Ext.Container',\r
8 xtype: 'headercontainer',\r
9\r
10 config: {\r
11 baseCls: Ext.baseCSSPrefix + 'grid-header-container',\r
12 docked: 'top',\r
13 defaultType: 'column',\r
14 layout: {\r
15 type: 'hbox',\r
16 align: 'stretch'\r
17 },\r
18\r
19 /**\r
20 * @private\r
21 * Set this to `false` to disable sorting via tap on all column headers\r
22 */\r
23 sortable: true,\r
24\r
25 scrollable: {\r
26 autoRefresh: null,\r
27 x: false,\r
28 y: false\r
29 },\r
30\r
31 grid: null\r
32 },\r
33\r
34 initialize: function() {\r
35 var me = this;\r
36\r
37 me.columns = [];\r
38\r
39 me.callParent();\r
40\r
41 me.on({\r
42 tap: 'onHeaderTap',\r
43 columnresize: 'onColumnResize',\r
44 show: 'onColumnShow',\r
45 hide: 'onColumnHide',\r
46 sort: 'onColumnSort',\r
47 scope: me,\r
48 delegate: 'column'\r
49 });\r
50\r
51 me.on({\r
52 show: 'onGroupShow',\r
53 hide: 'onGroupHide',\r
54 add: 'onColumnAdd',\r
55 move: 'onColumnMove',\r
56 remove: 'onColumnRemove',\r
57 scope: me,\r
58 delegate: 'gridheadergroup'\r
59 });\r
60\r
61 me.on({\r
62 add: 'onColumnAdd',\r
63 move: 'onColumnMove',\r
64 remove: 'onColumnRemove',\r
65 scope: me\r
66 });\r
67 },\r
68\r
69 factoryItem: function (item) {\r
70 // If the columns contains a columns config, then create a HeaderGroup\r
71 if (item.columns) {\r
72 return Ext.factory(item, Ext.grid.HeaderGroup);\r
73 }\r
74 return this.callParent([item]);\r
75 },\r
76\r
77 getColumns: function() {\r
78 return this.columns;\r
79 },\r
80\r
81 getAbsoluteColumnIndex: function(column) {\r
82 var items = this.getInnerItems(),\r
83 ln = items.length,\r
84 index = 0,\r
85 innerIndex, i, item;\r
86\r
87 for (i = 0; i < ln; i++) {\r
88 item = items[i];\r
89\r
90 if (item === column) {\r
91 return index;\r
92 }\r
93 else if (item.isHeaderGroup) {\r
94 innerIndex = item.innerIndexOf(column);\r
95 if (innerIndex !== -1) {\r
96 index += innerIndex;\r
97 return index;\r
98 }\r
99 else {\r
100 index += item.getInnerItems().length;\r
101 }\r
102 }\r
103 else {\r
104 index += 1;\r
105 }\r
106 }\r
107 },\r
108\r
109 onColumnAdd: function(parent, column) {\r
110 var me = this,\r
111 columns = me.columns,\r
112 columnIndex = me.getAbsoluteColumnIndex(column),\r
113 groupColumns, ln, i;\r
114\r
115 if (column.isHeaderGroup) {\r
116 groupColumns = column.getItems().items;\r
117\r
118 for (i = 0, ln = groupColumns.length; i < ln; i++) {\r
119 columns.splice(columnIndex + i, 0, groupColumns[i]);\r
120 me.fireEvent('columnadd', me, groupColumns[i], column);\r
121 }\r
122 } else {\r
123 columns.splice(columnIndex, 0, column);\r
124 me.fireEvent('columnadd', me, column, null);\r
125 }\r
126 },\r
127\r
128 onColumnMove: function(parent, column) {\r
129 var me = this,\r
130 columns = me.columns,\r
131 columnIndex = me.getAbsoluteColumnIndex(column),\r
132 groupColumns, ln, i, groupColumn,\r
133 after, oldIndex, fromIdx, toIdx;\r
134\r
135 if (column.isHeaderGroup) {\r
136 groupColumns = column.getItems().items;\r
137\r
138 for (i = 0, ln = groupColumns.length; i < ln; i++) {\r
139 groupColumn = groupColumns[i];\r
140\r
141 if (i === 0) {\r
142 oldIndex = columns.indexOf(groupColumn);\r
143 after = oldIndex - columnIndex < 0;\r
144 }\r
145\r
146 // Treat the moves as sequential\r
147 if (after) {\r
148 // | Group | c | d -> | c | d | Group | \r
149 // a b a b\r
150 // \r
151 // We need to fire:\r
152 // a from 0 -> 3, since b is still in place\r
153 // b from 0 -> 3, to account for a still in place\r
154 toIdx = columnIndex + ln - 1;\r
155 fromIdx = oldIndex;\r
156 } else {\r
157 // | c | d | Group | -> | Group | c | d \r
158 // a b a b\r
159 // \r
160 // We need to fire:\r
161 // a from 2 -> 0\r
162 // b from 2 -> 1, to account for a moving\r
163 fromIdx = oldIndex + i;\r
164 toIdx = columnIndex + i;\r
165 }\r
166 Ext.Array.move(columns, fromIdx, toIdx);\r
167 me.fireEvent('columnmove', me, groupColumn, column, fromIdx, toIdx);\r
168 }\r
169 } else {\r
170 fromIdx = columns.indexOf(column);\r
171 toIdx = columnIndex;\r
172 Ext.Array.move(columns, fromIdx, toIdx);\r
173 me.fireEvent('columnmove', me, column, null, fromIdx, toIdx);\r
174 }\r
175 },\r
176\r
177 onColumnRemove: function(parent, column) {\r
178 if (column.isHeaderGroup) {\r
179 var columns = column.getItems().items,\r
180 ln = columns.length,\r
181 i;\r
182\r
183 for (i = 0; i < ln; i++) {\r
184 Ext.Array.remove(this.columns, columns[i]);\r
185 this.fireEvent('columnremove', this, columns[i]);\r
186 }\r
187 } else {\r
188 Ext.Array.remove(this.columns, column);\r
189 this.fireEvent('columnremove', this, column);\r
190 }\r
191 },\r
192\r
193 onHeaderTap: function(column) {\r
194 if (this.getSortable() && !column.getIgnore() && column.getSortable()) {\r
195 var sortDirection = column.getSortDirection() || 'DESC',\r
196 newDirection = (sortDirection === 'DESC') ? 'ASC' : 'DESC';\r
197\r
198 column.setSortDirection(newDirection);\r
199 }\r
200\r
201 this.fireEvent('columntap', this, column);\r
202 },\r
203\r
204 onColumnShow: function(column) {\r
205 this.fireEvent('columnshow', this, column);\r
206 },\r
207\r
208 onColumnHide: function(column) {\r
209 this.fireEvent('columnhide', this, column);\r
210 },\r
211\r
212 onGroupShow: function(group) {\r
213 var columns = group.getInnerItems(),\r
214 ln = columns.length,\r
215 i, column;\r
216\r
217 for (i = 0; i < ln; i++) {\r
218 column = columns[i];\r
219 if (!column.isHidden()) {\r
220 this.fireEvent('columnshow', this, column);\r
221 }\r
222 }\r
223 },\r
224\r
225 onGroupHide: function(group) {\r
226 var columns = group.getInnerItems(),\r
227 ln = columns.length,\r
228 i, column;\r
229\r
230 for (i = 0; i < ln; i++) {\r
231 column = columns[i];\r
232 this.fireEvent('columnhide', this, column);\r
233 }\r
234 },\r
235\r
236 onColumnResize: function(column, width, oldWidth) {\r
237 this.fireEvent('columnresize', this, column, width, oldWidth);\r
238 },\r
239\r
240 onColumnSort: function(column, direction, newDirection) {\r
241 if (direction !== null) {\r
242 this.fireEvent('columnsort', this, column, direction, newDirection);\r
243 }\r
244 },\r
245\r
246 scrollTo: function(x) {\r
247 this.getScrollable().scrollTo(x);\r
248 },\r
249\r
250 setTotalWidth: function(totalWidth) {\r
251 var scrollable = this.getScrollable(),\r
252 innerElement;\r
253\r
254 if (scrollable && scrollable.isTouchScroller) {\r
255 innerElement = scrollable.getInnerElement();\r
256 if (innerElement) {\r
257 innerElement.setWidth(totalWidth);\r
258\r
259 scrollable.setSize({\r
260 x: totalWidth,\r
261 y: scrollable.getSize().y\r
262 });\r
263 }\r
264 }\r
265 },\r
266\r
267 destroy: function() {\r
268 var me = this,\r
269 task = me.spacerTask;\r
270\r
271 if (task) {\r
272 task.cancel();\r
273 me.spacerTask = null;\r
274 }\r
275 me.setGrid(null);\r
276 me.callParent();\r
277 },\r
278\r
279 privates: {\r
280 updateSpacer: function() {\r
281 var me = this,\r
282 task = me.spacerTask;\r
283\r
284 if (!task) {\r
285 me.spacerTask = task = new Ext.util.DelayedTask(me.doUpdateSpacer, me);\r
286 }\r
287 task.delay(1);\r
288 },\r
289\r
290 doUpdateSpacer: function() {\r
291 var scrollable = this.getGrid().getScrollable();\r
292 this.element.setStyle('padding-right', scrollable.getScrollbarSize().width + 'px');\r
293 }\r
294 }\r
295});\r