/*
 * @(#)SearchSolutionFrame.java
 */
package ereinionbw;

import java.awt.Button;
import java.awt.Panel;
import java.awt.Frame;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Image;
import java.awt.event.WindowListener;
import java.awt.event.WindowEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import ereinion.awt.AWTSetter;
import ereinion.search.SearchNode;
import ereinion.search.SearchState;
import ereinion.search.SearchOp;
import ereinion.search.SearchProblem;

/*
 * classe di package : SearchSolutionFrame
 *
 * Classe che si occupa di mostrare una soluzione di un problema di Search.
 */
class SearchSolutionFrame extends Frame implements WindowListener, ActionListener
{

	private Button nextOperatorButton, resetButton;

	private Label operatorLabel;

	private SearchOp[] solution;

	private int solutionCounter;

	private SearchState currentState;

	private SearchStateDisplay stateDisplayer;

	private SearchProblem problem;


	private AWTSetter mainSetter;


	public SearchSolutionFrame(AWTSetter setter, BWProblem sp, SearchNode sol, SearchStateDisplay sd, int xDim)
	{
		super("Blue Wizard Solution Frame for : "+sp.getProblemName());

		mainSetter = setter;

		setSize(xDim/2,xDim/10*6);
		setResizable(false);
		addWindowListener(this);

		problem = sp.getSearchProblem();
		solution = SearchNode.getPathOpList(sol);

		Panel mainPanel = new Panel(new BorderLayout());
		operatorLabel = (Label)mainSetter.setComponent(new Label("Initial State",Label.CENTER));
		Panel buttonPanel = new Panel(new GridLayout(1,2));
		nextOperatorButton = (Button)mainSetter.setComponent(new Button("Next Operator!"),buttonPanel);
		nextOperatorButton.addActionListener(this);
		resetButton = (Button)mainSetter.setComponent(new Button("Reset"),buttonPanel);
		resetButton.addActionListener(this);
		stateDisplayer = sd;
		mainSetter.setComponent(stateDisplayer);
		mainPanel.add(operatorLabel,BorderLayout.NORTH);
		mainPanel.add(buttonPanel,BorderLayout.SOUTH);
		mainPanel.add(stateDisplayer,BorderLayout.CENTER);
		add(mainPanel);

		handleReset();
		show();
	}

	private void handleReset()
	{
		solutionCounter = 0;
		currentState = problem.initialState();
		stateDisplayer.displayState(currentState);
		operatorLabel.setText("Initial State");
	}

	private void handleOp()
	{
		if (solutionCounter < solution.length) {
			currentState = problem.applyOperator(currentState,solution[solutionCounter]);
			stateDisplayer.displayState(currentState);
			operatorLabel.setText("Operator: "+solution[solutionCounter].operatorToString());
			solutionCounter++;
		} else
			operatorLabel.setText("Goal State!");
	}

	public void actionPerformed(ActionEvent e)
	{
		if (e.getSource() == nextOperatorButton)
			handleOp();
		else 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) {}

}
