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

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

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

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

 

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

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

  /** Definit les caracteristiques de la fenetre */
  private void PersonnaliserInterface() {
    int wE = getToolkit().getScreenSize().width;
    int hE = getToolkit().getScreenSize().height;
    setSize(wE/2, hE/2);
    setLocation(wE/4, hE/4);
    //setResizable(false);
    
    setTitle("Saisie des informations pour le lancement du client");
    setVisible(true);
  }
  
  private void initLayout() {
    
    // Configuration de la mise en page
    GridBagLayout gridbag = new GridBagLayout();
    GridBagConstraints constraints = new GridBagConstraints();
    setLayout(gridbag);
    
    // Label : Pseudo du joueurs
    buildConstraints(constraints, 0, 0, 1, 1, 30, 16, "label");
    Label l3 = new Label("Pseudo :", Label.CENTER);
    gridbag.setConstraints(l3, constraints);
    add(l3);
    
    // TextField pour la saisie du pseudo du joueurs
    buildConstraints(constraints, 1, 0, 4, 1, 70, 0, "textfield");
    tfPseudo = new TextField();
    gridbag.setConstraints(tfPseudo, constraints);
    add(tfPseudo);
 
    // Label : Serveur
    buildConstraints(constraints, 0, 1, 1, 1, 0, 16, "label");
    Label l1 = new Label("Serveur :", Label.CENTER);
    gridbag.setConstraints(l1, constraints);
    add(l1);
    
    // TextField pour la saisie du serveur
    buildConstraints(constraints, 1, 1, 4, 1, 0, 0, "textfield");
    tfSer = new TextField();
    gridbag.setConstraints(tfSer, constraints);
    add(tfSer);
    
    // Label : Port
    buildConstraints(constraints, 0, 2, 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, 2, 4, 1, 0, 0, "textfield");
    tfPor = new TextField();
    tfPor.setText("1099");
    gridbag.setConstraints(tfPor, constraints);
    add(tfPor);

     // Bouton OK 
    buildConstraints(constraints, 3, 3, 1, 1, 20, 20, "bt+");
    constraints.fill = GridBagConstraints.NONE;
    constraints.anchor = GridBagConstraints.EAST;
    Button ok = new Button("OK");
    ok.addActionListener(this);
    gridbag.setConstraints(ok, constraints);
    add(ok);

    // Bouton Annuler
    buildConstraints(constraints, 4, 3, 1, 1, 20, 20, "bt-");
    constraints.fill = GridBagConstraints.NONE;
    constraints.anchor = GridBagConstraints.WEST;
    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;
      }
    } 
  }
  
  public void actionPerformed(ActionEvent e){
    String pseudo = new String();
    String serveur = new String();
    String port = new String();
    
    Button arg = (Button)e.getSource();

    if (arg.getLabel().equals("OK")) {
      pseudo = tfPseudo.getText();
      serveur = tfSer.getText();
      port = tfPor.getText();
      
      if(pseudo.length() != 0 && serveur.length() != 0 &&  port.length() != 0) {
        new Client(pseudo, serveur, port);
        setVisible(false);
      }
    }
    else
    if (arg.getLabel().equals("Annuler")) {
      System.exit(0);
    }
  }
}
