"""PythonSlave.py
An application that responds to three types of apple event: 
	'pyth'/'EXEC': 	execute direct parameter as Python
	'aevt', 'quit':	quit
	'aevt', 'odoc':	perform python scripts

Copyright © 1996, Just van Rossum, Letterror
"""

__version__ = "0.1.3"

import FrameWork
import sys
import traceback
import aetools
import string
from Carbon import AE
import EasyDialogs
import os
from Carbon import Qd
from types import *
from Carbon.Events import charCodeMask, cmdKey
import MacOS
from Carbon import Evt

def dummyfunc(): pass

modulefilename = dummyfunc.func_code.co_filename

def Interact(timeout = 50000000):			# timeout after 10 days...
	AE.AEInteractWithUser(timeout)


class PythonSlave(FrameWork.Application):
	def __init__(self):
		FrameWork.Application.__init__(self)
		AE.AEInstallEventHandler('pyth', 'EXEC', ExecHandler)
		AE.AEInstallEventHandler('aevt', 'quit', QuitHandler)
		AE.AEInstallEventHandler('aevt', 'odoc', OpenDocumentHandler)
	
	def makeusermenus(self):
		self.filemenu = m = FrameWork.Menu(self.menubar, "File")
		self._quititem = FrameWork.MenuItem(m, "Quit", "Q", self._quit)
	
	def do_kHighLevelEvent(self, event):
		(what, message, when, where, modifiers) = event
		try:
			AE.AEProcessAppleEvent(event)
		except AE.Error, detail:
			print "Apple Event was not handled, error:", detail
	
	def do_key(self, event):
		(what, message, when, where, modifiers) = event
		c = chr(message & charCodeMask)
		if modifiers & cmdKey and c == '.':
			return
		FrameWork.Application.do_key(self, event)
	
	def idle(self, event):
		Qd.InitCursor()
	
	def quit(self, *args):
		raise self
	
	def getabouttext(self):
		return "About PythonSlave"
	
	def do_about(self, id, item, window, event):
		EasyDialogs.Message("PythonSlave " + __version__ + "\rCopyright © 1996, Letterror, JvR")
	

def ExecHandler(theAppleEvent, theReply):
	parameters, args = aetools.unpackevent(theAppleEvent)
	if parameters.has_key('----'):
		if parameters.has_key('NAME'):
			print '--- executing "' + parameters['NAME'] + '" ---'
		else:
			print '--- executing "<unknown>" ---'
		stuff = parameters['----']
		MyExec(stuff + "\n")			# execute input
		print '--- done ---'
	return 0

def MyExec(stuff):
	stuff = string.splitfields(stuff, '\r')	# convert return chars
	stuff = string.joinfields(stuff, '\n')	# to newline chars
	Interact()
	saveyield = MacOS.EnableAppswitch(1)
	try:
		exec stuff in {}
	except:
		MacOS.EnableAppswitch(saveyield)
		traceback.print_exc()
	MacOS.EnableAppswitch(saveyield)

def OpenDocumentHandler(theAppleEvent, theReply):
	parameters, args = aetools.unpackevent(theAppleEvent)
	docs = parameters['----']
	if type(docs) <> ListType:
		docs = [docs]
	for doc in docs:
		fss, a = doc.Resolve()
		path = fss.as_pathname()
		if path <> modulefilename:
			MyExecFile(path)
	return 0

def MyExecFile(path):
	saveyield = MacOS.EnableAppswitch(1)
	savewd = os.getcwd()
	os.chdir(os.path.split(path)[0])
	print '--- Executing file "' + os.path.split(path)[1] + '"'
	try:
		execfile(path, {"__name__": "__main__"})
	except:
		traceback.print_exc()
		MacOS.EnableAppswitch(saveyield)
	MacOS.EnableAppswitch(saveyield)
	os.chdir(savewd)
	print "--- done ---"

def QuitHandler(theAppleEvent, theReply):
	slave.quit()
	return 0


slave = PythonSlave()
print "PythonSlave", __version__, "ready."
slave.mainloop()
