import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import java.rmi.*;

/** 
Cette classe permet de saisir les parametres concernant le lancement du 
* serveur : la machine serveur, le port et le nombre de joueurs.
@author Sebastien BISMUTH 
@author Yann LENNE
@version 1.1.6
*/

public class StartServeur extends Frame implements ActionListener{
  /** Champ pour la saisie du nom du serveur */
  private TextField tfSer;

  /** Champ pour la saisie du numero de port du serveur */
  private TextField tfPor;

  /** Champ pour la saisie du nombre de joueurs */
  private TextField tfNbJ;

  /** Champ pour la saisie du nombre de cases en hauteur */
  private TextField tfNbH;

  /** Champ pour la saisie du nombre de cases en largeur */
  private TextField tfNbL;

  public StartServeur(){
    // Ajout du GridBagLayout
    initLayout();
    
    // Caracteristiques de la fenetre
    PersonnaliserInterface();
  }

  /** Methode principale de la classe.
    * Cree une nouvelle instance de la classe StartServeur
  */
  public static void main(String argv[]){
    new StartServeur();
  }

  /** Definit les caracteristiques de la fenetre */
  private void PersonnaliserInterface() {
    // Recuperation des dimensions de l'ecran
    int wE = getToolkit().getScreenSize().width;
    int hE = getToolkit().getScreenSize().height;

    // Position de la fenetre
    setSize(wE/2, hE/2);
    setLocation(wE/4, hE/4);
    
    setTitle("Saisie des informations pour le lancement du serveur");
    setVisible(true);
  }
  
  /** Organisation de la fenetre.
   *  La fenetre contient un GridBagLayout dans lequel sont ajoutes les
   *  differents composants.
   */
  private void initLayout() {
    
    // Configuration de la mise en page
    GridBagLayout gridbag = new GridBagLayout();
    GridBagConstraints constraints = new GridBagConstraints();
    setLayout(gridbag);
    
    // Label : Serveur
    buildConstraints(constraints, 0, 0, 1, 1, 10, 16, "label");
    Label l1 = new Label("Serveur :", Label.LEFT);
    gridbag.setConstraints(l1, constraints);
    add(l1);
    
    // TextField pour la saisie du serveur
    buildConstraints(constraints, 1, 0, 3, 1, 60, 0, "textfield");
    tfSer = new TextField();
    gridbag.setConstraints(tfSer, constraints);
    add(tfSer);
    
    // Label : Port
    buildConstraints(constraints, 0, 1, 1, 1, 0, 16, "label");
    Label l2 = new Label("Port :", Label.CENTER);
    gridbag.setConstraints(l2, constraints);
    add(l2);
    
    // TextField pour la saisie du port
    buildConstraints(constraints, 1, 1, 3, 1, 0, 0, "textfield");
    tfPor = new TextField();
    tfPor.setText("1099");
    gridbag.setConstraints(tfPor, constraints);
    add(tfPor);

    // Label : Nombre de joueurs
    buildConstraints(constraints, 0, 2, 1, 1, 0, 16, "label");
    Label l3 = new Label("Nombre de joueurs :", Label.CENTER);
    gridbag.setConstraints(l3, constraints);
    add(l3);
    
    // TextField pour la saisie du nombre de joueurs
    buildConstraints(constraints, 1, 2, 1, 1, 20, 0, "textfield");
    tfNbJ = new TextField();
    tfNbJ.setEditable(false);
    tfNbJ.setText("2");
    gridbag.setConstraints(tfNbJ, constraints);
    add(tfNbJ);

    // Bouton + pour le nombre de joueurs
    buildConstraints(constraints, 2, 2, 1, 1, 15, 0, "bt+");
    Button pj = new Button("   +   ");
    pj.addActionListener(this);
    gridbag.setConstraints(pj, constraints);
    add(pj);

    // Bouton - pour le nombre de joueurs
    buildConstraints(constraints, 3, 2, 1, 1, 15, 0, "bt-");
    Button mj = new Button("   -   ");
    mj.addActionListener(this);
    gridbag.setConstraints(mj, constraints);
    add(mj);

    // Label : Nombre de cases en hauteur
    buildConstraints(constraints, 0, 3, 1, 1, 0, 16, "label");
    Label l4 = new Label("Nombre de cases en hauteur :");
    gridbag.setConstraints(l4, constraints);
    add(l4);

    // TextField pour la saisie des cases en hauteur
    buildConstraints(constraints, 1, 3, 1, 1, 0, 0, "textfield");
    tfNbH = new TextField();
    tfNbH.setEditable(false);
    tfNbH.setText("6");
    gridbag.setConstraints(tfNbH, constraints);
    add(tfNbH);

    // Bouton + pour le nombre de cases en hauteur
    buildConstraints(constraints, 2, 3, 1, 1, 0, 0, "bt+");
    Button ph = new Button("  +    ");
    ph.addActionListener(this);
    gridbag.setConstraints(ph, constraints);
    add(ph);

    // Bouton - pour le nombre de cases en hauteur
    buildConstraints(constraints, 3, 3, 1, 1, 0, 0, "bt-");
    Button mh = new Button("  -    ");
    mh.addActionListener(this);
    gridbag.setConstraints(mh, constraints);
    add(mh);

    // Label : Nombre de cases en largeur
    buildConstraints(constraints, 0, 4, 1, 1, 0, 16, "label");
    Label l5 = new Label("Nombre de cases en largeur :");
    gridbag.setConstraints(l5, constraints);
    add(l5);

    // TextField pour la saisie des cases en largeur
    buildConstraints(constraints, 1, 4, 1, 1, 0, 0, "textfield");
    tfNbL = new TextField();
    tfNbL.setEditable(false);
    tfNbL.setText("10");
    gridbag.setConstraints(tfNbL, constraints);
    add(tfNbL);

    // Bouton + pour le nombre de cases en largeur
    buildConstraints(constraints, 2, 4, 1, 1, 0, 0, "bt+");
    Button pl = new Button("    +  ");
    pl.addActionListener(this);
    gridbag.setConstraints(pl, constraints);
    add(pl);

     // Bouton - pour le nombre de cases en largeur
    buildConstraints(constraints, 3, 4, 1, 1, 0, 0, "bt-");
    Button ml = new Button("    -  ");
    ml.addActionListener(this);    
    gridbag.setConstraints(ml, constraints);
    add(ml);

    // Bouton OK 
    buildConstraints(constraints, 1, 5, 1, 1, 0, 20, "bt+");
    constraints.fill = GridBagConstraints.HORIZONTAL;
    Button ok = new Button("OK");
    ok.addActionListener(this);
    gridbag.setConstraints(ok, constraints);
    add(ok);

    // Bouton Annuler
    buildConstraints(constraints, 2, 5, 1, 1, 0, 0, "bt-");
    constraints.fill = GridBagConstraints.HORIZONTAL;
    Button annu = new Button("Annuler");
    annu.addActionListener(this);
    gridbag.setConstraints(annu, constraints);
    add(annu);
  }
  
