"""Import a module while pretending its name is __main__. This
can be used to run scripts from the PackedLib resource file while pretending
they have been double-clicked."""

import imp
import sys
import os
import string
import Dlg
import macfs

DIALOG_ID = 512
OK = 1
CANCEL = 2
SCRIPTNAME=3
ARGV=4
STDIN_CONS=5
STDIN_FILE=6
STDOUT_CONS=7
STDOUT_FILE=8
WORKING_DIR=9
PAUSE=10

def import_as_main(name):
	fp, path, (suffix, mode, type) = imp.find_module(name)
	if type == imp.PY_SOURCE:
		imp.load_source('__main__', path, fp)
	elif type == imp.PY_COMPILED:
		imp.load_compiled('__main__', path, fp)
	elif type == imp.PY_RESOURCE:
		imp.load_resource('__main__', path)
		
def interact():
	d = Dlg.GetNewDialog(DIALOG_ID, -1)
	wdir = stdin = stdout = None
	pause = 0

	tp, in_c_h, rect = d.GetDialogItem(STDIN_CONS)
	tp, in_f_h, rect = d.GetDialogItem(STDIN_FILE)
	tp, out_c_h, rect = d.GetDialogItem(STDOUT_CONS)
	tp, out_f_h, rect = d.GetDialogItem(STDOUT_FILE)
	tp, pause_h, rect = d.GetDialogItem(PAUSE)
	in_c_h = in_c_h.as_Control()
	in_f_h = in_f_h.as_Control()
	out_c_h = out_c_h.as_Control()
	out_f_h = out_f_h.as_Control()
	pause_h = pause_h.as_Control()

	while 1:
		in_c_h.SetControlValue(not stdin)
		in_f_h.SetControlValue(not not stdin)
		out_c_h.SetControlValue(not stdout)
		out_f_h.SetControlValue(not not stdout)
		pause_h.SetControlValue(pause)
		
		n = Dlg.ModalDialog(None)
		if n == OK:
			break
		elif n == CANCEL:
			sys.exit(0)
		elif n == STDIN_CONS:
			stdin = None
		elif n == STDIN_FILE:
			fss, ok = macfs.StandardGetFile('TEXT')
			if ok:
				stdin = fss
		elif n == STDOUT_FILE:
			fss, ok = macfs.StandardPutFile('stdout:')
			if ok:
				stdout = fss
		elif n == WORKING_DIR:
			fss, ok = macfs.GetDirectory()
			if ok:
				wdir = fss
		elif n == PAUSE:
			pause = (not pause)
		
	tp, h, rect = d.GetDialogItem(SCRIPTNAME)
	name = Dlg.GetDialogItemText(h)
	tp, h, rect = d.GetDialogItem(ARGV)
	argv = Dlg.GetDialogItemText(h)
	return name, argv, stdin, stdout, wdir, pause
	
def main():
	curdir = os.getcwd()
	import Res
	try:
		Res.OpenResFile('RunLibScript.rsrc')
	except:
		pass # Assume we're an applet already
	name, argv, stdin, stdout, wdir, pause = interact()
	if not name:
		sys.exit(0)
	sys.argv = [name] + string.split(argv)
	if stdin:
		sys.stdin = open(stdin.as_pathname())
	if stdout:
		sys.stdout = open(stdout.as_pathname(), 'w')
	if wdir:
		os.chdir(wdir.as_pathname())
	else:
		os.chdir(curdir)

	import_as_main(name)

	if pause:
		sys.exit(1)
	
if __name__ == '__main__':
	main()
			
