blob: b359efc1b4eee6b35380bfcfd2c008ebb9e1ef11 [file] [log] [blame]
David Scherer7aced172000-08-15 01:13:23 +00001# 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
Kurt B. Kaiser2d7f6a02007-08-22 23:01:33 +000012from idlelib.TreeWidget import TreeItem, TreeNode, ScrolledCanvas
David Scherer7aced172000-08-15 01:13:23 +000013
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +000014from reprlib import Repr
David Scherer7aced172000-08-15 01:13:23 +000015
16myrepr = Repr()
17myrepr.maxstring = 100
18myrepr.maxother = 100
19
20class 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
David Scherer7aced172000-08-15 01:13:23 +000060class ClassTreeItem(ObjectTreeItem):
61 def IsExpandable(self):
Kurt B. Kaiser33931ef2002-09-16 22:16:05 +000062 return True
David Scherer7aced172000-08-15 01:13:23 +000063 def GetSubList(self):
64 sublist = ObjectTreeItem.GetSubList(self)
65 if len(self.object.__bases__) == 1:
66 item = make_objecttreeitem("__bases__[0] =",
67 self.object.__bases__[0])
68 else:
69 item = make_objecttreeitem("__bases__ =", self.object.__bases__)
70 sublist.insert(0, item)
71 return sublist
72
73class AtomicObjectTreeItem(ObjectTreeItem):
74 def IsExpandable(self):
75 return 0
76
77class SequenceTreeItem(ObjectTreeItem):
78 def IsExpandable(self):
79 return len(self.object) > 0
80 def keys(self):
81 return range(len(self.object))
82 def GetSubList(self):
83 sublist = []
84 for key in self.keys():
85 try:
86 value = self.object[key]
87 except KeyError:
88 continue
89 def setfunction(value, key=key, object=self.object):
90 object[key] = value
Walter Dörwald70a6b492004-02-12 17:35:32 +000091 item = make_objecttreeitem("%r:" % (key,), value, setfunction)
David Scherer7aced172000-08-15 01:13:23 +000092 sublist.append(item)
93 return sublist
94
95class DictTreeItem(SequenceTreeItem):
96 def keys(self):
Kurt B. Kaisere0712772007-08-23 05:25:55 +000097 keys = list(self.object.keys())
David Scherer7aced172000-08-15 01:13:23 +000098 try:
99 keys.sort()
100 except:
101 pass
102 return keys
103
David Scherer7aced172000-08-15 01:13:23 +0000104dispatch = {
Guido van Rossum13257902007-06-07 23:15:56 +0000105 int: AtomicObjectTreeItem,
106 float: AtomicObjectTreeItem,
107 str: AtomicObjectTreeItem,
108 tuple: SequenceTreeItem,
109 list: SequenceTreeItem,
110 dict: DictTreeItem,
111 type: ClassTreeItem,
David Scherer7aced172000-08-15 01:13:23 +0000112}
113
114def make_objecttreeitem(labeltext, object, setfunction=None):
115 t = type(object)
Guido van Rossum811c4e02006-08-22 15:45:46 +0000116 if t in dispatch:
David Scherer7aced172000-08-15 01:13:23 +0000117 c = dispatch[t]
118 else:
119 c = ObjectTreeItem
120 return c(labeltext, object, setfunction)
121
122# Test script
123
Kurt B. Kaiser6a945a52001-07-13 17:57:37 +0000124def _test():
David Scherer7aced172000-08-15 01:13:23 +0000125 import sys
Georg Brandl14fc4272008-05-17 18:39:55 +0000126 from tkinter import Tk
Kurt B. Kaiser6a945a52001-07-13 17:57:37 +0000127 root = Tk()
David Scherer7aced172000-08-15 01:13:23 +0000128 root.configure(bd=0, bg="yellow")
129 root.focus_set()
130 sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1)
131 sc.frame.pack(expand=1, fill="both")
132 item = make_objecttreeitem("sys", sys)
133 node = TreeNode(sc.canvas, None, item)
Kurt B. Kaiser6a945a52001-07-13 17:57:37 +0000134 node.update()
135 root.mainloop()
David Scherer7aced172000-08-15 01:13:23 +0000136
137if __name__ == '__main__':
Kurt B. Kaiser6a945a52001-07-13 17:57:37 +0000138 _test()