Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | # XXX TO DO: |
2 | # - popup menu | |
3 | # - support partial or total redisplay | |
4 | # - more doc strings | |
5 | # - tooltips | |
6 | ||
7 | # object browser | |
8 | ||
9 | # XXX TO DO: | |
10 | # - for classes/modules, add "open source" to object browser | |
11 | ||
12 | from TreeWidget import TreeItem, TreeNode, ScrolledCanvas | |
13 | ||
14 | from repr import Repr | |
15 | ||
16 | myrepr = Repr() | |
17 | myrepr.maxstring = 100 | |
18 | myrepr.maxother = 100 | |
19 | ||
20 | class ObjectTreeItem(TreeItem): | |
21 | def __init__(self, labeltext, object, setfunction=None): | |
22 | self.labeltext = labeltext | |
23 | self.object = object | |
24 | self.setfunction = setfunction | |
25 | def GetLabelText(self): | |
26 | return self.labeltext | |
27 | def GetText(self): | |
28 | return myrepr.repr(self.object) | |
29 | def GetIconName(self): | |
30 | if not self.IsExpandable(): | |
31 | return "python" | |
32 | def IsEditable(self): | |
33 | return self.setfunction is not None | |
34 | def SetText(self, text): | |
35 | try: | |
36 | value = eval(text) | |
37 | self.setfunction(value) | |
38 | except: | |
39 | pass | |
40 | else: | |
41 | self.object = value | |
42 | def IsExpandable(self): | |
43 | return not not dir(self.object) | |
44 | def GetSubList(self): | |
45 | keys = dir(self.object) | |
46 | sublist = [] | |
47 | for key in keys: | |
48 | try: | |
49 | value = getattr(self.object, key) | |
50 | except AttributeError: | |
51 | continue | |
52 | item = make_objecttreeitem( | |
53 | str(key) + " =", | |
54 | value, | |
55 | lambda value, key=key, object=self.object: | |
56 | setattr(object, key, value)) | |
57 | sublist.append(item) | |
58 | return sublist | |
59 | ||
60 | class InstanceTreeItem(ObjectTreeItem): | |
61 | def IsExpandable(self): | |
62 | return True | |
63 | def GetSubList(self): | |
64 | sublist = ObjectTreeItem.GetSubList(self) | |
65 | sublist.insert(0, | |
66 | make_objecttreeitem("__class__ =", self.object.__class__)) | |
67 | return sublist | |
68 | ||
69 | class ClassTreeItem(ObjectTreeItem): | |
70 | def IsExpandable(self): | |
71 | return True | |
72 | def GetSubList(self): | |
73 | sublist = ObjectTreeItem.GetSubList(self) | |
74 | if len(self.object.__bases__) == 1: | |
75 | item = make_objecttreeitem("__bases__[0] =", | |
76 | self.object.__bases__[0]) | |
77 | else: | |
78 | item = make_objecttreeitem("__bases__ =", self.object.__bases__) | |
79 | sublist.insert(0, item) | |
80 | return sublist | |
81 | ||
82 | class AtomicObjectTreeItem(ObjectTreeItem): | |
83 | def IsExpandable(self): | |
84 | return 0 | |
85 | ||
86 | class SequenceTreeItem(ObjectTreeItem): | |
87 | def IsExpandable(self): | |
88 | return len(self.object) > 0 | |
89 | def keys(self): | |
90 | return range(len(self.object)) | |
91 | def GetSubList(self): | |
92 | sublist = [] | |
93 | for key in self.keys(): | |
94 | try: | |
95 | value = self.object[key] | |
96 | except KeyError: | |
97 | continue | |
98 | def setfunction(value, key=key, object=self.object): | |
99 | object[key] = value | |
100 | item = make_objecttreeitem("%r:" % (key,), value, setfunction) | |
101 | sublist.append(item) | |
102 | return sublist | |
103 | ||
104 | class DictTreeItem(SequenceTreeItem): | |
105 | def keys(self): | |
106 | keys = self.object.keys() | |
107 | try: | |
108 | keys.sort() | |
109 | except: | |
110 | pass | |
111 | return keys | |
112 | ||
113 | from types import * | |
114 | ||
115 | dispatch = { | |
116 | IntType: AtomicObjectTreeItem, | |
117 | LongType: AtomicObjectTreeItem, | |
118 | FloatType: AtomicObjectTreeItem, | |
119 | StringType: AtomicObjectTreeItem, | |
120 | TupleType: SequenceTreeItem, | |
121 | ListType: SequenceTreeItem, | |
122 | DictType: DictTreeItem, | |
123 | InstanceType: InstanceTreeItem, | |
124 | ClassType: ClassTreeItem, | |
125 | } | |
126 | ||
127 | def make_objecttreeitem(labeltext, object, setfunction=None): | |
128 | t = type(object) | |
129 | if dispatch.has_key(t): | |
130 | c = dispatch[t] | |
131 | else: | |
132 | c = ObjectTreeItem | |
133 | return c(labeltext, object, setfunction) | |
134 | ||
135 | # Test script | |
136 | ||
137 | def _test(): | |
138 | import sys | |
139 | from Tkinter import Tk | |
140 | root = Tk() | |
141 | root.configure(bd=0, bg="yellow") | |
142 | root.focus_set() | |
143 | sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1) | |
144 | sc.frame.pack(expand=1, fill="both") | |
145 | item = make_objecttreeitem("sys", sys) | |
146 | node = TreeNode(sc.canvas, None, item) | |
147 | node.update() | |
148 | root.mainloop() | |
149 | ||
150 | if __name__ == '__main__': | |
151 | _test() |