Upgrade to ExtJS 3.0.0 - Released 07/06/2009
[extjs.git] / src / widgets / list / Sorter.js
diff --git a/src/widgets/list/Sorter.js b/src/widgets/list/Sorter.js
new file mode 100644 (file)
index 0000000..a7ee71a
--- /dev/null
@@ -0,0 +1,70 @@
+/*!
+ * 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