package client.view.Probleme;

/**
 *
 * @author Administrator
 */
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
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 affichant à l'utilisateur de modifier un problème choisi.
 *
 * @author Dream Team - ING2
 */
public class PanelModifierProbleme extends JPanel {

    //Déclaration des variables
    private JLabel fonctionobj, contraintes, fonction, methode, nomProb, solProb, fonctionEnText, dimFonc, titreProbleme;
    private JPanel panfonc, pancontr;
    private JList listfic;
    private JButton ajouter, supprimer, parcourir, valider, annuler, changerMethode;
    private JTextField fonc, nomProbleme, solProbleme, foncEnText, dimFoncEnText;
    private Object[] nomColonne = {"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 PanelModifierProbleme() {

    	//On met en place notre panel
        this.setBackground(new Color(234, 232, 233));
        this.setLayout(null);
        
        TitledBorder titleInfo = new TitledBorder("Modifier Problème");
        titleInfo.setTitleColor(Color.BLUE);
        this.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.BLUE));
        this.setBorder(BorderFactory.createTitledBorder(titleInfo));
        

        //titre du problème
        titreProbleme = new JLabel();
        titreProbleme.setBounds(50, 15, 140, 20);
        add(titreProbleme);

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

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

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

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

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

        //On meet un panel pour la fonction objective
        panfonc = new JPanel();
        panfonc.setBackground(Color.WHITE);
        panfonc.setBounds(190, 160, 240, 30);
        valuesListDefaultModelFonction = new DefaultListModel();
        listfic = new JList(valuesListDefaultModelFonction);
        panfonc.add(listfic);
        add(panfonc);

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

        //Contraintes
        contraintes = new JLabel("Contraintes :");
        contraintes.setBounds(50, 220, 90, 20);
        add(contraintes);
        
        //Ajouter
        ajouter = new JButton("Ajouter");
        ajouter.setBounds(140, 220, 100, 25);
        add(ajouter);

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

        //Panel 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);

        scroll2 = new JScrollPane(tableContrainte);
        scroll2.setBounds(10, 260, 720, 110);
        scroll2.setPreferredSize(new Dimension(240, 110));
        add(scroll2);

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

        //Annuler
        annuler = new JButton("Annuler");
        annuler.setBounds(500, 410, 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 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 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 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 solution exacte
     * 
     * @return la solution exacte
     */
	public JTextField getSolProbleme() {
		return solProbleme;
	}
	
	/**<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 le titre du problème
     * 
     * @return le titre du problème
     */
    public JLabel getTitreProbleme() {
        return titreProbleme;
    }

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne les valeurs de la table des contraintes
     * 
     * @return les valeurs de la table des contraintes
     */
	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 assigne le nouveau nombre de contraintes
     * 
     * @param i le nouveau nombre de contraintes
     */
    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 ViderPanelModif() {
        getvaluesListDefaultModelFonction().removeAllElements();
        RemoveAllElementsFromTable(getValuesTableDefaultModelContrainte());
        getFonc().setText("");
        getNomProbleme().setText("");
        getFoncEnText().setText("");
        getDimFoncEnText().setText("");
    }
}
