2000-08-14 22:13:23 -03:00
|
|
|
from Tkinter import *
|
Merged revisions 56443-56466 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk
................
r56454 | kurt.kaiser | 2007-07-18 22:26:14 -0700 (Wed, 18 Jul 2007) | 2 lines
Make relative imports explicit for py3k
................
r56455 | kurt.kaiser | 2007-07-18 23:12:15 -0700 (Wed, 18 Jul 2007) | 2 lines
Was modifying dict during iteration.
................
r56457 | guido.van.rossum | 2007-07-19 07:33:19 -0700 (Thu, 19 Jul 2007) | 2 lines
Fix failing test.
................
r56466 | guido.van.rossum | 2007-07-19 20:58:16 -0700 (Thu, 19 Jul 2007) | 35 lines
Merged revisions 56413-56465 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r56439 | georg.brandl | 2007-07-17 23:37:55 -0700 (Tue, 17 Jul 2007) | 2 lines
Use "Unix" as platform name, not "UNIX".
........
r56441 | guido.van.rossum | 2007-07-18 10:19:14 -0700 (Wed, 18 Jul 2007) | 3 lines
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
(Slightly tweaked for style and refcounts.)
........
r56444 | kurt.kaiser | 2007-07-18 12:58:42 -0700 (Wed, 18 Jul 2007) | 2 lines
Fix failing unicode test caused by change to ast.c at r56441
........
r56451 | georg.brandl | 2007-07-18 15:36:53 -0700 (Wed, 18 Jul 2007) | 2 lines
Add description for wave.setcomptype() values
........
r56456 | walter.doerwald | 2007-07-19 06:04:38 -0700 (Thu, 19 Jul 2007) | 3 lines
Document that codecs.lookup() returns a CodecInfo object.
(fixes SF bug #1754453).
........
r56463 | facundo.batista | 2007-07-19 16:57:38 -0700 (Thu, 19 Jul 2007) | 6 lines
Added a select.select call in the test server loop to make sure the
socket is ready to be read from before attempting a read (this
prevents an error 10035 on some Windows platforms). [GSoC - Alan
McIntyre]
........
................
2007-07-20 01:05:57 -03:00
|
|
|
from .EditorWindow import EditorWindow
|
2000-08-14 22:13:23 -03:00
|
|
|
import re
|
|
|
|
import tkMessageBox
|
Merged revisions 56443-56466 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk
................
r56454 | kurt.kaiser | 2007-07-18 22:26:14 -0700 (Wed, 18 Jul 2007) | 2 lines
Make relative imports explicit for py3k
................
r56455 | kurt.kaiser | 2007-07-18 23:12:15 -0700 (Wed, 18 Jul 2007) | 2 lines
Was modifying dict during iteration.
................
r56457 | guido.van.rossum | 2007-07-19 07:33:19 -0700 (Thu, 19 Jul 2007) | 2 lines
Fix failing test.
................
r56466 | guido.van.rossum | 2007-07-19 20:58:16 -0700 (Thu, 19 Jul 2007) | 35 lines
Merged revisions 56413-56465 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r56439 | georg.brandl | 2007-07-17 23:37:55 -0700 (Tue, 17 Jul 2007) | 2 lines
Use "Unix" as platform name, not "UNIX".
........
r56441 | guido.van.rossum | 2007-07-18 10:19:14 -0700 (Wed, 18 Jul 2007) | 3 lines
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
(Slightly tweaked for style and refcounts.)
........
r56444 | kurt.kaiser | 2007-07-18 12:58:42 -0700 (Wed, 18 Jul 2007) | 2 lines
Fix failing unicode test caused by change to ast.c at r56441
........
r56451 | georg.brandl | 2007-07-18 15:36:53 -0700 (Wed, 18 Jul 2007) | 2 lines
Add description for wave.setcomptype() values
........
r56456 | walter.doerwald | 2007-07-19 06:04:38 -0700 (Thu, 19 Jul 2007) | 3 lines
Document that codecs.lookup() returns a CodecInfo object.
(fixes SF bug #1754453).
........
r56463 | facundo.batista | 2007-07-19 16:57:38 -0700 (Thu, 19 Jul 2007) | 6 lines
Added a select.select call in the test server loop to make sure the
socket is ready to be read from before attempting a read (this
prevents an error 10035 on some Windows platforms). [GSoC - Alan
McIntyre]
........
................
2007-07-20 01:05:57 -03:00
|
|
|
from . import IOBinding
|
2000-08-14 22:13:23 -03:00
|
|
|
|
2002-06-12 00:28:57 -03:00
|
|
|
class OutputWindow(EditorWindow):
|
2000-08-14 22:13:23 -03:00
|
|
|
|
2002-06-12 00:28:57 -03:00
|
|
|
"""An editor window that can serve as an output file.
|
2000-08-14 22:13:23 -03:00
|
|
|
|
2002-06-12 00:28:57 -03:00
|
|
|
Also the future base class for the Python shell window.
|
|
|
|
This class has no input facilities.
|
2000-08-14 22:13:23 -03:00
|
|
|
"""
|
|
|
|
|
2002-06-12 00:28:57 -03:00
|
|
|
def __init__(self, *args):
|
2003-07-09 15:48:24 -03:00
|
|
|
EditorWindow.__init__(self, *args)
|
2000-08-14 22:13:23 -03:00
|
|
|
self.text.bind("<<goto-file-line>>", self.goto_file_line)
|
|
|
|
|
|
|
|
# Customize EditorWindow
|
|
|
|
|
|
|
|
def ispythonsource(self, filename):
|
|
|
|
# No colorization needed
|
|
|
|
return 0
|
|
|
|
|
|
|
|
def short_title(self):
|
|
|
|
return "Output"
|
|
|
|
|
|
|
|
def maybesave(self):
|
|
|
|
# Override base class method -- don't ask any questions
|
|
|
|
if self.get_saved():
|
|
|
|
return "yes"
|
|
|
|
else:
|
|
|
|
return "no"
|
|
|
|
|
|
|
|
# Act as output file
|
|
|
|
|
2002-06-12 00:28:57 -03:00
|
|
|
def write(self, s, tags=(), mark="insert"):
|
2003-06-15 14:49:59 -03:00
|
|
|
# Tk assumes that byte strings are Latin-1;
|
|
|
|
# we assume that they are in the locale's encoding
|
|
|
|
if isinstance(s, str):
|
|
|
|
try:
|
2007-05-02 16:09:54 -03:00
|
|
|
s = str(s, IOBinding.encoding)
|
2003-06-15 14:49:59 -03:00
|
|
|
except UnicodeError:
|
|
|
|
# some other encoding; let Tcl deal with it
|
|
|
|
pass
|
2002-09-02 18:29:40 -03:00
|
|
|
self.text.insert(mark, s, tags)
|
2000-08-14 22:13:23 -03:00
|
|
|
self.text.see(mark)
|
|
|
|
self.text.update()
|
|
|
|
|
|
|
|
def writelines(self, l):
|
|
|
|
map(self.write, l)
|
|
|
|
|
|
|
|
def flush(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
# Our own right-button menu
|
|
|
|
|
|
|
|
rmenu_specs = [
|
|
|
|
("Go to file/line", "<<goto-file-line>>"),
|
|
|
|
]
|
|
|
|
|
|
|
|
file_line_pats = [
|
|
|
|
r'file "([^"]*)", line (\d+)',
|
|
|
|
r'([^\s]+)\((\d+)\)',
|
|
|
|
r'([^\s]+):\s*(\d+):',
|
|
|
|
]
|
|
|
|
|
|
|
|
file_line_progs = None
|
|
|
|
|
|
|
|
def goto_file_line(self, event=None):
|
|
|
|
if self.file_line_progs is None:
|
|
|
|
l = []
|
|
|
|
for pat in self.file_line_pats:
|
|
|
|
l.append(re.compile(pat, re.IGNORECASE))
|
|
|
|
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")
|
|
|
|
result = self._file_line_helper(line)
|
|
|
|
if not result:
|
|
|
|
# Try the previous line. This is handy e.g. in tracebacks,
|
|
|
|
# where you tend to right-click on the displayed source line
|
|
|
|
line = self.text.get("insert -1line linestart",
|
|
|
|
"insert -1line lineend")
|
|
|
|
result = self._file_line_helper(line)
|
|
|
|
if not result:
|
|
|
|
tkMessageBox.showerror(
|
|
|
|
"No special line",
|
|
|
|
"The line you point at doesn't look like "
|
|
|
|
"a valid file name followed by a line number.",
|
|
|
|
master=self.text)
|
|
|
|
return
|
|
|
|
filename, lineno = result
|
2002-06-12 00:28:57 -03:00
|
|
|
edit = self.flist.open(filename)
|
2000-08-14 22:13:23 -03:00
|
|
|
edit.gotoline(lineno)
|
|
|
|
|
|
|
|
def _file_line_helper(self, line):
|
|
|
|
for prog in self.file_line_progs:
|
|
|
|
m = prog.search(line)
|
|
|
|
if m:
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
return None
|
|
|
|
filename, lineno = m.group(1, 2)
|
2002-06-12 00:28:57 -03:00
|
|
|
try:
|
|
|
|
f = open(filename, "r")
|
|
|
|
f.close()
|
|
|
|
except IOError:
|
|
|
|
return None
|
2000-08-14 22:13:23 -03:00
|
|
|
try:
|
|
|
|
return filename, int(lineno)
|
|
|
|
except TypeError:
|
|
|
|
return None
|
|
|
|
|
2002-06-12 00:28:57 -03:00
|
|
|
# These classes are currently not used but might come in handy
|
2000-08-14 22:13:23 -03:00
|
|
|
|
|
|
|
class OnDemandOutputWindow:
|
|
|
|
|
|
|
|
tagdefs = {
|
|
|
|
# XXX Should use IdlePrefs.ColorPrefs
|
|
|
|
"stdout": {"foreground": "blue"},
|
2002-06-12 00:28:57 -03:00
|
|
|
"stderr": {"foreground": "#007700"},
|
|
|
|
}
|
|
|
|
|
2000-08-14 22:13:23 -03:00
|
|
|
def __init__(self, flist):
|
|
|
|
self.flist = flist
|
|
|
|
self.owin = None
|
2002-06-12 00:28:57 -03:00
|
|
|
|
|
|
|
def write(self, s, tags, mark):
|
|
|
|
if not self.owin:
|
2000-08-14 22:13:23 -03:00
|
|
|
self.setup()
|
|
|
|
self.owin.write(s, tags, mark)
|
|
|
|
|
|
|
|
def setup(self):
|
2002-06-12 00:28:57 -03:00
|
|
|
self.owin = owin = OutputWindow(self.flist)
|
2000-08-14 22:13:23 -03:00
|
|
|
text = owin.text
|
|
|
|
for tag, cnf in self.tagdefs.items():
|
|
|
|
if cnf:
|
2003-07-09 15:48:24 -03:00
|
|
|
text.tag_configure(tag, **cnf)
|
2000-08-14 22:13:23 -03:00
|
|
|
text.tag_raise('sel')
|
2002-06-12 00:28:57 -03:00
|
|
|
self.write = self.owin.write
|
|
|
|
|
|
|
|
#class PseudoFile:
|
|
|
|
#
|
|
|
|
# def __init__(self, owin, tags, mark="end"):
|
|
|
|
# self.owin = owin
|
|
|
|
# self.tags = tags
|
|
|
|
# self.mark = mark
|
|
|
|
|
|
|
|
# def write(self, s):
|
|
|
|
# self.owin.write(s, self.tags, self.mark)
|
|
|
|
|
|
|
|
# def writelines(self, l):
|
|
|
|
# map(self.write, l)
|
|
|
|
|
|
|
|
# def flush(self):
|
|
|
|
# pass
|