160 lines
4.5 KiB
Python
160 lines
4.5 KiB
Python
import os
|
|
import sys
|
|
import imp
|
|
import string
|
|
import tkMessageBox
|
|
|
|
from MultiScrolledLists import MultiScrolledLists
|
|
|
|
class PathBrowser(MultiScrolledLists):
|
|
|
|
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
|
|
modules = {}
|
|
suffixes = imp.get_suffixes()
|
|
allnames = os.listdir(dir)
|
|
sorted = []
|
|
for suff, mode, flag in suffixes:
|
|
i = -len(suff)
|
|
for name in allnames:
|
|
normed_name = os.path.normcase(name)
|
|
if normed_name[i:] == suff:
|
|
mod_name = name[:i]
|
|
if not modules.has_key(mod_name):
|
|
modules[mod_name] = None
|
|
sorted.append((normed_name, 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])
|
|
|
|
|
|
def main():
|
|
import PyShell
|
|
PathBrowser(PyShell.flist)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|