round(0, "ermintrude") succeeded instead of producing a TypeError. Fix this.
[python.git] / Lib / idlelib / ObjectBrowser.py
blobb4f64b6fb24d25937e1a9e37b42ce7311fc35802
1 # XXX TO DO:
2 # - popup menu
3 # - support partial or total redisplay
4 # - more doc strings
5 # - tooltips
7 # object browser
9 # XXX TO DO:
10 # - for classes/modules, add "open source" to object browser
12 from TreeWidget import TreeItem, TreeNode, ScrolledCanvas
14 from repr import Repr
16 myrepr = Repr()
17 myrepr.maxstring = 100
18 myrepr.maxother = 100
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
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
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
82 class AtomicObjectTreeItem(ObjectTreeItem):
83 def IsExpandable(self):
84 return 0
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
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
113 from types import *
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,
127 def make_objecttreeitem(labeltext, object, setfunction=None):
128 t = type(object)
129 if t in dispatch:
130 c = dispatch[t]
131 else:
132 c = ObjectTreeItem
133 return c(labeltext, object, setfunction)
135 # Test script
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()
150 if __name__ == '__main__':
151 _test()