1 # wdbframewin.py -- frame window for wdb.py
4 # - display function name in window title
5 # - execute arbitrary statements instead of just evaluating expressions
6 # - allow setting variables by editing their values
10 from stdwinevents
import *
18 class FrameWindow(basewin
.BaseWindow
):
20 def __init__(self
, debugger
, frame
, dict, name
):
21 self
.debugger
= debugger
22 self
.frame
= frame
# Not used except for identity tests
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
34 self
.displaylist
= ['>>>', '', '-'*WIDTH
]
38 r
= (stdwin
.textwidth('>>> '), 0), (30000, stdwin
.lineheight())
39 self
.editor
= self
.win
.textcreate(r
)
41 def closeeditor(self
):
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
)
52 del self
.debugger
.framewindows
[self
.name
]
53 del self
.debugger
, self
.dict
55 basewin
.BaseWindow
.close(self
)
57 def command(self
, detail
):
58 if detail
== WC_RETURN
:
61 dummy
= self
.editor
.event(WE_COMMAND
, \
64 def mouse_down(self
, detail
):
65 (h
, v
), clicks
, button
, mask
= detail
68 i
= v
/ stdwin
.lineheight()
69 if 5 <= i
< len(self
.displaylist
):
71 name
= string
.splitfields(self
.displaylist
[i
],' = ')[0]
72 if not self
.dict.has_key(name
):
75 value
= self
.dict[name
]
76 if not hasattr(value
, '__dict__'):
79 name
= 'instance ' + `value`
80 if self
.debugger
.framewindows
.has_key(name
):
81 self
.debugger
.framewindows
[name
].popup()
83 self
.debugger
.framewindows
[name
] = \
84 FrameWindow(self
.debugger
,
85 self
.frame
, value
.__dict
__,
92 expr
= string
.strip(self
.editor
.gettext())
96 globals = self
.frame
.f_globals
97 globals['__privileged__'] = 1
100 value
= eval(expr
, globals, locals)
101 output
= repr.repr(value
)
103 if type(sys
.exc_type
) == type(''):
104 exc_type_name
= sys
.exc_type
105 else: exc_type_name
= sys
.exc_type
.__name
__
106 output
= exc_type_name
+ ': ' + `sys
.exc_value`
107 self
.displaylist
[1] = output
108 lh
= stdwin
.lineheight()
109 r
= (-10, 0), (30000, 2*lh
)
111 self
.editor
.setfocus(0, len(expr
))
113 def draw(self
, detail
):
114 (left
, top
), (right
, bottom
) = detail
115 dummy
= self
.editor
.draw(detail
)
116 d
= self
.win
.begindrawing()
120 for line
in self
.displaylist
:
121 if v
+lh
> top
and v
< bottom
:
127 def refreshframe(self
):
129 del self
.displaylist
[3:]
131 names
= self
.dict.keys()
132 for key
, label
in ('__args__', 'Args: '), \
133 ('__return__', 'Return: '):
134 if self
.dict.has_key(key
):
136 value
= self
.dict[key
]
137 label
= label
+ repr.repr(value
)
138 self
.displaylist
.append(label
)
141 value
= self
.dict[name
]
142 line
= name
+ ' = ' + repr.repr(value
)
143 self
.displaylist
.append(line
)
144 self
.win
.setdocsize(0, \
145 stdwin
.lineheight() * len(self
.displaylist
))
146 self
.refreshall() # XXX Be more subtle later