Commit 9d16d0a0 authored by Guido van Rossum's avatar Guido van Rossum

Rewritten based on TreeWidget.py

parent 592103c4
This diff is collapsed.
import os import os
import sys import sys
import imp 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): def __init__(self, flist):
self.flist = flist self.init(flist)
MultiScrolledLists.__init__(self, flist.root, 4)
def settitle(self):
def longtitle(self): self.top.wm_title("Path Browser")
return "Path Browser" self.top.wm_iconname("Path Browser")
def width(self, i): def rootnode(self):
return 30 return PathBrowserTreeItem()
def height(self, i): class PathBrowserTreeItem(TreeItem):
return 20
def GetText(self):
def subtitle(self, i): return "sys.path"
if i == 0:
return "Path Entries (sys.path)" def GetSubList(self):
if i-1 >= len(self.path): sublist = []
return "" for dir in sys.path:
if i == 1: item = DirBrowserTreeItem(dir)
return self.path[0] sublist.append(item)
if i == 2: return sublist
return "Classes in " + self.path[1]
if i == 3: class DirBrowserTreeItem(TreeItem):
s = self.path[2]
i = string.find(s, "(") def __init__(self, dir, packages=[]):
if i > 0: self.dir = dir
s = s[:i] self.packages = packages
return "Methods of " + s
return "" def GetText(self):
if not self.packages:
def items(self, i): return self.dir
if i == 0: else:
return sys.path return self.packages[-1] + ": package"
if i == 1:
return self.listmodules() def GetSubList(self):
if i == 2: try:
return self.listclasses() names = os.listdir(self.dir or os.curdir)
if i == 3: except os.error:
return self.listmethods() return []
packages = []
def listmodules(self): for name in names:
dir = self.path[0] or os.curdir 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 = {} modules = {}
suffixes = imp.get_suffixes() suffixes = imp.get_suffixes()
allnames = os.listdir(dir)
sorted = [] sorted = []
for suff, mode, flag in suffixes: for suff, mode, flag in suffixes:
i = -len(suff) i = -len(suff)
...@@ -65,96 +83,13 @@ class PathBrowser(MultiScrolledLists): ...@@ -65,96 +83,13 @@ class PathBrowser(MultiScrolledLists):
sorted.append((normed_name, name)) sorted.append((normed_name, name))
allnames.remove(name) allnames.remove(name)
sorted.sort() sorted.sort()
names = [] return sorted
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(): def main():
import PyShell import PyShell
PathBrowser(PyShell.flist) PathBrowser(PyShell.flist)
if sys.stdin is sys.__stdin__:
mainloop()
if __name__ == "__main__": if __name__ == "__main__":
main() main()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment