|
1 import os |
|
2 import sys |
|
3 import imp |
|
4 |
|
5 from TreeWidget import TreeItem |
|
6 from ClassBrowser import ClassBrowser, ModuleBrowserTreeItem |
|
7 |
|
8 class PathBrowser(ClassBrowser): |
|
9 |
|
10 def __init__(self, flist): |
|
11 self.init(flist) |
|
12 |
|
13 def settitle(self): |
|
14 self.top.wm_title("Path Browser") |
|
15 self.top.wm_iconname("Path Browser") |
|
16 |
|
17 def rootnode(self): |
|
18 return PathBrowserTreeItem() |
|
19 |
|
20 class PathBrowserTreeItem(TreeItem): |
|
21 |
|
22 def GetText(self): |
|
23 return "sys.path" |
|
24 |
|
25 def GetSubList(self): |
|
26 sublist = [] |
|
27 for dir in sys.path: |
|
28 item = DirBrowserTreeItem(dir) |
|
29 sublist.append(item) |
|
30 return sublist |
|
31 |
|
32 class DirBrowserTreeItem(TreeItem): |
|
33 |
|
34 def __init__(self, dir, packages=[]): |
|
35 self.dir = dir |
|
36 self.packages = packages |
|
37 |
|
38 def GetText(self): |
|
39 if not self.packages: |
|
40 return self.dir |
|
41 else: |
|
42 return self.packages[-1] + ": package" |
|
43 |
|
44 def GetSubList(self): |
|
45 try: |
|
46 names = os.listdir(self.dir or os.curdir) |
|
47 except os.error: |
|
48 return [] |
|
49 packages = [] |
|
50 for name in names: |
|
51 file = os.path.join(self.dir, name) |
|
52 if self.ispackagedir(file): |
|
53 nn = os.path.normcase(name) |
|
54 packages.append((nn, name, file)) |
|
55 packages.sort() |
|
56 sublist = [] |
|
57 for nn, name, file in packages: |
|
58 item = DirBrowserTreeItem(file, self.packages + [name]) |
|
59 sublist.append(item) |
|
60 for nn, name in self.listmodules(names): |
|
61 item = ModuleBrowserTreeItem(os.path.join(self.dir, name)) |
|
62 sublist.append(item) |
|
63 return sublist |
|
64 |
|
65 def ispackagedir(self, file): |
|
66 if not os.path.isdir(file): |
|
67 return 0 |
|
68 init = os.path.join(file, "__init__.py") |
|
69 return os.path.exists(init) |
|
70 |
|
71 def listmodules(self, allnames): |
|
72 modules = {} |
|
73 suffixes = imp.get_suffixes() |
|
74 sorted = [] |
|
75 for suff, mode, flag in suffixes: |
|
76 i = -len(suff) |
|
77 for name in allnames[:]: |
|
78 normed_name = os.path.normcase(name) |
|
79 if normed_name[i:] == suff: |
|
80 mod_name = name[:i] |
|
81 if not modules.has_key(mod_name): |
|
82 modules[mod_name] = None |
|
83 sorted.append((normed_name, name)) |
|
84 allnames.remove(name) |
|
85 sorted.sort() |
|
86 return sorted |
|
87 |
|
88 def main(): |
|
89 import PyShell |
|
90 PathBrowser(PyShell.flist) |
|
91 if sys.stdin is sys.__stdin__: |
|
92 mainloop() |
|
93 |
|
94 if __name__ == "__main__": |
|
95 main() |