87 lines
2.4 KiB
Python
87 lines
2.4 KiB
Python
|
import sys
|
||
|
import re
|
||
|
|
||
|
from Tkinter import *
|
||
|
|
||
|
class PopupMenu:
|
||
|
|
||
|
def __init__(self, text, flist):
|
||
|
self.text = text
|
||
|
self.flist = flist
|
||
|
self.text.bind("<3>", self.right_menu_event)
|
||
|
|
||
|
rmenu = None
|
||
|
|
||
|
def right_menu_event(self, event):
|
||
|
if not self.rmenu:
|
||
|
self.make_menu()
|
||
|
rmenu = self.rmenu
|
||
|
self.event = event
|
||
|
iswin = sys.platform[:3] == 'win'
|
||
|
if iswin:
|
||
|
self.text.config(cursor="arrow")
|
||
|
rmenu.tk_popup(event.x_root, event.y_root)
|
||
|
if iswin:
|
||
|
self.text.config(cursor="ibeam")
|
||
|
|
||
|
def make_menu(self):
|
||
|
rmenu = Menu(self.text, tearoff=0)
|
||
|
rmenu.add_command(label="Go to line from traceback",
|
||
|
command=self.goto_traceback_line)
|
||
|
rmenu.add_command(label="Open stack viewer",
|
||
|
command=self.open_stack_viewer)
|
||
|
rmenu.add_command(label="Help", command=self.help)
|
||
|
self.rmenu = rmenu
|
||
|
|
||
|
file_line_pats = [
|
||
|
r'File "([^"]*)", line (\d+)',
|
||
|
r'([^\s]+)\((\d+)\)',
|
||
|
r'([^\s]+):\s*(\d+):',
|
||
|
]
|
||
|
|
||
|
file_line_progs = None
|
||
|
|
||
|
def goto_traceback_line(self):
|
||
|
if self.file_line_progs is None:
|
||
|
l = []
|
||
|
for pat in self.file_line_pats:
|
||
|
l.append(re.compile(pat))
|
||
|
self.file_line_progs = l
|
||
|
x, y = self.event.x, self.event.y
|
||
|
self.text.mark_set("insert", "@%d,%d" % (x, y))
|
||
|
line = self.text.get("insert linestart", "insert lineend")
|
||
|
for prog in self.file_line_progs:
|
||
|
m = prog.search(line)
|
||
|
if m:
|
||
|
break
|
||
|
else:
|
||
|
self.text.bell()
|
||
|
return
|
||
|
filename, lineno = m.group(1, 2)
|
||
|
try:
|
||
|
f = open(filename, "r")
|
||
|
f.close()
|
||
|
except IOError, msg:
|
||
|
self.text.bell()
|
||
|
return
|
||
|
edit = self.flist.open(filename)
|
||
|
try:
|
||
|
lineno = int(lineno)
|
||
|
except ValueError, msg:
|
||
|
self.text.bell()
|
||
|
return
|
||
|
edit.gotoline(lineno)
|
||
|
|
||
|
def open_stack_viewer(self):
|
||
|
try:
|
||
|
sys.last_traceback
|
||
|
except:
|
||
|
print "No stack trace yet"
|
||
|
return
|
||
|
from StackViewer import StackViewer
|
||
|
sv = StackViewer(self.text._root(), self.flist)
|
||
|
|
||
|
def help(self):
|
||
|
from HelpWindow import HelpWindow
|
||
|
HelpWindow()
|