package tomo

import "image"

// Parent represents a type capable of containing child elements.
type Parent interface {
	// NotifyMinimumSizeChange notifies the container that a child element's
	// minimum size has changed. This method is expected to be called by
	// child elements when their minimum size changes.
	NotifyMinimumSizeChange (child Element)

	// Window returns the window containing the parent.
	Window () Window
}

// FocusableParent represents a parent with keyboard navigation support.
type FocusableParent interface {
	Parent
	
	// RequestFocus notifies the parent that a child element is requesting
	// keyboard focus. If the parent grants the request, the method will
	// return true and the child element should behave as if a HandleFocus
	// call was made.
	RequestFocus (child Focusable) (granted bool)

	// RequestFocusMotion notifies the parent that a child element wants the
	// focus to be moved to the next focusable element.
	RequestFocusNext (child Focusable)
	
	// RequestFocusMotion notifies the parent that a child element wants the
	// focus to be moved to the previous focusable element.
	RequestFocusPrevious (child Focusable)
}

// FlexibleParent represents a parent that accounts for elements with
// flexible height.
type FlexibleParent interface {
	Parent

	// NotifyFlexibleHeightChange notifies the parent that the parameters
	// affecting a child's flexible height have changed. This method is
	// expected to be called by flexible child element when their content
	// changes.
	NotifyFlexibleHeightChange (child Flexible)
}

// ScrollableParent represents a parent that can change the scroll
// position of its child element(s).
type ScrollableParent interface {
	Parent
	
	// NotifyScrollBoundsChange notifies the parent that a child's scroll
	// content bounds or viewport bounds have changed. This is expected to
	// be called by child elements when they change their supported scroll
	// axes, their scroll position (either autonomously or as a result of a
	// call to ScrollTo()), or their content size.
	NotifyScrollBoundsChange (child Scrollable)
}

// BackgroundParent represents a parent that is able to re-draw a portion of its
// background upon request. This is intended to be used by transparent elements
// that want to adopt their parent's background pattern. If a parent implements
// this interface, it should call a child's DrawTo method when its area of the
// background is affected.
type BackgroundParent interface {
	Parent

	// DrawBackground draws a portion of the parent's background pattern
	// within the specified bounds. The parent will not push these changes.
	DrawBackground (bounds image.Rectangle)
}