/*!
- * Ext JS Library 3.1.0
- * Copyright(c) 2006-2009 Ext JS, LLC
+ * Ext JS Library 3.1.1
+ * Copyright(c) 2006-2010 Ext JS, LLC
* licensing@extjs.com
* http://www.extjs.com/license
*/
* @cfg {Array} stateEvents\r
* An array of events that, when fired, should trigger this component to save its state.\r
* Defaults to:<pre><code>\r
- * stateEvents: ['columnmove', 'columnresize', 'sortchange']\r
+ * stateEvents: ['columnmove', 'columnresize', 'sortchange', 'groupchange']\r
* </code></pre>\r
* <p>These can be any types of events supported by this component, including browser or\r
* custom events (e.g., <tt>['click', 'customerchange']</tt>).</p>\r
* <p>See {@link Ext.Component#stateful} for an explanation of saving and restoring\r
* Component state.</p>\r
*/\r
- stateEvents : ['columnmove', 'columnresize', 'sortchange'],\r
+ stateEvents : ['columnmove', 'columnresize', 'sortchange', 'groupchange'],\r
/**\r
* @cfg {Object} view The {@link Ext.grid.GridView} used by the grid. This can be set\r
* before a call to {@link Ext.Component#render render()}.\r
* @param {Object} sortInfo An object with the keys field and direction\r
*/\r
'sortchange',\r
+ /**\r
+ * @event groupchange\r
+ * Fires when the grid's grouping changes (only applies for grids with a {@link Ext.grid.GroupingView GroupingView})\r
+ * @param {Grid} this\r
+ * @param {String} groupField A string with the grouping field, null if the store is not grouped.\r
+ */\r
+ 'groupchange',\r
/**\r
* @event reconfigure\r
* Fires when the grid is reconfigured with a new store and/or column model.\r
\r
applyState : function(state){\r
var cm = this.colModel,\r
- cs = state.columns;\r
+ cs = state.columns,\r
+ store = this.store,\r
+ s,\r
+ c,\r
+ oldIndex;\r
+ \r
if(cs){\r
for(var i = 0, len = cs.length; i < len; i++){\r
- var s = cs[i],\r
- c = cm.getColumnById(s.id);\r
+ s = cs[i];\r
+ c = cm.getColumnById(s.id);\r
if(c){\r
c.hidden = s.hidden;\r
c.width = s.width;\r
- var oldIndex = cm.getIndexById(s.id);\r
+ oldIndex = cm.getIndexById(s.id);\r
if(oldIndex != i){\r
cm.moveColumn(oldIndex, i);\r
}\r
}\r
}\r
}\r
- if(state.sort && this.store){\r
- this.store[this.store.remoteSort ? 'setDefaultSort' : 'sort'](state.sort.field, state.sort.direction);\r
+ if(store){\r
+ s = state.sort;\r
+ if(s){\r
+ store[store.remoteSort ? 'setDefaultSort' : 'sort'](s.field, s.direction);\r
+ }\r
+ s = state.group;\r
+ if(store.groupBy){\r
+ if(s){\r
+ store.groupBy(s);\r
+ }else{\r
+ store.clearGrouping();\r
+ }\r
+ }\r
+\r
}\r
var o = Ext.apply({}, state);\r
delete o.columns;\r
},\r
\r
getState : function(){\r
- var o = {columns: []};\r
+ var o = {columns: []},\r
+ store = this.store,\r
+ ss,\r
+ gs;\r
+ \r
for(var i = 0, c; (c = this.colModel.config[i]); i++){\r
o.columns[i] = {\r
id: c.id,\r
o.columns[i].hidden = true;\r
}\r
}\r
- if(this.store){\r
- var ss = this.store.getSortState();\r
+ if(store){\r
+ ss = store.getSortState();\r
if(ss){\r
o.sort = ss;\r
}\r
+ if(store.getGroupState){\r
+ gs = store.getGroupState();\r
+ if(gs){\r
+ o.group = gs;\r
+ }\r
+ }\r
}\r
return o;\r
},\r
if(!initial){ // cleanup
delete this.totalWidth;
for(i = 0, len = this.config.length; i < len; i++){
- c = this.config[i];
- if(c.editor){
- c.editor.destroy();
- }
+ this.config[i].destroy();
}
}
for(i = 0, len = config.length; i < len; i++){
c = Ext.applyIf(config[i], this.defaults);
// if no id, create one using column's ordinal position
- if(typeof c.id == 'undefined'){
+ if(Ext.isEmpty(c.id)){
c.id = i;
}
if(!c.isColumn){
* @return {Boolean}
*/
isCellEditable : function(colIndex, rowIndex){
- return (this.config[colIndex].editable || (typeof this.config[colIndex].editable == "undefined" && this.config[colIndex].editor)) ? true : false;
+ var c = this.config[colIndex],
+ ed = c.editable;
+
+ //force boolean
+ return !!(ed || (!Ext.isDefined(ed) && c.editor));
},
/**
* @param {Object} editor The editor object
*/
setEditor : function(col, editor){
- Ext.destroy(this.config[col].editor);
- this.config[col].editor = editor;
+ this.config[col].setEditor(editor);
},
/**
* Destroys this column model by purging any event listeners, and removing any editors.
*/
destroy : function(){
- for(var i = 0, c = this.config, len = c.length; i < len; i++){
- Ext.destroy(c[i].editor);
+ for(var i = 0, len = this.config.length; i < len; i++){
+ this.config[i].destroy();
}
this.purgeListeners();
}
\r
constructor : function(config){\r
Ext.apply(this, config);\r
-\r
+ \r
if(Ext.isString(this.renderer)){\r
this.renderer = Ext.util.Format[this.renderer];\r
}else if(Ext.isObject(this.renderer)){\r
if(!this.scope){\r
this.scope = this;\r
}\r
-\r
- if(this.editor){\r
- this.editor = Ext.create(this.editor, 'textfield');\r
- }\r
+ \r
+ var ed = this.editor;\r
+ delete this.editor;\r
+ this.setEditor(ed);\r
},\r
\r
/**\r
getEditor: function(rowIndex){\r
return this.editable !== false ? this.editor : null;\r
},\r
+ \r
+ /**\r
+ * Sets a new editor for this column.\r
+ * @param {Ext.Editor/Ext.form.Field} editor The editor to set\r
+ */\r
+ setEditor : function(editor){\r
+ if(this.editor){\r
+ this.editor.destroy();\r
+ }\r
+ this.editor = null;\r
+ if(editor){\r
+ //not an instance, create it\r
+ if(!editor.isXType){\r
+ editor = Ext.create(editor, 'textfield');\r
+ }\r
+ //check if it's wrapped in an editor\r
+ if(!editor.startEdit){\r
+ editor = new Ext.grid.GridEditor(editor);\r
+ }\r
+ this.editor = editor;\r
+ }\r
+ },\r
+ \r
+ destroy : function(){\r
+ this.setEditor(null);\r
+ },\r
\r
/**\r
* Returns the {@link Ext.Editor editor} defined for this column that was created to wrap the {@link Ext.form.Field Field}\r
* @return {Ext.Editor}\r
*/\r
getCellEditor: function(rowIndex){\r
- var editor = this.getEditor(rowIndex);\r
- if(editor){\r
- if(!editor.startEdit){\r
- if(!editor.gridEditor){\r
- editor.gridEditor = new Ext.grid.GridEditor(editor);\r
- }\r
- return editor.gridEditor;\r
- }else if(editor.startEdit){\r
- return editor;\r
- }\r
- }\r
- return null;\r
+ return this.getEditor(rowIndex);\r
}\r
});\r
\r