// package GravitySimulation;
import java.util.*;

import edu.neu.ccs.*;
import edu.neu.ccs.gui.*;
import edu.neu.ccs.util.*;

public class Controls implements JPTConstants{
	Mover m;
	TablePanel main;
	JPTFrame frame;
	
	
	SliderView gravView = new SliderView(0, 0, 100, 10);
	BooleanView pauseView = new BooleanView("Pause Animation", false);
	BooleanView mouseView = new BooleanView("Enable Manual Ball Movement");
	
	TextFieldView gravTFV = new TextFieldView("10", 50);
	TextFieldView radTFV = new TextFieldView("10", 80);
	TextFieldView massTFV = new TextFieldView("100", 80);
	TextFieldView xTFV = new TextFieldView("100", 80);
	TextFieldView yTFV = new TextFieldView("100", 80);
	TextFieldView vxTFV = new TextFieldView("0.4", 80);
	TextFieldView vyTFV = new TextFieldView("0.4", 80);
	
	BooleanView fillView = new BooleanView("Fill ball");
    
	private ColorView ballColor = new ColorView(Colors.black, true);
	
	@SuppressWarnings("serial") SimpleAction addBall = new SimpleAction("Add Ball"){
        public void perform(){
			addBall();
		}
	};
	
	@SuppressWarnings("serial") SimpleAction remBall = new SimpleAction("Remove Random Ball"){
        public void perform(){
			removeRandBall();
		}
	};
	
	@SuppressWarnings("serial") SimpleAction sliderChange = new SimpleAction(){
        public void perform(){
			gravSliderChange();
		}
	};
	
	@SuppressWarnings("serial") SimpleAction gravTFVChange = new SimpleAction(){
		public void perform(){
			gravTFVChange();
		}
	};
	
	@SuppressWarnings("serial") SimpleAction pauseChange = new SimpleAction(){
		public void perform(){
			pauseChange();
		}
	};
	
	@SuppressWarnings("serial") SimpleAction mouseChange = new SimpleAction(){
		public void perform(){
			mouseChange();
		}
	};
	
	public void gravSliderChange(){
		gravTFV.setViewState(gravView.getViewState());
		m.grav = new Double(gravTFV.getViewState()).doubleValue() / 100.0;
	}
	
	public void gravTFVChange(){
		if(new Integer(gravTFV.getViewState()).intValue() > 100)
			gravTFV.setViewState("100");
		gravView.setViewState(gravTFV.getViewState());
		m.grav = new Double(gravTFV.getViewState()).doubleValue() / 100.0;
	}
	
	public void pauseChange(){
		m.pauseAnim = new Boolean(pauseView.getViewState()).booleanValue();
	}

	public void mouseChange(){
		m.eMouse = new Boolean(mouseView.getViewState()).booleanValue();
	}
	
	public void addBall(){
		Ball b = new Ball(
				new Double(xTFV.getViewState()).doubleValue(), 
				new Double(yTFV.getViewState()).doubleValue(), 
				new Double(vxTFV.getViewState()).doubleValue(),
				new Double(vyTFV.getViewState()).doubleValue(),
				new Double(massTFV.getViewState()).doubleValue(),
				new Double(radTFV.getViewState()).doubleValue(),
				new Boolean(fillView.getViewState()).booleanValue(),
				ballColor.getColor(), m);
		m.addBall(b);
	}
	
	public void removeRandBall(){
		if(m.numBalls <= 0) return;
		
		Random x = new Random();
		m.removeBall(x.nextInt(m.numBalls));
	}
	
	public Controls(Mover m){
		this.m = m;
		
		mouseView.setViewState("" + m.eMouse);
		gravView.addSlidingAction(sliderChange);
		gravTFV.addActionListener(gravTFVChange);
		
		pauseView.addActionListener(pauseChange);
		mouseView.addActionListener(mouseChange);
		
		main = new TablePanel(new Object[][]{
				{"Gravity: ", gravView, gravTFV},
				{pauseView, mouseView},
				{remBall, " ** Right click a ball to remove it **"},
				{""},
				{"------------------------"},
				{"Add a new Ball:"},
				{"    Radius: ", radTFV, "Mass: ", massTFV},
				{"    X Loc: ", xTFV, "X Vel: ", vxTFV,},
				{"    Y Loc: ", yTFV, "Y Vel: ", vyTFV},
				{"Ball Color: ", ballColor, fillView},
				{addBall},
				}, WEST);
		
		frame = main.frame("Simulation Controls", NORTH_WEST);
	}
	
	public void close(){
		frame.dispose();
	}
}
