# 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)