package ereinionbw;

import java.awt.Component;
import java.awt.Button;
import java.awt.Frame;
import java.awt.Choice;
import java.awt.Label;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.Font;
import java.awt.Menu;
import java.awt.CheckboxMenuItem;
import java.awt.MenuBar;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import java.awt.event.WindowListener;
import java.awt.event.WindowEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import ereinion.awt.CheckboxMIGroup;
import ereinion.awt.AWTSetter;

class StandardConfigFrame extends Frame implements WindowListener, ActionListener, ItemListener
{

	private StandardSSDisplay stateDisplayer;
	private final static int[] RANDOM_MENU = { 0, 10, 20, 30 ,40 ,50 ,60 ,70 ,80 ,90, 100 };
	private CheckboxMenuItem[] randomMI;
	private Button resetButton;
	private Label evalLabel, dimLabel;
	private AWTSetter mainSetter;
	private int stateRan;
	private BWProblem problem;

	public StandardConfigFrame(BWProblem sp, AWTSetter setter, int xDim)
	{
		// base settings
		super("Configuration Frame for: "+sp.getProblemName());

		problem = sp;

		mainSetter = setter;
		mainSetter.setComponent(this);

		stateRan = 0;

		// menu layout
		MenuBar frameBar = new MenuBar();
		Menu randomMenu, dimMenu;
		randomMenu = (Menu)mainSetter.setMenuItem(new Menu("Random Factor"));
		CheckboxMIGroup randomGroup = new CheckboxMIGroup();
		randomMI = new CheckboxMenuItem[RANDOM_MENU.length];
		for (int k=0; k<randomMI.length; k++) {
			randomMI[k] = (CheckboxMenuItem)mainSetter.setMenuItem(randomGroup.makeBox(""+RANDOM_MENU[k],false),randomMenu);
			randomMI[k].addItemListener(this);
		}
		randomMI[0].setState(true);
		frameBar.add(randomMenu);
		setMenuBar(frameBar);

		// layout
		setLayout(new GridLayout(1,1));
		Panel mainPanel = (Panel)mainSetter.setComponent(new Panel(new GridLayout(1,2)));
		Panel leftPanel = (Panel)mainSetter.setComponent(new Panel(new GridLayout(2,1)));
		Panel controlPanel = (Panel)mainSetter.setComponent(new Panel(new GridLayout(1,1)));
		resetButton = (Button)mainSetter.setComponent(new Button("reset"),controlPanel);
		resetButton.addActionListener(this);
		leftPanel.add(controlPanel);
		mainSetter.setComponent(new Label(),leftPanel);
		mainPanel.add(leftPanel);
		stateDisplayer = (StandardSSDisplay)mainSetter.setComponent(new StandardSSDisplay(),mainPanel);
		stateDisplayer.displayState(problem.getSearchProblem().initialState());
		add(mainPanel);

		// last settings
		setSize(xDim,xDim/2);
		setResizable(false);

		addWindowListener(this);
		show();
	}

	private void handleReset()
	{
		problem.randomizeInitState(stateRan);
		stateDisplayer.displayState(problem.getSearchProblem().initialState());
	}

	public void itemStateChanged(ItemEvent e)
	{
		for (int k=0; k<randomMI.length; k++)
			if (e.getSource() == randomMI[k])
				stateRan = RANDOM_MENU[k];
	}

	public void actionPerformed(ActionEvent e)
	{
		if (e.getSource() == resetButton)
			handleReset();
	}

	public void windowActivated(WindowEvent e)  {}

	public void windowClosed(WindowEvent e) {}

	public void windowClosing(WindowEvent e) { dispose(); }

	public void windowDeactivated(WindowEvent e) {}

	public void windowDeiconified(WindowEvent e)  {}

	public void windowIconified(WindowEvent e) {}

	public void windowOpened(WindowEvent e) {}
}
