blob: 3a7f6fed4f56397f7e8874a9bed7fd35b0cd4178 [file] [log] [blame]
Guido van Rossum19a86e71992-01-27 17:00:10 +00001# wdbframewin.py -- frame window for wdb.py
2
3# XXX To do:
4# - display function name in window title
5# - execute arbitrary statements instead of just evaluating expressions
6# - allow setting variables by editing their values
7
Guido van Rossumbabe2bf1992-01-22 22:21:31 +00008
9import stdwin
10from stdwinevents import *
11import basewin
12import sys
13
14WIDTH = 40
Guido van Rossum19a86e71992-01-27 17:00:10 +000015MINHEIGHT = 8
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000016MAXHEIGHT = 16
17
18class FrameWindow(basewin.BaseWindow):
19
20 def init(self, debugger, frame, dict, name):
21 self.debugger = debugger
22 self.frame = frame # Not used except for identity tests
23 self.dict = dict
24 self.name = name
Guido van Rossum19a86e71992-01-27 17:00:10 +000025 nl = max(MINHEIGHT, len(self.dict) + 5)
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000026 nl = min(nl, MAXHEIGHT)
27 width = WIDTH*stdwin.textwidth('0')
28 height = nl*stdwin.lineheight()
29 stdwin.setdefwinsize(width, height)
30 self = basewin.BaseWindow.init(self, '--Frame ' + name + '--')
Guido van Rossum19a86e71992-01-27 17:00:10 +000031 # XXX Should use current function name
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000032 self.initeditor()
33 self.displaylist = ['>>>', '', '-'*WIDTH]
34 self.refreshframe()
35 return self
36
37 def initeditor(self):
38 r = (stdwin.textwidth('>>> '), 0), (30000, stdwin.lineheight())
39 self.editor = self.win.textcreate(r)
40
41 def closeeditor(self):
42 self.editor.close()
43
44 def dispatch(self, event):
45 type, win, detail = event
46 if type == WE_NULL: return # Dummy tested by mainloop
47 if type in (WE_DRAW, WE_COMMAND) \
48 or not self.editor.event(event):
49 basewin.BaseWindow.dispatch(self, event)
50
51 def close(self):
52 del self.debugger.framewindows[self.name]
53 del self.debugger, self.dict
54 self.closeeditor()
55 basewin.BaseWindow.close(self)
56
57 def command(self, detail):
58 if detail == WC_RETURN:
59 self.re_eval()
60 else:
61 dummy = self.editor.event(WE_COMMAND, \
62 self.win, detail)
63
Sjoerd Mullender148644d1993-10-01 14:29:45 +000064 def mouse_down(self, detail):
65 (h, v), clicks, button, mask = detail
66 i = v / stdwin.lineheight()
67 if 5 <= i < len(self.displaylist):
68 import string
69 name = string.splitfields(self.displaylist[i],' = ')[0]
70 if not self.dict.has_key(name):
71 stdwin.fleep()
72 return
73 value = self.dict[name]
74 if not hasattr(value, '__dict__'):
75 stdwin.fleep()
76 return
77 name = 'instance ' + `value`
78 if self.debugger.framewindows.has_key(name):
79 self.debugger.framewindows[name].popup()
80 else:
81 self.debugger.framewindows[name] = \
82 FrameWindow().init(self.debugger,
83 self.frame, value.__dict__,
84 name)
85 return
86 stdwin.fleep()
87
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000088 def re_eval(self):
89 import string, repr
90 expr = string.strip(self.editor.gettext())
91 if expr == '':
92 output = ''
93 else:
94 globals = self.frame.f_globals
Guido van Rossum19a86e71992-01-27 17:00:10 +000095 locals = self.dict
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000096 try:
97 value = eval(expr, globals, locals)
98 output = repr.repr(value)
99 except:
100 output = sys.exc_type + ': ' + `sys.exc_value`
101 self.displaylist[1] = output
102 lh = stdwin.lineheight()
103 r = (-10, 0), (30000, 2*lh)
104 self.win.change(r)
105 self.editor.setfocus(0, len(expr))
106
107 def draw(self, detail):
108 (left, top), (right, bottom) = detail
109 dummy = self.editor.draw(detail)
110 d = self.win.begindrawing()
111 try:
112 lh = d.lineheight()
113 h, v = 0, 0
114 for line in self.displaylist:
115 if v+lh > top and v < bottom:
116 d.text((h, v), line)
117 v = v + lh
118 finally:
119 d.close()
120
121 def refreshframe(self):
122 import repr
123 del self.displaylist[3:]
124 self.re_eval()
125 names = self.dict.keys()
126 for key, label in ('__args__', 'Args: '), \
127 ('__return__', 'Return: '):
128 if self.dict.has_key(key):
129 names.remove(key)
130 value = self.dict[key]
131 label = label + repr.repr(value)
132 self.displaylist.append(label)
133 names.sort()
134 for name in names:
135 value = self.dict[name]
136 line = name + ' = ' + repr.repr(value)
137 self.displaylist.append(line)
138 self.win.setdocsize(0, \
139 stdwin.lineheight() * len(self.displaylist))
140 self.refreshall() # XXX Be more subtle later