blob: 0fd6bedc52090845c5cdbca32eba34c39d841aea [file] [log] [blame]
Jack Jansen7571f301995-07-29 13:48:41 +00001"""Edit the Python Preferences file."""
Jack Jansen7571f301995-07-29 13:48:41 +00002
3from Dlg import *
4from Events import *
5from Res import *
6import string
7import struct
8import macfs
9import MacOS
10import os
11import sys
12import Res # For Res.Error
13
14# resource IDs in our own resources (dialogs, etc)
15MESSAGE_ID = 256
16
Jack Jansen9062fa21995-08-14 12:21:12 +000017DIALOG_ID = 512
Jack Jansen7571f301995-07-29 13:48:41 +000018TEXT_ITEM = 1
19OK_ITEM = 2
20CANCEL_ITEM = 3
Jack Jansendb0bace1996-04-04 15:38:44 +000021DIR_ITEM = 4
22TITLE_ITEM = 5
Jack Jansen7571f301995-07-29 13:48:41 +000023
24# Resource IDs in the preferences file
25PATH_STRINGS_ID = 128
26DIRECTORY_ID = 128
Jack Jansendb0bace1996-04-04 15:38:44 +000027OPTIONS_ID = 128
Jack Jansen7571f301995-07-29 13:48:41 +000028
Jack Jansendb0bace1996-04-04 15:38:44 +000029# Override IDs (in the applet)
30OVERRIDE_PATH_STRINGS_ID = 129
31OVERRIDE_DIRECTORY_ID = 129
32OVERRIDE_OPTIONS_ID = 129
33
34READ = 1
Jack Jansen7571f301995-07-29 13:48:41 +000035WRITE = 2
36smAllScripts = -3
37kOnSystemDisk = 0x8000
38
39def restolist(data):
40 """Convert STR# resource data to a list of strings"""
41 if not data:
42 return []
43 num, = struct.unpack('h', data[:2])
44 data = data[2:]
45 rv = []
46 for i in range(num):
47 strlen = ord(data[0])
48 if strlen < 0: strlen = strlen + 256
49 str = data[1:strlen+1]
50 data = data[strlen+1:]
51 rv.append(str)
52 return rv
53
54def listtores(list):
55 """Convert a list of strings to STR# resource data"""
56 rv = struct.pack('h', len(list))
57 for str in list:
58 rv = rv + chr(len(str)) + str
59 return rv
60
61def message(str = "Hello, world!", id = MESSAGE_ID):
62 """Show a simple alert with a text message"""
63 d = GetNewDialog(id, -1)
64 print 'd=', d
65 tp, h, rect = d.GetDialogItem(2)
66 SetDialogItemText(h, str)
67 while 1:
68 n = ModalDialog(None)
69 if n == 1: break
70
Jack Jansendb0bace1996-04-04 15:38:44 +000071def interact(list, pythondir, title):
Jack Jansen7571f301995-07-29 13:48:41 +000072 """Let the user interact with the dialog"""
73 opythondir = pythondir
74 try:
75 # Try to go to the "correct" dir for GetDirectory
76 os.chdir(pythondir.as_pathname())
77 except os.error:
78 pass
79 d = GetNewDialog(DIALOG_ID, -1)
Jack Jansendb0bace1996-04-04 15:38:44 +000080 tp, h, rect = d.GetDialogItem(TITLE_ITEM)
81 SetDialogItemText(h, title)
82 tp, h, rect = d.GetDialogItem(TEXT_ITEM)
Jack Jansen7571f301995-07-29 13:48:41 +000083 SetDialogItemText(h, string.joinfields(list, '\r'))
Jack Jansendb0bace1996-04-04 15:38:44 +000084## d.SetDialogDefaultItem(OK_ITEM)
85 d.SetDialogCancelItem(CANCEL_ITEM)
Jack Jansen7571f301995-07-29 13:48:41 +000086 while 1:
87 n = ModalDialog(None)
88 if n == OK_ITEM:
89 break
90 if n == CANCEL_ITEM:
91 return None
Jack Jansendb0bace1996-04-04 15:38:44 +000092## if n == REVERT_ITEM:
93## return [], pythondir
Jack Jansen7571f301995-07-29 13:48:41 +000094 if n == DIR_ITEM:
Jack Jansen9062fa21995-08-14 12:21:12 +000095 fss, ok = macfs.GetDirectory('Select python home folder:')
Jack Jansen7571f301995-07-29 13:48:41 +000096 if ok:
97 pythondir = fss
98 tmp = string.splitfields(GetDialogItemText(h), '\r')
99 rv = []
100 for i in tmp:
101 if i:
102 rv.append(i)
103 return rv, pythondir
104
Jack Jansendb0bace1996-04-04 15:38:44 +0000105def getprefpath(id):
106 # Load the path and directory resources
Jack Jansen7571f301995-07-29 13:48:41 +0000107 try:
Jack Jansendb0bace1996-04-04 15:38:44 +0000108 sr = GetResource('STR#', id)
109 except (MacOS.Error, Res.Error):
110 return None, None
111 d = sr.data
112 l = restolist(d)
113 return l, sr
114
115def getprefdir(id):
116 try:
117 dr = GetResource('alis', id)
118 fss, fss_changed = macfs.RawAlias(dr.data).Resolve()
119 except (MacOS.Error, Res.Error):
120 return None, None, 1
121 return fss, dr, fss_changed
Jack Jansen7571f301995-07-29 13:48:41 +0000122
Jack Jansendb0bace1996-04-04 15:38:44 +0000123def openpreffile(rw):
Jack Jansen7571f301995-07-29 13:48:41 +0000124 # Find the preferences folder and our prefs file, create if needed.
125 vrefnum, dirid = macfs.FindFolder(kOnSystemDisk, 'pref', 0)
126 preff_fss = macfs.FSSpec((vrefnum, dirid, 'Python Preferences'))
127 try:
Jack Jansendb0bace1996-04-04 15:38:44 +0000128 preff_handle = FSpOpenResFile(preff_fss, rw)
Jack Jansen7571f301995-07-29 13:48:41 +0000129 except Res.Error:
130 # Create it
131 message('No preferences file, creating one...')
Jack Jansen532e3c21996-02-21 15:36:26 +0000132 FSpCreateResFile(preff_fss, 'Pyth', 'pref', smAllScripts)
Jack Jansendb0bace1996-04-04 15:38:44 +0000133 preff_handle = FSpOpenResFile(preff_fss, rw)
134 return preff_handle
135
136def openapplet(name):
137 fss = macfs.FSSpec(name)
Jack Jansen7571f301995-07-29 13:48:41 +0000138 try:
Jack Jansendb0bace1996-04-04 15:38:44 +0000139 app_handle = FSpOpenResFile(fss, WRITE)
140 except Res.Error:
141 message('File does not have a resource fork.')
142 sys.exit(0)
143 return app_handle
144
145
146def edit_preferences():
147 preff_handle = openpreffile(WRITE)
148
149 l, sr = getprefpath(PATH_STRINGS_ID)
150 if l == None:
Jack Jansen7571f301995-07-29 13:48:41 +0000151 message('Cannot find any sys.path resource! (Old python?)')
152 sys.exit(0)
Jack Jansendb0bace1996-04-04 15:38:44 +0000153
154 fss, dr, fss_changed = getprefdir(DIRECTORY_ID)
155 if fss == None:
Jack Jansen7571f301995-07-29 13:48:41 +0000156 fss = macfs.FSSpec(os.getcwd())
157 fss_changed = 1
158
159 # Let the user play away
Jack Jansendb0bace1996-04-04 15:38:44 +0000160 result = interact(l, fss, 'System-wide preferences')
Jack Jansen7571f301995-07-29 13:48:41 +0000161
162 # See what we have to update, and how
163 if result == None:
164 sys.exit(0)
165
166 pathlist, nfss = result
167 if nfss != fss:
168 fss_changed = 1
169
170 if fss_changed or pathlist != l:
171 if fss_changed:
172 alias = nfss.NewAlias()
173 if dr:
174 dr.data = alias.data
175 dr.ChangedResource()
176 else:
177 dr = Resource(alias.data)
178 dr.AddResource('alis', DIRECTORY_ID, '')
179
180 if pathlist != l:
181 if pathlist == []:
182 if sr.HomeResFile() == preff_handle:
183 sr.RemoveResource()
184 elif sr.HomeResFile() == preff_handle:
185 sr.data = listtores(pathlist)
186 sr.ChangedResource()
187 else:
188 sr = Resource(listtores(pathlist))
189 sr.AddResource('STR#', PATH_STRINGS_ID, '')
190
191 CloseResFile(preff_handle)
Jack Jansendb0bace1996-04-04 15:38:44 +0000192
193def edit_applet(name):
194 pref_handle = openpreffile(READ)
195 app_handle = openapplet(name)
196
197 notfound = ''
198 l, sr = getprefpath(OVERRIDE_PATH_STRINGS_ID)
199 if l == None:
200 notfound = 'path'
201
202 l, dummy = getprefpath(PATH_STRINGS_ID)
203 if l == None:
204 message('Cannot find any sys.path resource! (Old python?)')
205 sys.exit(0)
206
207 fss, dr, fss_changed = getprefdir(OVERRIDE_DIRECTORY_ID)
208 if fss == None:
209 if notfound:
210 notfound = notfound + ' and ' + 'directory'
211 else:
212 notfound = 'directory'
213 fss, dummy, dummy2 = getprefdir(DIRECTORY_ID)
214 if fss == None:
215 fss = macfs.FSSpec(os.getcwd())
216 fss_changed = 1
217
218 dummy = dummy2 = None # Discard them.
219
220 if notfound:
221 message('Warning: initial %s taken from system-wide defaults'%notfound)
222 # Let the user play away
223 result = interact(l, fss, name)
224
225 # See what we have to update, and how
226 if result == None:
227 sys.exit(0)
228
229 pathlist, nfss = result
230 if nfss != fss:
231 fss_changed = 1
232
233 if fss_changed or pathlist != l:
234 if fss_changed:
235 alias = nfss.NewAlias()
236 if dr:
237 dr.data = alias.data
238 dr.ChangedResource()
239 else:
240 dr = Resource(alias.data)
241 dr.AddResource('alis', OVERRIDE_DIRECTORY_ID, '')
242
243 if pathlist != l:
244 if pathlist == []:
245 if sr.HomeResFile() == app_handle:
246 sr.RemoveResource()
247 elif sr and sr.HomeResFile() == app_handle:
248 sr.data = listtores(pathlist)
249 sr.ChangedResource()
250 else:
251 sr = Resource(listtores(pathlist))
252 sr.AddResource('STR#', OVERRIDE_PATH_STRINGS_ID, '')
253
254 CloseResFile(app_handle)
255
256def main():
257 try:
258 h = OpenResFile('EditPythonPrefs.rsrc')
259 except Res.Error:
260 pass # Assume we already have acces to our own resource
261
262 if len(sys.argv) <= 1:
263 edit_preferences()
264 else:
265 for appl in sys.argv[1:]:
266 edit_applet(appl)
267
Jack Jansen7571f301995-07-29 13:48:41 +0000268
269if __name__ == '__main__':
270 print # Stupid, to init toolboxes...
271 main()