/* File: NodeDataPane.java
 * Author: Jason Gookins
 * Description: The class which displays the information
 * associated with a particular Node and opens it up for
 * editing.
 */

import java.awt.Color;
import java.awt.GridLayout;
import java.util.ArrayList;
import javax.swing.border.Border;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class NodeDataPane extends JPanel
{
	/**********************
	 ** Global Variables **
	 **********************/

	private static final Border blackLine = BorderFactory.createLineBorder(Color.black);




	/************************
	 ** Instance Variables **
	 ************************/

	private JTextField nameTextField;
	private JTextField priorityTextField;
	private JComboBox operationComboBox;
	private JTextField numberOfBinsTextField;
	private JTextField minimumTextField;
	private JTextField maximumTextField;
	private JCheckBox mandatoryCheckBox;
	private ArrayList<JTextField> givenDistTextFields;
	private ArrayList<JTextField> goalDistTextFields;



	/**********************
	 ** Main Constructor **
	 **********************/

	public NodeDataPane(BeliefListener beliefListener)
	{
		this.givenDistTextFields = new ArrayList<JTextField>();
		this.goalDistTextFields = new ArrayList<JTextField>();
		this.setLayout(null);
		this.add(dataPanel(5, 5, 215, 129));
		this.add(distributionPanel(225, 5, 560, 129));
	}



	/***************
	 ** Accessors **
	 ***************/

	public JTextField getNameTextField()
	{
		return this.nameTextField;
	}

	public JTextField getPriorityTextField()
	{
		return this.priorityTextField;
	}

	public JComboBox getOperationComboBox()
	{
		return this.operationComboBox;
	}

	public JTextField getNumberOfBinsTextField()
	{
		return this.numberOfBinsTextField;
	}

	public JTextField getMinimumTextField()
	{
		return this.minimumTextField;
	}

	public JTextField getMaximumTextField()
	{
		return this.maximumTextField;
	}

	public JCheckBox getMandatoryCheckBox()
	{
		return this.mandatoryCheckBox;
	}

	public ArrayList<JTextField> getGivenDistTextFields()
	{
		return this.givenDistTextFields;
	}

	public ArrayList<JTextField> getGoalDistTextFields()
	{
		return this.goalDistTextFields;
	}



	/****************
	 ** Data Panel **
 	 ****************/

	public JPanel dataPanel(int x, int y, int width, int height)
	{
		JPanel dataPanel = new JPanel(null);

		dataPanel.setBounds(x, y, width, height);
		dataPanel.setBorder(BorderFactory.createTitledBorder(blackLine, "Data"));

		dataPanel.add(nameLabel(10, 21, 60, 25));
		dataPanel.add(nameTextField(85, 19, 115, 26));
		dataPanel.add(priorityLabel(10, 56, 60, 25));
		dataPanel.add(priorityTextField(85, 54, 115, 26));
		dataPanel.add(operationLabel(10, 91, 60, 25));
		dataPanel.add(operationComboBox(85, 89, 115, 26));

		return dataPanel;
	}

	public JLabel nameLabel(int x, int y, int width, int height)
	{
		JLabel nameLabel = new JLabel("Name:", JLabel.RIGHT);

		nameLabel.setBounds(x, y, width, height);

		return nameLabel;
	}

	public JLabel priorityLabel(int x, int y, int width, int height)
	{
		JLabel priorityLabel = new JLabel("Priority:", JLabel.RIGHT);

		priorityLabel.setBounds(x, y, width, height);

		return priorityLabel;
	}

	public JLabel operationLabel(int x, int y, int width, int height)
	{
		JLabel operationLabel = new JLabel("Operation:", JLabel.RIGHT);

		operationLabel.setBounds(x, y, width, height);

		return operationLabel;
	}

	public JTextField nameTextField(int x, int y, int width, int height)
	{
		nameTextField = new JTextField();

		nameTextField.setBounds(x, y, width, height);
		nameTextField.setEditable(false);

		return nameTextField;
	}

	public JTextField priorityTextField(int x, int y, int width, int height)
	{
		priorityTextField = new JTextField();

		priorityTextField.setBounds(x, y, width, height);
		priorityTextField.setEditable(false);

		return priorityTextField;
	}

	public JComboBox operationComboBox(int x, int y, int width, int height)
	{
		String[] operations = {"NULL", "AND", "OR", "NOT"};
		operationComboBox = new JComboBox(operations);

		operationComboBox.setBounds(x, y, width, height);
		operationComboBox.setSelectedIndex(0);
		operationComboBox.setEnabled(false);

		return operationComboBox;
	}



	/************************
	 ** Distribution Panel **
	 ************************/

	public JPanel distributionPanel(int x, int y, int width, int height)
	{
		JPanel distributionPanel = new JPanel(null);

		distributionPanel.setBounds(x, y, width, height);
		distributionPanel.setBorder(BorderFactory.createTitledBorder(blackLine, "Distribution"));

		distributionPanel.add(numberOfBinsLabel(5, 21, 90, 25));
		distributionPanel.add(numberOfBinsTextField(100, 19, 40, 25));

		distributionPanel.add(minimumLabel(22, 60, 50, 25));
		distributionPanel.add(minimumTextField(22, 89, 50, 25));

		distributionPanel.add(maximumLabel(86, 60, 50, 25));
		distributionPanel.add(maximumTextField(85, 89, 50, 25));

		distributionPanel.add(distributionALabel(152, 21, 75, 25));
		distributionPanel.add(distributionBLabel(152, 90, 75, 25));

		for (int i = 234; i < 523; i = i + 32)
		{
			JTextField givenDistBin = binTextField(i, 19, 25, 25);

			givenDistTextFields.add(givenDistBin);
			distributionPanel.add(givenDistBin);
		}

		distributionPanel.add(mandatoryCheckBox(335, 56, 85, 25));

		for (int i = 234; i < 523; i = i + 32)
		{
			JTextField goalDistBin = binTextField(i, 89, 25, 25);

			goalDistTextFields.add(goalDistBin);
			distributionPanel.add(goalDistBin);
		}

		return distributionPanel;
	}

	public JLabel numberOfBinsLabel(int x, int y, int width, int height)
	{
		JLabel numberOfBinsLabel = new JLabel("Number of Bins:", JLabel.RIGHT);

		numberOfBinsLabel.setBounds(x, y, width, height);

		return numberOfBinsLabel;
	}

	public JTextField numberOfBinsTextField(int x, int y, int width, int height)
	{
		numberOfBinsTextField = new JTextField();

		numberOfBinsTextField.setBounds(x, y, width, height);
		numberOfBinsTextField.setHorizontalAlignment(JTextField.CENTER);
		numberOfBinsTextField.setEditable(false);

		return numberOfBinsTextField;
	}

	public JLabel minimumLabel(int x, int y, int width, int height)
	{
		JLabel minimumLabel = new JLabel("Minimum:", JLabel.CENTER);

		minimumLabel.setBounds(x, y, width, height);

		return minimumLabel;
	}

	public JLabel maximumLabel(int x, int y, int width, int height)
	{
		JLabel maximumLabel = new JLabel("Maximum:", JLabel.CENTER);

		maximumLabel.setBounds(x, y, width, height);

		return maximumLabel;
	}

	public JTextField minimumTextField(int x, int y, int width, int height)
	{
		minimumTextField = new JTextField();

		minimumTextField.setBounds(x, y, width, height);
		minimumTextField.setHorizontalAlignment(JTextField.CENTER);
		minimumTextField.setEditable(false);

		return minimumTextField;
	}

	public JTextField maximumTextField(int x, int y, int width, int height)
	{
		maximumTextField = new JTextField();

		maximumTextField.setBounds(x, y, width, height);
		maximumTextField.setHorizontalAlignment(JTextField.CENTER);
		maximumTextField.setEditable(false);

		return maximumTextField;
	}

	public JLabel distributionALabel(int x, int y, int width, int height)
	{
		JLabel distributionALabel = new JLabel("Given:", JLabel.RIGHT);

		distributionALabel.setBounds(x, y, width, height);

		return distributionALabel;
	}

	public JLabel distributionBLabel(int x, int y, int width, int height)
	{
		JLabel distributionBLabel = new JLabel("Goal:", JLabel.RIGHT);

		distributionBLabel.setBounds(x, y, width, height);

		return distributionBLabel;
	}

	public JTextField binTextField(int x, int y, int width, int height)
	{
		JTextField binTextField = new JTextField();

		binTextField.setBounds(x, y, width, height);
		binTextField.setHorizontalAlignment(JTextField.CENTER);
		binTextField.setEditable(false);

		return binTextField;
	}

	public JCheckBox mandatoryCheckBox(int x, int y, int width, int height)
	{
		mandatoryCheckBox = new JCheckBox("Mandatory");

		mandatoryCheckBox.setBounds(x, y, width, height);
		mandatoryCheckBox.setEnabled(false);

		return mandatoryCheckBox;
	}



	/********************
	 ** Helper Methods **
	 ********************/

	public void clearData()
	{
		nameTextField.setText(null);
		priorityTextField.setText(null);
		operationComboBox.setSelectedIndex(0);
		numberOfBinsTextField.setText(null);
		minimumTextField.setText(null);
		maximumTextField.setText(null);
		mandatoryCheckBox.setSelected(false);

		for (int i = 0; i < givenDistTextFields.size(); i++)
		{
			givenDistTextFields.get(i).setText(null);
		}

		for (int i = 0; i < goalDistTextFields.size(); i++)
		{
			goalDistTextFields.get(i).setText(null);
		}
	}
}