import jdsl.core.algo.traversals.*;
import jdsl.core.api.*;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

/** 
 * Class that manages the tree drawing application.
 *
 * @author Lucy Perry (lep)
 * @version JDSL 2
*/
public class SimpleTreeDraw extends Frame implements ActionListener,WindowListener {
    private RandomTreeBuilder builder=new RandomTreeBuilder();
    private Tree tree;
    private int numNodes=16;

    Button newTree = new Button("Draw New Tree");
    Button quitBtn = new Button("Quit");

    public SimpleTreeDraw() {
        super("Simple Tree Drawing");
        //build the tree
        tree=builder.randomTree(numNodes);
        
        setLayout(new BorderLayout());
        Panel p = new Panel();
        addWindowListener(this);
        quitBtn.addActionListener(this);
        newTree.addActionListener(this);
        p.add(newTree);
        p.add(quitBtn);
        add(p, BorderLayout.SOUTH);
        setSize(700,350);
	    setLocation(50,50);
    }

    /**
     * The paint method draws the tree.  There are 2 steps:  The BoundingBoxCalculator
     * determines the width of each subtree.  The TreeDrawer calculates the exact 
     * locations for labels and edges and draws the tree.
     */
    public void paint(Graphics g) {
        g.setColor(getBackground());
        BoundingBoxCalculator calc = new BoundingBoxCalculator(getGraphics());
        calc.execute(tree);
        TreeDrawer drawer = new TreeDrawer(g);
        drawer.execute(tree);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==quitBtn)
            quit();
        else if (e.getSource()==newTree) {
            // The user clicked the new tree button.  Build a new tree and redraw.
            tree=builder.randomTree(numNodes);
            repaint();
        }
    }

    private void quit() {
        System.exit(0);
    }

    public void windowActivated(WindowEvent e) {}
    public void windowClosed(WindowEvent e) {}
    public void windowClosing(WindowEvent e) {quit();}
    public void windowDeactivated(WindowEvent e) {}
    public void windowDeiconified(WindowEvent e) {}
    public void windowIconified(WindowEvent e) {}
    public void windowOpened(WindowEvent e) {}

    public static void main(String args[]) {
        SimpleTreeDraw s = new SimpleTreeDraw();
        s.show();
    }
}