package client.view.Probleme;

/**
 *
 * @author Dream Team
 */
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

import client.control.probleme.ControleurBoutonAjouter;
import client.control.probleme.ControleurBoutonAnnulerProb;
import client.control.probleme.ControleurBoutonParcourir;
import client.control.probleme.ControleurBoutonSupprimerContr;
import client.control.probleme.ControleurBoutonValiderProb;

/** <u><b>Explication générale de la classe :</b></u>
 * <P>Cette classe permet de créer le panel pour que l'utilisateur puisse creer un problème
 *
 * @author Dream Team - ING2
 */
public class PanelCreerProbleme extends JPanel {

    //Déclaration des variables
    private JLabel fonctionobj, contraintes, fonction, nomProb, solProb, fonctionEnText, dimFonc;
    private JPanel panfonc, pancontr;
    private JList listfic;
    private JButton ajouter, supprimer, parcourir, valider, annuler;
    private JTextField fonc, nomProbleme, solProbleme, foncEnText, dimFoncEnText;
    private Object[] nomColonne = {"Derive/Contrainte", "Nom Fichier", "Nom Fonction", "Libellé Contrainte"};
    private JScrollPane scroll2;
    private DefaultListModel valuesListDefaultModelFonction;
    private DefaultTableModel valuesTableDefaultModelContrainte;
    private JTable tableContrainte;
    private int i = 0;

