import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

/**
* <strong> Clase que implementa el Frame del editor de Figuras geométricas.
* <strong>
*/
public class EditorFrame extends JFrame
{
/**
* Punto en la pentalla donde el utilisador cliquea despues de haber
* presionado la tecla ESC.
*/
private Point click;
/**
* Punto en el pentalla donde está el Mouse cuando el utilisador hace un
* "mouseDragged"..
*/
private Point currentPoint;
/**
* Permite saber si hay o no una figura seleccionada.
*/
private int estado = -1;
/**
* Constante usada para señalar que una figura está seleccionada.
*/
private static final int SELECTION = 0;
/**
* Constante usada para señalar que ninguna figura está seleccionada.
*/
private static final int NO_SELECTION = -1;
/**
* Constante usada para definir el codigo ASCII de la tecla ESC.
*/
private static final int TECLA_ESC = 27;

/**
* Construye el Frame que contiene un Menu y un Dibujo.
*/
public EditorFrame()
 {
 setTitle("Editor de Figuras");
 Dibujo dibujo = new Dibujo();
 dibujo.requestFocus();
 JMenuBar menuBar = new MiMenuBar(dibujo);
 setJMenuBar(menuBar);
 Container contentPane = getContentPane();
 contentPane.add(dibujo);
 pack();
 addKeyListener(new KeyHandler(dibujo));
 }

/**
*Clase interna que implementa el KeyListener asociado a EditorFrame.
*/
private class KeyHandler  extends KeyAdapter
{ 
private Dibujo dibujo;

/**Constructor
* Construye un KeyHandler que permite actuar sobre el Dibujo dado en parametro.
* @param dib Dibujo sobre lo cual KeyHandler puede actuar.
*/
public KeyHandler(Dibujo dib)
{
dibujo = dib;
}

/**
* Metodo que escucha las teclas presionadas por el utilisador y que actua en
* función.
* Cuando el utilisador presiona la tecla ESC, los MouseListener y
* MouseMotionListener asociados a dibujo cambian.
* Los nuevos Listener asociados a dibujo son SelectHandler y
* SelectMotionHandler,
* clases internas de EditorFrame.
*/
public void keyTyped(KeyEvent event)
{
    if (event.getKeyChar() == TECLA_ESC) 
     {
      dibujo.changeMouseListener(new SelectHandler(dibujo));
      dibujo.changeMouseMotionListener(null);
     }
} 
  
}


/**
* Clase interna que implementa elMouseListener asociado
* a dibujo y que maneja la seleccion de figuras geométrica.
*/
private class SelectHandler extends MouseAdapter
{
 private Dibujo dibujo;

/**Constructor
* Construye un SelectHandler que permite actuar sobre el Dibujo dado en
* parametro.
* @param dib Dibujo sobre lo cual el SelectHandler puede actuar.
*/
public SelectHandler(Dibujo dib)
 {
 dibujo = dib;
 }

/**
* Metodo que escucha cuando el utilisador pressiona el Mouse
* y que revisa si una figura fue seleccionada.
* @param event Evento que llamo a este metodo.
*/
public void mousePressed(MouseEvent event)
      {
      click = new Point(event.getPoint());
      if (dibujo.isAComponentSelected(click)) estado = SELECTION;
      else estado = NO_SELECTION;
      }
}

}

