--- /dev/null
+/*!
+ * Ext JS Library 3.0.0
+ * Copyright(c) 2006-2009 Ext JS, LLC
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+/**\r
+ * @class Ext.ListView.Sorter\r
+ * @extends Ext.util.Observable\r
+ * <p>Supporting Class for Ext.ListView.</p>\r
+ * @constructor\r
+ * @param {Object} config\r
+ */\r
+Ext.ListView.Sorter = Ext.extend(Ext.util.Observable, {\r
+ /**\r
+ * @cfg {Array} sortClasses\r
+ * The CSS classes applied to a header when it is sorted. (defaults to <tt>["sort-asc", "sort-desc"]</tt>)\r
+ */\r
+ sortClasses : ["sort-asc", "sort-desc"],\r
+\r
+ constructor: function(config){\r
+ Ext.apply(this, config);\r
+ Ext.ListView.Sorter.superclass.constructor.call(this);\r
+ },\r
+\r
+ init : function(listView){\r
+ this.view = listView;\r
+ listView.on('render', this.initEvents, this);\r
+ },\r
+\r
+ initEvents : function(view){\r
+ view.mon(view.innerHd, 'click', this.onHdClick, this);\r
+ view.innerHd.setStyle('cursor', 'pointer');\r
+ view.mon(view.store, 'datachanged', this.updateSortState, this);\r
+ this.updateSortState.defer(10, this, [view.store]);\r
+ },\r
+\r
+ updateSortState : function(store){\r
+ var state = store.getSortState();\r
+ if(!state){\r
+ return;\r
+ }\r
+ this.sortState = state;\r
+ var cs = this.view.columns, sortColumn = -1;\r
+ for(var i = 0, len = cs.length; i < len; i++){\r
+ if(cs[i].dataIndex == state.field){\r
+ sortColumn = i;\r
+ break;\r
+ }\r
+ }\r
+ if(sortColumn != -1){\r
+ var sortDir = state.direction;\r
+ this.updateSortIcon(sortColumn, sortDir);\r
+ }\r
+ },\r
+\r
+ updateSortIcon : function(col, dir){\r
+ var sc = this.sortClasses;\r
+ var hds = this.view.innerHd.select('em').removeClass(sc);\r
+ hds.item(col).addClass(sc[dir == "DESC" ? 1 : 0]);\r
+ },\r
+\r
+ onHdClick : function(e){\r
+ var hd = e.getTarget('em', 3);\r
+ if(hd && !this.view.disableHeaders){\r
+ var index = this.view.findHeaderIndex(hd);\r
+ this.view.store.sort(this.view.columns[index].dataIndex);\r
+ }\r
+ }\r
+});
\ No newline at end of file