/*
A basic extension of the com.sun.java.swing.JApplet class
*/

import com.sun.java.swing.*;
import java.awt.*;
import java.io.*;
import com.symantec.itools.swing.models.StringListModel;
import java.util.Hashtable;
import java.util.Enumeration;
import com.sun.java.swing.tree.*;

public class JApplet1 extends JApplet
{
	public void init()
	{
		// Take out this line if you don't use symantec.itools.net.RelativeURL or symantec.itools.awt.util.StatusScroller
		symantec.itools.lang.Context.setApplet(this);
		
		// This line prevents the "Swing: checked access to system event queue" message seen in some browsers.
		getRootPane().putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE);
		
		// This code is automatically generated by Visual Cafe when you add
		// components to the visual environment. It instantiates and initializes
		// the components. To modify the code, only use code syntax that matches
		// what Visual Cafe can generate, or Visual Cafe may be unable to back
		// parse your Java file into its visual environment.
		//{{INIT_CONTROLS
		getContentPane().setLayout(null);
		setSize(896,482);
		JScrollPane1.setOpaque(true);
		getContentPane().add(JScrollPane1);
		JScrollPane1.setBounds(12,24,600,360);
		JScrollPane1.getViewport().add(JTree1);
		JTree1.setBounds(0,0,597,357);
		JButton1.setText("Load Table");
		JButton1.setActionCommand("jbutton");
		getContentPane().add(JButton1);
		JButton1.setBounds(96,396,108,36);
		getContentPane().add(JProgressBar1);
		JProgressBar1.setBounds(156,444,720,12);
		JButton2.setText("Show Tree");
		JButton2.setActionCommand("jbutton");
		getContentPane().add(JButton2);
		JButton2.setBounds(324,396,96,36);
		JButton3.setText("Build Tree");
		JButton3.setActionCommand("jbutton");
		getContentPane().add(JButton3);
		JButton3.setBounds(216,396,99,35);
		JLabel1.setText("jlabel");
		getContentPane().add(JLabel1);
		JLabel1.setBounds(12,432,72,28);
		getContentPane().add(JScrollPane2);
		JScrollPane2.setBounds(624,24,247,356);
		JPanel1.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
		JScrollPane2.getViewport().add(JPanel1);
		JPanel1.setBounds(0,0,244,353);
		JLabel2.setText("Hit the buttons in order from left to right.  Wait before hitting the next button.");
		getContentPane().add(JLabel2);
		JLabel2.setBounds(432,396,432,40);
		//}}
	
