| """Edit the Python Preferences file.""" |
| # |
| # This program is getting more and more clunky. It should really |
| # be rewritten in a modeless way some time soon. |
| |
| from Carbon.Dlg import * |
| from Carbon.Events import * |
| from Carbon.Res import * |
| from Carbon import Controls |
| import string |
| import struct |
| import macfs |
| import MacOS |
| import os |
| import sys |
| from Carbon import Res # For Res.Error |
| import pythonprefs |
| import macresource |
| import EasyDialogs |
| try: |
| from Carbon import Help |
| except ImportError: |
| Help = None |
| |
| # resource IDs in our own resources (dialogs, etc) |
| MESSAGE_ID = 256 |
| |
| DIALOG_ID = 511 |
| TEXT_ITEM = 1 |
| OK_ITEM = 2 |
| CANCEL_ITEM = 3 |
| DIR_ITEM = 4 |
| TITLE_ITEM = 5 |
| OPTIONS_ITEM = 7 |
| HELP_ITEM = 9 |
| |
| # The options dialog. There is a correspondence between |
| # the dialog item numbers and the option. |
| OPT_DIALOG_ID = 510 |
| |
| # Map dialog item numbers to option names (and the reverse) |
| opt_dialog_map = [ |
| None, |
| None, |
| None, |
| "inspect", |
| "verbose", |
| "optimize", |
| "unbuffered", |
| "debugging", |
| "tabwarn", |
| "nosite", |
| "nonavservice", |
| "nointopt", |
| "noargs", |
| "delayconsole", |
| "divisionwarn", |
| "unixnewlines", |
| ] |
| opt_dialog_dict = {} |
| for i in range(len(opt_dialog_map)): |
| if opt_dialog_map[i]: |
| opt_dialog_dict[opt_dialog_map[i]] = i |
| # 1 thru 10 are the options |
| # The GUSI creator/type and delay-console |
| OD_CREATOR_ITEM = 20 |
| OD_TYPE_ITEM = 21 |
| OD_OK_ITEM = 1 |
| OD_CANCEL_ITEM = 2 |
| OD_HELP_ITEM = 22 |
| OD_KEEPALWAYS_ITEM = 16 |
| OD_KEEPOUTPUT_ITEM = 17 |
| OD_KEEPERROR_ITEM = 18 |
| OD_KEEPNEVER_ITEM = 19 |
| |
| def optinteract(options): |
| """Let the user interact with the options dialog""" |
| d = GetNewDialog(OPT_DIALOG_ID, -1) |
| htext = d.GetDialogItemAsControl(OD_CREATOR_ITEM) |
| SetDialogItemText(htext, options['creator']) |
| htext = d.GetDialogItemAsControl(OD_TYPE_ITEM) |
| SetDialogItemText(htext, options['type']) |
| d.SetDialogDefaultItem(OD_OK_ITEM) |
| d.SetDialogCancelItem(OD_CANCEL_ITEM) |
| if not Help: |
| d.HideDialogItem(OD_HELP_ITEM) |
| while 1: |
| for name in opt_dialog_dict.keys(): |
| num = opt_dialog_dict[name] |
| ctl = d.GetDialogItemAsControl(num) |
| ctl.SetControlValue(options[name]) |
| ctl = d.GetDialogItemAsControl(OD_KEEPALWAYS_ITEM) |
| ctl.SetControlValue(options['keep_console'] == 3) |
| ctl = d.GetDialogItemAsControl(OD_KEEPOUTPUT_ITEM) |
| ctl.SetControlValue(options['keep_console'] == 1) |
| ctl = d.GetDialogItemAsControl(OD_KEEPERROR_ITEM) |
| ctl.SetControlValue(options['keep_console'] == 2) |
| ctl = d.GetDialogItemAsControl(OD_KEEPNEVER_ITEM) |
| ctl.SetControlValue(options['keep_console'] == 0) |
| n = ModalDialog(None) |
| if n == OD_OK_ITEM: |
| htext = d.GetDialogItemAsControl(OD_CREATOR_ITEM) |
| ncreator = GetDialogItemText(htext) |
| htext = d.GetDialogItemAsControl(OD_TYPE_ITEM) |
| ntype = GetDialogItemText(htext) |
| if len(ncreator) == 4 and len(ntype) == 4: |
| options['creator'] = ncreator |
| options['type'] = ntype |
| return options |
| else: |
| MacOS.SysBeep() |
| elif n == OD_CANCEL_ITEM: |
| return |
| elif n in (OD_CREATOR_ITEM, OD_TYPE_ITEM): |
| pass |
| elif n == OD_KEEPALWAYS_ITEM: |
| options['keep_console'] = 3; |
| elif n == OD_KEEPOUTPUT_ITEM: |
| options['keep_console'] = 1; |
| elif n == OD_KEEPERROR_ITEM: |
| options['keep_console'] = 2; |
| elif n == OD_KEEPNEVER_ITEM: |
| options['keep_console'] = 0; |
| elif n == OD_HELP_ITEM and Help: |
| onoff = Help.HMGetBalloons() |
| Help.HMSetBalloons(not onoff) |
| elif 1 <= n <= len(opt_dialog_map): |
| options[opt_dialog_map[n]] = (not options[opt_dialog_map[n]]) |
| |
| |
| def interact(options, title): |
| """Let the user interact with the dialog""" |
| try: |
| # Try to go to the "correct" dir for GetDirectory |
| os.chdir(options['dir'].as_pathname()) |
| except os.error: |
| pass |
| d = GetNewDialog(DIALOG_ID, -1) |
| htext = d.GetDialogItemAsControl(TITLE_ITEM) |
| SetDialogItemText(htext, title) |
| path_ctl = d.GetDialogItemAsControl(TEXT_ITEM) |
| data = string.joinfields(options['path'], '\r') |
| path_ctl.SetControlData(Controls.kControlEditTextPart, Controls.kControlEditTextTextTag, data) |
| |
| d.SelectDialogItemText(TEXT_ITEM, 0, 32767) |
| d.SelectDialogItemText(TEXT_ITEM, 0, 0) |
| ## d.SetDialogDefaultItem(OK_ITEM) |
| d.SetDialogCancelItem(CANCEL_ITEM) |
| if not Help: |
| d.HideDialogItem(HELP_ITEM) |
| d.GetDialogWindow().ShowWindow() |
| d.DrawDialog() |
| 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 = EasyDialogs.AskFolder(message='Select python home folder:', |
| wanted=macfs.FSSpec) |
| if ok: |
| options['dir'] = fss |
| elif n == HELP_ITEM and Help: |
| onoff = Help.HMGetBalloons() |
| Help.HMSetBalloons(not onoff) |
| if n == OPTIONS_ITEM: |
| noptions = options |
| for k in options.keys(): |
| noptions[k] = options[k] |
| noptions = optinteract(noptions) |
| if noptions: |
| options = noptions |
| data = path_ctl.GetControlData(Controls.kControlEditTextPart, Controls.kControlEditTextTextTag) |
| tmp = string.splitfields(data, '\r') |
| newpath = [] |
| for i in tmp: |
| if i: |
| newpath.append(i) |
| options['path'] = newpath |
| return options |
| |
| |
| def edit_preferences(): |
| handler = pythonprefs.PythonOptions() |
| options = handler.load() |
| if options['noargs']: |
| EasyDialogs.Message('Warning: system-wide sys.argv processing is off.\nIf you dropped an applet I have not seen it.') |
| result = interact(options, 'System-wide preferences') |
| if result: |
| handler.save(result) |
| |
| def edit_applet(name): |
| handler = pythonprefs.AppletOptions(name) |
| result = interact(handler.load(), os.path.split(name)[1]) |
| if result: |
| handler.save(result) |
| |
| def main(): |
| macresource.need('DLOG', DIALOG_ID, 'EditPythonPrefs.rsrc') |
| |
| MacOS.SchedParams(1, 0) |
| if len(sys.argv) <= 1: |
| edit_preferences() |
| else: |
| for appl in sys.argv[1:]: |
| edit_applet(appl) |
| |
| |
| if __name__ == '__main__': |
| main() |