import structure.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.SwingUtilities;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class chart1 extends JApplet implements MouseListener,
                                                   MouseMotionListener{

    Graph graph1 = new Graph("Description of the Graph");
    Graph graph2 = new Graph("Some Other Title");
    public Graph currentGraph ;

    GraphPanel graphPanel = new GraphPanel();
    LabelPanel labelPanel = new LabelPanel();

    JButton b3;
    int npos = -1;
    Vector epos = new Vector();
    Color ncolor = Color.white;
    Color bcolor = Color.black;
    Color tcolor = Color.black;
    Color ecolor = Color.black;

    public void init() {

        String[]node1ntext = new String[1];      
        node1ntext[0]= "Step A";

        String[]node1nhint = new String[1];      
        node1nhint[0]= "Hint A";
   
        String[]node2ntext = new String[1];      
        node2ntext[0]= "Step B";

        String[]node2nhint = new String[1];      
        node2nhint[0]= "Hint for step B";

        String[]node3ntext = new String[1];      
        node3ntext[0]= "Step C";

        String[]node3nhint = new String[1];      
        node3nhint[0]= "Hint for Step C";

        String[]node4ntext = new String[1];      
        node4ntext[0]= "x";

        String[]node4nhint = new String[1];      
        node4nhint[0]= "hint";

        String[]node5ntext = new String[1];      
        node5ntext[0]= "Step B : Part 1";

        String[]node5nhint = new String[1];      
        node5nhint[0]= "Hint to substep B";

        String[]node6ntext = new String[1];      
        node6ntext[0]= "Step B : Part 2";

        String[]node6nhint = new String[1];      
        node6nhint[0]= "Hint to substep B";

        String[]node7ntext = new String[1];      
        node7ntext[0]= "y";

        String[]node7nhint = new String[1];      
        node7nhint[0]= "Hint";

        addMouseListener(this);
        addMouseMotionListener(this);

        graph1.addNode("node1",node1ntext,ncolor,bcolor,tcolor,1,1,node1nhint,1);
        graph1.addNode("node2",node2ntext,ncolor,bcolor,tcolor,1,2,node2nhint,1);
        graph1.addNode("node3",node3ntext,ncolor,bcolor,tcolor,1,3,node3nhint,1);
        graph1.addEdge("node1","node2","edge1","hint to edge 1",ecolor,0);
        graph1.addEdge("node2","node3","edge2","hint to edge 2",ecolor,0);


        graph2.addNode("node4",node4ntext, ncolor,bcolor,tcolor,2,1,node4nhint,2);
        graph2.addNode("node5",node5ntext, ncolor,bcolor,tcolor,1,2,node5nhint,1);
        graph2.addNode("node6",node6ntext, ncolor,bcolor,tcolor,3,2,node6nhint,1);
        graph2.addNode("node7",node7ntext, ncolor,bcolor,tcolor,2,3,node7nhint,2);        
        graph2.addEdge("node4","node5","edge3","hint to edge",ecolor,0);
        graph2.addEdge("node4","node6","edge4","hint to edge",ecolor,0);
        graph2.addEdge("node5","node7","edge5","hint to edge",ecolor,0);
        graph2.addEdge("node6","node7","edge6","hint to edge",ecolor,0);

        
        Node n;
        n = graph1.findNode("node2");
        n.addGraph(graph2);
        
        currentGraph = graph1;
        buildUI(getContentPane());


    }

    public void mouseEntered(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    
    public void mouseDragged(MouseEvent e){}
           
    public void mouseMoved(MouseEvent e){
       Point p=new Point(e.getPoint());
       p=SwingUtilities.convertPoint(this,p,graphPanel);
       System.out.println("*********");
       System.out.println(p);

       npos=-1; epos.removeAllElements();

       for(int i=currentGraph.getEdgeSize()-1;i>=0;i--){  
            Edge eg=currentGraph.getEdge(i);
            if(eg.contains(p)) {
               epos.addElement(new Integer(i));
               System.out.println("it has an edge");
               eg.setColor(Color.green);
            }
            else { eg.setColor(ecolor); } 
        }

       
       for(int i=currentGraph.getNodeSize()-1;i>=0;i--){
           Node n=currentGraph.getNode(i);
           if(n.contains(p)){
               n.setColor(Color.blue, Color.black, Color.yellow);
               npos = i;
               //System.out.println("POS: "+pos);
           }
           else { n.setColor(ncolor,bcolor,tcolor); } 
       }


       System.out.println("*********");


       repaint();

    }
  

    public void mouseClicked(MouseEvent e) {

        Point p=new Point(e.getPoint());  
        p=SwingUtilities.convertPoint(this,p,graphPanel);

        for(int i=currentGraph.getNodeSize()-1;i>=0;i--){  
            Node n=currentGraph.getNode(i);
            if((n.contains(p)) && (n.getGraph()!=null)) {
               currentGraph = n.getGraph();
               npos = -1; epos.removeAllElements();
               repaint();
               return;
            }
        }
         
    }

   

    public void buildUI(Container container) {

        labelPanel.setGraphTitle(currentGraph.title);
        
        graphPanel.setBackground(Color.white);
     
        b3 = new JButton ("Zoom Out");
        b3.setToolTipText("Return to prevous graph.");
        b3.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
               currentGraph = graph1;
               repaint();
            }
        });
        
        container.add(labelPanel,BorderLayout.NORTH);
        container.add(graphPanel, BorderLayout.CENTER);
        container.add(b3,BorderLayout.SOUTH);
    }

    class GraphPanel extends JPanel{

        public GraphPanel() {
            setPreferredSize(new Dimension(400, 100));
        }


       public void paintComponent(Graphics g) {
            super.paintComponent(g);
            //System.out.println("position: "+pos);
            labelPanel.setGraphTitle(currentGraph.title);
            currentGraph.paintComponent(g,npos,epos);
        }


    }


    class LabelPanel extends JPanel {
        JLabel label1; 
        JLabel label2;

        public LabelPanel( ){
            label1 = new JLabel("Simple Example Description",JLabel.CENTER);
            label2 = new JLabel("description",JLabel.CENTER);
            setLayout(new BorderLayout());
            setPreferredSize(new Dimension(400, 30));
            add(label1, BorderLayout.NORTH);
            add(label2, BorderLayout.CENTER);
        }

       public void setGraphTitle(String s){
            label2.setText(s);
       }

    }   
}
