blob: 7b57aa4c684b8a0964f40c7a5d0e0d8e1b544a0f [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
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -040012import re
13
Kurt B. Kaiser2d7f6a02007-08-22 23:01:33 +000014from idlelib.TreeWidget import TreeItem, TreeNode, ScrolledCanvas
David Scherer7aced172000-08-15 01:13:23 +000015
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +000016from reprlib import Repr
David Scherer7aced172000-08-15 01:13:23 +000017
18myrepr = Repr()
19myrepr.maxstring = 100
20myrepr.maxother = 100
21
22class ObjectTreeItem(TreeItem):
23 def __init__(self, labeltext, object, setfunction=None):
24 self.labeltext = labeltext
25 self.object = object
26 self.setfunction = setfunction
27 def GetLabelText(self):
28 return self.labeltext
29 def GetText(self):
30 return myrepr.repr(self.object)
31 def GetIconName(self):
32 if not self.IsExpandable():
33 return "python"
34 def IsEditable(self):
35 return self.setfunction is not None
36 def SetText(self, text):
37 try:
38 value = eval(text)
39 self.setfunction(value)
40 except:
41 pass
42 else:
43 self.object = value
44 def IsExpandable(self):
45 return not not dir(self.object)
46 def GetSubList(self):
47 keys = dir(self.object)
48 sublist = []
49 for key in keys:
50 try:
51 value = getattr(self.object, key)
52 except AttributeError:
53 continue
54 item = make_objecttreeitem(
55 str(key) + " =",
56 value,
57 lambda value, key=key, object=self.object:
58 setattr(object, key, value))
59 sublist.append(item)
60 return sublist
61
David Scherer7aced172000-08-15 01:13:23 +000062class ClassTreeItem(ObjectTreeItem):
63 def IsExpandable(self):
Kurt B. Kaiser33931ef2002-09-16 22:16:05 +000064 return True
David Scherer7aced172000-08-15 01:13:23 +000065 def GetSubList(self):
66 sublist = ObjectTreeItem.GetSubList(self)
67 if len(self.object.__bases__) == 1:
68 item = make_objecttreeitem("__bases__[0] =",
69 self.object.__bases__[0])
70 else:
71 item = make_objecttreeitem("__bases__ =", self.object.__bases__)
72 sublist.insert(0, item)
73 return sublist
74
75class AtomicObjectTreeItem(ObjectTreeItem):
76 def IsExpandable(self):
77 return 0
78
79class SequenceTreeItem(ObjectTreeItem):
80 def IsExpandable(self):
81 return len(self.object) > 0
82 def keys(self):
83 return range(len(self.object))
84 def GetSubList(self):
85 sublist = []
86 for key in self.keys():
87 try:
88 value = self.object[key]
89 except KeyError:
90 continue
91 def setfunction(value, key=key, object=self.object):
92 object[key] = value
Walter Dörwald70a6b492004-02-12 17:35:32 +000093 item = make_objecttreeitem("%r:" % (key,), value, setfunction)
David Scherer7aced172000-08-15 01:13:23 +000094 sublist.append(item)
95 return sublist
96
97class DictTreeItem(SequenceTreeItem):
98 def keys(self):
Kurt B. Kaisere0712772007-08-23 05:25:55 +000099 keys = list(self.object.keys())
David Scherer7aced172000-08-15 01:13:23 +0000100 try:
101 keys.sort()
102 except:
103 pass
104 return keys
105
David Scherer7aced172000-08-15 01:13:23 +0000106dispatch = {
Guido van Rossum13257902007-06-07 23:15:56 +0000107 int: AtomicObjectTreeItem,
108 float: AtomicObjectTreeItem,
109 str: AtomicObjectTreeItem,
110 tuple: SequenceTreeItem,
111 list: SequenceTreeItem,
112 dict: DictTreeItem,
113 type: ClassTreeItem,
David Scherer7aced172000-08-15 01:13:23 +0000114}
115
116def make_objecttreeitem(labeltext, object, setfunction=None):
117 t = type(object)
Guido van Rossum811c4e02006-08-22 15:45:46 +0000118 if t in dispatch:
David Scherer7aced172000-08-15 01:13:23 +0000119 c = dispatch[t]
120 else:
121 c = ObjectTreeItem
122 return c(labeltext, object, setfunction)
123
David Scherer7aced172000-08-15 01:13:23 +0000124
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -0400125def _object_browser(parent):
David Scherer7aced172000-08-15 01:13:23 +0000126 import sys
Georg Brandl14fc4272008-05-17 18:39:55 +0000127 from tkinter import Tk
Kurt B. Kaiser6a945a52001-07-13 17:57:37 +0000128 root = Tk()
Terry Jan Reedy2e8234a2014-05-29 01:46:26 -0400129 root.title("Test ObjectBrowser")
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -0400130 width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
Terry Jan Reedy2e8234a2014-05-29 01:46:26 -0400131 root.geometry("+%d+%d"%(x, y + 150))
David Scherer7aced172000-08-15 01:13:23 +0000132 root.configure(bd=0, bg="yellow")
133 root.focus_set()
134 sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1)
135 sc.frame.pack(expand=1, fill="both")
136 item = make_objecttreeitem("sys", sys)
137 node = TreeNode(sc.canvas, None, item)
Kurt B. Kaiser6a945a52001-07-13 17:57:37 +0000138 node.update()
139 root.mainloop()
David Scherer7aced172000-08-15 01:13:23 +0000140
141if __name__ == '__main__':
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -0400142 from idlelib.idle_test.htest import run
143 run(_object_browser)