    /**<u><i>Explication générale du constructeur :</i></u>
     * <P> Constructeur de la classe permettant de créer un panel Creer Probleme
     *
     */
    public PanelCreerProbleme() {
    	
    	//On met le panel comme on le souhaite
        this.setBackground(new Color(234, 232, 233));
        this.setLayout(null);
        
        TitledBorder titleInfo = new TitledBorder("Creer Problème");
        titleInfo.setTitleColor(Color.BLUE);
        this.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.BLUE));
        this.setBorder(BorderFactory.createTitledBorder(titleInfo));

        //Nom du problème
        nomProb = new JLabel("Nom du Probleme :");
        nomProbleme = new JTextField();
        nomProb.setBounds(50, 30, 120, 20);
        nomProbleme.setBounds(190, 30, 200, 20);
        add(nomProb);
        add(nomProbleme);
        
        //Solution du prolbème
        solProb = new JLabel("Solution Exacte :");
        solProbleme = new JTextField();
        solProb.setBounds(400, 30, 120, 20);
        solProbleme.setBounds(520, 30, 100, 20);
        add(solProb);
        add(solProbleme);

        //Nom de la fonction
        fonction = new JLabel("Nom de la Fonction : ");
        fonc = new JTextField();
        fonction.setBounds(50, 60, 130, 20);
        fonc.setBounds(190, 60, 200, 20);
        add(fonc);
        add(fonction);

        //Libellé de la fonction
        fonctionEnText = new JLabel("Libellé Fonction : ");
        foncEnText = new JTextField();
        fonctionEnText.setBounds(50, 90, 130, 20);
        foncEnText.setBounds(190, 90, 200, 20);
        add(foncEnText);
        add(fonctionEnText);

        //Dimension de la fonction
        dimFonc = new JLabel("Dimension Fonction : ");
        dimFonc.setBounds(50, 120, 130, 20);
        dimFoncEnText = new JTextField();
        dimFoncEnText.setBounds(190, 120, 200, 20);
        add(dimFonc);
        add(dimFoncEnText);

        //Fonction objective
        fonctionobj = new JLabel("Fonction objective : ");
        fonctionobj.setBounds(50, 150, 150, 15);
        add(fonctionobj);

        //Panel pour la fonction objective
        panfonc = new JPanel();
        panfonc.setBackground(Color.WHITE);
        panfonc.setBounds(190, 150, 240, 30);
        valuesListDefaultModelFonction = new DefaultListModel();
        listfic = new JList(valuesListDefaultModelFonction);
        panfonc.add(listfic);
        add(panfonc);

        //Parcourir
        parcourir = new JButton("Parcourir");
        parcourir.setBounds(500, 150, 100, 27);
        add(parcourir);

        //Contraintes
        contraintes = new JLabel("Contraintes :");
        contraintes.setBounds(50, 210, 90, 20);
        add(contraintes);

        //Bouton Ajouter
        ajouter = new JButton("Ajouter");
        ajouter.setBounds(140, 210, 100, 25);
        add(ajouter);

        //Bouton supprimer
        supprimer = new JButton("Supprimer");
        supprimer.setBounds(290, 210, 100, 25);
        add(supprimer);

        //Table des contraintes
        pancontr = new JPanel();
        pancontr.setLayout(null);
        valuesTableDefaultModelContrainte = new DefaultTableModel();
        tableContrainte = new JTable(valuesTableDefaultModelContrainte) {

            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return columnIndex >= 2;
            }
        };
        valuesTableDefaultModelContrainte.setColumnIdentifiers(nomColonne);

        //Scroll pour la table
        scroll2 = new JScrollPane(tableContrainte);
        scroll2.setBounds(10, 250, 720, 110);
        scroll2.setPreferredSize(new Dimension(240, 110));
        add(scroll2);

        //Bouton Valider
        valider = new JButton("Valider");
        valider.setBounds(250, 400, 100, 25);
        add(valider);

        //Bouton Annuler
        annuler = new JButton("Annuler");
        annuler.setBounds(500, 400, 100, 25);
        add(annuler);
        
        //Listener
        ajouter.addActionListener(new ControleurBoutonAjouter());
        parcourir.addActionListener(new ControleurBoutonParcourir());
        supprimer.addActionListener(new ControleurBoutonSupprimerContr());
        annuler.addActionListener(new ControleurBoutonAnnulerProb());
        valider.addActionListener(new ControleurBoutonValiderProb());

    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le bouton Ajouter une contrainte.
     * <P>
     * @return le bouton Ajouter
     */
    public JButton getAjouter() {
        return ajouter;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le bouton Parcourir pour choisir sa fonction
     * <P>
     * @return le bouton parcourir
     */
    public JButton getParcourir() {
        return parcourir;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le bouton Valider qui après avoir fait tout les choix permettra
     * à l'utilisateur de valider ses données et d'envoyer celle-ci au calculateur.
     * <P>
     * @return le bouton valider.
     */
    public JButton getValider() {
        return valider;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le bouton Supprimer qui permet de supprimer une contraintes
     * <P>
     * @return le bouton supprimer
     */
    public JButton getSupprimer() {
        return supprimer;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le bouton Annuler lorsque l'utilisateur s'est trompé.
     * <P>
     * @return le bouton Annuler
     */
    public JButton getAnnuler() {
        return annuler;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le JPanel panfonc, contenant le nom du ou des fichiers de la fonction.
     * <P>
     * @return le JPanel panfonc.
     */
    public JPanel getPanfonc() {
        return panfonc;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne la liste où l'on met la fonction
     * <P>
     * @return le valuesListDefaultModelFonction
     */
    public DefaultListModel getvaluesListDefaultModelFonction() {
        return valuesListDefaultModelFonction;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permettra de recuperer le texte écrit par l'utilisateur pour le nom de son problème
     * <P>
     * @return le JTextField nomProbleme
     */
    public JTextField getNomProbleme() {
        return nomProbleme;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permettra de recuperer le texte écrit par l'utilisateur pour le nom de sa fonction
     * <P>
     * @return le JTextField fonc
     */
    public JTextField getFonc() {
        return fonc;
    }
    
    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne la fonction objective
     * 
     * @return la fonction objective
     */
    public JTextField getFoncEnText() {
        return foncEnText;
    }
    
    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne la dimension
     * 
     * @return la dimension
     */
    public JTextField getDimFoncEnText() {
        return dimFoncEnText;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne les valeurs de la JTable
     * 
     * @return les valeurs de la JTable
     */
    public DefaultTableModel getValuesTableDefaultModelContrainte() {
        return valuesTableDefaultModelContrainte;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne la table des contraintes
     * 
     * @return la table des contraintes
     */
    public JTable getTableContrainte() {
        return tableContrainte;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne la solution du problème
     * 
     * @return la solution du problème
     * 
     */
	public JTextField getSolProbleme() {
		return solProbleme;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode assigne un nouveau nombre de contraintes
     * 
     * @param i nouveau nombre
     * 
     */
	public void setI(int i) {
        this.i = i;
    }

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le nombre de contraintes
     * 
     * @return le nombre de contraintes
     * 
     */
    public int getI() {
        return i;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de savoir si une ligne est sélectionnées
     * 
     * @return Vrai si une ligne est sélectionnées sinon Faux
     * 
     */
    public boolean isSelectedRow(JTable T) {
        for (int j = 0; j < T.getRowCount(); j++) {
            if (T.isRowSelected(j)) {
                return true;
            }

        }
        return false;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de supprimer tous les éléments d'une table
     * 
     * @param dTM table à vider
     * 
     */
    public void RemoveAllElementsFromTable(DefaultTableModel dTM) {
        for (int j = dTM.getRowCount() - 1; j >= 0; j--) {
            dTM.removeRow(j);
        }

    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de vider tous les champs du panel
	 *
     */
    public void ViderPanelCreer() {
        getvaluesListDefaultModelFonction().removeAllElements();
        RemoveAllElementsFromTable(getValuesTableDefaultModelContrainte());
        getFonc().setText("");
        getNomProbleme().setText("");
        getFoncEnText().setText("");
        getDimFoncEnText().setText("");

    }
    
}