		//{{REGISTER_LISTENERS
		SymAction lSymAction = new SymAction();
		JButton1.addActionListener(lSymAction);
		JButton2.addActionListener(lSymAction);
		JButton3.addActionListener(lSymAction);
		SymTreeSelection lSymTreeSelection = new SymTreeSelection();
		JTree1.addTreeSelectionListener(lSymTreeSelection);
		//}}
	}

	//{{DECLARE_CONTROLS
	com.sun.java.swing.JScrollPane JScrollPane1 = new com.sun.java.swing.JScrollPane();
	com.sun.java.swing.JTree JTree1 = new com.sun.java.swing.JTree();
	com.sun.java.swing.JButton JButton1 = new com.sun.java.swing.JButton();
	com.sun.java.swing.JProgressBar JProgressBar1 = new com.sun.java.swing.JProgressBar();
	com.sun.java.swing.JButton JButton2 = new com.sun.java.swing.JButton();
	com.sun.java.swing.JButton JButton3 = new com.sun.java.swing.JButton();
	com.sun.java.swing.JLabel JLabel1 = new com.sun.java.swing.JLabel();
	com.sun.java.swing.JScrollPane JScrollPane2 = new com.sun.java.swing.JScrollPane();
	com.sun.java.swing.JPanel JPanel1 = new com.sun.java.swing.JPanel();
	com.sun.java.swing.JLabel JLabel2 = new com.sun.java.swing.JLabel();
	//}}
	
    private static Hashtable stuff = new Hashtable(3800);
    private static final String yes = "Yes!";
    private static SimGrid root = null;
    
    void makeTree() {
        DefaultTreeModel mod = new DefaultTreeModel(root);
        JTree1.setModel(mod);
        SimGrid.g = JPanel1.getGraphics();
    }
    
    void computeAll() {
        SimGrid.JLabel1 = JLabel1;
        SimGrid.JProgressBar1 = JProgressBar1;
	    JProgressBar1.setMaximum(3581);
	    JProgressBar1.setMinimum(0);
	    JProgressBar1.setValue(0);
	    Enumeration e = stuff.keys();
        SimGrid foo; Object x;
        while (e.hasMoreElements()) {
            x = e.nextElement();
            foo = (SimGrid)stuff.get(x);
            foo.computeWinner();
//    	    JProgressBar1.setValue(JProgressBar1.getValue()+1);
//    	    JLabel1.setText("" + JProgressBar1.getValue());
        }
        JProgressBar1.setValue(0);
  	    JLabel1.setText("Done");
    }

	void processData() {
	try {
	    JProgressBar1.setMaximum(3581);
	    JProgressBar1.setMinimum(0);
	    JProgressBar1.setValue(0);
	    java.net.URL data = new java.net.URL("http://www.ugcs.caltech.edu/~whuang/prog/sim/sim3.txt");
        //java.net.URL data = new java.net.URL("http://127.0.0.1/sim3.txt");
        InputStream is = (InputStream)data.getContent();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        
        String nextLine;  SimGrid foo;
        while ((nextLine = br.readLine()) != null) {
            foo = new SimGrid(nextLine);
            if (root == null) root = foo;
            stuff.put(new Integer(foo.hashCode()),foo);
    	    JProgressBar1.setValue(JProgressBar1.getValue()+1);
    	    JLabel1.setText("" + JProgressBar1.getValue());
        }
        JProgressBar1.setValue(0);
  	    JLabel1.setText("Done");
        foo = null;
        SimGrid.allSimGrids = stuff;
    } catch (Exception e) {
        System.err.println("Exception!! " + e.toString());
    }
    }
    

	private void drawSim() {
        TreeNode node = (TreeNode)JTree1.getLastSelectedPathComponent();
        if (node != null) {
            SimGrid sim = (SimGrid)node;
            sim.draw();
        }
	}


	class SymAction implements java.awt.event.ActionListener
	{
		public void actionPerformed(java.awt.event.ActionEvent event)
		{
			Object object = event.getSource();
			if (object == JButton1)
				JButton1_actionPerformed(event);
			else if (object == JButton2)
				JButton2_actionPerformed(event);
			else if (object == JButton3)
				JButton3_actionPerformed(event);
		}
	}

	void JButton1_actionPerformed(java.awt.event.ActionEvent event)
	{
		// to do: code goes here.
			 
		JButton1_actionPerformed_Interaction1(event);
	}

	void JButton1_actionPerformed_Interaction1(java.awt.event.ActionEvent event)
	{
	    final SwingWorker worker = new SwingWorker() {
	        public Object construct() {
	            processData();
	            return(null);
	        }
	    };
	}

	void JButton2_actionPerformed(java.awt.event.ActionEvent event)
	{
		// to do: code goes here.
			 
		JButton2_actionPerformed_Interaction1(event);
	}

	void JButton2_actionPerformed_Interaction1(java.awt.event.ActionEvent event)
	{
	    final SwingWorker worker = new SwingWorker() {
	        public Object construct() {
			    makeTree();
	            return(null);
	        }
	    };
	}

	void JButton3_actionPerformed(java.awt.event.ActionEvent event)
	{
		// to do: code goes here.
			 
		JButton3_actionPerformed_Interaction1(event);
	}

	void JButton3_actionPerformed_Interaction1(java.awt.event.ActionEvent event)
	{
	    final SwingWorker worker = new SwingWorker() {
	        public Object construct() {
			    computeAll();
	            return(null);
	        }
	    };
	}

	class SymTreeSelection implements com.sun.java.swing.event.TreeSelectionListener
	{
		public void valueChanged(com.sun.java.swing.event.TreeSelectionEvent event)
		{
			Object object = event.getSource();
			if (object == JTree1)
				JTree1_valueChanged(event);
		}
	}

	void JTree1_valueChanged(com.sun.java.swing.event.TreeSelectionEvent event)
	{
		// to do: code goes here.
			 
		JTree1_valueChanged_Interaction1(event);
	}

	void JTree1_valueChanged_Interaction1(com.sun.java.swing.event.TreeSelectionEvent event)
	{
	    final SwingWorker worker = new SwingWorker() {
	        public Object construct() {
			    drawSim();
	            return(null);
	        }
	    };
	}
}
