/*
 * @(#)DrawingTreeHead.java
 *
 * Last Modified: 9/15/01
 */

 import java.util.*;
 import java.lang.*;
 import java.awt.*;
 import java.awt.font.*;
 import java.awt.geom.*;

/**
 * The interface defines  numerous methods which allow for the drawing of
 * the entire <code>DrawingTree</code> onto a given Graphics2D using the head methods. The interface also defines many mutator and accesor
 * methods for information concerning the drawing of the entire <code>DrawingTree</code>
 *
 * @author Corey Sanders
 * @version 1.2 9/15/01
 */
public interface DrawingTreeHead extends TreeHead {

	/**
	 * Sets the <code>NodeSettings</code> for the entire tree from the head down.
	 * These settings are used for drawing the node and the links of each given tree.
	 *
	 * @param s <code>NodeSettings</code> for use in drawing the entire tree.
	 * @param k <code>KeySettings</code> for use in drawing the keys of the entire tree.
	 */
	public void setTreeSettings(NodeSettings s, KeySettings k);

	/**
	 * Gets the <code>NodeSettings</code> for the entire tree.
  	 *
	 * @return <code>NodeSettings</code> for defined for the entire tree.
	 */
	public NodeSettings getDrawingNodeSettings();


	/**
	 * Gets the <code>KeySettings</code> for the entire tree.
  	 *
	 * @return <code>KeySettings</code> for defined for the entire tree.
	 */
	 public KeySettings getDrawingKeySettings();

	/**
	 * Gets the width of the standard node within the tree. Every node is not necessarily the same
	 * width, but the standard is set within the Head.
	 *
	 * @return width of the standard node.
	 */
	public double getNodeWidth();

	/**
	 * Gets the height of the standard node within the tree. Every node is not necessarily the same
	 * height, but the standard is set within the Head.
	 *
	 * @return height of the standard node.
	 */
	public double getNodeHeight();


	/**
	 * Gets the bounds of the screen to which the tree is drawing. The bounds generally is simply
	 * the rectangle enclosing the Graphics2D passed.
	 *
	 * @return the rectangle representing the bounds of the screen.
	 */
	public Rectangle2D getScreenBounds();


	/**
	 * Sets the bounds of the screen to which the tree is drawing. Generally, these bounds
	 * are set using <code>getClipBounds</code> on the Graphics2D passed, however, the bounds
	 * can be set in any way.
	 *
	 * @param bounds the rectangle representing the bounds of the screen.
	 */
	public void setScreenBounds(Rectangle2D screen);

	/**
	 * Makes the entire tree from the null head down. The tree is made using the Graphics2D,
	 * and generally fills the entire Graphics2D parameter. This method allows the tree's
	 * drawing information to be defined without having to render the entire tree.
	 *
	 * @param g2 Graphics2D which the tree is made to fit unto.
	 */
	public void MakeTree(Graphics2D g2);

	/**
	 * Draws the entire tree from the null head down. The tree is drawn onto the Graphics2D,
	 * and uses the information defined in the previous call to <code>MakeTree</code>.
	 *
	 * @param g2 Graphics2D which the tree is drawn onto.
	 */
	public void DrawTree(Graphics2D g2);

	/**
	 * Finds the node represented by the x-y coordinates given. The (x,y) location represents a location
	 * within the Graphics2D to which the node appears. The recursive method progresses through the entire tree
	 * looking for the proper node.
	 *
	 * @param x x-coordinate to find the node.
	 * @param y y-coordinate to find the node.
	 *
	 * @return DrawingTree representing the x-y coordinates passed or null if no node is found.
	 */
	public DrawingTree findNode(double x, double y);






}