Upgrade to ExtJS 3.0.3 - Released 10/11/2009
[extjs.git] / docs / source / TreeFilter.html
1 <html>
2 <head>
3   <title>The source code</title>
4     <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
5     <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
6 </head>
7 <body  onload="prettyPrint();">
8     <pre class="prettyprint lang-js">/*!
9  * Ext JS Library 3.0.3
10  * Copyright(c) 2006-2009 Ext JS, LLC
11  * licensing@extjs.com
12  * http://www.extjs.com/license
13  */
14 <div id="cls-Ext.tree.TreeFilter"></div>/**
15  * @class Ext.tree.TreeFilter
16  * Note this class is experimental and doesn't update the indent (lines) or expand collapse icons of the nodes
17  * @param {TreePanel} tree
18  * @param {Object} config (optional)
19  */
20 Ext.tree.TreeFilter = function(tree, config){
21     this.tree = tree;
22     this.filtered = {};
23     Ext.apply(this, config);
24 };
25
26 Ext.tree.TreeFilter.prototype = {
27     clearBlank:false,
28     reverse:false,
29     autoClear:false,
30     remove:false,
31
32      <div id="method-Ext.tree.TreeFilter-filter"></div>/**
33      * Filter the data by a specific attribute.
34      * @param {String/RegExp} value Either string that the attribute value
35      * should start with or a RegExp to test against the attribute
36      * @param {String} attr (optional) The attribute passed in your node's attributes collection. Defaults to "text".
37      * @param {TreeNode} startNode (optional) The node to start the filter at.
38      */
39     filter : function(value, attr, startNode){
40         attr = attr || "text";
41         var f;
42         if(typeof value == "string"){
43             var vlen = value.length;
44             // auto clear empty filter
45             if(vlen == 0 && this.clearBlank){
46                 this.clear();
47                 return;
48             }
49             value = value.toLowerCase();
50             f = function(n){
51                 return n.attributes[attr].substr(0, vlen).toLowerCase() == value;
52             };
53         }else if(value.exec){ // regex?
54             f = function(n){
55                 return value.test(n.attributes[attr]);
56             };
57         }else{
58             throw 'Illegal filter type, must be string or regex';
59         }
60         this.filterBy(f, null, startNode);
61         },
62
63     <div id="method-Ext.tree.TreeFilter-filterBy"></div>/**
64      * Filter by a function. The passed function will be called with each
65      * node in the tree (or from the startNode). If the function returns true, the node is kept
66      * otherwise it is filtered. If a node is filtered, its children are also filtered.
67      * @param {Function} fn The filter function
68      * @param {Object} scope (optional) The scope of the function (defaults to the current node)
69      */
70     filterBy : function(fn, scope, startNode){
71         startNode = startNode || this.tree.root;
72         if(this.autoClear){
73             this.clear();
74         }
75         var af = this.filtered, rv = this.reverse;
76         var f = function(n){
77             if(n == startNode){
78                 return true;
79             }
80             if(af[n.id]){
81                 return false;
82             }
83             var m = fn.call(scope || n, n);
84             if(!m || rv){
85                 af[n.id] = n;
86                 n.ui.hide();
87                 return false;
88             }
89             return true;
90         };
91         startNode.cascade(f);
92         if(this.remove){
93            for(var id in af){
94                if(typeof id != "function"){
95                    var n = af[id];
96                    if(n && n.parentNode){
97                        n.parentNode.removeChild(n);
98                    }
99                }
100            }
101         }
102     },
103
104     <div id="method-Ext.tree.TreeFilter-clear"></div>/**
105      * Clears the current filter. Note: with the "remove" option
106      * set a filter cannot be cleared.
107      */
108     clear : function(){
109         var t = this.tree;
110         var af = this.filtered;
111         for(var id in af){
112             if(typeof id != "function"){
113                 var n = af[id];
114                 if(n){
115                     n.ui.show();
116                 }
117             }
118         }
119         this.filtered = {};
120     }
121 };
122 </pre>
123 </body>
124 </html>