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

public class BarreOperations extends JPanel implements TitleBorder,ActionListener {
    /**
     * Image pour curseur
     */
    private Image img_cur_dess, img_cur_depl, img_cur_formes, img_cur_supp,
    img_cur_select_anim;
    
    /**
     * Image icone pour les boutons
     */
    private ImageIcon enregistrer,ouvrir,imprimer,deplacer,dessiner,effacer,peinture,supprimer,formes,redimensionnement; 
    
    /**
     * Constantes définissant des manipulations
     */
    private static final int TRANSLATION=1;
    private static final int REDIMENSIONNEMENT=2;
    private static final int SELECTIONFIGURE=3;
    
    /**
     * 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);
    
    /**
     * Fenetre principale du programme
     */
    private JFramePrincipale jfp;
    
    /**
     * Panel interne fenetre principale
     */
    private PanelJFramePrincipale panel_principale;
    
    /**
     * JPanel où s'effectuera les opérations
     */
    private DessinFigures panel_Dessinable;
    
    /**
     * Figure qui sera crée 
     */
    private FigureColoree f;
    
    /**
     * Boutons executant les fonctionnalités du programme
     */
    private JButton b_redimensionnement,b_formes,b_enregistrer,b_supprimer,b_dessiner,
    b_ouvrir,b_imprimer,bdeplacer,b_effacer;
    /**
     * Curseur souris
     */
    private Cursor c_default, cur ;
    
    /**
     * Coordonnees curseur
     */
    private Point p_cursor, p_dessiner, p_main;
    
    
    /**
     * Constructeur permettant de créer la barre opérations
     * @param fenetre la fenetre principale auquel sera rattaché le panel principale 
     * @param pJp le panel principale auquel la barre des opérations sera rattachée
     */
    public BarreOperations(JFramePrincipale fenetre, PanelJFramePrincipale pJp) {
        jfp = fenetre;
        panel_principale = pJp;
        panel_Dessinable=panel_principale.getDessin();
        
        //initialisation des objets
        c_default=getCursor();
        p_cursor = new Point(0, 0);
        p_dessiner = new Point(0,31);
        p_main = new Point(8,0);
        
        //creation des composants graphiques
        this.creationImageIcon();
        this.creationImageIconCurseur();
        this.creationBouton();
        JPanel barreop = new JPanel();
        JPanel fichier = new JPanel();
        JPanel formes= new JPanel();
        JPanel figure = new JPanel();
        TitledBorder border_outils =new TitledBorder("");
        TitledBorder border_fichier=new TitledBorder("");
        TitledBorder border_formes=new TitledBorder("");
        TitledBorder figures_border=new TitledBorder("");
        this.creationTitleBorder(border_outils,barreop,"Opérations",ecriture,true);
        this.creationTitleBorder(border_fichier,fichier,"Fichier",ecriture1,true);
        this.creationTitleBorder(border_formes,formes,"Formes",ecriture,true);
        this.creationTitleBorder(figures_border,figure,"Figures",ecriture1,true);
        
        //définition du layout et ajout des composants
        this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        
        //ajout composant au border fichier
        fichier.setLayout(new GridLayout(0,1));
        fichier.add(b_ouvrir);
        fichier.add(b_enregistrer);
        fichier.add(b_imprimer);
        
        //ajout composant au border figure
        figure.setLayout(new GridLayout(0, 1));
        figure.add(bdeplacer);
        figure.add(b_dessiner);
        figure.add(b_formes);
        figure.add(b_supprimer);
        figure.add(b_redimensionnement);
        
        //ajout des border fichier et figure dans barreop
        barreop.add(fichier);
        barreop.add(figure);
        
        //ajout du border barreop au menu
        this.add(barreop);
        
        JPanel ecritureTexte = new JPanel();
        ecritureTexte.setLayout(new BoxLayout(ecritureTexte, BoxLayout.Y_AXIS));
        JPanel pan_ext = new JPanel();
        JPanel pan_int = new JPanel();
        ecritureTexte.add(pan_int);
        ecritureTexte.add(pan_ext);
        this.add(ecritureTexte);
        
        
    }
    
