/*
 * Fichero: ArrastrarGrafico.java
 * Autor: Chuidiang
 * Fecha: 6/06/07 21:40
 */
package chuidiang.ejemplos.arrastrar_grafico;

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import java.util.LinkedList;


/**
 * Ejemplo de gráfico que se puede arrastrar con el ratón.
 *
 @author Chuidiang
 *
 */
public class LienzoParaArrastrarFiguras extends Canvas implements MouseMotionListener
{
    /**
     * serial uid
     */
    private static final long serialVersionUID = -4273648398171436938L;

    /** 
     * Lista de figuras a dibujar.
     */
    private LinkedList<InterfaceFigura> listaFiguras = new LinkedList<InterfaceFigura>();

    /**
     * Si actualmente se está arrastrando o no el rectángulo.
     */
    private InterfaceFigura figuraArrastrandose = null;

    /**
     * x en la que estaba anteriormente el ratón.
     */
    private int xAnteriorRaton;

    /**
     * y en la que estaba anteriormente el ratón
     */
    private int yAnteriorRaton;

    /**
     * Crea un nuevo objeto ArrastrarGrafico.
     */
    public LienzoParaArrastrarFiguras()
    {
        addMouseMotionListener(this);
    }

    /**
     * Añada una figura a la lista de figuras a dibujar
     *
     @param figura Una nueva figura a dibujar
     */
    public void addFigura(InterfaceFigura figura)
    {
        listaFiguras.add(figura);
    }

    /**
     * Quita la figura en la lista de figuras a dibujar.
     *
     @param figura figura a quitar de la lista.
     */
    public void removeFigura(InterfaceFigura figura)
    {
        listaFiguras.remove(figura);
    }

    /**
     * Para darle un tamaño por defecto al Canvas de dibujo
     *
     @return Dimension por defecto.
     */
    @Override
    public Dimension getPreferredSize()
    {
        return new Dimension(500500);
    }

    /**
     * Dibuja el rectángulo en la posición indicada por por xRectangulo e
     * yRectangulo.
     *
     @param g Graphics con el que dibujar.
     */
    @Override
    public void paint(Graphics g)
    {
        for (InterfaceFigura figura : listaFiguras)
        {
            figura.dibujate(g);
        }
    }

    /**
     * Método al que se llama cuando se arrastra el ratón.
     * Se comprueba con el atributo arrastrando si está empezando el arrastre o
     * ya se esta en medio del mismo.
     * Si se comienza el arrastre, se guardan las coordenadas del ratón que
     * vienen en el evento MouseEvent y se cambia el valor del atributo arrastrando.
     * Si se está en medio de un arrastre, se calcula la nueva posición del
     * rectángulo y se llama al método repaint() para que se pinte.
     *
     @param e Evento del ratón
     */
    public void mouseDragged(MouseEvent e)
    {
        // Si comienza el arrastre ...
        if (figuraArrastrandose == null)
        {
            // Se guardan las posiciones del ratón
            xAnteriorRaton = e.getX();
            yAnteriorRaton = e.getY();
            // y se marca que ha comenzado el arrastre.
            figuraArrastrandose = dameFigura(e);
        }
        else
        {
            // Si ya había empezado el arrastre, se calculan las nuevas
            // coordenadas del rectángulo
            figuraArrastrandose.setPosicion(
                figuraArrastrandose.getX() (e.getX() - xAnteriorRaton),
                figuraArrastrandose.getY() (e.getY() - yAnteriorRaton));

            // Se guarda la posición del ratón para el siguiente cálculo
            xAnteriorRaton = e.getX();
            yAnteriorRaton = e.getY();

            // y se manda repintar el Canvas
            repaint();
        }
    }

    /**
     * Para ver si el ratón está dentro del rectángulo.
     * Si está dentro, puede comenzar el arrastre.
     *
     @param e El evento de ratón
     *
     @return true si el ratón está dentro del rectángulo
     */
    private InterfaceFigura dameFigura(MouseEvent e)
    {
        for (InterfaceFigura figura : listaFiguras)
        {
            if (figura.estaDentro(e.getX(), e.getY()))
            {
                return figura;
            }
        }

        return null;
    }

    /**
     * El ratón se mueve sin arrastrar. Se marca fin de arrastre.
     *
     @param e E
     */
    public void mouseMoved(MouseEvent e)
    {
        figuraArrastrandose = null;
    }
}