//EscalarHandler.java

import java.awt.event.*;
import java.awt.*;
/**Clase que maneja las excepciones al tratar de escalar una forma.
 * @author Luis Espinoza Severino.
 */
class EscalarHandler implements ActionListener
{
   private EditorPanel panel;
   private Point ancla;
   private double largoReferencia;
   private Cruz cruz;
   private int state;
   private Forma forma;
   private static final int INICIO_NUEVO_ESCALAMIENTO=0;
   private static final int FORMA_SELECCIONADA=1;
   private static final int ANCLA_FIJADA=2;
   private static final int TERMINO_ESCALAMIENTO=3;
   
   public EscalarHandler(EditorPanel panel)
     {
	this.panel = panel;
	cruz= new Cruz();
     }
   
   public void actionPerformed(ActionEvent e)
     {
	panel.changeMouseListener(new MouseHandler());
	panel.changeMouseMotionListener(new MouseMotionHandler());
	state = INICIO_NUEVO_ESCALAMIENTO;
	panel.manipulating();
     }
   
   class MouseHandler extends MouseAdapter
     {	
	public void mouseClicked(MouseEvent event)
	  {
	     if (state == INICIO_NUEVO_ESCALAMIENTO)
	       {
		  Point punto=event.getPoint();
		  forma=(Forma)panel.find(punto);	
		  
		  if(forma!=null)
		    {
		       state=FORMA_SELECCIONADA;
		       panel.nomanipular();
		       forma.setManipulable(true);
		       panel.repaint();
		    }
	       }
	     
	     else if(state==FORMA_SELECCIONADA)
	       {
		  ancla = event.getPoint();
		  panel.remueva(cruz);
		  cruz.setPoint(ancla);
		  panel.incorpore(cruz);
		  state = ANCLA_FIJADA;
	       }
	  }
	
	public void mousePressed (MouseEvent event)
	  {
	     if (state==ANCLA_FIJADA) 
	       {
		  Point p = event.getPoint();
		  double x = p.getX()-ancla.getX();
		  double y = p.getY()-ancla.getY();
		  largoReferencia= Math.sqrt(x*x+y*y);
	       }
	     if (state==TERMINO_ESCALAMIENTO)
	       {
		  state = INICIO_NUEVO_ESCALAMIENTO;
		  panel.manipulating();
	       }
	  }
	
	public void mouseReleased(MouseEvent event)
	  {
	     if (state==ANCLA_FIJADA)
	       {
		  panel.remueva(cruz);
		  state = TERMINO_ESCALAMIENTO;
	       }
	  }
     }
   
   class MouseMotionHandler extends MouseMotionAdapter
     {
	public void mouseDragged(MouseEvent event)
	  {
	     if (state == ANCLA_FIJADA) 
	       {
		  Point p = event.getPoint();
		  double x = p.getX()-ancla.getX();
		  double y = p.getY()-ancla.getY();
		  double distanciaAlAncla = Math.sqrt(x*x+y*y);
		  double factorEscala=distanciaAlAncla/largoReferencia;
		  forma.escalar(ancla, factorEscala);
		  largoReferencia= distanciaAlAncla;
		  panel.repaint();
	       }
	  }
     }  
}
