diff options
Diffstat (limited to 'Tools/idle/PathBrowser.py')
-rw-r--r-- | Tools/idle/PathBrowser.py | 199 |
1 files changed, 67 insertions, 132 deletions
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 @@ class PathBrowser(MultiScrolledLists): 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() |