summaryrefslogtreecommitdiff
path: root/slime-0.11/ui_compose.py
blob: 1fd970b8797176f95e0ea669a199f042879c3aab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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()