3 * Copyright(c) 2006-2010 Ext JS, Inc.
5 * http://www.extjs.com/license
10 * @class Ext.ux.tree.TreeGridSorter
11 * @extends Ext.tree.TreeSorter
12 * Provides sorting of nodes in a {@link Ext.ux.tree.TreeGrid}. The TreeGridSorter automatically monitors events on the
13 * associated TreeGrid that might affect the tree's sort order (beforechildrenrendered, append, insert and textchange).
14 * Example usage:<br />
16 new Ext.ux.tree.TreeGridSorter(myTreeGrid, {
19 sortType: function(node) {
20 // sort by a custom, typed attribute:
21 return parseInt(node.id, 10);
26 * @param {TreeGrid} tree
27 * @param {Object} config
29 Ext.ux.tree.TreeGridSorter = Ext.extend(Ext.tree.TreeSorter, {
31 * @cfg {Array} sortClasses The CSS classes applied to a header when it is sorted. (defaults to <tt>['sort-asc', 'sort-desc']</tt>)
33 sortClasses : ['sort-asc', 'sort-desc'],
35 * @cfg {String} sortAscText The text displayed in the 'Sort Ascending' menu item (defaults to <tt>'Sort Ascending'</tt>)
37 sortAscText : 'Sort Ascending',
39 * @cfg {String} sortDescText The text displayed in the 'Sort Descending' menu item (defaults to <tt>'Sort Descending'</tt>)
41 sortDescText : 'Sort Descending',
43 constructor : function(tree, config) {
44 if(!Ext.isObject(config)) {
46 property: tree.columns[0].dataIndex || 'text',
51 Ext.ux.tree.TreeGridSorter.superclass.constructor.apply(this, arguments);
54 tree.on('headerclick', this.onHeaderClick, this);
55 tree.ddAppendOnly = true;
58 this.defaultSortFn = function(n1, n2){
60 var dsc = me.dir && me.dir.toLowerCase() == 'desc';
61 var p = me.property || 'text';
62 var sortType = me.sortType;
63 var fs = me.folderSort;
64 var cs = me.caseSensitive === true;
65 var leafAttr = me.leafAttr || 'leaf';
68 if(n1.attributes[leafAttr] && !n2.attributes[leafAttr]){
71 if(!n1.attributes[leafAttr] && n2.attributes[leafAttr]){
75 var v1 = sortType ? sortType(n1) : (cs ? n1.attributes[p] : n1.attributes[p].toUpperCase());
76 var v2 = sortType ? sortType(n2) : (cs ? n2.attributes[p] : n2.attributes[p].toUpperCase());
86 tree.on('afterrender', this.onAfterTreeRender, this, {single: true});
87 tree.on('headermenuclick', this.onHeaderMenuClick, this);
90 onAfterTreeRender : function() {
92 this.tree.hmenu.insert(0,
93 {itemId:'asc', text: this.sortAscText, cls: 'xg-hmenu-sort-asc'},
94 {itemId:'desc', text: this.sortDescText, cls: 'xg-hmenu-sort-desc'}
97 this.updateSortIcon(0, 'asc');
100 onHeaderMenuClick : function(c, id, index) {
101 if(id === 'asc' || id === 'desc') {
102 this.onHeaderClick(c, null, index);
107 onHeaderClick : function(c, el, i) {
108 if(c && !this.tree.headersDisabled){
111 me.property = c.dataIndex;
112 me.dir = c.dir = (c.dir === 'desc' ? 'asc' : 'desc');
113 me.sortType = c.sortType;
114 me.caseSensitive === Ext.isBoolean(c.caseSensitive) ? c.caseSensitive : this.caseSensitive;
115 me.sortFn = c.sortFn || this.defaultSortFn;
117 this.tree.root.cascade(function(n) {
119 me.updateSort(me.tree, n);
123 this.updateSortIcon(i, c.dir);
128 updateSortIcon : function(col, dir){
129 var sc = this.sortClasses;
130 var hds = this.tree.innerHd.select('td').removeClass(sc);
131 hds.item(col).addClass(sc[dir == 'desc' ? 1 : 0]);