blob: edda3a3fa5e59dfebd82b7684236be74fe35de17 [file] [log] [blame]
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +00001import sys
2import re
3
4from Tkinter import *
5
6class PopupMenu:
7
8 def __init__(self, text, flist):
9 self.text = text
10 self.flist = flist
11 self.text.bind("<3>", self.right_menu_event)
12
13 rmenu = None
14
15 def right_menu_event(self, event):
16 if not self.rmenu:
17 self.make_menu()
18 rmenu = self.rmenu
19 self.event = event
20 iswin = sys.platform[:3] == 'win'
21 if iswin:
22 self.text.config(cursor="arrow")
23 rmenu.tk_popup(event.x_root, event.y_root)
24 if iswin:
25 self.text.config(cursor="ibeam")
26
27 def make_menu(self):
28 rmenu = Menu(self.text, tearoff=0)
29 rmenu.add_command(label="Go to line from traceback",
30 command=self.goto_traceback_line)
Guido van Rossum07374301998-10-19 02:20:30 +000031 #rmenu.add_command(label="Open stack viewer",
32 # command=self.open_stack_viewer)
33 #rmenu.add_command(label="Help", command=self.help)
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000034 self.rmenu = rmenu
35
36 file_line_pats = [
37 r'File "([^"]*)", line (\d+)',
38 r'([^\s]+)\((\d+)\)',
39 r'([^\s]+):\s*(\d+):',
40 ]
41
42 file_line_progs = None
43
44 def goto_traceback_line(self):
45 if self.file_line_progs is None:
46 l = []
47 for pat in self.file_line_pats:
48 l.append(re.compile(pat))
49 self.file_line_progs = l
50 x, y = self.event.x, self.event.y
51 self.text.mark_set("insert", "@%d,%d" % (x, y))
52 line = self.text.get("insert linestart", "insert lineend")
53 for prog in self.file_line_progs:
54 m = prog.search(line)
55 if m:
56 break
57 else:
58 self.text.bell()
59 return
60 filename, lineno = m.group(1, 2)
61 try:
62 f = open(filename, "r")
63 f.close()
64 except IOError, msg:
65 self.text.bell()
66 return
67 edit = self.flist.open(filename)
68 try:
69 lineno = int(lineno)
70 except ValueError, msg:
71 self.text.bell()
72 return
73 edit.gotoline(lineno)
74
75 def open_stack_viewer(self):
76 try:
77 sys.last_traceback
78 except:
79 print "No stack trace yet"
80 return
Guido van Rossum92a67d71998-10-16 16:11:08 +000081 from StackViewer import StackBrowser
82 sv = StackBrowser(self.text._root(), self.flist)
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +000083
84 def help(self):
85 from HelpWindow import HelpWindow
Guido van Rossumd020cf31998-10-12 20:55:43 +000086 HelpWindow(root=self.flist.root)