
package iceblox;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *  Cette classe defini une interface graphique minimale : tous les elements du
 *  jeu sont affiches en mode texte dans un JTextArea.
 *
 *@author     secq@lifl.fr
 *@created    May 23, 2002
 */
public class BasicGUI extends JFrame implements KeyListener {

	/**
	 *  Reference sur le jeu (pour passer les deplacements et recuperer le
	 *  plateau).
	 *
	 *@since
	 */
	protected Jeu jeu;
	/**
	 *  La zone de texte ou s'effectue l'affichage.
	 *
	 *@since
	 */
	protected JTextArea textarea;


	/**
	 *  Constructeur de l'interface graphique.
	 *
	 *@param  jeu  Le modele de jeu a assoccier a cette interface.
	 *@since
	 */
	public BasicGUI(Jeu jeu) {
		super("IUT - IceBlox 2002");
		this.jeu = jeu;
		init();
	}


	/**
	 *  Classe principale creant le modele de jeu, l'interface graphique et lancant
	 *  le jeu.
	 *
	 *@param  args  Arguments de la ligne de commande (non utlises).
	 *@since
	 */
	public static void main(String[] args) {
		Jeu modele = new Jeu(10, 10);
		BasicGUI gui = new BasicGUI(modele);
		modele.setGUI(gui);
		gui.addWindowListener(
			new WindowAdapter() {
				public void windowClosing(WindowEvent e) {
					System.exit(0);
				}
			});
		gui.pack();
		gui.setVisible(true);
		System.out.println("Touches: 'p' 'l' 'm' ':' pour Nord, Ouest, Est, Sud !");
		modele.jouer();
	}


	/**
	 *  Methode creant la representation sous forme d'une chaine de caracteres du
	 *  plateau.
	 *
	 *@param  plateau  Le plateau a representer.
	 *@return          La chaine de texte representant le plateau.
	 *@since
	 */
	public String afficherPlateau(Plateau plateau) {
		StringBuffer buffer = new StringBuffer();
		for (int y = 0; y < plateau.getTailleY(); y++) {
			for (int x = 0; x < plateau.getTailleX(); x++) {
				Element courant = plateau.getElement(new Position(x, y));
				int type = courant.getType();
				switch (type) {
					case Element.VIDE:
						buffer.append(" ");
						break;
					case Element.GLACE:
						Glace glace = (Glace) courant;
						switch (glace.nombreDeVies()) {
							case 3:
								buffer.append("O");
								break;
							case 2:
								buffer.append("o");
								break;
							default:
								buffer.append("c");
								break;
						}
						break;
					case Element.ROCHER:
						buffer.append("X");
						break;
					case Element.FLAMME:
						buffer.append("*");
						break;
					case Element.JOUEUR:
						buffer.append("@");
						break;
				}
			}
			buffer.append(System.getProperty("line.separator"));
		}
		return buffer.toString();
	}


	// Appelee par 'Jeu' pour mettre a jour l'affichage
	/**
	 *  Methode invoquee par le modele de jeu pour mettre a jour l'affichage.
	 *
	 *@since
	 */
	public void mettreAJourAffichage() {
		textarea.setText(afficherPlateau(jeu.getPlateau()));
	}


	// Appelee par 'Jeu' pour signaler la fin du jeu
	/**
	 *  Methode invoquee par le jeu pour signaler la fin de partie.
	 *
	 *@since
	 */
	public void finDePartie() {
		// Empecher l'utilisateur de jouer !
		textarea.removeKeyListener(this);
		System.exit(0);
	}


	/**
	 *  Non-implementee.
	 *
	 *@param  e  Description of Parameter
	 *@since
	 */
	public void keyPressed(KeyEvent e) { }


	/**
	 *  Non-implementee.
	 *
	 *@param  e  Description of Parameter
	 *@since
	 */
	public void keyReleased(KeyEvent e) { }


	/**
	 *  Transforme l'evenement provenant du clavier en un deplacement a effectuer
	 *  pour l'objet representant le joueur.
	 *
	 *@param  e  Description of Parameter
	 *@since
	 */
	public void keyTyped(KeyEvent e) {
		switch (e.getKeyChar()) {
			case 'p':
				jeu.fixerDeplacementJoueur(Deplacement.NORD);
				break;
			case ':':
				jeu.fixerDeplacementJoueur(Deplacement.SUD);
				break;
			case 'l':
				jeu.fixerDeplacementJoueur(Deplacement.OUEST);
				break;
			case 'm':
				jeu.fixerDeplacementJoueur(Deplacement.EST);
				break;
		}
		mettreAJourAffichage();
	}


	/**
	 *  Methode creant l'interface graphique (le JTextArea).
	 *
	 *@since
	 */
	protected void init() {
		textarea = new JTextArea(10, 10);
		textarea.setEditable(false);
		textarea.setFont(new Font("DialogInput", Font.PLAIN, 14));
		getContentPane().add(textarea, BorderLayout.CENTER);
		textarea.addKeyListener(this);
		textarea.requestFocus();
		mettreAJourAffichage();
	}

}

