Rewritten based on TreeWidget.py
diff --git a/Tools/idle/PathBrowser.py b/Tools/idle/PathBrowser.py
index 62470b2..7ea2410 100644
--- a/Tools/idle/PathBrowser.py
+++ b/Tools/idle/PathBrowser.py
@@ -1,58 +1,76 @@
 import os
 import sys
 import imp
-import string
-import tkMessageBox
 
-from MultiScrolledLists import MultiScrolledLists
+from TreeWidget import TreeItem
+from ClassBrowser import ClassBrowser, ModuleBrowserTreeItem
 
-class PathBrowser(MultiScrolledLists):
+class PathBrowser(ClassBrowser):
     
     def __init__(self, flist):
-        self.flist = flist
-        MultiScrolledLists.__init__(self, flist.root, 4)
-    
-    def longtitle(self):
-        return "Path Browser"
-    
-    def width(self, i):
-        return 30
-    
-    def height(self, i):
-        return 20
-    
-    def subtitle(self, i):
-        if i == 0:
-            return "Path Entries (sys.path)"
-        if i-1 >= len(self.path):
-            return ""
-        if i == 1:
-            return self.path[0]
-        if i == 2:
-            return "Classes in " + self.path[1]
-        if i == 3:
-            s = self.path[2]
-            i = string.find(s, "(")
-            if i > 0:
-                s = s[:i]
-            return "Methods of " + s
-        return ""
-    
-    def items(self, i):
-        if i == 0:
-            return sys.path
-        if i == 1:
-            return self.listmodules()
-        if i == 2:
-            return self.listclasses()
-        if i == 3:
-            return self.listmethods()
-    
-    def listmodules(self):
-        dir = self.path[0] or os.curdir
+        self.init(flist)
+
+    def settitle(self):
+        self.top.wm_title("Path Browser")
+        self.top.wm_iconname("Path Browser")
+
+    def rootnode(self):
+        return PathBrowserTreeItem()
+
+class PathBrowserTreeItem(TreeItem):
+
+    def GetText(self):
+        return "sys.path"
+
+    def GetSubList(self):
+        sublist = []
+        for dir in sys.path:
+            item = DirBrowserTreeItem(dir)
+            sublist.append(item)
+        return sublist
+
+class DirBrowserTreeItem(TreeItem):
+
+    def __init__(self, dir, packages=[]):
+        self.dir = dir
+        self.packages = packages
+
+    def GetText(self):
+        if not self.packages:
+            return self.dir
+        else:
+            return self.packages[-1] + ": package"
+
+    def GetSubList(self):
+        try:
+            names = os.listdir(self.dir or os.curdir)
+        except os.error:
+            return []
+        packages = []
+        for name in names:
+            file = os.path.join(self.dir, name)
+            if self.ispackagedir(file):
+                nn = os.path.normcase(name)
+                packages.append((nn, name, file))
+        packages.sort()
+        sublist = []
+        for nn, name, file in packages:
+            item = DirBrowserTreeItem(file, self.packages + [name])
+            sublist.append(item)
+        for nn, name in self.listmodules(names):
+            item = ModuleBrowserTreeItem(os.path.join(self.dir, name))
+            sublist.append(item)
+        return sublist
+
+    def ispackagedir(self, file):
+        if not os.path.isdir(file):
+            return 0
+        init = os.path.join(file, "__init__.py")
+        return os.path.exists(init)
+
+    def listmodules(self, allnames):
         modules = {}
         suffixes = imp.get_suffixes()
-        allnames = os.listdir(dir)
         sorted = []
         for suff, mode, flag in suffixes:
             i = -len(suff)
@@ -65,96 +83,13 @@
                         sorted.append((normed_name, name))
                         allnames.remove(name)
         sorted.sort()
-        names = []
-        for nn, name in sorted:
-            names.append(name)
-        return names
-    
-    def listclasses(self):
-        import pyclbr
-        dir = self.path[0]
-        file = self.path[1]
-        name, ext = os.path.splitext(file)
-        if os.path.normcase(ext) != ".py":
-            self.top.bell()
-            return []
-        try:
-            self.top.configure(cursor="watch")
-            self.top.update_idletasks()
-            try:
-                dict = pyclbr.readmodule(name, [dir] + sys.path)
-            finally:
-                self.top.configure(cursor="")
-        except ImportError, msg:
-            tkMessageBox.showerror("Import error", str(msg), parent=root)
-            return []
-        items = []
-        self.classes = {}
-        for key, cl in dict.items():
-            if cl.module == name:
-                s = key
-                if cl.super:
-                    supers = []
-                    for sup in cl.super:
-                        if type(sup) is type(''):
-                            sname = sup
-                        else:
-                            sname = sup.name
-                            if sup.module != cl.module:
-                                sname = "%s.%s" % (sup.module, sname)
-                        supers.append(sname)
-                    s = s + "(%s)" % string.join(supers, ", ")
-                items.append((cl.lineno, s))
-                self.classes[s] = cl
-        items.sort()
-        list = []
-        for item, s in items:
-            list.append(s)
-        return list
-    
-    def listmethods(self):
-        try:
-            cl = self.classes[self.path[2]]
-        except (IndexError, KeyError):
-            return []
-        items = []
-        for name, lineno in cl.methods.items():
-            items.append((lineno, name))
-        items.sort()
-        list = []
-        for item, name in items:
-            list.append(name)
-        return list
-    
-    def on_double(self, index, i):
-        if i == 0:
-            return
-        if i >= 1:
-            dir = self.path[0]
-            file = self.path[1]
-            name, ext = os.path.splitext(file)
-            if os.path.normcase(ext) != ".py":
-                self.top.bell()
-                return
-            fullname = os.path.join(dir, file)
-            edit = self.flist.open(fullname)
-            if i >= 2:
-                classname = self.path[2]
-                try:
-                    cl = self.classes[classname]
-                except KeyError:
-                    cl = None
-                else:
-                    if i == 2:
-                        edit.gotoline(cl.lineno)
-                    else:
-                        methodname = self.path[3]
-                        edit.gotoline(cl.methods[methodname])
-
+        return sorted
 
 def main():
     import PyShell
     PathBrowser(PyShell.flist)
+    if sys.stdin is sys.__stdin__:
+        mainloop()
 
 if __name__ == "__main__":
     main()