blob: 62470b2557994f9d9ba2a0ad2dbb06e9401c4b2a [file] [log] [blame]
Guido van Rossuma917af71999-03-10 05:17:28 +00001import os
2import sys
3import imp
4import string
5import tkMessageBox
6
7from MultiScrolledLists import MultiScrolledLists
8
9class PathBrowser(MultiScrolledLists):
10
11 def __init__(self, flist):
12 self.flist = flist
13 MultiScrolledLists.__init__(self, flist.root, 4)
14
15 def longtitle(self):
16 return "Path Browser"
17
18 def width(self, i):
19 return 30
20
21 def height(self, i):
22 return 20
23
24 def subtitle(self, i):
25 if i == 0:
26 return "Path Entries (sys.path)"
27 if i-1 >= len(self.path):
28 return ""
29 if i == 1:
30 return self.path[0]
31 if i == 2:
32 return "Classes in " + self.path[1]
33 if i == 3:
34 s = self.path[2]
35 i = string.find(s, "(")
36 if i > 0:
37 s = s[:i]
38 return "Methods of " + s
39 return ""
40
41 def items(self, i):
42 if i == 0:
43 return sys.path
44 if i == 1:
45 return self.listmodules()
46 if i == 2:
47 return self.listclasses()
48 if i == 3:
49 return self.listmethods()
50
51 def listmodules(self):
Guido van Rossumdd584161999-03-11 23:21:23 +000052 dir = self.path[0] or os.curdir
Guido van Rossuma917af71999-03-10 05:17:28 +000053 modules = {}
54 suffixes = imp.get_suffixes()
55 allnames = os.listdir(dir)
56 sorted = []
57 for suff, mode, flag in suffixes:
58 i = -len(suff)
Guido van Rossum78608121999-04-30 15:14:05 +000059 for name in allnames[:]:
Guido van Rossuma917af71999-03-10 05:17:28 +000060 normed_name = os.path.normcase(name)
61 if normed_name[i:] == suff:
62 mod_name = name[:i]
63 if not modules.has_key(mod_name):
64 modules[mod_name] = None
65 sorted.append((normed_name, name))
Guido van Rossum78608121999-04-30 15:14:05 +000066 allnames.remove(name)
Guido van Rossuma917af71999-03-10 05:17:28 +000067 sorted.sort()
68 names = []
69 for nn, name in sorted:
70 names.append(name)
71 return names
72
73 def listclasses(self):
74 import pyclbr
75 dir = self.path[0]
76 file = self.path[1]
77 name, ext = os.path.splitext(file)
78 if os.path.normcase(ext) != ".py":
79 self.top.bell()
80 return []
81 try:
Guido van Rossumb62e8771999-03-11 16:37:13 +000082 self.top.configure(cursor="watch")
83 self.top.update_idletasks()
84 try:
85 dict = pyclbr.readmodule(name, [dir] + sys.path)
86 finally:
87 self.top.configure(cursor="")
Guido van Rossuma917af71999-03-10 05:17:28 +000088 except ImportError, msg:
89 tkMessageBox.showerror("Import error", str(msg), parent=root)
90 return []
91 items = []
92 self.classes = {}
93 for key, cl in dict.items():
94 if cl.module == name:
95 s = key
96 if cl.super:
97 supers = []
98 for sup in cl.super:
Guido van Rossumb62e8771999-03-11 16:37:13 +000099 if type(sup) is type(''):
100 sname = sup
101 else:
102 sname = sup.name
103 if sup.module != cl.module:
104 sname = "%s.%s" % (sup.module, sname)
Guido van Rossuma917af71999-03-10 05:17:28 +0000105 supers.append(sname)
106 s = s + "(%s)" % string.join(supers, ", ")
107 items.append((cl.lineno, s))
108 self.classes[s] = cl
109 items.sort()
110 list = []
111 for item, s in items:
112 list.append(s)
113 return list
114
115 def listmethods(self):
116 try:
117 cl = self.classes[self.path[2]]
118 except (IndexError, KeyError):
119 return []
120 items = []
121 for name, lineno in cl.methods.items():
122 items.append((lineno, name))
123 items.sort()
124 list = []
125 for item, name in items:
126 list.append(name)
127 return list
128
129 def on_double(self, index, i):
130 if i == 0:
131 return
132 if i >= 1:
133 dir = self.path[0]
134 file = self.path[1]
135 name, ext = os.path.splitext(file)
136 if os.path.normcase(ext) != ".py":
137 self.top.bell()
138 return
139 fullname = os.path.join(dir, file)
140 edit = self.flist.open(fullname)
141 if i >= 2:
142 classname = self.path[2]
143 try:
144 cl = self.classes[classname]
145 except KeyError:
146 cl = None
147 else:
148 if i == 2:
149 edit.gotoline(cl.lineno)
150 else:
151 methodname = self.path[3]
152 edit.gotoline(cl.methods[methodname])
153
154
155def main():
156 import PyShell
157 PathBrowser(PyShell.flist)
158
159if __name__ == "__main__":
160 main()