Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 1 | """Edit the Python Preferences file.""" |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 2 | |
| 3 | from Dlg import * |
| 4 | from Events import * |
| 5 | from Res import * |
| 6 | import string |
| 7 | import struct |
| 8 | import macfs |
| 9 | import MacOS |
| 10 | import os |
| 11 | import sys |
| 12 | import Res # For Res.Error |
| 13 | |
| 14 | # resource IDs in our own resources (dialogs, etc) |
| 15 | MESSAGE_ID = 256 |
| 16 | |
Jack Jansen | 9062fa2 | 1995-08-14 12:21:12 +0000 | [diff] [blame] | 17 | DIALOG_ID = 512 |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 18 | TEXT_ITEM = 1 |
| 19 | OK_ITEM = 2 |
| 20 | CANCEL_ITEM = 3 |
Jack Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 21 | DIR_ITEM = 4 |
| 22 | TITLE_ITEM = 5 |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 23 | |
| 24 | # Resource IDs in the preferences file |
| 25 | PATH_STRINGS_ID = 128 |
| 26 | DIRECTORY_ID = 128 |
Jack Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 27 | OPTIONS_ID = 128 |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 28 | |
Jack Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 29 | # Override IDs (in the applet) |
| 30 | OVERRIDE_PATH_STRINGS_ID = 129 |
| 31 | OVERRIDE_DIRECTORY_ID = 129 |
| 32 | OVERRIDE_OPTIONS_ID = 129 |
| 33 | |
| 34 | READ = 1 |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 35 | WRITE = 2 |
| 36 | smAllScripts = -3 |
| 37 | kOnSystemDisk = 0x8000 |
| 38 | |
| 39 | def 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 | |
| 54 | def 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 | |
| 61 | def 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 Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 71 | def interact(list, pythondir, title): |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 72 | """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 Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 80 | tp, h, rect = d.GetDialogItem(TITLE_ITEM) |
| 81 | SetDialogItemText(h, title) |
| 82 | tp, h, rect = d.GetDialogItem(TEXT_ITEM) |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 83 | SetDialogItemText(h, string.joinfields(list, '\r')) |
Jack Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 84 | ## d.SetDialogDefaultItem(OK_ITEM) |
| 85 | d.SetDialogCancelItem(CANCEL_ITEM) |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 86 | while 1: |
| 87 | n = ModalDialog(None) |
| 88 | if n == OK_ITEM: |
| 89 | break |
| 90 | if n == CANCEL_ITEM: |
| 91 | return None |
Jack Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 92 | ## if n == REVERT_ITEM: |
| 93 | ## return [], pythondir |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 94 | if n == DIR_ITEM: |
Jack Jansen | 9062fa2 | 1995-08-14 12:21:12 +0000 | [diff] [blame] | 95 | fss, ok = macfs.GetDirectory('Select python home folder:') |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 96 | 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 Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 105 | def getprefpath(id): |
| 106 | # Load the path and directory resources |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 107 | try: |
Jack Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 108 | 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 | |
| 115 | def 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 Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 122 | |
Jack Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 123 | def openpreffile(rw): |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 124 | # 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 Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 128 | preff_handle = FSpOpenResFile(preff_fss, rw) |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 129 | except Res.Error: |
| 130 | # Create it |
| 131 | message('No preferences file, creating one...') |
Jack Jansen | 532e3c2 | 1996-02-21 15:36:26 +0000 | [diff] [blame] | 132 | FSpCreateResFile(preff_fss, 'Pyth', 'pref', smAllScripts) |
Jack Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 133 | preff_handle = FSpOpenResFile(preff_fss, rw) |
| 134 | return preff_handle |
| 135 | |
| 136 | def openapplet(name): |
| 137 | fss = macfs.FSSpec(name) |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 138 | try: |
Jack Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 139 | 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 | |
| 146 | def edit_preferences(): |
| 147 | preff_handle = openpreffile(WRITE) |
| 148 | |
| 149 | l, sr = getprefpath(PATH_STRINGS_ID) |
| 150 | if l == None: |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 151 | message('Cannot find any sys.path resource! (Old python?)') |
| 152 | sys.exit(0) |
Jack Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 153 | |
| 154 | fss, dr, fss_changed = getprefdir(DIRECTORY_ID) |
| 155 | if fss == None: |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 156 | fss = macfs.FSSpec(os.getcwd()) |
| 157 | fss_changed = 1 |
| 158 | |
| 159 | # Let the user play away |
Jack Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 160 | result = interact(l, fss, 'System-wide preferences') |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 161 | |
| 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 Jansen | db0bace | 1996-04-04 15:38:44 +0000 | [diff] [blame^] | 192 | |
| 193 | def 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 | |
| 256 | def 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 Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 268 | |
| 269 | if __name__ == '__main__': |
| 270 | print # Stupid, to init toolboxes... |
| 271 | main() |