| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | "A sort of application framework for the Mac" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-08-14 12:39:54 +00:00
										 |  |  | DEBUG=0 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import MacOS | 
					
						
							|  |  |  | import traceback | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from AE import * | 
					
						
							|  |  |  | from AppleEvents import * | 
					
						
							| 
									
										
										
										
											1995-08-14 12:39:54 +00:00
										 |  |  | from Ctl import * | 
					
						
							|  |  |  | from Controls import * | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | from Dlg import * | 
					
						
							|  |  |  | from Dialogs import * | 
					
						
							|  |  |  | from Evt import * | 
					
						
							|  |  |  | from Events import * | 
					
						
							|  |  |  | from Menu import * | 
					
						
							|  |  |  | from Menus import * | 
					
						
							| 
									
										
										
										
											1995-08-14 12:39:54 +00:00
										 |  |  | from Qd import * | 
					
						
							|  |  |  | from QuickDraw import * | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | #from Res import * | 
					
						
							|  |  |  | #from Resources import * | 
					
						
							|  |  |  | #from Snd import * | 
					
						
							|  |  |  | #from Sound import * | 
					
						
							|  |  |  | from Win import * | 
					
						
							|  |  |  | from Windows import * | 
					
						
							| 
									
										
										
										
											1996-09-26 16:17:08 +00:00
										 |  |  | import types | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import EasyDialogs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | kHighLevelEvent = 23	# Don't know what header file this should come from | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | SCROLLBARWIDTH = 16		# Again, not a clue... | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Map event 'what' field to strings | 
					
						
							|  |  |  | eventname = {} | 
					
						
							|  |  |  | eventname[1] = 'mouseDown' | 
					
						
							|  |  |  | eventname[2] = 'mouseUp' | 
					
						
							|  |  |  | eventname[3] = 'keyDown' | 
					
						
							|  |  |  | eventname[4] = 'keyUp' | 
					
						
							|  |  |  | eventname[5] = 'autoKey' | 
					
						
							|  |  |  | eventname[6] = 'updateEvt' | 
					
						
							|  |  |  | eventname[7] = 'diskEvt' | 
					
						
							|  |  |  | eventname[8] = 'activateEvt' | 
					
						
							|  |  |  | eventname[15] = 'osEvt' | 
					
						
							|  |  |  | eventname[23] = 'kHighLevelEvent' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Map part codes returned by WhichWindow() to strings | 
					
						
							|  |  |  | partname = {} | 
					
						
							|  |  |  | partname[0] = 'inDesk' | 
					
						
							|  |  |  | partname[1] = 'inMenuBar' | 
					
						
							|  |  |  | partname[2] = 'inSysWindow' | 
					
						
							|  |  |  | partname[3] = 'inContent' | 
					
						
							|  |  |  | partname[4] = 'inDrag' | 
					
						
							|  |  |  | partname[5] = 'inGrow' | 
					
						
							|  |  |  | partname[6] = 'inGoAway' | 
					
						
							|  |  |  | partname[7] = 'inZoomIn' | 
					
						
							|  |  |  | partname[8] = 'inZoomOut' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-04-19 16:00:28 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # The useable portion of the screen | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | #	## but what happens with multiple screens? jvr | 
					
						
							| 
									
										
										
										
											1996-04-19 16:00:28 +00:00
										 |  |  | screenbounds = qd.screenBits.bounds | 
					
						
							|  |  |  | screenbounds = screenbounds[0]+4, screenbounds[1]+4, \ | 
					
						
							|  |  |  | 	screenbounds[2]-4, screenbounds[3]-4 | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | next_window_x = 16		# jvr | 
					
						
							|  |  |  | next_window_y = 44		# jvr | 
					
						
							| 
									
										
										
										
											1996-04-19 16:00:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def windowbounds(width, height): | 
					
						
							|  |  |  | 	"Return sensible window bounds" | 
					
						
							|  |  |  | 	global next_window_x, next_window_y | 
					
						
							|  |  |  | 	r, b = next_window_x+width, next_window_y+height | 
					
						
							|  |  |  | 	if r > screenbounds[2]: | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 		next_window_x = 16 | 
					
						
							| 
									
										
										
										
											1996-04-19 16:00:28 +00:00
										 |  |  | 	if b > screenbounds[3]: | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 		next_window_y = 44 | 
					
						
							| 
									
										
										
										
											1996-04-19 16:00:28 +00:00
										 |  |  | 	l, t = next_window_x, next_window_y | 
					
						
							|  |  |  | 	r, b = next_window_x+width, next_window_y+height | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 	next_window_x, next_window_y = next_window_x + 8, next_window_y + 20	# jvr | 
					
						
							| 
									
										
										
										
											1996-04-19 16:00:28 +00:00
										 |  |  | 	return l, t, r, b | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-28 13:53:07 +00:00
										 |  |  | _watch = None | 
					
						
							|  |  |  | def setwatchcursor(): | 
					
						
							|  |  |  | 	global _watch | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if _watch == None: | 
					
						
							|  |  |  | 		_watch = GetCursor(4).data | 
					
						
							|  |  |  | 	SetCursor(_watch) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | def setarrowcursor(): | 
					
						
							|  |  |  | 	SetCursor(qd.arrow) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class Application: | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	"Application framework -- your application should be a derived class" | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1996-09-17 12:35:43 +00:00
										 |  |  | 	def __init__(self, nomenubar=0): | 
					
						
							| 
									
										
										
										
											1997-06-20 16:24:24 +00:00
										 |  |  | 		self._doing_asyncevents = 0 | 
					
						
							| 
									
										
										
										
											1996-09-17 12:35:43 +00:00
										 |  |  | 		self.quitting = 0 | 
					
						
							| 
									
										
										
										
											1996-09-26 16:17:08 +00:00
										 |  |  | 		self.needmenubarredraw = 0 | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		self._windows = {} | 
					
						
							| 
									
										
										
										
											1996-09-17 12:35:43 +00:00
										 |  |  | 		if nomenubar: | 
					
						
							|  |  |  | 			self.menubar = None | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			self.makemenubar() | 
					
						
							| 
									
										
										
										
											1997-06-20 16:24:24 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 	def __del__(self): | 
					
						
							|  |  |  | 		if self._doing_asyncevents: | 
					
						
							|  |  |  | 			self._doing_asyncevents = 0 | 
					
						
							|  |  |  | 			MacOS.SetEventHandler() | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def makemenubar(self): | 
					
						
							| 
									
										
										
										
											1996-09-26 16:17:08 +00:00
										 |  |  | 		self.menubar = MenuBar(self) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		AppleMenu(self.menubar, self.getabouttext(), self.do_about) | 
					
						
							|  |  |  | 		self.makeusermenus() | 
					
						
							| 
									
										
										
										
											1996-01-08 23:50:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	def makeusermenus(self): | 
					
						
							|  |  |  | 		self.filemenu = m = Menu(self.menubar, "File") | 
					
						
							|  |  |  | 		self._quititem = MenuItem(m, "Quit", "Q", self._quit) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def _quit(self, *args): | 
					
						
							| 
									
										
										
										
											1996-09-17 12:35:43 +00:00
										 |  |  | 		self.quitting = 1 | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											1996-12-23 17:22:40 +00:00
										 |  |  | 	def cleanup(self): | 
					
						
							|  |  |  | 		for w in self._windows.values(): | 
					
						
							|  |  |  | 			w.do_close() | 
					
						
							|  |  |  | 		return self._windows == {} | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 	def appendwindow(self, wid, window): | 
					
						
							|  |  |  | 		self._windows[wid] = window | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def removewindow(self, wid): | 
					
						
							|  |  |  | 		del self._windows[wid] | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def getabouttext(self): | 
					
						
							|  |  |  | 		return "About %s..." % self.__class__.__name__ | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def do_about(self, id, item, window, event): | 
					
						
							|  |  |  | 		EasyDialogs.Message("Hello, world!" + "\015(%s)" % self.__class__.__name__) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	# The main event loop is broken up in several simple steps. | 
					
						
							|  |  |  | 	# This is done so you can override each individual part, | 
					
						
							|  |  |  | 	# if you have a need to do extra processing independent of the | 
					
						
							|  |  |  | 	# event type. | 
					
						
							|  |  |  | 	# Normally, however, you'd just define handlers for individual | 
					
						
							|  |  |  | 	# events. | 
					
						
							|  |  |  | 	# (XXX I'm not sure if using default parameter values is the right | 
					
						
							|  |  |  | 	# way to define the mask and wait time passed to WaitNextEvent.) | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2000-10-12 21:25:37 +00:00
										 |  |  | 	schedparams = (0, 0)	# By default disable Python's event handling | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	def mainloop(self, mask = everyEvent, wait = 0): | 
					
						
							| 
									
										
										
										
											1996-09-17 12:35:43 +00:00
										 |  |  | 		self.quitting = 0 | 
					
						
							| 
									
										
										
										
											1997-06-12 10:51:18 +00:00
										 |  |  | 		saveparams = apply(MacOS.SchedParams, self.schedparams) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		try: | 
					
						
							| 
									
										
										
										
											1996-09-17 12:35:43 +00:00
										 |  |  | 			while not self.quitting: | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 				try: | 
					
						
							|  |  |  | 					self.do1event(mask, wait) | 
					
						
							|  |  |  | 				except (Application, SystemExit): | 
					
						
							| 
									
										
										
										
											1996-09-17 12:35:43 +00:00
										 |  |  | 					# Note: the raising of "self" is old-fashioned idiom to | 
					
						
							|  |  |  | 					# exit the mainloop. Calling _quit() is better for new | 
					
						
							|  |  |  | 					# applications. | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 					break | 
					
						
							|  |  |  | 		finally: | 
					
						
							| 
									
										
										
										
											1999-12-03 16:08:50 +00:00
										 |  |  | 			apply(MacOS.SchedParams, saveparams) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1997-06-20 16:24:24 +00:00
										 |  |  | 	def dopendingevents(self, mask = everyEvent): | 
					
						
							|  |  |  | 		"""dopendingevents - Handle all pending events""" | 
					
						
							|  |  |  | 		while self.do1event(mask, wait=0): | 
					
						
							|  |  |  | 			pass | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	def do1event(self, mask = everyEvent, wait = 0): | 
					
						
							| 
									
										
										
										
											1995-08-31 13:38:01 +00:00
										 |  |  | 		ok, event = self.getevent(mask, wait) | 
					
						
							|  |  |  | 		if IsDialogEvent(event): | 
					
						
							|  |  |  | 			if self.do_dialogevent(event): | 
					
						
							|  |  |  | 				return | 
					
						
							|  |  |  | 		if ok: | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 			self.dispatch(event) | 
					
						
							| 
									
										
										
										
											1995-11-10 14:48:36 +00:00
										 |  |  | 		else: | 
					
						
							| 
									
										
										
										
											1996-04-19 16:00:28 +00:00
										 |  |  | 			self.idle(event) | 
					
						
							| 
									
										
										
										
											1995-11-10 14:48:36 +00:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											1996-04-19 16:00:28 +00:00
										 |  |  | 	def idle(self, event): | 
					
						
							| 
									
										
										
										
											1995-11-10 14:48:36 +00:00
										 |  |  | 		pass | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def getevent(self, mask = everyEvent, wait = 0): | 
					
						
							| 
									
										
										
										
											1996-09-26 16:17:08 +00:00
										 |  |  | 		if self.needmenubarredraw: | 
					
						
							|  |  |  | 			DrawMenuBar() | 
					
						
							|  |  |  | 			self.needmenubarredraw = 0 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		ok, event = WaitNextEvent(mask, wait) | 
					
						
							| 
									
										
										
										
											1995-08-31 13:38:01 +00:00
										 |  |  | 		return ok, event | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	def dispatch(self, event): | 
					
						
							| 
									
										
										
										
											1997-06-20 16:24:24 +00:00
										 |  |  | 		# The following appears to be double work (already done in do1event) | 
					
						
							|  |  |  | 		# but we need it for asynchronous event handling | 
					
						
							|  |  |  | 		if IsDialogEvent(event): | 
					
						
							|  |  |  | 			if self.do_dialogevent(event): | 
					
						
							|  |  |  | 				return | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		(what, message, when, where, modifiers) = event | 
					
						
							|  |  |  | 		if eventname.has_key(what): | 
					
						
							|  |  |  | 			name = "do_" + eventname[what] | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			name = "do_%d" % what | 
					
						
							|  |  |  | 		try: | 
					
						
							|  |  |  | 			handler = getattr(self, name) | 
					
						
							|  |  |  | 		except AttributeError: | 
					
						
							|  |  |  | 			handler = self.do_unknownevent | 
					
						
							|  |  |  | 		handler(event) | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											1997-06-20 16:24:24 +00:00
										 |  |  | 	def asyncevents(self, onoff): | 
					
						
							|  |  |  | 		"""asyncevents - Set asynchronous event handling on or off""" | 
					
						
							|  |  |  | 		old = self._doing_asyncevents | 
					
						
							|  |  |  | 		if old: | 
					
						
							|  |  |  | 			MacOS.SetEventHandler() | 
					
						
							|  |  |  | 			apply(MacOS.SchedParams, self.schedparams) | 
					
						
							|  |  |  | 		if onoff: | 
					
						
							|  |  |  | 			MacOS.SetEventHandler(self.dispatch) | 
					
						
							|  |  |  | 			doint, dummymask, benice, howoften, bgyield = \ | 
					
						
							|  |  |  | 			       self.schedparams | 
					
						
							|  |  |  | 			MacOS.SchedParams(doint, everyEvent, benice, | 
					
						
							|  |  |  | 					  howoften, bgyield) | 
					
						
							|  |  |  | 		self._doing_asyncevents = onoff | 
					
						
							|  |  |  | 		return old | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 	def do_dialogevent(self, event): | 
					
						
							|  |  |  | 		gotone, window, item = DialogSelect(event) | 
					
						
							|  |  |  | 		if gotone: | 
					
						
							|  |  |  | 			if self._windows.has_key(window): | 
					
						
							| 
									
										
										
										
											1995-08-31 13:38:01 +00:00
										 |  |  | 				self._windows[window].do_itemhit(item, event) | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 			else: | 
					
						
							|  |  |  | 				print 'Dialog event for unknown dialog' | 
					
						
							| 
									
										
										
										
											1995-08-31 13:38:01 +00:00
										 |  |  | 			return 1 | 
					
						
							|  |  |  | 		return 0 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def do_mouseDown(self, event): | 
					
						
							|  |  |  | 		(what, message, when, where, modifiers) = event | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		partcode, wid = FindWindow(where) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# | 
					
						
							|  |  |  | 		# Find the correct name. | 
					
						
							|  |  |  | 		# | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		if partname.has_key(partcode): | 
					
						
							|  |  |  | 			name = "do_" + partname[partcode] | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			name = "do_%d" % partcode | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if wid == None: | 
					
						
							|  |  |  | 			# No window, or a non-python window	 | 
					
						
							|  |  |  | 			try: | 
					
						
							|  |  |  | 				handler = getattr(self, name) | 
					
						
							|  |  |  | 			except AttributeError: | 
					
						
							|  |  |  | 				# Not menubar or something, so assume someone | 
					
						
							|  |  |  | 				# else's window | 
					
						
							|  |  |  | 				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) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	def do_inSysWindow(self, partcode, window, event): | 
					
						
							| 
									
										
										
										
											1995-08-14 12:39:54 +00:00
										 |  |  | 		MacOS.HandleEvent(event) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def do_inDesk(self, partcode, window, event): | 
					
						
							| 
									
										
										
										
											1995-08-14 12:39:54 +00:00
										 |  |  | 		MacOS.HandleEvent(event) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def do_inMenuBar(self, partcode, window, event): | 
					
						
							| 
									
										
										
										
											1996-09-17 12:35:43 +00:00
										 |  |  | 		if not self.menubar: | 
					
						
							|  |  |  | 			MacOS.HandleEvent(event) | 
					
						
							|  |  |  | 			return | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		(what, message, when, where, modifiers) = event | 
					
						
							|  |  |  | 		result = MenuSelect(where) | 
					
						
							|  |  |  | 		id = (result>>16) & 0xffff	# Hi word | 
					
						
							|  |  |  | 		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): | 
					
						
							| 
									
										
										
										
											2000-10-19 20:31:51 +00:00
										 |  |  | 		MacOS.OutputSeen() | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		self.menubar.dispatch(id, item, window, event) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def do_unknownpartcode(self, partcode, window, event): | 
					
						
							|  |  |  | 		(what, message, when, where, modifiers) = event | 
					
						
							| 
									
										
										
										
											1995-08-14 12:39:54 +00:00
										 |  |  | 		if DEBUG: print "Mouse down at global:", where | 
					
						
							|  |  |  | 		if DEBUG: print "\tUnknown part code:", partcode | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		if DEBUG: print "\tEvent:", self.printevent(event) | 
					
						
							|  |  |  | 		MacOS.HandleEvent(event) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def do_unknownwindow(self, partcode, window, event): | 
					
						
							|  |  |  | 		if DEBUG: print 'Unknown window:', window | 
					
						
							| 
									
										
										
										
											1995-08-14 12:39:54 +00:00
										 |  |  | 		MacOS.HandleEvent(event) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	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) | 
					
						
							| 
									
										
										
										
											1999-12-15 15:45:23 +00:00
										 |  |  | 		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 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		if modifiers & cmdKey: | 
					
						
							|  |  |  | 			if c == '.': | 
					
						
							|  |  |  | 				raise self | 
					
						
							|  |  |  | 			else: | 
					
						
							| 
									
										
										
										
											1996-09-17 12:35:43 +00:00
										 |  |  | 				if not self.menubar: | 
					
						
							|  |  |  | 					MacOS.HandleEvent(event) | 
					
						
							| 
									
										
										
										
											1999-12-15 15:45:23 +00:00
										 |  |  | 				return | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		else: | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 			# See whether the front window wants it | 
					
						
							|  |  |  | 			w = FrontWindow() | 
					
						
							|  |  |  | 			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 | 
					
						
							| 
									
										
										
										
											1995-12-12 15:03:35 +00:00
										 |  |  | 				do_char(c, event) | 
					
						
							|  |  |  | 			# else it wasn't for us, sigh... | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def do_char(self, c, event): | 
					
						
							| 
									
										
										
										
											1995-08-14 12:39:54 +00:00
										 |  |  | 		if DEBUG: print "Character", `c` | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def do_updateEvt(self, event): | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		(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) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		else: | 
					
						
							| 
									
										
										
										
											1995-08-14 12:39:54 +00:00
										 |  |  | 			MacOS.HandleEvent(event) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 	def do_activateEvt(self, event): | 
					
						
							|  |  |  | 		(what, message, when, where, modifiers) = event | 
					
						
							| 
									
										
										
										
											1999-01-27 14:22:11 +00:00
										 |  |  | 		wid = WhichWindow(message) | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		if wid and self._windows.has_key(wid): | 
					
						
							|  |  |  | 			window = self._windows[wid] | 
					
						
							|  |  |  | 			window.do_activate(modifiers & 1, event) | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			MacOS.HandleEvent(event) | 
					
						
							| 
									
										
										
										
											1999-01-27 14:22:11 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 	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) | 
					
						
							| 
									
										
										
										
											1999-01-27 14:22:11 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 	def do_suspendresume(self, event): | 
					
						
							|  |  |  | 		(what, message, when, where, modifiers) = event | 
					
						
							| 
									
										
										
										
											1999-01-27 14:22:11 +00:00
										 |  |  | 		wid = FrontWindow() | 
					
						
							|  |  |  | 		if wid and self._windows.has_key(wid): | 
					
						
							|  |  |  | 			window = self._windows[wid] | 
					
						
							| 
									
										
										
										
											1999-12-15 14:55:16 +00:00
										 |  |  | 			window.do_activate(message & 1, event) | 
					
						
							| 
									
										
										
										
											1999-01-27 14:22:11 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	def do_kHighLevelEvent(self, event): | 
					
						
							|  |  |  | 		(what, message, when, where, modifiers) = event | 
					
						
							| 
									
										
										
										
											1995-08-14 12:39:54 +00:00
										 |  |  | 		if DEBUG:  | 
					
						
							|  |  |  | 			print "High Level Event:", | 
					
						
							|  |  |  | 			self.printevent(event) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		try: | 
					
						
							|  |  |  | 			AEProcessAppleEvent(event) | 
					
						
							|  |  |  | 		except: | 
					
						
							|  |  |  | 			print "AEProcessAppleEvent error:" | 
					
						
							|  |  |  | 			traceback.print_exc() | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def do_unknownevent(self, event): | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		if DEBUG: | 
					
						
							|  |  |  | 			print "Unhandled event:", | 
					
						
							|  |  |  | 			self.printevent(event) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	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: | 
					
						
							|  |  |  | 	"""Represent a set of menus in a menu bar.
 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	Interface: | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	- (constructor) | 
					
						
							|  |  |  | 	- (destructor) | 
					
						
							|  |  |  | 	- addmenu | 
					
						
							|  |  |  | 	- addpopup (normally used internally) | 
					
						
							|  |  |  | 	- dispatch (called from Application) | 
					
						
							|  |  |  | 	"""
 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	nextid = 1	# Necessarily a class variable | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def getnextid(self): | 
					
						
							| 
									
										
										
										
											1996-09-26 16:17:08 +00:00
										 |  |  | 		id = MenuBar.nextid | 
					
						
							|  |  |  | 		MenuBar.nextid = id+1 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		return id | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1996-09-26 16:17:08 +00:00
										 |  |  | 	def __init__(self, parent=None): | 
					
						
							|  |  |  | 		self.parent = parent | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		ClearMenuBar() | 
					
						
							|  |  |  | 		self.bar = GetMenuBar() | 
					
						
							|  |  |  | 		self.menus = {} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1996-09-26 16:17:08 +00:00
										 |  |  | 	# XXX necessary? | 
					
						
							|  |  |  | 	def close(self): | 
					
						
							|  |  |  | 		self.parent = None | 
					
						
							|  |  |  | 		self.bar = None | 
					
						
							| 
									
										
										
										
											1998-02-20 15:51:39 +00:00
										 |  |  | 		self.menus = None | 
					
						
							| 
									
										
										
										
											1996-09-26 16:17:08 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	def addmenu(self, title, after = 0): | 
					
						
							|  |  |  | 		id = self.getnextid() | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 		if DEBUG: print 'Newmenu', title, id # XXXX | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		m = NewMenu(id, title) | 
					
						
							|  |  |  | 		m.InsertMenu(after) | 
					
						
							| 
									
										
										
										
											1998-05-06 15:33:09 +00:00
										 |  |  | 		if after >= 0: | 
					
						
							|  |  |  | 			if self.parent: | 
					
						
							|  |  |  | 				self.parent.needmenubarredraw = 1 | 
					
						
							|  |  |  | 			else: | 
					
						
							|  |  |  | 				DrawMenuBar() | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		return id, m | 
					
						
							| 
									
										
										
										
											1996-03-12 13:32:03 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 	def delmenu(self, id): | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 		if DEBUG: print 'Delmenu', id # XXXX | 
					
						
							| 
									
										
										
										
											1996-03-12 13:32:03 +00:00
										 |  |  | 		DeleteMenu(id) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def addpopup(self, title = ''): | 
					
						
							|  |  |  | 		return self.addmenu(title, -1) | 
					
						
							| 
									
										
										
										
											1996-09-26 16:17:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Useless:	 | 
					
						
							|  |  |  | #	def install(self): | 
					
						
							|  |  |  | #		if not self.bar: return | 
					
						
							|  |  |  | #		SetMenuBar(self.bar) | 
					
						
							|  |  |  | #		if self.parent: | 
					
						
							|  |  |  | #			self.parent.needmenubarredraw = 1 | 
					
						
							|  |  |  | #		else: | 
					
						
							|  |  |  | #			DrawMenuBar() | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def fixmenudimstate(self): | 
					
						
							|  |  |  | 		for m in self.menus.keys(): | 
					
						
							|  |  |  | 			menu = self.menus[m] | 
					
						
							|  |  |  | 			if menu.__class__ == FrameWork.AppleMenu: | 
					
						
							|  |  |  | 				continue | 
					
						
							|  |  |  | 			for i in range(len(menu.items)): | 
					
						
							|  |  |  | 				label, shortcut, callback, kind = menu.items[i] | 
					
						
							|  |  |  | 				if type(callback) == types.StringType: | 
					
						
							|  |  |  | 					wid = Win.FrontWindow() | 
					
						
							|  |  |  | 					if wid and self.parent._windows.has_key(wid): | 
					
						
							|  |  |  | 						window = self.parent._windows[wid] | 
					
						
							|  |  |  | 						if hasattr(window, "domenu_" + callback): | 
					
						
							|  |  |  | 							menu.menu.EnableItem(i + 1) | 
					
						
							|  |  |  | 						elif hasattr(self.parent, "domenu_" + callback): | 
					
						
							|  |  |  | 							menu.menu.EnableItem(i + 1) | 
					
						
							|  |  |  | 						else: | 
					
						
							|  |  |  | 							menu.menu.DisableItem(i + 1) | 
					
						
							|  |  |  | 					elif hasattr(self.parent, "domenu_" + callback): | 
					
						
							|  |  |  | 						menu.menu.EnableItem(i + 1) | 
					
						
							|  |  |  | 					else: | 
					
						
							|  |  |  | 						menu.menu.DisableItem(i + 1) | 
					
						
							|  |  |  | 				elif callback: | 
					
						
							|  |  |  | 					pass | 
					
						
							|  |  |  | 					 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	def dispatch(self, id, item, window, event): | 
					
						
							|  |  |  | 		if self.menus.has_key(id): | 
					
						
							|  |  |  | 			self.menus[id].dispatch(id, item, window, event) | 
					
						
							|  |  |  | 		else: | 
					
						
							| 
									
										
										
										
											1995-08-14 12:39:54 +00:00
										 |  |  | 			if DEBUG: print "MenuBar.dispatch(%d, %d, %s, %s)" % \ | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 				(id, item, window, event) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # XXX Need a way to get menus as resources and bind them to callbacks | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Menu: | 
					
						
							|  |  |  | 	"One menu." | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def __init__(self, bar, title, after=0): | 
					
						
							|  |  |  | 		self.bar = bar | 
					
						
							|  |  |  | 		self.id, self.menu = self.bar.addmenu(title, after) | 
					
						
							|  |  |  | 		bar.menus[self.id] = self | 
					
						
							|  |  |  | 		self.items = [] | 
					
						
							| 
									
										
										
										
											1998-10-15 15:29:16 +00:00
										 |  |  | 		self._parent = None | 
					
						
							| 
									
										
										
										
											1996-03-12 13:32:03 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 	def delete(self): | 
					
						
							|  |  |  | 		self.bar.delmenu(self.id) | 
					
						
							|  |  |  | 		del self.bar.menus[self.id] | 
					
						
							| 
									
										
										
										
											2000-03-07 23:40:13 +00:00
										 |  |  | 		self.menu.DisposeMenu() | 
					
						
							| 
									
										
										
										
											1996-03-12 13:32:03 +00:00
										 |  |  | 		del self.bar | 
					
						
							|  |  |  | 		del self.items | 
					
						
							|  |  |  | 		del self.menu | 
					
						
							|  |  |  | 		del self.id | 
					
						
							| 
									
										
										
										
											1998-10-15 15:29:16 +00:00
										 |  |  | 		del self._parent | 
					
						
							| 
									
										
										
										
											1998-07-13 13:41:02 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	def additem(self, label, shortcut=None, callback=None, kind=None): | 
					
						
							|  |  |  | 		self.menu.AppendMenu('x')		# add a dummy string | 
					
						
							| 
									
										
										
										
											2000-03-07 23:40:13 +00:00
										 |  |  | 		self.items.append((label, shortcut, callback, kind)) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		item = len(self.items) | 
					
						
							| 
									
										
										
										
											1995-07-17 13:25:15 +00:00
										 |  |  | 		self.menu.SetMenuItemText(item, label)		# set the actual text | 
					
						
							| 
									
										
										
										
											1999-12-14 15:45:53 +00:00
										 |  |  | 		if shortcut and type(shortcut) == type(()): | 
					
						
							|  |  |  | 			modifiers, char = shortcut[:2] | 
					
						
							|  |  |  | 			self.menu.SetItemCmd(item, ord(char)) | 
					
						
							|  |  |  | 			self.menu.SetMenuItemModifiers(item, modifiers) | 
					
						
							|  |  |  | 			if len(shortcut) > 2: | 
					
						
							| 
									
										
										
										
											1999-12-15 15:45:23 +00:00
										 |  |  | 				self.menu.SetMenuItemKeyGlyph(item, shortcut[2]) | 
					
						
							| 
									
										
										
										
											1999-12-14 15:45:53 +00:00
										 |  |  | 		elif shortcut:	 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 			self.menu.SetItemCmd(item, ord(shortcut)) | 
					
						
							|  |  |  | 		return item | 
					
						
							| 
									
										
										
										
											1998-07-13 13:41:02 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 	def delitem(self, item): | 
					
						
							|  |  |  | 		if item != len(self.items): | 
					
						
							|  |  |  | 			raise 'Can only delete last item of a menu' | 
					
						
							|  |  |  | 		self.menu.DeleteMenuItem(item) | 
					
						
							|  |  |  | 		del self.items[item-1] | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def addcheck(self, label, shortcut=None, callback=None): | 
					
						
							|  |  |  | 		return self.additem(label, shortcut, callback, 'check') | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def addradio(self, label, shortcut=None, callback=None): | 
					
						
							|  |  |  | 		return self.additem(label, shortcut, callback, 'radio') | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def addseparator(self): | 
					
						
							|  |  |  | 		self.menu.AppendMenu('(-') | 
					
						
							| 
									
										
										
										
											2000-03-07 23:40:13 +00:00
										 |  |  | 		self.items.append(('', None, None, 'separator')) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def addsubmenu(self, label, title=''): | 
					
						
							|  |  |  | 		sub = Menu(self.bar, title, -1) | 
					
						
							|  |  |  | 		item = self.additem(label, '\x1B', None, 'submenu') | 
					
						
							|  |  |  | 		self.menu.SetItemMark(item, sub.id) | 
					
						
							| 
									
										
										
										
											1998-10-15 15:29:16 +00:00
										 |  |  | 		sub._parent = self | 
					
						
							|  |  |  | 		sub._parent_item = item | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		return sub | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def dispatch(self, id, item, window, event): | 
					
						
							| 
									
										
										
										
											1996-09-26 16:17:08 +00:00
										 |  |  | 		title, shortcut, callback, mtype = self.items[item-1] | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		if callback: | 
					
						
							| 
									
										
										
										
											1996-09-26 16:17:08 +00:00
										 |  |  | 			if not self.bar.parent or type(callback) <> types.StringType: | 
					
						
							|  |  |  | 				menuhandler = callback | 
					
						
							|  |  |  | 			else:  | 
					
						
							|  |  |  | 				# callback is string | 
					
						
							|  |  |  | 				wid = Win.FrontWindow() | 
					
						
							|  |  |  | 				if wid and self.bar.parent._windows.has_key(wid): | 
					
						
							|  |  |  | 					window = self.bar.parent._windows[wid] | 
					
						
							|  |  |  | 					if hasattr(window, "domenu_" + callback): | 
					
						
							|  |  |  | 						menuhandler = getattr(window, "domenu_" + callback) | 
					
						
							|  |  |  | 					elif hasattr(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 | 
					
						
							|  |  |  | 				elif hasattr(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) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-04-11 15:39:01 +00:00
										 |  |  | 	def enable(self, onoff): | 
					
						
							|  |  |  | 		if onoff: | 
					
						
							|  |  |  | 			self.menu.EnableItem(0) | 
					
						
							| 
									
										
										
										
											1998-10-15 15:29:16 +00:00
										 |  |  | 			if self._parent: | 
					
						
							|  |  |  | 				self._parent.menu.EnableItem(self._parent_item) | 
					
						
							| 
									
										
										
										
											1996-04-11 15:39:01 +00:00
										 |  |  | 		else: | 
					
						
							|  |  |  | 			self.menu.DisableItem(0) | 
					
						
							| 
									
										
										
										
											1998-10-15 15:29:16 +00:00
										 |  |  | 			if self._parent: | 
					
						
							|  |  |  | 				self._parent.menu.DisableItem(self._parent_item) | 
					
						
							| 
									
										
										
										
											1998-07-13 13:41:02 +00:00
										 |  |  | 		if self.bar and self.bar.parent: | 
					
						
							|  |  |  | 				self.bar.parent.needmenubarredraw = 1 | 
					
						
							| 
									
										
										
										
											1998-05-06 15:33:09 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | class PopupMenu(Menu): | 
					
						
							|  |  |  | 	def __init__(self, bar): | 
					
						
							|  |  |  | 		Menu.__init__(self, bar, '(popup)', -1) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def popup(self, x, y, event, default=1, window=None): | 
					
						
							|  |  |  | 		# NOTE that x and y are global coordinates, and they should probably | 
					
						
							|  |  |  | 		# be topleft of the button the user clicked (not mouse-coordinates), | 
					
						
							|  |  |  | 		# so the popup nicely overlaps. | 
					
						
							|  |  |  | 		reply = self.menu.PopUpMenuSelect(x, y, default) | 
					
						
							|  |  |  | 		if not reply: | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		id = (reply & 0xffff0000) >> 16 | 
					
						
							|  |  |  | 		item = reply & 0xffff | 
					
						
							|  |  |  | 		if not window: | 
					
						
							|  |  |  | 			wid = Win.FrontWindow() | 
					
						
							|  |  |  | 			try: | 
					
						
							|  |  |  | 				window = self.bar.parent._windows[wid] | 
					
						
							|  |  |  | 			except: | 
					
						
							|  |  |  | 				pass # If we can't find the window we pass None | 
					
						
							|  |  |  | 		self.dispatch(id, item, window, event) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class MenuItem: | 
					
						
							|  |  |  | 	def __init__(self, menu, title, shortcut=None, callback=None, kind=None): | 
					
						
							|  |  |  | 		self.item = menu.additem(title, shortcut, callback) | 
					
						
							| 
									
										
										
										
											1996-03-12 13:32:03 +00:00
										 |  |  | 		self.menu = menu | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											1998-07-13 13:41:02 +00:00
										 |  |  | 	def delete(self): | 
					
						
							|  |  |  | 		self.menu.delitem(self.item) | 
					
						
							|  |  |  | 		del self.menu | 
					
						
							|  |  |  | 		del self.item | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											1996-03-12 13:32:03 +00:00
										 |  |  | 	def check(self, onoff): | 
					
						
							|  |  |  | 		self.menu.menu.CheckItem(self.item, onoff) | 
					
						
							| 
									
										
										
										
											1996-04-11 15:39:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	def enable(self, onoff): | 
					
						
							|  |  |  | 		if onoff: | 
					
						
							|  |  |  | 			self.menu.menu.EnableItem(self.item) | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			self.menu.menu.DisableItem(self.item) | 
					
						
							| 
									
										
										
										
											1996-04-19 16:00:28 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 	def settext(self, text): | 
					
						
							|  |  |  | 		self.menu.menu.SetMenuItemText(self.item, text) | 
					
						
							| 
									
										
										
										
											1996-03-12 13:32:03 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											1996-04-23 16:18:33 +00:00
										 |  |  | 	def setstyle(self, style): | 
					
						
							|  |  |  | 		self.menu.menu.SetItemStyle(self.item, style) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def seticon(self, icon): | 
					
						
							|  |  |  | 		self.menu.menu.SetItemIcon(self.item, icon) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def setcmd(self, cmd): | 
					
						
							|  |  |  | 		self.menu.menu.SetItemCmd(self.item, cmd) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def setmark(self, cmd): | 
					
						
							|  |  |  | 		self.menu.menu.SetItemMark(self.item, cmd) | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class RadioItem(MenuItem): | 
					
						
							|  |  |  | 	def __init__(self, menu, title, shortcut=None, callback=None): | 
					
						
							|  |  |  | 		MenuItem.__init__(self, menu, title, shortcut, callback, 'radio') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CheckItem(MenuItem): | 
					
						
							|  |  |  | 	def __init__(self, menu, title, shortcut=None, callback=None): | 
					
						
							|  |  |  | 		MenuItem.__init__(self, menu, title, shortcut, callback, 'check') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def Separator(menu): | 
					
						
							|  |  |  | 	menu.addseparator() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def SubMenu(menu, label, title=''): | 
					
						
							|  |  |  | 	return menu.addsubmenu(label, title) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AppleMenu(Menu): | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def __init__(self, bar, abouttext="About me...", aboutcallback=None): | 
					
						
							|  |  |  | 		Menu.__init__(self, bar, "\024") | 
					
						
							|  |  |  | 		self.additem(abouttext, None, aboutcallback) | 
					
						
							|  |  |  | 		self.addseparator() | 
					
						
							| 
									
										
										
										
											1995-07-17 13:25:15 +00:00
										 |  |  | 		self.menu.AppendResMenu('DRVR') | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def dispatch(self, id, item, window, event): | 
					
						
							|  |  |  | 		if item == 1: | 
					
						
							|  |  |  | 			Menu.dispatch(self, id, item, window, event) | 
					
						
							|  |  |  | 		else: | 
					
						
							| 
									
										
										
										
											1996-01-08 23:50:13 +00:00
										 |  |  | 			name = self.menu.GetMenuItemText(item) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 			OpenDeskAcc(name) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | class Window: | 
					
						
							|  |  |  | 	"""A single window belonging to an application""" | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def __init__(self, parent): | 
					
						
							|  |  |  | 		self.wid = None | 
					
						
							|  |  |  | 		self.parent = parent | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											1996-01-08 23:50:13 +00:00
										 |  |  | 	def open(self, bounds=(40, 40, 400, 400), resid=None): | 
					
						
							|  |  |  | 		if resid <> None: | 
					
						
							|  |  |  | 			self.wid = GetNewWindow(resid, -1) | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			self.wid = NewWindow(bounds, self.__class__.__name__, 1, | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 				8, -1, 1, 0)	# changed to proc id 8 to include zoom box. jvr | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		self.do_postopen() | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def do_postopen(self): | 
					
						
							|  |  |  | 		"""Tell our parent we exist""" | 
					
						
							|  |  |  | 		self.parent.appendwindow(self.wid, self) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def close(self): | 
					
						
							|  |  |  | 		self.do_postclose() | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 	def do_postclose(self): | 
					
						
							|  |  |  | 		self.parent.removewindow(self.wid) | 
					
						
							|  |  |  | 		self.parent = None | 
					
						
							|  |  |  | 		self.wid = None | 
					
						
							| 
									
										
										
										
											1996-01-08 23:50:13 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 	def SetPort(self): | 
					
						
							|  |  |  | 		# Convinience method | 
					
						
							|  |  |  | 		SetPort(self.wid) | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def do_inDrag(self, partcode, window, event): | 
					
						
							|  |  |  | 		where = event[3] | 
					
						
							|  |  |  | 		window.DragWindow(where, self.draglimit) | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1996-04-19 16:00:28 +00:00
										 |  |  | 	draglimit = screenbounds | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def do_inGoAway(self, partcode, window, event): | 
					
						
							|  |  |  | 		where = event[3] | 
					
						
							|  |  |  | 		if window.TrackGoAway(where): | 
					
						
							|  |  |  | 			self.close() | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def do_inZoom(self, partcode, window, event): | 
					
						
							|  |  |  | 		(what, message, when, where, modifiers) = event | 
					
						
							|  |  |  | 		if window.TrackBox(where, partcode): | 
					
						
							|  |  |  | 			window.ZoomWindow(partcode, 1) | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 			rect = window.GetWindowUserState()				# so that zoom really works... jvr | 
					
						
							|  |  |  | 			self.do_postresize(rect[2] - rect[0], rect[3] - rect[1], window)	# jvr | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def do_inZoomIn(self, partcode, window, event): | 
					
						
							|  |  |  | 		SetPort(window) # !!! | 
					
						
							|  |  |  | 		self.do_inZoom(partcode, window, event) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def do_inZoomOut(self, partcode, window, event): | 
					
						
							|  |  |  | 		SetPort(window) # !!! | 
					
						
							|  |  |  | 		self.do_inZoom(partcode, window, event) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def do_inGrow(self, partcode, window, event): | 
					
						
							|  |  |  | 		(what, message, when, where, modifiers) = event | 
					
						
							|  |  |  | 		result = window.GrowWindow(where, self.growlimit) | 
					
						
							|  |  |  | 		if result: | 
					
						
							|  |  |  | 			height = (result>>16) & 0xffff	# Hi word | 
					
						
							|  |  |  | 			width = result & 0xffff		# Lo word | 
					
						
							|  |  |  | 			self.do_resize(width, height, window) | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 	growlimit = (50, 50, screenbounds[2] - screenbounds[0], screenbounds[3] - screenbounds[1])	# jvr | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def do_resize(self, width, height, window): | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 		l, t, r, b = self.wid.GetWindowPort().portRect			# jvr, forGrowIcon | 
					
						
							|  |  |  | 		self.SetPort()							# jvr | 
					
						
							| 
									
										
										
										
											2001-01-23 14:34:49 +00:00
										 |  |  | 		InvalWindowRect((r - SCROLLBARWIDTH + 1, b - SCROLLBARWIDTH + 1, r, b))	# jvr | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 		window.SizeWindow(width, height, 1)		# changed updateFlag to true jvr | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		self.do_postresize(width, height, window) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def do_postresize(self, width, height, window): | 
					
						
							|  |  |  | 		SetPort(window) | 
					
						
							| 
									
										
										
										
											2001-01-23 14:34:49 +00:00
										 |  |  | 		InvalWindowRect(window.GetWindowPort().portRect) | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def do_inContent(self, partcode, window, event): | 
					
						
							|  |  |  | 		# | 
					
						
							|  |  |  | 		# If we're not frontmost, select ourselves and wait for | 
					
						
							|  |  |  | 		# the activate event. | 
					
						
							|  |  |  | 		# | 
					
						
							|  |  |  | 		if FrontWindow() <> window: | 
					
						
							|  |  |  | 			window.SelectWindow() | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		# We are. Handle the event. | 
					
						
							|  |  |  | 		(what, message, when, where, modifiers) = event | 
					
						
							|  |  |  | 		SetPort(window) | 
					
						
							|  |  |  | 		local = GlobalToLocal(where) | 
					
						
							|  |  |  | 		self.do_contentclick(local, modifiers, event) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def do_contentclick(self, local, modifiers, event): | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 		if DEBUG: | 
					
						
							|  |  |  | 			print 'Click in contents at %s, modifiers %s'%(local, modifiers) | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def do_rawupdate(self, window, event): | 
					
						
							|  |  |  | 		if DEBUG: print "raw update for", window | 
					
						
							| 
									
										
										
										
											1995-11-14 10:15:42 +00:00
										 |  |  | 		SetPort(window) | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		window.BeginUpdate() | 
					
						
							|  |  |  | 		self.do_update(window, event) | 
					
						
							|  |  |  | 		window.EndUpdate() | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def do_update(self, window, event): | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 		if DEBUG: | 
					
						
							|  |  |  | 			import time | 
					
						
							|  |  |  | 			for i in range(8): | 
					
						
							|  |  |  | 				time.sleep(0.1) | 
					
						
							|  |  |  | 				InvertRgn(window.GetWindowPort().visRgn) | 
					
						
							|  |  |  | 			FillRgn(window.GetWindowPort().visRgn, qd.gray) | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			EraseRgn(window.GetWindowPort().visRgn) | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 	def do_activate(self, activate, event): | 
					
						
							|  |  |  | 		if DEBUG: print 'Activate %d for %s'%(activate, self.wid) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | class ControlsWindow(Window): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def do_rawupdate(self, window, event): | 
					
						
							|  |  |  | 		if DEBUG: print "raw update for", window | 
					
						
							| 
									
										
										
										
											1996-04-19 16:00:28 +00:00
										 |  |  | 		SetPort(window) | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		window.BeginUpdate() | 
					
						
							|  |  |  | 		self.do_update(window, event) | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 		#DrawControls(window)					# jvr | 
					
						
							|  |  |  | 		UpdateControls(window, window.GetWindowPort().visRgn)	# jvr | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		window.DrawGrowIcon() | 
					
						
							|  |  |  | 		window.EndUpdate() | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def do_controlhit(self, window, control, pcode, event): | 
					
						
							|  |  |  | 		if DEBUG: print "control hit in", window, "on", control, "; pcode =", pcode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def do_inContent(self, partcode, window, event): | 
					
						
							| 
									
										
										
										
											1996-04-19 16:00:28 +00:00
										 |  |  | 		if FrontWindow() <> window: | 
					
						
							|  |  |  | 			window.SelectWindow() | 
					
						
							|  |  |  | 			return | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		(what, message, when, where, modifiers) = event | 
					
						
							| 
									
										
										
										
											1995-11-14 10:15:42 +00:00
										 |  |  | 		SetPort(window)  # XXXX Needed? | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		local = GlobalToLocal(where) | 
					
						
							| 
									
										
										
										
											1998-05-28 14:22:48 +00:00
										 |  |  | 		pcode, control = FindControl(local, window) | 
					
						
							|  |  |  | 		if pcode and control: | 
					
						
							|  |  |  | 			self.do_rawcontrolhit(window, control, pcode, local, event) | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 		else: | 
					
						
							|  |  |  | 			if DEBUG: print "FindControl(%s, %s) -> (%s, %s)" % \ | 
					
						
							| 
									
										
										
										
											1998-05-28 14:22:48 +00:00
										 |  |  | 				(local, window, pcode, control) | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 			self.do_contentclick(local, modifiers, event) | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											1998-05-28 14:22:48 +00:00
										 |  |  | 	def do_rawcontrolhit(self, window, control, pcode, local, event): | 
					
						
							|  |  |  | 		pcode = control.TrackControl(local) | 
					
						
							|  |  |  | 		if pcode: | 
					
						
							|  |  |  | 			self.do_controlhit(window, control, pcode, event) | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | class ScrolledWindow(ControlsWindow): | 
					
						
							|  |  |  | 	def __init__(self, parent): | 
					
						
							|  |  |  | 		self.barx = self.bary = None | 
					
						
							| 
									
										
										
										
											1996-04-16 14:35:43 +00:00
										 |  |  | 		self.barx_enabled = self.bary_enabled = 1 | 
					
						
							|  |  |  | 		self.activated = 1 | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 		ControlsWindow.__init__(self, parent) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def scrollbars(self, wantx=1, wanty=1): | 
					
						
							|  |  |  | 		SetPort(self.wid) | 
					
						
							|  |  |  | 		self.barx = self.bary = None | 
					
						
							| 
									
										
										
										
											1996-04-16 14:35:43 +00:00
										 |  |  | 		self.barx_enabled = self.bary_enabled = 1 | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 		x0, y0, x1, y1 = self.wid.GetWindowPort().portRect | 
					
						
							|  |  |  | 		vx, vy = self.getscrollbarvalues() | 
					
						
							| 
									
										
										
										
											1996-04-16 14:35:43 +00:00
										 |  |  | 		if vx == None: self.barx_enabled, vx = 0, 0 | 
					
						
							|  |  |  | 		if vy == None: self.bary_enabled, vy = 0, 0 | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 		if wantx: | 
					
						
							|  |  |  | 			rect = x0-1, y1-(SCROLLBARWIDTH-1), x1-(SCROLLBARWIDTH-2), y1+1 | 
					
						
							|  |  |  | 			self.barx = NewControl(self.wid, rect, "", 1, vx, 0, 32767, 16, 0) | 
					
						
							| 
									
										
										
										
											1996-04-16 14:35:43 +00:00
										 |  |  | 			if not self.barx_enabled: self.barx.HiliteControl(255) | 
					
						
							| 
									
										
										
										
											2001-01-23 14:34:49 +00:00
										 |  |  | ##			InvalWindowRect(rect) | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 		if wanty: | 
					
						
							|  |  |  | 			rect = x1-(SCROLLBARWIDTH-1), y0-1, x1+1, y1-(SCROLLBARWIDTH-2) | 
					
						
							|  |  |  | 			self.bary = NewControl(self.wid, rect, "", 1, vy, 0, 32767, 16, 0) | 
					
						
							| 
									
										
										
										
											1996-04-16 14:35:43 +00:00
										 |  |  | 			if not self.bary_enabled: self.bary.HiliteControl(255) | 
					
						
							| 
									
										
										
										
											2001-01-23 14:34:49 +00:00
										 |  |  | ##			InvalWindowRect(rect) | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 	def do_postclose(self): | 
					
						
							|  |  |  | 		self.barx = self.bary = None | 
					
						
							|  |  |  | 		ControlsWindow.do_postclose(self) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def do_activate(self, onoff, event): | 
					
						
							| 
									
										
										
										
											1996-04-16 14:35:43 +00:00
										 |  |  | 		self.activated = onoff | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 		if onoff: | 
					
						
							| 
									
										
										
										
											1996-04-16 14:35:43 +00:00
										 |  |  | 			if self.barx and self.barx_enabled: | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 				self.barx.ShowControl()	# jvr | 
					
						
							| 
									
										
										
										
											1996-04-16 14:35:43 +00:00
										 |  |  | 			if self.bary and self.bary_enabled: | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 				self.bary.ShowControl()	# jvr | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 		else: | 
					
						
							| 
									
										
										
										
											1996-04-16 14:35:43 +00:00
										 |  |  | 			if self.barx: | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 				self.barx.HideControl()	# jvr; An inactive window should have *hidden* | 
					
						
							|  |  |  | 							# scrollbars, not just dimmed (no matter what | 
					
						
							|  |  |  | 							# BBEdit does... look at the Finder) | 
					
						
							| 
									
										
										
										
											1996-04-16 14:35:43 +00:00
										 |  |  | 			if self.bary: | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 				self.bary.HideControl()	# jvr | 
					
						
							|  |  |  | 		self.wid.DrawGrowIcon()			# jvr | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 	def do_postresize(self, width, height, window): | 
					
						
							|  |  |  | 		l, t, r, b = self.wid.GetWindowPort().portRect | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 		self.SetPort() | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 		if self.barx: | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 			self.barx.HideControl()		# jvr | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 			self.barx.MoveControl(l-1, b-(SCROLLBARWIDTH-1)) | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 			self.barx.SizeControl((r-l)-(SCROLLBARWIDTH-3), SCROLLBARWIDTH)	# jvr | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 		if self.bary: | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 			self.bary.HideControl()		# jvr | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 			self.bary.MoveControl(r-(SCROLLBARWIDTH-1), t-1) | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 			self.bary.SizeControl(SCROLLBARWIDTH, (b-t)-(SCROLLBARWIDTH-3))	# jvr | 
					
						
							|  |  |  | 		if self.barx: | 
					
						
							|  |  |  | 			self.barx.ShowControl()		# jvr | 
					
						
							| 
									
										
										
										
											2001-01-23 14:34:49 +00:00
										 |  |  | 			ValidWindowRect((l, b - SCROLLBARWIDTH + 1, r - SCROLLBARWIDTH + 2, b))	# jvr | 
					
						
							| 
									
										
										
										
											1996-07-26 14:01:07 +00:00
										 |  |  | 		if self.bary: | 
					
						
							|  |  |  | 			self.bary.ShowControl()		# jvr | 
					
						
							| 
									
										
										
										
											2001-01-23 14:34:49 +00:00
										 |  |  | 			ValidWindowRect((r - SCROLLBARWIDTH + 1, t, r, b - SCROLLBARWIDTH + 2))	# jvr | 
					
						
							|  |  |  | 		InvalWindowRect((r - SCROLLBARWIDTH + 1, b - SCROLLBARWIDTH + 1, r, b))	# jvr, growicon | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-05-28 14:22:48 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 	def do_rawcontrolhit(self, window, control, pcode, local, event): | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 		if control == self.barx: | 
					
						
							|  |  |  | 			which = 'x' | 
					
						
							|  |  |  | 		elif control == self.bary: | 
					
						
							|  |  |  | 			which = 'y' | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			return 0 | 
					
						
							| 
									
										
										
										
											1998-05-28 14:22:48 +00:00
										 |  |  | 		if pcode in (inUpButton, inDownButton, inPageUp, inPageDown): | 
					
						
							|  |  |  | 			# We do the work for the buttons and grey area in the tracker | 
					
						
							|  |  |  | 			dummy = control.TrackControl(local, self.do_controltrack) | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			# but the thumb is handled here | 
					
						
							|  |  |  | 			pcode = control.TrackControl(local) | 
					
						
							|  |  |  | 			if pcode == inThumb: | 
					
						
							|  |  |  | 				value = control.GetControlValue() | 
					
						
							|  |  |  | 				print 'setbars', which, value #DBG | 
					
						
							|  |  |  | 				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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 		if pcode == inUpButton: | 
					
						
							|  |  |  | 			what = '-' | 
					
						
							|  |  |  | 		elif pcode == inDownButton: | 
					
						
							|  |  |  | 			what = '+' | 
					
						
							|  |  |  | 		elif pcode == inPageUp: | 
					
						
							|  |  |  | 			what = '--' | 
					
						
							|  |  |  | 		elif pcode == inPageDown: | 
					
						
							|  |  |  | 			what = '++' | 
					
						
							|  |  |  | 		else: | 
					
						
							| 
									
										
										
										
											1998-05-28 14:22:48 +00:00
										 |  |  | 			return | 
					
						
							|  |  |  | 		self.scrollbar_callback(which, what, None) | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 		self.updatescrollbars() | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def updatescrollbars(self): | 
					
						
							|  |  |  | 		SetPort(self.wid) | 
					
						
							|  |  |  | 		vx, vy = self.getscrollbarvalues() | 
					
						
							|  |  |  | 		if self.barx: | 
					
						
							| 
									
										
										
										
											1996-04-16 14:35:43 +00:00
										 |  |  | 			if vx == None: | 
					
						
							|  |  |  | 				self.barx.HiliteControl(255) | 
					
						
							|  |  |  | 				self.barx_enabled = 0 | 
					
						
							|  |  |  | 			else: | 
					
						
							|  |  |  | 				if not self.barx_enabled: | 
					
						
							|  |  |  | 					self.barx_enabled = 1 | 
					
						
							|  |  |  | 					if self.activated: | 
					
						
							|  |  |  | 						self.barx.HiliteControl(0) | 
					
						
							|  |  |  | 				self.barx.SetControlValue(vx) | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 		if self.bary: | 
					
						
							| 
									
										
										
										
											1996-04-16 14:35:43 +00:00
										 |  |  | 			if vy == None: | 
					
						
							|  |  |  | 				self.bary.HiliteControl(255) | 
					
						
							|  |  |  | 				self.bary_enabled = 0 | 
					
						
							|  |  |  | 			else: | 
					
						
							|  |  |  | 				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) | 
					
						
							| 
									
										
										
										
											1996-04-12 16:24:44 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 	# To be overridden: | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def getscrollbarvalues(self): | 
					
						
							|  |  |  | 		return 0, 0 | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def scrollbar_callback(self, which, what, value): | 
					
						
							|  |  |  | 		print 'scroll', which, what, value | 
					
						
							| 
									
										
										
										
											1995-08-17 14:18:20 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | class DialogWindow(Window): | 
					
						
							|  |  |  | 	"""A modeless dialog window""" | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def open(self, resid): | 
					
						
							|  |  |  | 		self.wid = GetNewDialog(resid, -1) | 
					
						
							|  |  |  | 		self.do_postopen() | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def close(self): | 
					
						
							|  |  |  | 		self.do_postclose() | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def do_itemhit(self, item, event): | 
					
						
							|  |  |  | 		print 'Dialog %s, item %d hit'%(self.wid, item) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def do_rawupdate(self, window, event): | 
					
						
							|  |  |  | 		pass | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def ostypecode(x): | 
					
						
							|  |  |  | 	"Convert a long int to the 4-character code it really is" | 
					
						
							|  |  |  | 	s = '' | 
					
						
							|  |  |  | 	for i in range(4): | 
					
						
							|  |  |  | 		x, c = divmod(x, 256) | 
					
						
							|  |  |  | 		s = chr(c) + s | 
					
						
							|  |  |  | 	return s | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestApp(Application): | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	"This class is used by the test() function" | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def makeusermenus(self): | 
					
						
							|  |  |  | 		self.filemenu = m = Menu(self.menubar, "File") | 
					
						
							|  |  |  | 		self.saveitem = MenuItem(m, "Save", "S", self.save) | 
					
						
							|  |  |  | 		Separator(m) | 
					
						
							|  |  |  | 		self.optionsmenu = mm = SubMenu(m, "Options") | 
					
						
							| 
									
										
										
										
											1999-12-14 15:45:53 +00:00
										 |  |  | 		self.opt1 = CheckItem(mm, "Arguments", "A") | 
					
						
							|  |  |  | 		self.opt2 = CheckItem(mm, "Being hit on the head lessons", (kMenuOptionModifier, "A")) | 
					
						
							|  |  |  | 		self.opt3 = CheckItem(mm, "Complaints", (kMenuOptionModifier|kMenuNoCommandModifier, "A")) | 
					
						
							| 
									
										
										
										
											1995-04-05 09:18:35 +00:00
										 |  |  | 		Separator(m) | 
					
						
							|  |  |  | 		self.quititem = MenuItem(m, "Quit", "Q", self.quit) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def save(self, *args): | 
					
						
							|  |  |  | 		print "Save" | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def quit(self, *args): | 
					
						
							|  |  |  | 		raise self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test(): | 
					
						
							|  |  |  | 	"Test program" | 
					
						
							|  |  |  | 	app = TestApp() | 
					
						
							|  |  |  | 	app.mainloop() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  | 	test() |