Commit 35b50e26 authored by Just van Rossum's avatar Just van Rossum

changed 8-space indentation to 4

parent 9e9a7c3d
...@@ -38,302 +38,302 @@ import os ...@@ -38,302 +38,302 @@ import os
import sys import sys
__all__ = ['Message', 'AskString', 'AskPassword', 'AskYesNoCancel', __all__ = ['Message', 'AskString', 'AskPassword', 'AskYesNoCancel',
'GetArgv', 'AskFileForOpen', 'AskFileForSave', 'AskFolder', 'GetArgv', 'AskFileForOpen', 'AskFileForSave', 'AskFolder',
'ProgressBar'] 'ProgressBar']
_initialized = 0 _initialized = 0
def _initialize(): def _initialize():
global _initialized global _initialized
if _initialized: return if _initialized: return
macresource.need("DLOG", 260, "dialogs.rsrc", __name__) macresource.need("DLOG", 260, "dialogs.rsrc", __name__)
def _interact(): def _interact():
"""Make sure the application is in the foreground""" """Make sure the application is in the foreground"""
AE.AEInteractWithUser(50000000) AE.AEInteractWithUser(50000000)
def cr2lf(text): def cr2lf(text):
if '\r' in text: if '\r' in text:
text = string.join(string.split(text, '\r'), '\n') text = string.join(string.split(text, '\r'), '\n')
return text return text
def lf2cr(text): def lf2cr(text):
if '\n' in text: if '\n' in text:
text = string.join(string.split(text, '\n'), '\r') text = string.join(string.split(text, '\n'), '\r')
if len(text) > 253: if len(text) > 253:
text = text[:253] + '\311' text = text[:253] + '\311'
return text return text
def Message(msg, id=260, ok=None): def Message(msg, id=260, ok=None):
"""Display a MESSAGE string. """Display a MESSAGE string.
Return when the user clicks the OK button or presses Return. Return when the user clicks the OK button or presses Return.
The MESSAGE string can be at most 255 characters long. The MESSAGE string can be at most 255 characters long.
""" """
_initialize() _initialize()
_interact() _interact()
d = GetNewDialog(id, -1) d = GetNewDialog(id, -1)
if not d: if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)" print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
return return
h = d.GetDialogItemAsControl(2) h = d.GetDialogItemAsControl(2)
SetDialogItemText(h, lf2cr(msg)) SetDialogItemText(h, lf2cr(msg))
if ok != None: if ok != None:
h = d.GetDialogItemAsControl(1) h = d.GetDialogItemAsControl(1)
h.SetControlTitle(ok) h.SetControlTitle(ok)
d.SetDialogDefaultItem(1) d.SetDialogDefaultItem(1)
d.AutoSizeDialog() d.AutoSizeDialog()
d.GetDialogWindow().ShowWindow() d.GetDialogWindow().ShowWindow()
while 1: while 1:
n = ModalDialog(None) n = ModalDialog(None)
if n == 1: if n == 1:
return return
def AskString(prompt, default = "", id=261, ok=None, cancel=None): def AskString(prompt, default = "", id=261, ok=None, cancel=None):
"""Display a PROMPT string and a text entry field with a DEFAULT string. """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 Return the contents of the text entry field when the user clicks the
OK button or presses Return. OK button or presses Return.
Return None when the user clicks the Cancel button. Return None when the user clicks the Cancel button.
If omitted, DEFAULT is empty. If omitted, DEFAULT is empty.
The PROMPT and DEFAULT strings, as well as the return value, The PROMPT and DEFAULT strings, as well as the return value,
can be at most 255 characters long. can be at most 255 characters long.
""" """
_initialize() _initialize()
_interact() _interact()
d = GetNewDialog(id, -1) d = GetNewDialog(id, -1)
if not d: if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)" print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
return return
h = d.GetDialogItemAsControl(3) h = d.GetDialogItemAsControl(3)
SetDialogItemText(h, lf2cr(prompt)) SetDialogItemText(h, lf2cr(prompt))
h = d.GetDialogItemAsControl(4) h = d.GetDialogItemAsControl(4)
SetDialogItemText(h, lf2cr(default)) SetDialogItemText(h, lf2cr(default))
d.SelectDialogItemText(4, 0, 999) d.SelectDialogItemText(4, 0, 999)
# d.SetDialogItem(4, 0, 255) # d.SetDialogItem(4, 0, 255)
if ok != None: if ok != None:
h = d.GetDialogItemAsControl(1) h = d.GetDialogItemAsControl(1)
h.SetControlTitle(ok) h.SetControlTitle(ok)
if cancel != None: if cancel != None:
h = d.GetDialogItemAsControl(2) h = d.GetDialogItemAsControl(2)
h.SetControlTitle(cancel) h.SetControlTitle(cancel)
d.SetDialogDefaultItem(1) d.SetDialogDefaultItem(1)
d.SetDialogCancelItem(2) d.SetDialogCancelItem(2)
d.AutoSizeDialog() d.AutoSizeDialog()
d.GetDialogWindow().ShowWindow() d.GetDialogWindow().ShowWindow()
while 1: while 1:
n = ModalDialog(None) n = ModalDialog(None)
if n == 1: if n == 1:
h = d.GetDialogItemAsControl(4) h = d.GetDialogItemAsControl(4)
return cr2lf(GetDialogItemText(h)) return cr2lf(GetDialogItemText(h))
if n == 2: return None if n == 2: return None
def AskPassword(prompt, default='', id=264, ok=None, cancel=None): def AskPassword(prompt, default='', id=264, ok=None, cancel=None):
"""Display a PROMPT string and a text entry field with a DEFAULT string. """Display a PROMPT string and a text entry field with a DEFAULT string.
The string is displayed as bullets only. The string is displayed as bullets only.
Return the contents of the text entry field when the user clicks the Return the contents of the text entry field when the user clicks the
OK button or presses Return. OK button or presses Return.
Return None when the user clicks the Cancel button. Return None when the user clicks the Cancel button.
If omitted, DEFAULT is empty. If omitted, DEFAULT is empty.
The PROMPT and DEFAULT strings, as well as the return value, The PROMPT and DEFAULT strings, as well as the return value,
can be at most 255 characters long. can be at most 255 characters long.
""" """
_initialize() _initialize()
_interact() _interact()
d = GetNewDialog(id, -1) d = GetNewDialog(id, -1)
if not d: if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)" print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
return return
h = d.GetDialogItemAsControl(3) h = d.GetDialogItemAsControl(3)
SetDialogItemText(h, lf2cr(prompt)) SetDialogItemText(h, lf2cr(prompt))
pwd = d.GetDialogItemAsControl(4) pwd = d.GetDialogItemAsControl(4)
bullets = '\245'*len(default) bullets = '\245'*len(default)
## SetControlData(pwd, kControlEditTextPart, kControlEditTextTextTag, bullets) ## SetControlData(pwd, kControlEditTextPart, kControlEditTextTextTag, bullets)
SetControlData(pwd, kControlEditTextPart, kControlEditTextPasswordTag, default) SetControlData(pwd, kControlEditTextPart, kControlEditTextPasswordTag, default)
d.SelectDialogItemText(4, 0, 999) d.SelectDialogItemText(4, 0, 999)
Ctl.SetKeyboardFocus(d.GetDialogWindow(), pwd, kControlEditTextPart) Ctl.SetKeyboardFocus(d.GetDialogWindow(), pwd, kControlEditTextPart)
if ok != None: if ok != None:
h = d.GetDialogItemAsControl(1) h = d.GetDialogItemAsControl(1)
h.SetControlTitle(ok) h.SetControlTitle(ok)
if cancel != None: if cancel != None:
h = d.GetDialogItemAsControl(2) h = d.GetDialogItemAsControl(2)
h.SetControlTitle(cancel) h.SetControlTitle(cancel)
d.SetDialogDefaultItem(Dialogs.ok) d.SetDialogDefaultItem(Dialogs.ok)
d.SetDialogCancelItem(Dialogs.cancel) d.SetDialogCancelItem(Dialogs.cancel)
d.AutoSizeDialog() d.AutoSizeDialog()
d.GetDialogWindow().ShowWindow() d.GetDialogWindow().ShowWindow()
while 1: while 1:
n = ModalDialog(None) n = ModalDialog(None)
if n == 1: if n == 1:
h = d.GetDialogItemAsControl(4) h = d.GetDialogItemAsControl(4)
return cr2lf(GetControlData(pwd, kControlEditTextPart, kControlEditTextPasswordTag)) return cr2lf(GetControlData(pwd, kControlEditTextPart, kControlEditTextPasswordTag))
if n == 2: return None if n == 2: return None
def AskYesNoCancel(question, default = 0, yes=None, no=None, cancel=None, id=262): 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. """Display a QUESTION string which can be answered with Yes or No.
Return 1 when the user clicks the Yes button. Return 1 when the user clicks the Yes button.
Return 0 when the user clicks the No button. Return 0 when the user clicks the No button.
Return -1 when the user clicks the Cancel button. Return -1 when the user clicks the Cancel button.
When the user presses Return, the DEFAULT value is returned. When the user presses Return, the DEFAULT value is returned.
If omitted, this is 0 (No). If omitted, this is 0 (No).
The QUESTION string can be at most 255 characters. The QUESTION string can be at most 255 characters.
""" """
_initialize() _initialize()
_interact() _interact()
d = GetNewDialog(id, -1) d = GetNewDialog(id, -1)
if not d: if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)" print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
return return
# Button assignments: # Button assignments:
# 1 = default (invisible) # 1 = default (invisible)
# 2 = Yes # 2 = Yes
# 3 = No # 3 = No
# 4 = Cancel # 4 = Cancel
# The question string is item 5 # The question string is item 5
h = d.GetDialogItemAsControl(5) h = d.GetDialogItemAsControl(5)
SetDialogItemText(h, lf2cr(question)) SetDialogItemText(h, lf2cr(question))
if yes != None: if yes != None:
if yes == '': if yes == '':
d.HideDialogItem(2) d.HideDialogItem(2)
else: else:
h = d.GetDialogItemAsControl(2) h = d.GetDialogItemAsControl(2)
h.SetControlTitle(yes) h.SetControlTitle(yes)
if no != None: if no != None:
if no == '': if no == '':
d.HideDialogItem(3) d.HideDialogItem(3)
else: else:
h = d.GetDialogItemAsControl(3) h = d.GetDialogItemAsControl(3)
h.SetControlTitle(no) h.SetControlTitle(no)
if cancel != None: if cancel != None:
if cancel == '': if cancel == '':
d.HideDialogItem(4) d.HideDialogItem(4)
else: else:
h = d.GetDialogItemAsControl(4) h = d.GetDialogItemAsControl(4)
h.SetControlTitle(cancel) h.SetControlTitle(cancel)
d.SetDialogCancelItem(4) d.SetDialogCancelItem(4)
if default == 1: if default == 1:
d.SetDialogDefaultItem(2) d.SetDialogDefaultItem(2)
elif default == 0: elif default == 0:
d.SetDialogDefaultItem(3) d.SetDialogDefaultItem(3)
elif default == -1: elif default == -1:
d.SetDialogDefaultItem(4) d.SetDialogDefaultItem(4)
d.AutoSizeDialog() d.AutoSizeDialog()
d.GetDialogWindow().ShowWindow() d.GetDialogWindow().ShowWindow()
while 1: while 1:
n = ModalDialog(None) n = ModalDialog(None)
if n == 1: return default if n == 1: return default
if n == 2: return 1 if n == 2: return 1
if n == 3: return 0 if n == 3: return 0
if n == 4: return -1 if n == 4: return -1
screenbounds = Qd.GetQDGlobalsScreenBits().bounds screenbounds = Qd.GetQDGlobalsScreenBits().bounds
screenbounds = screenbounds[0]+4, screenbounds[1]+4, \ screenbounds = screenbounds[0]+4, screenbounds[1]+4, \
screenbounds[2]-4, screenbounds[3]-4 screenbounds[2]-4, screenbounds[3]-4
kControlProgressBarIndeterminateTag = 'inde' # from Controls.py kControlProgressBarIndeterminateTag = 'inde' # from Controls.py
class ProgressBar: class ProgressBar:
def __init__(self, title="Working...", maxval=0, label="", id=263): def __init__(self, title="Working...", maxval=0, label="", id=263):
self.w = None self.w = None
self.d = None self.d = None
_initialize() _initialize()
self.d = GetNewDialog(id, -1) self.d = GetNewDialog(id, -1)
self.w = self.d.GetDialogWindow() self.w = self.d.GetDialogWindow()
self.label(label) self.label(label)
self.title(title) self.title(title)
self.set(0, maxval) self.set(0, maxval)
self.d.AutoSizeDialog() self.d.AutoSizeDialog()
self.w.ShowWindow() self.w.ShowWindow()
self.d.DrawDialog() self.d.DrawDialog()
def __del__( self ): def __del__( self ):
if self.w: if self.w:
self.w.BringToFront() self.w.BringToFront()
self.w.HideWindow() self.w.HideWindow()
del self.w del self.w
del self.d del self.d
def title(self, newstr=""): def title(self, newstr=""):
"""title(text) - Set title of progress window""" """title(text) - Set title of progress window"""
self.w.BringToFront() self.w.BringToFront()
self.w.SetWTitle(newstr) self.w.SetWTitle(newstr)
def label( self, *newstr ): def label( self, *newstr ):
"""label(text) - Set text in progress box""" """label(text) - Set text in progress box"""
self.w.BringToFront() self.w.BringToFront()
if newstr: if newstr:
self._label = lf2cr(newstr[0]) self._label = lf2cr(newstr[0])
text_h = self.d.GetDialogItemAsControl(2) text_h = self.d.GetDialogItemAsControl(2)
SetDialogItemText(text_h, self._label) SetDialogItemText(text_h, self._label)
def _update(self, value): def _update(self, value):
maxval = self.maxval maxval = self.maxval
if maxval == 0: # an indeterminate bar if maxval == 0: # an indeterminate bar
Ctl.IdleControls(self.w) # spin the barber pole Ctl.IdleControls(self.w) # spin the barber pole
else: # a determinate bar else: # a determinate bar
if maxval > 32767: if maxval > 32767:
value = int(value/(maxval/32767.0)) value = int(value/(maxval/32767.0))
maxval = 32767 maxval = 32767
maxval = int(maxval) maxval = int(maxval)
value = int(value) value = int(value)
progbar = self.d.GetDialogItemAsControl(3) progbar = self.d.GetDialogItemAsControl(3)
progbar.SetControlMaximum(maxval) progbar.SetControlMaximum(maxval)
progbar.SetControlValue(value) # set the bar length progbar.SetControlValue(value) # set the bar length
# Test for cancel button # Test for cancel button
ready, ev = Evt.WaitNextEvent( Events.mDownMask, 1 ) ready, ev = Evt.WaitNextEvent( Events.mDownMask, 1 )
if ready : if ready :
what,msg,when,where,mod = ev what,msg,when,where,mod = ev
part = Win.FindWindow(where)[0] part = Win.FindWindow(where)[0]
if Dlg.IsDialogEvent(ev): if Dlg.IsDialogEvent(ev):
ds = Dlg.DialogSelect(ev) ds = Dlg.DialogSelect(ev)
if ds[0] and ds[1] == self.d and ds[-1] == 1: if ds[0] and ds[1] == self.d and ds[-1] == 1:
self.w.HideWindow() self.w.HideWindow()
self.w = None self.w = None
self.d = None self.d = None
raise KeyboardInterrupt, ev raise KeyboardInterrupt, ev
else: else:
if part == 4: # inDrag if part == 4: # inDrag
self.w.DragWindow(where, screenbounds) self.w.DragWindow(where, screenbounds)
else: else:
MacOS.HandleEvent(ev) MacOS.HandleEvent(ev)
def set(self, value, max=None): def set(self, value, max=None):
"""set(value) - Set progress bar position""" """set(value) - Set progress bar position"""
if max != None: if max != None:
self.maxval = max self.maxval = max
bar = self.d.GetDialogItemAsControl(3) bar = self.d.GetDialogItemAsControl(3)
if max <= 0: # indeterminate bar if max <= 0: # indeterminate bar
bar.SetControlData(0,kControlProgressBarIndeterminateTag,'\x01') bar.SetControlData(0,kControlProgressBarIndeterminateTag,'\x01')
else: # determinate bar else: # determinate bar
bar.SetControlData(0,kControlProgressBarIndeterminateTag,'\x00') bar.SetControlData(0,kControlProgressBarIndeterminateTag,'\x00')
if value < 0: if value < 0:
value = 0 value = 0
elif value > self.maxval: elif value > self.maxval:
value = self.maxval value = self.maxval
self.curval = value self.curval = value
self._update(value) self._update(value)
def inc(self, n=1): def inc(self, n=1):
"""inc(amt) - Increment progress bar position""" """inc(amt) - Increment progress bar position"""
self.set(self.curval + n) self.set(self.curval + n)
ARGV_ID=265 ARGV_ID=265
ARGV_ITEM_OK=1 ARGV_ITEM_OK=1
...@@ -353,487 +353,487 @@ ARGV_CMDLINE_DATA=14 ...@@ -353,487 +353,487 @@ ARGV_CMDLINE_DATA=14
##def _myModalDialog(d): ##def _myModalDialog(d):
## while 1: ## while 1:
## ready, ev = Evt.WaitNextEvent(0xffff, -1) ## ready, ev = Evt.WaitNextEvent(0xffff, -1)
## print 'DBG: WNE', ready, ev ## print 'DBG: WNE', ready, ev
## if ready : ## if ready :
## what,msg,when,where,mod = ev ## what,msg,when,where,mod = ev
## part, window = Win.FindWindow(where) ## part, window = Win.FindWindow(where)
## if Dlg.IsDialogEvent(ev): ## if Dlg.IsDialogEvent(ev):
## didit, dlgdone, itemdone = Dlg.DialogSelect(ev) ## didit, dlgdone, itemdone = Dlg.DialogSelect(ev)
## print 'DBG: DialogSelect', didit, dlgdone, itemdone, d ## print 'DBG: DialogSelect', didit, dlgdone, itemdone, d
## if didit and dlgdone == d: ## if didit and dlgdone == d:
## return itemdone ## return itemdone
## elif window == d.GetDialogWindow(): ## elif window == d.GetDialogWindow():
## d.GetDialogWindow().SelectWindow() ## d.GetDialogWindow().SelectWindow()
## if part == 4: # inDrag ## if part == 4: # inDrag
## d.DragWindow(where, screenbounds) ## d.DragWindow(where, screenbounds)
## else: ## else:
## MacOS.HandleEvent(ev) ## MacOS.HandleEvent(ev)
## else: ## else:
## MacOS.HandleEvent(ev) ## MacOS.HandleEvent(ev)
## ##
def _setmenu(control, items): def _setmenu(control, items):
mhandle = control.GetControlData_Handle(Controls.kControlMenuPart, mhandle = control.GetControlData_Handle(Controls.kControlMenuPart,
Controls.kControlPopupButtonMenuHandleTag) Controls.kControlPopupButtonMenuHandleTag)
menu = Menu.as_Menu(mhandle) menu = Menu.as_Menu(mhandle)
for item in items: for item in items:
if type(item) == type(()): if type(item) == type(()):
label = item[0] label = item[0]
else: else:
label = item label = item
if label[-1] == '=' or label[-1] == ':': if label[-1] == '=' or label[-1] == ':':
label = label[:-1] label = label[:-1]
menu.AppendMenu(label) menu.AppendMenu(label)
## mhandle, mid = menu.getpopupinfo() ## mhandle, mid = menu.getpopupinfo()
## control.SetControlData_Handle(Controls.kControlMenuPart, ## control.SetControlData_Handle(Controls.kControlMenuPart,
## Controls.kControlPopupButtonMenuHandleTag, mhandle) ## Controls.kControlPopupButtonMenuHandleTag, mhandle)
control.SetControlMinimum(1) control.SetControlMinimum(1)
control.SetControlMaximum(len(items)+1) control.SetControlMaximum(len(items)+1)
def _selectoption(d, optionlist, idx): def _selectoption(d, optionlist, idx):
if idx < 0 or idx >= len(optionlist): if idx < 0 or idx >= len(optionlist):
MacOS.SysBeep() MacOS.SysBeep()
return return
option = optionlist[idx] option = optionlist[idx]
if type(option) == type(()): if type(option) == type(()):
if len(option) == 4: if len(option) == 4:
help = option[2] help = option[2]
elif len(option) > 1: elif len(option) > 1:
help = 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: else:
label = option help = ''
if label[-1] == '=' or label[-1] == ':': else:
hasvalue = 1 help = ''
h = d.GetDialogItemAsControl(ARGV_OPTION_VALUE) h = d.GetDialogItemAsControl(ARGV_OPTION_EXPLAIN)
Dlg.SetDialogItemText(h, '') if help and len(help) > 250:
if hasvalue: help = help[:250] + '...'
d.ShowDialogItem(ARGV_OPTION_VALUE) Dlg.SetDialogItemText(h, help)
d.SelectDialogItemText(ARGV_OPTION_VALUE, 0, 0) hasvalue = 0
else: if type(option) == type(()):
d.HideDialogItem(ARGV_OPTION_VALUE) 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): def GetArgv(optionlist=None, commandlist=None, addoldfile=1, addnewfile=1, addfolder=1, id=ARGV_ID):
_initialize() _initialize()
_interact() _interact()
d = GetNewDialog(id, -1) d = GetNewDialog(id, -1)
if not d: if not d:
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)" print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
return return
# h = d.GetDialogItemAsControl(3) # h = d.GetDialogItemAsControl(3)
# SetDialogItemText(h, lf2cr(prompt)) # SetDialogItemText(h, lf2cr(prompt))
# h = d.GetDialogItemAsControl(4) # h = d.GetDialogItemAsControl(4)
# SetDialogItemText(h, lf2cr(default)) # SetDialogItemText(h, lf2cr(default))
# d.SelectDialogItemText(4, 0, 999) # d.SelectDialogItemText(4, 0, 999)
# d.SetDialogItem(4, 0, 255) # d.SetDialogItem(4, 0, 255)
if optionlist: if optionlist:
_setmenu(d.GetDialogItemAsControl(ARGV_OPTION_GROUP), optionlist) _setmenu(d.GetDialogItemAsControl(ARGV_OPTION_GROUP), optionlist)
_selectoption(d, optionlist, 0) _selectoption(d, optionlist, 0)
else: else:
d.GetDialogItemAsControl(ARGV_OPTION_GROUP).DeactivateControl() d.GetDialogItemAsControl(ARGV_OPTION_GROUP).DeactivateControl()
if commandlist: if commandlist:
_setmenu(d.GetDialogItemAsControl(ARGV_COMMAND_GROUP), commandlist) _setmenu(d.GetDialogItemAsControl(ARGV_COMMAND_GROUP), commandlist)
if type(commandlist[0]) == type(()) and len(commandlist[0]) > 1: if type(commandlist[0]) == type(()) and len(commandlist[0]) > 1:
help = commandlist[0][-1] help = commandlist[0][-1]
h = d.GetDialogItemAsControl(ARGV_COMMAND_EXPLAIN) h = d.GetDialogItemAsControl(ARGV_COMMAND_EXPLAIN)
Dlg.SetDialogItemText(h, help) Dlg.SetDialogItemText(h, help)
else: else:
d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).DeactivateControl() d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).DeactivateControl()
if not addoldfile: if not addoldfile:
d.GetDialogItemAsControl(ARGV_ADD_OLDFILE).DeactivateControl() d.GetDialogItemAsControl(ARGV_ADD_OLDFILE).DeactivateControl()
if not addnewfile: if not addnewfile:
d.GetDialogItemAsControl(ARGV_ADD_NEWFILE).DeactivateControl() d.GetDialogItemAsControl(ARGV_ADD_NEWFILE).DeactivateControl()
if not addfolder: if not addfolder:
d.GetDialogItemAsControl(ARGV_ADD_FOLDER).DeactivateControl() d.GetDialogItemAsControl(ARGV_ADD_FOLDER).DeactivateControl()
d.SetDialogDefaultItem(ARGV_ITEM_OK) d.SetDialogDefaultItem(ARGV_ITEM_OK)
d.SetDialogCancelItem(ARGV_ITEM_CANCEL) d.SetDialogCancelItem(ARGV_ITEM_CANCEL)
d.GetDialogWindow().ShowWindow() d.GetDialogWindow().ShowWindow()
d.DrawDialog() d.DrawDialog()
if hasattr(MacOS, 'SchedParams'): if hasattr(MacOS, 'SchedParams'):
appsw = MacOS.SchedParams(1, 0) appsw = MacOS.SchedParams(1, 0)
try: try:
while 1: while 1:
stringstoadd = [] stringstoadd = []
n = ModalDialog(None) n = ModalDialog(None)
if n == ARGV_ITEM_OK: if n == ARGV_ITEM_OK:
break break
elif n == ARGV_ITEM_CANCEL: elif n == ARGV_ITEM_CANCEL:
raise SystemExit raise SystemExit
elif n == ARGV_OPTION_GROUP: elif n == ARGV_OPTION_GROUP:
idx = d.GetDialogItemAsControl(ARGV_OPTION_GROUP).GetControlValue()-1 idx = d.GetDialogItemAsControl(ARGV_OPTION_GROUP).GetControlValue()-1
_selectoption(d, optionlist, idx) _selectoption(d, optionlist, idx)
elif n == ARGV_OPTION_VALUE: elif n == ARGV_OPTION_VALUE:
pass pass
elif n == ARGV_OPTION_ADD: elif n == ARGV_OPTION_ADD:
idx = d.GetDialogItemAsControl(ARGV_OPTION_GROUP).GetControlValue()-1 idx = d.GetDialogItemAsControl(ARGV_OPTION_GROUP).GetControlValue()-1
if 0 <= idx < len(optionlist): if 0 <= idx < len(optionlist):
option = optionlist[idx] option = optionlist[idx]
if type(option) == type(()): if type(option) == type(()):
option = option[0] option = option[0]
if option[-1] == '=' or option[-1] == ':': if option[-1] == '=' or option[-1] == ':':
option = option[:-1] option = option[:-1]
h = d.GetDialogItemAsControl(ARGV_OPTION_VALUE) h = d.GetDialogItemAsControl(ARGV_OPTION_VALUE)
value = Dlg.GetDialogItemText(h) value = Dlg.GetDialogItemText(h)
else: else:
value = '' value = ''
if len(option) == 1: if len(option) == 1:
stringtoadd = '-' + option stringtoadd = '-' + option
else: else:
stringtoadd = '--' + option stringtoadd = '--' + option
stringstoadd = [stringtoadd] stringstoadd = [stringtoadd]
if value: if value:
stringstoadd.append(value) stringstoadd.append(value)
else: else:
MacOS.SysBeep() MacOS.SysBeep()
elif n == ARGV_COMMAND_GROUP: elif n == ARGV_COMMAND_GROUP:
idx = d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).GetControlValue()-1 idx = d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).GetControlValue()-1
if 0 <= idx < len(commandlist) and type(commandlist[idx]) == type(()) and \ if 0 <= idx < len(commandlist) and type(commandlist[idx]) == type(()) and \
len(commandlist[idx]) > 1: len(commandlist[idx]) > 1:
help = commandlist[idx][-1] help = commandlist[idx][-1]
h = d.GetDialogItemAsControl(ARGV_COMMAND_EXPLAIN) h = d.GetDialogItemAsControl(ARGV_COMMAND_EXPLAIN)
Dlg.SetDialogItemText(h, help) Dlg.SetDialogItemText(h, help)
elif n == ARGV_COMMAND_ADD: elif n == ARGV_COMMAND_ADD:
idx = d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).GetControlValue()-1 idx = d.GetDialogItemAsControl(ARGV_COMMAND_GROUP).GetControlValue()-1
if 0 <= idx < len(commandlist): if 0 <= idx < len(commandlist):
command = commandlist[idx] command = commandlist[idx]
if type(command) == type(()): if type(command) == type(()):
command = command[0] command = command[0]
stringstoadd = [command] stringstoadd = [command]
else: else:
MacOS.SysBeep() MacOS.SysBeep()
elif n == ARGV_ADD_OLDFILE: elif n == ARGV_ADD_OLDFILE:
pathname = AskFileForOpen() pathname = AskFileForOpen()
if pathname: if pathname:
stringstoadd = [pathname] stringstoadd = [pathname]
elif n == ARGV_ADD_NEWFILE: elif n == ARGV_ADD_NEWFILE:
pathname = AskFileForSave() pathname = AskFileForSave()
if pathname: if pathname:
stringstoadd = [pathname] stringstoadd = [pathname]
elif n == ARGV_ADD_FOLDER: elif n == ARGV_ADD_FOLDER:
pathname = AskFolder() pathname = AskFolder()
if pathname: if pathname:
stringstoadd = [pathname] stringstoadd = [pathname]
elif n == ARGV_CMDLINE_DATA: elif n == ARGV_CMDLINE_DATA:
pass # Nothing to do pass # Nothing to do
else: else:
raise RuntimeError, "Unknown dialog item %d"%n raise RuntimeError, "Unknown dialog item %d"%n
for stringtoadd in stringstoadd: for stringtoadd in stringstoadd:
if '"' in stringtoadd or "'" in stringtoadd or " " in stringtoadd: if '"' in stringtoadd or "'" in stringtoadd or " " in stringtoadd:
stringtoadd = `stringtoadd` stringtoadd = `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) h = d.GetDialogItemAsControl(ARGV_CMDLINE_DATA)
oldstr = GetDialogItemText(h) oldstr = GetDialogItemText(h)
tmplist = string.split(oldstr) if oldstr and oldstr[-1] != ' ':
newlist = [] oldstr = oldstr + ' '
while tmplist: oldstr = oldstr + stringtoadd
item = tmplist[0] if oldstr[-1] != ' ':
del tmplist[0] oldstr = oldstr + ' '
if item[0] == '"': SetDialogItemText(h, oldstr)
while item[-1] != '"': d.SelectDialogItemText(ARGV_CMDLINE_DATA, 0x7fff, 0x7fff)
if not tmplist: h = d.GetDialogItemAsControl(ARGV_CMDLINE_DATA)
raise RuntimeError, "Unterminated quoted argument" oldstr = GetDialogItemText(h)
item = item + ' ' + tmplist[0] tmplist = string.split(oldstr)
del tmplist[0] newlist = []
item = item[1:-1] while tmplist:
if item[0] == "'": item = tmplist[0]
while item[-1] != "'": del tmplist[0]
if not tmplist: if item[0] == '"':
raise RuntimeError, "Unterminated quoted argument" while item[-1] != '"':
item = item + ' ' + tmplist[0] if not tmplist:
del tmplist[0] raise RuntimeError, "Unterminated quoted argument"
item = item[1:-1] item = item + ' ' + tmplist[0]
newlist.append(item) del tmplist[0]
return newlist item = item[1:-1]
finally: if item[0] == "'":
if hasattr(MacOS, 'SchedParams'): while item[-1] != "'":
MacOS.SchedParams(*appsw) if not tmplist:
del d 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): def _process_Nav_args(dftflags, **args):
import aepack import aepack
import Carbon.AE import Carbon.AE
import Carbon.File import Carbon.File
for k in args.keys(): for k in args.keys():
if args[k] is None: if args[k] is None:
del args[k] del args[k]
# Set some defaults, and modify some arguments # Set some defaults, and modify some arguments
if not args.has_key('dialogOptionFlags'): if not args.has_key('dialogOptionFlags'):
args['dialogOptionFlags'] = dftflags args['dialogOptionFlags'] = dftflags
if args.has_key('defaultLocation') and \ if args.has_key('defaultLocation') and \
not isinstance(args['defaultLocation'], Carbon.AE.AEDesc): not isinstance(args['defaultLocation'], Carbon.AE.AEDesc):
defaultLocation = args['defaultLocation'] defaultLocation = args['defaultLocation']
if isinstance(defaultLocation, (Carbon.File.FSSpec, Carbon.File.FSRef)): if isinstance(defaultLocation, (Carbon.File.FSSpec, Carbon.File.FSRef)):
args['defaultLocation'] = aepack.pack(defaultLocation) args['defaultLocation'] = aepack.pack(defaultLocation)
else: else:
defaultLocation = Carbon.File.FSRef(defaultLocation) defaultLocation = Carbon.File.FSRef(defaultLocation)
args['defaultLocation'] = aepack.pack(defaultLocation) args['defaultLocation'] = aepack.pack(defaultLocation)
if args.has_key('typeList') and not isinstance(args['typeList'], Carbon.Res.ResourceType): if args.has_key('typeList') and not isinstance(args['typeList'], Carbon.Res.ResourceType):
typeList = args['typeList'][:] typeList = args['typeList'][:]
# Workaround for OSX typeless files: # Workaround for OSX typeless files:
if 'TEXT' in typeList and not '\0\0\0\0' in typeList: if 'TEXT' in typeList and not '\0\0\0\0' in typeList:
typeList = typeList + ('\0\0\0\0',) typeList = typeList + ('\0\0\0\0',)
data = 'Pyth' + struct.pack("hh", 0, len(typeList)) data = 'Pyth' + struct.pack("hh", 0, len(typeList))
for type in typeList: for type in typeList:
data = data+type data = data+type
args['typeList'] = Carbon.Res.Handle(data) args['typeList'] = Carbon.Res.Handle(data)
tpwanted = str tpwanted = str
if args.has_key('wanted'): if args.has_key('wanted'):
tpwanted = args['wanted'] tpwanted = args['wanted']
del args['wanted'] del args['wanted']
return args, tpwanted return args, tpwanted
def _dummy_Nav_eventproc(msg, data): def _dummy_Nav_eventproc(msg, data):
pass pass
_default_Nav_eventproc = _dummy_Nav_eventproc _default_Nav_eventproc = _dummy_Nav_eventproc
def SetDefaultEventProc(proc): def SetDefaultEventProc(proc):
global _default_Nav_eventproc global _default_Nav_eventproc
rv = _default_Nav_eventproc rv = _default_Nav_eventproc
if proc is None: if proc is None:
proc = _dummy_Nav_eventproc proc = _dummy_Nav_eventproc
_default_Nav_eventproc = proc _default_Nav_eventproc = proc
return rv return rv
def AskFileForOpen( def AskFileForOpen(
message=None, message=None,
typeList=None, typeList=None,
# From here on the order is not documented # From here on the order is not documented
version=None, version=None,
defaultLocation=None, defaultLocation=None,
dialogOptionFlags=None, dialogOptionFlags=None,
location=None, location=None,
clientName=None, clientName=None,
windowTitle=None, windowTitle=None,
actionButtonLabel=None, actionButtonLabel=None,
cancelButtonLabel=None, cancelButtonLabel=None,
preferenceKey=None, preferenceKey=None,
popupExtension=None, popupExtension=None,
eventProc=_dummy_Nav_eventproc, eventProc=_dummy_Nav_eventproc,
previewProc=None, previewProc=None,
filterProc=None, filterProc=None,
wanted=None, wanted=None,
multiple=None): multiple=None):
"""Display a dialog asking the user for a file to open. """Display a dialog asking the user for a file to open.
wanted is the return type wanted: FSSpec, FSRef, unicode or string (default) 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""" the other arguments can be looked up in Apple's Navigation Services documentation"""
default_flags = 0x56 # Or 0xe4? default_flags = 0x56 # Or 0xe4?
args, tpwanted = _process_Nav_args(default_flags, version=version, args, tpwanted = _process_Nav_args(default_flags, version=version,
defaultLocation=defaultLocation, dialogOptionFlags=dialogOptionFlags, defaultLocation=defaultLocation, dialogOptionFlags=dialogOptionFlags,
location=location,clientName=clientName,windowTitle=windowTitle, location=location,clientName=clientName,windowTitle=windowTitle,
actionButtonLabel=actionButtonLabel,cancelButtonLabel=cancelButtonLabel, actionButtonLabel=actionButtonLabel,cancelButtonLabel=cancelButtonLabel,
message=message,preferenceKey=preferenceKey, message=message,preferenceKey=preferenceKey,
popupExtension=popupExtension,eventProc=eventProc,previewProc=previewProc, popupExtension=popupExtension,eventProc=eventProc,previewProc=previewProc,
filterProc=filterProc,typeList=typeList,wanted=wanted,multiple=multiple) filterProc=filterProc,typeList=typeList,wanted=wanted,multiple=multiple)
_interact() _interact()
try: try:
rr = Nav.NavChooseFile(args) rr = Nav.NavChooseFile(args)
good = 1 good = 1
except Nav.error, arg: except Nav.error, arg:
if arg[0] != -128: # userCancelledErr if arg[0] != -128: # userCancelledErr
raise Nav.error, arg raise Nav.error, arg
return None return None
if not rr.validRecord or not rr.selection: if not rr.validRecord or not rr.selection:
return None return None
if issubclass(tpwanted, Carbon.File.FSRef): if issubclass(tpwanted, Carbon.File.FSRef):
return tpwanted(rr.selection_fsr[0]) return tpwanted(rr.selection_fsr[0])
if issubclass(tpwanted, Carbon.File.FSSpec): if issubclass(tpwanted, Carbon.File.FSSpec):
return tpwanted(rr.selection[0]) return tpwanted(rr.selection[0])
if issubclass(tpwanted, str): if issubclass(tpwanted, str):
return tpwanted(rr.selection_fsr[0].as_pathname()) return tpwanted(rr.selection_fsr[0].as_pathname())
if issubclass(tpwanted, unicode): if issubclass(tpwanted, unicode):
return tpwanted(rr.selection_fsr[0].as_pathname(), 'utf8') return tpwanted(rr.selection_fsr[0].as_pathname(), 'utf8')
raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted) raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted)
def AskFileForSave( def AskFileForSave(
message=None, message=None,
savedFileName=None, savedFileName=None,
# From here on the order is not documented # From here on the order is not documented
version=None, version=None,
defaultLocation=None, defaultLocation=None,
dialogOptionFlags=None, dialogOptionFlags=None,
location=None, location=None,
clientName=None, clientName=None,
windowTitle=None, windowTitle=None,
actionButtonLabel=None, actionButtonLabel=None,
cancelButtonLabel=None, cancelButtonLabel=None,
preferenceKey=None, preferenceKey=None,
popupExtension=None, popupExtension=None,
eventProc=_dummy_Nav_eventproc, eventProc=_dummy_Nav_eventproc,
fileType=None, fileType=None,
fileCreator=None, fileCreator=None,
wanted=None, wanted=None,
multiple=None): multiple=None):
"""Display a dialog asking the user for a filename to save to. """Display a dialog asking the user for a filename to save to.
wanted is the return type wanted: FSSpec, FSRef, unicode or string (default) 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""" the other arguments can be looked up in Apple's Navigation Services documentation"""
default_flags = 0x07 default_flags = 0x07
args, tpwanted = _process_Nav_args(default_flags, version=version, args, tpwanted = _process_Nav_args(default_flags, version=version,
defaultLocation=defaultLocation, dialogOptionFlags=dialogOptionFlags, defaultLocation=defaultLocation, dialogOptionFlags=dialogOptionFlags,
location=location,clientName=clientName,windowTitle=windowTitle, location=location,clientName=clientName,windowTitle=windowTitle,
actionButtonLabel=actionButtonLabel,cancelButtonLabel=cancelButtonLabel, actionButtonLabel=actionButtonLabel,cancelButtonLabel=cancelButtonLabel,
savedFileName=savedFileName,message=message,preferenceKey=preferenceKey, savedFileName=savedFileName,message=message,preferenceKey=preferenceKey,
popupExtension=popupExtension,eventProc=eventProc,fileType=fileType, popupExtension=popupExtension,eventProc=eventProc,fileType=fileType,
fileCreator=fileCreator,wanted=wanted,multiple=multiple) fileCreator=fileCreator,wanted=wanted,multiple=multiple)
_interact() _interact()
try: try:
rr = Nav.NavPutFile(args) rr = Nav.NavPutFile(args)
good = 1 good = 1
except Nav.error, arg: except Nav.error, arg:
if arg[0] != -128: # userCancelledErr if arg[0] != -128: # userCancelledErr
raise Nav.error, arg raise Nav.error, arg
return None return None
if not rr.validRecord or not rr.selection: if not rr.validRecord or not rr.selection:
return None return None
if issubclass(tpwanted, Carbon.File.FSRef): if issubclass(tpwanted, Carbon.File.FSRef):
raise TypeError, "Cannot pass wanted=FSRef to AskFileForSave" raise TypeError, "Cannot pass wanted=FSRef to AskFileForSave"
if issubclass(tpwanted, Carbon.File.FSSpec): if issubclass(tpwanted, Carbon.File.FSSpec):
return tpwanted(rr.selection[0]) return tpwanted(rr.selection[0])
if issubclass(tpwanted, (str, unicode)): if issubclass(tpwanted, (str, unicode)):
if sys.platform == 'mac': if sys.platform == 'mac':
fullpath = rr.selection[0].as_pathname() fullpath = rr.selection[0].as_pathname()
else: else:
# This is gross, and probably incorrect too # This is gross, and probably incorrect too
vrefnum, dirid, name = rr.selection[0].as_tuple() vrefnum, dirid, name = rr.selection[0].as_tuple()
pardir_fss = Carbon.File.FSSpec((vrefnum, dirid, '')) pardir_fss = Carbon.File.FSSpec((vrefnum, dirid, ''))
pardir_fsr = Carbon.File.FSRef(pardir_fss) pardir_fsr = Carbon.File.FSRef(pardir_fss)
pardir_path = pardir_fsr.FSRefMakePath() # This is utf-8 pardir_path = pardir_fsr.FSRefMakePath() # This is utf-8
name_utf8 = unicode(name, 'macroman').encode('utf8') name_utf8 = unicode(name, 'macroman').encode('utf8')
fullpath = os.path.join(pardir_path, name_utf8) fullpath = os.path.join(pardir_path, name_utf8)
if issubclass(tpwanted, unicode): if issubclass(tpwanted, unicode):
return unicode(fullpath, 'utf8') return unicode(fullpath, 'utf8')
return tpwanted(fullpath) return tpwanted(fullpath)
raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted) raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted)
def AskFolder( def AskFolder(
message=None, message=None,
# From here on the order is not documented # From here on the order is not documented
version=None, version=None,
defaultLocation=None, defaultLocation=None,
dialogOptionFlags=None, dialogOptionFlags=None,
location=None, location=None,
clientName=None, clientName=None,
windowTitle=None, windowTitle=None,
actionButtonLabel=None, actionButtonLabel=None,
cancelButtonLabel=None, cancelButtonLabel=None,
preferenceKey=None, preferenceKey=None,
popupExtension=None, popupExtension=None,
eventProc=_dummy_Nav_eventproc, eventProc=_dummy_Nav_eventproc,
filterProc=None, filterProc=None,
wanted=None, wanted=None,
multiple=None): multiple=None):
"""Display a dialog asking the user for select a folder. """Display a dialog asking the user for select a folder.
wanted is the return type wanted: FSSpec, FSRef, unicode or string (default) 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""" the other arguments can be looked up in Apple's Navigation Services documentation"""
default_flags = 0x17 default_flags = 0x17
args, tpwanted = _process_Nav_args(default_flags, version=version, args, tpwanted = _process_Nav_args(default_flags, version=version,
defaultLocation=defaultLocation, dialogOptionFlags=dialogOptionFlags, defaultLocation=defaultLocation, dialogOptionFlags=dialogOptionFlags,
location=location,clientName=clientName,windowTitle=windowTitle, location=location,clientName=clientName,windowTitle=windowTitle,
actionButtonLabel=actionButtonLabel,cancelButtonLabel=cancelButtonLabel, actionButtonLabel=actionButtonLabel,cancelButtonLabel=cancelButtonLabel,
message=message,preferenceKey=preferenceKey, message=message,preferenceKey=preferenceKey,
popupExtension=popupExtension,eventProc=eventProc,filterProc=filterProc, popupExtension=popupExtension,eventProc=eventProc,filterProc=filterProc,
wanted=wanted,multiple=multiple) wanted=wanted,multiple=multiple)
_interact() _interact()
try: try:
rr = Nav.NavChooseFolder(args) rr = Nav.NavChooseFolder(args)
good = 1 good = 1
except Nav.error, arg: except Nav.error, arg:
if arg[0] != -128: # userCancelledErr if arg[0] != -128: # userCancelledErr
raise Nav.error, arg raise Nav.error, arg
return None return None
if not rr.validRecord or not rr.selection: if not rr.validRecord or not rr.selection:
return None return None
if issubclass(tpwanted, Carbon.File.FSRef): if issubclass(tpwanted, Carbon.File.FSRef):
return tpwanted(rr.selection_fsr[0]) return tpwanted(rr.selection_fsr[0])
if issubclass(tpwanted, Carbon.File.FSSpec): if issubclass(tpwanted, Carbon.File.FSSpec):
return tpwanted(rr.selection[0]) return tpwanted(rr.selection[0])
if issubclass(tpwanted, str): if issubclass(tpwanted, str):
return tpwanted(rr.selection_fsr[0].as_pathname()) return tpwanted(rr.selection_fsr[0].as_pathname())
if issubclass(tpwanted, unicode): if issubclass(tpwanted, unicode):
return tpwanted(rr.selection_fsr[0].as_pathname(), 'utf8') return tpwanted(rr.selection_fsr[0].as_pathname(), 'utf8')
raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted) raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted)
def test(): def test():
import time import time
Message("Testing EasyDialogs.") Message("Testing EasyDialogs.")
optionlist = (('v', 'Verbose'), ('verbose', 'Verbose as long option'), optionlist = (('v', 'Verbose'), ('verbose', 'Verbose as long option'),
('flags=', 'Valued option'), ('f:', 'Short valued option')) ('flags=', 'Valued option'), ('f:', 'Short valued option'))
commandlist = (('start', 'Start something'), ('stop', 'Stop something')) commandlist = (('start', 'Start something'), ('stop', 'Stop something'))
argv = GetArgv(optionlist=optionlist, commandlist=commandlist, addoldfile=0) argv = GetArgv(optionlist=optionlist, commandlist=commandlist, addoldfile=0)
Message("Command line: %s"%' '.join(argv)) Message("Command line: %s"%' '.join(argv))
for i in range(len(argv)): for i in range(len(argv)):
print 'arg[%d] = %s'%(i, `argv[i]`) print 'arg[%d] = %s'%(i, `argv[i]`)
ok = AskYesNoCancel("Do you want to proceed?") ok = AskYesNoCancel("Do you want to proceed?")
ok = AskYesNoCancel("Do you want to identify?", yes="Identify", no="No") ok = AskYesNoCancel("Do you want to identify?", yes="Identify", no="No")
if ok > 0: if ok > 0:
s = AskString("Enter your first name", "Joe") s = AskString("Enter your first name", "Joe")
s2 = AskPassword("Okay %s, tell us your nickname"%s, s, cancel="None") s2 = AskPassword("Okay %s, tell us your nickname"%s, s, cancel="None")
if not s2: if not s2:
Message("%s has no secret nickname"%s) Message("%s has no secret nickname"%s)
else:
Message("Hello everybody!!\nThe secret nickname of %s is %s!!!"%(s, s2))
else: else:
s = 'Anonymous' Message("Hello everybody!!\nThe secret nickname of %s is %s!!!"%(s, s2))
rv = AskFileForOpen(message="Gimme a file, %s"%s, wanted=Carbon.File.FSSpec) else:
Message("rv: %s"%rv) s = 'Anonymous'
rv = AskFileForSave(wanted=Carbon.File.FSRef, savedFileName="%s.txt"%s) rv = AskFileForOpen(message="Gimme a file, %s"%s, wanted=Carbon.File.FSSpec)
Message("rv.as_pathname: %s"%rv.as_pathname()) Message("rv: %s"%rv)
rv = AskFolder() rv = AskFileForSave(wanted=Carbon.File.FSRef, savedFileName="%s.txt"%s)
Message("Folder name: %s"%rv) Message("rv.as_pathname: %s"%rv.as_pathname())
text = ( "Working Hard...", "Hardly Working..." , rv = AskFolder()
"So far, so good!", "Keep on truckin'" ) Message("Folder name: %s"%rv)
bar = ProgressBar("Progress, progress...", 0, label="Ramping up...") text = ( "Working Hard...", "Hardly Working..." ,
try: "So far, so good!", "Keep on truckin'" )
if hasattr(MacOS, 'SchedParams'): bar = ProgressBar("Progress, progress...", 0, label="Ramping up...")
appsw = MacOS.SchedParams(1, 0) try:
for i in xrange(20): if hasattr(MacOS, 'SchedParams'):
bar.inc() appsw = MacOS.SchedParams(1, 0)
time.sleep(0.05) for i in xrange(20):
bar.set(0,100) bar.inc()
for i in xrange(100): time.sleep(0.05)
bar.set(i) bar.set(0,100)
time.sleep(0.05) for i in xrange(100):
if i % 10 == 0: bar.set(i)
bar.label(text[(i/10) % 4]) time.sleep(0.05)
bar.label("Done.") if i % 10 == 0:
time.sleep(1.0) # give'em a chance to see "Done." bar.label(text[(i/10) % 4])
finally: bar.label("Done.")
del bar time.sleep(1.0) # give'em a chance to see "Done."
if hasattr(MacOS, 'SchedParams'): finally:
MacOS.SchedParams(*appsw) del bar
if hasattr(MacOS, 'SchedParams'):
MacOS.SchedParams(*appsw)
if __name__ == '__main__': if __name__ == '__main__':
try: try:
test() test()
except KeyboardInterrupt: except KeyboardInterrupt:
Message("Operation Canceled.") Message("Operation Canceled.")
...@@ -29,12 +29,12 @@ import types ...@@ -29,12 +29,12 @@ import types
import EasyDialogs import EasyDialogs
try: try:
MyFrontWindow = FrontNonFloatingWindow MyFrontWindow = FrontNonFloatingWindow
except NameError: except NameError:
MyFrontWindow = FrontWindow MyFrontWindow = FrontWindow
kHighLevelEvent = 23 # Don't know what header file this should come from kHighLevelEvent = 23 # Don't know what header file this should come from
SCROLLBARWIDTH = 16 # Again, not a clue... SCROLLBARWIDTH = 16 # Again, not a clue...
# Trick to forestall a set of SIOUX menus being added to our menubar # Trick to forestall a set of SIOUX menus being added to our menubar
SIOUX_APPLEMENU_ID=32000 SIOUX_APPLEMENU_ID=32000
...@@ -70,1054 +70,1054 @@ partname[8] = 'inZoomOut' ...@@ -70,1054 +70,1054 @@ partname[8] = 'inZoomOut'
# ## but what happens with multiple screens? jvr # ## but what happens with multiple screens? jvr
screenbounds = GetQDGlobalsScreenBits().bounds screenbounds = GetQDGlobalsScreenBits().bounds
screenbounds = screenbounds[0]+4, screenbounds[1]+4, \ screenbounds = screenbounds[0]+4, screenbounds[1]+4, \
screenbounds[2]-4, screenbounds[3]-4 screenbounds[2]-4, screenbounds[3]-4
next_window_x = 16 # jvr next_window_x = 16 # jvr
next_window_y = 44 # jvr next_window_y = 44 # jvr
def windowbounds(width, height): def windowbounds(width, height):
"Return sensible window bounds" "Return sensible window bounds"
global next_window_x, next_window_y global next_window_x, next_window_y
r, b = next_window_x+width, next_window_y+height r, b = next_window_x+width, next_window_y+height
if r > screenbounds[2]: if r > screenbounds[2]:
next_window_x = 16 next_window_x = 16
if b > screenbounds[3]: if b > screenbounds[3]:
next_window_y = 44 next_window_y = 44
l, t = next_window_x, next_window_y l, t = next_window_x, next_window_y
r, b = next_window_x+width, next_window_y+height r, b = next_window_x+width, next_window_y+height
next_window_x, next_window_y = next_window_x + 8, next_window_y + 20 # jvr next_window_x, next_window_y = next_window_x + 8, next_window_y + 20 # jvr
return l, t, r, b return l, t, r, b
_watch = None _watch = None
def setwatchcursor(): def setwatchcursor():
global _watch global _watch
if _watch == None: if _watch == None:
_watch = GetCursor(4).data _watch = GetCursor(4).data
SetCursor(_watch) SetCursor(_watch)
def setarrowcursor(): def setarrowcursor():
SetCursor(GetQDGlobalsArrow()) SetCursor(GetQDGlobalsArrow())
class Application: class Application:
"Application framework -- your application should be a derived class" "Application framework -- your application should be a derived class"
def __init__(self, nomenubar=0): def __init__(self, nomenubar=0):
self._doing_asyncevents = 0 self._doing_asyncevents = 0
self.quitting = 0 self.quitting = 0
self.needmenubarredraw = 0 self.needmenubarredraw = 0
self._windows = {} self._windows = {}
self._helpmenu = None self._helpmenu = None
if nomenubar: if nomenubar:
self.menubar = None self.menubar = None
else: else:
self.makemenubar() self.makemenubar()
def __del__(self): def __del__(self):
if self._doing_asyncevents: if self._doing_asyncevents:
self._doing_asyncevents = 0 self._doing_asyncevents = 0
MacOS.SetEventHandler() MacOS.SetEventHandler()
def makemenubar(self): def makemenubar(self):
self.menubar = MenuBar(self) self.menubar = MenuBar(self)
AppleMenu(self.menubar, self.getabouttext(), self.do_about) AppleMenu(self.menubar, self.getabouttext(), self.do_about)
self.makeusermenus() self.makeusermenus()
def makeusermenus(self): def makeusermenus(self):
self.filemenu = m = Menu(self.menubar, "File") self.filemenu = m = Menu(self.menubar, "File")
self._quititem = MenuItem(m, "Quit", "Q", self._quit) self._quititem = MenuItem(m, "Quit", "Q", self._quit)
def gethelpmenu(self): def gethelpmenu(self):
if self._helpmenu == None: if self._helpmenu == None:
self._helpmenu = HelpMenu(self.menubar) self._helpmenu = HelpMenu(self.menubar)
return self._helpmenu return self._helpmenu
def _quit(self, *args): def _quit(self, *args):
self.quitting = 1 self.quitting = 1
def cleanup(self): def cleanup(self):
for w in self._windows.values(): for w in self._windows.values():
w.do_close() w.do_close()
return self._windows == {} return self._windows == {}
def appendwindow(self, wid, window): def appendwindow(self, wid, window):
self._windows[wid] = window self._windows[wid] = window
def removewindow(self, wid): def removewindow(self, wid):
del self._windows[wid] del self._windows[wid]
def getabouttext(self): def getabouttext(self):
return "About %s..." % self.__class__.__name__ return "About %s..." % self.__class__.__name__
def do_about(self, id, item, window, event): def do_about(self, id, item, window, event):
EasyDialogs.Message("Hello, world!" + "\015(%s)" % self.__class__.__name__) EasyDialogs.Message("Hello, world!" + "\015(%s)" % self.__class__.__name__)
# The main event loop is broken up in several simple steps. # The main event loop is broken up in several simple steps.
# This is done so you can override each individual part, # This is done so you can override each individual part,
# if you have a need to do extra processing independent of the # if you have a need to do extra processing independent of the
# event type. # event type.
# Normally, however, you'd just define handlers for individual # Normally, however, you'd just define handlers for individual
# events. # events.
schedparams = (0, 0) # By default disable Python's event handling schedparams = (0, 0) # By default disable Python's event handling
default_wait = None # By default we wait GetCaretTime in WaitNextEvent default_wait = None # By default we wait GetCaretTime in WaitNextEvent
def mainloop(self, mask = everyEvent, wait = None): def mainloop(self, mask = everyEvent, wait = None):
self.quitting = 0 self.quitting = 0
if hasattr(MacOS, 'SchedParams'): if hasattr(MacOS, 'SchedParams'):
saveparams = MacOS.SchedParams(*self.schedparams) saveparams = MacOS.SchedParams(*self.schedparams)
try:
while not self.quitting:
try: try:
while not self.quitting: self.do1event(mask, wait)
try: except (Application, SystemExit):
self.do1event(mask, wait) # Note: the raising of "self" is old-fashioned idiom to
except (Application, SystemExit): # exit the mainloop. Calling _quit() is better for new
# Note: the raising of "self" is old-fashioned idiom to # applications.
# exit the mainloop. Calling _quit() is better for new break
# applications. finally:
break if hasattr(MacOS, 'SchedParams'):
finally: MacOS.SchedParams(*saveparams)
if hasattr(MacOS, 'SchedParams'):
MacOS.SchedParams(*saveparams) def dopendingevents(self, mask = everyEvent):
"""dopendingevents - Handle all pending events"""
def dopendingevents(self, mask = everyEvent): while self.do1event(mask, wait=0):
"""dopendingevents - Handle all pending events""" pass
while self.do1event(mask, wait=0):
pass def do1event(self, mask = everyEvent, wait = None):
ok, event = self.getevent(mask, wait)
def do1event(self, mask = everyEvent, wait = None): if IsDialogEvent(event):
ok, event = self.getevent(mask, wait) if self.do_dialogevent(event):
if IsDialogEvent(event): return
if self.do_dialogevent(event): if ok:
return self.dispatch(event)
if ok: else:
self.dispatch(event) self.idle(event)
else:
self.idle(event) def idle(self, event):
pass
def idle(self, event):
pass def getevent(self, mask = everyEvent, wait = None):
if self.needmenubarredraw:
def getevent(self, mask = everyEvent, wait = None): DrawMenuBar()
if self.needmenubarredraw: self.needmenubarredraw = 0
DrawMenuBar() if wait is None:
self.needmenubarredraw = 0 wait = self.default_wait
if wait is None: if wait is None:
wait = self.default_wait wait = GetCaretTime()
if wait is None: ok, event = WaitNextEvent(mask, wait)
wait = GetCaretTime() return ok, event
ok, event = WaitNextEvent(mask, wait)
return ok, event def dispatch(self, event):
# The following appears to be double work (already done in do1event)
def dispatch(self, event): # but we need it for asynchronous event handling
# The following appears to be double work (already done in do1event) if IsDialogEvent(event):
# but we need it for asynchronous event handling if self.do_dialogevent(event):
if IsDialogEvent(event): return
if self.do_dialogevent(event): (what, message, when, where, modifiers) = event
return if eventname.has_key(what):
(what, message, when, where, modifiers) = event name = "do_" + eventname[what]
if eventname.has_key(what): else:
name = "do_" + eventname[what] name = "do_%d" % what
else: try:
name = "do_%d" % what handler = getattr(self, name)
try: except AttributeError:
handler = getattr(self, name) handler = self.do_unknownevent
except AttributeError: handler(event)
handler = self.do_unknownevent
handler(event) def asyncevents(self, onoff):
"""asyncevents - Set asynchronous event handling on or off"""
def asyncevents(self, onoff): if MacOS.runtimemodel == 'macho':
"""asyncevents - Set asynchronous event handling on or off""" raise 'Unsupported in MachoPython'
if MacOS.runtimemodel == 'macho': old = self._doing_asyncevents
raise 'Unsupported in MachoPython' if old:
old = self._doing_asyncevents MacOS.SetEventHandler()
if old: MacOS.SchedParams(*self.schedparams)
MacOS.SetEventHandler() if onoff:
MacOS.SchedParams(*self.schedparams) MacOS.SetEventHandler(self.dispatch)
if onoff: doint, dummymask, benice, howoften, bgyield = \
MacOS.SetEventHandler(self.dispatch) self.schedparams
doint, dummymask, benice, howoften, bgyield = \ MacOS.SchedParams(doint, everyEvent, benice,
self.schedparams howoften, bgyield)
MacOS.SchedParams(doint, everyEvent, benice, self._doing_asyncevents = onoff
howoften, bgyield) return old
self._doing_asyncevents = onoff
return old def do_dialogevent(self, event):
gotone, dlg, item = DialogSelect(event)
def do_dialogevent(self, event): if gotone:
gotone, dlg, item = DialogSelect(event) window = dlg.GetDialogWindow()
if gotone: if self._windows.has_key(window):
window = dlg.GetDialogWindow() self._windows[window].do_itemhit(item, event)
if self._windows.has_key(window): else:
self._windows[window].do_itemhit(item, event) print 'Dialog event for unknown dialog'
else: return 1
print 'Dialog event for unknown dialog' return 0
return 1
return 0 def do_mouseDown(self, event):
(what, message, when, where, modifiers) = event
def do_mouseDown(self, event): partcode, wid = FindWindow(where)
(what, message, when, where, modifiers) = event
partcode, wid = FindWindow(where) #
# Find the correct name.
# #
# Find the correct name. if partname.has_key(partcode):
# name = "do_" + partname[partcode]
if partname.has_key(partcode): else:
name = "do_" + partname[partcode] name = "do_%d" % partcode
else:
name = "do_%d" % partcode if wid == None:
# No window, or a non-python window
if wid == None: try:
# No window, or a non-python window handler = getattr(self, name)
try: except AttributeError:
handler = getattr(self, name) # Not menubar or something, so assume someone
except AttributeError: # else's window
# Not menubar or something, so assume someone
# else's window
if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event)
return
elif self._windows.has_key(wid):
# It is a window. Hand off to correct window.
window = self._windows[wid]
try:
handler = getattr(window, name)
except AttributeError:
handler = self.do_unknownpartcode
else:
# It is a python-toolbox window, but not ours.
handler = self.do_unknownwindow
handler(partcode, wid, event)
def do_inSysWindow(self, partcode, window, event):
if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event)
def do_inDesk(self, partcode, window, event):
if hasattr(MacOS, 'HandleEvent'): if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event) MacOS.HandleEvent(event)
return
def do_inMenuBar(self, partcode, window, event): elif self._windows.has_key(wid):
# It is a window. Hand off to correct window.
window = self._windows[wid]
try:
handler = getattr(window, name)
except AttributeError:
handler = self.do_unknownpartcode
else:
# It is a python-toolbox window, but not ours.
handler = self.do_unknownwindow
handler(partcode, wid, event)
def do_inSysWindow(self, partcode, window, event):
if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event)
def do_inDesk(self, partcode, window, event):
if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event)
def do_inMenuBar(self, partcode, window, event):
if not self.menubar:
if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event)
return
(what, message, when, where, modifiers) = event
result = MenuSelect(where)
id = (result>>16) & 0xffff # Hi word
if id >= 0x8000:
id = -65536 + id
item = result & 0xffff # Lo word
self.do_rawmenu(id, item, window, event)
def do_rawmenu(self, id, item, window, event):
try:
self.do_menu(id, item, window, event)
finally:
HiliteMenu(0)
def do_menu(self, id, item, window, event):
if hasattr(MacOS, 'OutputSeen'):
MacOS.OutputSeen()
self.menubar.dispatch(id, item, window, event)
def do_unknownpartcode(self, partcode, window, event):
(what, message, when, where, modifiers) = event
if DEBUG: print "Mouse down at global:", where
if DEBUG: print "\tUnknown part code:", partcode
if DEBUG: print "\tEvent:", self.printevent(event)
if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event)
def do_unknownwindow(self, partcode, window, event):
if DEBUG: print 'Unknown window:', window
if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event)
def do_keyDown(self, event):
self.do_key(event)
def do_autoKey(self, event):
if not event[-1] & cmdKey:
self.do_key(event)
def do_key(self, event):
(what, message, when, where, modifiers) = event
c = chr(message & charCodeMask)
if self.menubar:
result = MenuEvent(event)
id = (result>>16) & 0xffff # Hi word
item = result & 0xffff # Lo word
if id:
self.do_rawmenu(id, item, None, event)
return
# Otherwise we fall-through
if modifiers & cmdKey:
if c == '.':
raise self
else:
if not self.menubar: if not self.menubar:
if hasattr(MacOS, 'HandleEvent'): if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event)
return
(what, message, when, where, modifiers) = event
result = MenuSelect(where)
id = (result>>16) & 0xffff # Hi word
if id >= 0x8000:
id = -65536 + id
item = result & 0xffff # Lo word
self.do_rawmenu(id, item, window, event)
def do_rawmenu(self, id, item, window, event):
try:
self.do_menu(id, item, window, event)
finally:
HiliteMenu(0)
def do_menu(self, id, item, window, event):
if hasattr(MacOS, 'OutputSeen'):
MacOS.OutputSeen()
self.menubar.dispatch(id, item, window, event)
def do_unknownpartcode(self, partcode, window, event):
(what, message, when, where, modifiers) = event
if DEBUG: print "Mouse down at global:", where
if DEBUG: print "\tUnknown part code:", partcode
if DEBUG: print "\tEvent:", self.printevent(event)
if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event)
def do_unknownwindow(self, partcode, window, event):
if DEBUG: print 'Unknown window:', window
if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event) MacOS.HandleEvent(event)
return
def do_keyDown(self, event): else:
self.do_key(event) # See whether the front window wants it
w = MyFrontWindow()
def do_autoKey(self, event): if w and self._windows.has_key(w):
if not event[-1] & cmdKey: window = self._windows[w]
self.do_key(event)
def do_key(self, event):
(what, message, when, where, modifiers) = event
c = chr(message & charCodeMask)
if self.menubar:
result = MenuEvent(event)
id = (result>>16) & 0xffff # Hi word
item = result & 0xffff # Lo word
if id:
self.do_rawmenu(id, item, None, event)
return
# Otherwise we fall-through
if modifiers & cmdKey:
if c == '.':
raise self
else:
if not self.menubar:
if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event)
return
else:
# See whether the front window wants it
w = MyFrontWindow()
if w and self._windows.has_key(w):
window = self._windows[w]
try:
do_char = window.do_char
except AttributeError:
do_char = self.do_char
do_char(c, event)
# else it wasn't for us, sigh...
def do_char(self, c, event):
if DEBUG: print "Character", `c`
def do_updateEvt(self, event):
(what, message, when, where, modifiers) = event
wid = WhichWindow(message)
if wid and self._windows.has_key(wid):
window = self._windows[wid]
window.do_rawupdate(wid, event)
else:
if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event)
def do_activateEvt(self, event):
(what, message, when, where, modifiers) = event
wid = WhichWindow(message)
if wid and self._windows.has_key(wid):
window = self._windows[wid]
window.do_activate(modifiers & 1, event)
else:
if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event)
def do_osEvt(self, event):
(what, message, when, where, modifiers) = event
which = (message >> 24) & 0xff
if which == 1: # suspend/resume
self.do_suspendresume(event)
else:
if DEBUG:
print 'unknown osEvt:',
self.printevent(event)
def do_suspendresume(self, event):
(what, message, when, where, modifiers) = event
wid = MyFrontWindow()
if wid and self._windows.has_key(wid):
window = self._windows[wid]
window.do_activate(message & 1, event)
def do_kHighLevelEvent(self, event):
(what, message, when, where, modifiers) = event
if DEBUG:
print "High Level Event:",
self.printevent(event)
try: try:
AEProcessAppleEvent(event) do_char = window.do_char
except: except AttributeError:
pass do_char = self.do_char
#print "AEProcessAppleEvent error:" do_char(c, event)
#traceback.print_exc() # else it wasn't for us, sigh...
def do_unknownevent(self, event): def do_char(self, c, event):
if DEBUG: if DEBUG: print "Character", `c`
print "Unhandled event:",
self.printevent(event) def do_updateEvt(self, event):
(what, message, when, where, modifiers) = event
def printevent(self, event): wid = WhichWindow(message)
(what, message, when, where, modifiers) = event if wid and self._windows.has_key(wid):
nicewhat = `what` window = self._windows[wid]
if eventname.has_key(what): window.do_rawupdate(wid, event)
nicewhat = eventname[what] else:
print nicewhat, if hasattr(MacOS, 'HandleEvent'):
if what == kHighLevelEvent: MacOS.HandleEvent(event)
h, v = where
print `ostypecode(message)`, hex(when), `ostypecode(h | (v<<16))`, def do_activateEvt(self, event):
else: (what, message, when, where, modifiers) = event
print hex(message), hex(when), where, wid = WhichWindow(message)
print hex(modifiers) if wid and self._windows.has_key(wid):
window = self._windows[wid]
window.do_activate(modifiers & 1, event)
else:
if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event)
def do_osEvt(self, event):
(what, message, when, where, modifiers) = event
which = (message >> 24) & 0xff
if which == 1: # suspend/resume
self.do_suspendresume(event)
else:
if DEBUG:
print 'unknown osEvt:',
self.printevent(event)
def do_suspendresume(self, event):
(what, message, when, where, modifiers) = event
wid = MyFrontWindow()
if wid and self._windows.has_key(wid):
window = self._windows[wid]
window.do_activate(message & 1, event)
def do_kHighLevelEvent(self, event):
(what, message, when, where, modifiers) = event
if DEBUG:
print "High Level Event:",
self.printevent(event)
try:
AEProcessAppleEvent(event)
except:
pass
#print "AEProcessAppleEvent error:"
#traceback.print_exc()
def do_unknownevent(self, event):
if DEBUG:
print "Unhandled event:",
self.printevent(event)
def printevent(self, event):
(what, message, when, where, modifiers) = event
nicewhat = `what`
if eventname.has_key(what):
nicewhat = eventname[what]
print nicewhat,
if what == kHighLevelEvent:
h, v = where
print `ostypecode(message)`, hex(when), `ostypecode(h | (v<<16))`,
else:
print hex(message), hex(when), where,
print hex(modifiers)
class MenuBar: class MenuBar:
"""Represent a set of menus in a menu bar. """Represent a set of menus in a menu bar.
Interface: Interface:
- (constructor) - (constructor)
- (destructor) - (destructor)
- addmenu - addmenu
- addpopup (normally used internally) - addpopup (normally used internally)
- dispatch (called from Application) - dispatch (called from Application)
""" """
nextid = 1 # Necessarily a class variable nextid = 1 # Necessarily a class variable
def getnextid(self): def getnextid(self):
id = MenuBar.nextid id = MenuBar.nextid
MenuBar.nextid = id+1 MenuBar.nextid = id+1
return id return id
def __init__(self, parent=None): def __init__(self, parent=None):
self.parent = parent self.parent = parent
ClearMenuBar() ClearMenuBar()
self.bar = GetMenuBar() self.bar = GetMenuBar()
self.menus = {} self.menus = {}
# XXX necessary? # XXX necessary?
def close(self): def close(self):
self.parent = None self.parent = None
self.bar = None self.bar = None
self.menus = None self.menus = None
def addmenu(self, title, after = 0, id=None): def addmenu(self, title, after = 0, id=None):
if id == None: if id == None:
id = self.getnextid() id = self.getnextid()
if DEBUG: print 'Newmenu', title, id # XXXX if DEBUG: print 'Newmenu', title, id # XXXX
m = NewMenu(id, title) m = NewMenu(id, title)
m.InsertMenu(after) m.InsertMenu(after)
if after >= 0: if after >= 0:
if self.parent: if self.parent:
self.parent.needmenubarredraw = 1 self.parent.needmenubarredraw = 1
else: else:
DrawMenuBar() DrawMenuBar()
return id, m return id, m
def delmenu(self, id): def delmenu(self, id):
if DEBUG: print 'Delmenu', id # XXXX if DEBUG: print 'Delmenu', id # XXXX
DeleteMenu(id) DeleteMenu(id)
def addpopup(self, title = ''): def addpopup(self, title = ''):
return self.addmenu(title, -1) return self.addmenu(title, -1)
# Useless: # Useless:
# def install(self): # def install(self):
# if not self.bar: return # if not self.bar: return
# SetMenuBar(self.bar) # SetMenuBar(self.bar)
# if self.parent: # if self.parent:
# self.parent.needmenubarredraw = 1 # self.parent.needmenubarredraw = 1
# else: # else:
# DrawMenuBar() # DrawMenuBar()
def fixmenudimstate(self): def fixmenudimstate(self):
for m in self.menus.keys(): for m in self.menus.keys():
menu = self.menus[m] menu = self.menus[m]
if menu.__class__ == FrameWork.AppleMenu: if menu.__class__ == FrameWork.AppleMenu:
continue continue
for i in range(len(menu.items)): for i in range(len(menu.items)):
label, shortcut, callback, kind = menu.items[i] label, shortcut, callback, kind = menu.items[i]
if type(callback) == types.StringType: if type(callback) == types.StringType:
wid = MyFrontWindow() wid = MyFrontWindow()
if wid and self.parent._windows.has_key(wid): if wid and self.parent._windows.has_key(wid):
window = self.parent._windows[wid] window = self.parent._windows[wid]
if hasattr(window, "domenu_" + callback): if hasattr(window, "domenu_" + callback):
menu.menu.EnableMenuItem(i + 1) menu.menu.EnableMenuItem(i + 1)
elif hasattr(self.parent, "domenu_" + callback): elif hasattr(self.parent, "domenu_" + callback):
menu.menu.EnableMenuItem(i + 1) menu.menu.EnableMenuItem(i + 1)
else: else:
menu.menu.DisableMenuItem(i + 1) menu.menu.DisableMenuItem(i + 1)
elif hasattr(self.parent, "domenu_" + callback): elif hasattr(self.parent, "domenu_" + callback):
menu.menu.EnableMenuItem(i + 1) menu.menu.EnableMenuItem(i + 1)
else: else:
menu.menu.DisableMenuItem(i + 1) menu.menu.DisableMenuItem(i + 1)
elif callback: elif callback:
pass pass
def dispatch(self, id, item, window, event): def dispatch(self, id, item, window, event):
if self.menus.has_key(id): if self.menus.has_key(id):
self.menus[id].dispatch(id, item, window, event) self.menus[id].dispatch(id, item, window, event)
else: else:
if DEBUG: print "MenuBar.dispatch(%d, %d, %s, %s)" % \ if DEBUG: print "MenuBar.dispatch(%d, %d, %s, %s)" % \
(id, item, window, event) (id, item, window, event)
# XXX Need a way to get menus as resources and bind them to callbacks # XXX Need a way to get menus as resources and bind them to callbacks
class Menu: class Menu:
"One menu." "One menu."
def __init__(self, bar, title, after=0, id=None): def __init__(self, bar, title, after=0, id=None):
self.bar = bar self.bar = bar
self.id, self.menu = self.bar.addmenu(title, after, id) self.id, self.menu = self.bar.addmenu(title, after, id)
bar.menus[self.id] = self bar.menus[self.id] = self
self.items = [] self.items = []
self._parent = None self._parent = None
def delete(self): def delete(self):
self.bar.delmenu(self.id) self.bar.delmenu(self.id)
del self.bar.menus[self.id] del self.bar.menus[self.id]
self.menu.DisposeMenu() self.menu.DisposeMenu()
del self.bar del self.bar
del self.items del self.items
del self.menu del self.menu
del self.id del self.id
del self._parent del self._parent
def additem(self, label, shortcut=None, callback=None, kind=None): def additem(self, label, shortcut=None, callback=None, kind=None):
self.menu.AppendMenu('x') # add a dummy string self.menu.AppendMenu('x') # add a dummy string
self.items.append((label, shortcut, callback, kind)) self.items.append((label, shortcut, callback, kind))
item = len(self.items) item = len(self.items)
if isinstance(label, unicode): if isinstance(label, unicode):
self.menu.SetMenuItemTextWithCFString(item, label) self.menu.SetMenuItemTextWithCFString(item, label)
else: else:
self.menu.SetMenuItemText(item, label) self.menu.SetMenuItemText(item, label)
if shortcut and type(shortcut) == type(()): if shortcut and type(shortcut) == type(()):
modifiers, char = shortcut[:2] modifiers, char = shortcut[:2]
self.menu.SetItemCmd(item, ord(char)) self.menu.SetItemCmd(item, ord(char))
self.menu.SetMenuItemModifiers(item, modifiers) self.menu.SetMenuItemModifiers(item, modifiers)
if len(shortcut) > 2: if len(shortcut) > 2:
self.menu.SetMenuItemKeyGlyph(item, shortcut[2]) self.menu.SetMenuItemKeyGlyph(item, shortcut[2])
elif shortcut: elif shortcut:
self.menu.SetItemCmd(item, ord(shortcut)) self.menu.SetItemCmd(item, ord(shortcut))
return item return item
def delitem(self, item): def delitem(self, item):
if item != len(self.items): if item != len(self.items):
raise 'Can only delete last item of a menu' raise 'Can only delete last item of a menu'
self.menu.DeleteMenuItem(item) self.menu.DeleteMenuItem(item)
del self.items[item-1] del self.items[item-1]
def addcheck(self, label, shortcut=None, callback=None): def addcheck(self, label, shortcut=None, callback=None):
return self.additem(label, shortcut, callback, 'check') return self.additem(label, shortcut, callback, 'check')
def addradio(self, label, shortcut=None, callback=None): def addradio(self, label, shortcut=None, callback=None):
return self.additem(label, shortcut, callback, 'radio') return self.additem(label, shortcut, callback, 'radio')
def addseparator(self): def addseparator(self):
self.menu.AppendMenu('(-') self.menu.AppendMenu('(-')
self.items.append(('', None, None, 'separator')) self.items.append(('', None, None, 'separator'))
def addsubmenu(self, label, title=''): def addsubmenu(self, label, title=''):
sub = Menu(self.bar, title, -1) sub = Menu(self.bar, title, -1)
item = self.additem(label, '\x1B', None, 'submenu') item = self.additem(label, '\x1B', None, 'submenu')
self.menu.SetItemMark(item, sub.id) self.menu.SetItemMark(item, sub.id)
sub._parent = self sub._parent = self
sub._parent_item = item sub._parent_item = item
return sub return sub
def dispatch(self, id, item, window, event): def dispatch(self, id, item, window, event):
title, shortcut, callback, mtype = self.items[item-1] title, shortcut, callback, mtype = self.items[item-1]
if callback: if callback:
if not self.bar.parent or type(callback) <> types.StringType: if not self.bar.parent or type(callback) <> types.StringType:
menuhandler = callback menuhandler = callback
else: else:
# callback is string # callback is string
wid = MyFrontWindow() wid = MyFrontWindow()
if wid and self.bar.parent._windows.has_key(wid): if wid and self.bar.parent._windows.has_key(wid):
window = self.bar.parent._windows[wid] window = self.bar.parent._windows[wid]
if hasattr(window, "domenu_" + callback): if hasattr(window, "domenu_" + callback):
menuhandler = getattr(window, "domenu_" + callback) menuhandler = getattr(window, "domenu_" + callback)
elif hasattr(self.bar.parent, "domenu_" + callback): elif hasattr(self.bar.parent, "domenu_" + callback):
menuhandler = getattr(self.bar.parent, "domenu_" + callback) menuhandler = getattr(self.bar.parent, "domenu_" + callback)
else: else:
# nothing we can do. we shouldn't have come this far # nothing we can do. we shouldn't have come this far
# since the menu item should have been disabled... # since the menu item should have been disabled...
return return
elif hasattr(self.bar.parent, "domenu_" + callback): elif hasattr(self.bar.parent, "domenu_" + callback):
menuhandler = getattr(self.bar.parent, "domenu_" + callback) menuhandler = getattr(self.bar.parent, "domenu_" + callback)
else:
# nothing we can do. we shouldn't have come this far
# since the menu item should have been disabled...
return
menuhandler(id, item, window, event)
def enable(self, onoff):
if onoff:
self.menu.EnableMenuItem(0)
if self._parent:
self._parent.menu.EnableMenuItem(self._parent_item)
else: else:
self.menu.DisableMenuItem(0) # nothing we can do. we shouldn't have come this far
if self._parent: # since the menu item should have been disabled...
self._parent.menu.DisableMenuItem(self._parent_item) return
if self.bar and self.bar.parent: menuhandler(id, item, window, event)
self.bar.parent.needmenubarredraw = 1
def enable(self, onoff):
if onoff:
self.menu.EnableMenuItem(0)
if self._parent:
self._parent.menu.EnableMenuItem(self._parent_item)
else:
self.menu.DisableMenuItem(0)
if self._parent:
self._parent.menu.DisableMenuItem(self._parent_item)
if self.bar and self.bar.parent:
self.bar.parent.needmenubarredraw = 1
class PopupMenu(Menu): class PopupMenu(Menu):
def __init__(self, bar): def __init__(self, bar):
Menu.__init__(self, bar, '(popup)', -1) Menu.__init__(self, bar, '(popup)', -1)
def popup(self, x, y, event, default=1, window=None): def popup(self, x, y, event, default=1, window=None):
# NOTE that x and y are global coordinates, and they should probably # NOTE that x and y are global coordinates, and they should probably
# be topleft of the button the user clicked (not mouse-coordinates), # be topleft of the button the user clicked (not mouse-coordinates),
# so the popup nicely overlaps. # so the popup nicely overlaps.
reply = self.menu.PopUpMenuSelect(x, y, default) reply = self.menu.PopUpMenuSelect(x, y, default)
if not reply: if not reply:
return return
id = (reply >> 16) & 0xffff id = (reply >> 16) & 0xffff
item = reply & 0xffff item = reply & 0xffff
if not window: if not window:
wid = MyFrontWindow() wid = MyFrontWindow()
try: try:
window = self.bar.parent._windows[wid] window = self.bar.parent._windows[wid]
except: except:
pass # If we can't find the window we pass None pass # If we can't find the window we pass None
self.dispatch(id, item, window, event) self.dispatch(id, item, window, event)
class MenuItem: class MenuItem:
def __init__(self, menu, title, shortcut=None, callback=None, kind=None): def __init__(self, menu, title, shortcut=None, callback=None, kind=None):
self.item = menu.additem(title, shortcut, callback) self.item = menu.additem(title, shortcut, callback)
self.menu = menu self.menu = menu
def delete(self): def delete(self):
self.menu.delitem(self.item) self.menu.delitem(self.item)
del self.menu del self.menu
del self.item del self.item
def check(self, onoff): def check(self, onoff):
self.menu.menu.CheckMenuItem(self.item, onoff) self.menu.menu.CheckMenuItem(self.item, onoff)
def enable(self, onoff): def enable(self, onoff):
if onoff: if onoff:
self.menu.menu.EnableMenuItem(self.item) self.menu.menu.EnableMenuItem(self.item)
else: else:
self.menu.menu.DisableMenuItem(self.item) self.menu.menu.DisableMenuItem(self.item)
def settext(self, text): def settext(self, text):
self.menu.menu.SetMenuItemText(self.item, text) self.menu.menu.SetMenuItemText(self.item, text)
def setstyle(self, style): def setstyle(self, style):
self.menu.menu.SetItemStyle(self.item, style) self.menu.menu.SetItemStyle(self.item, style)
def seticon(self, icon): def seticon(self, icon):
self.menu.menu.SetItemIcon(self.item, icon) self.menu.menu.SetItemIcon(self.item, icon)
def setcmd(self, cmd): def setcmd(self, cmd):
self.menu.menu.SetItemCmd(self.item, cmd) self.menu.menu.SetItemCmd(self.item, cmd)
def setmark(self, cmd): def setmark(self, cmd):
self.menu.menu.SetItemMark(self.item, cmd) self.menu.menu.SetItemMark(self.item, cmd)
class RadioItem(MenuItem): class RadioItem(MenuItem):
def __init__(self, menu, title, shortcut=None, callback=None): def __init__(self, menu, title, shortcut=None, callback=None):
MenuItem.__init__(self, menu, title, shortcut, callback, 'radio') MenuItem.__init__(self, menu, title, shortcut, callback, 'radio')
class CheckItem(MenuItem): class CheckItem(MenuItem):
def __init__(self, menu, title, shortcut=None, callback=None): def __init__(self, menu, title, shortcut=None, callback=None):
MenuItem.__init__(self, menu, title, shortcut, callback, 'check') MenuItem.__init__(self, menu, title, shortcut, callback, 'check')
def Separator(menu): def Separator(menu):
menu.addseparator() menu.addseparator()
def SubMenu(menu, label, title=''): def SubMenu(menu, label, title=''):
return menu.addsubmenu(label, title) return menu.addsubmenu(label, title)
class AppleMenu(Menu): class AppleMenu(Menu):
def __init__(self, bar, abouttext="About me...", aboutcallback=None): def __init__(self, bar, abouttext="About me...", aboutcallback=None):
Menu.__init__(self, bar, "\024", id=SIOUX_APPLEMENU_ID) Menu.__init__(self, bar, "\024", id=SIOUX_APPLEMENU_ID)
if MacOS.runtimemodel == 'ppc': if MacOS.runtimemodel == 'ppc':
self.additem(abouttext, None, aboutcallback) self.additem(abouttext, None, aboutcallback)
self.addseparator() self.addseparator()
self.menu.AppendResMenu('DRVR') self.menu.AppendResMenu('DRVR')
else: else:
# Additem()'s tricks do not work for "apple" menu under Carbon # Additem()'s tricks do not work for "apple" menu under Carbon
self.menu.InsertMenuItem(abouttext, 0) self.menu.InsertMenuItem(abouttext, 0)
self.items.append((abouttext, None, aboutcallback, None)) self.items.append((abouttext, None, aboutcallback, None))
def dispatch(self, id, item, window, event): def dispatch(self, id, item, window, event):
if item == 1: if item == 1:
Menu.dispatch(self, id, item, window, event) Menu.dispatch(self, id, item, window, event)
elif MacOS.runtimemodel == 'ppc': elif MacOS.runtimemodel == 'ppc':
name = self.menu.GetMenuItemText(item) name = self.menu.GetMenuItemText(item)
OpenDeskAcc(name) OpenDeskAcc(name)
class HelpMenu(Menu): class HelpMenu(Menu):
def __init__(self, bar): def __init__(self, bar):
# Note we don't call Menu.__init__, we do the necessary things by hand # Note we don't call Menu.__init__, we do the necessary things by hand
self.bar = bar self.bar = bar
self.menu, index = HMGetHelpMenu() self.menu, index = HMGetHelpMenu()
self.id = self.menu.GetMenuID() self.id = self.menu.GetMenuID()
bar.menus[self.id] = self bar.menus[self.id] = self
# The next line caters for the entries the system already handles for us # The next line caters for the entries the system already handles for us
self.items = [None]*(index-1) self.items = [None]*(index-1)
self._parent = None self._parent = None
class Window: class Window:
"""A single window belonging to an application""" """A single window belonging to an application"""
def __init__(self, parent): def __init__(self, parent):
self.wid = None self.wid = None
self.parent = parent self.parent = parent
def open(self, bounds=(40, 40, 400, 400), resid=None): def open(self, bounds=(40, 40, 400, 400), resid=None):
if resid <> None: if resid <> None:
self.wid = GetNewWindow(resid, -1) self.wid = GetNewWindow(resid, -1)
else: else:
self.wid = NewWindow(bounds, self.__class__.__name__, 1, self.wid = NewWindow(bounds, self.__class__.__name__, 1,
8, -1, 1, 0) # changed to proc id 8 to include zoom box. jvr 8, -1, 1, 0) # changed to proc id 8 to include zoom box. jvr
self.do_postopen() self.do_postopen()
def do_postopen(self): def do_postopen(self):
"""Tell our parent we exist""" """Tell our parent we exist"""
self.parent.appendwindow(self.wid, self) self.parent.appendwindow(self.wid, self)
def close(self): def close(self):
self.do_postclose() self.do_postclose()
def do_postclose(self): def do_postclose(self):
self.parent.removewindow(self.wid) self.parent.removewindow(self.wid)
self.parent = None self.parent = None
self.wid = None self.wid = None
def SetPort(self): def SetPort(self):
# Convinience method # Convinience method
SetPort(self.wid) SetPort(self.wid)
def GetWindow(self): def GetWindow(self):
return self.wid return self.wid
def do_inDrag(self, partcode, window, event): def do_inDrag(self, partcode, window, event):
where = event[3] where = event[3]
window.DragWindow(where, self.draglimit) window.DragWindow(where, self.draglimit)
draglimit = screenbounds draglimit = screenbounds
def do_inGoAway(self, partcode, window, event): def do_inGoAway(self, partcode, window, event):
where = event[3] where = event[3]
if window.TrackGoAway(where): if window.TrackGoAway(where):
self.close() self.close()
def do_inZoom(self, partcode, window, event): def do_inZoom(self, partcode, window, event):
(what, message, when, where, modifiers) = event (what, message, when, where, modifiers) = event
if window.TrackBox(where, partcode): if window.TrackBox(where, partcode):
window.ZoomWindow(partcode, 1) window.ZoomWindow(partcode, 1)
rect = window.GetWindowUserState() # so that zoom really works... jvr rect = window.GetWindowUserState() # so that zoom really works... jvr
self.do_postresize(rect[2] - rect[0], rect[3] - rect[1], window) # jvr self.do_postresize(rect[2] - rect[0], rect[3] - rect[1], window) # jvr
def do_inZoomIn(self, partcode, window, event): def do_inZoomIn(self, partcode, window, event):
SetPort(window) # !!! SetPort(window) # !!!
self.do_inZoom(partcode, window, event) self.do_inZoom(partcode, window, event)
def do_inZoomOut(self, partcode, window, event): def do_inZoomOut(self, partcode, window, event):
SetPort(window) # !!! SetPort(window) # !!!
self.do_inZoom(partcode, window, event) self.do_inZoom(partcode, window, event)
def do_inGrow(self, partcode, window, event): def do_inGrow(self, partcode, window, event):
(what, message, when, where, modifiers) = event (what, message, when, where, modifiers) = event
result = window.GrowWindow(where, self.growlimit) result = window.GrowWindow(where, self.growlimit)
if result: if result:
height = (result>>16) & 0xffff # Hi word height = (result>>16) & 0xffff # Hi word
width = result & 0xffff # Lo word width = result & 0xffff # Lo word
self.do_resize(width, height, window) self.do_resize(width, height, window)
growlimit = (50, 50, screenbounds[2] - screenbounds[0], screenbounds[3] - screenbounds[1]) # jvr growlimit = (50, 50, screenbounds[2] - screenbounds[0], screenbounds[3] - screenbounds[1]) # jvr
def do_resize(self, width, height, window): def do_resize(self, width, height, window):
l, t, r, b = self.wid.GetWindowPort().GetPortBounds() # jvr, forGrowIcon l, t, r, b = self.wid.GetWindowPort().GetPortBounds() # jvr, forGrowIcon
self.SetPort() # jvr self.SetPort() # jvr
self.wid.InvalWindowRect((r - SCROLLBARWIDTH + 1, b - SCROLLBARWIDTH + 1, r, b)) # jvr self.wid.InvalWindowRect((r - SCROLLBARWIDTH + 1, b - SCROLLBARWIDTH + 1, r, b)) # jvr
window.SizeWindow(width, height, 1) # changed updateFlag to true jvr window.SizeWindow(width, height, 1) # changed updateFlag to true jvr
self.do_postresize(width, height, window) self.do_postresize(width, height, window)
def do_postresize(self, width, height, window): def do_postresize(self, width, height, window):
SetPort(window) SetPort(window)
self.wid.InvalWindowRect(window.GetWindowPort().GetPortBounds()) self.wid.InvalWindowRect(window.GetWindowPort().GetPortBounds())
def do_inContent(self, partcode, window, event): def do_inContent(self, partcode, window, event):
# #
# If we're not frontmost, select ourselves and wait for # If we're not frontmost, select ourselves and wait for
# the activate event. # the activate event.
# #
if MyFrontWindow() <> window: if MyFrontWindow() <> window:
window.SelectWindow() window.SelectWindow()
return return
# We are. Handle the event. # We are. Handle the event.
(what, message, when, where, modifiers) = event (what, message, when, where, modifiers) = event
SetPort(window) SetPort(window)
local = GlobalToLocal(where) local = GlobalToLocal(where)
self.do_contentclick(local, modifiers, event) self.do_contentclick(local, modifiers, event)
def do_contentclick(self, local, modifiers, event): def do_contentclick(self, local, modifiers, event):
if DEBUG: if DEBUG:
print 'Click in contents at %s, modifiers %s'%(local, modifiers) print 'Click in contents at %s, modifiers %s'%(local, modifiers)
def do_rawupdate(self, window, event): def do_rawupdate(self, window, event):
if DEBUG: print "raw update for", window if DEBUG: print "raw update for", window
SetPort(window) SetPort(window)
window.BeginUpdate() window.BeginUpdate()
self.do_update(window, event) self.do_update(window, event)
window.EndUpdate() window.EndUpdate()
def do_update(self, window, event): def do_update(self, window, event):
if DEBUG: if DEBUG:
import time import time
for i in range(8): for i in range(8):
time.sleep(0.1) time.sleep(0.1)
InvertRgn(window.GetWindowPort().visRgn) InvertRgn(window.GetWindowPort().visRgn)
FillRgn(window.GetWindowPort().visRgn, GetQDGlobalsGray()) FillRgn(window.GetWindowPort().visRgn, GetQDGlobalsGray())
else: else:
EraseRgn(window.GetWindowPort().visRgn) EraseRgn(window.GetWindowPort().visRgn)
def do_activate(self, activate, event): def do_activate(self, activate, event):
if DEBUG: print 'Activate %d for %s'%(activate, self.wid) if DEBUG: print 'Activate %d for %s'%(activate, self.wid)
class ControlsWindow(Window): class ControlsWindow(Window):
def do_rawupdate(self, window, event): def do_rawupdate(self, window, event):
if DEBUG: print "raw update for", window if DEBUG: print "raw update for", window
SetPort(window) SetPort(window)
window.BeginUpdate() window.BeginUpdate()
self.do_update(window, event) self.do_update(window, event)
#DrawControls(window) # jvr #DrawControls(window) # jvr
UpdateControls(window, window.GetWindowPort().visRgn) # jvr UpdateControls(window, window.GetWindowPort().visRgn) # jvr
window.DrawGrowIcon() window.DrawGrowIcon()
window.EndUpdate() window.EndUpdate()
def do_controlhit(self, window, control, pcode, event): def do_controlhit(self, window, control, pcode, event):
if DEBUG: print "control hit in", window, "on", control, "; pcode =", pcode if DEBUG: print "control hit in", window, "on", control, "; pcode =", pcode
def do_inContent(self, partcode, window, event): def do_inContent(self, partcode, window, event):
if MyFrontWindow() <> window: if MyFrontWindow() <> window:
window.SelectWindow() window.SelectWindow()
return return
(what, message, when, where, modifiers) = event (what, message, when, where, modifiers) = event
SetPort(window) # XXXX Needed? SetPort(window) # XXXX Needed?
local = GlobalToLocal(where) local = GlobalToLocal(where)
pcode, control = FindControl(local, window) pcode, control = FindControl(local, window)
if pcode and control: if pcode and control:
self.do_rawcontrolhit(window, control, pcode, local, event) self.do_rawcontrolhit(window, control, pcode, local, event)
else: else:
if DEBUG: print "FindControl(%s, %s) -> (%s, %s)" % \ if DEBUG: print "FindControl(%s, %s) -> (%s, %s)" % \
(local, window, pcode, control) (local, window, pcode, control)
self.do_contentclick(local, modifiers, event) self.do_contentclick(local, modifiers, event)
def do_rawcontrolhit(self, window, control, pcode, local, event): def do_rawcontrolhit(self, window, control, pcode, local, event):
pcode = control.TrackControl(local) pcode = control.TrackControl(local)
if pcode: if pcode:
self.do_controlhit(window, control, pcode, event) self.do_controlhit(window, control, pcode, event)
class ScrolledWindow(ControlsWindow): class ScrolledWindow(ControlsWindow):
def __init__(self, parent): def __init__(self, parent):
self.barx = self.bary = None self.barx = self.bary = None
self.barx_enabled = self.bary_enabled = 1 self.barx_enabled = self.bary_enabled = 1
self.activated = 1 self.activated = 1
ControlsWindow.__init__(self, parent) ControlsWindow.__init__(self, parent)
def scrollbars(self, wantx=1, wanty=1): def scrollbars(self, wantx=1, wanty=1):
SetPort(self.wid) SetPort(self.wid)
self.barx = self.bary = None self.barx = self.bary = None
self.barx_enabled = self.bary_enabled = 1 self.barx_enabled = self.bary_enabled = 1
x0, y0, x1, y1 = self.wid.GetWindowPort().GetPortBounds() x0, y0, x1, y1 = self.wid.GetWindowPort().GetPortBounds()
vx, vy = self.getscrollbarvalues() vx, vy = self.getscrollbarvalues()
if vx == None: self.barx_enabled, vx = 0, 0 if vx == None: self.barx_enabled, vx = 0, 0
if vy == None: self.bary_enabled, vy = 0, 0 if vy == None: self.bary_enabled, vy = 0, 0
if wantx: if wantx:
rect = x0-1, y1-(SCROLLBARWIDTH-1), x1-(SCROLLBARWIDTH-2), y1+1 rect = x0-1, y1-(SCROLLBARWIDTH-1), x1-(SCROLLBARWIDTH-2), y1+1
self.barx = NewControl(self.wid, rect, "", 1, vx, 0, 32767, 16, 0) self.barx = NewControl(self.wid, rect, "", 1, vx, 0, 32767, 16, 0)
if not self.barx_enabled: self.barx.HiliteControl(255) if not self.barx_enabled: self.barx.HiliteControl(255)
## self.wid.InvalWindowRect(rect) ## self.wid.InvalWindowRect(rect)
if wanty: if wanty:
rect = x1-(SCROLLBARWIDTH-1), y0-1, x1+1, y1-(SCROLLBARWIDTH-2) rect = x1-(SCROLLBARWIDTH-1), y0-1, x1+1, y1-(SCROLLBARWIDTH-2)
self.bary = NewControl(self.wid, rect, "", 1, vy, 0, 32767, 16, 0) self.bary = NewControl(self.wid, rect, "", 1, vy, 0, 32767, 16, 0)
if not self.bary_enabled: self.bary.HiliteControl(255) if not self.bary_enabled: self.bary.HiliteControl(255)
## self.wid.InvalWindowRect(rect) ## self.wid.InvalWindowRect(rect)
def do_postclose(self): def do_postclose(self):
self.barx = self.bary = None self.barx = self.bary = None
ControlsWindow.do_postclose(self) ControlsWindow.do_postclose(self)
def do_activate(self, onoff, event): def do_activate(self, onoff, event):
self.activated = onoff self.activated = onoff
if onoff: if onoff:
if self.barx and self.barx_enabled: if self.barx and self.barx_enabled:
self.barx.ShowControl() # jvr self.barx.ShowControl() # jvr
if self.bary and self.bary_enabled: if self.bary and self.bary_enabled:
self.bary.ShowControl() # jvr self.bary.ShowControl() # jvr
else: else:
if self.barx: if self.barx:
self.barx.HideControl() # jvr; An inactive window should have *hidden* self.barx.HideControl() # jvr; An inactive window should have *hidden*
# scrollbars, not just dimmed (no matter what # scrollbars, not just dimmed (no matter what
# BBEdit does... look at the Finder) # BBEdit does... look at the Finder)
if self.bary: if self.bary:
self.bary.HideControl() # jvr self.bary.HideControl() # jvr
self.wid.DrawGrowIcon() # jvr self.wid.DrawGrowIcon() # jvr
def do_postresize(self, width, height, window): def do_postresize(self, width, height, window):
l, t, r, b = self.wid.GetWindowPort().GetPortBounds() l, t, r, b = self.wid.GetWindowPort().GetPortBounds()
self.SetPort() self.SetPort()
if self.barx: if self.barx:
self.barx.HideControl() # jvr self.barx.HideControl() # jvr
self.barx.MoveControl(l-1, b-(SCROLLBARWIDTH-1)) self.barx.MoveControl(l-1, b-(SCROLLBARWIDTH-1))
self.barx.SizeControl((r-l)-(SCROLLBARWIDTH-3), SCROLLBARWIDTH) # jvr self.barx.SizeControl((r-l)-(SCROLLBARWIDTH-3), SCROLLBARWIDTH) # jvr
if self.bary: if self.bary:
self.bary.HideControl() # jvr self.bary.HideControl() # jvr
self.bary.MoveControl(r-(SCROLLBARWIDTH-1), t-1) self.bary.MoveControl(r-(SCROLLBARWIDTH-1), t-1)
self.bary.SizeControl(SCROLLBARWIDTH, (b-t)-(SCROLLBARWIDTH-3)) # jvr self.bary.SizeControl(SCROLLBARWIDTH, (b-t)-(SCROLLBARWIDTH-3)) # jvr
if self.barx: if self.barx:
self.barx.ShowControl() # jvr self.barx.ShowControl() # jvr
self.wid.ValidWindowRect((l, b - SCROLLBARWIDTH + 1, r - SCROLLBARWIDTH + 2, b)) # jvr self.wid.ValidWindowRect((l, b - SCROLLBARWIDTH + 1, r - SCROLLBARWIDTH + 2, b)) # jvr
if self.bary: if self.bary:
self.bary.ShowControl() # jvr self.bary.ShowControl() # jvr
self.wid.ValidWindowRect((r - SCROLLBARWIDTH + 1, t, r, b - SCROLLBARWIDTH + 2)) # jvr self.wid.ValidWindowRect((r - SCROLLBARWIDTH + 1, t, r, b - SCROLLBARWIDTH + 2)) # jvr
self.wid.InvalWindowRect((r - SCROLLBARWIDTH + 1, b - SCROLLBARWIDTH + 1, r, b)) # jvr, growicon self.wid.InvalWindowRect((r - SCROLLBARWIDTH + 1, b - SCROLLBARWIDTH + 1, r, b)) # jvr, growicon
def do_rawcontrolhit(self, window, control, pcode, local, event): def do_rawcontrolhit(self, window, control, pcode, local, event):
if control == self.barx: if control == self.barx:
which = 'x' which = 'x'
elif control == self.bary: elif control == self.bary:
which = 'y' which = 'y'
else: else:
return 0 return 0
if pcode in (inUpButton, inDownButton, inPageUp, inPageDown): if pcode in (inUpButton, inDownButton, inPageUp, inPageDown):
# We do the work for the buttons and grey area in the tracker # We do the work for the buttons and grey area in the tracker
dummy = control.TrackControl(local, self.do_controltrack) dummy = control.TrackControl(local, self.do_controltrack)
else: else:
# but the thumb is handled here # but the thumb is handled here
pcode = control.TrackControl(local) pcode = control.TrackControl(local)
if pcode == inThumb: if pcode == inThumb:
value = control.GetControlValue() value = control.GetControlValue()
print 'setbars', which, value #DBG print 'setbars', which, value #DBG
self.scrollbar_callback(which, 'set', value) self.scrollbar_callback(which, 'set', value)
self.updatescrollbars()
else:
print 'funny part', pcode #DBG
return 1
def do_controltrack(self, control, pcode):
if control == self.barx:
which = 'x'
elif control == self.bary:
which = 'y'
else:
return
if pcode == inUpButton:
what = '-'
elif pcode == inDownButton:
what = '+'
elif pcode == inPageUp:
what = '--'
elif pcode == inPageDown:
what = '++'
else:
return
self.scrollbar_callback(which, what, None)
self.updatescrollbars() self.updatescrollbars()
else:
def updatescrollbars(self): print 'funny part', pcode #DBG
SetPort(self.wid) return 1
vx, vy = self.getscrollbarvalues()
if self.barx: def do_controltrack(self, control, pcode):
if vx == None: if control == self.barx:
self.barx.HiliteControl(255) which = 'x'
self.barx_enabled = 0 elif control == self.bary:
else: which = 'y'
if not self.barx_enabled: else:
self.barx_enabled = 1 return
if self.activated:
self.barx.HiliteControl(0) if pcode == inUpButton:
self.barx.SetControlValue(vx) what = '-'
if self.bary: elif pcode == inDownButton:
if vy == None: what = '+'
self.bary.HiliteControl(255) elif pcode == inPageUp:
self.bary_enabled = 0 what = '--'
else: elif pcode == inPageDown:
if not self.bary_enabled: what = '++'
self.bary_enabled = 1 else:
if self.activated: return
self.bary.HiliteControl(0) self.scrollbar_callback(which, what, None)
self.bary.SetControlValue(vy) self.updatescrollbars()
# Auxiliary function: convert standard text/image/etc coordinate def updatescrollbars(self):
# to something palatable as getscrollbarvalues() return SetPort(self.wid)
def scalebarvalue(self, absmin, absmax, curmin, curmax): vx, vy = self.getscrollbarvalues()
if curmin <= absmin and curmax >= absmax: if self.barx:
return None if vx == None:
if curmin <= absmin: self.barx.HiliteControl(255)
return 0 self.barx_enabled = 0
if curmax >= absmax: else:
return 32767 if not self.barx_enabled:
perc = float(curmin-absmin)/float(absmax-absmin) self.barx_enabled = 1
return int(perc*32767) if self.activated:
self.barx.HiliteControl(0)
# To be overridden: self.barx.SetControlValue(vx)
if self.bary:
def getscrollbarvalues(self): if vy == None:
return 0, 0 self.bary.HiliteControl(255)
self.bary_enabled = 0
def scrollbar_callback(self, which, what, value): else:
print 'scroll', which, what, value if not self.bary_enabled:
self.bary_enabled = 1
if self.activated:
self.bary.HiliteControl(0)
self.bary.SetControlValue(vy)
# Auxiliary function: convert standard text/image/etc coordinate
# to something palatable as getscrollbarvalues() return
def scalebarvalue(self, absmin, absmax, curmin, curmax):
if curmin <= absmin and curmax >= absmax:
return None
if curmin <= absmin:
return 0
if curmax >= absmax:
return 32767
perc = float(curmin-absmin)/float(absmax-absmin)
return int(perc*32767)
# To be overridden:
def getscrollbarvalues(self):
return 0, 0
def scrollbar_callback(self, which, what, value):
print 'scroll', which, what, value
class DialogWindow(Window): class DialogWindow(Window):
"""A modeless dialog window""" """A modeless dialog window"""
def open(self, resid): def open(self, resid):
self.dlg = GetNewDialog(resid, -1) self.dlg = GetNewDialog(resid, -1)
self.wid = self.dlg.GetDialogWindow() self.wid = self.dlg.GetDialogWindow()
self.do_postopen() self.do_postopen()
def close(self): def close(self):
self.do_postclose() self.do_postclose()
def do_postclose(self): def do_postclose(self):
self.dlg = None self.dlg = None
Window.do_postclose(self) Window.do_postclose(self)
def do_itemhit(self, item, event): def do_itemhit(self, item, event):
print 'Dialog %s, item %d hit'%(self.dlg, item) print 'Dialog %s, item %d hit'%(self.dlg, item)
def do_rawupdate(self, window, event): def do_rawupdate(self, window, event):
pass pass
def ostypecode(x): def ostypecode(x):
"Convert a long int to the 4-character code it really is" "Convert a long int to the 4-character code it really is"
s = '' s = ''
for i in range(4): for i in range(4):
x, c = divmod(x, 256) x, c = divmod(x, 256)
s = chr(c) + s s = chr(c) + s
return s return s
class TestApp(Application): class TestApp(Application):
"This class is used by the test() function" "This class is used by the test() function"
def makeusermenus(self): def makeusermenus(self):
self.filemenu = m = Menu(self.menubar, "File") self.filemenu = m = Menu(self.menubar, "File")
self.saveitem = MenuItem(m, "Save", "S", self.save) self.saveitem = MenuItem(m, "Save", "S", self.save)
Separator(m) Separator(m)
self.optionsmenu = mm = SubMenu(m, "Options") self.optionsmenu = mm = SubMenu(m, "Options")
self.opt1 = CheckItem(mm, "Arguments", "A") self.opt1 = CheckItem(mm, "Arguments", "A")
self.opt2 = CheckItem(mm, "Being hit on the head lessons", (kMenuOptionModifier, "A")) self.opt2 = CheckItem(mm, "Being hit on the head lessons", (kMenuOptionModifier, "A"))
self.opt3 = CheckItem(mm, "Complaints", (kMenuOptionModifier|kMenuNoCommandModifier, "A")) self.opt3 = CheckItem(mm, "Complaints", (kMenuOptionModifier|kMenuNoCommandModifier, "A"))
Separator(m) Separator(m)
self.itemeh = MenuItem(m, "Enable Help", None, self.enablehelp) self.itemeh = MenuItem(m, "Enable Help", None, self.enablehelp)
self.itemdbg = MenuItem(m, "Debug", None, self.debug) self.itemdbg = MenuItem(m, "Debug", None, self.debug)
Separator(m) Separator(m)
self.quititem = MenuItem(m, "Quit", "Q", self.quit) self.quititem = MenuItem(m, "Quit", "Q", self.quit)
def save(self, *args): def save(self, *args):
print "Save" print "Save"
def quit(self, *args): def quit(self, *args):
raise self raise self
def enablehelp(self, *args): def enablehelp(self, *args):
hm = self.gethelpmenu() hm = self.gethelpmenu()
self.nohelpitem = MenuItem(hm, "There isn't any", None, self.nohelp) self.nohelpitem = MenuItem(hm, "There isn't any", None, self.nohelp)
def nohelp(self, *args): def nohelp(self, *args):
print "I told you there isn't any!" print "I told you there isn't any!"
def debug(self, *args): def debug(self, *args):
import pdb import pdb
pdb.set_trace() pdb.set_trace()
def test(): def test():
"Test program" "Test program"
app = TestApp() app = TestApp()
app.mainloop() app.mainloop()
if __name__ == '__main__': if __name__ == '__main__':
test() test()
"""MiniAEFrame - A minimal AppleEvent Application framework. """MiniAEFrame - A minimal AppleEvent Application framework.
There are two classes: There are two classes:
AEServer -- a mixin class offering nice AE handling. AEServer -- a mixin class offering nice AE handling.
MiniApplication -- a very minimal alternative to FrameWork.py, MiniApplication -- a very minimal alternative to FrameWork.py,
only suitable for the simplest of AppleEvent servers. only suitable for the simplest of AppleEvent servers.
""" """
import sys import sys
...@@ -21,179 +21,179 @@ from Carbon import Qd ...@@ -21,179 +21,179 @@ from Carbon import Qd
import aetools import aetools
import EasyDialogs import EasyDialogs
kHighLevelEvent = 23 # Not defined anywhere for Python yet? kHighLevelEvent = 23 # Not defined anywhere for Python yet?
class MiniApplication: class MiniApplication:
"""A minimal FrameWork.Application-like class""" """A minimal FrameWork.Application-like class"""
def __init__(self): def __init__(self):
self.quitting = 0 self.quitting = 0
# Initialize menu # Initialize menu
self.appleid = 1 self.appleid = 1
self.quitid = 2 self.quitid = 2
Menu.ClearMenuBar() Menu.ClearMenuBar()
self.applemenu = applemenu = Menu.NewMenu(self.appleid, "\024") self.applemenu = applemenu = Menu.NewMenu(self.appleid, "\024")
applemenu.AppendMenu("%s;(-" % self.getaboutmenutext()) applemenu.AppendMenu("%s;(-" % self.getaboutmenutext())
if MacOS.runtimemodel == 'ppc': if MacOS.runtimemodel == 'ppc':
applemenu.AppendResMenu('DRVR') applemenu.AppendResMenu('DRVR')
applemenu.InsertMenu(0) applemenu.InsertMenu(0)
self.quitmenu = Menu.NewMenu(self.quitid, "File") self.quitmenu = Menu.NewMenu(self.quitid, "File")
self.quitmenu.AppendMenu("Quit") self.quitmenu.AppendMenu("Quit")
self.quitmenu.SetItemCmd(1, ord("Q")) self.quitmenu.SetItemCmd(1, ord("Q"))
self.quitmenu.InsertMenu(0) self.quitmenu.InsertMenu(0)
Menu.DrawMenuBar() Menu.DrawMenuBar()
def __del__(self): def __del__(self):
self.close() self.close()
def close(self): def close(self):
pass pass
def mainloop(self, mask = everyEvent, timeout = 60*60): def mainloop(self, mask = everyEvent, timeout = 60*60):
while not self.quitting: while not self.quitting:
self.dooneevent(mask, timeout) self.dooneevent(mask, timeout)
def _quit(self): def _quit(self):
self.quitting = 1 self.quitting = 1
def dooneevent(self, mask = everyEvent, timeout = 60*60): def dooneevent(self, mask = everyEvent, timeout = 60*60):
got, event = Evt.WaitNextEvent(mask, timeout) got, event = Evt.WaitNextEvent(mask, timeout)
if got: if got:
self.lowlevelhandler(event) self.lowlevelhandler(event)
def lowlevelhandler(self, event): def lowlevelhandler(self, event):
what, message, when, where, modifiers = event what, message, when, where, modifiers = event
h, v = where h, v = where
if what == kHighLevelEvent: if what == kHighLevelEvent:
msg = "High Level Event: %s %s" % \ msg = "High Level Event: %s %s" % \
(`code(message)`, `code(h | (v<<16))`) (`code(message)`, `code(h | (v<<16))`)
try: try:
AE.AEProcessAppleEvent(event) AE.AEProcessAppleEvent(event)
except AE.Error, err: except AE.Error, err:
print 'AE error: ', err print 'AE error: ', err
print 'in', msg print 'in', msg
traceback.print_exc() traceback.print_exc()
return return
elif what == keyDown: elif what == keyDown:
c = chr(message & charCodeMask) c = chr(message & charCodeMask)
if modifiers & cmdKey: if modifiers & cmdKey:
if c == '.': if c == '.':
raise KeyboardInterrupt, "Command-period" raise KeyboardInterrupt, "Command-period"
if c == 'q': if c == 'q':
if hasattr(MacOS, 'OutputSeen'): if hasattr(MacOS, 'OutputSeen'):
MacOS.OutputSeen() MacOS.OutputSeen()
self.quitting = 1 self.quitting = 1
return return
elif what == mouseDown: elif what == mouseDown:
partcode, window = Win.FindWindow(where) partcode, window = Win.FindWindow(where)
if partcode == inMenuBar: if partcode == inMenuBar:
result = Menu.MenuSelect(where) result = Menu.MenuSelect(where)
id = (result>>16) & 0xffff # Hi word id = (result>>16) & 0xffff # Hi word
item = result & 0xffff # Lo word item = result & 0xffff # Lo word
if id == self.appleid: if id == self.appleid:
if item == 1: if item == 1:
EasyDialogs.Message(self.getabouttext()) EasyDialogs.Message(self.getabouttext())
elif item > 1 and hasattr(Menu, 'OpenDeskAcc'): elif item > 1 and hasattr(Menu, 'OpenDeskAcc'):
name = self.applemenu.GetMenuItemText(item) name = self.applemenu.GetMenuItemText(item)
Menu.OpenDeskAcc(name) Menu.OpenDeskAcc(name)
elif id == self.quitid and item == 1: elif id == self.quitid and item == 1:
if hasattr(MacOS, 'OutputSeen'): if hasattr(MacOS, 'OutputSeen'):
MacOS.OutputSeen() MacOS.OutputSeen()
self.quitting = 1 self.quitting = 1
Menu.HiliteMenu(0) Menu.HiliteMenu(0)
return return
# Anything not handled is passed to Python/SIOUX # Anything not handled is passed to Python/SIOUX
if hasattr(MacOS, 'HandleEvent'): if hasattr(MacOS, 'HandleEvent'):
MacOS.HandleEvent(event) MacOS.HandleEvent(event)
else: else:
print "Unhandled event:", event print "Unhandled event:", event
def getabouttext(self): def getabouttext(self):
return self.__class__.__name__ return self.__class__.__name__
def getaboutmenutext(self): def getaboutmenutext(self):
return "About %s\311" % self.__class__.__name__ return "About %s\311" % self.__class__.__name__
class AEServer: class AEServer:
def __init__(self): def __init__(self):
self.ae_handlers = {} self.ae_handlers = {}
def installaehandler(self, classe, type, callback): def installaehandler(self, classe, type, callback):
AE.AEInstallEventHandler(classe, type, self.callback_wrapper) AE.AEInstallEventHandler(classe, type, self.callback_wrapper)
self.ae_handlers[(classe, type)] = callback self.ae_handlers[(classe, type)] = callback
def close(self): def close(self):
for classe, type in self.ae_handlers.keys(): for classe, type in self.ae_handlers.keys():
AE.AERemoveEventHandler(classe, type) AE.AERemoveEventHandler(classe, type)
def callback_wrapper(self, _request, _reply): def callback_wrapper(self, _request, _reply):
_parameters, _attributes = aetools.unpackevent(_request) _parameters, _attributes = aetools.unpackevent(_request)
_class = _attributes['evcl'].type _class = _attributes['evcl'].type
_type = _attributes['evid'].type _type = _attributes['evid'].type
if self.ae_handlers.has_key((_class, _type)): if self.ae_handlers.has_key((_class, _type)):
_function = self.ae_handlers[(_class, _type)] _function = self.ae_handlers[(_class, _type)]
elif self.ae_handlers.has_key((_class, '****')): elif self.ae_handlers.has_key((_class, '****')):
_function = self.ae_handlers[(_class, '****')] _function = self.ae_handlers[(_class, '****')]
elif self.ae_handlers.has_key(('****', '****')): elif self.ae_handlers.has_key(('****', '****')):
_function = self.ae_handlers[('****', '****')] _function = self.ae_handlers[('****', '****')]
else: else:
raise 'Cannot happen: AE callback without handler', (_class, _type) raise 'Cannot happen: AE callback without handler', (_class, _type)
# XXXX Do key-to-name mapping here # XXXX Do key-to-name mapping here
_parameters['_attributes'] = _attributes _parameters['_attributes'] = _attributes
_parameters['_class'] = _class _parameters['_class'] = _class
_parameters['_type'] = _type _parameters['_type'] = _type
if _parameters.has_key('----'): if _parameters.has_key('----'):
_object = _parameters['----'] _object = _parameters['----']
del _parameters['----'] del _parameters['----']
# The try/except that used to be here can mask programmer errors. # The try/except that used to be here can mask programmer errors.
# Let the program crash, the programmer can always add a **args # Let the program crash, the programmer can always add a **args
# to the formal parameter list. # to the formal parameter list.
rv = _function(_object, **_parameters) rv = _function(_object, **_parameters)
else: else:
#Same try/except comment as above #Same try/except comment as above
rv = _function(**_parameters) rv = _function(**_parameters)
if rv == None: if rv == None:
aetools.packevent(_reply, {}) aetools.packevent(_reply, {})
else: else:
aetools.packevent(_reply, {'----':rv}) aetools.packevent(_reply, {'----':rv})
def code(x): def code(x):
"Convert a long int to the 4-character code it really is" "Convert a long int to the 4-character code it really is"
s = '' s = ''
for i in range(4): for i in range(4):
x, c = divmod(x, 256) x, c = divmod(x, 256)
s = chr(c) + s s = chr(c) + s
return s return s
class _Test(AEServer, MiniApplication): class _Test(AEServer, MiniApplication):
"""Mini test application, handles required events""" """Mini test application, handles required events"""
def __init__(self): def __init__(self):
MiniApplication.__init__(self) MiniApplication.__init__(self)
AEServer.__init__(self) AEServer.__init__(self)
self.installaehandler('aevt', 'oapp', self.open_app) self.installaehandler('aevt', 'oapp', self.open_app)
self.installaehandler('aevt', 'quit', self.quit) self.installaehandler('aevt', 'quit', self.quit)
self.installaehandler('****', '****', self.other) self.installaehandler('****', '****', self.other)
self.mainloop() self.mainloop()
def quit(self, **args): def quit(self, **args):
self._quit() self._quit()
def open_app(self, **args): def open_app(self, **args):
pass pass
def other(self, _object=None, _class=None, _type=None, **args): def other(self, _object=None, _class=None, _type=None, **args):
print 'AppleEvent', (_class, _type), 'for', _object, 'Other args:', args print 'AppleEvent', (_class, _type), 'for', _object, 'Other args:', args
if __name__ == '__main__': if __name__ == '__main__':
_Test() _Test()
...@@ -12,103 +12,103 @@ import aetools ...@@ -12,103 +12,103 @@ import aetools
class ArgvCollector: class ArgvCollector:
"""A minimal FrameWork.Application-like class""" """A minimal FrameWork.Application-like class"""
def __init__(self): def __init__(self):
self.quitting = 0 self.quitting = 0
self.ae_handlers = {} self.ae_handlers = {}
# Remove the funny -psn_xxx_xxx argument # Remove the funny -psn_xxx_xxx argument
if len(sys.argv) > 1 and sys.argv[1][:4] == '-psn': if len(sys.argv) > 1 and sys.argv[1][:4] == '-psn':
del sys.argv[1] del sys.argv[1]
self.installaehandler('aevt', 'oapp', self.open_app) self.installaehandler('aevt', 'oapp', self.open_app)
self.installaehandler('aevt', 'odoc', self.open_file) self.installaehandler('aevt', 'odoc', self.open_file)
def installaehandler(self, classe, type, callback): def installaehandler(self, classe, type, callback):
AE.AEInstallEventHandler(classe, type, self.callback_wrapper) AE.AEInstallEventHandler(classe, type, self.callback_wrapper)
self.ae_handlers[(classe, type)] = callback self.ae_handlers[(classe, type)] = callback
def close(self): def close(self):
for classe, type in self.ae_handlers.keys(): for classe, type in self.ae_handlers.keys():
AE.AERemoveEventHandler(classe, type) AE.AERemoveEventHandler(classe, type)
def mainloop(self, mask = highLevelEventMask, timeout = 1*60): def mainloop(self, mask = highLevelEventMask, timeout = 1*60):
stoptime = Evt.TickCount() + timeout stoptime = Evt.TickCount() + timeout
while not self.quitting and Evt.TickCount() < stoptime: while not self.quitting and Evt.TickCount() < stoptime:
self.dooneevent(mask, timeout) self.dooneevent(mask, timeout)
self.close() self.close()
def _quit(self): def _quit(self):
self.quitting = 1 self.quitting = 1
def dooneevent(self, mask = highLevelEventMask, timeout = 1*60): def dooneevent(self, mask = highLevelEventMask, timeout = 1*60):
got, event = Evt.WaitNextEvent(mask, timeout) got, event = Evt.WaitNextEvent(mask, timeout)
if got: if got:
self.lowlevelhandler(event) self.lowlevelhandler(event)
def lowlevelhandler(self, event): def lowlevelhandler(self, event):
what, message, when, where, modifiers = event what, message, when, where, modifiers = event
h, v = where h, v = where
if what == kHighLevelEvent: if what == kHighLevelEvent:
try: try:
AE.AEProcessAppleEvent(event) AE.AEProcessAppleEvent(event)
except AE.Error, err: except AE.Error, err:
msg = "High Level Event: %s %s" % \ msg = "High Level Event: %s %s" % \
(`hex(message)`, `hex(h | (v<<16))`) (`hex(message)`, `hex(h | (v<<16))`)
print 'AE error: ', err print 'AE error: ', err
print 'in', msg print 'in', msg
traceback.print_exc() traceback.print_exc()
return return
else: else:
print "Unhandled event:", event print "Unhandled event:", event
def callback_wrapper(self, _request, _reply): def callback_wrapper(self, _request, _reply):
_parameters, _attributes = aetools.unpackevent(_request) _parameters, _attributes = aetools.unpackevent(_request)
_class = _attributes['evcl'].type _class = _attributes['evcl'].type
_type = _attributes['evid'].type _type = _attributes['evid'].type
if self.ae_handlers.has_key((_class, _type)): if self.ae_handlers.has_key((_class, _type)):
_function = self.ae_handlers[(_class, _type)] _function = self.ae_handlers[(_class, _type)]
elif self.ae_handlers.has_key((_class, '****')): elif self.ae_handlers.has_key((_class, '****')):
_function = self.ae_handlers[(_class, '****')] _function = self.ae_handlers[(_class, '****')]
elif self.ae_handlers.has_key(('****', '****')): elif self.ae_handlers.has_key(('****', '****')):
_function = self.ae_handlers[('****', '****')] _function = self.ae_handlers[('****', '****')]
else: else:
raise 'Cannot happen: AE callback without handler', (_class, _type) raise 'Cannot happen: AE callback without handler', (_class, _type)
# XXXX Do key-to-name mapping here # XXXX Do key-to-name mapping here
_parameters['_attributes'] = _attributes _parameters['_attributes'] = _attributes
_parameters['_class'] = _class _parameters['_class'] = _class
_parameters['_type'] = _type _parameters['_type'] = _type
if _parameters.has_key('----'): if _parameters.has_key('----'):
_object = _parameters['----'] _object = _parameters['----']
del _parameters['----'] del _parameters['----']
# The try/except that used to be here can mask programmer errors. # The try/except that used to be here can mask programmer errors.
# Let the program crash, the programmer can always add a **args # Let the program crash, the programmer can always add a **args
# to the formal parameter list. # to the formal parameter list.
rv = _function(_object, **_parameters) rv = _function(_object, **_parameters)
else: else:
#Same try/except comment as above #Same try/except comment as above
rv = _function(**_parameters) rv = _function(**_parameters)
if rv == None: if rv == None:
aetools.packevent(_reply, {}) aetools.packevent(_reply, {})
else: else:
aetools.packevent(_reply, {'----':rv}) aetools.packevent(_reply, {'----':rv})
def open_app(self, **args): def open_app(self, **args):
self._quit() self._quit()
def open_file(self, _object=None, **args): def open_file(self, _object=None, **args):
for alias in _object: for alias in _object:
fsr = alias.FSResolveAlias(None)[0] fsr = alias.FSResolveAlias(None)[0]
pathname = fsr.as_pathname() pathname = fsr.as_pathname()
sys.argv.append(pathname) sys.argv.append(pathname)
self._quit() self._quit()
def other(self, _object=None, _class=None, _type=None, **args): def other(self, _object=None, _class=None, _type=None, **args):
print 'Ignore AppleEvent', (_class, _type), 'for', _object, 'Other args:', args print 'Ignore AppleEvent', (_class, _type), 'for', _object, 'Other args:', args
if __name__ == '__main__': if __name__ == '__main__':
ArgvCollector().mainloop() ArgvCollector().mainloop()
print "sys.argv=", sys.argv print "sys.argv=", sys.argv
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment