--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/symbian-qemu-0.9.1-12/python-2.6.1/Lib/plat-mac/EasyDialogs.py Fri Jul 31 15:01:17 2009 +0100
@@ -0,0 +1,841 @@
+"""Easy to use dialogs.
+
+Message(msg) -- display a message and an OK button.
+AskString(prompt, default) -- ask for a string, display OK and Cancel buttons.
+AskPassword(prompt, default) -- like AskString(), but shows text as bullets.
+AskYesNoCancel(question, default) -- display a question and Yes, No and Cancel buttons.
+GetArgv(optionlist, commandlist) -- fill a sys.argv-like list using a dialog
+AskFileForOpen(...) -- Ask the user for an existing file
+AskFileForSave(...) -- Ask the user for an output file
+AskFolder(...) -- Ask the user to select a folder
+bar = Progress(label, maxvalue) -- Display a progress bar
+bar.set(value) -- Set value
+bar.inc( *amount ) -- increment value by amount (default=1)
+bar.label( *newlabel ) -- get or set text label.
+
+More documentation in each function.
+This module uses DLOG resources 260 and on.
+Based upon STDWIN dialogs with the same names and functions.
+"""
+
+from warnings import warnpy3k
+warnpy3k("In 3.x, the EasyDialogs module is removed.", stacklevel=2)
+
+from Carbon.Dlg import GetNewDialog, SetDialogItemText, GetDialogItemText, ModalDialog
+from Carbon import Qd
+from Carbon import QuickDraw
+from Carbon import Dialogs
+from Carbon import Windows
+from Carbon import Dlg,Win,Evt,Events # sdm7g
+from Carbon import Ctl
+from Carbon import Controls
+from Carbon import Menu
+from Carbon import AE
+import Nav
+import MacOS
+import string
+from Carbon.ControlAccessor import * # Also import Controls constants
+import Carbon.File
+import macresource
+import os
+import sys
+
+__all__ = ['Message', 'AskString', 'AskPassword', 'AskYesNoCancel',
+ 'GetArgv', 'AskFileForOpen', 'AskFileForSave', 'AskFolder',
+ 'ProgressBar']
+
+_initialized = 0
+
+def _initialize():
+ global _initialized
+ if _initialized: return
+ macresource.need("DLOG", 260, "dialogs.rsrc", __name__)
+
+def _interact():
+ """Make sure the application is in the foreground"""
+ AE.AEInteractWithUser(50000000)
+
+def cr2lf(text):
+ if '\r' in text:
+ text = string.join(string.split(text, '\r'), '\n')
+ return text
+
+def lf2cr(text):
+ if '\n' in text:
+ text = string.join(string.split(text, '\n'), '\r')
+ if len(text) > 253:
+ text = text[:253] + '\311'
+ return text
+
+def Message(msg, id=260, ok=None):
+ """Display a MESSAGE string.
+
+ Return when the user clicks the OK button or presses Return.
+
+ The MESSAGE string can be at most 255 characters long.
+ """
+ _initialize()
+ _interact()
+ d = GetNewDialog(id, -1)
+ if not d:
+ print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
+ return
+ h = d.GetDialogItemAsControl(2)
+ SetDialogItemText(h, lf2cr(msg))
+ if ok is not None:
+ h = d.GetDialogItemAsControl(1)
+ h.SetControlTitle(ok)
+ d.SetDialogDefaultItem(1)
+ d.AutoSizeDialog()
+ d.GetDialogWindow().ShowWindow()
+ while 1:
+ n = ModalDialog(None)
+ if n == 1:
+ return
+
+
+def AskString(prompt, default = "", id=261, ok=None, cancel=None):
+ """Display a PROMPT string and a text entry field with a DEFAULT string.
+
+ Return the contents of the text entry field when the user clicks the
+ OK button or presses Return.
+ Return None when the user clicks the Cancel button.
+
+ If omitted, DEFAULT is empty.
+
+ The PROMPT and DEFAULT strings, as well as the return value,
+ can be at most 255 characters long.
+ """
+
+ _initialize()
+ _interact()
+ d = GetNewDialog(id, -1)
+ if not d:
+ print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
+ return
+ h = d.GetDialogItemAsControl(3)
+ SetDialogItemText(h, lf2cr(prompt))
+ h = d.GetDialogItemAsControl(4)
+ SetDialogItemText(h, lf2cr(default))
+ d.SelectDialogItemText(4, 0, 999)
+# d.SetDialogItem(4, 0, 255)
+ if ok is not None:
+ h = d.GetDialogItemAsControl(1)
+ h.SetControlTitle(ok)
+ if cancel is not None:
+ h = d.GetDialogItemAsControl(2)
+ h.SetControlTitle(cancel)
+ d.SetDialogDefaultItem(1)
+ d.SetDialogCancelItem(2)
+ d.AutoSizeDialog()
+ d.GetDialogWindow().ShowWindow()
+ while 1:
+ n = ModalDialog(None)
+ if n == 1:
+ h = d.GetDialogItemAsControl(4)
+ return cr2lf(GetDialogItemText(h))
+ if n == 2: return None
+
+def AskPassword(prompt, default='', id=264, ok=None, cancel=None):
+ """Display a PROMPT string and a text entry field with a DEFAULT string.
+ The string is displayed as bullets only.
+
+ Return the contents of the text entry field when the user clicks the
+ OK button or presses Return.
+ Return None when the user clicks the Cancel button.
+
+ If omitted, DEFAULT is empty.
+
+ The PROMPT and DEFAULT strings, as well as the return value,
+ can be at most 255 characters long.
+ """
+ _initialize()
+ _interact()
+ d = GetNewDialog(id, -1)
+ if not d:
+ print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
+ return
+ h = d.GetDialogItemAsControl(3)
+ SetDialogItemText(h, lf2cr(prompt))
+ pwd = d.GetDialogItemAsControl(4)
+ bullets = '\245'*len(default)
+## SetControlData(pwd, kControlEditTextPart, kControlEditTextTextTag, bullets)
+ SetControlData(pwd, kControlEditTextPart, kControlEditTextPasswordTag, default)
+ d.SelectDialogItemText(4, 0, 999)
+ Ctl.SetKeyboardFocus(d.GetDialogWindow(), pwd, kControlEditTextPart)
+ if ok is not None:
+ h = d.GetDialogItemAsControl(1)
+ h.SetControlTitle(ok)
+ if cancel is not None:
+ h = d.GetDialogItemAsControl(2)
+ h.SetControlTitle(cancel)
+ d.SetDialogDefaultItem(Dialogs.ok)
+ d.SetDialogCancelItem(Dialogs.cancel)
+ d.AutoSizeDialog()
+ d.GetDialogWindow().ShowWindow()
+ while 1:
+ n = ModalDialog(None)
+ if n == 1:
+ h = d.GetDialogItemAsControl(4)
+ return cr2lf(GetControlData(pwd, kControlEditTextPart, kControlEditTextPasswordTag))
+ if n == 2: return None
+
+def AskYesNoCancel(question, default = 0, yes=None, no=None, cancel=None, id=262):
+ """Display a QUESTION string which can be answered with Yes or No.
+
+ Return 1 when the user clicks the Yes button.
+ Return 0 when the user clicks the No button.
+ Return -1 when the user clicks the Cancel button.
+
+ When the user presses Return, the DEFAULT value is returned.
+ If omitted, this is 0 (No).
+
+ The QUESTION string can be at most 255 characters.
+ """
+
+ _initialize()
+ _interact()
+ d = GetNewDialog(id, -1)
+ if not d:
+ print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
+ return
+ # Button assignments:
+ # 1 = default (invisible)
+ # 2 = Yes
+ # 3 = No
+ # 4 = Cancel
+ # The question string is item 5
+ h = d.GetDialogItemAsControl(5)
+ SetDialogItemText(h, lf2cr(question))
+ if yes is not None:
+ if yes == '':
+ d.HideDialogItem(2)
+ else:
+ h = d.GetDialogItemAsControl(2)
+ h.SetControlTitle(yes)
+ if no is not None:
+ if no == '':
+ d.HideDialogItem(3)
+ else:
+ h = d.GetDialogItemAsControl(3)
+ h.SetControlTitle(no)
+ if cancel is not None:
+ if cancel == '':
+ d.HideDialogItem(4)
+ else:
+ h = d.GetDialogItemAsControl(4)
+ h.SetControlTitle(cancel)
+ d.SetDialogCancelItem(4)
+ if default == 1:
+ d.SetDialogDefaultItem(2)
+ elif default == 0:
+ d.SetDialogDefaultItem(3)
+ elif default == -1:
+ d.SetDialogDefaultItem(4)
+ d.AutoSizeDialog()
+ d.GetDialogWindow().ShowWindow()
+ while 1:
+ n = ModalDialog(None)
+ if n == 1: return default
+ if n == 2: return 1
+ if n == 3: return 0
+ if n == 4: return -1
+
+
+
+
+screenbounds = Qd.GetQDGlobalsScreenBits().bounds
+screenbounds = screenbounds[0]+4, screenbounds[1]+4, \
+ screenbounds[2]-4, screenbounds[3]-4
+
+kControlProgressBarIndeterminateTag = 'inde' # from Controls.py
+
+
+class ProgressBar:
+ def __init__(self, title="Working...", maxval=0, label="", id=263):
+ self.w = None
+ self.d = None
+ _initialize()
+ self.d = GetNewDialog(id, -1)
+ self.w = self.d.GetDialogWindow()
+ self.label(label)
+ self.title(title)
+ self.set(0, maxval)
+ self.d.AutoSizeDialog()
+ self.w.ShowWindow()
+ self.d.DrawDialog()
+
+ def __del__(self):
+ if self.w:
+ self.w.BringToFront()
+ self.w.HideWindow()
+ del self.w
+ del self.d
+
+ def title(self, newstr=""):
+ """title(text) - Set title of progress window"""
+ self.w.BringToFront()
+ self.w.SetWTitle(newstr)
+
+ def label(self, *newstr):
+ """label(text) - Set text in progress box"""
+ self.w.BringToFront()
+ if newstr:
+ self._label = lf2cr(newstr[0])
+ text_h = self.d.GetDialogItemAsControl(2)
+ SetDialogItemText(text_h, self._label)
+
+ def _update(self, value):
+ maxval = self.maxval
+ if maxval == 0: # an indeterminate bar
+ Ctl.IdleControls(self.w) # spin the barber pole
+ else: # a determinate bar
+ if maxval > 32767:
+ value = int(value/(maxval/32767.0))
+ maxval = 32767
+ maxval = int(maxval)
+ value = int(value)
+ progbar = self.d.GetDialogItemAsControl(3)
+ progbar.SetControlMaximum(maxval)
+ progbar.SetControlValue(value) # set the bar length
+
+ # Test for cancel button
+ ready, ev = Evt.WaitNextEvent( Events.mDownMask, 1 )
+ if ready :
+ what,msg,when,where,mod = ev
+ part = Win.FindWindow(where)[0]
+ if Dlg.IsDialogEvent(ev):
+ ds = Dlg.DialogSelect(ev)
+ if ds[0] and ds[1] == self.d and ds[-1] == 1:
+ self.w.HideWindow()
+ self.w = None
+ self.d = None
+ raise KeyboardInterrupt, ev
+ else:
+ if part == 4: # inDrag
+ self.w.DragWindow(where, screenbounds)
+ else:
+ MacOS.HandleEvent(ev)
+
+
+ def set(self, value, max=None):
+ """set(value) - Set progress bar position"""
+ if max is not None:
+ self.maxval = max
+ bar = self.d.GetDialogItemAsControl(3)
+ if max <= 0: # indeterminate bar
+ bar.SetControlData(0,kControlProgressBarIndeterminateTag,'\x01')
+ else: # determinate bar
+ bar.SetControlData(0,kControlProgressBarIndeterminateTag,'\x00')
+ if value < 0:
+ value = 0
+ elif value > self.maxval:
+ value = self.maxval
+ self.curval = value
+ self._update(value)
+
+ def inc(self, n=1):
+ """inc(amt) - Increment progress bar position"""
+ self.set(self.curval + n)
+
+ARGV_ID=265
+ARGV_ITEM_OK=1
+ARGV_ITEM_CANCEL=2
+ARGV_OPTION_GROUP=3
+ARGV_OPTION_EXPLAIN=4
+ARGV_OPTION_VALUE=5
+ARGV_OPTION_ADD=6
+ARGV_COMMAND_GROUP=7
+ARGV_COMMAND_EXPLAIN=8
+ARGV_COMMAND_ADD=9
+ARGV_ADD_OLDFILE=10
+ARGV_ADD_NEWFILE=11
+ARGV_ADD_FOLDER=12
+ARGV_CMDLINE_GROUP=13
+ARGV_CMDLINE_DATA=14
+
+##def _myModalDialog(d):
+## while 1:
+## ready, ev = Evt.WaitNextEvent(0xffff, -1)
+## print 'DBG: WNE', ready, ev
+## if ready :
+## what,msg,when,where,mod = ev
+## part, window = Win.FindWindow(where)
+## if Dlg.IsDialogEvent(ev):
+## didit, dlgdone, itemdone = Dlg.DialogSelect(ev)
+## print 'DBG: DialogSelect', didit, dlgdone, itemdone, d
+## if didit and dlgdone == d:
+## return itemdone
+## elif window == d.GetDialogWindow():
+## d.GetDialogWindow().SelectWindow()
+## if part == 4: # inDrag
+## d.DragWindow(where, screenbounds)
+## else:
+## MacOS.HandleEvent(ev)
+## else:
+## MacOS.HandleEvent(ev)
+##
+def _setmenu(control, items):
+ mhandle = control.GetControlData_Handle(Controls.kControlMenuPart,
+ Controls.kControlPopupButtonMenuHandleTag)
+ menu = Menu.as_Menu(mhandle)
+ for item in items:
+ if type(item) == type(()):
+ label = item[0]
+ else:
+ label = item
+ if label[-1] == '=' or label[-1] == ':':
+ label = label[:-1]
+ menu.AppendMenu(label)
+## mhandle, mid = menu.getpopupinfo()
+## control.SetControlData_Handle(Controls.kControlMenuPart,
+## Controls.kControlPopupButtonMenuHandleTag, mhandle)
+ control.SetControlMinimum(1)
+ control.SetControlMaximum(len(items)+1)
+
+def _selectoption(d, optionlist, idx):
+ if idx < 0 or idx >= len(optionlist):
+ MacOS.SysBeep()
+ return
+ option = optionlist[idx]
+ if type(option) == type(()):
+ if len(option) == 4:
+ help = option[2]
+ elif len(option) > 1:
+ help = option[-1]
+ else:
+ help = ''
+ else:
+ help = ''
+ h = d.GetDialogItemAsControl(ARGV_OPTION_EXPLAIN)
+ if help and len(help) > 250:
+ help = help[:250] + '...'
+ Dlg.SetDialogItemText(h, help)
+ hasvalue = 0
+ if type(option) == type(()):
+ label = option[0]
+ else:
+ label = option
+ if label[-1] == '=' or label[-1] == ':':
+ hasvalue = 1
+ h = d.GetDialogItemAsControl(ARGV_OPTION_VALUE)
+ Dlg.SetDialogItemText(h, '')
+ if hasvalue:
+ d.ShowDialogItem(ARGV_OPTION_VALUE)
+ d.SelectDialogItemText(ARGV_OPTION_VALUE, 0, 0)
+ else:
+ d.HideDialogItem(ARGV_OPTION_VALUE)
+
+
+def GetArgv(optionlist=None, commandlist=None, addoldfile=1, addnewfile=1, addfolder=1, id=ARGV_ID):
+ _initialize()
+ _interact()
+ d = GetNewDialog(id, -1)
+ if not d:
+ print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
+ return
+# h = d.GetDialogItemAsControl(3)
+# SetDialogItemText(h, lf2cr(prompt))
+# h = d.GetDialogItemAsControl(4)
+# SetDialogItemText(h, lf2cr(default))
+# d.SelectDialogItemText(4, 0, 999)
+# d.SetDialogItem(4, 0, 255)
+ if optionlist:
+ _setmenu(d.GetDialogItemAsControl(ARGV_OPTION_GROUP), optionlist)
+ _selectoption(d, optionlist, 0)
+ else:
+ d.GetDialogItemAsControl(ARGV_OPTION_GROUP).DeactivateControl()
+ if commandlist:
+ _setmenu(d.GetDialogItemAsControl(ARGV_COMMAND_GROUP), commandlist)
+ if type(commandlist[0]) == type(()) and len(commandlist[0]) > 1:
+ help = commandlist[0][-1]
+ h = d.GetDialogItemAsControl(ARGV_COMMAND_EXPLAIN)
+ Dlg.SetDialogItemText(h, help)
+ else:
+ d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).DeactivateControl()
+ if not addoldfile:
+ d.GetDialogItemAsControl(ARGV_ADD_OLDFILE).DeactivateControl()
+ if not addnewfile:
+ d.GetDialogItemAsControl(ARGV_ADD_NEWFILE).DeactivateControl()
+ if not addfolder:
+ d.GetDialogItemAsControl(ARGV_ADD_FOLDER).DeactivateControl()
+ d.SetDialogDefaultItem(ARGV_ITEM_OK)
+ d.SetDialogCancelItem(ARGV_ITEM_CANCEL)
+ d.GetDialogWindow().ShowWindow()
+ d.DrawDialog()
+ if hasattr(MacOS, 'SchedParams'):
+ appsw = MacOS.SchedParams(1, 0)
+ try:
+ while 1:
+ stringstoadd = []
+ n = ModalDialog(None)
+ if n == ARGV_ITEM_OK:
+ break
+ elif n == ARGV_ITEM_CANCEL:
+ raise SystemExit
+ elif n == ARGV_OPTION_GROUP:
+ idx = d.GetDialogItemAsControl(ARGV_OPTION_GROUP).GetControlValue()-1
+ _selectoption(d, optionlist, idx)
+ elif n == ARGV_OPTION_VALUE:
+ pass
+ elif n == ARGV_OPTION_ADD:
+ idx = d.GetDialogItemAsControl(ARGV_OPTION_GROUP).GetControlValue()-1
+ if 0 <= idx < len(optionlist):
+ option = optionlist[idx]
+ if type(option) == type(()):
+ option = option[0]
+ if option[-1] == '=' or option[-1] == ':':
+ option = option[:-1]
+ h = d.GetDialogItemAsControl(ARGV_OPTION_VALUE)
+ value = Dlg.GetDialogItemText(h)
+ else:
+ value = ''
+ if len(option) == 1:
+ stringtoadd = '-' + option
+ else:
+ stringtoadd = '--' + option
+ stringstoadd = [stringtoadd]
+ if value:
+ stringstoadd.append(value)
+ else:
+ MacOS.SysBeep()
+ elif n == ARGV_COMMAND_GROUP:
+ idx = d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).GetControlValue()-1
+ if 0 <= idx < len(commandlist) and type(commandlist[idx]) == type(()) and \
+ len(commandlist[idx]) > 1:
+ help = commandlist[idx][-1]
+ h = d.GetDialogItemAsControl(ARGV_COMMAND_EXPLAIN)
+ Dlg.SetDialogItemText(h, help)
+ elif n == ARGV_COMMAND_ADD:
+ idx = d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).GetControlValue()-1
+ if 0 <= idx < len(commandlist):
+ command = commandlist[idx]
+ if type(command) == type(()):
+ command = command[0]
+ stringstoadd = [command]
+ else:
+ MacOS.SysBeep()
+ elif n == ARGV_ADD_OLDFILE:
+ pathname = AskFileForOpen()
+ if pathname:
+ stringstoadd = [pathname]
+ elif n == ARGV_ADD_NEWFILE:
+ pathname = AskFileForSave()
+ if pathname:
+ stringstoadd = [pathname]
+ elif n == ARGV_ADD_FOLDER:
+ pathname = AskFolder()
+ if pathname:
+ stringstoadd = [pathname]
+ elif n == ARGV_CMDLINE_DATA:
+ pass # Nothing to do
+ else:
+ raise RuntimeError, "Unknown dialog item %d"%n
+
+ for stringtoadd in stringstoadd:
+ if '"' in stringtoadd or "'" in stringtoadd or " " in stringtoadd:
+ stringtoadd = repr(stringtoadd)
+ h = d.GetDialogItemAsControl(ARGV_CMDLINE_DATA)
+ oldstr = GetDialogItemText(h)
+ if oldstr and oldstr[-1] != ' ':
+ oldstr = oldstr + ' '
+ oldstr = oldstr + stringtoadd
+ if oldstr[-1] != ' ':
+ oldstr = oldstr + ' '
+ SetDialogItemText(h, oldstr)
+ d.SelectDialogItemText(ARGV_CMDLINE_DATA, 0x7fff, 0x7fff)
+ h = d.GetDialogItemAsControl(ARGV_CMDLINE_DATA)
+ oldstr = GetDialogItemText(h)
+ tmplist = string.split(oldstr)
+ newlist = []
+ while tmplist:
+ item = tmplist[0]
+ del tmplist[0]
+ if item[0] == '"':
+ while item[-1] != '"':
+ if not tmplist:
+ raise RuntimeError, "Unterminated quoted argument"
+ item = item + ' ' + tmplist[0]
+ del tmplist[0]
+ item = item[1:-1]
+ if item[0] == "'":
+ while item[-1] != "'":
+ if not tmplist:
+ raise RuntimeError, "Unterminated quoted argument"
+ item = item + ' ' + tmplist[0]
+ del tmplist[0]
+ item = item[1:-1]
+ newlist.append(item)
+ return newlist
+ finally:
+ if hasattr(MacOS, 'SchedParams'):
+ MacOS.SchedParams(*appsw)
+ del d
+
+def _process_Nav_args(dftflags, **args):
+ import aepack
+ import Carbon.AE
+ import Carbon.File
+ for k in args.keys():
+ if args[k] is None:
+ del args[k]
+ # Set some defaults, and modify some arguments
+ if not args.has_key('dialogOptionFlags'):
+ args['dialogOptionFlags'] = dftflags
+ if args.has_key('defaultLocation') and \
+ not isinstance(args['defaultLocation'], Carbon.AE.AEDesc):
+ defaultLocation = args['defaultLocation']
+ if isinstance(defaultLocation, (Carbon.File.FSSpec, Carbon.File.FSRef)):
+ args['defaultLocation'] = aepack.pack(defaultLocation)
+ else:
+ defaultLocation = Carbon.File.FSRef(defaultLocation)
+ args['defaultLocation'] = aepack.pack(defaultLocation)
+ if args.has_key('typeList') and not isinstance(args['typeList'], Carbon.Res.ResourceType):
+ typeList = args['typeList'][:]
+ # Workaround for OSX typeless files:
+ if 'TEXT' in typeList and not '\0\0\0\0' in typeList:
+ typeList = typeList + ('\0\0\0\0',)
+ data = 'Pyth' + struct.pack("hh", 0, len(typeList))
+ for type in typeList:
+ data = data+type
+ args['typeList'] = Carbon.Res.Handle(data)
+ tpwanted = str
+ if args.has_key('wanted'):
+ tpwanted = args['wanted']
+ del args['wanted']
+ return args, tpwanted
+
+def _dummy_Nav_eventproc(msg, data):
+ pass
+
+_default_Nav_eventproc = _dummy_Nav_eventproc
+
+def SetDefaultEventProc(proc):
+ global _default_Nav_eventproc
+ rv = _default_Nav_eventproc
+ if proc is None:
+ proc = _dummy_Nav_eventproc
+ _default_Nav_eventproc = proc
+ return rv
+
+def AskFileForOpen(
+ message=None,
+ typeList=None,
+ # From here on the order is not documented
+ version=None,
+ defaultLocation=None,
+ dialogOptionFlags=None,
+ location=None,
+ clientName=None,
+ windowTitle=None,
+ actionButtonLabel=None,
+ cancelButtonLabel=None,
+ preferenceKey=None,
+ popupExtension=None,
+ eventProc=_dummy_Nav_eventproc,
+ previewProc=None,
+ filterProc=None,
+ wanted=None,
+ multiple=None):
+ """Display a dialog asking the user for a file to open.
+
+ wanted is the return type wanted: FSSpec, FSRef, unicode or string (default)
+ the other arguments can be looked up in Apple's Navigation Services documentation"""
+
+ default_flags = 0x56 # Or 0xe4?
+ args, tpwanted = _process_Nav_args(default_flags, version=version,
+ defaultLocation=defaultLocation, dialogOptionFlags=dialogOptionFlags,
+ location=location,clientName=clientName,windowTitle=windowTitle,
+ actionButtonLabel=actionButtonLabel,cancelButtonLabel=cancelButtonLabel,
+ message=message,preferenceKey=preferenceKey,
+ popupExtension=popupExtension,eventProc=eventProc,previewProc=previewProc,
+ filterProc=filterProc,typeList=typeList,wanted=wanted,multiple=multiple)
+ _interact()
+ try:
+ rr = Nav.NavChooseFile(args)
+ good = 1
+ except Nav.error, arg:
+ if arg[0] != -128: # userCancelledErr
+ raise Nav.error, arg
+ return None
+ if not rr.validRecord or not rr.selection:
+ return None
+ if issubclass(tpwanted, Carbon.File.FSRef):
+ return tpwanted(rr.selection_fsr[0])
+ if issubclass(tpwanted, Carbon.File.FSSpec):
+ return tpwanted(rr.selection[0])
+ if issubclass(tpwanted, str):
+ return tpwanted(rr.selection_fsr[0].as_pathname())
+ if issubclass(tpwanted, unicode):
+ return tpwanted(rr.selection_fsr[0].as_pathname(), 'utf8')
+ raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted)
+
+def AskFileForSave(
+ message=None,
+ savedFileName=None,
+ # From here on the order is not documented
+ version=None,
+ defaultLocation=None,
+ dialogOptionFlags=None,
+ location=None,
+ clientName=None,
+ windowTitle=None,
+ actionButtonLabel=None,
+ cancelButtonLabel=None,
+ preferenceKey=None,
+ popupExtension=None,
+ eventProc=_dummy_Nav_eventproc,
+ fileType=None,
+ fileCreator=None,
+ wanted=None,
+ multiple=None):
+ """Display a dialog asking the user for a filename to save to.
+
+ wanted is the return type wanted: FSSpec, FSRef, unicode or string (default)
+ the other arguments can be looked up in Apple's Navigation Services documentation"""
+
+
+ default_flags = 0x07
+ args, tpwanted = _process_Nav_args(default_flags, version=version,
+ defaultLocation=defaultLocation, dialogOptionFlags=dialogOptionFlags,
+ location=location,clientName=clientName,windowTitle=windowTitle,
+ actionButtonLabel=actionButtonLabel,cancelButtonLabel=cancelButtonLabel,
+ savedFileName=savedFileName,message=message,preferenceKey=preferenceKey,
+ popupExtension=popupExtension,eventProc=eventProc,fileType=fileType,
+ fileCreator=fileCreator,wanted=wanted,multiple=multiple)
+ _interact()
+ try:
+ rr = Nav.NavPutFile(args)
+ good = 1
+ except Nav.error, arg:
+ if arg[0] != -128: # userCancelledErr
+ raise Nav.error, arg
+ return None
+ if not rr.validRecord or not rr.selection:
+ return None
+ if issubclass(tpwanted, Carbon.File.FSRef):
+ raise TypeError, "Cannot pass wanted=FSRef to AskFileForSave"
+ if issubclass(tpwanted, Carbon.File.FSSpec):
+ return tpwanted(rr.selection[0])
+ if issubclass(tpwanted, (str, unicode)):
+ if sys.platform == 'mac':
+ fullpath = rr.selection[0].as_pathname()
+ else:
+ # This is gross, and probably incorrect too
+ vrefnum, dirid, name = rr.selection[0].as_tuple()
+ pardir_fss = Carbon.File.FSSpec((vrefnum, dirid, ''))
+ pardir_fsr = Carbon.File.FSRef(pardir_fss)
+ pardir_path = pardir_fsr.FSRefMakePath() # This is utf-8
+ name_utf8 = unicode(name, 'macroman').encode('utf8')
+ fullpath = os.path.join(pardir_path, name_utf8)
+ if issubclass(tpwanted, unicode):
+ return unicode(fullpath, 'utf8')
+ return tpwanted(fullpath)
+ raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted)
+
+def AskFolder(
+ message=None,
+ # From here on the order is not documented
+ version=None,
+ defaultLocation=None,
+ dialogOptionFlags=None,
+ location=None,
+ clientName=None,
+ windowTitle=None,
+ actionButtonLabel=None,
+ cancelButtonLabel=None,
+ preferenceKey=None,
+ popupExtension=None,
+ eventProc=_dummy_Nav_eventproc,
+ filterProc=None,
+ wanted=None,
+ multiple=None):
+ """Display a dialog asking the user for select a folder.
+
+ wanted is the return type wanted: FSSpec, FSRef, unicode or string (default)
+ the other arguments can be looked up in Apple's Navigation Services documentation"""
+
+ default_flags = 0x17
+ args, tpwanted = _process_Nav_args(default_flags, version=version,
+ defaultLocation=defaultLocation, dialogOptionFlags=dialogOptionFlags,
+ location=location,clientName=clientName,windowTitle=windowTitle,
+ actionButtonLabel=actionButtonLabel,cancelButtonLabel=cancelButtonLabel,
+ message=message,preferenceKey=preferenceKey,
+ popupExtension=popupExtension,eventProc=eventProc,filterProc=filterProc,
+ wanted=wanted,multiple=multiple)
+ _interact()
+ try:
+ rr = Nav.NavChooseFolder(args)
+ good = 1
+ except Nav.error, arg:
+ if arg[0] != -128: # userCancelledErr
+ raise Nav.error, arg
+ return None
+ if not rr.validRecord or not rr.selection:
+ return None
+ if issubclass(tpwanted, Carbon.File.FSRef):
+ return tpwanted(rr.selection_fsr[0])
+ if issubclass(tpwanted, Carbon.File.FSSpec):
+ return tpwanted(rr.selection[0])
+ if issubclass(tpwanted, str):
+ return tpwanted(rr.selection_fsr[0].as_pathname())
+ if issubclass(tpwanted, unicode):
+ return tpwanted(rr.selection_fsr[0].as_pathname(), 'utf8')
+ raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted)
+
+
+def test():
+ import time
+
+ Message("Testing EasyDialogs.")
+ optionlist = (('v', 'Verbose'), ('verbose', 'Verbose as long option'),
+ ('flags=', 'Valued option'), ('f:', 'Short valued option'))
+ commandlist = (('start', 'Start something'), ('stop', 'Stop something'))
+ argv = GetArgv(optionlist=optionlist, commandlist=commandlist, addoldfile=0)
+ Message("Command line: %s"%' '.join(argv))
+ for i in range(len(argv)):
+ print 'arg[%d] = %r' % (i, argv[i])
+ ok = AskYesNoCancel("Do you want to proceed?")
+ ok = AskYesNoCancel("Do you want to identify?", yes="Identify", no="No")
+ if ok > 0:
+ s = AskString("Enter your first name", "Joe")
+ s2 = AskPassword("Okay %s, tell us your nickname"%s, s, cancel="None")
+ if not s2:
+ Message("%s has no secret nickname"%s)
+ else:
+ Message("Hello everybody!!\nThe secret nickname of %s is %s!!!"%(s, s2))
+ else:
+ s = 'Anonymous'
+ rv = AskFileForOpen(message="Gimme a file, %s"%s, wanted=Carbon.File.FSSpec)
+ Message("rv: %s"%rv)
+ rv = AskFileForSave(wanted=Carbon.File.FSRef, savedFileName="%s.txt"%s)
+ Message("rv.as_pathname: %s"%rv.as_pathname())
+ rv = AskFolder()
+ Message("Folder name: %s"%rv)
+ text = ( "Working Hard...", "Hardly Working..." ,
+ "So far, so good!", "Keep on truckin'" )
+ bar = ProgressBar("Progress, progress...", 0, label="Ramping up...")
+ try:
+ if hasattr(MacOS, 'SchedParams'):
+ appsw = MacOS.SchedParams(1, 0)
+ for i in xrange(20):
+ bar.inc()
+ time.sleep(0.05)
+ bar.set(0,100)
+ for i in xrange(100):
+ bar.set(i)
+ time.sleep(0.05)
+ if i % 10 == 0:
+ bar.label(text[(i/10) % 4])
+ bar.label("Done.")
+ time.sleep(1.0) # give'em a chance to see "Done."
+ finally:
+ del bar
+ if hasattr(MacOS, 'SchedParams'):
+ MacOS.SchedParams(*appsw)
+
+if __name__ == '__main__':
+ try:
+ test()
+ except KeyboardInterrupt:
+ Message("Operation Canceled.")