import java.awt.*;
import javax.swing.*;
import simulate.Simulation2D;
import simulate.DisplayConfiguration;
import simulate.ControllerButton;
import simulate.SpeciesDisks;
import simulate.Phase;
import simulate.IntegratorMC;
import simulate.MCMoveAtom;
import simulate.P2HardDisk;
import simulate.DisplayToConsole;
import simulate.*;

/**
 * A basic extension of the javax.swing.JApplet class
 */
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);
		getContentPane().setBackground(java.awt.Color.white);
		setSize(521,420);
		simulation2D1.setLayout(null);
		getContentPane().add(simulation2D1);
		simulation2D1.setBounds(12,24,468,300);
		displayConfiguration1.setLayout(null);
		simulation2D1.add(displayConfiguration1);
		displayConfiguration1.setBounds(168,0,300,300);
		controllerButton1.setLayout(null);
		simulation2D1.add(controllerButton1);
		controllerButton1.setBounds(0,36,100,40);
		integratorMC1.setIntegrationInterval(50);
		integratorMC1.setLayout(null);
		controllerButton1.add(integratorMC1);
		integratorMC1.setBounds(60,0,20,40);
		integratorMC1.add(MCMoveAtom1);
		MCMoveAtom1.setBounds(0,0,20,40);
		speciesDisks1.setLayout(null);
		simulation2D1.add(speciesDisks1);
		speciesDisks1.setBounds(48,144,20,40);
		phase1.setLayout(null);
		simulation2D1.add(phase1);
		phase1.setBounds(48,216,20,40);
		simulation2D1.add(P2HardDisk1);
		P2HardDisk1.setBounds(0,120,30,40);
		displayBox1.setUpdateInterval(5);
		displayBox1.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
		simulation2D1.add(displayBox1);
		displayBox1.setBounds(0,120,168,40);
		displayBox2.setUpdateInterval(5);
		displayBox2.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
		simulation2D1.add(displayBox2);
		displayBox2.setBounds(0,156,168,40);
		JLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		JLabel1.setText("Insertion Average");
		simulation2D1.add(JLabel1);
		JLabel1.setBounds(12,84,144,40);
		JSlider1.setMinorTickSpacing(1);
		JSlider1.setValue(20);
		JSlider1.setMaximum(49);
		JSlider1.setPaintLabels(true);
		JSlider1.setSnapToTicks(true);
		JSlider1.setPaintTicks(true);
		JSlider1.setMajorTickSpacing(7);
		getContentPane().add(JSlider1);
		JSlider1.setBounds(132,348,341,47);
		//}}
		widom = new MeterWidomInsertion(speciesDisks1, displayConfiguration1);
		phase1.add(widom);
		widom.setUpdateInterval(5);
		widom.setNInsert(200);
		displayBox2.setUseCurrentValue(false);
		displayBox2.setMeter(widom);
		displayBox1.setMeter(widom);
		displayBox1.setLabel("Current");
		displayBox2.setLabel("Average");
		displayBox1.setPrecision(6);
		displayBox2.setPrecision(6);
	
		//{{REGISTER_LISTENERS
		SymChange lSymChange = new SymChange();
		JSlider1.addChangeListener(lSymChange);
		//}}
	}

	MeterWidomInsertion widom;
	//{{DECLARE_CONTROLS
	simulate.Simulation2D simulation2D1 = new simulate.Simulation2D();
	simulate.DisplayConfiguration displayConfiguration1 = new simulate.DisplayConfiguration();
	simulate.ControllerButton controllerButton1 = new simulate.ControllerButton();
	simulate.IntegratorMC integratorMC1 = new simulate.IntegratorMC();
	simulate.MCMoveAtom MCMoveAtom1 = new simulate.MCMoveAtom();
	simulate.SpeciesDisks speciesDisks1 = new simulate.SpeciesDisks();
	simulate.Phase phase1 = new simulate.Phase();
	simulate.P2HardDisk P2HardDisk1 = new simulate.P2HardDisk();
	simulate.DisplayBox displayBox1 = new simulate.DisplayBox();
	simulate.DisplayBox displayBox2 = new simulate.DisplayBox();
	javax.swing.JLabel JLabel1 = new javax.swing.JLabel();
	javax.swing.JSlider JSlider1 = new javax.swing.JSlider();
	//}}

	class SymChange implements javax.swing.event.ChangeListener
	{
		public void stateChanged(javax.swing.event.ChangeEvent event)
		{
			Object object = event.getSource();
			if (object == JSlider1)
				JSlider1_stateChanged(event);
		}
	}

	void JSlider1_stateChanged(javax.swing.event.ChangeEvent event)
	{
		// to do: code goes here.
			 
		JSlider1_stateChanged_Interaction1(event);
	}

	void JSlider1_stateChanged_Interaction1(javax.swing.event.ChangeEvent event)
	{
		try {
			// JSlider1 Get the JSlider's current value
			controllerButton1.clickForPause();
			speciesDisks1.setNMolecules(Math.max(1,JSlider1.getValue()));
			integratorMC1.initialize();
			displayConfiguration1.repaint();
			widom.reset();
		} catch (java.lang.Exception e) {
		}
	}
}
