# A class that sits transparently between a parent and one child. # First create the parent, then this thing, then the child. # Use this as a base class for objects that are almost transparent. # Don't use as a base class for parents with multiple children. Error = 'TransParent.Error' # Exception class ManageOneChild: # # Upcalls shared with other single-child parents # def addchild(self, child): if self.child: raise Error, 'addchild: one child only' if not child: raise Error, 'addchild: bad child' self.child = child # def delchild(self, child): if not self.child: raise Error, 'delchild: no child' if child <> self.child: raise Error, 'delchild: not my child' self.child = 0 class TransParent(ManageOneChild): # # Calls from creator # NB derived classes may add parameters to create() # def create(self, parent): parent.addchild(self) self.parent = parent self.child = None # No child yet return self # # Downcalls from parent to child # def destroy(self): del self.parent if self.child: self.child.destroy() del self.child # def getminsize(self, args): if not self.child: m, size = args return size else: return self.child.getminsize(args) def getbounds(self, bounds): if not self.child: raise Error, 'getbounds w/o child' else: return self.child.getbounds() def setbounds(self, bounds): if not self.child: raise Error, 'setbounds w/o child' else: self.child.setbounds(bounds) def realize(self): if self.child: self.child.realize() def draw(self, d, area): if self.child: self.child.draw(d, area) def altdraw(self, area): if self.child: self.child.altdraw(area) # # Downcalls only made after certain upcalls # def mouse_down(self, detail): if self.child: self.child.mouse_down(detail) def mouse_move(self, detail): if self.child: self.child.mouse_move(detail) def mouse_up(self, detail): if self.child: self.child.mouse_up(detail) # def keybd(self, type_detail): self.child.keybd(type_detail) def activate(self): self.child.activate() def deactivate(self): self.child.deactivate() # def timer(self): if self.child: self.child.timer() # # Upcalls from child to parent # def need_mouse(self, child): self.parent.need_mouse(self) def no_mouse(self, child): self.parent.no_mouse(self) # def need_timer(self, child): self.parent.need_timer(self) def no_timer(self, child): self.parent.no_timer(self) # def need_altdraw(self, child): self.parent.need_altdraw(self) def no_altdraw(self, child): self.parent.no_altdraw(self) # def need_keybd(self, child): self.parent.need_keybd(self) def no_keybd(self, child): self.parent.no_keybd(self) # 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)