"""Edit the Python Preferences file.""" from Dlg import * from Events import * from Res import * import string import struct import macfs import MacOS import os import sys import Res # For Res.Error # resource IDs in our own resources (dialogs, etc) MESSAGE_ID = 256 DIALOG_ID = 512 TEXT_ITEM = 1 OK_ITEM = 2 CANCEL_ITEM = 3 REVERT_ITEM = 4 DIR_ITEM = 5 # Resource IDs in the preferences file PATH_STRINGS_ID = 128 DIRECTORY_ID = 128 WRITE = 2 smAllScripts = -3 kOnSystemDisk = 0x8000 def restolist(data): """Convert STR# resource data to a list of strings""" if not data: return [] num, = struct.unpack('h', data[:2]) data = data[2:] rv = [] for i in range(num): strlen = ord(data[0]) if strlen < 0: strlen = strlen + 256 str = data[1:strlen+1] data = data[strlen+1:] rv.append(str) return rv def listtores(list): """Convert a list of strings to STR# resource data""" rv = struct.pack('h', len(list)) for str in list: rv = rv + chr(len(str)) + str return rv def message(str = "Hello, world!", id = MESSAGE_ID): """Show a simple alert with a text message""" d = GetNewDialog(id, -1) print 'd=', d tp, h, rect = d.GetDialogItem(2) SetDialogItemText(h, str) while 1: n = ModalDialog(None) if n == 1: break def interact(list, pythondir): """Let the user interact with the dialog""" opythondir = pythondir try: # Try to go to the "correct" dir for GetDirectory os.chdir(pythondir.as_pathname()) except os.error: pass d = GetNewDialog(DIALOG_ID, -1) tp, h, rect = d.GetDialogItem(1) SetDialogItemText(h, string.joinfields(list, '\r')) while 1: n = ModalDialog(None) if n == OK_ITEM: break if n == CANCEL_ITEM: return None if n == REVERT_ITEM: return [], pythondir if n == DIR_ITEM: fss, ok = macfs.GetDirectory('Select python home folder:') if ok: pythondir = fss tmp = string.splitfields(GetDialogItemText(h), '\r') rv = [] for i in tmp: if i: rv.append(i) return rv, pythondir def main(): try: h = OpenResFile('EditPythonPrefs.rsrc') except Res.Error: pass # Assume we already have acces to our own resource # Find the preferences folder and our prefs file, create if needed. vrefnum, dirid = macfs.FindFolder(kOnSystemDisk, 'pref', 0) preff_fss = macfs.FSSpec((vrefnum, dirid, 'Python Preferences')) try: preff_handle = FSpOpenResFile(preff_fss, WRITE) except Res.Error: # Create it message('No preferences file, creating one...') FSpCreateResFile(preff_fss, 'Pyth', 'pref', smAllScripts) preff_handle = FSpOpenResFile(preff_fss, WRITE) # Load the path and directory resources try: sr = GetResource('STR#', PATH_STRINGS_ID) except (MacOS.Error, Res.Error): message('Cannot find any sys.path resource! (Old python?)') sys.exit(0) d = sr.data l = restolist(d) try: dr = GetResource('alis', DIRECTORY_ID) fss, fss_changed = macfs.RawAlias(dr.data).Resolve() except (MacOS.Error, Res.Error): dr = None fss = macfs.FSSpec(os.getcwd()) fss_changed = 1 # Let the user play away result = interact(l, fss) # See what we have to update, and how if result == None: sys.exit(0) pathlist, nfss = result if nfss != fss: fss_changed = 1 if fss_changed or pathlist != l: if fss_changed: alias = nfss.NewAlias() if dr: dr.data = alias.data dr.ChangedResource() else: dr = Resource(alias.data) dr.AddResource('alis', DIRECTORY_ID, '') if pathlist != l: if pathlist == []: if sr.HomeResFile() == preff_handle: sr.RemoveResource() elif sr.HomeResFile() == preff_handle: sr.data = listtores(pathlist) sr.ChangedResource() else: sr = Resource(listtores(pathlist)) sr.AddResource('STR#', PATH_STRINGS_ID, '') CloseResFile(preff_handle) if __name__ == '__main__': print # Stupid, to init toolboxes... main()