import java.awt.event.*;
import java.awt.*;

/**
* <strong> Clase que implementa el ActionListener para
* el desplazamiento de Figuras Geométricas.<strong>
*/
public class TranslationHandler implements ActionListener
{
  private Dibujo dibujo;
 /**
 * estado permite saber a que nivel del desplazamiento estamos.
 * estado == INICI0_NUEVO_DESPLAZAMIENTO : el utilisador seleccionó Trasladar
 * en el Menu Manipular.
 * pero no presionó el Mouse adentro de un cuadradito verde de la figura
 * seleccionada todavía.
 * estado == TERMINO_DESPLAZAMIENTO : el utilisador presionó el Mouse adentro
 * de un cuadradito verde de la figura seleccionada y está desplazando la
 * Figura "drageando" el Mouse.
 */
  private int estado = -1;
  /**
  * Punto donde está el Mouse cuando se llama el Metodo mouseDragged de la
  * clase interna MouseMotionHandler.
  */
  private Point current;
  /**
  * Punto donde estaba el Mouse la ultima vez que se llamó el Metodo
  * mouseDragged de la clase interna MouseMotionHandler.
  */
  private Point lastCurrent;
  private static final int INICIO_NUEVO_DESPLAZAMIENTO = 0;
  private static final int TERMINO_DESPLAZAMIENTO = 1;

/**
* Construye un TranslationHandler que permite actuar sobre el
* Dibujo dado en parametro.
* @param dib Dibujo sobre lo cual TranslationHandler va a actuar.
*/
 public TranslationHandler(Dibujo dib)
    {
     dibujo = dib;
    }
/**
* Metodo que cambia los MouseListener y MouseMotionListener asociados al
* Dibujo cuando el utilisador executa un acción.
* Los nuevos MouseListener y MouseMotionListener asociados al dibujo son
* respectivamente, después del llamado a este metodo, MouseHandler y
* MouseMotionHandler, clases internas a TranslationHandler.
* Después del llamado a este metodo estado == INICIO_NUEVO_DESPLAZAMIENTO.
* @param e ActionEvent que produzcó el llamado a este metodo.
*/ 
 public void actionPerformed(ActionEvent e)
    { 
      dibujo.changeMouseListener(new MouseHandler());
      dibujo.changeMouseMotionListener(new MouseMotionHandler());
      estado = INICIO_NUEVO_DESPLAZAMIENTO;
    }
 
/**
* Clase interna que maneja los eventos del Mouse después que el utilisador
* haya seleccionado Manipular Trasladar en el menu.  
*/
class MouseHandler extends MouseAdapter
 {
 
/**
* Cuando el utilisador presiona el Mouse , se revisa si el Mouse está
* en un cuadradito verde de la figura seleeccionada, si es el caso
* (estado = TERMINO_DESPLAZAMIENTO).
* utilisador presionó el Mouse y el horizontal, para definir anguloReferencia.
* Se define "current" y "lastcurrent" como el punto donde está el Mouse. 
* @param event Evento que produzcó el llamado a este metodo.
*/
public void mousePressed(MouseEvent event)
{
       if (estado == INICIO_NUEVO_DESPLAZAMIENTO)
         {
         lastCurrent = new Point(event.getPoint());
         current = new Point(event.getPoint());
         if (dibujo.isItInAGreenSquare(current))
         estado = TERMINO_DESPLAZAMIENTO;
         }
}

/**
* Metodo que escucha cuando el utilisador deja de presionar el Mouse.
* Si una figura estaba seleccionada, la figura se traslada a la
* posicion actual del Mouse.
* Después del llamado a este metodo (estado = INICIO_NUEVO_DESPLAZAMIENTO).
* @param event Evento que llamo a este metodo.
*/   
public void mouseReleased(MouseEvent event)
{
  double x, y;
        if (estado == TERMINO_DESPLAZAMIENTO)
         {
         current.X = (double)(event.getPoint()).getX();
         current.Y = (double)(event.getPoint()).getY();
         x = current.X - lastCurrent.X;
         y = current.Y - lastCurrent.Y;
         dibujo.trasladar(x, y);
         estado =  INICIO_NUEVO_DESPLAZAMIENTO;
         }
}
  }


/**
* Clase interna que implementa el MouseMotionListener asociado
* a dibujo y que maneja el desplazamiento de figuras geométrica.
*/ 
class MouseMotionHandler extends MouseMotionAdapter
{

/**
* Metodo que escucha cuando el utilisador "drag" el Mouse.
* Si una figura está seleccionada, la figura se traslada a la
* posicion actual del Mouse.
* @param event Evento que llamo a este metodo.
*/
public void mouseDragged(MouseEvent event)
      {
       if (estado == TERMINO_DESPLAZAMIENTO)
         {
         current.X = (double)(event.getPoint()).getX();
         current.Y = (double)(event.getPoint()).getY();
         dibujo.trasladar((current.X - lastCurrent.X),
         (current.Y - lastCurrent.Y));
         lastCurrent.X = current.X;
         lastCurrent.Y = current.Y;
         }
      }
  }  
}




