summaryrefslogtreecommitdiffstats
path: root/Lib/lib-stdwin/wdbframewin.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/lib-stdwin/wdbframewin.py')
-rw-r--r--Lib/lib-stdwin/wdbframewin.py108
1 files changed, 108 insertions, 0 deletions
diff --git a/Lib/lib-stdwin/wdbframewin.py b/Lib/lib-stdwin/wdbframewin.py
new file mode 100644
index 0000000..422baa2
--- /dev/null
+++ b/Lib/lib-stdwin/wdbframewin.py
@@ -0,0 +1,108 @@
+# wdb.py -- a window-based Python debugger
+
+import stdwin
+from stdwinevents import *
+import basewin
+import sys
+
+WIDTH = 40
+MAXHEIGHT = 16
+
+class FrameWindow(basewin.BaseWindow):
+
+ def init(self, debugger, frame, dict, name):
+ self.debugger = debugger
+ self.frame = frame # Not used except for identity tests
+ self.dict = dict
+ self.name = name
+ nl = max(4, len(self.dict))
+ nl = min(nl, MAXHEIGHT)
+ width = WIDTH*stdwin.textwidth('0')
+ height = nl*stdwin.lineheight()
+ stdwin.setdefwinsize(width, height)
+ self = basewin.BaseWindow.init(self, '--Frame ' + name + '--')
+ self.initeditor()
+ self.displaylist = ['>>>', '', '-'*WIDTH]
+ self.refreshframe()
+ return self
+
+ def initeditor(self):
+ r = (stdwin.textwidth('>>> '), 0), (30000, stdwin.lineheight())
+ self.editor = self.win.textcreate(r)
+
+ def closeeditor(self):
+ self.editor.close()
+
+ def dispatch(self, event):
+ type, win, detail = event
+ if type == WE_NULL: return # Dummy tested by mainloop
+ if type in (WE_DRAW, WE_COMMAND) \
+ or not self.editor.event(event):
+ basewin.BaseWindow.dispatch(self, event)
+
+ def close(self):
+ del self.debugger.framewindows[self.name]
+ del self.debugger, self.dict
+ self.closeeditor()
+ basewin.BaseWindow.close(self)
+
+ def command(self, detail):
+ if detail == WC_RETURN:
+ self.re_eval()
+ else:
+ dummy = self.editor.event(WE_COMMAND, \
+ self.win, detail)
+
+ def re_eval(self):
+ import string, repr
+ expr = string.strip(self.editor.gettext())
+ if expr == '':
+ output = ''
+ else:
+ globals = self.frame.f_globals
+ locals = self.frame.f_locals
+ try:
+ value = eval(expr, globals, locals)
+ output = repr.repr(value)
+ except:
+ output = sys.exc_type + ': ' + `sys.exc_value`
+ self.displaylist[1] = output
+ lh = stdwin.lineheight()
+ r = (-10, 0), (30000, 2*lh)
+ self.win.change(r)
+ self.editor.setfocus(0, len(expr))
+
+ def draw(self, detail):
+ (left, top), (right, bottom) = detail
+ dummy = self.editor.draw(detail)
+ d = self.win.begindrawing()
+ try:
+ lh = d.lineheight()
+ h, v = 0, 0
+ for line in self.displaylist:
+ if v+lh > top and v < bottom:
+ d.text((h, v), line)
+ v = v + lh
+ finally:
+ d.close()
+
+ def refreshframe(self):
+ import repr
+ del self.displaylist[3:]
+ self.re_eval()
+ names = self.dict.keys()
+ for key, label in ('__args__', 'Args: '), \
+ ('__return__', 'Return: '):
+ if self.dict.has_key(key):
+ names.remove(key)
+ value = self.dict[key]
+ label = label + repr.repr(value)
+ self.displaylist.append(label)
+ names.sort()
+ for name in names:
+ value = self.dict[name]
+ line = name + ' = ' + repr.repr(value)
+ self.displaylist.append(line)
+ self.win.setdocsize(0, \
+ stdwin.lineheight() * len(self.displaylist))
+ self.refreshall() # XXX Be more subtle later