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

/**
 * Clase TrasladarHandler
 * Implementa los listeners necesarios para trasladar las formas en el circuito.
 * @author Patricio A. Castillo Pizarro - Eric C. Maldonado Olguin
 * @version 1.4 - May 18th, 2007
 */
class TrasladarFiguras implements ActionListener
{
    private EditorPanel panel;
    private boolean active;
    private Forma forma;
    private Point previo;
    private ArrayList<Forma> figuras;
    
    /**
     * Constructor.
     * @param p Panel en que se efectua la traslacion.
     */
    public TrasladarFiguras(EditorPanel p)
    {
        panel = p;
        active=false;
        figuras = new ArrayList<Forma>();
    }
    
    /**
     * Implementa los listeners necesarios para modificar la forma en el circuito.
     * @param e Parametro que indica el estado del evento
     */
    public void actionPerformed(ActionEvent e)
    {
        panel.changeMouseListener(new MouseHandler());
        panel.changeMouseMotionListener(new MouseMotionHandler());
        panel.manipulating();
        active=false;
    }
    
    /**
     * Clase interna que contiene los metodos de MouseListener
     */
    class MouseHandler extends MouseAdapter
    {
        /**
         * Metodo que define las acciones a realizar cuando se presiona el boton del mouse.
         * La forma seleccionada sera trasladada a partir de la posicion en que el mouse comienza el movimiento.
         * @param event Parametro que indica la accion realizada por el mouse
         */
        public void mousePressed (MouseEvent event)
        {
            Point punto = event.getPoint();
            forma = (Forma)panel.find (punto);
             
            if(forma != null)
            {	
                 Forma f;
                 figuras=panel.getFiguras();
                 for(int i=0; i<figuras.size(); i++){
                  f=(Forma)figuras.get(i);
                  //if(punto.getY()<=f.centro_forma.getY())
                  f.selected = true;
                 }
                 
                forma.selected = true;
                
                active = true;
                int x = punto.x;
                int y = punto.y;
                //Se discretiza la posicion que puede adoptar el punto inicial de traslacion facilitar el manejo de la forma
                x = x / 50;
                y = y / 50;
                punto.setLocation (x*50, y*50);
                previo = punto;
                panel.repaint();
            }
        }
        
        /**
         * Metodo que define las acciones a realizar cuando se suelta el boton del mouse.
         * La forma deja de ser trasladada.
         * @param event Parametro que indica la accion realizada por el mouse
         */
        public void MouseReleased (MouseEvent event)
        {
            //forma.selected = false;
            
            Forma f;
            figuras=panel.getFiguras();
                    for(int i=0; i<figuras.size(); i++){
                     f=(Forma)figuras.get(i);
                    
                     f.selected = false;
                    }
                     
            active = false;
            panel.repaint();
        }
    }
    
    /**
     * Clase interna que contiene los metodos de MouseMotionListener
     */
    class MouseMotionHandler extends MouseMotionAdapter
    {
        /**
         * Metodo que define las acciones a realizar cuando se matiene presionado el boton del mouse mientras se mueve.
         * La forma seleccionada es trasladada segun los movimientos del mouse.
         * @param event Parametro que indica la accion realizada por el mouse
         */
        public void mouseDragged(MouseEvent event)
        {
            Point p;
            if(active)
            {
                p = event.getPoint();
                int deltaX = p.x - previo.x;
                int deltaY = p.y - previo.y;
                //Se discretizan los movimientos del mouse para facilitar el manejo de la forma
                if (Math.abs(deltaX)>9)
                {
                    int x = deltaX / 50;
                    
                    Forma f;
                    figuras=panel.getFiguras();
                    for(int i=0; i<figuras.size(); i++){
                     
                     f=(Forma)figuras.get(i);
                     //if(p.y<f.centro_forma.y)
                     f.trasladar(x*50,0);
                     
                    }
                    
                    //forma.trasladar(x*50,0);
                   
                    previo.setLocation (previo.getX()+x*50, previo.getY());
                    
                    panel.repaint();
                }
                if (Math.abs(deltaY)>9)
                {
                    int y = deltaY / 50;
                    
                    Forma f;
                    figuras=panel.getFiguras();
                    for(int i=0; i<figuras.size(); i++){
                    f=(Forma)figuras.get(i);
                    //if(p.getY()<f.centro_forma.getY())
                    //if(p.getY()<300)
                    f.trasladar(0,y*50);
                    }
                   
                   
                   // forma.trasladar(0, y*50);
                    
                   
                    previo.setLocation (previo.getX(), previo.getY()+y*50);
                    panel.repaint();
                }
            }
        }
        
        /**
         * Metodo que define las acciones a realizar cuando se mueve el mouse.
         * Entrega la posicion del mouse a medida que se mueve en el circuito.
         * @param event Parametro que indica la accion realizada por el mouse
         */
            public void mouseMoved(MouseEvent event)
            {
                Point p = event.getPoint();
                forma = (Forma)panel.find(p);
            }
    }
}
//Fin clase TrasladarHandler
