| # Generic Split implementation. | 
 | # Use as a base class for other splits. | 
 | # Derived classes should at least implement the methods that call | 
 | # unimpl() below: getminsize(), getbounds() and setbounds(). | 
 |  | 
 | Error = 'Split.Error'	# Exception | 
 |  | 
 | import rect | 
 | from stdwinevents import * | 
 |  | 
 | class Split: | 
 | 	# | 
 | 	# Calls from creator | 
 | 	# NB derived classes may add parameters to create() | 
 | 	# | 
 | 	def create(self, parent): | 
 | 		parent.addchild(self) | 
 | 		self.parent = parent | 
 | 		self.children = [] | 
 | 		self.mouse_interest = [] | 
 | 		self.keybd_interest = [] | 
 | 		self.timer_interest = [] | 
 | 		self.altdraw_interest = [] | 
 | 		self.mouse_focus = None | 
 | 		self.keybd_focus = None | 
 | 		return self | 
 | 	# | 
 | 	# Downcalls from parent to child | 
 | 	# | 
 | 	def destroy(self): | 
 | 		self.parent = None | 
 | 		for child in self.children: | 
 | 			child.destroy() | 
 | 		del self.children[:] | 
 | 		del self.mouse_interest[:] | 
 | 		del self.keybd_interest[:] | 
 | 		del self.timer_interest[:] | 
 | 		del self.altdraw_interest[:] | 
 | 		self.mouse_focus = None | 
 | 		self.keybd_focus = None | 
 | 	# | 
 | 	def getminsize(self, m, (width, height)): | 
 | 		return unimpl()			# Should ask children | 
 | 	def getbounds(self): | 
 | 		return unimpl() | 
 | 	def setbounds(self, bounds): | 
 | 		unimpl()			# Should tell children | 
 | 	# | 
 | 	def realize(self): | 
 | 		for child in self.children: | 
 | 			child.realize() | 
 | 	# | 
 | 	def draw(self, d, detail): | 
 | 		# (Could avoid calls to children outside the area) | 
 | 		for child in self.children: | 
 | 			child.draw(d, detail) | 
 | 	# | 
 | 	def altdraw(self, detail): | 
 | 		for child in self.altdraw_interest: | 
 | 			child.altdraw(detail) | 
 | 	# | 
 | 	# Keyboard focus handling (used internally) | 
 | 	# XXX This is not enough if two levels of splits | 
 | 	# XXX surround text fields! | 
 | 	# | 
 | 	def set_keybd_focus(self, child): | 
 | 		if self.keybd_focus <> child: | 
 | 			if self.keybd_focus: | 
 | 				self.keybd_focus.deactivate() | 
 | 				self.keybd_focus = None | 
 | 			if child: | 
 | 				child.activate() | 
 | 				self.keybd_focus = child | 
 | 	def next_keybd_focus(self): | 
 | 		if not self.keybd_interest: | 
 | 			self.set_keybd_focus(None) | 
 | 			return | 
 | 		if self.keybd_focus in self.keybd_interest: | 
 | 			i = self.keybd_interest.index(self.keybd_focus) | 
 | 			i = (i+1) % len(self.keybd_interest) | 
 | 		else: | 
 | 			i = 0 | 
 | 		self.set_keybd_focus(self.keybd_interest[i]) | 
 | 	# | 
 | 	# Downcalls only made after certain upcalls | 
 | 	# | 
 | 	def mouse_down(self, detail): | 
 | 		if self.mouse_focus: | 
 | 			self.mouse_focus.mouse_down(detail) | 
 | 			return | 
 | 		p = detail[0] | 
 | 		for child in self.mouse_interest: | 
 | 			if rect.pointinrect(p, child.getbounds()): | 
 | 				self.mouse_focus = child | 
 | 				if child in self.keybd_interest: | 
 | 					self.set_keybd_focus(child) | 
 | 				child.mouse_down(detail) | 
 | 	def mouse_move(self, detail): | 
 | 		if self.mouse_focus: | 
 | 			self.mouse_focus.mouse_move(detail) | 
 | 	def mouse_up(self, detail): | 
 | 		if self.mouse_focus: | 
 | 			self.mouse_focus.mouse_up(detail) | 
 | 			self.mouse_focus = None | 
 | 	# | 
 | 	def activate(self): | 
 | 		if self.keybd_focus: | 
 | 			self.keybd_focus.activate() | 
 | 		else: | 
 | 			self.next_keybd_focus() | 
 | 	def deactivate(self): | 
 | 		if self.keybd_focus: | 
 | 			self.keybd_focus.deactivate() | 
 | 	# | 
 | 	def keybd(self, type, detail): | 
 | 		if not self.keybd_focus: | 
 | 			self.set_keybd_focus(self.keybd_interest[0]) | 
 | 		if type == WE_COMMAND and detail == WC_TAB and \ | 
 | 					len(self.keybd_interest) > 1: | 
 | 			self.next_keybd_focus() | 
 | 			return | 
 | 		self.keybd_focus.keybd(type, detail) | 
 | 	# | 
 | 	def timer(self): | 
 | 		for child in self.timer_interest: | 
 | 			child.timer() | 
 | 	# | 
 | 	# Upcalls from child to parent | 
 | 	# | 
 | 	def addchild(self, child): | 
 | 		if child in self.children: | 
 | 			raise Error, 'addchild: child already inlist' | 
 | 		self.children.append(child) | 
 | 	def delchild(self, child): | 
 | 		if child not in self.children: | 
 | 			raise Error, 'delchild: child not in list' | 
 | 		self.children.remove(child) | 
 | 		if child in self.mouse_interest: | 
 | 			self.mouse_interest.remove(child) | 
 | 		if child in self.keybd_interest: | 
 | 			self.keybd_interest.remove(child) | 
 | 		if child in self.timer_interest: | 
 | 			self.timer_interest.remove(child) | 
 | 		if child in self.altdraw_interest: | 
 | 			self.altdraw_interest.remove(child) | 
 | 		if child == self.mouse_focus: | 
 | 			self.mouse_focus = None | 
 | 		if child == self.keybd_focus: | 
 | 			self.keybd_focus = None | 
 | 	# | 
 | 	def need_mouse(self, child): | 
 | 		if child not in self.mouse_interest: | 
 | 			self.mouse_interest.append(child) | 
 | 			self.parent.need_mouse(self) | 
 | 	def no_mouse(self, child): | 
 | 		if child == self.mouse_focus: | 
 | 			self.mouse_focus = None | 
 | 		if child in self.mouse_interest: | 
 | 			self.mouse_interest.remove(child) | 
 | 			if not self.mouse_interest: | 
 | 				self.parent.no_mouse(self) | 
 | 	# | 
 | 	def need_keybd(self, child): | 
 | 		if child not in self.keybd_interest: | 
 | 			self.keybd_interest.append(child) | 
 | 			self.parent.need_keybd(self) | 
 | 		if not self.keybd_focus: | 
 | 			self.set_keybd_focus(child) | 
 | 	def no_keybd(self, child): | 
 | 		if child == self.keybd_focus: | 
 | 			self.keybd_focus = None # Don't call child.deactivate() | 
 | 		if child in self.keybd_interest: | 
 | 			self.keybd_interest.remove(child) | 
 | 			if not self.keybd_interest: | 
 | 				self.parent.no_keybd(self) | 
 | 	# | 
 | 	def need_timer(self, child): | 
 | 		if child not in self.timer_interest: | 
 | 			self.timer_interest.append(child) | 
 | 			self.parent.need_timer(self) | 
 | 	def no_timer(self, child): | 
 | 		if child in self.timer_interest: | 
 | 			self.timer_interest.remove(child) | 
 | 			if not self.timer_interest: | 
 | 				self.parent.no_timer(self) | 
 | 	# | 
 | 	def need_altdraw(self, child): | 
 | 		if child not in self.altdraw_interest: | 
 | 			self.altdraw_interest.append(child) | 
 | 			self.parent.need_altdraw(self) | 
 | 	def no_altdraw(self, child): | 
 | 		if child in self.altdraw_interest: | 
 | 			self.altdraw_interest.remove(child) | 
 | 			if not self.altdraw_interest: | 
 | 				self.parent.no_altdraw(self) | 
 | 	# | 
 | 	# The rest are transparent: | 
 | 	# | 
 | 	def begindrawing(self): | 
 | 		return self.parent.begindrawing() | 
 | 	def beginmeasuring(self): | 
 | 		return self.parent.beginmeasuring() | 
 | 	def getwindow(self): | 
 | 		return self.parent.getwindow() | 
 | 	# | 
 | 	def change(self, area): | 
 | 		self.parent.change(area) | 
 | 	def scroll(self, area, vector): | 
 | 		self.parent.scroll(area, vector) | 
 | 	def settimer(self, itimer): | 
 | 		self.parent.settimer(itimer) |