import java.awt.*;
import java.awt.event.*;

public class DiscButtonPanel extends Panel implements ActionListener
{
  private Button discRepButton;
  //private Button graphInfoButton;
  private Button removeButton;
  //private Button stepButton;
  private Button clearButton;

  private DirectedGraph graph;
  private DirectedGraphCanvas canvas;

  private int at;
  private int vat;
  private DirectedVertex v;
  private List pos;
  private List orderedEdges;

  DiscButtonPanel(DirectedGraphCanvas canvas)
  {
     super();
     this.canvas = canvas;
     graph = canvas.graph;
     setBackground(Color.black);
     setLayout(new FlowLayout());

     discRepButton = new Button("Sham's Disc Representation");
     removeButton = new Button("Remove Verticies and Edges");
     clearButton = new Button("Clear All");

     add(discRepButton);
     discRepButton.addActionListener(this);
     add(removeButton);
     removeButton.addActionListener(this);
     add(clearButton);
     clearButton.addActionListener(this);

     vat = at = 0;
  }

  // ActionListener
  public void actionPerformed(ActionEvent e)
  {
    /*if (e.getActionCommand().equals("Graph Info")) {
      //canvas.newDisc(50,50,10);
      System.out.println("# verticies: " + graph.vertices.length +
                        ", # edges: " + graph.edges.length +
                        ", #discs: " + graph.discs.length);
      for (int i=0; i<graph.vertices.length; i++) {
        System.out.println( "vertex " + i + ": x " +
            ((DirectedVertex)(graph.vertices.elements[i])).position.x +
            ", y " +
            ((DirectedVertex)(graph.vertices.elements[i])).position.y +
            ", inedges: " +
            ((DirectedVertex)(graph.vertices.elements[i])).inedges.length +
            ", outedges: " +
            ((DirectedVertex)(graph.vertices.elements[i])).outedges.length );

        //((DirectedVertex)(graph.vertices.elements[i])).solid =
        //    !((DirectedVertex)(graph.vertices.elements[i])).solid;
        //((DirectedVertex)(graph.vertices.elements[i])).adjustSize(1);
      }
      for (int i=0; i<graph.edges.length; i++) {
        System.out.println( "edge " + i + ": x " +
            ((DirectedEdge)(graph.edges.elements[i])).start.position.x +
            ", y " +
            ((DirectedEdge)(graph.edges.elements[i])).start.position.y +
            " : x " +
            ((DirectedEdge)(graph.edges.elements[i])).end.position.x +
            ", y " +
            ((DirectedEdge)(graph.edges.elements[i])).end.position.y );
      }

      for (int i=0; i<graph.discs.length; i++) {
        System.out.println( "disc " + i + ": x " +
            ((Disc)(graph.discs.elements[i])).position.x +
            ", y " +
            ((Disc)(graph.discs.elements[i])).position.y );
      }
    }
    else*/ if (e.getActionCommand().equals("Sham's Disc Representation")) {
        //DirectedVertex v;
        //List pos;
        //List orderedEdges;
        //v = (DirectedVertex)(graph.vertices.elements[0]);
        //v.color = Color.green;
        //orderedEdges = DiscMath.CreateOrderedAdjEdgeList(v);
        System.out.println("Sham's Disc Representation");
        for (int j=0; j<graph.vertices.length; j++) {
          v = (DirectedVertex)(graph.vertices.elements[j]);
          v.orderedEdges = DiscMath.CreateOrderedAdjEdgeList(v);
          pos = DiscMath.CreateNormalEdgePosList(v, 20.0);
          // draw normalized edge points
          //for (int i=0; i<pos.length; i++)
          //  canvas.newVertex( ((Position)(pos.elements[i])) );
          //graph.discs.insert(new Disc(v.position.x, v.position.y, v.radius), j);
        }
        DiscMath.CreateDiscRepresentation(canvas);
    }
    /*else if (e.getActionCommand().equals("Step Adj Edges")) {
        if (at == 0 && vat < graph.vertices.length ) {
          v = (DirectedVertex)(graph.vertices.elements[vat++]);
          v.color = Color.green;
          System.out.println("theta " + DiscMath.SumOfAnglesAroundVertex(v));
        }
        if (at < v.orderedEdges.length) {
          ((DirectedEdge)(v.orderedEdges.elements[at++])).color = Color.green;
          canvas.repaint();
        }
        else {
          for (int i=0; i<v.orderedEdges.length; i++)
            ((DirectedEdge)(v.orderedEdges.elements[i])).color = Color.black;
          v.color = Color.black;
          canvas.repaint();
          at = 0;
        }
        if (vat >= graph.vertices.length )
          vat = 0;
    }*/
    else if (e.getActionCommand().equals("Remove Verticies and Edges")) {
      int length = graph.vertices.length;
      // remove the verticies and edges
      for (int i=0; i<length; i++)
        graph.vertices.delete((DirectedVertex)(graph.vertices.elements[0]));
      length = graph.edges.length;
      for (int i=0; i<length; i++)
        graph.edges.delete((DirectedEdge)(graph.edges.elements[0]));
      length = graph.discs.length;
      canvas.repaint();
    }
    else if (e.getActionCommand().equals("Clear All")) {
      int length = graph.vertices.length;
      // remove the verticies and edges
      for (int i=0; i<length; i++)
        graph.vertices.delete((DirectedVertex)(graph.vertices.elements[0]));
      length = graph.edges.length;
      for (int i=0; i<length; i++)
        graph.edges.delete((DirectedEdge)(graph.edges.elements[0]));
      length = graph.discs.length;
      for (int i=0; i<length; i++)
        graph.discs.delete((Disc)(graph.discs.elements[0]));
      canvas.repaint();
      vat = at = 0;
    }
  }
}
