| 
									
										
										
										
											1999-01-30 22:39:17 +00:00
										 |  |  | import FrameWork | 
					
						
							|  |  |  | import Qd | 
					
						
							| 
									
										
										
										
											2000-04-09 19:45:08 +00:00
										 |  |  | import Wbase, Wcontrols, Ctl, Controls | 
					
						
							| 
									
										
										
										
											1999-01-30 22:39:17 +00:00
										 |  |  | from types import * | 
					
						
							|  |  |  | import Wapplication | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _arrowright = Qd.GetPicture(472) | 
					
						
							|  |  |  | _arrowdown = Qd.GetPicture(473) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-04-09 19:45:08 +00:00
										 |  |  | class PopupControl(Wcontrols.ControlWidget): | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def __init__(self, possize, items=None, callback=None): | 
					
						
							|  |  |  | 		if items is None: | 
					
						
							|  |  |  | 			items = [] | 
					
						
							|  |  |  | 		procID = Controls.popupMenuProc|Controls.popupFixedWidth|Controls.useWFont | 
					
						
							|  |  |  | 		Wcontrols.ControlWidget.__init__(self, possize, "", procID, callback, 0, 0, 0) | 
					
						
							|  |  |  | 		self._items = items[:] | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def set(self, value): | 
					
						
							|  |  |  | 		self._control.SetControlValue(value+1) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def get(self): | 
					
						
							|  |  |  | 		return self._control.GetControlValue() - 1 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def open(self): | 
					
						
							|  |  |  | 		self.menu = menu = FrameWork.Menu(self._parentwindow.parent.menubar, 'Foo', -1) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		for i in range(len(self._items)): | 
					
						
							|  |  |  | 			item = self._items[i] | 
					
						
							|  |  |  | 			if type(item) == StringType: | 
					
						
							|  |  |  | 				menuitemtext = object = item | 
					
						
							|  |  |  | 			elif type(item) == TupleType and len(item) == 2: | 
					
						
							|  |  |  | 				menuitemtext, object = item | 
					
						
							|  |  |  | 				self._items[i] = object | 
					
						
							|  |  |  | 			else: | 
					
						
							|  |  |  | 				raise Wbase.WidgetsError, "illegal itemlist for popup menu" | 
					
						
							|  |  |  | 			menuitem = FrameWork.MenuItem(menu, menuitemtext, None, None) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		self._calcbounds() | 
					
						
							|  |  |  | 		self._control = Ctl.NewControl(self._parentwindow.wid,  | 
					
						
							|  |  |  | 						self._bounds,  | 
					
						
							|  |  |  | 						self._title,  | 
					
						
							|  |  |  | 						1,  | 
					
						
							|  |  |  | 						self._value,  | 
					
						
							|  |  |  | 						self.menu.id,  | 
					
						
							|  |  |  | 						self._max,  | 
					
						
							|  |  |  | 						self._procID,  | 
					
						
							|  |  |  | 						0) | 
					
						
							|  |  |  | 		self.SetPort() | 
					
						
							|  |  |  | 		self.enable(self._enabled) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def close(self): | 
					
						
							|  |  |  | 		self.menu.delete() | 
					
						
							|  |  |  | 		return Wcontrols.ControlWidget.close(self) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def click(self, point, modifiers): | 
					
						
							|  |  |  | 		if not self._enabled: | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		part = self._control.TrackControl(point, -1) | 
					
						
							|  |  |  | 		if part: | 
					
						
							|  |  |  | 			if self._callback: | 
					
						
							|  |  |  | 				Wbase.CallbackCall(self._callback, 0, self._items[self.get()]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-01-30 22:39:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class PopupWidget(Wbase.ClickableWidget): | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	"""Simple title-less popup widget. Should be 16x16 pixels. 
 | 
					
						
							|  |  |  | 	Builds the menu items on the fly, good for dynamic popup menus."""
 | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2000-04-09 19:45:08 +00:00
										 |  |  | 	def __init__(self, possize, items=None, callback=None): | 
					
						
							|  |  |  | 		Wbase.ClickableWidget.__init__(self, possize) | 
					
						
							|  |  |  | 		if items is None: | 
					
						
							|  |  |  | 			items = [] | 
					
						
							| 
									
										
										
										
											1999-01-30 22:39:17 +00:00
										 |  |  | 		self._items = items | 
					
						
							|  |  |  | 		self._itemsdict = {} | 
					
						
							|  |  |  | 		self._callback = callback | 
					
						
							|  |  |  | 		self._enabled = 1 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def close(self): | 
					
						
							| 
									
										
										
										
											2000-04-09 19:45:08 +00:00
										 |  |  | 		Wbase.ClickableWidget.close(self) | 
					
						
							| 
									
										
										
										
											1999-01-30 22:39:17 +00:00
										 |  |  | 		self._items = None | 
					
						
							|  |  |  | 		self._itemsdict = {} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def draw(self, visRgn = None): | 
					
						
							|  |  |  | 		if self._visible: | 
					
						
							|  |  |  | 			Qd.FrameRect(self._bounds) | 
					
						
							|  |  |  | 			Qd.EraseRect(Qd.InsetRect(self._bounds, 1, 1)) | 
					
						
							|  |  |  | 			l, t, r, b = self._bounds | 
					
						
							|  |  |  | 			l = l + 2 | 
					
						
							|  |  |  | 			t = t + 3 | 
					
						
							|  |  |  | 			pictframe = (l, t, l + 10, t + 10) | 
					
						
							|  |  |  | 			Qd.DrawPicture(_arrowright, pictframe) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def click(self, point, modifiers): | 
					
						
							|  |  |  | 		if not self._enabled: | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		self.menu = FrameWork.Menu(self._parentwindow.parent.menubar, 'Foo', -1) | 
					
						
							|  |  |  | 		self._additems(self._items, self.menu) | 
					
						
							|  |  |  | 		self.SetPort() | 
					
						
							|  |  |  | 		l, t, r, b = self._bounds | 
					
						
							|  |  |  | 		l, t = Qd.LocalToGlobal((l+1, t+1)) | 
					
						
							|  |  |  | 		Wbase.SetCursor("arrow") | 
					
						
							| 
									
										
										
										
											2001-01-29 13:29:47 +00:00
										 |  |  | 		self.menu.menu.EnableMenuItem(0) | 
					
						
							| 
									
										
										
										
											1999-01-30 22:39:17 +00:00
										 |  |  | 		reply = self.menu.menu.PopUpMenuSelect(t, l, 1) | 
					
						
							|  |  |  | 		if reply: | 
					
						
							|  |  |  | 			id = (reply & 0xffff0000) >> 16 | 
					
						
							|  |  |  | 			item = reply & 0xffff | 
					
						
							|  |  |  | 			self._menu_callback(id, item) | 
					
						
							|  |  |  | 		self._emptymenu() | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def set(self, items): | 
					
						
							|  |  |  | 		self._items = items | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def get(self): | 
					
						
							|  |  |  | 		return self._items | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def _additems(self, items, menu): | 
					
						
							|  |  |  | 		from FrameWork import SubMenu, MenuItem | 
					
						
							|  |  |  | 		menu_id = menu.id | 
					
						
							|  |  |  | 		for item in items: | 
					
						
							|  |  |  | 			if item == "-": | 
					
						
							|  |  |  | 				menu.addseparator() | 
					
						
							|  |  |  | 				continue | 
					
						
							|  |  |  | 			elif type(item) == ListType: | 
					
						
							|  |  |  | 				submenu = SubMenu(menu, item[0]) | 
					
						
							|  |  |  | 				self._additems(item[1:], submenu) | 
					
						
							|  |  |  | 				continue | 
					
						
							|  |  |  | 			elif type(item) == StringType: | 
					
						
							|  |  |  | 				menuitemtext = object = item | 
					
						
							|  |  |  | 			elif type(item) == TupleType and len(item) == 2: | 
					
						
							|  |  |  | 				menuitemtext, object = item | 
					
						
							|  |  |  | 			else: | 
					
						
							|  |  |  | 				raise Wbase.WidgetsError, "illegal itemlist for popup menu" | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			if menuitemtext[:1] == '\0': | 
					
						
							|  |  |  | 				check = ord(menuitemtext[1]) | 
					
						
							|  |  |  | 				menuitemtext = menuitemtext[2:] | 
					
						
							|  |  |  | 			else: | 
					
						
							|  |  |  | 				check = 0 | 
					
						
							|  |  |  | 			menuitem = MenuItem(menu, menuitemtext, None, None) | 
					
						
							|  |  |  | 			if check: | 
					
						
							|  |  |  | 				menuitem.check(1) | 
					
						
							|  |  |  | 			self._itemsdict[(menu_id, menuitem.item)] = object | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def _emptymenu(self): | 
					
						
							|  |  |  | 		menus = self._parentwindow.parent.menubar.menus | 
					
						
							|  |  |  | 		for id, item in self._itemsdict.keys(): | 
					
						
							|  |  |  | 			if menus.has_key(id): | 
					
						
							|  |  |  | 				self.menu = menus[id] | 
					
						
							|  |  |  | 				self.menu.delete() | 
					
						
							|  |  |  | 		self._itemsdict = {} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def _menu_callback(self, id, item): | 
					
						
							|  |  |  | 		thing = self._itemsdict[(id, item)] | 
					
						
							|  |  |  | 		if callable(thing): | 
					
						
							|  |  |  | 			thing() | 
					
						
							|  |  |  | 		elif self._callback: | 
					
						
							|  |  |  | 			Wbase.CallbackCall(self._callback, 0, thing) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PopupMenu(PopupWidget): | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	"""Simple title-less popup widget. Should be 16x16 pixels. 
 | 
					
						
							|  |  |  | 	Prebuilds the menu items, good for static (non changing) popup menus."""
 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def open(self): | 
					
						
							|  |  |  | 		self._calcbounds() | 
					
						
							|  |  |  | 		self.menu = Wapplication.Menu(self._parentwindow.parent.menubar, 'Foo', -1) | 
					
						
							|  |  |  | 		self._additems(self._items, self.menu) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def close(self): | 
					
						
							|  |  |  | 		self._emptymenu() | 
					
						
							|  |  |  | 		Wbase.Widget.close(self) | 
					
						
							|  |  |  | 		self._items = None | 
					
						
							|  |  |  | 		self._itemsdict = {} | 
					
						
							|  |  |  | 		self.menu = None | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def set(self, items): | 
					
						
							|  |  |  | 		if self._itemsdict: | 
					
						
							|  |  |  | 			self._emptymenu() | 
					
						
							|  |  |  | 		self.menu = Wapplication.Menu(self._parentwindow.parent.menubar, 'Foo', -1) | 
					
						
							|  |  |  | 		self._items = items | 
					
						
							|  |  |  | 		self._additems(self._items, self.menu) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def click(self, point, modifiers): | 
					
						
							|  |  |  | 		if not self._enabled: | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		self.SetPort() | 
					
						
							|  |  |  | 		l, t, r, b = self._bounds | 
					
						
							|  |  |  | 		l, t = Qd.LocalToGlobal((l+1, t+1)) | 
					
						
							|  |  |  | 		Wbase.SetCursor("arrow") | 
					
						
							| 
									
										
										
										
											2001-01-29 13:29:47 +00:00
										 |  |  | 		self.menu.menu.EnableMenuItem(0) | 
					
						
							| 
									
										
										
										
											1999-01-30 22:39:17 +00:00
										 |  |  | 		reply = self.menu.menu.PopUpMenuSelect(t, l, 1) | 
					
						
							|  |  |  | 		if reply: | 
					
						
							|  |  |  | 			id = (reply & 0xffff0000) >> 16 | 
					
						
							|  |  |  | 			item = reply & 0xffff | 
					
						
							|  |  |  | 			self._menu_callback(id, item) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FontMenu(PopupMenu): | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	"""A font popup menu.""" | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	menu = None | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def __init__(self, possize, callback): | 
					
						
							|  |  |  | 		PopupMenu.__init__(self, possize) | 
					
						
							|  |  |  | 		_makefontmenu() | 
					
						
							|  |  |  | 		self._callback = callback | 
					
						
							|  |  |  | 		self._enabled = 1 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def open(self): | 
					
						
							|  |  |  | 		self._calcbounds() | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def close(self): | 
					
						
							|  |  |  | 		del self._callback | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def set(self): | 
					
						
							|  |  |  | 		raise Wbase.WidgetsError, "can't change font menu widget" | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def _menu_callback(self, id, item): | 
					
						
							|  |  |  | 		fontname = self.menu.menu.GetMenuItemText(item) | 
					
						
							|  |  |  | 		if self._callback: | 
					
						
							|  |  |  | 			Wbase.CallbackCall(self._callback, 0, fontname) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def click(self, point, modifiers): | 
					
						
							|  |  |  | 		if not self._enabled: | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		_makefontmenu() | 
					
						
							|  |  |  | 		return PopupMenu.click(self, point, modifiers) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def _makefontmenu(): | 
					
						
							|  |  |  | 	"""helper for font menu""" | 
					
						
							|  |  |  | 	if FontMenu.menu is not None: | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	import W | 
					
						
							|  |  |  | 	FontMenu.menu = Wapplication.Menu(W.getapplication().menubar, 'Foo', -1) | 
					
						
							|  |  |  | 	W.SetCursor('watch') | 
					
						
							| 
									
										
										
										
											2001-01-29 15:18:46 +00:00
										 |  |  | 	for i in range(FontMenu.menu.menu.CountMenuItems(), 0, -1): | 
					
						
							| 
									
										
										
										
											1999-01-30 22:39:17 +00:00
										 |  |  | 		FontMenu.menu.menu.DeleteMenuItem(i) | 
					
						
							|  |  |  | 	FontMenu.menu.menu.AppendResMenu('FOND') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def _getfontlist(): | 
					
						
							|  |  |  | 	import Res | 
					
						
							|  |  |  | 	fontnames = [] | 
					
						
							|  |  |  | 	for i in range(1, Res.CountResources('FOND') + 1): | 
					
						
							|  |  |  | 		r = Res.GetIndResource('FOND', i) | 
					
						
							|  |  |  | 		fontnames.append(r.GetResInfo()[2]) | 
					
						
							|  |  |  | 	return fontnames |