package client.view.onglet;

//------------------------------------Importations des différentes bibliothèques---------------------------------//
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.plaf.basic.BasicButtonUI;

//-----------------------------------Fin Importations des différentes bibliothèques----------------------------------//




//-------------------------------------------------Début de la classe------------------------------------------------//
/**<u><i>Explication de la méthode :</i></u>
 * <P>Constructeur permettant de créer des onglets personnalisés.
 *
 * @author Dream Team - ING2
 */
public class OngletSpecial extends JPanel {

    //Déclaration des variables.
    String title;
   
    /**<u><i>Explication de la méthode :</i></u>
     * <P>Constructeur permettant de créer le panel contenant l'ensemble des onglets.
     * 
     * @param title Titre de l'onglet.
     * @param closable Booléen permettant de savoir si l'onglet doit être fermant ou non.
     * 
     */
    public OngletSpecial(String title, boolean closable) {

        this.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
        this.title = title;

        //Titre de l'onglet
        JLabel titre = new JLabel(this.title);
        add(titre);
        setOpaque(false);

        //Si l'onglet doit être fermant
        if (closable) {
            add(new BoutonCroix());
        }
   }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le titre de l'onglet
     * 
     * @return le titre de l'onglet
     * 
     */
    public String getTitle() {
        return title;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner un nouveau titre à l'onglet
     * 
     * @param title le nouveau titre de l'onglet
     * 
     */
    public void setTitle(String title) {
        this.title = title;
    }

//-------------------------------------------------Fin de la classe-------------------------------------------------//




//-------------------------------------------------Début de la classe------------------------------------------------//
    /**<u><b>Explication générale de la classe :</b></u>
     * <P>Cette classe permet de créer un onglet spécifique avec une croix de fermeture.
     *
     * @author Laurent Hatier - ING1
     */
    private class BoutonCroix extends JButton {

        //Déclarations des variables.
        private BasicStroke crossStroke = new BasicStroke(2);

        /**<u><i>Explication de la méthode :</i></u>
         * <P>Constructeur permettant de créer le bouton permettant de fermer un onglet.
         */
        public BoutonCroix() {

            //Taille de la croix
            int size = 17;

            //Listener
            BoutonCroixListener t = new BoutonCroixListener();

            setPreferredSize(new Dimension(size, size));

            //Petit texte pour orienter l'utilisateur
            setToolTipText("Fermer l'onglet");

            //Make the button looks the same for all Laf's
            setUI(new BasicButtonUI());

            //Make it transparent
            setContentAreaFilled(false);

            //No need to be focusable
            setFocusable(false);
            setBorderPainted(false);

            //Making nice rollover effect
            setRolloverEnabled(true);

            //Close the proper tab by clicking the button
            addActionListener(t);
        }

        /**<u><i>Explication de la méthode :</i></u>
         * <P> Cette méthode permet de dessiner la croix
         * 
         * @param g objet graphique
         * 
         */
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g.create();
            //shift the image for pressed buttons
            if (getModel().isPressed()) {
                g2.translate(1, 1);
            }
            g2.setStroke(crossStroke);
            g2.setColor(Color.BLACK);
            if (getModel().isRollover()) {
                g2.setColor(Color.RED);
            }
            int delta = 6;
            g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1);
            g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1);
            g2.dispose();
        }
    }

//-------------------------------------------------Fin de la classe-------------------------------------------------//

    
    
    

//-------------------------------------------------Début de la classe------------------------------------------------//
    private class BoutonCroixListener extends MouseAdapter implements ActionListener {

    	/**<u><i>Explication de la méthode :</i></u>
         * <P> Cette méthode permet d'effectuer la fermeture de l'onglet
         * 
         * @param e Evènement de la souris
         * 
         */
        @Override
        public void actionPerformed(ActionEvent e) {
            Component c = (Component) e.getSource();
             
            JTabbedPane tabManager = null;
            OngletSpecial tab = null;
            
            //On recupère une référence de JTabbedPane et d'ongletSpecial
            while (c != null) {
                if (c instanceof JTabbedPane) {
                    tabManager = (JTabbedPane) c;
                } else if (c instanceof OngletSpecial) {
                    tab = (OngletSpecial) c;
                }
                c = c.getParent();
            }
            
            //On supprime l'onglet
            int i = tabManager.indexOfTabComponent(tab);
            if (i != -1) {
                tabManager.remove(i);
            }
        }
    }
}

//-------------------------------------------------Fin de la classe-------------------------------------------------//

