home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pyth_os2.zip / python-1.0.2 / Lib / stdwin / wdbframewin.py < prev    next >
Text File  |  1993-12-17  |  4KB  |  144 lines

  1. # 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.  
  8.  
  9. import stdwin
  10. from stdwinevents import *
  11. import basewin
  12. import sys
  13.  
  14. WIDTH = 40
  15. MINHEIGHT = 8
  16. MAXHEIGHT = 16
  17.  
  18. class 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
  25.         nl = max(MINHEIGHT, len(self.dict) + 5)
  26.         nl = min(nl, MAXHEIGHT)
  27.         width = WIDTH*stdwin.textwidth('0')
  28.         height = nl*stdwin.lineheight()
  29.         stdwin.setdefwinsize(width, height)
  30.         basewin.BaseWindow.__init__(
  31.               self, '--Frame ' + name + '--')
  32.         # XXX Should use current function name
  33.         self.initeditor()
  34.         self.displaylist = ['>>>', '', '-'*WIDTH]
  35.         self.refreshframe()
  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.     
  64.     def mouse_down(self, detail):
  65.         (h, v), clicks, button, mask = detail
  66.         if clicks != 2:
  67.             return
  68.         i = v / stdwin.lineheight()
  69.         if 5 <= i < len(self.displaylist):
  70.             import string
  71.             name = string.splitfields(self.displaylist[i],' = ')[0]
  72.             if not self.dict.has_key(name):
  73.                 stdwin.fleep()
  74.                 return
  75.             value = self.dict[name]
  76.             if not hasattr(value, '__dict__'):
  77.                 stdwin.fleep()
  78.                 return
  79.             name = 'instance ' + `value`
  80.             if self.debugger.framewindows.has_key(name):
  81.                 self.debugger.framewindows[name].popup()
  82.             else:
  83.                 self.debugger.framewindows[name] = \
  84.                       FrameWindow(self.debugger,
  85.                           self.frame, value.__dict__,
  86.                           name)
  87.             return
  88.         stdwin.fleep()
  89.  
  90.     def re_eval(self):
  91.         import string, repr
  92.         expr = string.strip(self.editor.gettext())
  93.         if expr == '':
  94.             output = ''
  95.         else:
  96.             globals = self.frame.f_globals
  97.             globals['__privileged__'] = 1
  98.             locals = self.dict
  99.             try:
  100.                 value = eval(expr, globals, locals)
  101.                 output = repr.repr(value)
  102.             except:
  103.                 output = sys.exc_type + ': ' + `sys.exc_value`
  104.         self.displaylist[1] = output
  105.         lh = stdwin.lineheight()
  106.         r = (-10, 0), (30000, 2*lh)
  107.         self.win.change(r)
  108.         self.editor.setfocus(0, len(expr))
  109.     
  110.     def draw(self, detail):
  111.         (left, top), (right, bottom) = detail
  112.         dummy = self.editor.draw(detail)
  113.         d = self.win.begindrawing()
  114.         try:
  115.             lh = d.lineheight()
  116.             h, v = 0, 0
  117.             for line in self.displaylist:
  118.                 if v+lh > top and v < bottom:
  119.                     d.text((h, v), line)
  120.                 v = v + lh
  121.         finally:
  122.             d.close()
  123.     
  124.     def refreshframe(self):
  125.         import repr
  126.         del self.displaylist[3:]
  127.         self.re_eval()
  128.         names = self.dict.keys()
  129.         for key, label in ('__args__', 'Args: '), \
  130.                   ('__return__', 'Return: '):
  131.             if self.dict.has_key(key):
  132.                 names.remove(key)
  133.                 value = self.dict[key]
  134.                 label = label + repr.repr(value)
  135.             self.displaylist.append(label)
  136.         names.sort()
  137.         for name in names:
  138.             value = self.dict[name]
  139.             line = name + ' = ' + repr.repr(value)
  140.             self.displaylist.append(line)
  141.         self.win.setdocsize(0, \
  142.             stdwin.lineheight() * len(self.displaylist))
  143.         self.refreshall() # XXX Be more subtle later
  144.