/**
 * JavaLife - Conway's Life Simulation
 * @author Scott Hurring - scott at hurring dot com
 * @version alpha1
 * @license GPL
 * For most recent version, go to this url:
 * http://hurring.com/code/java/javalife/
 */

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * This is the main frame that holds the application
 */
public class MainFrame extends JFrame
{
	JavaLife parent;
	private JTextField generationText;
	private JPanel fieldpanel;
	// For debugging messages, not currently used
	JTextArea text;
	
	public MainFrame(JavaLife parent) {
		super();
		this.parent = parent;
		super.setTitle("JavaLife v"+ parent.VERSION +" : Scott Hurring");
		createFrame();
	}

	private void createFrame()
	{
		setBounds(100, 100, 750, 600);
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				parent.performExitAction();
			}
		});
		
		setJMenuBar(createMenuBar());

		JPanel jp = new JPanel(new BorderLayout());

		jp.add(createControlBar(), BorderLayout.NORTH);
	
		// This panel holds the GUI field generated by LifeField
		fieldpanel = new JPanel(new BorderLayout());
		jp.add(fieldpanel, BorderLayout.CENTER);
		
		/*
		JPanel south = new JPanel(new BorderLayout());
		south.add(new JScrollPane(createDebugText()), BorderLayout.NORTH);
		south.add(createStatusBar(), BorderLayout.SOUTH);
		jp.add(south, BorderLayout.SOUTH);
		*/
		
		getContentPane().add(jp);
		setVisible(true);		
	}

	/**
	 * Add the LifeField GUI to my panel
	 */
	public void setField(Component c) {

		fieldpanel.removeAll();
		fieldpanel.add(c, BorderLayout.CENTER);
		fieldpanel.validate();
	}

	private JMenuBar createMenuBar() {
		return new MainFrameMenuBar(parent).create();
	}

	private JPanel createStatusBar() {
		return new MainFrameStatusBar(parent).create();
	}

/**
 *  Control Bar 
 */
	
	private JPanel createControlBar() {
		JPanel p = new JPanel(new FlowLayout());
		
		p.add(createNextButton());

		p.add(new JLabel("Generation:"));
		p.add(createGenerationText());
		p.add(createStartButton());
		p.add(createStopButton());
		p.add(createResetButton());
		p.add(new JLabel("Speed:"));
		p.add(createSpeedCombo());
		
		return p;
	}
	
	private JTextField createGenerationText() {
		generationText = new JTextField(6);
		generationText.setText("0");
		generationText.setEditable(false);
		return generationText;
	}
	
	private JButton createStartButton() {
		startButton = new JButton("Start");
		startButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				parent.debug("Start");
				parent.start();
			}
		});
		return startButton;
	}
	
	private JButton createStopButton() {
		stopButton = new JButton("Stop");
		stopButton.setEnabled(false);
		stopButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				parent.debug("Stop");
				parent.stop();
			}
		});
		return stopButton;
	}

	private JButton createResetButton() {
		JButton b = new JButton("Reset");
		b.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				parent.debug("Reset");
				startButton.setText("Start");
				parent.reset();
			}
		});
		return b;
	}
	
	private JButton createNextButton() {
		JButton b = new JButton("Next");
		b.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				parent.debug("Next");
				parent.next();
			}
		});
		return b;
	}

	private JComboBox createSpeedCombo() {
		Object[] items = {
				new ComboItem(1000, "Molasses"),
				new ComboItem(750, "Slow"),
				new ComboItem(500, "Medium"),
				new ComboItem(300, "Quick"),
				new ComboItem(250, "Fast"),
				new ComboItem(100, "Ludicrous"),
		};
		
		speedCombo = new JComboBox(items);
		speedCombo.setEditable(false);
		
		return speedCombo;
	}
	
	private JTextArea createDebugText() {
		text = new JTextArea();
		text.setRows(5);
		return text;
	}

	public void setGeneration(int i) {
		generationText.setText(String.valueOf(i));
	}

	/**
	 * Stop the simulation
	 */
	public void stop() {
		startButton.setEnabled(true);
		stopButton.setEnabled(false);
		speedCombo.setEnabled(true);
	}

	/**
	 * Start the simulation
	 */
	public void start() {
		startButton.setEnabled(false);
		stopButton.setEnabled(true);
		speedCombo.setEnabled(false);
	}

	private JButton startButton; 
	private JButton stopButton; 
	private JComboBox speedCombo;

	/**
	 * @return
	 */
	public int getSpeed() {
		int selected = speedCombo.getSelectedIndex();
		ComboItem item = (ComboItem) speedCombo.getItemAt(selected);
		return item.getSpeed();
	}
}

/**
 * An item to put into a JComboBox.
 * There's probably something that already does this, 
 * but i didn't see it and it was quicker to just bang
 * this out than surf the API for 10 minutes ;-)
 */
class ComboItem extends Object {
	int speed;
	String name;
	public ComboItem(int speed, String name) {
		this.speed = speed;
		this.name = name;
	}
	public String toString() {
		return name;
	}
	public int getSpeed() {
		return speed;
	}
}


