blob: 83d5771d7e0e3ad5d3a0b601937aa6208d46b3f1 [file] [log] [blame]
David Scherer7aced172000-08-15 01:13:23 +00001from Tkinter import *
Guido van Rossum36e0a922007-07-20 04:05:57 +00002from .EditorWindow import EditorWindow
David Scherer7aced172000-08-15 01:13:23 +00003import re
4import tkMessageBox
Guido van Rossum36e0a922007-07-20 04:05:57 +00005from . import IOBinding
David Scherer7aced172000-08-15 01:13:23 +00006
David Scherer7aced172000-08-15 01:13:23 +00007class OutputWindow(EditorWindow):
Kurt B. Kaiser969de452002-06-12 03:28:57 +00008
9 """An editor window that can serve as an output file.
10
11 Also the future base class for the Python shell window.
12 This class has no input facilities.
David Scherer7aced172000-08-15 01:13:23 +000013 """
14
Kurt B. Kaiser969de452002-06-12 03:28:57 +000015 def __init__(self, *args):
Raymond Hettinger931237e2003-07-09 18:48:24 +000016 EditorWindow.__init__(self, *args)
David Scherer7aced172000-08-15 01:13:23 +000017 self.text.bind("<<goto-file-line>>", self.goto_file_line)
David Scherer7aced172000-08-15 01:13:23 +000018
19 # Customize EditorWindow
20
21 def ispythonsource(self, filename):
22 # No colorization needed
23 return 0
24
25 def short_title(self):
26 return "Output"
27
David Scherer7aced172000-08-15 01:13:23 +000028 def maybesave(self):
29 # Override base class method -- don't ask any questions
30 if self.get_saved():
31 return "yes"
32 else:
33 return "no"
34
David Scherer7aced172000-08-15 01:13:23 +000035 # Act as output file
36
Kurt B. Kaiser969de452002-06-12 03:28:57 +000037 def write(self, s, tags=(), mark="insert"):
Martin v. Löwise83395e2007-08-13 06:02:38 +000038 assert isinstance(s, str), repr(s)
Kurt B. Kaiserd0116362002-09-02 21:29:40 +000039 self.text.insert(mark, s, tags)
David Scherer7aced172000-08-15 01:13:23 +000040 self.text.see(mark)
41 self.text.update()
42
Kurt B. Kaiser66aaf742007-08-09 18:00:23 +000043 def writelines(self, lines):
44 for line in lines:
45 self.write(line)
David Scherer7aced172000-08-15 01:13:23 +000046
47 def flush(self):
48 pass
49
50 # Our own right-button menu
51
52 rmenu_specs = [
53 ("Go to file/line", "<<goto-file-line>>"),
54 ]
55
56 file_line_pats = [
57 r'file "([^"]*)", line (\d+)',
58 r'([^\s]+)\((\d+)\)',
59 r'([^\s]+):\s*(\d+):',
60 ]
61
62 file_line_progs = None
63
64 def goto_file_line(self, event=None):
65 if self.file_line_progs is None:
66 l = []
67 for pat in self.file_line_pats:
68 l.append(re.compile(pat, re.IGNORECASE))
69 self.file_line_progs = l
70 # x, y = self.event.x, self.event.y
71 # self.text.mark_set("insert", "@%d,%d" % (x, y))
72 line = self.text.get("insert linestart", "insert lineend")
73 result = self._file_line_helper(line)
74 if not result:
75 # Try the previous line. This is handy e.g. in tracebacks,
76 # where you tend to right-click on the displayed source line
77 line = self.text.get("insert -1line linestart",
78 "insert -1line lineend")
79 result = self._file_line_helper(line)
80 if not result:
81 tkMessageBox.showerror(
82 "No special line",
83 "The line you point at doesn't look like "
84 "a valid file name followed by a line number.",
85 master=self.text)
86 return
87 filename, lineno = result
Kurt B. Kaiser969de452002-06-12 03:28:57 +000088 edit = self.flist.open(filename)
David Scherer7aced172000-08-15 01:13:23 +000089 edit.gotoline(lineno)
David Scherer7aced172000-08-15 01:13:23 +000090
91 def _file_line_helper(self, line):
92 for prog in self.file_line_progs:
93 m = prog.search(line)
94 if m:
95 break
96 else:
97 return None
98 filename, lineno = m.group(1, 2)
Kurt B. Kaiser969de452002-06-12 03:28:57 +000099 try:
100 f = open(filename, "r")
101 f.close()
102 except IOError:
103 return None
David Scherer7aced172000-08-15 01:13:23 +0000104 try:
105 return filename, int(lineno)
106 except TypeError:
107 return None
108
Kurt B. Kaiser969de452002-06-12 03:28:57 +0000109# These classes are currently not used but might come in handy
David Scherer7aced172000-08-15 01:13:23 +0000110
111class OnDemandOutputWindow:
David Scherer7aced172000-08-15 01:13:23 +0000112
113 tagdefs = {
114 # XXX Should use IdlePrefs.ColorPrefs
David Scherer7aced172000-08-15 01:13:23 +0000115 "stdout": {"foreground": "blue"},
Kurt B. Kaiser969de452002-06-12 03:28:57 +0000116 "stderr": {"foreground": "#007700"},
117 }
118
David Scherer7aced172000-08-15 01:13:23 +0000119 def __init__(self, flist):
120 self.flist = flist
121 self.owin = None
David Scherer7aced172000-08-15 01:13:23 +0000122
Kurt B. Kaiser969de452002-06-12 03:28:57 +0000123 def write(self, s, tags, mark):
124 if not self.owin:
David Scherer7aced172000-08-15 01:13:23 +0000125 self.setup()
126 self.owin.write(s, tags, mark)
127
David Scherer7aced172000-08-15 01:13:23 +0000128 def setup(self):
Kurt B. Kaiser969de452002-06-12 03:28:57 +0000129 self.owin = owin = OutputWindow(self.flist)
David Scherer7aced172000-08-15 01:13:23 +0000130 text = owin.text
David Scherer7aced172000-08-15 01:13:23 +0000131 for tag, cnf in self.tagdefs.items():
132 if cnf:
Raymond Hettinger931237e2003-07-09 18:48:24 +0000133 text.tag_configure(tag, **cnf)
David Scherer7aced172000-08-15 01:13:23 +0000134 text.tag_raise('sel')
Kurt B. Kaiser969de452002-06-12 03:28:57 +0000135 self.write = self.owin.write
136
137#class PseudoFile:
138#
139# def __init__(self, owin, tags, mark="end"):
140# self.owin = owin
141# self.tags = tags
142# self.mark = mark
143
144# def write(self, s):
145# self.owin.write(s, self.tags, self.mark)
146
147# def writelines(self, l):
148# map(self.write, l)
149
150# def flush(self):
151# pass