mirror of
https://github.com/python/cpython.git
synced 2025-07-21 18:25:22 +00:00

may have missed an applet being dropped on us). This may fix the obscure bug Tony Ingraldi was experiencing.
181 lines
4.5 KiB
Python
181 lines
4.5 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 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
|
|
import pythonprefs
|
|
import EasyDialogs
|
|
import Help
|
|
|
|
# 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,
|
|
"inspect",
|
|
"verbose",
|
|
"optimize",
|
|
"unbuffered",
|
|
"debugging",
|
|
"keepopen",
|
|
"keeperror",
|
|
"nointopt",
|
|
"noargs",
|
|
"delayconsole",
|
|
None, None, None, None, None, None, None, None, # 11-18 are different
|
|
"oldexc",
|
|
"nosite"]
|
|
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 = 11
|
|
OD_TYPE_ITEM = 12
|
|
OD_OK_ITEM = 13
|
|
OD_CANCEL_ITEM = 14
|
|
OD_HELP_ITEM = 22
|
|
|
|
def optinteract(options):
|
|
"""Let the user interact with the options dialog"""
|
|
d = GetNewDialog(OPT_DIALOG_ID, -1)
|
|
tp, h, rect = d.GetDialogItem(OD_CREATOR_ITEM)
|
|
SetDialogItemText(h, options['creator'])
|
|
tp, h, rect = d.GetDialogItem(OD_TYPE_ITEM)
|
|
SetDialogItemText(h, options['type'])
|
|
d.SetDialogDefaultItem(OD_OK_ITEM)
|
|
d.SetDialogCancelItem(OD_CANCEL_ITEM)
|
|
|
|
while 1:
|
|
for name in opt_dialog_dict.keys():
|
|
num = opt_dialog_dict[name]
|
|
tp, h, rect = d.GetDialogItem(num)
|
|
h.as_Control().SetControlValue(options[name])
|
|
n = ModalDialog(None)
|
|
if n == OD_OK_ITEM:
|
|
tp, h, rect = d.GetDialogItem(OD_CREATOR_ITEM)
|
|
ncreator = GetDialogItemText(h)
|
|
tp, h, rect = d.GetDialogItem(OD_TYPE_ITEM)
|
|
ntype = GetDialogItemText(h)
|
|
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_HELP_ITEM:
|
|
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)
|
|
tp, h, rect = d.GetDialogItem(TITLE_ITEM)
|
|
SetDialogItemText(h, title)
|
|
tp, h, rect = d.GetDialogItem(TEXT_ITEM)
|
|
## SetDialogItemText(h, string.joinfields(list, '\r'))
|
|
h.data = string.joinfields(options['path'], '\r')
|
|
d.SelectDialogItemText(TEXT_ITEM, 0, 32767)
|
|
d.SelectDialogItemText(TEXT_ITEM, 0, 0)
|
|
## d.SetDialogDefaultItem(OK_ITEM)
|
|
d.SetDialogCancelItem(CANCEL_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, ok = macfs.GetDirectory('Select python home folder:')
|
|
if ok:
|
|
options['dir'] = fss
|
|
elif n == HELP_ITEM:
|
|
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
|
|
tmp = string.splitfields(h.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():
|
|
try:
|
|
h = OpenResFile('EditPythonPrefs.rsrc')
|
|
except Res.Error:
|
|
pass # Assume we already have acces to our own resource
|
|
|
|
if len(sys.argv) <= 1:
|
|
edit_preferences()
|
|
else:
|
|
for appl in sys.argv[1:]:
|
|
edit_applet(appl)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|