214 lines
5.6 KiB
Python
214 lines
5.6 KiB
Python
"""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 fss:
|
|
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()
|