"""StandardFile compatability module: implement macfs StandardFile
API calls with Navigation Services"""
import macfs
import struct
from Carbon import Res
try:
	import Nav
except ImportError:
	Nav = None

_curfolder = None
_movablemodal = 1

def _mktypelist(typelist):
	if not typelist:
		return None
	data = 'Pyth' + struct.pack("hh", 0, len(typelist))
	for type in typelist:
		data = data+type
	return Res.Handle(data)
	
def _StandardGetFile(*typelist):
	return apply(_PromptGetFile, (None,)+typelist)
	
def _PromptGetFile(prompt, *typelist):
	args = {}
	flags = 0x56
	typehandle = _mktypelist(typelist)
	if typehandle:
		args['typeList'] = typehandle
	else:
		flags = flags | 0x01
	if prompt:
		args['message'] = prompt
	args['preferenceKey'] = 'PyMC'
	if _movablemodal:
		args['eventProc'] = None
	args['dialogOptionFlags'] = flags
	_handleSetFolder(args)
	try:
		rr = Nav.NavChooseFile(args)
		good = 1
	except Nav.error, arg:
		if arg[0] != -128: # userCancelledErr
			raise Nav.error, arg
		good = 0
		fss = macfs.FSSpec(':cancelled')
	else:
		fss = rr.selection[0]
##	if typehandle:
##		typehandle.DisposeHandle()
	return fss, good

def _StandardPutFile(prompt, default=None):
	args = {}
	flags = 0x07
	if prompt:
		args['message'] = prompt
	args['preferenceKey'] = 'PyMC'
	if _movablemodal:
		args['eventProc'] = None
	if default:
		args['savedFileName'] = default
	args['dialogOptionFlags'] = flags
	_handleSetFolder(args)
	try:
		rr = Nav.NavPutFile(args)
		good = 1
	except Nav.error, arg:
		if arg[0] != -128: # userCancelledErr
			raise Nav.error, arg
		good = 0
		fss = macfs.FSSpec(':cancelled')
	else:
		fss = rr.selection[0]
	return fss, good
	
def _SetFolder(folder):
	global _curfolder
	if _curfolder:
		rv = _curfolder
	else:
		rv = None
	_curfolder = macfs.FSSpec(folder)
	return rv
	
def _handleSetFolder(args):
	global _curfolder
	if not _curfolder:
		return
	import aepack
	fss = macfs.FSSpec(_curfolder)
	aedesc = aepack.pack(fss)
	args['defaultLocation'] = aedesc
	_curfolder = None
	
def _GetDirectory(prompt=None):
	args = {}
	flags = 0x17
	if prompt:
		args['message'] = prompt
	args['preferenceKey'] = 'PyMC'
	if _movablemodal:
		args['eventProc'] = None
	args['dialogOptionFlags'] = flags
	_handleSetFolder(args)
	try:
		rr = Nav.NavChooseFolder(args)
		good = 1
	except Nav.error, arg:
		if arg[0] != -128: # userCancelledErr
			raise Nav.error, arg
		good = 0
		fss = macfs.FSSpec(':cancelled')
	else:
		fss = rr.selection[0]
	return fss, good
	
def _install():
	macfs.StandardGetFile = StandardGetFile
	macfs.PromptGetFile = PromptGetFile
	macfs.StandardPutFile = StandardPutFile
	macfs.SetFolder = SetFolder
	macfs.GetDirectory = GetDirectory
	
if Nav and Nav.NavServicesAvailable():
	StandardGetFile = _StandardGetFile
	PromptGetFile = _PromptGetFile
	StandardPutFile = _StandardPutFile
	SetFolder = _SetFolder
	GetDirectory = _GetDirectory
	_install()
else:
	from macfs import StandardGetFile, PromptGetFile, StandardPutFile, SetFolder, GetDirectory
	

if __name__ == '__main__':
	print 'Testing StandardGetFile'
	fss, ok = StandardGetFile()
	print '->', fss, ok
	print 'Testing StandardGetFile("TEXT")'
	fss, ok = StandardGetFile("TEXT")
	print '->', fss, ok
	print 'Testing PromptGetFile'
	fss, ok = PromptGetFile("prompt")
	print '->', fss, ok
	print 'Testing StandardPutFile("the prompt", "default")'
	fss, ok = StandardPutFile("the prompt", "default")
	print '->', fss, ok
	print 'Testing GetDirectory("another prompt")'
	fss, ok = GetDirectory("Another prompt")
	print '->', fss, ok
	import sys
	sys.exit(1)
	
