package Capitulo_6.Dibujo2;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class MiPaint extends JFrame{
    private Botones misBotones;
    private SeleccionPanel miSeleccion;
    private Lienzo miLienzo;
    public int botonPrecionado;
    public int seleccion;
    public Color unColor;
    
    private List <Figura> misFiguras;
    private Figura unaFigura; 
      
    public MiPaint() {
        JPanel AreaControl = new JPanel(new GridLayout(2,1));
        misBotones = new Botones("Figuras", 
                new String[] {"Linea", "Cuadro", "Rectangulo", "Circulo", 
                "Elipse"}, 5);
        miSeleccion = new SeleccionPanel("Colores", 
                new String[] {"Negro", "Rojo", "Azul", "Verde", "Gris"}, 5);
        
        AreaControl.add(misBotones);
        AreaControl.add(miSeleccion);
        
        miLienzo = new Lienzo();
        this.add(AreaControl, BorderLayout.WEST);
        this.add(miLienzo, BorderLayout.EAST);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        botonPrecionado = 0;
        seleccion = 0;
        misFiguras = new ArrayList();
        unaFigura = null;
            
        pack();
        this.setVisible(true);
    }
    
    private class Botones extends JPanel implements ActionListener{
        private String nombres[];

        public Botones(String unTitulo, String unNombre[], int N) {
            super(new GridLayout(N/2, 2) );
            int i;

            nombres = new String[N];

            for(i=0; i<N; i++)
                nombres[i] = unNombre[i];

            this.setBackground(Color.lightGray);
            this.setBorder(BorderFactory.createTitledBorder(unTitulo));
            JButton b;

            for(i=0; i<N; i++) {
                b = new JButton(unNombre[i]);
                b.addActionListener(this);
                this.add(b);
            }
        }

        public void actionPerformed(ActionEvent arg0) {
            int i;

            for(i=0; i<nombres.length; i++) {
                if(nombres[i].equals(arg0.getActionCommand())){
                    botonPrecionado = i;
                    break;
                }
            }
        }
    }
    
    private class SeleccionPanel extends JPanel implements ActionListener{
        private String nombres[];

        public SeleccionPanel(String Nombre, String[] opciones, int N) {
            super(new GridLayout(N/2, 2));
            int i;
            nombres = new String[N];

            for(i=0; i<N; i++)
                nombres[i] = opciones[i];

            this.setBackground(Color.lightGray);
            this.setBorder(BorderFactory.createTitledBorder(Nombre));
            ButtonGroup group = new ButtonGroup();
            JRadioButton option;

            for(i=0; i<N; i++) {
                option = new JRadioButton(opciones[i]);
                option.addActionListener(this);
                group.add(option);
                add(option);
            }
        }

        public void actionPerformed(ActionEvent arg0) {
            int i;

            for(i=0; i<nombres.length; i++) {
                if(nombres[i].equals(arg0.getActionCommand())){
                    seleccion = i;
                    break;
                }
            }
        }
    }
    
    private class Lienzo extends JPanel implements MouseMotionListener, MouseListener{
        private int x0, y0, x1, y1;

        public Lienzo() {
            this.setBackground(Color.WHITE);
            this.setPreferredSize(new Dimension(400, 400));
            this.addMouseListener(this);
            this.addMouseMotionListener(this);
        }

        @Override
        public void paint(Graphics g ) {
            super.paint(g);
            
            if(unaFigura != null) unaFigura.dibuja(g);
            
            for(Figura a: misFiguras)
                a.dibuja(g);
        }

        public void mouseDragged(MouseEvent arg0) { 
            x1 = arg0.getX();
            y1 = arg0.getY();
            unaFigura.set(x0, y0, x1, y1, unColor);
            
            repaint();
        }
        
        public void mouseMoved(MouseEvent arg0) {
        }
        
        public void mouseClicked(MouseEvent arg0) {
        }
        
        public void mousePressed(MouseEvent arg0) {
            switch(seleccion){
                case 0 : unColor = Color.BLACK; break;
                case 1 : unColor = Color.RED; break;
                case 2 : unColor = Color.BLUE; break;
                case 3 : unColor = Color.GREEN; break;
                case 4 : unColor = Color.GRAY; break;
                default : unColor = Color.MAGENTA;
            }
            
            switch (botonPrecionado) {
                case 0 : unaFigura = new Linea(); break;
                case 1 : unaFigura = new Cuadro(); break;
                case 2 : unaFigura = new Rectangulo(); break;
                case 3 : unaFigura = new Circulo(); break;
                default : unaFigura = new Linea(); break;
            }
            
            x0 = arg0.getX();
            y0 = arg0.getY();
        }
        
        public void mouseReleased(MouseEvent arg0) {
            misFiguras.add(unaFigura);
            repaint();
        }
        
        public void mouseEntered(MouseEvent arg0) {
        }
        
        public void mouseExited(MouseEvent arg0) {
        }
    }
    
    static public void main(String args[]) {
        new MiPaint();
    }

}
