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

/**
 * Clase HandlerTrasladarMostrar
 * Implementa los listeners necesarios para trasladar las formas
 * y mostrar sus datos.
 * Se Traslada al mantener presionado el mouse sobre un bloque.
 * Se muestran los datos al hacer click sobre una forma.
 * 
 * @author Patricio A. Castillo Pizarro - Eric C. Maldonado Olguin
 * @version 2.0 - Jun 26th, 2007
 */
class HandlerTrasladarMostrar implements ActionListener
{
    private EditorPanel panel;
    private boolean active;
    private Forma forma;
    private Point previo;
    
    /**
     * Constructor.
     * @param p Panel en que se efectuan las operaciones.
     */
    public HandlerTrasladarMostrar(EditorPanel p)
    {
        panel = p;
        active=false;
    }
    
    /**
     * Implementa los listeners necesarios para modificar la forma.
     * @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 hace un
         * click con el mouse.
         * @param event Parametro que indica la accion realizada por el mouse
         */
        public void mouseClicked(MouseEvent event)
        {
                Point punto = event.getPoint();
                
                forma = (Forma)panel.findD(punto);
                if(forma != null)
                {
                     JFrame frame2 = new JFrame("Configurar Parametros");
                     //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                     //Create and set up the content pane.
                    Dialogo newContentPane = new Dialogo(frame2,forma);
                    newContentPane.setOpaque(true); //content panes must be opaque
                    frame2.setContentPane(newContentPane);

                    //Display the window.
                   frame2.pack();
                   frame2.setVisible(true);   
                }else{
                    forma = (Forma)panel.find(punto);
                    if(forma != null) {
                        String datos = new String(forma.getProgram());
                        JOptionPane.showMessageDialog(null,
                                datos,
                                "Datos de la forma", JOptionPane.PLAIN_MESSAGE);
                    }
                }
        }
        
        /**
         * Metodo que define las acciones a realizar cuando se presiona
         * el boton del mouse.
         * @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.selected = true;
                active = true;
                int x = punto.x;
                int y = punto.y;
                //Se discretiza la posicion que puede adoptar el punto inicial
                //de traslacion para facilitar el manejo de la forma
                x = x / 10;
                y = y / 10;
                punto.setLocation (x*10, y*10);
                previo = punto;
                panel.repaint();
            }
            
        }
        
        /**
         * Metodo que define las acciones a realizar cuando se suelta
         * el boton del mouse.
         * @param event Parametro que indica la accion realizada por el mouse
         */
        public void MouseReleased (MouseEvent event)
        {
            forma.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.
         * @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)>49)
                {
                    int x = deltaX / 50;
                    forma.trasladar(x*50,0);
                    previo.setLocation (previo.getX()+x*50, previo.getY());
                    panel.repaint();
                }
                if (Math.abs(deltaY)>49)
                {
                    int y = deltaY / 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 HandlerTrasladarMostrar
