fancier version copies template file
diff --git a/Mac/mkapplet.py b/Mac/mkapplet.py
index d5cfba3..c6c7c6b 100644
--- a/Mac/mkapplet.py
+++ b/Mac/mkapplet.py
@@ -1,27 +1,28 @@
-"""Add a 'PYC ' resource named "__main__" to a resource file.
+"""Create an applet from a Python script.
 
-This first puts up a dialog asking for a Python source file ('TEXT'),
-then one asking for an existing destination file ('APPL' or 'rsrc').
-
-It compiles the Python source into a code object, marshals it into a string,
-prefixes the string with a .pyc header, and turns it into a resource,
-which is then written to the destination.
-
-If the destination already contains a resource with the same name and type,
-it is overwritten.
+This puts up a dialog asking for a Python source file ('TEXT').
+The output is a file with the same name but its ".py" suffix dropped.
+It is created by copying an applet template and then adding a 'PYC '
+resource named __main__ containing the compiled, marshalled script.
 """
 
+import sys
+import string
+import os
 import marshal
 import imp
 import macfs
+import MacOS
 from Res import *
 
 # .pyc file (and 'PYC ' resource magic number)
 MAGIC = imp.get_magic()
 
-# Complete specification of our resource
+# Template file (searched on sys.path)
+TEMPLATE = "PythonApplet"
+
+# Specification of our resource
 RESTYPE = 'PYC '
-RESID = 128
 RESNAME = '__main__'
 
 # OpenResFile mode parameters
@@ -30,36 +31,110 @@
 
 def main():
 	
+	# Find the template
+	# (there's no point in proceeding if we can't find it)
+	
+	for p in sys.path:
+		template = os.path.join(p, TEMPLATE)
+		try:
+			tmpl = open(template, "rb")
+			break
+		except IOError:
+			continue
+	else:
+		# XXX Ought to put up a dialog
+		print "Template not found.  Exit."
+		return
+	
 	# Ask for source text
 	
 	srcfss, ok = macfs.StandardGetFile('TEXT')
-	if not ok: return
+	if not ok:
+		tmpl.close()
+		return
+	filename = srcfss.as_pathname()
 	
 	# Read the source and compile it
-	# (there's no point asking for a destination if it has a syntax error)
+	# (there's no point overwriting the destination if it has a syntax error)
 	
-	filename = srcfss.as_pathname()
 	fp = open(filename)
 	text = fp.read()
 	fp.close()
-	code = compile(text, filename, "exec")
+	try:
+		code = compile(text, filename, "exec")
+	except (SyntaxError, EOFError):
+		print "Syntax error in script"
+		tmpl.close()
+		return
 	
-	# Ask for destination file
+	# Set the destination file name
 	
-	dstfss, ok = macfs.StandardGetFile('APPL', 'rsrc')
-	if not ok: return
+	if string.lower(filename[-3:]) == ".py":
+		destname = filename[:-3]
+	else:
+		destname = filename + ".applet"
 	
-	# Create the raw data for the resource from the code object
+	# Copy the data from the template (creating the file as well)
 	
-	data = marshal.dumps(code)
-	del code
-	data = (MAGIC + '\0\0\0\0') + data
+	dest = open(destname, "wb")
+	data = tmpl.read()
+	if data:
+		dest.write(data)
+	dest.close()
+	tmpl.close()
 	
-	# Open the resource file
+	# Copy the creator and type of the template to the destination
 	
-	fnum = FSpOpenResFile(dstfss.as_pathname(), WRITE)
+	ctor, type = MacOS.GetCreatorAndType(template)
+	MacOS.SetCreatorAndType(destname, ctor, type)
 	
-	# Delete any existing resource with name __main__ or number 128
+	# Open the input and output resource forks
+	
+	input = FSpOpenResFile(template, READ)
+	try:
+		output = FSpOpenResFile(destname, WRITE)
+	except MacOS.Error:
+		print "Creating resource fork..."
+		CreateResFile(destname)
+		output = FSpOpenResFile(destname, WRITE)
+	
+	# Copy the resources from the template,
+	# except a 'PYC ' resource named __main__
+	
+	UseResFile(input)
+	ntypes = Count1Types()
+	for itype in range(1, 1+ntypes):
+		type = Get1IndType(itype)
+		nresources = Count1Resources(type)
+		for ires in range(1, 1+nresources):
+			res = Get1IndResource(type, ires)
+			id, type, name = res.GetResInfo()
+			if (type, name) == (RESTYPE, RESNAME):
+				continue # Don't copy __main__ from template
+			size = res.SizeResource()
+			attrs = res.GetResAttrs()
+			print id, type, name, size, hex(attrs)
+			res.LoadResource()
+			res.DetachResource()
+			UseResFile(output)
+			try:
+				res2 = Get1Resource(type, id)
+			except MacOS.Error:
+				res2 = None
+			if res2:
+				print "Overwriting..."
+				res2.RmveResource()
+			res.AddResource(type, id, name)
+			#res.SetResAttrs(attrs)
+			res.WriteResource()
+			UseResFile(input)
+	CloseResFile(input)
+	
+	# Make sure we're manipulating the output resource file now
+	
+	UseResFile(output)
+	
+	# Delete any existing 'PYC 'resource named __main__
 	
 	try:
 		res = Get1NamedResource(RESTYPE, RESNAME)
@@ -67,23 +142,25 @@
 	except Error:
 		pass
 	
-	try:
-		res = Get1Resource(RESTYPE, RESID)
-		res.RmveResource()
-	except Error:
-		pass
+	# Create the raw data for the resource from the code object
+	
+	data = marshal.dumps(code)
+	del code
+	data = (MAGIC + '\0\0\0\0') + data
 	
 	# Create the resource and write it
 	
+	id = 0
+	while id < 128:
+		id = Unique1ID(RESTYPE)
 	res = Resource(data)
-	res.AddResource(RESTYPE, RESID, RESNAME)
-	# XXX Are the following two calls needed?
+	res.AddResource(RESTYPE, id, RESNAME)
 	res.WriteResource()
 	res.ReleaseResource()
 	
 	# Close the resource file
 	
-	CloseResFile(fnum)
+	CloseResFile(output)
 
 if __name__ == '__main__':
 	main()