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

/**
* <strong> Clase que implementa el ActionListener para
* el dibujo de un Triangulo.<strong>
*/
class TriangleCreationHandler implements ActionListener
{
  private Dibujo dibujo;
  private Triangulo triangulo;
  
 /**
 * estado permite saber a que nivel de la creacion del Triangulo estamos.
 * estado == INICIAL : el utilisador seleccionó Triangulo en el Menu Crear
 * pero no presionó el Mouse sobre la pantalla todavia.
 * estado == CURRENT : el utilisador presionó el Mouse, fijó la primer esquina
 * y está "drageando" el Mouse para extender el primer lado del Triangulo.
 * estado == FINAL : el utilisador dejó de presionar el Mouse, fijó la secunda
 * esquina del Triangulo y le queda la ultima esquina a fijar presionando
 * el Mouse.
 */
  private int estado;
  /**
  * Primera esquina del Triangulo, es el punto en la pantalla donde el
  * utilisador presionó el Mouse despues de haber seleccionado Crear Triangulo
  * 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 primer lado del Triangulo.
  */
  private Point secondCorner;
  
   /**
  * Tercera esquina del Triangulo, es el punto en la pantalla donde el
  * utilisador presionó el Mouse despues de haber fijado las dos primeras
  * esquinas.
  */
  private Point thirdCorner;
  private static final int INICIAL = 0;
  private static final int CURRENT = 1;
  private static final int FINAL = 2;
  
/**
* Construye un TriangleCreationHandler que permite actuar sobre el
* Dibujo dado en parametro.
* @param dib Dibujo sobre lo cual TriangleCreationHandler va a actuar.
*/
public TriangleCreationHandler(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, despues del llamado a este metodo, MouseHandler y
* MouseMotionHandler, clases internas a TriangleCreationHandler.
* 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 despues que el utilisador
* haya seleccionado Crear Triangulo 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 primer esquina del 
* Triangulo.
* Despues del llamado a este metodo estado == CURRENT.
* @param event Evento que produzcó el llamado a este metodo.
*/
    public void mousePressed(MouseEvent event)
      {
        if (estado == INICIAL)
        {
          firstCorner = new Point(event.getPoint());
          triangulo = new Triangulo(firstCorner, firstCorner, firstCorner);
          dibujo.incorpore(triangulo);
          estado = CURRENT;
          dibujo.repaint();
        }
      }
/**
* Cuando el utilisador deja de presionar el Mouse, si el estado previo era 
* CURRENT entonces estado = FINAL o si el estado previo era FINAL entonces
* estado = INICIAL.
* @param event Evento que produzcó el llamado a este metodo.
*/
    public void mouseReleased(MouseEvent event)
      {
        if (estado == FINAL) estado = INICIAL;
        if (estado == CURRENT)estado = FINAL;
      }
  }

/**
* Clase que maneja los eventos de Movimiento del Mouse despues que el utilisador
* haya seleccionado Crear Triangulo en el menu.  
*/
  class MouseMotionHandler extends MouseMotionAdapter
  {
 /**
* Cuando el utilisador "drag" el Mouse, se desplaza la secunda esquina
* al lugar donde está el Mouse y se extiende el primer lado del Triangulo
* es decir la distancia que separa la primera y la secunda esquina del
* Triangulo.
* @param event Evento del Mouse que produzcó el llamado a este metodo.
*/
    public void mouseDragged(MouseEvent event)
      {
        if (estado == CURRENT)
        {
          secondCorner = new Point(event.getPoint());
          triangulo.setSecondCorner(secondCorner);
          dibujo.repaint();
        }
      }
 /**
* Cuando el utilisador desplaza el Mouse, se desplaza la tercera esquina
* al lugar donde se ubica el Mouse.
* @param event Evento del Mouse que produzcó el llamado a este metodo.
*/
  public void mouseMoved (MouseEvent event)
  {
     if (estado == FINAL)
     {
      thirdCorner = new Point(event.getPoint());
      triangulo.setThirdCorner(thirdCorner);
      dibujo.repaint();
     }
  }  


}
}
