/* File: RunDialog.java
 * Author: Jason Gookins
 * Description: This class creates the popup dialog for inputting the number of runs to perform on a network.
 */

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class RunDialog extends JInternalFrame implements ActionListener
{
	/************************
	 ** Instance Variables **
	 ************************/

	private Belief belief;
	private JTextField numberOfRunsTextField;
	private JCheckBox minimizeCheckBox;
	private JButton okayButton;
	private JButton cancelButton;
	private int numberOfRuns;
	private boolean minimizeChange;



	/**********************
	 ** Main Constructor **
	 **********************/

	RunDialog(Belief belief)
	{
		super("Run Network", false, false, false, false);

		this.belief = belief;
		this.numberOfRuns = 0;
		this.minimizeChange = false;

		setPreferredSize(new Dimension(240, 150));

		JPanel dialogPanel  = new JPanel(null);

		JLabel numberOfRunsLabel = new JLabel("Number of runs:");
		numberOfRunsLabel.setBounds(10, 10, 120, 30);
		dialogPanel.add(numberOfRunsLabel);
		numberOfRunsTextField = new JTextField("100");
		numberOfRunsTextField.setBounds(125, 10,  100, 30);
		dialogPanel.add(numberOfRunsTextField);

		minimizeCheckBox = new JCheckBox("Minimize Change");
		minimizeCheckBox.setBounds(45, 45, 150, 30);
		dialogPanel.add(minimizeCheckBox);

		okayButton = new JButton("Okay");
		okayButton.setBounds(35, 90, 75, 25);
		okayButton.addActionListener(this);
		dialogPanel.add(okayButton);

		cancelButton = new JButton("Cancel");
		cancelButton.setBounds(130, 90, 75, 25);
		cancelButton.addActionListener(this);
		dialogPanel.add(cancelButton);

		setContentPane(dialogPanel);

		putClientProperty("JInternalFrame.frameType", "optionDialog");

		Dimension size = getPreferredSize();
		Dimension rootSize = belief.getRootPane().getSize();

		setBounds((rootSize.width - size.width) / 2, (rootSize.height - size.height) / 2, size.width, size.height);

		pack();
		belief.getFirstEventPane().setVisible(true);
		setVisible(true);
		belief.getLayeredPane().add(this, new Integer(1));

		try
		{
			setSelected(true);
		}
		catch (PropertyVetoException ignored) { }

		focusNumberOfRunsTextField();
	}



	/*******************
	 ** Action Events **
	 *******************/

	public void actionPerformed(ActionEvent evt)
	{
		if (evt.getSource().equals(okayButton))
		{
			String runsText = numberOfRunsTextField.getText();

			if (runsText != null)
			{
				numberOfRuns = Integer.parseInt(runsText);

				if (minimizeCheckBox.isSelected())
				{
					minimizeChange = true;
				}

				cleanUpAndDispose();
				belief.getBeliefListener().setupNewRun(numberOfRuns, minimizeChange);
			}
			else
			{
				ErrorDialog errorDialog = new ErrorDialog("Runs Error", new JOptionPane("Number of runs cannot be blank.", JOptionPane.ERROR_MESSAGE));
			}
		}
		else if (evt.getSource().equals(cancelButton))
		{
			cleanUpAndDispose();
		}
	}



	/**********************
	 ** Instance Methods **
	 **********************/

	private void focusNumberOfRunsTextField()
	{
		SwingUtilities.invokeLater(new Runnable()
		{
			public void run()
			{
				numberOfRunsTextField.requestFocus();
				numberOfRunsTextField.selectAll();
			}
		});
	}

	private void cleanUpAndDispose()
	{
		dispose();
		belief.getFirstEventPane().setVisible(false);
	}



	/**********************
	 ** Internal Classes **
	 **********************/

	private class ErrorDialog extends InternalModalDialog
	{
		public ErrorDialog(String title, JOptionPane pane)
		{
			super(title, belief, pane);
		}

		public void cleanUpAfterClosing()
		{
			focusNumberOfRunsTextField();
		}
	}
}