blob: 422baa281497794bc920d5953358e398b07c9ac1 [file] [log] [blame]
Guido van Rossumbabe2bf1992-01-22 22:21:31 +00001# wdb.py -- a window-based Python debugger
2
3import stdwin
4from stdwinevents import *
5import basewin
6import sys
7
8WIDTH = 40
9MAXHEIGHT = 16
10
11class FrameWindow(basewin.BaseWindow):
12
13 def init(self, debugger, frame, dict, name):
14 self.debugger = debugger
15 self.frame = frame # Not used except for identity tests
16 self.dict = dict
17 self.name = name
18 nl = max(4, len(self.dict))
19 nl = min(nl, MAXHEIGHT)
20 width = WIDTH*stdwin.textwidth('0')
21 height = nl*stdwin.lineheight()
22 stdwin.setdefwinsize(width, height)
23 self = basewin.BaseWindow.init(self, '--Frame ' + name + '--')
24 self.initeditor()
25 self.displaylist = ['>>>', '', '-'*WIDTH]
26 self.refreshframe()
27 return self
28
29 def initeditor(self):
30 r = (stdwin.textwidth('>>> '), 0), (30000, stdwin.lineheight())
31 self.editor = self.win.textcreate(r)
32
33 def closeeditor(self):
34 self.editor.close()
35
36 def dispatch(self, event):
37 type, win, detail = event
38 if type == WE_NULL: return # Dummy tested by mainloop
39 if type in (WE_DRAW, WE_COMMAND) \
40 or not self.editor.event(event):
41 basewin.BaseWindow.dispatch(self, event)
42
43 def close(self):
44 del self.debugger.framewindows[self.name]
45 del self.debugger, self.dict
46 self.closeeditor()
47 basewin.BaseWindow.close(self)
48
49 def command(self, detail):
50 if detail == WC_RETURN:
51 self.re_eval()
52 else:
53 dummy = self.editor.event(WE_COMMAND, \
54 self.win, detail)
55
56 def re_eval(self):
57 import string, repr
58 expr = string.strip(self.editor.gettext())
59 if expr == '':
60 output = ''
61 else:
62 globals = self.frame.f_globals
63 locals = self.frame.f_locals
64 try:
65 value = eval(expr, globals, locals)
66 output = repr.repr(value)
67 except:
68 output = sys.exc_type + ': ' + `sys.exc_value`
69 self.displaylist[1] = output
70 lh = stdwin.lineheight()
71 r = (-10, 0), (30000, 2*lh)
72 self.win.change(r)
73 self.editor.setfocus(0, len(expr))
74
75 def draw(self, detail):
76 (left, top), (right, bottom) = detail
77 dummy = self.editor.draw(detail)
78 d = self.win.begindrawing()
79 try:
80 lh = d.lineheight()
81 h, v = 0, 0
82 for line in self.displaylist:
83 if v+lh > top and v < bottom:
84 d.text((h, v), line)
85 v = v + lh
86 finally:
87 d.close()
88
89 def refreshframe(self):
90 import repr
91 del self.displaylist[3:]
92 self.re_eval()
93 names = self.dict.keys()
94 for key, label in ('__args__', 'Args: '), \
95 ('__return__', 'Return: '):
96 if self.dict.has_key(key):
97 names.remove(key)
98 value = self.dict[key]
99 label = label + repr.repr(value)
100 self.displaylist.append(label)
101 names.sort()
102 for name in names:
103 value = self.dict[name]
104 line = name + ' = ' + repr.repr(value)
105 self.displaylist.append(line)
106 self.win.setdocsize(0, \
107 stdwin.lineheight() * len(self.displaylist))
108 self.refreshall() # XXX Be more subtle later