7 class TraceList(W
.List
):
16 rect
= rect
[0]+1, rect
[1]+1, rect
[2]-16, rect
[3]-1
17 self
._list
= List
.LNew(rect
, (0, 0, 1, 0), (0, 28), self
.LDEF_ID
, self
._parentwindow
.wid
,
24 def __init__(self
, title
= "Traceback"):
25 app
= W
.getapplication() # checks if W is properly initialized
30 self
.lastwindowtitle
= ""
31 self
.bounds
= (360, 298)
33 def traceback(self
, start
= 0, lastwindowtitle
= ""):
35 self
.lastwindowtitle
= lastwindowtitle
37 self
.type, self
.value
, self
.tb
= sys
.exc_type
, sys
.exc_value
, sys
.exc_traceback
38 if self
.type is not SyntaxError:
40 if type(self
.type) == types
.ClassType
:
41 errortext
= self
.type.__name
__
43 errortext
= str(self
.type)
44 value
= str(self
.value
)
45 if self
.value
and value
:
46 errortext
= errortext
+ ": " + value
47 self
.w
.text
.set(errortext
)
49 self
.w
.list.set(self
.textlist
)
50 self
.w
.list.setselection([len(self
.textlist
) - 1])
51 self
.w
.wid
.SelectWindow()
58 def syntaxerror(self
):
60 value
, (filename
, lineno
, charno
, line
) = self
.value
65 if not filename
and self
.lastwindowtitle
:
66 filename
= self
.lastwindowtitle
68 filename
= "<unknown>"
69 if filename
and os
.path
.exists(filename
):
70 filename
= os
.path
.split(filename
)[1]
73 text
= value
+ '\rFile: "' + str(filename
) + '", line ' + str(lineno
) + '\r\r' + line
[:charno
] + "€" + line
[charno
:-1]
75 text
= value
+ '\rFile: "' + str(filename
) + '"'
76 self
.syntaxdialog
= W
.ModalDialog((360, 120), "Syntax Error")
77 self
.syntaxdialog
.text
= W
.TextBox((10, 10, -10, -40), text
)
78 self
.syntaxdialog
.cancel
= W
.Button((-190, -32, 80, 16), "Cancel", self
.syntaxclose
)
79 self
.syntaxdialog
.edit
= W
.Button((-100, -32, 80, 16), "Edit", self
.syntaxedit
)
80 self
.syntaxdialog
.setdefaultbutton(self
.syntaxdialog
.edit
)
81 self
.syntaxdialog
.bind("cmd.", self
.syntaxdialog
.cancel
.push
)
82 self
.syntaxdialog
.open()
84 def syntaxclose(self
):
85 self
.syntaxdialog
.close()
90 value
, (filename
, lineno
, charno
, line
) = self
.value
94 if not filename
and self
.lastwindowtitle
:
95 filename
= self
.lastwindowtitle
97 filename
= "<unknown>"
100 W
.getapplication().openscript(filename
, lineno
, charno
- 1)
102 W
.getapplication().openscript(filename
)
109 self
.w
.wid
.ShowWindow()
110 self
.w
.wid
.SelectWindow()
113 self
.bounds
= self
.w
.getbounds()
115 self
.type, self
.value
, self
.tb
= None, None, None
118 def activate(self
, onoff
):
125 def setupwidgets(self
):
126 self
.w
= W
.Window(self
.bounds
, self
.title
, minsize
= (316, 168))
127 self
.w
.text
= W
.TextBox((10, 10, -10, 30))
128 self
.w
.tbtitle
= W
.TextBox((10, 40, -10, 10), "Traceback (innermost last):")
129 self
.w
.list = TraceList((10, 60, -10, -40), callback
= self
.listhit
)
131 self
.w
.editbutton
= W
.Button((10, -30, 60, 16), "Edit", self
.edit
)
132 self
.w
.editbutton
.enable(0)
134 self
.w
.browselocalsbutton
= W
.Button((80, -30, 100, 16), "Browse localsŠ", self
.browselocals
)
135 self
.w
.browselocalsbutton
.enable(0)
137 self
.w
.postmortembutton
= W
.Button((190, -30, 100, 16), "Post mortemŠ", self
.postmortem
)
139 self
.w
.setdefaultbutton(self
.w
.editbutton
)
140 self
.w
.bind("cmdb", self
.w
.browselocalsbutton
.push
)
141 self
.w
.bind("<close>", self
.close
)
142 self
.w
.bind("<activate>", self
.activate
)
144 def buildtblist(self
):
146 for i
in range(self
.start
):
147 if tb
.tb_next
is None:
150 self
.tblist
= traceback
.extract_tb(tb
)
152 for filename
, lineno
, func
, line
in self
.tblist
:
154 if os
.path
.exists(filename
):
155 filename
= os
.path
.split(filename
)[1]
156 tbline
= 'File "' + filename
+ '", line ' + `lineno`
+ ', in ' + func
158 tbline
= 'File "' + filename
+ '", line ' + `lineno`
+ ', in ' + func
160 tbline
= tbline
+ '\r ' + line
161 self
.textlist
.append(tbline
[:255])
164 sel
= self
.w
.list.getselection()
166 filename
, lineno
, func
, line
= self
.tblist
[i
]
167 W
.getapplication().openscript(filename
, lineno
)
169 def browselocals(self
):
170 sel
= self
.w
.list.getselection()
173 for j
in range(i
+ self
.start
):
175 self
.browse(tb
.tb_frame
.f_locals
)
177 def browse(self
, object):
179 PyBrowser
.Browser(object)
181 def postmortem(self
):
183 PyDebugger
.postmortem(self
.type, self
.value
, self
.tb
)
185 def listhit(self
, isdbl
):
187 self
.w
.editbutton
.push()
191 def checkbuttons(self
):
192 havefile
= len(self
.w
.list.getselection()) > 0
193 self
.w
.editbutton
.enable(havefile
)
194 self
.w
.browselocalsbutton
.enable(havefile
)
195 self
.w
.setdefaultbutton(havefile
and self
.w
.editbutton
or self
.w
.postmortembutton
)