    /**
     * Méthode effectuant les actions en fonction des listeners
     * @param e ActionEvent 
     */
    public void actionPerformed(ActionEvent e) {
        panel_Dessinable.removeListeners();
        panel_Dessinable.changeCursor(c_default);
        
        //ouverture d'une image
        if(e.getSource()==b_ouvrir){
            Ouvrir ouv = new Ouvrir(jfp);
            jfp.getMenu().setOuverture(true);
            jfp.getMenu().setCreation(true);
        }
        
        //enregistrement panel en photo
        if(e.getSource()==b_enregistrer){
            JpegEnregistreur jp = new JpegEnregistreur(jfp,panel_principale);
        }
            
        //fonction d'impression
        if(e.getSource()==b_imprimer){
            JOptionPane.showMessageDialog(jfp,"Cet fonction n'est pas tout à fait opérationnelle");
        }
        
        //Dessin à main levée
        if (e.getSource()==b_dessiner){
            panel_Dessinable.removeListeners();
            panel_Dessinable.setCursorFeuilles(img_cur_dess,p_dessiner,"tracé");
            panel_Dessinable.trace(panel_principale.getBarreOutils().getCouleurTrace());
        }
        
        //Déplacement d'une figure
        if (e.getSource()==bdeplacer){
            panel_Dessinable.removeListeners();
            if((panel_Dessinable.nbf )== 0){
                JOptionPane.showMessageDialog(panel_Dessinable,"Aucune figure à déplacer","Déplacement figure",0,deplacer);
            }
            panel_Dessinable.setCursorFeuilles(img_cur_depl,p_main,"deplacer");
            panel_Dessinable.activeManupulationSouris(TRANSLATION);
        }
        
        //Création de figures géométriques
        if (e.getSource()==b_formes){
            panel_Dessinable.setCursorFeuilles(img_cur_formes,p_cursor,"formes");
            panel_Dessinable.removeListeners();
            FabricantFigures ff;
            switch (panel_principale.getBarreOutils().getIndexComboFigure()){
            case 0 :
                f = new UnPolygone(panel_principale.getBarreOutils().getIndexComboCote());
                break ;
            case 1 : 
                f = new UnQuadrilatere(); 
                break ;
            case 2 : 
                f = new UnRectangle();              
                break ;
            case 3 : 
                f = new UnCarre();
                break ;
            case 4 : 
                f = new UnTriangle();
                break ;
            case 5:
                f = new UnCercle();
                break;
            }
            if (f != null ) {
                ff = new FabricantFigures( f);
                panel_Dessinable.addMouseListener( ff );
                f.changeCouleur(panel_principale.getBarreOutils().getCouleurFigure());
            }
            panel_Dessinable.repaint();
        }
        
        //Suppression d'une figure géométrique
        if(e.getSource()==b_supprimer){
            panel_Dessinable.activeManupulationSouris(SELECTIONFIGURE);
            panel_Dessinable.setCursorFeuilles(img_cur_supp,p_cursor,"suppression");
            if (panel_Dessinable.figureSelection() != null){
                panel_Dessinable.supprime();
            }
            else JOptionPane.showMessageDialog(panel_Dessinable,"Aucune figure selectionnée","Suppression",0,supprimer);
            panel_Dessinable.repaint();
        } 
        
        //Redimensionnement d'une figure
        if(e.getSource()==b_redimensionnement){
            if((panel_Dessinable.nbf )== 0){
                JOptionPane.showMessageDialog(panel_Dessinable,"Aucune figure à redimensionner","Redimensionnement",0,redimensionnement);
            }
            panel_Dessinable.activeManupulationSouris(REDIMENSIONNEMENT);
            panel_Dessinable.setCursorFeuilles(img_cur_select_anim,p_cursor,"suppression");
        }
    }//fin listener
    
    /**
     * Méthode permettant de remettre le curseur par défaut
     */
    public void setCursorDefault(){
        panel_Dessinable.changeCursor(c_default);
    }
    
    /**
     * Méthode créant des images icones à partir d'une image
     */
    private void creationImageIcon(){
        enregistrer = new ImageIcon("Icones/Enregistrer.gif");
        ouvrir = new ImageIcon("Icones/Ouvrir.gif");
        imprimer = new ImageIcon("Icones/Imprimer.gif");
        deplacer = new ImageIcon("Icones/Deplacer.gif");
        dessiner = new ImageIcon("Icones/Dessiner.gif");
        effacer = new ImageIcon("Icones/Effacer.gif");
        peinture = new ImageIcon("Icones/Peinture.gif");
        supprimer = new ImageIcon("Icones/Gomme.gif");
        formes = new ImageIcon("Icones/Formes.gif");
        redimensionnement = new ImageIcon("Icones/redimensionnement.jpg");
    }
    
    /**
     * Méthode créant des images icones à partir d'une image
     */
    private void creationImageIconCurseur(){
        img_cur_dess = new ImageIcon("Curseurs" + File.separator + "Dessiner.gif").getImage();
        img_cur_depl = new ImageIcon("Curseurs" + File.separator + "Main.gif").getImage();
        img_cur_supp = new ImageIcon("Curseurs" + File.separator + "Supprimer.gif").getImage();
        img_cur_formes = new ImageIcon("Curseurs" + File.separator + "Copier.gif").getImage();
        img_cur_select_anim = new ImageIcon("Curseurs" + File.separator + "SelectionAnim.gif").getImage();
    }
    
    /**
     * Méthode créant les boutons du menu
     */
    private void creationBouton(){
        b_enregistrer = createButton(enregistrer,"Enregistrement d'un document");
        b_redimensionnement = createButton(redimensionnement,"Redimensionner une figure");
        b_imprimer= createButton(imprimer,"Imprimer le dessin courant");
        b_ouvrir = createButton(ouvrir,"Ouvrir un document existant");
        bdeplacer = createButton(deplacer,"Déplacement d'une figure");
        b_dessiner = createButton(dessiner,"Tracer à main levée");
        b_supprimer=createButton(supprimer,"Supprimer une figure");
        b_formes=createButton(formes,"Création d'une figure");
    }
    
    /**
     * Méthode permettant de créer des boutons iconisés
     * @param icon image icone représenetant le bouton
     * @param nom indique l'action du bouton
     * @return JButton un bouton iconisée
     */
    private JButton createButton(ImageIcon icon, String nom) {
        JButton j = new JButton(icon);
        Dimension d = new Dimension(icon.getIconWidth(), icon.getIconHeight());
        j.setMaximumSize(d);
        j.addActionListener(this);
        j.setToolTipText(nom);
        return j;
    }
    
    /**
     * 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));
    }
}
