/** 
FenJeu est une classe heritant de la classe Frame. Elle represente la fenetre
* de jeu affichee au client. Elle contient une barre de menus, un Canvas
* (Puissance4Graphique) pour le dessin des cases et des pions et un champ
* de texte pour afficher des messages a l'utilisateur.
@author Sebastien BISMUTH 
@author Yann LENNE
@version 1.1.6
*/

import java.awt.*;

public class FenJeu extends Frame{

  /** Constructeur de la fenetre de jeu.
    @param c Classe Client pour la gestion des evenements
    @param tfMesg Champ de texte ou sont affiches les messages
    @param p Canvas pour le dessin des cases et des pions
  */

  private MenuItem miReco;
  private MenuItem miTrad;
  private MenuItem miJava;
  private MenuItem miFemmes;
  private MenuItem miSimpsons;

  public FenJeu(Client c, TextField tfMesg, Puissance4Graphique p, FenJoueurs fj){
    super("Puissance 4");


    // Affichage de la fenetre au centre de l'ecran
    int wE = getToolkit().getScreenSize().width;
    int hE = getToolkit().getScreenSize().height;
    setLocation(wE/4, hE/4);

    // Mise en place du layout de la fenetre
    GridBagLayout gridbag = new GridBagLayout();
    GridBagConstraints constraints = new GridBagConstraints();
    setLayout(gridbag);

    // Canvas pour le dessin de l'echiquier
    buildConstraints(constraints, 0, 0, 1, 1, 100, 75);
    constraints.fill = GridBagConstraints.BOTH;
    gridbag.setConstraints(p, constraints);
    add(p);

    // TextField pour l'affichage de messages au joueur
    buildConstraints(constraints, 0, 1, 1, 1, 100, 5);
    constraints.fill = GridBagConstraints.BOTH;
    tfMesg.setEditable(false);
    gridbag.setConstraints(tfMesg, constraints);
    add(tfMesg);

    // FenJoueurs pour l'affichage de la legende
    buildConstraints(constraints, 0, 2, 1, 1, 100, 20);
    constraints.fill = GridBagConstraints.BOTH;
    gridbag.setConstraints(fj, constraints);
    add(fj);

    // Menu de la fenetre
    MenuBar mBar = new MenuBar();
    setMenuBar(mBar);

    // Liste des menus
    Menu mPartie = new Menu("Partie");
    Menu mGraph = new Menu("Graphique");

    // Sous-menus du menu "Partie"
    miReco = new MenuItem("Recommencer");
    miReco.setEnabled(false);
    miReco.addActionListener(c);
    mPartie.add(miReco);

    MenuItem miQuit = new MenuItem("Quitter");
    miQuit.addActionListener(c);
    mPartie.add(miQuit);

    // Sous-menus du menu "Graphique"
    miFemmes = new MenuItem("Femmes");
    miFemmes.setEnabled(true);
    miFemmes.addActionListener(c);
    mGraph.add(miFemmes);

    miJava = new MenuItem("Java");
    miJava.setEnabled(true);
    miJava.addActionListener(c);
    mGraph.add(miJava);

    miSimpsons = new MenuItem("Simpsons");
    miSimpsons.setEnabled(true);
    miSimpsons.addActionListener(c);
    mGraph.add(miSimpsons);

    miTrad = new MenuItem("Traditionnel");
    miTrad.setEnabled(false);
    miTrad.addActionListener(c);
    mGraph.add(miTrad);

    // Ajout des menus a la barre de menus
    mBar.add(mPartie);
    mBar.add(mGraph);

    setVisible(true);
    pack();
  }

  /** Definition des contraintes d'un composant.
   @param gbc l'objet GridBagConstraints ou sont stockees les contraintes
   @param gx Abscisse de la premiere cellule du composant
   @param gy Ordonnee de la premiere cellule du composant
   @param gw Nombre de colonnes (en cellules) du composant
   @param gw Nombre de rangees (en cellules) du composant
   @param wx Proportion de la largeur totale de la fenetre
   @param wx Proportion de la hauteur totale de la fenetre
  */
  private void buildConstraints(GridBagConstraints gbc, int gx, int gy, 
                                int gw, int gh, int wx, int wy) {
    gbc.gridx = gx;
    gbc.gridy = gy;
    gbc.gridwidth = gw;
    gbc.gridheight = gh;
    gbc.weightx = wx;
    gbc.weighty = wy;
  }

  /** Active ou desactive le sous-menu recommencer
    @param b true pour l'activer, false pour le desactiver
  */
  public void btRecoActif(boolean b) {
    miReco.setEnabled(b);
  }

  /** Active ou desactive le sous-menu Traditionnel
    @param b true pour l'activer, false pour le desactiver
  */
  public void btTradActif(boolean b) {
    miTrad.setEnabled(b);
  }

  /** Active ou desactive le sous-menu Java
    @param b true pour l'activer, false pour le desactiver
  */
  public void btJavaActif(boolean b) {
    miJava.setEnabled(b);
  }

  /** Active ou desactive le sous-menu Femmes
    @param b true pour l'activer, false pour le desactiver
  */
  public void btFemmesActif(boolean b) {
    miFemmes.setEnabled(b);
  }

  /** Active ou desactive le sous-menu Simpsons
    @param b true pour l'activer, false pour le desactiver
  */
  public void btSimpsonsActif(boolean b) {
    miSimpsons.setEnabled(b);
  }
}
