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 LineCreationHandler implements ActionListener
{
  private Linea linea;
  private Dibujo dibujo;
 /**
 * estado permite saber a que nivel de la creacion de la Linea estamos.
 * estado ==INICIAL : el utilisador seleccionó Linea en el Menu Crear
 * pero no presionó el Mouse sobre la pantalla todavia.
 * estado ==FINAL : el utilisador presionó el Mouse y fijó el primer punto
 * de la Linea.
 */
  private int estado;
  /**
  * Primer punto de la Linea, es el punto en la pantalla donde el utilisador
  * presionó el Mouse después de haber seleccionado Crear Linea en el Menu.
  */
  private Point firstPoint;
  /**
  * Punto donde se ubica el Mouse cuando el utilisador "drag" o deja de
  * presionar el Mouse para extender la Linea, es igual al secundo punto
  * de la Linea.
  */
  private Point secondPoint;
  private static final int INICIAL = 0;
  private static final int FINAL = 1;
  
/**
* Construye un LineCreationHandler que permite actuar sobre el
* Dibujo dado en parametro.
* @param dib Dibujo sobre lo cual LineCreationHandler va a actuar.
*/

public LineCreationHandler(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 LineCreationHandler.
* 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 Linea 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 primer punto de la Linea.
* 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)
        {
          firstPoint = new Point(event.getPoint());
          linea = new Linea(firstPoint, firstPoint);
          dibujo.incorpore(linea);
          estado = FINAL;
          dibujo.repaint();
        }
      }

/*
* Cuando el utilisador deja de presionar el Mouse, se considera que
* la Linea está terminada 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 Linea en el menu.  
*/
  class MouseMotionHandler extends MouseMotionAdapter
  {
/**
* Cuando el utilisador "drag" el Mouse, el secundo punto de la Linea
* 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)
        {
          secondPoint = new Point(event.getPoint());
          linea.setSecondPoint(secondPoint);
          dibujo.repaint();
        }
      }
  }
  
 
    
}



