
import javax.swing.JComponent;
import java.awt.*;

/** This class implements a JFrame to display a graphical 
 *  image of tree, on object of type BinaryTree<Content> */
public class BinTreeComponent<Content> extends JComponent {
	private BinaryTree<Content> tree;
	private int treeHeight;

	/** pre:  th == the height of tree t
	 *  post: tree == t
	 * 		  and  treeHeight == th */
	public BinTreeComponent(int th, BinaryTree<Content> t) {
		treeHeight = th;
		tree = t;
	}
	
	public void paint(Graphics g) {
		if (tree != null) {
			drawTree(g, 1, 1, tree, getWidth()/2, 10);
		}
	}
	
	private void drawTree(Graphics g, int lev, int horizPos, BinaryTree<Content> t, int x, int y) {
		int newX = horizPos*getWidth()/(powerOf2(lev-1)+1);
		int newY;
		if (treeHeight == 1)
			newY = 1;
		else
			newY = (lev-1)*(getHeight()-50)/(treeHeight-1);
        g.setColor(Color.black);
		if (lev!=1) g.drawLine(x, y+15, newX, newY-5);
        g.setColor(Color.blue);
        g.drawString(t.getContent().toString(), newX-5, newY+10);
		if (t.leftSubtree() != null)
			drawTree(g, lev+1, horizPos*2-1, t.leftSubtree(), newX, newY);
		if (t.rightSubtree() != null)
			drawTree(g, lev+1, horizPos*2, t.rightSubtree(), newX, newY);
	}
	
	/** pre: k >= 0
	 *  post: result == 2 raised to the power k */
	private int powerOf2(int k) {
		int result = 1;
		while (k>0) {
			result = result * 2;
			k--;
		}
		return result;
	}
}
