Added ref to Misc/NEWS file; added hint to run regen script on Linux.
[python/dscho.git] / Mac / scripts / EditPythonPrefs.py
blob2ed604553aa65f076c4afc3263f52d1d9b3a3b7f
1 """Edit the Python Preferences file."""
2 import addpack
3 addpack.addpack('Tools')
4 addpack.addpack('bgen')
5 addpack.addpack('evt')
7 from Dlg import *
8 from Events import *
9 from Res import *
10 import string
11 import struct
12 import macfs
13 import MacOS
14 import os
15 import sys
16 import Res # For Res.Error
18 # resource IDs in our own resources (dialogs, etc)
19 MESSAGE_ID = 256
21 DIALOG_ID = 512
22 TEXT_ITEM = 1
23 OK_ITEM = 2
24 CANCEL_ITEM = 3
25 REVERT_ITEM = 4
26 DIR_ITEM = 5
28 # Resource IDs in the preferences file
29 PATH_STRINGS_ID = 128
30 DIRECTORY_ID = 128
32 WRITE = 2
33 smAllScripts = -3
34 kOnSystemDisk = 0x8000
36 def restolist(data):
37 """Convert STR# resource data to a list of strings"""
38 if not data:
39 return []
40 num, = struct.unpack('h', data[:2])
41 data = data[2:]
42 rv = []
43 for i in range(num):
44 strlen = ord(data[0])
45 if strlen < 0: strlen = strlen + 256
46 str = data[1:strlen+1]
47 data = data[strlen+1:]
48 rv.append(str)
49 return rv
51 def listtores(list):
52 """Convert a list of strings to STR# resource data"""
53 rv = struct.pack('h', len(list))
54 for str in list:
55 rv = rv + chr(len(str)) + str
56 return rv
58 def message(str = "Hello, world!", id = MESSAGE_ID):
59 """Show a simple alert with a text message"""
60 d = GetNewDialog(id, -1)
61 print 'd=', d
62 tp, h, rect = d.GetDialogItem(2)
63 SetDialogItemText(h, str)
64 while 1:
65 n = ModalDialog(None)
66 if n == 1: break
68 def interact(list, pythondir):
69 """Let the user interact with the dialog"""
70 opythondir = pythondir
71 try:
72 # Try to go to the "correct" dir for GetDirectory
73 os.chdir(pythondir.as_pathname())
74 except os.error:
75 pass
76 d = GetNewDialog(DIALOG_ID, -1)
77 tp, h, rect = d.GetDialogItem(1)
78 SetDialogItemText(h, string.joinfields(list, '\r'))
79 while 1:
80 n = ModalDialog(None)
81 if n == OK_ITEM:
82 break
83 if n == CANCEL_ITEM:
84 return None
85 if n == REVERT_ITEM:
86 return [], pythondir
87 if n == DIR_ITEM:
88 fss, ok = macfs.GetDirectory('Select python home folder:')
89 if ok:
90 pythondir = fss
91 tmp = string.splitfields(GetDialogItemText(h), '\r')
92 rv = []
93 for i in tmp:
94 if i:
95 rv.append(i)
96 return rv, pythondir
98 def main():
99 try:
100 h = OpenResFile('EditPythonPrefs.rsrc')
101 except Res.Error:
102 pass # Assume we already have acces to our own resource
104 # Find the preferences folder and our prefs file, create if needed.
105 vrefnum, dirid = macfs.FindFolder(kOnSystemDisk, 'pref', 0)
106 preff_fss = macfs.FSSpec((vrefnum, dirid, 'Python Preferences'))
107 try:
108 preff_handle = FSpOpenResFile(preff_fss, WRITE)
109 except Res.Error:
110 # Create it
111 message('No preferences file, creating one...')
112 FSpCreateResFile(preff_fss, 'PYTH', 'pref', smAllScripts)
113 preff_handle = FSpOpenResFile(preff_fss, WRITE)
115 # Load the path and directory resources
116 try:
117 sr = GetResource('STR#', PATH_STRINGS_ID)
118 except (MacOS.Error, Res.Error):
119 message('Cannot find any sys.path resource! (Old python?)')
120 sys.exit(0)
121 d = sr.data
122 l = restolist(d)
124 try:
125 dr = GetResource('alis', DIRECTORY_ID)
126 fss, fss_changed = macfs.RawAlias(dr.data).Resolve()
127 except (MacOS.Error, Res.Error):
128 dr = None
129 fss = macfs.FSSpec(os.getcwd())
130 fss_changed = 1
132 # Let the user play away
133 result = interact(l, fss)
135 # See what we have to update, and how
136 if result == None:
137 sys.exit(0)
139 pathlist, nfss = result
140 if nfss != fss:
141 fss_changed = 1
143 if fss_changed or pathlist != l:
144 if fss_changed:
145 alias = nfss.NewAlias()
146 if dr:
147 dr.data = alias.data
148 dr.ChangedResource()
149 else:
150 dr = Resource(alias.data)
151 dr.AddResource('alis', DIRECTORY_ID, '')
153 if pathlist != l:
154 if pathlist == []:
155 if sr.HomeResFile() == preff_handle:
156 sr.RemoveResource()
157 elif sr.HomeResFile() == preff_handle:
158 sr.data = listtores(pathlist)
159 sr.ChangedResource()
160 else:
161 sr = Resource(listtores(pathlist))
162 sr.AddResource('STR#', PATH_STRINGS_ID, '')
164 CloseResFile(preff_handle)
166 if __name__ == '__main__':
167 print # Stupid, to init toolboxes...
168 main()