  /** 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, String type){
    // Cellule d'origine
    gbc.gridx = gx;
    gbc.gridy = gy;
    
    // Nombre de cellules occupees
    gbc.gridwidth = gw;
    gbc.gridheight = gh;
    
    // pourcentage d'espace total occupe
    gbc.weightx = wx;
    gbc.weighty = wy;
    
    if (type.compareTo("label") == 0){
      // Placement du composant s'il est plus petit que la zone
      gbc.anchor = GridBagConstraints.CENTER;
    }
    else{
      if (type.compareTo("textfield") == 0){
        gbc.anchor = GridBagConstraints.CENTER;
        // Reduction du champ s'il est plus grand que la zone
        gbc.fill = GridBagConstraints.HORIZONTAL;
      }
      else{
        if (type.compareTo("bt+") == 0){
          gbc.anchor = GridBagConstraints.EAST;
          gbc.fill = GridBagConstraints.NONE;
        }
        else{
          if (type.compareTo("bt-") == 0){
            gbc.anchor = GridBagConstraints.WEST;
            gbc.fill = GridBagConstraints.NONE;
          }
        } 
      } 
    } 
  }

  /** Pour gerer les actions sur les boutons */
  public void actionPerformed(ActionEvent e){

    Button arg = (Button)e.getSource();
    if (arg.getLabel().equals("   +   ")) {
      // Clic pour augmenter le nombre de joueurs 
      // Pas plus de 4 joueurs
      int val = Integer.parseInt(tfNbJ.getText());
      if (val < 4){
        val++;
        tfNbJ.setText("" + val +"");
      }
    }
    else
      if (arg.getLabel().equals("   -   ")) {
        // Clic pour diminuer le nombre de joueurs
        // Pas moins de 2 joueurs
        int val = Integer.parseInt(tfNbJ.getText());
        if (val > 2){
          val--;
          tfNbJ.setText("" + val + "");
        }
      }
      else
        if (arg.getLabel().equals("Annuler")) {
          // Clic sur le bouton Annuler
          System.exit(0);
        }
        else
          if (arg.getLabel().equals("    +  ")) {
            // Clic pour augmenter le nombre de cases en largeur
            // Au maxi 20 cases 
            int val = Integer.parseInt(tfNbL.getText());
            if (val < 20){
              val++;
              tfNbL.setText("" + val +"");
            }
          }
          else
            if (arg.getLabel().equals("    -  ")) {
              // Clic pour diminuer le nombre de cases en largeur
              // Au mini 4 cases 
              int val = Integer.parseInt(tfNbL.getText());
              if (val > 4){
                val--;
                tfNbL.setText("" + val + "");
              }
            }
            else
              if (arg.getLabel().equals("  +    ")) {
                // Clic pour augmenter le nombre de cases en hauteur
                // Au maxi 15 cases
                int val = Integer.parseInt(tfNbH.getText());
                if (val < 15){
                  val++;
                  tfNbH.setText("" + val +"");
                }
              }
              else
                if (arg.getLabel().equals("  -    ")) {
                  // Clic pour diminuer le nombre de cases en hauteur
                  // Au mini 4 cases 
                  int val = Integer.parseInt(tfNbH.getText());
                  if (val > 4){
                    val--;
                    tfNbH.setText("" + val + "");
                  }
                }
                else
                  if (arg.getLabel().equals("OK")) {
                    // Clic sur le bouton OK
                    // On verifie que le serveur et le port ont ete saisis
                    String serveur = tfSer.getText();
                    String port = tfPor.getText();
                    
                    if (serveur.length() != 0 && port.length() != 0){
                      int nbJ = Integer.parseInt(tfNbJ.getText());
                      int nbH = Integer.parseInt(tfNbH.getText());
                      int nbL = Integer.parseInt(tfNbL.getText());
                      try{
                        // Creation d'une nouvelle instance de Serveur
                        new Serveur(serveur, port, nbJ, nbL, nbH);
                        setVisible(false);
                      }
                      catch(RemoteException re){re.printStackTrace();}
                    }
                  }    
  }
}




