Bump version number to 2.4.2 to pick up the latest minor bug fixes.
[python/dscho.git] / Mac / Lib / macfsn.py
blob8f3203ca900296129032222eec454307aa999d12
1 """StandardFile compatability module: implement macfs StandardFile
2 API calls with Navigation Services"""
3 import macfs
4 import struct
5 from Carbon import Res
6 try:
7 import Nav
8 except ImportError:
9 Nav = None
11 _curfolder = None
12 _movablemodal = 1
14 def _mktypelist(typelist):
15 # Workaround for OSX typeless files:
16 if 'TEXT' in typelist and not '\0\0\0\0' in typelist:
17 typelist = typelist + ('\0\0\0\0',)
18 if not typelist:
19 return None
20 data = 'Pyth' + struct.pack("hh", 0, len(typelist))
21 for type in typelist:
22 data = data+type
23 return Res.Handle(data)
25 def _StandardGetFile(*typelist):
26 return apply(_PromptGetFile, (None,)+typelist)
28 def _PromptGetFile(prompt, *typelist):
29 args = {}
30 flags = 0x56
31 typehandle = _mktypelist(typelist)
32 if typehandle:
33 args['typeList'] = typehandle
34 else:
35 flags = flags | 0x01
36 if prompt:
37 args['message'] = prompt
38 args['preferenceKey'] = 'PyMC'
39 if _movablemodal:
40 args['eventProc'] = None
41 args['dialogOptionFlags'] = flags
42 _handleSetFolder(args)
43 try:
44 rr = Nav.NavChooseFile(args)
45 good = 1
46 except Nav.error, arg:
47 if arg[0] != -128: # userCancelledErr
48 raise Nav.error, arg
49 good = 0
50 fss = None
51 else:
52 if rr.selection:
53 fss = rr.selection[0]
54 else:
55 fss = None
56 good = 0
57 ## if typehandle:
58 ## typehandle.DisposeHandle()
59 return fss, good
61 def _StandardPutFile(prompt, default=None):
62 args = {}
63 flags = 0x07
64 if prompt:
65 args['message'] = prompt
66 args['preferenceKey'] = 'PyMC'
67 if _movablemodal:
68 args['eventProc'] = None
69 if default:
70 args['savedFileName'] = default
71 args['dialogOptionFlags'] = flags
72 _handleSetFolder(args)
73 try:
74 rr = Nav.NavPutFile(args)
75 good = 1
76 except Nav.error, arg:
77 if arg[0] != -128: # userCancelledErr
78 raise Nav.error, arg
79 good = 0
80 fss = None
81 else:
82 fss = rr.selection[0]
83 return fss, good
85 def _SetFolder(folder):
86 global _curfolder
87 if _curfolder:
88 rv = _curfolder
89 else:
90 rv = None
91 _curfolder = macfs.FSSpec(folder)
92 return rv
94 def _handleSetFolder(args):
95 global _curfolder
96 if not _curfolder:
97 return
98 import aepack
99 fss = macfs.FSSpec(_curfolder)
100 aedesc = aepack.pack(fss)
101 args['defaultLocation'] = aedesc
102 _curfolder = None
104 def _GetDirectory(prompt=None):
105 args = {}
106 flags = 0x17
107 if prompt:
108 args['message'] = prompt
109 args['preferenceKey'] = 'PyMC'
110 if _movablemodal:
111 args['eventProc'] = None
112 args['dialogOptionFlags'] = flags
113 _handleSetFolder(args)
114 try:
115 rr = Nav.NavChooseFolder(args)
116 good = 1
117 except Nav.error, arg:
118 if arg[0] != -128: # userCancelledErr
119 raise Nav.error, arg
120 good = 0
121 fss = None
122 else:
123 fss = rr.selection[0]
124 return fss, good
126 def _install():
127 macfs.StandardGetFile = StandardGetFile
128 macfs.PromptGetFile = PromptGetFile
129 macfs.StandardPutFile = StandardPutFile
130 macfs.SetFolder = SetFolder
131 macfs.GetDirectory = GetDirectory
133 if Nav and Nav.NavServicesAvailable():
134 StandardGetFile = _StandardGetFile
135 PromptGetFile = _PromptGetFile
136 StandardPutFile = _StandardPutFile
137 SetFolder = _SetFolder
138 GetDirectory = _GetDirectory
139 _install()
140 else:
141 from macfs import StandardGetFile, PromptGetFile, StandardPutFile, SetFolder, GetDirectory
144 if __name__ == '__main__':
145 print 'Testing StandardGetFile'
146 fss, ok = StandardGetFile()
147 print '->', fss, ok
148 print 'Testing StandardGetFile("TEXT")'
149 fss, ok = StandardGetFile("TEXT")
150 print '->', fss, ok
151 print 'Testing PromptGetFile'
152 fss, ok = PromptGetFile("prompt")
153 print '->', fss, ok
154 print 'Testing StandardPutFile("the prompt", "default")'
155 fss, ok = StandardPutFile("the prompt", "default")
156 print '->', fss, ok
157 print 'Testing GetDirectory("another prompt")'
158 fss, ok = GetDirectory("Another prompt")
159 print '->', fss, ok
160 import sys
161 sys.exit(1)