summaryrefslogtreecommitdiffstats
path: root/Mac/Lib/macfsn.py
blob: c4969034af76a308b75ffef16cee237ff4aab02c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
"""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)