blob: 8e1e05607cc30a3d422e3014dd729839e77a3b35 [file] [log] [blame]
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +00001"""Easy to use dialogs.
2
3Message(msg) -- display a message and an OK button.
4AskString(prompt, default) -- ask for a string, display OK and Cancel buttons.
Just van Rossumcdcc0f01999-02-15 00:04:05 +00005AskPassword(prompt, default) -- like AskString(), but shows text as bullets.
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +00006AskYesNoCancel(question, default) -- display a question and Yes, No and Cancel buttons.
Jack Jansen3a87f5b1995-11-14 10:13:49 +00007bar = Progress(label, maxvalue) -- Display a progress bar
8bar.set(value) -- Set value
Jack Jansen1d63d8c1997-05-12 15:44:14 +00009bar.inc( *amount ) -- increment value by amount (default=1)
10bar.label( *newlabel ) -- get or set text label.
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000011
12More documentation in each function.
Jack Jansencc386881999-12-12 22:57:51 +000013This module uses DLOG resources 260 and on.
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000014Based upon STDWIN dialogs with the same names and functions.
15"""
16
Jack Jansen5a6fdcd2001-08-25 12:15:04 +000017from Carbon.Dlg import GetNewDialog, SetDialogItemText, GetDialogItemText, ModalDialog
18from Carbon import Qd
19from Carbon import QuickDraw
20from Carbon import Dialogs
21from Carbon import Windows
22from Carbon import Dlg,Win,Evt,Events # sdm7g
23from Carbon import Ctl
24from Carbon import Controls
25from Carbon import Menu
Jack Jansena5a49811998-07-01 15:47:44 +000026import MacOS
27import string
Jack Jansen5a6fdcd2001-08-25 12:15:04 +000028from Carbon.ControlAccessor import * # Also import Controls constants
Jack Jansenf86eda52000-09-19 22:42:38 +000029import macfs
Jack Jansendde800e2002-11-07 23:07:05 +000030import macresource
31
32_initialized = 0
33
34def _initialize():
35 global _initialized
36 if _initialized: return
37 macresource.need("DLOG", 260, "dialogs.rsrc", __name__)
38
Jack Jansena5a49811998-07-01 15:47:44 +000039
40def cr2lf(text):
41 if '\r' in text:
42 text = string.join(string.split(text, '\r'), '\n')
43 return text
44
45def lf2cr(text):
46 if '\n' in text:
47 text = string.join(string.split(text, '\n'), '\r')
Jack Jansend5af7bd1998-09-28 10:37:08 +000048 if len(text) > 253:
49 text = text[:253] + '\311'
Jack Jansena5a49811998-07-01 15:47:44 +000050 return text
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000051
Jack Jansencc386881999-12-12 22:57:51 +000052def Message(msg, id=260, ok=None):
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000053 """Display a MESSAGE string.
54
55 Return when the user clicks the OK button or presses Return.
56
57 The MESSAGE string can be at most 255 characters long.
58 """
Jack Jansendde800e2002-11-07 23:07:05 +000059 _initialize()
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000060 d = GetNewDialog(id, -1)
61 if not d:
Jack Jansend05e1812002-08-02 11:03:19 +000062 print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000063 return
Jack Jansencc386881999-12-12 22:57:51 +000064 h = d.GetDialogItemAsControl(2)
Jack Jansena5a49811998-07-01 15:47:44 +000065 SetDialogItemText(h, lf2cr(msg))
Jack Jansen208c15a1999-02-16 16:06:39 +000066 if ok != None:
Jack Jansencc386881999-12-12 22:57:51 +000067 h = d.GetDialogItemAsControl(1)
68 h.SetControlTitle(ok)
Jack Jansen3a87f5b1995-11-14 10:13:49 +000069 d.SetDialogDefaultItem(1)
Jack Jansenfca049d2000-01-18 13:36:02 +000070 d.AutoSizeDialog()
Jack Jansen0c1836f2000-08-25 22:06:19 +000071 d.GetDialogWindow().ShowWindow()
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000072 while 1:
73 n = ModalDialog(None)
74 if n == 1:
75 return
76
77
Jack Jansencc386881999-12-12 22:57:51 +000078def AskString(prompt, default = "", id=261, ok=None, cancel=None):
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000079 """Display a PROMPT string and a text entry field with a DEFAULT string.
80
81 Return the contents of the text entry field when the user clicks the
82 OK button or presses Return.
83 Return None when the user clicks the Cancel button.
84
85 If omitted, DEFAULT is empty.
86
87 The PROMPT and DEFAULT strings, as well as the return value,
88 can be at most 255 characters long.
89 """
90
Jack Jansendde800e2002-11-07 23:07:05 +000091 _initialize()
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000092 d = GetNewDialog(id, -1)
93 if not d:
Jack Jansend05e1812002-08-02 11:03:19 +000094 print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000095 return
Jack Jansencc386881999-12-12 22:57:51 +000096 h = d.GetDialogItemAsControl(3)
Jack Jansena5a49811998-07-01 15:47:44 +000097 SetDialogItemText(h, lf2cr(prompt))
Jack Jansencc386881999-12-12 22:57:51 +000098 h = d.GetDialogItemAsControl(4)
Jack Jansena5a49811998-07-01 15:47:44 +000099 SetDialogItemText(h, lf2cr(default))
Jack Jansend61f92b1999-01-22 13:14:06 +0000100 d.SelectDialogItemText(4, 0, 999)
Jack Jansene4b40381995-07-17 13:25:15 +0000101# d.SetDialogItem(4, 0, 255)
Jack Jansen208c15a1999-02-16 16:06:39 +0000102 if ok != None:
Jack Jansencc386881999-12-12 22:57:51 +0000103 h = d.GetDialogItemAsControl(1)
104 h.SetControlTitle(ok)
Jack Jansen208c15a1999-02-16 16:06:39 +0000105 if cancel != None:
Jack Jansencc386881999-12-12 22:57:51 +0000106 h = d.GetDialogItemAsControl(2)
107 h.SetControlTitle(cancel)
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000108 d.SetDialogDefaultItem(1)
109 d.SetDialogCancelItem(2)
Jack Jansenfca049d2000-01-18 13:36:02 +0000110 d.AutoSizeDialog()
Jack Jansen0c1836f2000-08-25 22:06:19 +0000111 d.GetDialogWindow().ShowWindow()
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000112 while 1:
113 n = ModalDialog(None)
114 if n == 1:
Jack Jansencc386881999-12-12 22:57:51 +0000115 h = d.GetDialogItemAsControl(4)
Jack Jansena5a49811998-07-01 15:47:44 +0000116 return cr2lf(GetDialogItemText(h))
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000117 if n == 2: return None
118
Jack Jansen60429e01999-12-13 16:07:01 +0000119def AskPassword(prompt, default='', id=264, ok=None, cancel=None):
Jack Jansenb92268a1999-02-10 22:38:44 +0000120 """Display a PROMPT string and a text entry field with a DEFAULT string.
121 The string is displayed as bullets only.
122
123 Return the contents of the text entry field when the user clicks the
124 OK button or presses Return.
125 Return None when the user clicks the Cancel button.
126
127 If omitted, DEFAULT is empty.
128
129 The PROMPT and DEFAULT strings, as well as the return value,
130 can be at most 255 characters long.
131 """
Jack Jansendde800e2002-11-07 23:07:05 +0000132 _initialize()
Jack Jansenb92268a1999-02-10 22:38:44 +0000133 d = GetNewDialog(id, -1)
134 if not d:
Jack Jansend05e1812002-08-02 11:03:19 +0000135 print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
Jack Jansenb92268a1999-02-10 22:38:44 +0000136 return
Jack Jansen60429e01999-12-13 16:07:01 +0000137 h = d.GetDialogItemAsControl(3)
Jack Jansenb92268a1999-02-10 22:38:44 +0000138 SetDialogItemText(h, lf2cr(prompt))
Jack Jansen60429e01999-12-13 16:07:01 +0000139 pwd = d.GetDialogItemAsControl(4)
Jack Jansenb92268a1999-02-10 22:38:44 +0000140 bullets = '\245'*len(default)
Jack Jansen60429e01999-12-13 16:07:01 +0000141## SetControlData(pwd, kControlEditTextPart, kControlEditTextTextTag, bullets)
142 SetControlData(pwd, kControlEditTextPart, kControlEditTextPasswordTag, default)
143 d.SelectDialogItemText(4, 0, 999)
Jack Jansen0c1836f2000-08-25 22:06:19 +0000144 Ctl.SetKeyboardFocus(d.GetDialogWindow(), pwd, kControlEditTextPart)
Jack Jansen60429e01999-12-13 16:07:01 +0000145 if ok != None:
146 h = d.GetDialogItemAsControl(1)
147 h.SetControlTitle(ok)
148 if cancel != None:
149 h = d.GetDialogItemAsControl(2)
150 h.SetControlTitle(cancel)
Jack Jansenb92268a1999-02-10 22:38:44 +0000151 d.SetDialogDefaultItem(Dialogs.ok)
152 d.SetDialogCancelItem(Dialogs.cancel)
Jack Jansenfca049d2000-01-18 13:36:02 +0000153 d.AutoSizeDialog()
Jack Jansen0c1836f2000-08-25 22:06:19 +0000154 d.GetDialogWindow().ShowWindow()
Jack Jansenb92268a1999-02-10 22:38:44 +0000155 while 1:
Jack Jansen60429e01999-12-13 16:07:01 +0000156 n = ModalDialog(None)
157 if n == 1:
158 h = d.GetDialogItemAsControl(4)
159 return cr2lf(GetControlData(pwd, kControlEditTextPart, kControlEditTextPasswordTag))
160 if n == 2: return None
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000161
Jack Jansencc386881999-12-12 22:57:51 +0000162def AskYesNoCancel(question, default = 0, yes=None, no=None, cancel=None, id=262):
Jack Jansencf2efc61999-02-25 22:05:45 +0000163 """Display a QUESTION string which can be answered with Yes or No.
164
165 Return 1 when the user clicks the Yes button.
166 Return 0 when the user clicks the No button.
167 Return -1 when the user clicks the Cancel button.
168
169 When the user presses Return, the DEFAULT value is returned.
170 If omitted, this is 0 (No).
171
Just van Rossum639a7402001-06-26 06:57:12 +0000172 The QUESTION string can be at most 255 characters.
Jack Jansencf2efc61999-02-25 22:05:45 +0000173 """
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000174
Jack Jansendde800e2002-11-07 23:07:05 +0000175 _initialize()
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000176 d = GetNewDialog(id, -1)
177 if not d:
Jack Jansend05e1812002-08-02 11:03:19 +0000178 print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000179 return
180 # Button assignments:
181 # 1 = default (invisible)
182 # 2 = Yes
183 # 3 = No
184 # 4 = Cancel
185 # The question string is item 5
Jack Jansencc386881999-12-12 22:57:51 +0000186 h = d.GetDialogItemAsControl(5)
Jack Jansena5a49811998-07-01 15:47:44 +0000187 SetDialogItemText(h, lf2cr(question))
Jack Jansen3f5aef71997-06-20 16:23:37 +0000188 if yes != None:
Jack Jansen85743782000-02-10 16:15:53 +0000189 if yes == '':
190 d.HideDialogItem(2)
191 else:
192 h = d.GetDialogItemAsControl(2)
193 h.SetControlTitle(yes)
Jack Jansen3f5aef71997-06-20 16:23:37 +0000194 if no != None:
Jack Jansen85743782000-02-10 16:15:53 +0000195 if no == '':
196 d.HideDialogItem(3)
197 else:
198 h = d.GetDialogItemAsControl(3)
199 h.SetControlTitle(no)
Jack Jansen3f5aef71997-06-20 16:23:37 +0000200 if cancel != None:
Jack Jansen208c15a1999-02-16 16:06:39 +0000201 if cancel == '':
202 d.HideDialogItem(4)
203 else:
Jack Jansencc386881999-12-12 22:57:51 +0000204 h = d.GetDialogItemAsControl(4)
205 h.SetControlTitle(cancel)
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000206 d.SetDialogCancelItem(4)
Jack Jansen0b690db1996-04-10 14:49:41 +0000207 if default == 1:
208 d.SetDialogDefaultItem(2)
209 elif default == 0:
210 d.SetDialogDefaultItem(3)
211 elif default == -1:
212 d.SetDialogDefaultItem(4)
Jack Jansenfca049d2000-01-18 13:36:02 +0000213 d.AutoSizeDialog()
Jack Jansen0c1836f2000-08-25 22:06:19 +0000214 d.GetDialogWindow().ShowWindow()
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000215 while 1:
216 n = ModalDialog(None)
217 if n == 1: return default
218 if n == 2: return 1
219 if n == 3: return 0
220 if n == 4: return -1
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000221
222
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000223
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000224
Jack Jansen362c7cd02002-11-30 00:01:29 +0000225screenbounds = Qd.GetQDGlobalsScreenBits().bounds
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000226screenbounds = screenbounds[0]+4, screenbounds[1]+4, \
227 screenbounds[2]-4, screenbounds[3]-4
228
Jack Jansen911e87d2001-08-27 15:24:07 +0000229kControlProgressBarIndeterminateTag = 'inde' # from Controls.py
230
231
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000232class ProgressBar:
Jack Jansen911e87d2001-08-27 15:24:07 +0000233 def __init__(self, title="Working...", maxval=0, label="", id=263):
Jack Jansen5dd73622001-02-23 22:18:27 +0000234 self.w = None
235 self.d = None
Jack Jansendde800e2002-11-07 23:07:05 +0000236 _initialize()
Jack Jansen3f5aef71997-06-20 16:23:37 +0000237 self.d = GetNewDialog(id, -1)
Jack Jansen784c6112001-02-09 15:57:01 +0000238 self.w = self.d.GetDialogWindow()
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000239 self.label(label)
Jack Jansenab48e902000-07-24 14:07:15 +0000240 self.title(title)
Jack Jansen911e87d2001-08-27 15:24:07 +0000241 self.set(0, maxval)
242 self.d.AutoSizeDialog()
Jack Jansen784c6112001-02-09 15:57:01 +0000243 self.w.ShowWindow()
Jack Jansencc386881999-12-12 22:57:51 +0000244 self.d.DrawDialog()
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000245
246 def __del__( self ):
Jack Jansen5dd73622001-02-23 22:18:27 +0000247 if self.w:
248 self.w.BringToFront()
249 self.w.HideWindow()
Jack Jansen784c6112001-02-09 15:57:01 +0000250 del self.w
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000251 del self.d
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000252
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000253 def title(self, newstr=""):
254 """title(text) - Set title of progress window"""
Jack Jansen784c6112001-02-09 15:57:01 +0000255 self.w.BringToFront()
256 self.w.SetWTitle(newstr)
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000257
258 def label( self, *newstr ):
259 """label(text) - Set text in progress box"""
Jack Jansen784c6112001-02-09 15:57:01 +0000260 self.w.BringToFront()
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000261 if newstr:
Jack Jansena5a49811998-07-01 15:47:44 +0000262 self._label = lf2cr(newstr[0])
Jack Jansencc386881999-12-12 22:57:51 +0000263 text_h = self.d.GetDialogItemAsControl(2)
Jack Jansen911e87d2001-08-27 15:24:07 +0000264 SetDialogItemText(text_h, self._label)
265
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000266 def _update(self, value):
Jack Jansen58fa8181999-11-05 15:53:10 +0000267 maxval = self.maxval
Jack Jansen911e87d2001-08-27 15:24:07 +0000268 if maxval == 0: # an indeterminate bar
269 Ctl.IdleControls(self.w) # spin the barber pole
270 else: # a determinate bar
271 if maxval > 32767:
272 value = int(value/(maxval/32767.0))
273 maxval = 32767
274 progbar = self.d.GetDialogItemAsControl(3)
275 progbar.SetControlMaximum(maxval)
276 progbar.SetControlValue(value) # set the bar length
277
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000278 # Test for cancel button
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000279 ready, ev = Evt.WaitNextEvent( Events.mDownMask, 1 )
Jack Jansen911e87d2001-08-27 15:24:07 +0000280 if ready :
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000281 what,msg,when,where,mod = ev
282 part = Win.FindWindow(where)[0]
283 if Dlg.IsDialogEvent(ev):
284 ds = Dlg.DialogSelect(ev)
285 if ds[0] and ds[1] == self.d and ds[-1] == 1:
Jack Jansen5dd73622001-02-23 22:18:27 +0000286 self.w.HideWindow()
287 self.w = None
288 self.d = None
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000289 raise KeyboardInterrupt, ev
290 else:
291 if part == 4: # inDrag
Jack Jansen8d2f3d62001-07-27 09:21:28 +0000292 self.w.DragWindow(where, screenbounds)
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000293 else:
294 MacOS.HandleEvent(ev)
295
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000296
Jack Jansen58fa8181999-11-05 15:53:10 +0000297 def set(self, value, max=None):
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000298 """set(value) - Set progress bar position"""
Jack Jansen58fa8181999-11-05 15:53:10 +0000299 if max != None:
300 self.maxval = max
Jack Jansen911e87d2001-08-27 15:24:07 +0000301 bar = self.d.GetDialogItemAsControl(3)
302 if max <= 0: # indeterminate bar
303 bar.SetControlData(0,kControlProgressBarIndeterminateTag,'\x01')
304 else: # determinate bar
305 bar.SetControlData(0,kControlProgressBarIndeterminateTag,'\x00')
306 if value < 0:
307 value = 0
308 elif value > self.maxval:
309 value = self.maxval
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000310 self.curval = value
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000311 self._update(value)
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000312
313 def inc(self, n=1):
314 """inc(amt) - Increment progress bar position"""
315 self.set(self.curval + n)
316
Jack Jansenf86eda52000-09-19 22:42:38 +0000317ARGV_ID=265
318ARGV_ITEM_OK=1
319ARGV_ITEM_CANCEL=2
320ARGV_OPTION_GROUP=3
321ARGV_OPTION_EXPLAIN=4
322ARGV_OPTION_VALUE=5
323ARGV_OPTION_ADD=6
324ARGV_COMMAND_GROUP=7
325ARGV_COMMAND_EXPLAIN=8
326ARGV_COMMAND_ADD=9
327ARGV_ADD_OLDFILE=10
328ARGV_ADD_NEWFILE=11
329ARGV_ADD_FOLDER=12
330ARGV_CMDLINE_GROUP=13
331ARGV_CMDLINE_DATA=14
332
333##def _myModalDialog(d):
334## while 1:
335## ready, ev = Evt.WaitNextEvent(0xffff, -1)
336## print 'DBG: WNE', ready, ev
337## if ready :
338## what,msg,when,where,mod = ev
339## part, window = Win.FindWindow(where)
340## if Dlg.IsDialogEvent(ev):
341## didit, dlgdone, itemdone = Dlg.DialogSelect(ev)
342## print 'DBG: DialogSelect', didit, dlgdone, itemdone, d
343## if didit and dlgdone == d:
344## return itemdone
345## elif window == d.GetDialogWindow():
346## d.GetDialogWindow().SelectWindow()
347## if part == 4: # inDrag
348## d.DragWindow(where, screenbounds)
349## else:
350## MacOS.HandleEvent(ev)
351## else:
352## MacOS.HandleEvent(ev)
353##
354def _setmenu(control, items):
Jack Jansene7bfc912001-01-09 22:22:58 +0000355 mhandle = control.GetControlData_Handle(Controls.kControlMenuPart,
Jack Jansenf86eda52000-09-19 22:42:38 +0000356 Controls.kControlPopupButtonMenuHandleTag)
357 menu = Menu.as_Menu(mhandle)
358 for item in items:
359 if type(item) == type(()):
360 label = item[0]
361 else:
362 label = item
363 if label[-1] == '=' or label[-1] == ':':
364 label = label[:-1]
365 menu.AppendMenu(label)
366## mhandle, mid = menu.getpopupinfo()
Jack Jansene7bfc912001-01-09 22:22:58 +0000367## control.SetControlData_Handle(Controls.kControlMenuPart,
Jack Jansenf86eda52000-09-19 22:42:38 +0000368## Controls.kControlPopupButtonMenuHandleTag, mhandle)
369 control.SetControlMinimum(1)
370 control.SetControlMaximum(len(items)+1)
371
372def _selectoption(d, optionlist, idx):
373 if idx < 0 or idx >= len(optionlist):
374 MacOS.SysBeep()
375 return
376 option = optionlist[idx]
Jack Jansen09c73432002-06-26 15:14:48 +0000377 if type(option) == type(()):
378 if len(option) == 4:
379 help = option[2]
380 elif len(option) > 1:
381 help = option[-1]
382 else:
383 help = ''
Jack Jansenf86eda52000-09-19 22:42:38 +0000384 else:
385 help = ''
386 h = d.GetDialogItemAsControl(ARGV_OPTION_EXPLAIN)
Jack Jansen09c73432002-06-26 15:14:48 +0000387 if help and len(help) > 250:
388 help = help[:250] + '...'
Jack Jansenf86eda52000-09-19 22:42:38 +0000389 Dlg.SetDialogItemText(h, help)
390 hasvalue = 0
391 if type(option) == type(()):
392 label = option[0]
393 else:
394 label = option
395 if label[-1] == '=' or label[-1] == ':':
396 hasvalue = 1
397 h = d.GetDialogItemAsControl(ARGV_OPTION_VALUE)
398 Dlg.SetDialogItemText(h, '')
399 if hasvalue:
400 d.ShowDialogItem(ARGV_OPTION_VALUE)
401 d.SelectDialogItemText(ARGV_OPTION_VALUE, 0, 0)
402 else:
403 d.HideDialogItem(ARGV_OPTION_VALUE)
404
405
406def GetArgv(optionlist=None, commandlist=None, addoldfile=1, addnewfile=1, addfolder=1, id=ARGV_ID):
Jack Jansendde800e2002-11-07 23:07:05 +0000407 _initialize()
Jack Jansenf86eda52000-09-19 22:42:38 +0000408 d = GetNewDialog(id, -1)
409 if not d:
Jack Jansend05e1812002-08-02 11:03:19 +0000410 print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
Jack Jansenf86eda52000-09-19 22:42:38 +0000411 return
412# h = d.GetDialogItemAsControl(3)
413# SetDialogItemText(h, lf2cr(prompt))
414# h = d.GetDialogItemAsControl(4)
415# SetDialogItemText(h, lf2cr(default))
416# d.SelectDialogItemText(4, 0, 999)
417# d.SetDialogItem(4, 0, 255)
418 if optionlist:
419 _setmenu(d.GetDialogItemAsControl(ARGV_OPTION_GROUP), optionlist)
420 _selectoption(d, optionlist, 0)
421 else:
422 d.GetDialogItemAsControl(ARGV_OPTION_GROUP).DeactivateControl()
423 if commandlist:
424 _setmenu(d.GetDialogItemAsControl(ARGV_COMMAND_GROUP), commandlist)
Jack Jansen0bb0a902000-09-21 22:01:08 +0000425 if type(commandlist[0]) == type(()) and len(commandlist[0]) > 1:
Jack Jansenf86eda52000-09-19 22:42:38 +0000426 help = commandlist[0][-1]
427 h = d.GetDialogItemAsControl(ARGV_COMMAND_EXPLAIN)
428 Dlg.SetDialogItemText(h, help)
429 else:
430 d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).DeactivateControl()
431 if not addoldfile:
432 d.GetDialogItemAsControl(ARGV_ADD_OLDFILE).DeactivateControl()
433 if not addnewfile:
434 d.GetDialogItemAsControl(ARGV_ADD_NEWFILE).DeactivateControl()
435 if not addfolder:
436 d.GetDialogItemAsControl(ARGV_ADD_FOLDER).DeactivateControl()
437 d.SetDialogDefaultItem(ARGV_ITEM_OK)
438 d.SetDialogCancelItem(ARGV_ITEM_CANCEL)
439 d.GetDialogWindow().ShowWindow()
440 d.DrawDialog()
Jack Janseneb308432001-09-09 00:36:01 +0000441 if hasattr(MacOS, 'SchedParams'):
442 appsw = MacOS.SchedParams(1, 0)
Jack Jansenf86eda52000-09-19 22:42:38 +0000443 try:
444 while 1:
445 stringstoadd = []
446 n = ModalDialog(None)
447 if n == ARGV_ITEM_OK:
448 break
449 elif n == ARGV_ITEM_CANCEL:
450 raise SystemExit
451 elif n == ARGV_OPTION_GROUP:
452 idx = d.GetDialogItemAsControl(ARGV_OPTION_GROUP).GetControlValue()-1
453 _selectoption(d, optionlist, idx)
454 elif n == ARGV_OPTION_VALUE:
455 pass
456 elif n == ARGV_OPTION_ADD:
457 idx = d.GetDialogItemAsControl(ARGV_OPTION_GROUP).GetControlValue()-1
458 if 0 <= idx < len(optionlist):
Jack Jansen0bb0a902000-09-21 22:01:08 +0000459 option = optionlist[idx]
460 if type(option) == type(()):
461 option = option[0]
Jack Jansenf86eda52000-09-19 22:42:38 +0000462 if option[-1] == '=' or option[-1] == ':':
463 option = option[:-1]
464 h = d.GetDialogItemAsControl(ARGV_OPTION_VALUE)
465 value = Dlg.GetDialogItemText(h)
466 else:
467 value = ''
468 if len(option) == 1:
469 stringtoadd = '-' + option
470 else:
471 stringtoadd = '--' + option
472 stringstoadd = [stringtoadd]
473 if value:
474 stringstoadd.append(value)
475 else:
476 MacOS.SysBeep()
477 elif n == ARGV_COMMAND_GROUP:
478 idx = d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).GetControlValue()-1
Jack Jansen0bb0a902000-09-21 22:01:08 +0000479 if 0 <= idx < len(commandlist) and type(commandlist[idx]) == type(()) and \
Jack Jansenf86eda52000-09-19 22:42:38 +0000480 len(commandlist[idx]) > 1:
481 help = commandlist[idx][-1]
482 h = d.GetDialogItemAsControl(ARGV_COMMAND_EXPLAIN)
483 Dlg.SetDialogItemText(h, help)
484 elif n == ARGV_COMMAND_ADD:
485 idx = d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).GetControlValue()-1
486 if 0 <= idx < len(commandlist):
Jack Jansen0bb0a902000-09-21 22:01:08 +0000487 command = commandlist[idx]
488 if type(command) == type(()):
489 command = command[0]
490 stringstoadd = [command]
Jack Jansenf86eda52000-09-19 22:42:38 +0000491 else:
492 MacOS.SysBeep()
493 elif n == ARGV_ADD_OLDFILE:
494 fss, ok = macfs.StandardGetFile()
495 if ok:
496 stringstoadd = [fss.as_pathname()]
497 elif n == ARGV_ADD_NEWFILE:
498 fss, ok = macfs.StandardPutFile('')
499 if ok:
500 stringstoadd = [fss.as_pathname()]
501 elif n == ARGV_ADD_FOLDER:
502 fss, ok = macfs.GetDirectory()
503 if ok:
504 stringstoadd = [fss.as_pathname()]
505 elif n == ARGV_CMDLINE_DATA:
506 pass # Nothing to do
507 else:
508 raise RuntimeError, "Unknown dialog item %d"%n
509
510 for stringtoadd in stringstoadd:
511 if '"' in stringtoadd or "'" in stringtoadd or " " in stringtoadd:
512 stringtoadd = `stringtoadd`
513 h = d.GetDialogItemAsControl(ARGV_CMDLINE_DATA)
514 oldstr = GetDialogItemText(h)
515 if oldstr and oldstr[-1] != ' ':
516 oldstr = oldstr + ' '
517 oldstr = oldstr + stringtoadd
518 if oldstr[-1] != ' ':
519 oldstr = oldstr + ' '
520 SetDialogItemText(h, oldstr)
521 d.SelectDialogItemText(ARGV_CMDLINE_DATA, 0x7fff, 0x7fff)
522 h = d.GetDialogItemAsControl(ARGV_CMDLINE_DATA)
523 oldstr = GetDialogItemText(h)
524 tmplist = string.split(oldstr)
525 newlist = []
526 while tmplist:
527 item = tmplist[0]
528 del tmplist[0]
529 if item[0] == '"':
530 while item[-1] != '"':
531 if not tmplist:
532 raise RuntimeError, "Unterminated quoted argument"
533 item = item + ' ' + tmplist[0]
534 del tmplist[0]
535 item = item[1:-1]
536 if item[0] == "'":
537 while item[-1] != "'":
538 if not tmplist:
539 raise RuntimeError, "Unterminated quoted argument"
540 item = item + ' ' + tmplist[0]
541 del tmplist[0]
542 item = item[1:-1]
543 newlist.append(item)
544 return newlist
545 finally:
Jack Janseneb308432001-09-09 00:36:01 +0000546 if hasattr(MacOS, 'SchedParams'):
547 apply(MacOS.SchedParams, appsw)
Jack Jansen0bb0a902000-09-21 22:01:08 +0000548 del d
Jack Jansenf86eda52000-09-19 22:42:38 +0000549
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000550def test():
Jack Jansenf86eda52000-09-19 22:42:38 +0000551 import time, sys
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000552
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000553 Message("Testing EasyDialogs.")
Jack Jansenf86eda52000-09-19 22:42:38 +0000554 optionlist = (('v', 'Verbose'), ('verbose', 'Verbose as long option'),
555 ('flags=', 'Valued option'), ('f:', 'Short valued option'))
556 commandlist = (('start', 'Start something'), ('stop', 'Stop something'))
557 argv = GetArgv(optionlist=optionlist, commandlist=commandlist, addoldfile=0)
558 for i in range(len(argv)):
559 print 'arg[%d] = %s'%(i, `argv[i]`)
560 print 'Type return to continue - ',
561 sys.stdin.readline()
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000562 ok = AskYesNoCancel("Do you want to proceed?")
Jack Jansen60429e01999-12-13 16:07:01 +0000563 ok = AskYesNoCancel("Do you want to identify?", yes="Identify", no="No")
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000564 if ok > 0:
Jack Jansend61f92b1999-01-22 13:14:06 +0000565 s = AskString("Enter your first name", "Joe")
Jack Jansen60429e01999-12-13 16:07:01 +0000566 s2 = AskPassword("Okay %s, tell us your nickname"%s, s, cancel="None")
567 if not s2:
568 Message("%s has no secret nickname"%s)
569 else:
570 Message("Hello everybody!!\nThe secret nickname of %s is %s!!!"%(s, s2))
Jack Jansen911e87d2001-08-27 15:24:07 +0000571 text = ( "Working Hard...", "Hardly Working..." ,
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000572 "So far, so good!", "Keep on truckin'" )
Jack Jansen911e87d2001-08-27 15:24:07 +0000573 bar = ProgressBar("Progress, progress...", 0, label="Ramping up...")
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000574 try:
Jack Janseneb308432001-09-09 00:36:01 +0000575 if hasattr(MacOS, 'SchedParams'):
576 appsw = MacOS.SchedParams(1, 0)
Jack Jansen911e87d2001-08-27 15:24:07 +0000577 for i in xrange(20):
578 bar.inc()
579 time.sleep(0.05)
580 bar.set(0,100)
581 for i in xrange(100):
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000582 bar.set(i)
Jack Jansen911e87d2001-08-27 15:24:07 +0000583 time.sleep(0.05)
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000584 if i % 10 == 0:
585 bar.label(text[(i/10) % 4])
586 bar.label("Done.")
Jack Jansen911e87d2001-08-27 15:24:07 +0000587 time.sleep(1.0) # give'em a chance to see "Done."
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000588 finally:
589 del bar
Jack Janseneb308432001-09-09 00:36:01 +0000590 if hasattr(MacOS, 'SchedParams'):
591 apply(MacOS.SchedParams, appsw)
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000592
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000593if __name__ == '__main__':
Jack Jansen1d63d8c1997-05-12 15:44:14 +0000594 try:
595 test()
596 except KeyboardInterrupt:
597 Message("Operation Canceled.")
598