import java.awt.*;
import java.awt.event.*;
import java.io.File;
import javax.swing.*;
import javax.swing.border.TitledBorder;
/**
 * Projet: PaintRevolution
 * <p>Title: BarreOutils.java </p>
 * <p>Description:Classe représentant un menu d'objet BarreOutils </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Societe: IUT NANCY CHARLEMAGNE II</p>
 * @author VIGNERON GEOFFROY && GANGANELLI DORIAN
 * @version 3.0
 */

public class BarreOutils extends JPanel implements TitleBorder,ActionListener {
    
    /**
     * Fenetre principale contenant la barre outils
     */
    private JFramePrincipale jfp;
    /**
     * Panel de la fenetre principale
     */
    private PanelJFramePrincipale ecran;
    
    /**
     * JPanel où s'effectue les opérations 
     */
    private DessinFigures dessin;
    
    /**
     * Font pour les TitleBorder 
     */
    private Font ecriture = new Font("font/verdana.ttf", Font.ITALIC, 12);
    private Font ecriture1 = new Font("font/verdana.ttf", Font.BOLD, 10);
    /**
     * Boutons permettant le choix de la couleur
     */
    private JButton bcfond,bctrace,bcfigure;
    
    /**
     * JComboBox definissant le choix d'une figure
     */
    private JComboBox comboForme,comboCote;
    
    /**
     * Entier permettant de recuperer l'index d'un JComboBox
     */
    int indexcomboForme,indexcomboCote;
    
    /**
     * TabbedPane contenant differents onglets pour choisir une couleur
     */
    private JTabbedPane tabbedPane;
    
    /**
     * Couleurs permettant de recuperer les differentes couleurs des composants
     */
    private Color ctrace,cfigure,cfond,couleur1;
    
    /**
     * JPanelpermettant la visualisation de la couleur choisie
     */
    private JPanel panChoixCouleurFigure,panChoixCouleurFond,panChoixCouleurTrace;
    
    /**
     * Constructeur de la classe initialisant un menu  à partir d'une fenetre principale,
     * d'un JPanel effectuant les opérations et d'une couleur de composant donnée
     * @param j fenetre principale de 'lapplication
     * @param d un panel où s'effectue les opérations
     * @param fond couleur du fond
     * @param trace couleur du trace
     * @param figure couleur des figures
     */
    public BarreOutils(JFramePrincipale j,DessinFigures d,Color fond,Color trace,Color figure) {
        jfp = j;
        dessin=d;
        cfigure=figure;
        cfond=fond;
        ctrace=trace;
        
        //definition du layout
        this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        
        //initialisation des TitleBorder
        TitledBorder border_outils= new TitledBorder("");
        TitledBorder border_couleurs= new TitledBorder("");
        TitledBorder border_formes= new TitledBorder("");
        
        //creation des JPanel associés au TitleBorder
        JPanel couleurs1 = new JPanel();
        JPanel formes= new JPanel();
        JPanel outils = new JPanel();                
        JPanel jp_op = new JPanel();
        JPanel couleurs = new JPanel();
        JPanel pan_ext = new JPanel();
        JPanel pan_int = new JPanel();
        
        //creation des TitleBorder
        this.creationTitleBorder(border_outils,outils,"Outils",ecriture,true);
        this.creationTitleBorder(border_couleurs,couleurs1,"Couleurs",ecriture1,false);
        this.creationTitleBorder(border_formes,formes,"Formes",ecriture1,false);
        couleurs.setLayout(new BoxLayout(couleurs, BoxLayout.Y_AXIS));
        couleurs.add(pan_int);
        couleurs.add(pan_ext);
        
        //ajout et creation des onglets pour TitleBorder couleur
        this.creationOngletsCouleurs();
        couleurs1.add(tabbedPane);
        
        //ajout composants au TitleBorder formes
        //et creation des boutons associés pour TitleBorder formes
        this.creationComposantTitleBorderForme();
        formes.add(comboForme);
        formes.add(comboCote);
        
        //ajout composants au border outils
        outils.add(couleurs1);
        outils.add(formes);
        outils.add(jp_op);
        
        //ajout des composant à la barre outil
        add(outils);
        add(couleurs);
        add(Box.createGlue());
        
        //ajout des listeners
        bcfond.addActionListener(this);
        bctrace.addActionListener(this);
        bcfigure.addActionListener(this);
        comboForme.addActionListener(this);
    }
    
    /**
     * Methode definissant les actions de la barre outils
     * @param e un evenement issu de la souris
     */
    public void actionPerformed(ActionEvent e) {
        
        //modifie la couleur de fond
        if (e.getSource()==bcfond){
            cfond=modifierCouleurPanel(panChoixCouleurFond,true,false);
        }
        
        //modifie la couleur du tracé
        if (e.getSource()==bctrace){
            ctrace=modifierCouleurPanel(panChoixCouleurTrace,false,false); 
            
        }
        
        //modifie la couleur d'une figure
        if (e.getSource()==bcfigure){
            cfigure=modifierCouleurPanel(panChoixCouleurFigure,false,true); 
        }
        
        //Choix d'une figure
        if (e.getSource()==comboForme){
            PanelJFramePrincipale pj=(PanelJFramePrincipale)jfp.getContentPane();
            pj.getBarreOperations().setCursorDefault();
            dessin=pj.getDessin();
            dessin.removeListeners();
            if(comboForme.getSelectedIndex()==0){
                comboCote.setEnabled(true);
            }else{
                comboCote.setEnabled(false);
            }
            
        }
    }
    
