import java.awt.event.*;
import java.awt.*;
import java.lang.Math;

/**
* <strong> Clase que implementa el ActionListener para
* el dibujo de un Rectangulo.<strong>
*/
class RectangleCreationHandler implements ActionListener
{
  private Dibujo dibujo;
  private Rectangulo rectangulo;
/**
* estado permite saber a que nivel de la creacion del circulo estamos.
* estado ==INICIAL : el utilisador seleccionó Circulo en el Menu Crear
* pero no presionó el Mouse sobre la pantalla todavia.
* estado ==FINAL : el utilisador presionó el Mouse y fijó el centro del circulo.
*/
  private int estado;
/**
* Primera esquina del Rectangulo (arriba izquierda), es el punto en la pantalla
* donde el utilisador presionó el Mouse después de haber seleccionado
* CrearCirculo en el Menu.
*/
  private Point firstCorner;
/**
* Punto donde se ubica el Mouse cuando el utilisador "drag"  o deja de
* presionar el Mouse para extender el Rectangulo, es igual a la tercera
* esquina delRectangulo.
*/
  private Point thirdCorner;
  private static final int INICIAL = 0;
  private static final int FINAL = 1;

/**
* Construye un RectangleCreationHandler que permite actuar sobre el
* Dibujo dado en parametro.
* @param dib Dibujo sobre lo cual RectangleCreationHandler va a actuar.
*/
public RectangleCreationHandler(Dibujo dib)
{
dibujo = dib;
estado = INICIAL;
}

/**
* 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 RectangleCreationHandler.
* Despues del llamado a este metodo estado == INICIAL.
* @param e ActionEvent que produzcó el llamado a este metodo.
*/
public void actionPerformed(ActionEvent e)
 {
      dibujo.changeMouseListener(new MouseHandler());
      dibujo.changeMouseMotionListener(new MouseMotionHandler());
      estado = INICIAL;
 }

/**
* Clase que maneja los eventos del Mouse después que el utilisador
* haya seleccionado Crear Rectangulo en el menu.  
*/
class MouseHandler extends MouseAdapter
  {
/**
* Cuando el utilisador presiona el Mouse en la pantalla, se graba
* las coordenadas del punto como las de la primera esquina del Rectangulo.
* Despues del llamado a este metodo estado == FINAL.
* @param event Evento que produzcó el llamado a este metodo.
*/
    public void mousePressed(MouseEvent event)
      {
        if (estado == INICIAL)
        {
          firstCorner = new Point(event.getPoint());
          rectangulo = new Rectangulo(firstCorner, 0, 0);
          dibujo.incorpore(rectangulo);
          estado = FINAL;
          dibujo.repaint();
        }
      }

/*
* Cuando el utilisador deja de presionar el Mouse, se considera que
* el Rectangulo está terminado y se vuelve al estado inicial.
* @param event Evento que produzcó el llamado a este metodo.
*/
    public void mouseReleased(MouseEvent event)
      {
        estado = INICIAL;
      }
  }


/**
* Clase que maneja los eventos de Movimiento del Mouse después que el utilisador
* haya seleccionado Crear Rectangulo en el menu.  
*/
  class MouseMotionHandler extends MouseMotionAdapter
  {


/**
* Cuando el utilisador "drag" el Mouse, la tercera esquina del Rectangulo
* (abajo derecha)se vuelve igual a la posición actual del Mouse.
* @param event Evento del Mouse que produzcó el llamado a este metodo.
*/
    public void mouseDragged(MouseEvent event)
      {
        if (estado == FINAL)
        {
          thirdCorner = new Point(event.getPoint());
          rectangulo.setThirdCorner(thirdCorner);
          dibujo.repaint();
        }
      }
  }  
}



