Oops -- Lib/Test should be Lib/test, of course!
[python/dscho.git] / Mac / Lib / test / AEservertest.py
blob1e3e508a4fb53a381f8f6a3374c8b7ef94a8be61
1 """AEservertest - Test AppleEvent server interface
3 (adapted from Guido's 'echo' program).
5 Build an applet from this source, and include the aete resource that you
6 want to test. Use the AEservertest script to try things.
7 """
9 import sys
10 sys.stdout = sys.stderr
11 import traceback
12 import MacOS
13 import AE
14 from AppleEvents import *
15 import Evt
16 from Events import *
17 import Menu
18 import Dlg
19 import Win
20 from Windows import *
21 import Qd
22 import macfs
24 import aetools
25 import EasyDialogs
27 kHighLevelEvent = 23 # Not defined anywhere for Python yet?
29 Quit='Quit'
31 def mymessage(str):
32 err = AE.AEInteractWithUser(kAEDefaultTimeout)
33 if err:
34 print str
35 EasyDialogs.Message(str)
37 def myaskstring(str, default=''):
38 err = AE.AEInteractWithUser(kAEDefaultTimeout)
39 if err:
40 return default
41 return EasyDialogs.AskString(str, default)
43 def main():
44 echo = EchoServer()
45 savepars = MacOS.SchedParams(0, 0) # Disable Python's own "event handling"
46 try:
47 try:
48 echo.mainloop(everyEvent, 0)
49 except Quit:
50 pass
51 finally:
52 apply(MacOS.SchedParams, savepars) # Let Python have a go at events
53 echo.close()
56 class EchoServer:
58 suites = ['aevt', 'core', 'reqd']
60 def __init__(self):
61 self.active = 0
63 # Install the handlers
65 for suite in self.suites:
66 AE.AEInstallEventHandler(suite, typeWildCard, self.aehandler)
67 print (suite, typeWildCard, self.aehandler)
68 self.active = 1
70 # Setup the apple menu and file/quit
72 self.appleid = 1
73 self.fileid = 2
75 Menu.ClearMenuBar()
76 self.applemenu = applemenu = Menu.NewMenu(self.appleid, "\024")
77 applemenu.AppendMenu("All about echo...;(-")
78 applemenu.AppendResMenu('DRVR')
79 applemenu.InsertMenu(0)
81 self.filemenu = Menu.NewMenu(self.fileid, 'File')
82 self.filemenu.AppendMenu("Quit/Q")
83 self.filemenu.InsertMenu(0)
85 Menu.DrawMenuBar()
87 # Set interaction allowed (for the return values)
89 AE.AESetInteractionAllowed(kAEInteractWithAll)
91 def __del__(self):
92 self.close()
94 def close(self):
95 if self.active:
96 self.active = 0
97 for suite in self.suites:
98 AE.AERemoveEventHandler(suite, typeWildCard)
100 def mainloop(self, mask = everyEvent, timeout = 60*60):
101 while 1:
102 self.dooneevent(mask, timeout)
104 def dooneevent(self, mask = everyEvent, timeout = 60*60):
105 got, event = Evt.WaitNextEvent(mask, timeout)
106 if got:
107 self.lowlevelhandler(event)
109 def lowlevelhandler(self, event):
110 what, message, when, where, modifiers = event
111 h, v = where
112 if what == kHighLevelEvent:
113 msg = "High Level Event: %s %s" % \
114 (`code(message)`, `code(h | (v<<16))`)
115 self.handled_by_us = 0
116 try:
117 AE.AEProcessAppleEvent(event)
118 except AE.Error, err:
119 mymessage(msg + "\015AEProcessAppleEvent error: %s" % str(err))
120 traceback.print_exc()
121 else:
122 if self.handled_by_us == 0:
123 print msg, "Handled by AE, somehow"
124 else:
125 print msg, 'Handled by us.'
126 elif what == keyDown:
127 c = chr(message & charCodeMask)
128 if modifiers & cmdKey:
129 if c == '.':
130 raise KeyboardInterrupt, "Command-period"
131 else:
132 self.menuhit(Menu.MenuKey(message&charCodeMask))
133 ##MacOS.HandleEvent(event)
134 elif what == mouseDown:
135 partcode, window = Win.FindWindow(where)
136 if partcode == inMenuBar:
137 result = Menu.MenuSelect(where)
138 self.menuhit(result)
139 elif what <> autoKey:
140 print "Event:", (eventname(what), message, when, (h, v), modifiers)
141 ## MacOS.HandleEvent(event)
143 def menuhit(self, result):
144 id = (result>>16) & 0xffff # Hi word
145 item = result & 0xffff # Lo word
146 if id == self.appleid:
147 if item == 1:
148 mymessage("Echo -- echo AppleEvents")
149 elif item > 1:
150 name = self.applemenu.GetItem(item)
151 Qd.OpenDeskAcc(name)
152 elif id == self.fileid:
153 if item == 1:
154 raise Quit
156 def aehandler(self, request, reply):
157 print "Apple Event!"
158 self.handled_by_us = 1
159 parameters, attributes = aetools.unpackevent(request)
160 print "class =", `attributes['evcl'].type`,
161 print "id =", `attributes['evid'].type`
162 print "Parameters:"
163 keys = parameters.keys()
164 keys.sort()
165 for key in keys:
166 print "%s: %.150s" % (`key`, `parameters[key]`)
167 print " :", str(parameters[key])
168 print "Attributes:"
169 keys = attributes.keys()
170 keys.sort()
171 for key in keys:
172 print "%s: %.150s" % (`key`, `attributes[key]`)
173 parameters['----'] = self.askreplyvalue()
174 aetools.packevent(reply, parameters)
176 def askreplyvalue(self):
177 while 1:
178 str = myaskstring('Reply value to send (python-style)', 'None')
179 try:
180 rv = eval(str)
181 break
182 except:
183 pass
184 return rv
186 _eventnames = {
187 keyDown: 'keyDown',
188 autoKey: 'autoKey',
189 mouseDown: 'mouseDown',
190 mouseUp: 'mouseUp',
191 updateEvt: 'updateEvt',
192 diskEvt: 'diskEvt',
193 activateEvt: 'activateEvt',
194 osEvt: 'osEvt',
197 def eventname(what):
198 if _eventnames.has_key(what): return _eventnames[what]
199 else: return `what`
201 def code(x):
202 "Convert a long int to the 4-character code it really is"
203 s = ''
204 for i in range(4):
205 x, c = divmod(x, 256)
206 s = chr(c) + s
207 return s
210 if __name__ == '__main__':
211 main()