# Abstract classes for parents and children.
#
# Do not use as base class -- this is for documentation only.
#
# Note that the tree must be built top down (create the parent,
# then add the children).
#
# Also note that the creation methods are not standardized --
# these have extra parameters dependent on the widget type.
# For historical reasons, button creation methods are called
# define() while split creation methods are called create().

class AbstractParent:
	#
	# Upcalls from child to parent
	#
	def addchild(self, child): unimpl()
	def delchild(self, child): unimpl()
	#
	def need_mouse(self, child): unimpl()
	def no_mouse(self, child): unimpl()
	#
	def need_timer(self, child): unimpl()
	def no_timer(self, child): unimpl()
	#
	# XXX need_kbd, no_kbd; focus???
	#
	def begindrawing(self): return unimpl()
	def beginmeasuring(self): return unimpl()
	def getwindow(self): return unimpl() # Only for very special cases
	#
	def change(self, area): unimpl()
	def scroll(self, (area, (dh, dv))): unimpl()
	def settimer(self, itimer): unimpl()

class AbstractChild:
	#
	# Downcalls from parent to child
	#
	def destroy(self): unimpl()
	#
	def realize(self): return unimpl()
	def getminsize(self, (m, (width, height))): return unimpl()
	def getbounds(self): return unimpl()
	def setbounds(self, bounds): unimpl()
	def draw(self, (d, area)): unimpl()
	#
	# Downcalls only made after certain upcalls
	#
	def mouse_down(self, detail): unimpl()
	def mouse_move(self, detail): unimpl()
	def mouse_up(self, detail): unimpl()
	#
	def timer(self): unimpl()

# A "Split" is a child that manages one or more children.
# (This terminology is due to DEC SRC, except for CSplits.)
# A child of a split may be another split, a button, a slider, etc.
# Certain upcalls and downcalls can be handled transparently, but
# for others (e.g., all geometry related calls) this is not possible.

class AbstractSplit(AbstractChild, AbstractParent):
	pass