    /**
     * Méthode permettant de modifier la couleur d'un  Jpanel
     * @param panelModifier le panel à modifier
     * @param modifierFond un booléen à vrai si le panel à modifier est le fond
     * @param listenerFigure un booléen à vrai si on modifie la couleur des figure
     * le listener n'est aors pas enlever
     * @return la couleur choisie (par default blanc)
     */
    private Color modifierCouleurPanel(JPanel panelModifier,boolean modifierFond,boolean listenerFigure){
        JFrame fe=new JFrame();
        Color c = JColorChooser.showDialog((JFrame) fe, "Choix de la couleur", couleur1);
        if (c==null)c=Color.white;
        PanelJFramePrincipale pj=(PanelJFramePrincipale)jfp.getContentPane();
        pj.getBarreOperations().setCursorDefault();
        dessin=pj.getDessin();
        dessin.repaint();
        if (modifierFond)dessin.setBackground(c);
        if(!listenerFigure)dessin.removeListeners();
        else{
            if (dessin.figureSelection()!=null){
                dessin.figureSelection().changeCouleur(c);
            }
        }
        panelModifier.setBackground(c);
        return c;
    }
    /**
     * Methode recuperant l'index du JComboBox des côtés
     * d'un polygone
     * @return un entier définissant l'index du JComboBox
     */
    public int getIndexComboCote(){
        return comboCote.getSelectedIndex()+5;
    }
    
    /**
     * Methode recuperant l'index du JComboBox des figures
     * @return un entier définissant l'index du JComboBox
     */
    public int getIndexComboFigure(){
        return comboForme.getSelectedIndex();
    }
    
    /**
     * Méthode recuperant la couleur du trace
     * @return la couleur du trace
     */
    public Color getCouleurTrace(){
        return ctrace;
    }
    
    /**
     * Méthode recuperant la couleur des figures
     * @return la couleur de la figure 
     */
    public Color getCouleurFigure(){
        return cfigure;
    }
    
    /**
     * Méthode permettant de creer des TitleBorder en fonction 
     * d'un nom,d'un JPanel et d'une ecriture
     * @param border le border à modifier
     * @param pan le JPanel contenant les composants graphiques 
     * @param operation le titre du TitleBorder
     * @param ecriture le style d'ecriture du titre
     */
    public void creationTitleBorder(TitledBorder border, JPanel pan, String operation, Font ecriture,boolean layout) {
        border= BorderFactory.createTitledBorder(pan.getBorder(),operation, TitledBorder.LEFT,
                TitledBorder.TOP,ecriture);
        border.setTitleColor(Color.RED);
        pan.setBorder(border);
        if (layout)
            pan.setLayout(new BoxLayout(pan, BoxLayout.Y_AXIS)); 
    }
    
    /**
     * Méthode créant les boutons,JPanel associé aux onglets
     *
     */
    private void creationOngletsCouleurs(){
        //Initialistaion JTabbedPane
        tabbedPane=new JTabbedPane();
        
        //creation des JPanel des onglets et JPanel pour la visualisation
        //de la couleur choisie
        JPanel panOngletFigure = new JPanel();
        JPanel panelOngletFond=new JPanel();
        JPanel panelOngletTrace=new JPanel();
        panChoixCouleurFond=new JPanel();
        panChoixCouleurTrace=new JPanel();
        panChoixCouleurFigure=new JPanel();
        
        //creation d'une icone associé à l'onglet
        ImageIcon icon = new ImageIcon("Icones" + File.separator + "");
        
        
        //creation des boutons pour le choix d'une couleur
        bcfond=new JButton("Couleur fond");
        bctrace=new JButton("Couleur trace");
        bcfigure=new JButton("Couleur figure");
        
        //ajout des JPanel de visualisation au JPanel associé à un onglet
        panelOngletFond.add(panChoixCouleurFond);
        panelOngletTrace.add(panChoixCouleurTrace);
        panOngletFigure.add(panChoixCouleurFigure);
        
        //ajout des boutons
        panelOngletTrace.add(bctrace);
        panOngletFigure.add(bcfigure);
        panelOngletFond.add(bcfond);
        
        //initialisation du JPanel de visualisation à une couleur donnée
        panChoixCouleurFond.setBackground(cfond);
        panChoixCouleurTrace.setBackground(ctrace);
        panChoixCouleurFigure.setBackground(cfigure);
        
        //ajout du panel,icone et titre à l'onglet
        tabbedPane.addTab("Fond", icon, panelOngletFond, "Couleur du fond");
        tabbedPane.addTab("Tracé", icon, panelOngletTrace, "Couleur du tracé");
        tabbedPane.addTab("Figure", icon, panOngletFigure, "Couleur figure");
    }
    
    /**
     * Méthode créant les composants graphiques associés
     * au TitleBorder forme
     */
    private void creationComposantTitleBorderForme(){
        comboForme= new JComboBox( new String[]{"polygone","quadrilatere","rectangle","carre","triangle","cercle"});
        comboCote =new JComboBox( new String[]{"5","6","7","8","9","10","11","12"});
        comboCote .setSelectedIndex(0);
        comboForme.setSelectedIndex(0);
        comboCote.setEnabled(true);
    }
}
