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

/**
* <strong> Clase que implementa el ActionListener para
* el dibujo de un Circulo.<strong>
*/
class CircleCreationHandler implements ActionListener
{
  private Dibujo dibujo;
  private Circulo circulo;
  /**
  * 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;
  /**
  * Centro del circulo, es el punto en la pantalla donde el utilisador
  * presionó el Mouse después de haber seleccionado CrearCirculo en el Menu.
  */
  private Point center;
  /**
  * Punto donde se ubica el Mouse cuando el utilisador "drag" o deja de
  * presionar el Mouse para extender el radio.
  */
  private Point current;
  private static final int INICIAL = 0;
  private static final int FINAL = 1;
  
/**
* Construye un CircleCreationHandler que permite actuar sobre el
* Dibujo dado en parametro.
* @param dib Dibujo sobre lo cual CircleCreationHandler va a actuar.
*/
public CircleCreationHandler(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 CircleCreationHandler.
* 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 Circulo en el menu.  
*/
class MouseHandler extends MouseAdapter
  {
/**
* Cuando el utilisador presiona el Mouse en la pantalla, se graba
* las coordenadas del punto como las del centro del Circulo.
* 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)
        {
          center = new Point(event.getPoint());
          circulo = new Circulo(center, 0);
          dibujo.incorpore(circulo);
          estado = FINAL;
          dibujo.repaint();
        }
      }
/*
* Cuando el utilisador deja de presionar el Mouse, se considera que
* el Circulo 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 Circulo en el menu.  
*/
  class MouseMotionHandler extends MouseMotionAdapter
  {
/**
* Cuando el utilisador "drag" el Mouse, se extiende el radio del Circulo a
* la distancia que separa el centro del Circulo y el punto donde se ubica
* el Mouse. 
*@param event Evento del Mouse que produzcó el llamado a este metodo.
*/
    public void mouseDragged(MouseEvent event)
      {
        if (estado == FINAL)
        {
          current = new Point(event.getPoint());
          circulo.setRadio(new Linea(center, current).getDistancia());
          dibujo.repaint();
        }
      }
  }  
}



