# A more realistic GUI programming example

from Tkinter import *
from Dialog import Dialog
from FileDialog import LoadFileDialog
from ScrolledText import ScrolledText

class FilenameEntry(Frame):

	def __init__(self, master, text):
		Frame.__init__(self, master)
		Label(self, text=text).pack(side=LEFT)
		self.filename = StringVar()
		Entry(self, textvariable=self.filename).pack(side=LEFT, fill=X)
		Button(self, text="Browse...", command=self.browse).pack(side=RIGHT)

	def browse(self):
		file = LoadFileDialog(self).go(pattern='*')
		if file:
			self.filename.set(file)

	def get(self):
		return self.filename.get()

class ButtonBar(Frame):

	def __init__(self, master, left_button_list, right_button_list):
		Frame.__init__(self, master, bd=2, relief=SUNKEN)
		for button, action in left_button_list:
			Button(self, text=button, command=action).pack(side=LEFT)
		for button, action in right_button_list:
			Button(self, text=button, command=action).pack(side=RIGHT)

class FileNotFoundMessage(Dialog):

	def __init__(self, master, filename):
		Dialog.__init__(self, master, title = 'File not found',
			text = 'File ' + filename + ' does not exist',
			bitmap = 'warning', default = 0,
			strings = ('Cancel',))

class TextWindow(Frame):

	def __init__(self, master, text):
		Frame.__init__(self, master)
		text_field = ScrolledText(self)
		text_field.insert(At(0,0), text)
		text_field.pack(side=TOP)
		text_field.config(state=DISABLED)
		ButtonBar(self, [],
			[('Close', self.master.destroy)]).pack(side=BOTTOM, fill=X)

class MainWindow(Frame):

	def __init__(self, master):
		Frame.__init__(self, master)
		Label(self, text="Enter a filename and " +
			"select an action").pack(side=TOP)
		self.filename_field = FilenameEntry(self, "Filename: ")
		self.filename_field.pack(side=TOP, fill=X)
		ButtonBar(self, [('Show', self.show), ('Print', self.lpr)],
			[('Quit', self.quit)]).pack(side=BOTTOM, fill=X)

	def show(self):
		filename = self.filename_field.get()
		try:
			text = open(filename).read()
		except IOError:
			FileNotFoundMessage(self, filename)
		else:
			new_window = Toplevel()
			new_window.title(filename)
			TextWindow(new_window, text).pack()

	def lpr(self):
		filename = self.filename_field.get()
		import os
		os.system('lpr ' + '"' + filename + '"')

mw = MainWindow(None)
mw.pack()
mw.mainloop()
