ยปCore Development>Code coverage>Lib/plat-mac/EasyDialogs.py

Python code coverage for Lib/plat-mac/EasyDialogs.py

#countcontent
1n/a"""Easy to use dialogs.
2n/a
3n/aMessage(msg) -- display a message and an OK button.
4n/aAskString(prompt, default) -- ask for a string, display OK and Cancel buttons.
5n/aAskPassword(prompt, default) -- like AskString(), but shows text as bullets.
6n/aAskYesNoCancel(question, default) -- display a question and Yes, No and Cancel buttons.
7n/aGetArgv(optionlist, commandlist) -- fill a sys.argv-like list using a dialog
8n/aAskFileForOpen(...) -- Ask the user for an existing file
9n/aAskFileForSave(...) -- Ask the user for an output file
10n/aAskFolder(...) -- Ask the user to select a folder
11n/abar = Progress(label, maxvalue) -- Display a progress bar
12n/abar.set(value) -- Set value
13n/abar.inc( *amount ) -- increment value by amount (default=1)
14n/abar.label( *newlabel ) -- get or set text label.
15n/a
16n/aMore documentation in each function.
17n/aThis module uses DLOG resources 260 and on.
18n/aBased upon STDWIN dialogs with the same names and functions.
19n/a"""
20n/a
21n/afrom warnings import warnpy3k
22n/awarnpy3k("In 3.x, the EasyDialogs module is removed.", stacklevel=2)
23n/a
24n/afrom Carbon.Dlg import GetNewDialog, SetDialogItemText, GetDialogItemText, ModalDialog
25n/afrom Carbon import Qd
26n/afrom Carbon import QuickDraw
27n/afrom Carbon import Dialogs
28n/afrom Carbon import Windows
29n/afrom Carbon import Dlg,Win,Evt,Events # sdm7g
30n/afrom Carbon import Ctl
31n/afrom Carbon import Controls
32n/afrom Carbon import Menu
33n/afrom Carbon import AE
34n/aimport Nav
35n/aimport MacOS
36n/aimport string
37n/afrom Carbon.ControlAccessor import * # Also import Controls constants
38n/aimport Carbon.File
39n/aimport macresource
40n/aimport os
41n/aimport sys
42n/a
43n/a__all__ = ['Message', 'AskString', 'AskPassword', 'AskYesNoCancel',
44n/a 'GetArgv', 'AskFileForOpen', 'AskFileForSave', 'AskFolder',
45n/a 'ProgressBar']
46n/a
47n/a_initialized = 0
48n/a
49n/adef _initialize():
50n/a global _initialized
51n/a if _initialized: return
52n/a macresource.need("DLOG", 260, "dialogs.rsrc", __name__)
53n/a
54n/adef _interact():
55n/a """Make sure the application is in the foreground"""
56n/a AE.AEInteractWithUser(50000000)
57n/a
58n/adef cr2lf(text):
59n/a if '\r' in text:
60n/a text = string.join(string.split(text, '\r'), '\n')
61n/a return text
62n/a
63n/adef lf2cr(text):
64n/a if '\n' in text:
65n/a text = string.join(string.split(text, '\n'), '\r')
66n/a if len(text) > 253:
67n/a text = text[:253] + '\311'
68n/a return text
69n/a
70n/adef Message(msg, id=260, ok=None):
71n/a """Display a MESSAGE string.
72n/a
73n/a Return when the user clicks the OK button or presses Return.
74n/a
75n/a The MESSAGE string can be at most 255 characters long.
76n/a """
77n/a _initialize()
78n/a _interact()
79n/a d = GetNewDialog(id, -1)
80n/a if not d:
81n/a print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
82n/a return
83n/a h = d.GetDialogItemAsControl(2)
84n/a SetDialogItemText(h, lf2cr(msg))
85n/a if ok is not None:
86n/a h = d.GetDialogItemAsControl(1)
87n/a h.SetControlTitle(ok)
88n/a d.SetDialogDefaultItem(1)
89n/a d.AutoSizeDialog()
90n/a d.GetDialogWindow().ShowWindow()
91n/a while 1:
92n/a n = ModalDialog(None)
93n/a if n == 1:
94n/a return
95n/a
96n/a
97n/adef AskString(prompt, default = "", id=261, ok=None, cancel=None):
98n/a """Display a PROMPT string and a text entry field with a DEFAULT string.
99n/a
100n/a Return the contents of the text entry field when the user clicks the
101n/a OK button or presses Return.
102n/a Return None when the user clicks the Cancel button.
103n/a
104n/a If omitted, DEFAULT is empty.
105n/a
106n/a The PROMPT and DEFAULT strings, as well as the return value,
107n/a can be at most 255 characters long.
108n/a """
109n/a
110n/a _initialize()
111n/a _interact()
112n/a d = GetNewDialog(id, -1)
113n/a if not d:
114n/a print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
115n/a return
116n/a h = d.GetDialogItemAsControl(3)
117n/a SetDialogItemText(h, lf2cr(prompt))
118n/a h = d.GetDialogItemAsControl(4)
119n/a SetDialogItemText(h, lf2cr(default))
120n/a d.SelectDialogItemText(4, 0, 999)
121n/a# d.SetDialogItem(4, 0, 255)
122n/a if ok is not None:
123n/a h = d.GetDialogItemAsControl(1)
124n/a h.SetControlTitle(ok)
125n/a if cancel is not None:
126n/a h = d.GetDialogItemAsControl(2)
127n/a h.SetControlTitle(cancel)
128n/a d.SetDialogDefaultItem(1)
129n/a d.SetDialogCancelItem(2)
130n/a d.AutoSizeDialog()
131n/a d.GetDialogWindow().ShowWindow()
132n/a while 1:
133n/a n = ModalDialog(None)
134n/a if n == 1:
135n/a h = d.GetDialogItemAsControl(4)
136n/a return cr2lf(GetDialogItemText(h))
137n/a if n == 2: return None
138n/a
139n/adef AskPassword(prompt, default='', id=264, ok=None, cancel=None):
140n/a """Display a PROMPT string and a text entry field with a DEFAULT string.
141n/a The string is displayed as bullets only.
142n/a
143n/a Return the contents of the text entry field when the user clicks the
144n/a OK button or presses Return.
145n/a Return None when the user clicks the Cancel button.
146n/a
147n/a If omitted, DEFAULT is empty.
148n/a
149n/a The PROMPT and DEFAULT strings, as well as the return value,
150n/a can be at most 255 characters long.
151n/a """
152n/a _initialize()
153n/a _interact()
154n/a d = GetNewDialog(id, -1)
155n/a if not d:
156n/a print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
157n/a return
158n/a h = d.GetDialogItemAsControl(3)
159n/a SetDialogItemText(h, lf2cr(prompt))
160n/a pwd = d.GetDialogItemAsControl(4)
161n/a bullets = '\245'*len(default)
162n/a## SetControlData(pwd, kControlEditTextPart, kControlEditTextTextTag, bullets)
163n/a SetControlData(pwd, kControlEditTextPart, kControlEditTextPasswordTag, default)
164n/a d.SelectDialogItemText(4, 0, 999)
165n/a Ctl.SetKeyboardFocus(d.GetDialogWindow(), pwd, kControlEditTextPart)
166n/a if ok is not None:
167n/a h = d.GetDialogItemAsControl(1)
168n/a h.SetControlTitle(ok)
169n/a if cancel is not None:
170n/a h = d.GetDialogItemAsControl(2)
171n/a h.SetControlTitle(cancel)
172n/a d.SetDialogDefaultItem(Dialogs.ok)
173n/a d.SetDialogCancelItem(Dialogs.cancel)
174n/a d.AutoSizeDialog()
175n/a d.GetDialogWindow().ShowWindow()
176n/a while 1:
177n/a n = ModalDialog(None)
178n/a if n == 1:
179n/a h = d.GetDialogItemAsControl(4)
180n/a return cr2lf(GetControlData(pwd, kControlEditTextPart, kControlEditTextPasswordTag))
181n/a if n == 2: return None
182n/a
183n/adef AskYesNoCancel(question, default = 0, yes=None, no=None, cancel=None, id=262):
184n/a """Display a QUESTION string which can be answered with Yes or No.
185n/a
186n/a Return 1 when the user clicks the Yes button.
187n/a Return 0 when the user clicks the No button.
188n/a Return -1 when the user clicks the Cancel button.
189n/a
190n/a When the user presses Return, the DEFAULT value is returned.
191n/a If omitted, this is 0 (No).
192n/a
193n/a The QUESTION string can be at most 255 characters.
194n/a """
195n/a
196n/a _initialize()
197n/a _interact()
198n/a d = GetNewDialog(id, -1)
199n/a if not d:
200n/a print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
201n/a return
202n/a # Button assignments:
203n/a # 1 = default (invisible)
204n/a # 2 = Yes
205n/a # 3 = No
206n/a # 4 = Cancel
207n/a # The question string is item 5
208n/a h = d.GetDialogItemAsControl(5)
209n/a SetDialogItemText(h, lf2cr(question))
210n/a if yes is not None:
211n/a if yes == '':
212n/a d.HideDialogItem(2)
213n/a else:
214n/a h = d.GetDialogItemAsControl(2)
215n/a h.SetControlTitle(yes)
216n/a if no is not None:
217n/a if no == '':
218n/a d.HideDialogItem(3)
219n/a else:
220n/a h = d.GetDialogItemAsControl(3)
221n/a h.SetControlTitle(no)
222n/a if cancel is not None:
223n/a if cancel == '':
224n/a d.HideDialogItem(4)
225n/a else:
226n/a h = d.GetDialogItemAsControl(4)
227n/a h.SetControlTitle(cancel)
228n/a d.SetDialogCancelItem(4)
229n/a if default == 1:
230n/a d.SetDialogDefaultItem(2)
231n/a elif default == 0:
232n/a d.SetDialogDefaultItem(3)
233n/a elif default == -1:
234n/a d.SetDialogDefaultItem(4)
235n/a d.AutoSizeDialog()
236n/a d.GetDialogWindow().ShowWindow()
237n/a while 1:
238n/a n = ModalDialog(None)
239n/a if n == 1: return default
240n/a if n == 2: return 1
241n/a if n == 3: return 0
242n/a if n == 4: return -1
243n/a
244n/a
245n/a
246n/a
247n/ascreenbounds = Qd.GetQDGlobalsScreenBits().bounds
248n/ascreenbounds = screenbounds[0]+4, screenbounds[1]+4, \
249n/a screenbounds[2]-4, screenbounds[3]-4
250n/a
251n/akControlProgressBarIndeterminateTag = 'inde' # from Controls.py
252n/a
253n/a
254n/aclass ProgressBar:
255n/a def __init__(self, title="Working...", maxval=0, label="", id=263):
256n/a self.w = None
257n/a self.d = None
258n/a _initialize()
259n/a self.d = GetNewDialog(id, -1)
260n/a self.w = self.d.GetDialogWindow()
261n/a self.label(label)
262n/a self.title(title)
263n/a self.set(0, maxval)
264n/a self.d.AutoSizeDialog()
265n/a self.w.ShowWindow()
266n/a self.d.DrawDialog()
267n/a
268n/a def __del__(self):
269n/a if self.w:
270n/a self.w.BringToFront()
271n/a self.w.HideWindow()
272n/a del self.w
273n/a del self.d
274n/a
275n/a def title(self, newstr=""):
276n/a """title(text) - Set title of progress window"""
277n/a self.w.BringToFront()
278n/a self.w.SetWTitle(newstr)
279n/a
280n/a def label(self, *newstr):
281n/a """label(text) - Set text in progress box"""
282n/a self.w.BringToFront()
283n/a if newstr:
284n/a self._label = lf2cr(newstr[0])
285n/a text_h = self.d.GetDialogItemAsControl(2)
286n/a SetDialogItemText(text_h, self._label)
287n/a
288n/a def _update(self, value):
289n/a maxval = self.maxval
290n/a if maxval == 0: # an indeterminate bar
291n/a Ctl.IdleControls(self.w) # spin the barber pole
292n/a else: # a determinate bar
293n/a if maxval > 32767:
294n/a value = int(value/(maxval/32767.0))
295n/a maxval = 32767
296n/a maxval = int(maxval)
297n/a value = int(value)
298n/a progbar = self.d.GetDialogItemAsControl(3)
299n/a progbar.SetControlMaximum(maxval)
300n/a progbar.SetControlValue(value) # set the bar length
301n/a
302n/a # Test for cancel button
303n/a ready, ev = Evt.WaitNextEvent( Events.mDownMask, 1 )
304n/a if ready :
305n/a what,msg,when,where,mod = ev
306n/a part = Win.FindWindow(where)[0]
307n/a if Dlg.IsDialogEvent(ev):
308n/a ds = Dlg.DialogSelect(ev)
309n/a if ds[0] and ds[1] == self.d and ds[-1] == 1:
310n/a self.w.HideWindow()
311n/a self.w = None
312n/a self.d = None
313n/a raise KeyboardInterrupt, ev
314n/a else:
315n/a if part == 4: # inDrag
316n/a self.w.DragWindow(where, screenbounds)
317n/a else:
318n/a MacOS.HandleEvent(ev)
319n/a
320n/a
321n/a def set(self, value, max=None):
322n/a """set(value) - Set progress bar position"""
323n/a if max is not None:
324n/a self.maxval = max
325n/a bar = self.d.GetDialogItemAsControl(3)
326n/a if max <= 0: # indeterminate bar
327n/a bar.SetControlData(0,kControlProgressBarIndeterminateTag,'\x01')
328n/a else: # determinate bar
329n/a bar.SetControlData(0,kControlProgressBarIndeterminateTag,'\x00')
330n/a if value < 0:
331n/a value = 0
332n/a elif value > self.maxval:
333n/a value = self.maxval
334n/a self.curval = value
335n/a self._update(value)
336n/a
337n/a def inc(self, n=1):
338n/a """inc(amt) - Increment progress bar position"""
339n/a self.set(self.curval + n)
340n/a
341n/aARGV_ID=265
342n/aARGV_ITEM_OK=1
343n/aARGV_ITEM_CANCEL=2
344n/aARGV_OPTION_GROUP=3
345n/aARGV_OPTION_EXPLAIN=4
346n/aARGV_OPTION_VALUE=5
347n/aARGV_OPTION_ADD=6
348n/aARGV_COMMAND_GROUP=7
349n/aARGV_COMMAND_EXPLAIN=8
350n/aARGV_COMMAND_ADD=9
351n/aARGV_ADD_OLDFILE=10
352n/aARGV_ADD_NEWFILE=11
353n/aARGV_ADD_FOLDER=12
354n/aARGV_CMDLINE_GROUP=13
355n/aARGV_CMDLINE_DATA=14
356n/a
357n/a##def _myModalDialog(d):
358n/a## while 1:
359n/a## ready, ev = Evt.WaitNextEvent(0xffff, -1)
360n/a## print 'DBG: WNE', ready, ev
361n/a## if ready :
362n/a## what,msg,when,where,mod = ev
363n/a## part, window = Win.FindWindow(where)
364n/a## if Dlg.IsDialogEvent(ev):
365n/a## didit, dlgdone, itemdone = Dlg.DialogSelect(ev)
366n/a## print 'DBG: DialogSelect', didit, dlgdone, itemdone, d
367n/a## if didit and dlgdone == d:
368n/a## return itemdone
369n/a## elif window == d.GetDialogWindow():
370n/a## d.GetDialogWindow().SelectWindow()
371n/a## if part == 4: # inDrag
372n/a## d.DragWindow(where, screenbounds)
373n/a## else:
374n/a## MacOS.HandleEvent(ev)
375n/a## else:
376n/a## MacOS.HandleEvent(ev)
377n/a##
378n/adef _setmenu(control, items):
379n/a mhandle = control.GetControlData_Handle(Controls.kControlMenuPart,
380n/a Controls.kControlPopupButtonMenuHandleTag)
381n/a menu = Menu.as_Menu(mhandle)
382n/a for item in items:
383n/a if type(item) == type(()):
384n/a label = item[0]
385n/a else:
386n/a label = item
387n/a if label[-1] == '=' or label[-1] == ':':
388n/a label = label[:-1]
389n/a menu.AppendMenu(label)
390n/a## mhandle, mid = menu.getpopupinfo()
391n/a## control.SetControlData_Handle(Controls.kControlMenuPart,
392n/a## Controls.kControlPopupButtonMenuHandleTag, mhandle)
393n/a control.SetControlMinimum(1)
394n/a control.SetControlMaximum(len(items)+1)
395n/a
396n/adef _selectoption(d, optionlist, idx):
397n/a if idx < 0 or idx >= len(optionlist):
398n/a MacOS.SysBeep()
399n/a return
400n/a option = optionlist[idx]
401n/a if type(option) == type(()):
402n/a if len(option) == 4:
403n/a help = option[2]
404n/a elif len(option) > 1:
405n/a help = option[-1]
406n/a else:
407n/a help = ''
408n/a else:
409n/a help = ''
410n/a h = d.GetDialogItemAsControl(ARGV_OPTION_EXPLAIN)
411n/a if help and len(help) > 250:
412n/a help = help[:250] + '...'
413n/a Dlg.SetDialogItemText(h, help)
414n/a hasvalue = 0
415n/a if type(option) == type(()):
416n/a label = option[0]
417n/a else:
418n/a label = option
419n/a if label[-1] == '=' or label[-1] == ':':
420n/a hasvalue = 1
421n/a h = d.GetDialogItemAsControl(ARGV_OPTION_VALUE)
422n/a Dlg.SetDialogItemText(h, '')
423n/a if hasvalue:
424n/a d.ShowDialogItem(ARGV_OPTION_VALUE)
425n/a d.SelectDialogItemText(ARGV_OPTION_VALUE, 0, 0)
426n/a else:
427n/a d.HideDialogItem(ARGV_OPTION_VALUE)
428n/a
429n/a
430n/adef GetArgv(optionlist=None, commandlist=None, addoldfile=1, addnewfile=1, addfolder=1, id=ARGV_ID):
431n/a _initialize()
432n/a _interact()
433n/a d = GetNewDialog(id, -1)
434n/a if not d:
435n/a print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
436n/a return
437n/a# h = d.GetDialogItemAsControl(3)
438n/a# SetDialogItemText(h, lf2cr(prompt))
439n/a# h = d.GetDialogItemAsControl(4)
440n/a# SetDialogItemText(h, lf2cr(default))
441n/a# d.SelectDialogItemText(4, 0, 999)
442n/a# d.SetDialogItem(4, 0, 255)
443n/a if optionlist:
444n/a _setmenu(d.GetDialogItemAsControl(ARGV_OPTION_GROUP), optionlist)
445n/a _selectoption(d, optionlist, 0)
446n/a else:
447n/a d.GetDialogItemAsControl(ARGV_OPTION_GROUP).DeactivateControl()
448n/a if commandlist:
449n/a _setmenu(d.GetDialogItemAsControl(ARGV_COMMAND_GROUP), commandlist)
450n/a if type(commandlist[0]) == type(()) and len(commandlist[0]) > 1:
451n/a help = commandlist[0][-1]
452n/a h = d.GetDialogItemAsControl(ARGV_COMMAND_EXPLAIN)
453n/a Dlg.SetDialogItemText(h, help)
454n/a else:
455n/a d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).DeactivateControl()
456n/a if not addoldfile:
457n/a d.GetDialogItemAsControl(ARGV_ADD_OLDFILE).DeactivateControl()
458n/a if not addnewfile:
459n/a d.GetDialogItemAsControl(ARGV_ADD_NEWFILE).DeactivateControl()
460n/a if not addfolder:
461n/a d.GetDialogItemAsControl(ARGV_ADD_FOLDER).DeactivateControl()
462n/a d.SetDialogDefaultItem(ARGV_ITEM_OK)
463n/a d.SetDialogCancelItem(ARGV_ITEM_CANCEL)
464n/a d.GetDialogWindow().ShowWindow()
465n/a d.DrawDialog()
466n/a if hasattr(MacOS, 'SchedParams'):
467n/a appsw = MacOS.SchedParams(1, 0)
468n/a try:
469n/a while 1:
470n/a stringstoadd = []
471n/a n = ModalDialog(None)
472n/a if n == ARGV_ITEM_OK:
473n/a break
474n/a elif n == ARGV_ITEM_CANCEL:
475n/a raise SystemExit
476n/a elif n == ARGV_OPTION_GROUP:
477n/a idx = d.GetDialogItemAsControl(ARGV_OPTION_GROUP).GetControlValue()-1
478n/a _selectoption(d, optionlist, idx)
479n/a elif n == ARGV_OPTION_VALUE:
480n/a pass
481n/a elif n == ARGV_OPTION_ADD:
482n/a idx = d.GetDialogItemAsControl(ARGV_OPTION_GROUP).GetControlValue()-1
483n/a if 0 <= idx < len(optionlist):
484n/a option = optionlist[idx]
485n/a if type(option) == type(()):
486n/a option = option[0]
487n/a if option[-1] == '=' or option[-1] == ':':
488n/a option = option[:-1]
489n/a h = d.GetDialogItemAsControl(ARGV_OPTION_VALUE)
490n/a value = Dlg.GetDialogItemText(h)
491n/a else:
492n/a value = ''
493n/a if len(option) == 1:
494n/a stringtoadd = '-' + option
495n/a else:
496n/a stringtoadd = '--' + option
497n/a stringstoadd = [stringtoadd]
498n/a if value:
499n/a stringstoadd.append(value)
500n/a else:
501n/a MacOS.SysBeep()
502n/a elif n == ARGV_COMMAND_GROUP:
503n/a idx = d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).GetControlValue()-1
504n/a if 0 <= idx < len(commandlist) and type(commandlist[idx]) == type(()) and \
505n/a len(commandlist[idx]) > 1:
506n/a help = commandlist[idx][-1]
507n/a h = d.GetDialogItemAsControl(ARGV_COMMAND_EXPLAIN)
508n/a Dlg.SetDialogItemText(h, help)
509n/a elif n == ARGV_COMMAND_ADD:
510n/a idx = d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).GetControlValue()-1
511n/a if 0 <= idx < len(commandlist):
512n/a command = commandlist[idx]
513n/a if type(command) == type(()):
514n/a command = command[0]
515n/a stringstoadd = [command]
516n/a else:
517n/a MacOS.SysBeep()
518n/a elif n == ARGV_ADD_OLDFILE:
519n/a pathname = AskFileForOpen()
520n/a if pathname:
521n/a stringstoadd = [pathname]
522n/a elif n == ARGV_ADD_NEWFILE:
523n/a pathname = AskFileForSave()
524n/a if pathname:
525n/a stringstoadd = [pathname]
526n/a elif n == ARGV_ADD_FOLDER:
527n/a pathname = AskFolder()
528n/a if pathname:
529n/a stringstoadd = [pathname]
530n/a elif n == ARGV_CMDLINE_DATA:
531n/a pass # Nothing to do
532n/a else:
533n/a raise RuntimeError, "Unknown dialog item %d"%n
534n/a
535n/a for stringtoadd in stringstoadd:
536n/a if '"' in stringtoadd or "'" in stringtoadd or " " in stringtoadd:
537n/a stringtoadd = repr(stringtoadd)
538n/a h = d.GetDialogItemAsControl(ARGV_CMDLINE_DATA)
539n/a oldstr = GetDialogItemText(h)
540n/a if oldstr and oldstr[-1] != ' ':
541n/a oldstr = oldstr + ' '
542n/a oldstr = oldstr + stringtoadd
543n/a if oldstr[-1] != ' ':
544n/a oldstr = oldstr + ' '
545n/a SetDialogItemText(h, oldstr)
546n/a d.SelectDialogItemText(ARGV_CMDLINE_DATA, 0x7fff, 0x7fff)
547n/a h = d.GetDialogItemAsControl(ARGV_CMDLINE_DATA)
548n/a oldstr = GetDialogItemText(h)
549n/a tmplist = string.split(oldstr)
550n/a newlist = []
551n/a while tmplist:
552n/a item = tmplist[0]
553n/a del tmplist[0]
554n/a if item[0] == '"':
555n/a while item[-1] != '"':
556n/a if not tmplist:
557n/a raise RuntimeError, "Unterminated quoted argument"
558n/a item = item + ' ' + tmplist[0]
559n/a del tmplist[0]
560n/a item = item[1:-1]
561n/a if item[0] == "'":
562n/a while item[-1] != "'":
563n/a if not tmplist:
564n/a raise RuntimeError, "Unterminated quoted argument"
565n/a item = item + ' ' + tmplist[0]
566n/a del tmplist[0]
567n/a item = item[1:-1]
568n/a newlist.append(item)
569n/a return newlist
570n/a finally:
571n/a if hasattr(MacOS, 'SchedParams'):
572n/a MacOS.SchedParams(*appsw)
573n/a del d
574n/a
575n/adef _process_Nav_args(dftflags, **args):
576n/a import Carbon.AppleEvents
577n/a import Carbon.AE
578n/a import Carbon.File
579n/a for k in args.keys():
580n/a if args[k] is None:
581n/a del args[k]
582n/a # Set some defaults, and modify some arguments
583n/a if 'dialogOptionFlags' not in args:
584n/a args['dialogOptionFlags'] = dftflags
585n/a if 'defaultLocation' in args and \
586n/a not isinstance(args['defaultLocation'], Carbon.AE.AEDesc):
587n/a defaultLocation = args['defaultLocation']
588n/a if isinstance(defaultLocation, Carbon.File.FSSpec):
589n/a args['defaultLocation'] = Carbon.AE.AECreateDesc(
590n/a Carbon.AppleEvents.typeFSS, defaultLocation.data)
591n/a else:
592n/a if not isinstance(defaultLocation, Carbon.File.FSRef):
593n/a defaultLocation = Carbon.File.FSRef(defaultLocation)
594n/a args['defaultLocation'] = Carbon.AE.AECreateDesc(
595n/a Carbon.AppleEvents.typeFSRef, defaultLocation.data)
596n/a if 'typeList' in args and not isinstance(args['typeList'], Carbon.Res.ResourceType):
597n/a typeList = args['typeList'][:]
598n/a # Workaround for OSX typeless files:
599n/a if 'TEXT' in typeList and not '\0\0\0\0' in typeList:
600n/a typeList = typeList + ('\0\0\0\0',)
601n/a data = 'Pyth' + struct.pack("hh", 0, len(typeList))
602n/a for type in typeList:
603n/a data = data+type
604n/a args['typeList'] = Carbon.Res.Handle(data)
605n/a tpwanted = str
606n/a if 'wanted' in args:
607n/a tpwanted = args['wanted']
608n/a del args['wanted']
609n/a return args, tpwanted
610n/a
611n/adef _dummy_Nav_eventproc(msg, data):
612n/a pass
613n/a
614n/a_default_Nav_eventproc = _dummy_Nav_eventproc
615n/a
616n/adef SetDefaultEventProc(proc):
617n/a global _default_Nav_eventproc
618n/a rv = _default_Nav_eventproc
619n/a if proc is None:
620n/a proc = _dummy_Nav_eventproc
621n/a _default_Nav_eventproc = proc
622n/a return rv
623n/a
624n/adef AskFileForOpen(
625n/a message=None,
626n/a typeList=None,
627n/a # From here on the order is not documented
628n/a version=None,
629n/a defaultLocation=None,
630n/a dialogOptionFlags=None,
631n/a location=None,
632n/a clientName=None,
633n/a windowTitle=None,
634n/a actionButtonLabel=None,
635n/a cancelButtonLabel=None,
636n/a preferenceKey=None,
637n/a popupExtension=None,
638n/a eventProc=_dummy_Nav_eventproc,
639n/a previewProc=None,
640n/a filterProc=None,
641n/a wanted=None,
642n/a multiple=None):
643n/a """Display a dialog asking the user for a file to open.
644n/a
645n/a wanted is the return type wanted: FSSpec, FSRef, unicode or string (default)
646n/a the other arguments can be looked up in Apple's Navigation Services documentation"""
647n/a
648n/a default_flags = 0x56 # Or 0xe4?
649n/a args, tpwanted = _process_Nav_args(default_flags, version=version,
650n/a defaultLocation=defaultLocation, dialogOptionFlags=dialogOptionFlags,
651n/a location=location,clientName=clientName,windowTitle=windowTitle,
652n/a actionButtonLabel=actionButtonLabel,cancelButtonLabel=cancelButtonLabel,
653n/a message=message,preferenceKey=preferenceKey,
654n/a popupExtension=popupExtension,eventProc=eventProc,previewProc=previewProc,
655n/a filterProc=filterProc,typeList=typeList,wanted=wanted,multiple=multiple)
656n/a _interact()
657n/a try:
658n/a rr = Nav.NavChooseFile(args)
659n/a good = 1
660n/a except Nav.error, arg:
661n/a if arg[0] != -128: # userCancelledErr
662n/a raise Nav.error, arg
663n/a return None
664n/a if not rr.validRecord or not rr.selection:
665n/a return None
666n/a if issubclass(tpwanted, Carbon.File.FSRef):
667n/a return tpwanted(rr.selection_fsr[0])
668n/a if issubclass(tpwanted, Carbon.File.FSSpec):
669n/a return tpwanted(rr.selection[0])
670n/a if issubclass(tpwanted, str):
671n/a return tpwanted(rr.selection_fsr[0].as_pathname())
672n/a if issubclass(tpwanted, unicode):
673n/a return tpwanted(rr.selection_fsr[0].as_pathname(), 'utf8')
674n/a raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted)
675n/a
676n/adef AskFileForSave(
677n/a message=None,
678n/a savedFileName=None,
679n/a # From here on the order is not documented
680n/a version=None,
681n/a defaultLocation=None,
682n/a dialogOptionFlags=None,
683n/a location=None,
684n/a clientName=None,
685n/a windowTitle=None,
686n/a actionButtonLabel=None,
687n/a cancelButtonLabel=None,
688n/a preferenceKey=None,
689n/a popupExtension=None,
690n/a eventProc=_dummy_Nav_eventproc,
691n/a fileType=None,
692n/a fileCreator=None,
693n/a wanted=None,
694n/a multiple=None):
695n/a """Display a dialog asking the user for a filename to save to.
696n/a
697n/a wanted is the return type wanted: FSSpec, FSRef, unicode or string (default)
698n/a the other arguments can be looked up in Apple's Navigation Services documentation"""
699n/a
700n/a
701n/a default_flags = 0x07
702n/a args, tpwanted = _process_Nav_args(default_flags, version=version,
703n/a defaultLocation=defaultLocation, dialogOptionFlags=dialogOptionFlags,
704n/a location=location,clientName=clientName,windowTitle=windowTitle,
705n/a actionButtonLabel=actionButtonLabel,cancelButtonLabel=cancelButtonLabel,
706n/a savedFileName=savedFileName,message=message,preferenceKey=preferenceKey,
707n/a popupExtension=popupExtension,eventProc=eventProc,fileType=fileType,
708n/a fileCreator=fileCreator,wanted=wanted,multiple=multiple)
709n/a _interact()
710n/a try:
711n/a rr = Nav.NavPutFile(args)
712n/a good = 1
713n/a except Nav.error, arg:
714n/a if arg[0] != -128: # userCancelledErr
715n/a raise Nav.error, arg
716n/a return None
717n/a if not rr.validRecord or not rr.selection:
718n/a return None
719n/a if issubclass(tpwanted, Carbon.File.FSRef):
720n/a raise TypeError, "Cannot pass wanted=FSRef to AskFileForSave"
721n/a if issubclass(tpwanted, Carbon.File.FSSpec):
722n/a return tpwanted(rr.selection[0])
723n/a if issubclass(tpwanted, (str, unicode)):
724n/a # This is gross, and probably incorrect too
725n/a vrefnum, dirid, name = rr.selection[0].as_tuple()
726n/a pardir_fss = Carbon.File.FSSpec((vrefnum, dirid, ''))
727n/a pardir_fsr = Carbon.File.FSRef(pardir_fss)
728n/a pardir_path = pardir_fsr.FSRefMakePath() # This is utf-8
729n/a name_utf8 = unicode(name, 'macroman').encode('utf8')
730n/a fullpath = os.path.join(pardir_path, name_utf8)
731n/a if issubclass(tpwanted, unicode):
732n/a return unicode(fullpath, 'utf8')
733n/a return tpwanted(fullpath)
734n/a raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted)
735n/a
736n/adef AskFolder(
737n/a message=None,
738n/a # From here on the order is not documented
739n/a version=None,
740n/a defaultLocation=None,
741n/a dialogOptionFlags=None,
742n/a location=None,
743n/a clientName=None,
744n/a windowTitle=None,
745n/a actionButtonLabel=None,
746n/a cancelButtonLabel=None,
747n/a preferenceKey=None,
748n/a popupExtension=None,
749n/a eventProc=_dummy_Nav_eventproc,
750n/a filterProc=None,
751n/a wanted=None,
752n/a multiple=None):
753n/a """Display a dialog asking the user for select a folder.
754n/a
755n/a wanted is the return type wanted: FSSpec, FSRef, unicode or string (default)
756n/a the other arguments can be looked up in Apple's Navigation Services documentation"""
757n/a
758n/a default_flags = 0x17
759n/a args, tpwanted = _process_Nav_args(default_flags, version=version,
760n/a defaultLocation=defaultLocation, dialogOptionFlags=dialogOptionFlags,
761n/a location=location,clientName=clientName,windowTitle=windowTitle,
762n/a actionButtonLabel=actionButtonLabel,cancelButtonLabel=cancelButtonLabel,
763n/a message=message,preferenceKey=preferenceKey,
764n/a popupExtension=popupExtension,eventProc=eventProc,filterProc=filterProc,
765n/a wanted=wanted,multiple=multiple)
766n/a _interact()
767n/a try:
768n/a rr = Nav.NavChooseFolder(args)
769n/a good = 1
770n/a except Nav.error, arg:
771n/a if arg[0] != -128: # userCancelledErr
772n/a raise Nav.error, arg
773n/a return None
774n/a if not rr.validRecord or not rr.selection:
775n/a return None
776n/a if issubclass(tpwanted, Carbon.File.FSRef):
777n/a return tpwanted(rr.selection_fsr[0])
778n/a if issubclass(tpwanted, Carbon.File.FSSpec):
779n/a return tpwanted(rr.selection[0])
780n/a if issubclass(tpwanted, str):
781n/a return tpwanted(rr.selection_fsr[0].as_pathname())
782n/a if issubclass(tpwanted, unicode):
783n/a return tpwanted(rr.selection_fsr[0].as_pathname(), 'utf8')
784n/a raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted)
785n/a
786n/a
787n/adef test():
788n/a import time
789n/a
790n/a Message("Testing EasyDialogs.")
791n/a optionlist = (('v', 'Verbose'), ('verbose', 'Verbose as long option'),
792n/a ('flags=', 'Valued option'), ('f:', 'Short valued option'))
793n/a commandlist = (('start', 'Start something'), ('stop', 'Stop something'))
794n/a argv = GetArgv(optionlist=optionlist, commandlist=commandlist, addoldfile=0)
795n/a Message("Command line: %s"%' '.join(argv))
796n/a for i in range(len(argv)):
797n/a print 'arg[%d] = %r' % (i, argv[i])
798n/a ok = AskYesNoCancel("Do you want to proceed?")
799n/a ok = AskYesNoCancel("Do you want to identify?", yes="Identify", no="No")
800n/a if ok > 0:
801n/a s = AskString("Enter your first name", "Joe")
802n/a s2 = AskPassword("Okay %s, tell us your nickname"%s, s, cancel="None")
803n/a if not s2:
804n/a Message("%s has no secret nickname"%s)
805n/a else:
806n/a Message("Hello everybody!!\nThe secret nickname of %s is %s!!!"%(s, s2))
807n/a else:
808n/a s = 'Anonymous'
809n/a rv = AskFileForOpen(message="Gimme a file, %s"%s, wanted=Carbon.File.FSSpec)
810n/a Message("rv: %s"%rv)
811n/a rv = AskFileForSave(wanted=Carbon.File.FSRef, savedFileName="%s.txt"%s)
812n/a Message("rv.as_pathname: %s"%rv.as_pathname())
813n/a rv = AskFolder()
814n/a Message("Folder name: %s"%rv)
815n/a text = ( "Working Hard...", "Hardly Working..." ,
816n/a "So far, so good!", "Keep on truckin'" )
817n/a bar = ProgressBar("Progress, progress...", 0, label="Ramping up...")
818n/a try:
819n/a if hasattr(MacOS, 'SchedParams'):
820n/a appsw = MacOS.SchedParams(1, 0)
821n/a for i in xrange(20):
822n/a bar.inc()
823n/a time.sleep(0.05)
824n/a bar.set(0,100)
825n/a for i in xrange(100):
826n/a bar.set(i)
827n/a time.sleep(0.05)
828n/a if i % 10 == 0:
829n/a bar.label(text[(i/10) % 4])
830n/a bar.label("Done.")
831n/a time.sleep(1.0) # give'em a chance to see "Done."
832n/a finally:
833n/a del bar
834n/a if hasattr(MacOS, 'SchedParams'):
835n/a MacOS.SchedParams(*appsw)
836n/a
837n/aif __name__ == '__main__':
838n/a try:
839n/a test()
840n/a except KeyboardInterrupt:
841n/a Message("Operation Canceled.")