blob: 64c5218c6a33eca2d77defd0e13f89e2f4b0c64d [file] [log] [blame]
Jack Jansen7571f301995-07-29 13:48:41 +00001"""Edit the Python Preferences file."""
Jack Jansen822a30b1996-04-10 14:52:18 +00002#
3# This program is getting more and more clunky. It should really
4# be rewritten in a modeless way some time soon.
Jack Jansen7571f301995-07-29 13:48:41 +00005
Jack Jansen5a6fdcd2001-08-25 12:15:04 +00006from Carbon.Dlg import *
7from Carbon.Events import *
8from Carbon.Res import *
9from Carbon import Controls
Jack Jansen7571f301995-07-29 13:48:41 +000010import string
11import struct
12import macfs
13import MacOS
14import os
15import sys
Jack Jansen5a6fdcd2001-08-25 12:15:04 +000016from Carbon import Res # For Res.Error
Jack Jansen3b3a2871997-09-08 13:19:42 +000017import pythonprefs
Jack Jansen3c06b9a2001-08-27 21:41:23 +000018import macresource
Jack Jansen3b3a2871997-09-08 13:19:42 +000019import EasyDialogs
Jack Jansen1bbf6ff2001-01-29 14:59:33 +000020try:
Jack Jansen5a6fdcd2001-08-25 12:15:04 +000021 from Carbon import Help
Jack Jansen1bbf6ff2001-01-29 14:59:33 +000022except ImportError:
23 Help = None
Jack Jansen84872291996-10-22 15:33:02 +000024
Jack Jansen7571f301995-07-29 13:48:41 +000025# resource IDs in our own resources (dialogs, etc)
26MESSAGE_ID = 256
27
Jack Jansen145c92d1996-10-11 11:30:26 +000028DIALOG_ID = 511
Jack Jansen7571f301995-07-29 13:48:41 +000029TEXT_ITEM = 1
30OK_ITEM = 2
31CANCEL_ITEM = 3
Jack Jansendb0bace1996-04-04 15:38:44 +000032DIR_ITEM = 4
33TITLE_ITEM = 5
Jack Jansen822a30b1996-04-10 14:52:18 +000034OPTIONS_ITEM = 7
Jack Jansenb95901e1997-09-09 13:58:19 +000035HELP_ITEM = 9
Jack Jansen822a30b1996-04-10 14:52:18 +000036
37# The options dialog. There is a correspondence between
38# the dialog item numbers and the option.
Jack Jansen145c92d1996-10-11 11:30:26 +000039OPT_DIALOG_ID = 510
Jack Jansen3b3a2871997-09-08 13:19:42 +000040
41# Map dialog item numbers to option names (and the reverse)
42opt_dialog_map = [
43 None,
Jack Jansen4a5eb962000-09-22 21:50:11 +000044 None,
Jack Jansen3e3eb3e2000-10-19 21:50:54 +000045 None,
Jack Jansen3b3a2871997-09-08 13:19:42 +000046 "inspect",
47 "verbose",
48 "optimize",
49 "unbuffered",
50 "debugging",
Jack Jansen4a5eb962000-09-22 21:50:11 +000051 "tabwarn",
52 "nosite",
53 "nonavservice",
Jack Jansen3b3a2871997-09-08 13:19:42 +000054 "nointopt",
55 "noargs",
Jack Jansenb95901e1997-09-09 13:58:19 +000056 "delayconsole",
Jack Jansena5ffeb62001-09-01 22:36:29 +000057 "divisionwarn",
58 "unixnewlines",
Jack Jansen4a5eb962000-09-22 21:50:11 +000059 ]
Jack Jansen3b3a2871997-09-08 13:19:42 +000060opt_dialog_dict = {}
61for i in range(len(opt_dialog_map)):
62 if opt_dialog_map[i]:
63 opt_dialog_dict[opt_dialog_map[i]] = i
64# 1 thru 10 are the options
Jack Jansen6c4e9871996-09-06 22:25:34 +000065# The GUSI creator/type and delay-console
Jack Jansena5ffeb62001-09-01 22:36:29 +000066OD_CREATOR_ITEM = 20
67OD_TYPE_ITEM = 21
Jack Jansen4a5eb962000-09-22 21:50:11 +000068OD_OK_ITEM = 1
69OD_CANCEL_ITEM = 2
Jack Jansena5ffeb62001-09-01 22:36:29 +000070OD_HELP_ITEM = 22
71OD_KEEPALWAYS_ITEM = 16
72OD_KEEPOUTPUT_ITEM = 17
73OD_KEEPERROR_ITEM = 18
74OD_KEEPNEVER_ITEM = 19
Jack Jansen7571f301995-07-29 13:48:41 +000075
Jack Jansen3b3a2871997-09-08 13:19:42 +000076def optinteract(options):
Jack Jansen822a30b1996-04-10 14:52:18 +000077 """Let the user interact with the options dialog"""
Jack Jansen822a30b1996-04-10 14:52:18 +000078 d = GetNewDialog(OPT_DIALOG_ID, -1)
Jack Jansen6a6db071999-12-23 14:34:07 +000079 htext = d.GetDialogItemAsControl(OD_CREATOR_ITEM)
80 SetDialogItemText(htext, options['creator'])
81 htext = d.GetDialogItemAsControl(OD_TYPE_ITEM)
82 SetDialogItemText(htext, options['type'])
Jack Jansen822a30b1996-04-10 14:52:18 +000083 d.SetDialogDefaultItem(OD_OK_ITEM)
84 d.SetDialogCancelItem(OD_CANCEL_ITEM)
Jack Jansen1bbf6ff2001-01-29 14:59:33 +000085 if not Help:
86 d.HideDialogItem(OD_HELP_ITEM)
Jack Jansen822a30b1996-04-10 14:52:18 +000087 while 1:
Jack Jansen3b3a2871997-09-08 13:19:42 +000088 for name in opt_dialog_dict.keys():
89 num = opt_dialog_dict[name]
Jack Jansen6a6db071999-12-23 14:34:07 +000090 ctl = d.GetDialogItemAsControl(num)
91 ctl.SetControlValue(options[name])
Jack Jansen4a5eb962000-09-22 21:50:11 +000092 ctl = d.GetDialogItemAsControl(OD_KEEPALWAYS_ITEM)
93 ctl.SetControlValue(options['keep_console'] == 3)
94 ctl = d.GetDialogItemAsControl(OD_KEEPOUTPUT_ITEM)
95 ctl.SetControlValue(options['keep_console'] == 1)
96 ctl = d.GetDialogItemAsControl(OD_KEEPERROR_ITEM)
97 ctl.SetControlValue(options['keep_console'] == 2)
98 ctl = d.GetDialogItemAsControl(OD_KEEPNEVER_ITEM)
99 ctl.SetControlValue(options['keep_console'] == 0)
Jack Jansen822a30b1996-04-10 14:52:18 +0000100 n = ModalDialog(None)
101 if n == OD_OK_ITEM:
Jack Jansen6a6db071999-12-23 14:34:07 +0000102 htext = d.GetDialogItemAsControl(OD_CREATOR_ITEM)
103 ncreator = GetDialogItemText(htext)
104 htext = d.GetDialogItemAsControl(OD_TYPE_ITEM)
105 ntype = GetDialogItemText(htext)
Jack Jansen6c4e9871996-09-06 22:25:34 +0000106 if len(ncreator) == 4 and len(ntype) == 4:
Jack Jansen3b3a2871997-09-08 13:19:42 +0000107 options['creator'] = ncreator
108 options['type'] = ntype
109 return options
Jack Jansen6c4e9871996-09-06 22:25:34 +0000110 else:
Jack Jansen3b3a2871997-09-08 13:19:42 +0000111 MacOS.SysBeep()
Jack Jansen822a30b1996-04-10 14:52:18 +0000112 elif n == OD_CANCEL_ITEM:
Jack Jansen3b3a2871997-09-08 13:19:42 +0000113 return
Jack Jansen6c4e9871996-09-06 22:25:34 +0000114 elif n in (OD_CREATOR_ITEM, OD_TYPE_ITEM):
115 pass
Jack Jansen4a5eb962000-09-22 21:50:11 +0000116 elif n == OD_KEEPALWAYS_ITEM:
117 options['keep_console'] = 3;
118 elif n == OD_KEEPOUTPUT_ITEM:
119 options['keep_console'] = 1;
120 elif n == OD_KEEPERROR_ITEM:
121 options['keep_console'] = 2;
122 elif n == OD_KEEPNEVER_ITEM:
123 options['keep_console'] = 0;
Jack Jansen1bbf6ff2001-01-29 14:59:33 +0000124 elif n == OD_HELP_ITEM and Help:
Jack Jansenb95901e1997-09-09 13:58:19 +0000125 onoff = Help.HMGetBalloons()
126 Help.HMSetBalloons(not onoff)
Jack Jansen3b3a2871997-09-08 13:19:42 +0000127 elif 1 <= n <= len(opt_dialog_map):
128 options[opt_dialog_map[n]] = (not options[opt_dialog_map[n]])
Jack Jansen822a30b1996-04-10 14:52:18 +0000129
130
Jack Jansen3b3a2871997-09-08 13:19:42 +0000131def interact(options, title):
Jack Jansen7571f301995-07-29 13:48:41 +0000132 """Let the user interact with the dialog"""
Jack Jansen7571f301995-07-29 13:48:41 +0000133 try:
134 # Try to go to the "correct" dir for GetDirectory
Jack Jansen3b3a2871997-09-08 13:19:42 +0000135 os.chdir(options['dir'].as_pathname())
Jack Jansen7571f301995-07-29 13:48:41 +0000136 except os.error:
137 pass
138 d = GetNewDialog(DIALOG_ID, -1)
Jack Jansen6a6db071999-12-23 14:34:07 +0000139 htext = d.GetDialogItemAsControl(TITLE_ITEM)
140 SetDialogItemText(htext, title)
Jack Jansen8242c9e2000-01-13 16:22:12 +0000141 path_ctl = d.GetDialogItemAsControl(TEXT_ITEM)
Jack Jansen6a6db071999-12-23 14:34:07 +0000142 data = string.joinfields(options['path'], '\r')
Jack Jansen8242c9e2000-01-13 16:22:12 +0000143 path_ctl.SetControlData(Controls.kControlEditTextPart, Controls.kControlEditTextTextTag, data)
Jack Jansen6a6db071999-12-23 14:34:07 +0000144
Jack Jansena918b8c1996-11-20 14:55:26 +0000145 d.SelectDialogItemText(TEXT_ITEM, 0, 32767)
146 d.SelectDialogItemText(TEXT_ITEM, 0, 0)
Jack Jansendb0bace1996-04-04 15:38:44 +0000147## d.SetDialogDefaultItem(OK_ITEM)
148 d.SetDialogCancelItem(CANCEL_ITEM)
Jack Jansen1bbf6ff2001-01-29 14:59:33 +0000149 if not Help:
150 d.HideDialogItem(HELP_ITEM)
Jack Jansena918b8c1996-11-20 14:55:26 +0000151 d.GetDialogWindow().ShowWindow()
152 d.DrawDialog()
Jack Jansen7571f301995-07-29 13:48:41 +0000153 while 1:
154 n = ModalDialog(None)
155 if n == OK_ITEM:
156 break
157 if n == CANCEL_ITEM:
158 return None
Jack Jansendb0bace1996-04-04 15:38:44 +0000159## if n == REVERT_ITEM:
160## return [], pythondir
Jack Jansen7571f301995-07-29 13:48:41 +0000161 if n == DIR_ITEM:
Jack Jansenb340acf2003-01-26 21:40:00 +0000162 fss = EasyDialogs.AskFolder(message='Select python home folder:',
163 wanted=macfs.FSSpec)
Jack Jansen2373ff42003-01-26 22:15:10 +0000164 if fss:
Jack Jansen3b3a2871997-09-08 13:19:42 +0000165 options['dir'] = fss
Jack Jansen1bbf6ff2001-01-29 14:59:33 +0000166 elif n == HELP_ITEM and Help:
Jack Jansenb95901e1997-09-09 13:58:19 +0000167 onoff = Help.HMGetBalloons()
168 Help.HMSetBalloons(not onoff)
Jack Jansen822a30b1996-04-10 14:52:18 +0000169 if n == OPTIONS_ITEM:
Jack Jansen3b3a2871997-09-08 13:19:42 +0000170 noptions = options
171 for k in options.keys():
172 noptions[k] = options[k]
173 noptions = optinteract(noptions)
174 if noptions:
175 options = noptions
Jack Jansen8242c9e2000-01-13 16:22:12 +0000176 data = path_ctl.GetControlData(Controls.kControlEditTextPart, Controls.kControlEditTextTextTag)
177 tmp = string.splitfields(data, '\r')
Jack Jansen3b3a2871997-09-08 13:19:42 +0000178 newpath = []
Jack Jansen7571f301995-07-29 13:48:41 +0000179 for i in tmp:
180 if i:
Jack Jansen3b3a2871997-09-08 13:19:42 +0000181 newpath.append(i)
182 options['path'] = newpath
183 return options
Jack Jansen7571f301995-07-29 13:48:41 +0000184
Jack Jansendb0bace1996-04-04 15:38:44 +0000185
186def edit_preferences():
Jack Jansen3b3a2871997-09-08 13:19:42 +0000187 handler = pythonprefs.PythonOptions()
Jack Jansen43fd1f71999-12-02 22:52:12 +0000188 options = handler.load()
189 if options['noargs']:
190 EasyDialogs.Message('Warning: system-wide sys.argv processing is off.\nIf you dropped an applet I have not seen it.')
191 result = interact(options, 'System-wide preferences')
Jack Jansen3b3a2871997-09-08 13:19:42 +0000192 if result:
193 handler.save(result)
Jack Jansendb0bace1996-04-04 15:38:44 +0000194
195def edit_applet(name):
Jack Jansen3b3a2871997-09-08 13:19:42 +0000196 handler = pythonprefs.AppletOptions(name)
197 result = interact(handler.load(), os.path.split(name)[1])
198 if result:
199 handler.save(result)
Jack Jansendb0bace1996-04-04 15:38:44 +0000200
201def main():
Jack Jansen3c06b9a2001-08-27 21:41:23 +0000202 macresource.need('DLOG', DIALOG_ID, 'EditPythonPrefs.rsrc')
Jack Jansendb0bace1996-04-04 15:38:44 +0000203
Jack Jansen8c94d5e2000-10-13 23:34:06 +0000204 MacOS.SchedParams(1, 0)
Jack Jansendb0bace1996-04-04 15:38:44 +0000205 if len(sys.argv) <= 1:
206 edit_preferences()
207 else:
208 for appl in sys.argv[1:]:
209 edit_applet(appl)
210
Jack Jansen7571f301995-07-29 13:48:41 +0000211
212if __name__ == '__main__':
Jack Jansen7571f301995-07-29 13:48:41 +0000213 main()