from Tkinter import * from ScrolledText import * from ui_helpers import * from ui_config import config import Shells, Menu, StringIO, helpers, spawn, os, tempfile class ComposeWindow(Shells.NonModal): def __init__(self, master, msg, feedback): Shells.NonModal.__init__(self, master) self.msg = msg self.feedback = feedback self.top.title("Slime Composition Window") self.top.iconname("Slime Composition Window") menubar = Menu.Menubar(self.top) Menu.Pulldown(menubar, "Menu", ["Use external editor", self.use_external], ["Save", self.save_msg], ["Postpone", self.postpone_msg], ["Send", self.send_msg], ["Abort", self.abort_msg]) buttonbar = Frame(self.top) buttonbar.pack(fill=X) CommandButton(buttonbar, "Send", self.send_msg) self.textwin = ScrolledText(self.top) self.textwin.pack(expand=YES, fill=BOTH) self.textwin.focus_set() self.textwin.config(background="white") self.textwin.config(font=config["normal-font"]) self.textwin.insert('0.0', self.msg.getfulltext()) self.textwin.mark_set('insert', '0.0') def use_external(self): name = config["external-editor"] if not name: return self.save_msg() tempname = tempfile.mktemp() text = self.textwin.get('0.0', 'end') helpers.write_text_to_named_file(tempname, text) self.top.iconify() exit_code, stdout, stderr = \ spawn.run(name, stdin='', args=[tempname], env=os.environ) self.top.deiconify() if exit_code != 0 or stderr != '': d = ErrorBox(self, "External editor failed", "The external editor failed:\n" + stderr) d.show() os.remove(tempname) return text = helpers.read_text_from_named_file(tempname) os.remove(tempname) self.textwin.delete('0.0', 'end') self.textwin.insert('0.0', text) self.textwin.mark_set('insert', '0.0') def save_msg(self): txt = self.textwin.get('0.0', 'end') txtfile = StringIO.StringIO(txt) self.msg.change_text(txtfile) self.feedback.refresh_draft_toc() def send_msg(self): d = YesNoDialog(self.top, "Send message?") if d.show(): self.save_msg() if self.feedback.send_msg(self.msg): self.terminate() def postpone_msg(self): self.save_msg() self.terminate() d = InfoBox(self.top, "Message postponed", "Message has been postponed.") d.show() def abort_msg(self): d = YesNoDialog(self.top, "Abort message?") if d.show(): self.msg.delete_self() self.save_msg() self.terminate() def deleteWindow(self): self.abort_msg() def show(self): Shells.NonModal.show(self) self.textwin.focus_set()