--- explorer.py.orig	2009-03-05 20:24:38.000000000 +0800
+++ explorer.py	2009-03-05 23:09:39.000000000 +0800
@@ -21,7 +21,6 @@
     from MoinMoin.Page import Page
 
     name = 'explorer'
-    
 
     # ========================================
     # Toolbars and UI text definition
@@ -678,7 +677,8 @@
         """
         node.parents.append(self.name)
         self.subnodes[node.type].append(node.name)
-        self.subnodes_size += node.size
+        #self.subnodes_size += node.size
+        self.subnodes_size = 0
 
 
     def remove_sub_node(self, node):
@@ -686,7 +686,8 @@
         """
         node.parents.remove(self.name)
         self.subnodes[node.type].remove(node.name)
-        self.subnodes_size -= node.size
+        #self.subnodes_size -= node.size
+        self.subnodes_size = 0
 
 
     def reset(self):
@@ -716,6 +717,19 @@
     from MoinMoin.Page import Page
     
     release = '1.0.3'
+    
+    # filter_depth: How far should filter string be applied to the wiki_tree
+    # by {FengMingyu, XieLuyun}@kingsoft.com
+    # wiki_tree:
+    #   level   nodes
+    #   0       (root, but no display_name)
+    #   1       first level pages/categories/attachments
+    #   2       second level pages/categories/attachments
+    #   .
+    #   .
+    #   .
+    FILTER_DEPTH = 3
+    filter_depth = 0
 
     # fake _ function to get gettext recognize those texts:
     _ = lambda x: x
@@ -910,8 +924,9 @@
 
             pos = page_name.rfind('/')
             if pos > 0:  # page is subpage
-                node.display_name = page_name[pos+1:]
-                self.add_to_parent(node, page_name[:pos])
+                pass
+                #node.display_name = page_name[pos+1:]
+                #self.add_to_parent(node, page_name[:pos])
             else:
                 # Add the page to the categories it belongs to
                 parent_categories = self.categories_formatter.getCategories(page)
@@ -933,8 +948,13 @@
             node = WikiNode(self.request, node_name, self.wikiutil.url_quote('%s_node' % node_name, ''), is_attachment=is_attachment)
             self.wiki_tree[node_name] = node
             self.touched.add(node_name)
-        return node
+            
+            pos = node_name.rfind('/')
+            if pos > 0:
+                node.display_name = node_name[pos+1:]
+                self.add_to_parent(node, node_name[:pos])
 
+        return node
 
     def add_to_parent(self, node, parent_name, parent = None):
         """ Add a node to a parent node
@@ -976,9 +996,10 @@
             while node.attachments:
                 self.remove_page(node.attachments[0])
 
-            while node.parents:
-                self.remove_from_parent(node, node.parents[0])
-
+            if not node.pages:
+                while node.parents:
+                    self.remove_from_parent(node, node.parents[0])
+            
             if node.categories or node.pages or (page_name in [self.root, self.orphaned, self.underlay]):
                 node.reset()
                 self.touched.add(page_name)
@@ -1132,7 +1153,6 @@
             return ""
         return self.wiki_tree[self.page_name].categories_html
 
-
     def tree_html(self):
         """ Returns wiki tree html code
         """
@@ -1155,7 +1175,17 @@
         if self.cookie.has_key('expand_subtree'):
             self.expand_subtree = self.cookie['expand_subtree'].value
             self.cookie[self.expand_subtree] = 1
-        return self.subtree_html(self.root)
+        
+        # Get user's node filter
+        self.node_filter = u''
+        if self.cookie.has_key('explorer_tree_node_filter'):
+            self.node_filter = self.cookie['explorer_tree_node_filter'].value.lower()
+        
+        #print 'node_filter:' + self.node_filter
+        self.filter_depth = 0
+        html = self.subtree_html(self.root)
+        filter_html = u'''<input id="filterinput" type="text" alt="Filter" size="15" name="filterinput" value="%s" onkeydown="if(event.keyCode == 13) { document.cookie = '%s' + '=' + this.value + '; path=/'; window.location.reload(true); }"/>''' % (self.node_filter, 'explorer_tree_node_filter')
+        return filter_html + html
 
 
     def subtree_html(self, node_name, path=None, display_all=False):
@@ -1169,6 +1199,18 @@
         @return: wiki tree html
         """
         node = self.wiki_tree[node_name]
+        
+        # filter node by user preference
+        self.filter_depth += 1
+        if self.filter_depth < self.FILTER_DEPTH:
+            #print 'node_name:' + node_name
+            #print 'node.display_name:' + node.display_name
+            #print 'self.filter_depth:%d' % self.filter_depth
+            #print not node.display_name.lower().startswith(self.node_filter)
+            if node.display_name and not node.display_name.lower().startswith(self.node_filter):
+                self.filter_depth -= 1
+                return u''
+
         if node.exists:
             if self.acl_caching:
                 if self.userid in node.may_read:
@@ -1212,6 +1254,10 @@
                     if sub_node_name not in path:  # don't allow recursion
                         items.append(self.subtree_html(sub_node_name, path, display_all))
                 items.append(u'</ul>')
+
+        # fall back
+        self.filter_depth -= 1
+
         return u'\n'.join(items)
 
 
