diff options
Diffstat (limited to 'Lib/idlelib/OutputWindow.py')
-rw-r--r-- | Lib/idlelib/OutputWindow.py | 214 |
1 files changed, 45 insertions, 169 deletions
diff --git a/Lib/idlelib/OutputWindow.py b/Lib/idlelib/OutputWindow.py index ed6774b..212e382 100644 --- a/Lib/idlelib/OutputWindow.py +++ b/Lib/idlelib/OutputWindow.py @@ -1,64 +1,19 @@ -# changes by dscherer@cmu.edu -# - OutputWindow and OnDemandOutputWindow have been hastily -# extended to provide readline() support, an "iomark" separate -# from the "insert" cursor, and scrolling to clear the window. -# These changes are used by the ExecBinding module to provide -# standard input and output for user programs. Many of the new -# features are very similar to features of PyShell, which is a -# subclass of OutputWindow. Someone should make some sense of -# this. - from Tkinter import * from EditorWindow import EditorWindow import re import tkMessageBox -from UndoDelegator import UndoDelegator +class OutputWindow(EditorWindow): -class OutputUndoDelegator(UndoDelegator): - reading = 0 - # Forbid insert/delete before the I/O mark, in the blank lines after - # the output, or *anywhere* if we are not presently doing user input - def insert(self, index, chars, tags=None): - try: - if (self.delegate.compare(index, "<", "iomark") or - self.delegate.compare(index, ">", "endmark") or - (index!="iomark" and not self.reading)): - self.delegate.bell() - return - except TclError: - pass - UndoDelegator.insert(self, index, chars, tags) - def delete(self, index1, index2=None): - try: - if (self.delegate.compare(index1, "<", "iomark") or - self.delegate.compare(index1, ">", "endmark") or - (index2 and self.delegate.compare(index2, ">=", "endmark")) or - not self.reading): - self.delegate.bell() - return - except TclError: - pass - UndoDelegator.delete(self, index1, index2) + """An editor window that can serve as an output file. -class OutputWindow(EditorWindow): - """An editor window that can serve as an input and output file. - The input support has been rather hastily hacked in, and should - not be trusted. + Also the future base class for the Python shell window. + This class has no input facilities. """ - UndoDelegator = OutputUndoDelegator - source_window = None - - def __init__(self, *args, **keywords): - if keywords.has_key('source_window'): - self.source_window = keywords['source_window'] + def __init__(self, *args): apply(EditorWindow.__init__, (self,) + args) self.text.bind("<<goto-file-line>>", self.goto_file_line) - self.text.bind("<<newline-and-indent>>", self.enter_callback) - self.text.mark_set("iomark","1.0") - self.text.mark_gravity("iomark", LEFT) - self.text.mark_set("endmark","1.0") # Customize EditorWindow @@ -69,9 +24,6 @@ class OutputWindow(EditorWindow): def short_title(self): return "Output" - def long_title(self): - return "" - def maybesave(self): # Override base class method -- don't ask any questions if self.get_saved(): @@ -79,63 +31,10 @@ class OutputWindow(EditorWindow): else: return "no" - # Act as input file - incomplete - - def set_line_and_column(self, event=None): - index = self.text.index(INSERT) - if (self.text.compare(index, ">", "endmark")): - self.text.mark_set("insert", "endmark") - self.text.see("insert") - EditorWindow.set_line_and_column(self) - - reading = 0 - canceled = 0 - endoffile = 0 - - def readline(self): - save = self.reading - try: - self.reading = self.undo.reading = 1 - self.text.mark_set("insert", "iomark") - self.text.see("insert") - self.top.mainloop() - finally: - self.reading = self.undo.reading = save - line = self.text.get("input", "iomark") - if self.canceled: - self.canceled = 0 - raise KeyboardInterrupt - if self.endoffile: - self.endoffile = 0 - return "" - return line or '\n' - - def close(self): - self.interrupt() - return EditorWindow.close(self) - - def interrupt(self): - if self.reading: - self.endoffile = 1 - self.top.quit() - - def enter_callback(self, event): - if self.reading and self.text.compare("insert", ">=", "iomark"): - self.text.mark_set("input", "iomark") - self.text.mark_set("iomark", "insert") - self.write('\n',"iomark") - self.text.tag_add("stdin", "input", "iomark") - self.text.update_idletasks() - self.top.quit() # Break out of recursive mainloop() in raw_input() - - return "break" - # Act as output file - def write(self, s, tags=(), mark="iomark"): - self.text.mark_gravity(mark, RIGHT) - self.text.insert(mark, s, tags) - self.text.mark_gravity(mark, LEFT) + def write(self, s, tags=(), mark="insert"): + self.text.insert(mark, str(s), tags) self.text.see(mark) self.text.update() @@ -183,14 +82,8 @@ class OutputWindow(EditorWindow): master=self.text) return filename, lineno = result - edit = self.untitled(filename) or self.flist.open(filename) + edit = self.flist.open(filename) edit.gotoline(lineno) - edit.wakeup() - - def untitled(self, filename): - if filename!='Untitled' or not self.source_window or self.source_window.io.filename: - return None - return self.source_window def _file_line_helper(self, line): for prog in self.file_line_progs: @@ -200,80 +93,63 @@ class OutputWindow(EditorWindow): else: return None filename, lineno = m.group(1, 2) - if not self.untitled(filename): - try: - f = open(filename, "r") - f.close() - except IOError: - return None + try: + f = open(filename, "r") + f.close() + except IOError: + return None try: return filename, int(lineno) except TypeError: return None -# This classes now used by ExecBinding.py: +# These classes are currently not used but might come in handy class OnDemandOutputWindow: - source_window = None tagdefs = { # XXX Should use IdlePrefs.ColorPrefs - "stdin": {"foreground": "black"}, "stdout": {"foreground": "blue"}, - "stderr": {"foreground": "red"}, - } - + "stderr": {"foreground": "#007700"}, + } + def __init__(self, flist): self.flist = flist self.owin = None - self.title = "Output" - self.close_hook = None - self.old_close = None - - def owclose(self): - if self.close_hook: - self.close_hook() - if self.old_close: - self.old_close() - - def set_title(self, title): - self.title = title - if self.owin and self.owin.text: - self.owin.saved_change_hook() - - def write(self, s, tags=(), mark="iomark"): - if not self.owin or not self.owin.text: + + def write(self, s, tags, mark): + if not self.owin: self.setup() self.owin.write(s, tags, mark) - def readline(self): - if not self.owin or not self.owin.text: - self.setup() - return self.owin.readline() - - def scroll_clear(self): - if self.owin and self.owin.text: - lineno = self.owin.getlineno("endmark") - self.owin.text.mark_set("insert","endmark") - self.owin.text.yview(float(lineno)) - self.owin.wakeup() - def setup(self): - self.owin = owin = OutputWindow(self.flist, source_window = self.source_window) - owin.short_title = lambda self=self: self.title + self.owin = owin = OutputWindow(self.flist) text = owin.text - - self.old_close = owin.close_hook - owin.close_hook = self.owclose - - # xxx Bad hack: 50 blank lines at the bottom so that - # we can scroll the top of the window to the output - # cursor in scroll_clear(). There must be a better way... - owin.text.mark_gravity('endmark', LEFT) - owin.text.insert('iomark', '\n'*50) - owin.text.mark_gravity('endmark', RIGHT) - for tag, cnf in self.tagdefs.items(): if cnf: apply(text.tag_configure, (tag,), cnf) text.tag_raise('sel') + 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 + + + + + + + |