blob: 504e9dccc5a72eea78ccb461827d7643a223b83b [file] [log] [blame]
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +00001"A sort of application framework for the Mac"
2
Jack Jansen7a583361995-08-14 12:39:54 +00003DEBUG=0
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +00004
5import MacOS
6import traceback
7
8from addpack import addpack
Jack Jansene4b40381995-07-17 13:25:15 +00009addpack('Tools')
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000010addpack('bgen')
11addpack('ae')
Jack Jansen7a583361995-08-14 12:39:54 +000012addpack('ctl')
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000013addpack('dlg')
14addpack('evt')
15addpack('menu')
Jack Jansen7a583361995-08-14 12:39:54 +000016addpack('qd')
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000017#addpack('res')
18#addpack('snd')
19addpack('win')
20
21from AE import *
22from AppleEvents import *
Jack Jansen7a583361995-08-14 12:39:54 +000023from Ctl import *
24from Controls import *
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000025from Dlg import *
26from Dialogs import *
27from Evt import *
28from Events import *
29from Menu import *
30from Menus import *
Jack Jansen7a583361995-08-14 12:39:54 +000031from Qd import *
32from QuickDraw import *
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000033#from Res import *
34#from Resources import *
35#from Snd import *
36#from Sound import *
37from Win import *
38from Windows import *
39
40import EasyDialogs
41
42kHighLevelEvent = 23 # Don't know what header file this should come from
43
44
45# Map event 'what' field to strings
46eventname = {}
47eventname[1] = 'mouseDown'
48eventname[2] = 'mouseUp'
49eventname[3] = 'keyDown'
50eventname[4] = 'keyUp'
51eventname[5] = 'autoKey'
52eventname[6] = 'updateEvt'
53eventname[7] = 'diskEvt'
54eventname[8] = 'activateEvt'
55eventname[15] = 'osEvt'
56eventname[23] = 'kHighLevelEvent'
57
58# Map part codes returned by WhichWindow() to strings
59partname = {}
60partname[0] = 'inDesk'
61partname[1] = 'inMenuBar'
62partname[2] = 'inSysWindow'
63partname[3] = 'inContent'
64partname[4] = 'inDrag'
65partname[5] = 'inGrow'
66partname[6] = 'inGoAway'
67partname[7] = 'inZoomIn'
68partname[8] = 'inZoomOut'
69
70# A rectangle that's bigger than the screen,
71# but not so big that adding the screen size to it will cause 16-bit overflow
72everywhere = (-16000, -16000, 16000, 16000)
73
74
75class Application:
76
77 "Application framework -- your application should be a derived class"
78
79 def __init__(self):
Jack Jansen7e0da901995-08-17 14:18:20 +000080 self._windows = {}
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000081 self.makemenubar()
82
83 def makemenubar(self):
84 self.menubar = MenuBar()
85 AppleMenu(self.menubar, self.getabouttext(), self.do_about)
86 self.makeusermenus()
Jack Jansenc8a99491996-01-08 23:50:13 +000087
88 def makeusermenus(self):
89 self.filemenu = m = Menu(self.menubar, "File")
90 self._quititem = MenuItem(m, "Quit", "Q", self._quit)
91
92 def _quit(self, *args):
93 raise self
Jack Jansen7e0da901995-08-17 14:18:20 +000094
95 def appendwindow(self, wid, window):
96 self._windows[wid] = window
97
98 def removewindow(self, wid):
99 del self._windows[wid]
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000100
101 def getabouttext(self):
102 return "About %s..." % self.__class__.__name__
103
104 def do_about(self, id, item, window, event):
105 EasyDialogs.Message("Hello, world!" + "\015(%s)" % self.__class__.__name__)
106
107 # The main event loop is broken up in several simple steps.
108 # This is done so you can override each individual part,
109 # if you have a need to do extra processing independent of the
110 # event type.
111 # Normally, however, you'd just define handlers for individual
112 # events.
113 # (XXX I'm not sure if using default parameter values is the right
114 # way to define the mask and wait time passed to WaitNextEvent.)
115
116 def mainloop(self, mask = everyEvent, wait = 0):
117 saveyield = MacOS.EnableAppswitch(self.yield)
118 try:
119 while 1:
120 try:
121 self.do1event(mask, wait)
122 except (Application, SystemExit):
123 break
124 finally:
125 MacOS.EnableAppswitch(saveyield)
126
127 yield = -1
128
129 def do1event(self, mask = everyEvent, wait = 0):
Jack Jansen13dc4f71995-08-31 13:38:01 +0000130 ok, event = self.getevent(mask, wait)
131 if IsDialogEvent(event):
132 if self.do_dialogevent(event):
133 return
134 if ok:
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000135 self.dispatch(event)
Jack Jansen38186781995-11-10 14:48:36 +0000136 else:
137 self.idle()
138
139 def idle(self):
140 pass
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000141
142 def getevent(self, mask = everyEvent, wait = 0):
143 ok, event = WaitNextEvent(mask, wait)
Jack Jansen13dc4f71995-08-31 13:38:01 +0000144 return ok, event
145
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000146 def dispatch(self, event):
147 (what, message, when, where, modifiers) = event
148 if eventname.has_key(what):
149 name = "do_" + eventname[what]
150 else:
151 name = "do_%d" % what
152 try:
153 handler = getattr(self, name)
154 except AttributeError:
155 handler = self.do_unknownevent
156 handler(event)
Jack Jansen7e0da901995-08-17 14:18:20 +0000157
158 def do_dialogevent(self, event):
159 gotone, window, item = DialogSelect(event)
160 if gotone:
161 if self._windows.has_key(window):
Jack Jansen13dc4f71995-08-31 13:38:01 +0000162 self._windows[window].do_itemhit(item, event)
Jack Jansen7e0da901995-08-17 14:18:20 +0000163 else:
164 print 'Dialog event for unknown dialog'
Jack Jansen13dc4f71995-08-31 13:38:01 +0000165 return 1
166 return 0
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000167
168 def do_mouseDown(self, event):
169 (what, message, when, where, modifiers) = event
Jack Jansen7e0da901995-08-17 14:18:20 +0000170 partcode, wid = FindWindow(where)
171
172 #
173 # Find the correct name.
174 #
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000175 if partname.has_key(partcode):
176 name = "do_" + partname[partcode]
177 else:
178 name = "do_%d" % partcode
Jack Jansen7e0da901995-08-17 14:18:20 +0000179
180 if wid == None:
181 # No window, or a non-python window
182 try:
183 handler = getattr(self, name)
184 except AttributeError:
185 # Not menubar or something, so assume someone
186 # else's window
187 MacOS.HandleEvent(event)
188 return
189 elif self._windows.has_key(wid):
190 # It is a window. Hand off to correct window.
191 window = self._windows[wid]
192 try:
193 handler = getattr(window, name)
194 except AttributeError:
195 handler = self.do_unknownpartcode
196 else:
197 # It is a python-toolbox window, but not ours.
198 handler = self.do_unknownwindow
199 handler(partcode, wid, event)
200
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000201 def do_inSysWindow(self, partcode, window, event):
Jack Jansen7a583361995-08-14 12:39:54 +0000202 MacOS.HandleEvent(event)
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000203
204 def do_inDesk(self, partcode, window, event):
Jack Jansen7a583361995-08-14 12:39:54 +0000205 MacOS.HandleEvent(event)
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000206
207 def do_inMenuBar(self, partcode, window, event):
208 (what, message, when, where, modifiers) = event
209 result = MenuSelect(where)
210 id = (result>>16) & 0xffff # Hi word
211 item = result & 0xffff # Lo word
212 self.do_rawmenu(id, item, window, event)
213
214 def do_rawmenu(self, id, item, window, event):
215 try:
216 self.do_menu(id, item, window, event)
217 finally:
218 HiliteMenu(0)
219
220 def do_menu(self, id, item, window, event):
221 self.menubar.dispatch(id, item, window, event)
222
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000223
224 def do_unknownpartcode(self, partcode, window, event):
225 (what, message, when, where, modifiers) = event
Jack Jansen7a583361995-08-14 12:39:54 +0000226 if DEBUG: print "Mouse down at global:", where
227 if DEBUG: print "\tUnknown part code:", partcode
Jack Jansen7e0da901995-08-17 14:18:20 +0000228 if DEBUG: print "\tEvent:", self.printevent(event)
229 MacOS.HandleEvent(event)
230
231 def do_unknownwindow(self, partcode, window, event):
232 if DEBUG: print 'Unknown window:', window
Jack Jansen7a583361995-08-14 12:39:54 +0000233 MacOS.HandleEvent(event)
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000234
235 def do_keyDown(self, event):
236 self.do_key(event)
237
238 def do_autoKey(self, event):
239 if not event[-1] & cmdKey:
240 self.do_key(event)
241
242 def do_key(self, event):
243 (what, message, when, where, modifiers) = event
244 c = chr(message & charCodeMask)
245 if modifiers & cmdKey:
246 if c == '.':
247 raise self
248 else:
249 result = MenuKey(ord(c))
250 id = (result>>16) & 0xffff # Hi word
251 item = result & 0xffff # Lo word
252 if id:
253 self.do_rawmenu(id, item, None, event)
Jack Jansen7e0da901995-08-17 14:18:20 +0000254# elif c == 'w':
255# w = FrontWindow()
256# if w:
257# self.do_close(w)
258# else:
259# if DEBUG: print 'Command-W without front window'
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000260 else:
Jack Jansen7a583361995-08-14 12:39:54 +0000261 if DEBUG: print "Command-" +`c`
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000262 else:
Jack Jansen7e0da901995-08-17 14:18:20 +0000263 # See whether the front window wants it
264 w = FrontWindow()
265 if w and self._windows.has_key(w):
266 window = self._windows[w]
267 try:
268 do_char = window.do_char
269 except AttributeError:
270 do_char = self.do_char
Jack Jansen6f47bf41995-12-12 15:03:35 +0000271 do_char(c, event)
272 # else it wasn't for us, sigh...
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000273
274 def do_char(self, c, event):
Jack Jansen7a583361995-08-14 12:39:54 +0000275 if DEBUG: print "Character", `c`
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000276
277 def do_updateEvt(self, event):
Jack Jansen7e0da901995-08-17 14:18:20 +0000278 (what, message, when, where, modifiers) = event
279 wid = WhichWindow(message)
280 if wid and self._windows.has_key(wid):
281 window = self._windows[wid]
282 window.do_rawupdate(wid, event)
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000283 else:
Jack Jansen7a583361995-08-14 12:39:54 +0000284 MacOS.HandleEvent(event)
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000285
Jack Jansen7e0da901995-08-17 14:18:20 +0000286 def do_activateEvt(self, event):
287 (what, message, when, where, modifiers) = event
Jack Jansenc8a99491996-01-08 23:50:13 +0000288 # XXXX Incorrect, should be fixed in suspendresume
289 if type(message) == type(1):
290 wid = WhichWindow(message)
291 else:
292 wid = message
Jack Jansen7e0da901995-08-17 14:18:20 +0000293 if wid and self._windows.has_key(wid):
294 window = self._windows[wid]
295 window.do_activate(modifiers & 1, event)
296 else:
297 MacOS.HandleEvent(event)
298
299 def do_osEvt(self, event):
300 (what, message, when, where, modifiers) = event
301 which = (message >> 24) & 0xff
302 if which == 1: # suspend/resume
303 self.do_suspendresume(event)
304 else:
305 if DEBUG:
306 print 'unknown osEvt:',
307 self.printevent(event)
308
309 def do_suspendresume(self, event):
310 # Is this a good idea???
311 (what, message, when, where, modifiers) = event
312 w = FrontWindow()
313 if w:
Jack Jansenc8a99491996-01-08 23:50:13 +0000314 # XXXX Incorrect, should stuff windowptr into message field
Jack Jansen7e0da901995-08-17 14:18:20 +0000315 nev = (activateEvt, w, when, where, message&1)
Jack Jansenc8a99491996-01-08 23:50:13 +0000316 self.do_activateEvt(nev)
Jack Jansen7e0da901995-08-17 14:18:20 +0000317
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000318 def do_kHighLevelEvent(self, event):
319 (what, message, when, where, modifiers) = event
Jack Jansen7a583361995-08-14 12:39:54 +0000320 if DEBUG:
321 print "High Level Event:",
322 self.printevent(event)
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000323 try:
324 AEProcessAppleEvent(event)
325 except:
326 print "AEProcessAppleEvent error:"
327 traceback.print_exc()
328
329 def do_unknownevent(self, event):
Jack Jansen7e0da901995-08-17 14:18:20 +0000330 if DEBUG:
331 print "Unhandled event:",
332 self.printevent(event)
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000333
334 def printevent(self, event):
335 (what, message, when, where, modifiers) = event
336 nicewhat = `what`
337 if eventname.has_key(what):
338 nicewhat = eventname[what]
339 print nicewhat,
340 if what == kHighLevelEvent:
341 h, v = where
342 print `ostypecode(message)`, hex(when), `ostypecode(h | (v<<16))`,
343 else:
344 print hex(message), hex(when), where,
345 print hex(modifiers)
346
347
348class MenuBar:
349 """Represent a set of menus in a menu bar.
350
351 Interface:
352
353 - (constructor)
354 - (destructor)
355 - addmenu
356 - addpopup (normally used internally)
357 - dispatch (called from Application)
358 """
359
360 nextid = 1 # Necessarily a class variable
361
362 def getnextid(self):
363 id = self.nextid
364 self.nextid = id+1
365 return id
366
367 def __init__(self):
368 ClearMenuBar()
369 self.bar = GetMenuBar()
370 self.menus = {}
371
372 def addmenu(self, title, after = 0):
373 id = self.getnextid()
Jack Jansendb9ff361996-03-12 13:32:03 +0000374 print 'Newmenu', title, id # XXXX
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000375 m = NewMenu(id, title)
376 m.InsertMenu(after)
377 DrawMenuBar()
378 return id, m
Jack Jansendb9ff361996-03-12 13:32:03 +0000379
380 def delmenu(self, id):
381 print 'Delmenu', id # XXXX
382 DeleteMenu(id)
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000383
384 def addpopup(self, title = ''):
385 return self.addmenu(title, -1)
386
387 def install(self):
388 self.bar.SetMenuBar()
389 DrawMenuBar()
390
391 def dispatch(self, id, item, window, event):
392 if self.menus.has_key(id):
393 self.menus[id].dispatch(id, item, window, event)
394 else:
Jack Jansen7a583361995-08-14 12:39:54 +0000395 if DEBUG: print "MenuBar.dispatch(%d, %d, %s, %s)" % \
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000396 (id, item, window, event)
397
398
399# XXX Need a way to get menus as resources and bind them to callbacks
400
401class Menu:
402 "One menu."
403
404 def __init__(self, bar, title, after=0):
405 self.bar = bar
406 self.id, self.menu = self.bar.addmenu(title, after)
407 bar.menus[self.id] = self
408 self.items = []
Jack Jansendb9ff361996-03-12 13:32:03 +0000409
410 def delete(self):
411 self.bar.delmenu(self.id)
412 del self.bar.menus[self.id]
413 del self.bar
414 del self.items
415 del self.menu
416 del self.id
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000417
418 def additem(self, label, shortcut=None, callback=None, kind=None):
419 self.menu.AppendMenu('x') # add a dummy string
420 self.items.append(label, shortcut, callback, kind)
421 item = len(self.items)
Jack Jansene4b40381995-07-17 13:25:15 +0000422 self.menu.SetMenuItemText(item, label) # set the actual text
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000423 if shortcut:
424 self.menu.SetItemCmd(item, ord(shortcut))
425 return item
426
427 def addcheck(self, label, shortcut=None, callback=None):
428 return self.additem(label, shortcut, callback, 'check')
429
430 def addradio(self, label, shortcut=None, callback=None):
431 return self.additem(label, shortcut, callback, 'radio')
432
433 def addseparator(self):
434 self.menu.AppendMenu('(-')
435 self.items.append('', None, None, 'separator')
436
437 def addsubmenu(self, label, title=''):
438 sub = Menu(self.bar, title, -1)
439 item = self.additem(label, '\x1B', None, 'submenu')
440 self.menu.SetItemMark(item, sub.id)
441 return sub
442
443 def dispatch(self, id, item, window, event):
444 title, shortcut, callback, type = self.items[item-1]
445 if callback:
446 callback(id, item, window, event)
447
448
449class MenuItem:
450 def __init__(self, menu, title, shortcut=None, callback=None, kind=None):
451 self.item = menu.additem(title, shortcut, callback)
Jack Jansendb9ff361996-03-12 13:32:03 +0000452 self.menu = menu
453
454 def check(self, onoff):
455 self.menu.menu.CheckItem(self.item, onoff)
456
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000457
458class RadioItem(MenuItem):
459 def __init__(self, menu, title, shortcut=None, callback=None):
460 MenuItem.__init__(self, menu, title, shortcut, callback, 'radio')
461
462class CheckItem(MenuItem):
463 def __init__(self, menu, title, shortcut=None, callback=None):
464 MenuItem.__init__(self, menu, title, shortcut, callback, 'check')
465
466def Separator(menu):
467 menu.addseparator()
468
469def SubMenu(menu, label, title=''):
470 return menu.addsubmenu(label, title)
471
472
473class AppleMenu(Menu):
474
475 def __init__(self, bar, abouttext="About me...", aboutcallback=None):
476 Menu.__init__(self, bar, "\024")
477 self.additem(abouttext, None, aboutcallback)
478 self.addseparator()
Jack Jansene4b40381995-07-17 13:25:15 +0000479 self.menu.AppendResMenu('DRVR')
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000480
481 def dispatch(self, id, item, window, event):
482 if item == 1:
483 Menu.dispatch(self, id, item, window, event)
484 else:
Jack Jansenc8a99491996-01-08 23:50:13 +0000485 name = self.menu.GetMenuItemText(item)
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000486 OpenDeskAcc(name)
487
Jack Jansen7e0da901995-08-17 14:18:20 +0000488class Window:
489 """A single window belonging to an application"""
490
491 def __init__(self, parent):
492 self.wid = None
493 self.parent = parent
494
Jack Jansenc8a99491996-01-08 23:50:13 +0000495 def open(self, bounds=(40, 40, 400, 400), resid=None):
496 if resid <> None:
497 self.wid = GetNewWindow(resid, -1)
498 else:
499 self.wid = NewWindow(bounds, self.__class__.__name__, 1,
Jack Jansen7e0da901995-08-17 14:18:20 +0000500 0, -1, 1, 0)
501 self.do_postopen()
502
503 def do_postopen(self):
504 """Tell our parent we exist"""
505 self.parent.appendwindow(self.wid, self)
506
507 def close(self):
Jack Jansen7e0da901995-08-17 14:18:20 +0000508 self.do_postclose()
509
510 def do_postclose(self):
511 self.parent.removewindow(self.wid)
512 self.parent = None
513 self.wid = None
Jack Jansenc8a99491996-01-08 23:50:13 +0000514
515 def SetPort(self):
516 # Convinience method
517 SetPort(self.wid)
Jack Jansen7e0da901995-08-17 14:18:20 +0000518
519 def do_inDrag(self, partcode, window, event):
520 where = event[3]
521 window.DragWindow(where, self.draglimit)
522
523 draglimit = everywhere
524
525 def do_inGoAway(self, partcode, window, event):
526 where = event[3]
527 if window.TrackGoAway(where):
528 self.close()
529
530 def do_inZoom(self, partcode, window, event):
531 (what, message, when, where, modifiers) = event
532 if window.TrackBox(where, partcode):
533 window.ZoomWindow(partcode, 1)
534
535 def do_inZoomIn(self, partcode, window, event):
536 SetPort(window) # !!!
537 self.do_inZoom(partcode, window, event)
538
539 def do_inZoomOut(self, partcode, window, event):
540 SetPort(window) # !!!
541 self.do_inZoom(partcode, window, event)
542
543 def do_inGrow(self, partcode, window, event):
544 (what, message, when, where, modifiers) = event
545 result = window.GrowWindow(where, self.growlimit)
546 if result:
547 height = (result>>16) & 0xffff # Hi word
548 width = result & 0xffff # Lo word
549 self.do_resize(width, height, window)
550
551 growlimit = everywhere
552
553 def do_resize(self, width, height, window):
554 window.SizeWindow(width, height, 0)
555 self.do_postresize(width, height, window)
556
557 def do_postresize(self, width, height, window):
558 SetPort(window)
559 InvalRect(everywhere)
560
561 def do_inContent(self, partcode, window, event):
562 #
563 # If we're not frontmost, select ourselves and wait for
564 # the activate event.
565 #
566 if FrontWindow() <> window:
567 window.SelectWindow()
568 return
569 # We are. Handle the event.
570 (what, message, when, where, modifiers) = event
571 SetPort(window)
572 local = GlobalToLocal(where)
573 self.do_contentclick(local, modifiers, event)
574
575 def do_contentclick(self, local, modifiers, event):
576 print 'Click in contents at %s, modifiers %s'%(local, modifiers)
577
578 def do_rawupdate(self, window, event):
579 if DEBUG: print "raw update for", window
Jack Jansenda38f2d1995-11-14 10:15:42 +0000580 SetPort(window)
Jack Jansen7e0da901995-08-17 14:18:20 +0000581 window.BeginUpdate()
582 self.do_update(window, event)
583 window.EndUpdate()
584
585 def do_update(self, window, event):
586 EraseRect(everywhere)
587
588 def do_activate(self, activate, event):
589 if DEBUG: print 'Activate %d for %s'%(activate, self.wid)
590
591class ControlsWindow(Window):
592
593 def do_rawupdate(self, window, event):
594 if DEBUG: print "raw update for", window
595 window.BeginUpdate()
596 self.do_update(window, event)
597 DrawControls(window)
598 window.DrawGrowIcon()
599 window.EndUpdate()
600
601 def do_controlhit(self, window, control, pcode, event):
602 if DEBUG: print "control hit in", window, "on", control, "; pcode =", pcode
603
604 def do_inContent(self, partcode, window, event):
605 (what, message, when, where, modifiers) = event
Jack Jansenda38f2d1995-11-14 10:15:42 +0000606 SetPort(window) # XXXX Needed?
Jack Jansen7e0da901995-08-17 14:18:20 +0000607 local = GlobalToLocal(where)
608 ctltype, control = FindControl(local, window)
609 if ctltype and control:
610 pcode = control.TrackControl(local)
611 if pcode:
612 self.do_controlhit(window, control, pcode, event)
613 else:
614 if DEBUG: print "FindControl(%s, %s) -> (%s, %s)" % \
615 (local, window, ctltype, control)
616
617class DialogWindow(Window):
618 """A modeless dialog window"""
619
620 def open(self, resid):
621 self.wid = GetNewDialog(resid, -1)
622 self.do_postopen()
623
624 def close(self):
Jack Jansen7e0da901995-08-17 14:18:20 +0000625 self.do_postclose()
626
627 def do_itemhit(self, item, event):
628 print 'Dialog %s, item %d hit'%(self.wid, item)
629
630 def do_rawupdate(self, window, event):
631 pass
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000632
633def ostypecode(x):
634 "Convert a long int to the 4-character code it really is"
635 s = ''
636 for i in range(4):
637 x, c = divmod(x, 256)
638 s = chr(c) + s
639 return s
640
641
642class TestApp(Application):
643
644 "This class is used by the test() function"
645
646 def makeusermenus(self):
647 self.filemenu = m = Menu(self.menubar, "File")
648 self.saveitem = MenuItem(m, "Save", "S", self.save)
649 Separator(m)
650 self.optionsmenu = mm = SubMenu(m, "Options")
651 self.opt1 = CheckItem(mm, "Arguments")
652 self.opt2 = CheckItem(mm, "Being hit on the head lessons")
653 self.opt3 = CheckItem(mm, "Complaints")
654 Separator(m)
655 self.quititem = MenuItem(m, "Quit", "Q", self.quit)
656
657 def save(self, *args):
658 print "Save"
659
660 def quit(self, *args):
661 raise self
662
663
664def test():
665 "Test program"
666 app = TestApp()
667 app.mainloop()
668
669
670if __name__ == '__main__':
671 test()