//EditorPanel.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.awt.geom.*;
/**
 * Class EditorPanel
 * @author Luis Espinoza Severino
 */
public class EditorPanel extends JPanel
{
/**
 * Constructor de clase
 */
   
   public EditorPanel()
     {
	super();
	//set backgrundcolor
	setBackground(Color.BLACK);
	//lista de formas en pantalla
	formas = new ArrayList();
	//mouse listeners
	currentMouseListener = null;
	currentMouseMotionListener = null;
	
	
     }
/**
 * Paints graphic components.
 * @param g -
 */
   
   public void paintComponent(Graphics g) 
     {
	super.paintComponent(g);
	Graphics2D g2d=(Graphics2D) g;
      
	for ( int i=0; i<formas.size(); i++)
	  ((Forma)formas.get(i)).paintComponent(g2d);
      
     }
   
/**
 * Cambia el objeto que esta escuchando las acciones del mouse en el panel
 * @param l -
 */
   public void changeMouseListener(MouseListener l)
     {
	if (currentMouseListener != null)
	  removeMouseListener(currentMouseListener);
	currentMouseListener=l;
	addMouseListener(currentMouseListener);
     }
/**
 * Cambia al objeto que esta escuchando los movimientos del mouse en el panel
 * @param l -
 */
   public void changeMouseMotionListener(MouseMotionListener l)
     {
	if (currentMouseMotionListener != null)
	  removeMouseMotionListener(currentMouseMotionListener);
	currentMouseMotionListener=l;
	addMouseMotionListener(currentMouseMotionListener);
     }
/**
 * incorpora un forma en la lista de formas y es pintada.
 * @param f -
 */
   public void incorpore (Forma f)
     {
	formas.add(f);
	repaint();
     }
/**
 * remueve una forma de la lista de formas y se vuelve a pintar.
 * @param f -
 */
   public void remueva (Forma f)
     {
	formas.remove(f);
	repaint();
     }
/**
 * setea las formas de la lista para que puedan ser manipuladas.
 * La lista es repintada para mostrar los puntos de manipulacion.
 */
   public void manipulating()
     {
	for(int i=0; i<formas.size(); i++)
	  ((Forma)formas.get(i)).setManipulable(true);
	repaint();
     }
/**
 * Desactiva la manipulacion de todas las formas de la lista.
 */
   public void nomanipular()
     {
	for(int i=0; i<formas.size(); i++)
	  ((Forma)formas.get(i)).setManipulable(false);
	repaint();
     }
/*
 * Busca si el punto p es contenido por alguna forma en la lista.
 * @param p -
 * @return retorna la referencia a la forma que contiene el punto, o null si no ninguna lo contiene
 */
   public Forma find(Point p)
     {
	Forma f;
	for(int i=0; i<formas.size(); i++)
	  {
	     f=(Forma)formas.get(i);
	     if(f.isOn(p))
	       return f;
	  }
	
	return null;
     }
   private ArrayList formas;
   private MouseListener currentMouseListener;
   private MouseMotionListener currentMouseMotionListener;
}
