import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class MouseHandler implements MouseListener {
	/*@non_null@*/
	private GridDisplay grid;

	public MouseHandler(/*@non_null@*/
	GridDisplay display) {
		super();
		grid = display;
	}

	public void mousePressed(MouseEvent e) {
		;
	}
	public void mouseReleased(MouseEvent e) {
		;
	}
	public void mouseEntered(MouseEvent e) {
		;
	}
	public void mouseExited(MouseEvent e) {
		;
	}

	public void mouseClicked(MouseEvent e) {
		//@assume e != null;
		grid.setObjectAt(e.getX(), e.getY());
	}
}

public class Simulator extends JPanel implements ActionListener {
	/*@non_null@*/
	GridDisplay display;
	/*@non_null@*/
	SimObjectChooser simObjChooser;
	/*@non_null@*/
	private JButton startButton, stopButton;
	/*@non_null@*/
	AgeChooser agechooser;

	private int width;
	private int height;

	//@requires width > 0
	//@requires height > 0
	public Simulator(int width, int height, /*@non_null@*/
	Grid grid) {
		this.width = width;
		this.height = height;

		setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

		simObjChooser = new SimObjectChooser();
		agechooser = new AgeChooser();

		display = new GridDisplay(grid, simObjChooser, agechooser);
		display.setPreferredSize(new Dimension(width, height));
		display.setMinimumSize(new Dimension(width, height));
		display.addMouseListener(new MouseHandler(display));
		add(display);

		JPanel panel1 = new JPanel();
		JPanel panel2 = new JPanel();

		panel1.add(new JLabel("Place Object: "));
		panel1.add(simObjChooser);

		startButton = new JButton("Start");
		// place button at center, left position
		startButton.setVerticalTextPosition(AbstractButton.CENTER);
		startButton.setHorizontalTextPosition(AbstractButton.LEFT);
		startButton.setMnemonic(KeyEvent.VK_D);
		startButton.setActionCommand("start");

		stopButton = new JButton("Stop");
		// Use the default button position of CENTER, RIGHT.
		stopButton.setMnemonic(KeyEvent.VK_E);
		stopButton.setActionCommand("stop");
		stopButton.setEnabled(false);

		// Listen for actions on the Start and Stop buttons.
		startButton.addActionListener(this);
		stopButton.addActionListener(this);

		// Add the start and stop buttons, and the table, to the
		// container, using the default layout.
		panel1.add(simObjChooser);

		panel1.add(startButton);
		panel1.add(stopButton);

		add(panel1);

		panel2.add(new JLabel("Select Age "));
		panel2.add(agechooser);

		add(panel2);
	}

	public void addClass(String s) {
		try {
			simObjChooser.addClass(s);
		} catch (ClassNotFoundException e) {
			System.err.println(
				"Error loading simulated object class " + s + ": " + e);
		}
	}

	public void actionPerformed(ActionEvent e) {
		//@assume e != null;
		String command = e.getActionCommand();

		if (command != null) {
			if (command.equals("start")) {
				startButton.setEnabled(false);
				stopButton.setEnabled(true);
				display.startObjects();
			} else if (command.equals("stop")) {
				startButton.setEnabled(true);
				stopButton.setEnabled(false);
				display.pauseObjects();
			}
		} else {
			System.err.println("Null command: " + e);
		}
	}
}