Guido van Rossum | 3b4ca0d | 1998-10-10 18:48:31 +0000 | [diff] [blame] | 1 | import sys |
| 2 | import re |
| 3 | |
| 4 | from Tkinter import * |
| 5 | |
| 6 | class 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 Rossum | 0737430 | 1998-10-19 02:20:30 +0000 | [diff] [blame] | 31 | #rmenu.add_command(label="Open stack viewer", |
| 32 | # command=self.open_stack_viewer) |
| 33 | #rmenu.add_command(label="Help", command=self.help) |
Guido van Rossum | 3b4ca0d | 1998-10-10 18:48:31 +0000 | [diff] [blame] | 34 | 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 Rossum | 92a67d7 | 1998-10-16 16:11:08 +0000 | [diff] [blame] | 81 | from StackViewer import StackBrowser |
| 82 | sv = StackBrowser(self.text._root(), self.flist) |
Guido van Rossum | 3b4ca0d | 1998-10-10 18:48:31 +0000 | [diff] [blame] | 83 | |
| 84 | def help(self): |
| 85 | from HelpWindow import HelpWindow |
Guido van Rossum | d020cf3 | 1998-10-12 20:55:43 +0000 | [diff] [blame] | 86 | HelpWindow(root=self.flist.root) |