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

public class FormulaireEtudiant extends JPanel {

	// tableau des âges possibles de 0 à 130 ans
	private final static Integer[] ages = new Integer[130];
	static { 
		int i;
		for (i=0; i<130; i++) {
			ages[i] = i;
		}
	}
			
	// composants permettant la saisie des informations
	private JTextField champsNom;
	private JTextField champsPrenom;
	private JSpinner selectionAge;
	private JRadioButton[] selectionSpecialite;
	private JSlider selectionMoyenne;
	private JLabel labelMoyenne;

	// constructeur d'un formulaire vide
	public FormulaireEtudiant() {
		super();
		int i;
		setLayout(new BorderLayout());
		setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
		JLabel titrePanneau = new JLabel("Formulaire Etudiant", JLabel.CENTER);
		titrePanneau.setBackground(Color.BLUE);
		titrePanneau.setForeground(Color.WHITE);
		titrePanneau.setOpaque(true);
		add(titrePanneau, BorderLayout.NORTH);
		JPanel panneauPrincipal = new JPanel();
		panneauPrincipal.setLayout(new GridLayout(0,2));
		// Nom
		panneauPrincipal.add(new JLabel("Nom :    ", JLabel.RIGHT));
		champsNom = new JTextField();
		panneauPrincipal.add(champsNom);
		// Prenom
		panneauPrincipal.add(new JLabel("Prenom :    ", JLabel.RIGHT));
		champsPrenom = new JTextField();
		panneauPrincipal.add(champsPrenom);
		// Age
		panneauPrincipal.add(new JLabel("Age :    ", JLabel.RIGHT));
		JPanel panneauAge = new JPanel();
		panneauAge.setLayout(new BorderLayout());
		selectionAge = new JSpinner(new SpinnerListModel(ages));
		selectionAge.setValue(new Integer(21));
		//selectionAge.setPreferredSize(new Dimension(20, 20));
		panneauAge.add(selectionAge, BorderLayout.CENTER);
		JPanel tampon = new JPanel();
		tampon.setPreferredSize(new Dimension(180, 10));
		panneauAge.add(tampon, BorderLayout.EAST);
		panneauPrincipal.add(panneauAge);
		// Choix de la spécialité par boutons radion
		panneauPrincipal.add(new JLabel("Specialite :    ", JLabel.RIGHT));
		i = 0;
		JPanel panneauBoutons = new JPanel();
		panneauBoutons.setLayout(new FlowLayout());
		ButtonGroup groupeBoutons = new ButtonGroup();
		selectionSpecialite = new JRadioButton[Specialite.values().length];
		for (Specialite specialite : Specialite.values()) {
			selectionSpecialite[i] = new JRadioButton(specialite.toString());
			groupeBoutons.add(selectionSpecialite[i]);
			panneauBoutons.add(selectionSpecialite[i++]);
		}
		selectionSpecialite[0].setSelected(true);
		panneauPrincipal.add(panneauBoutons);
		// Moyenne
		panneauPrincipal.add(new JLabel("Moyenne :    ", JLabel.RIGHT));
		JPanel panneauMoyenne = new JPanel();
		panneauMoyenne.setLayout(new FlowLayout());
		selectionMoyenne = new JSlider(JSlider.HORIZONTAL, 0, 300, 100);
		selectionMoyenne.setMajorTickSpacing(100);
		selectionMoyenne.setMinorTickSpacing(10);
		selectionMoyenne.setPaintTicks(true);
		//selectionMoyenne.setPaintLabels(true);
		//Font font = new Font("Serif", Font.ITALIC, 8);
        //selectionMoyenne.setFont(font);
		selectionMoyenne.addChangeListener(new EcouteurChangeMoyenne(this));
		panneauMoyenne.add(selectionMoyenne);
		labelMoyenne = new JLabel("10.0");
		panneauMoyenne.add(labelMoyenne);
		panneauPrincipal.add(panneauMoyenne);
		//panneauPrincipal.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
		add(panneauPrincipal, BorderLayout.CENTER);
	}

	// initialise le formulaire avec les champs préremplis
	public void initChampsFormulaire(String nom, String prenom, int age,
		Specialite specialite, double moyenne) {
		champsNom.setText(nom);
		champsPrenom.setText(prenom);
		selectionAge.setValue(age);
		selectionSpecialite[specialite.ordinal()].setSelected(true);
		selectionMoyenne.setValue((int) moyenne * 10);
	}

	public void initChampsFormulaire(Etudiant etudiant) {
		initChampsFormulaire(etudiant.getNom(), etudiant.getPrenom(),
			etudiant.getAge(), etudiant.getSpecialite(), etudiant.getMoyenne());
	}

	// Accesseurs pour récupérer les informations saisies dans le formulaire
	
	public String getNom() {
		return champsNom.getText();
	}

	public String getPrenom() {
		return champsPrenom.getText();
	}

	public int getAge() {
		return (Integer) selectionAge.getValue();
	}

	public Specialite getSpecialite() {
		int i = 0;
		for (JRadioButton bouton : selectionSpecialite) {
			if (bouton.isSelected()) {
				return Specialite.values()[i];
			}
			i++;
		}
		return Specialite.Mathematique;
	}

	public double getMoyenne() {
		return ((double) selectionMoyenne.getValue())/10;
	}

	/**
 	 * renvoie les infos saisies dans le formulaire sous la
 	 * forme d'un étudiant
 	 */ 
	public Etudiant getEtudiant() {
		return new Etudiant(getNom(), getPrenom(), getAge(),
			getSpecialite(), getMoyenne());
	}
	
	/**
     * méthode interne pour actualiser l'affichage de la moyenne
     * quand le JSpinner est utilisé
     */ 
	void actualiserMoyenne() {
		double moyenne = getMoyenne();
		if (moyenne < 10.0) {
			labelMoyenne.setText("0" + moyenne);
		} else {
			labelMoyenne.setText("" + moyenne);
		}
	}
}

class EcouteurChangeMoyenne implements ChangeListener {
	FormulaireEtudiant formulaire;

	public EcouteurChangeMoyenne(FormulaireEtudiant _formulaire) {
		formulaire = _formulaire;
	}

	public void stateChanged(ChangeEvent e) {
		formulaire.actualiserMoyenne();
	}
}
