/**
Clase Dibujo
@author Diego Gonzalez
@author José Ignacio Guerra
@author Patricio Valle
*/

   import javax.swing.*;
   import java.awt.*;
   import java.awt.event.*;
   import java.util.ArrayList;
   import java.awt.geom.*;
   import java.lang.Math.*;
   import java.io.*;
   import java.applet.*;
   import java.net.*;

/**
Clase Dibujo gestiona todo lo necesario para mostrar 
el mapa y realizar acciones sobre el
*/
    public class Dibujo extends JPanel
   {  
   
   /**
   Constructor de objeto Dibujo que otorga todo lo necesario 
   para mostrar de forma grafica el mapa 
   */
       Dibujo(AppletContext context, Container content)
      {
         super();
         formas = new ArrayList();
         currentMouseListener = null;
         currentMouseMotionListener = null;
			//new ImageIcon(applet.getImage(
     //                                        applet.getCodeBase(),
       //                                      "images/circle.gif"))
         Applet applet = context.getApplet("MapElo");
			fondo = applet.getImage(applet.getCodeBase(),"fotodepto.jpg");      
			
			//fondo =  Toolkit.getDefaultToolkit().getImage( "fotodepto.jpg" );
         piso = 1;
         encontrado = NOENCONTRADO;
         twins = NOTWINS;
         this.context=context;
         this.content=content;
      }
   
       public AppletContext getContext()
      {
         return context;
      }
       public Container getContainer()
      {
         return content;
      }
   
   /**
   Genera las salas de cada piso, con
   su correspondiente informacion e imagenes
   */
       public void creaPiso()
      {
         try {
            String line;
            int a, b;
            ArrayList salas = new ArrayList();
            Sala sala;
            String archivo = new String("piso");
            archivo = archivo.concat(Integer.toString(piso));
            BufferedReader in = new BufferedReader(new FileReader(archivo.concat(".txt")));
            //fondo = Toolkit.getDefaultToolkit().getImage(archivo.concat(".png"));
				Applet applet = context.getApplet("MapElo");
            fondo = applet.getImage(applet.getCodeBase(),archivo.concat(".png"));  
	         while ((line = in.readLine())!=null)
            {			
               sala = new Sala(line,this);
               salas.add(sala);
            }
            formas = salas;
            repaint();
         
         } 
             catch(FileNotFoundException e) {
               System.out.println(
                  "File Not Found:");
            } 
             catch(IOException e) {
               System.out.println("IO Exception");
            }
      }
   
   /**
   Genera el mapa del piso correspondiente
   segun lo requiera el usuario
   @param piso, entero que identifica al piso (2,3 o 4)
   */
       public void piso(int piso)
      {
         this.piso = piso;
         if (piso != 1) creaPiso();
         else 
         {
            formas = new ArrayList();
            fondo =  Toolkit.getDefaultToolkit().getImage( "fotodepto.jpg" );
         }		
         repaint(); 
      }
   
   /**
   Permite actualizar cambios hecho en figuras del panel  
   @param g, tipo grafico que permite dibujar
   */
       public void paintComponent(Graphics g) 
      {
         super.paintComponent(g);
         g.drawImage( fondo,0,0,this );
         Graphics2D g2d = (Graphics2D)g;     
         for (int i = 0; i < formas.size(); i++)
         {
            if (encontrado != i)    
               ((Sala)formas.get(i)).paintComponent(g2d);            
         }
         if (encontrado != NOENCONTRADO)
            ((Sala)formas.get(encontrado)).paintComponent(g2d);
      }
   
   /**
   Cambia manejador de interrupciones por mouse
   @param l referencia a objeto mouselistener que atenderá interrupciones
   */
       public void changeMouseListener(MouseListener l)
      {
         if (currentMouseListener != null)
            removeMouseListener(currentMouseListener);
         currentMouseListener = l;
         addMouseListener(currentMouseListener);
      }
   
   /**
   Cambia manejador de interrupciones por mouse
   @param l referencia a objeto mousemotionlistener que atenderá interrupciones
   */
   
       public void changeMouseMotionListener(MouseMotionListener l)
      {
         if (currentMouseMotionListener != null)
            removeMouseMotionListener(currentMouseMotionListener);
         currentMouseMotionListener = l;
         addMouseMotionListener(currentMouseMotionListener);
      }
   
   /**
   Metodo que se utiliza para remover sombra de la sala
   @param f, referencia a la sala
   */
       public void remueva (Sala f)
      {
         formas.remove(f);
         repaint();
      }
   /**
   Metodo que se utiliza para incorporar sombra a la sala
   cuando el cursor pasa sobre ella
   @param f, referencia a la sala
   */
       public void incorpore (Sala f)
      {
         formas.add(f);
         repaint();
      }
   
   
   
   /**
   Metodo que permite encontrar posicion del mouse 
   @param p, punto en el cual se encuentra posicionado el mouse
   */
       public int find(Point2D p)
      {
         int i;
         encontrado = NOENCONTRADO;
         for (i = 0; i < formas.size(); i++) 
         {
            if (((Sala)formas.get(i)).find(p))
               encontrado = i;
         //findTwins();
         }
         repaint();
         return encontrado;
      }
   
   /**
   Metodo que cambia el piso si se presiona sobre una escalera
   @param p, punto en el cual se encuentra posicionado el mouse
   */	
       public int cambiaPiso(Point2D p)
      {
         int i;
         for (i = 0; i < formas.size(); i++) 
         {
            Sala sala = (Sala)formas.get(i); 
            if(sala.findLink(p))
            { 
               if(sala.getPiso()!=piso) 
                  return sala.getPiso(); 
            }
         }	
         return NOENCONTRADO;
      }
   
   
       public void desmarcar(int nodesmarcar)
      {
         for (int j = 0; j < formas.size(); j++)
         {
            if(nodesmarcar!=j)	((Sala)formas.get(j)).desmarcar();
            repaint();
         }
      
      }
   
   
       public void setApplet(JApplet context){
         applet=context;
      }
   
   
   /**
   Metodo que encuentra el link asociado
   a cada sala o lugar del mapa
   @param p, punto en el cual se encuentra posicionado el mouse
   */
       public void findLink(Point p){
         int i;
         String url;
         for (i = 0; i < formas.size(); i++) 
            if (((Sala)formas.get(i)).find(p)){
               url = new String("http://" + ((Sala)formas.get(i)).getLink());
     try
         { 				
					URL urlfinal = new URL(url);          
               context.showDocument(urlfinal, "_blank");
           }
			  catch(MalformedURLException exception) 
         { 
            exception.printStackTrace(); 
         }        
				
				}
      }
   
       public void findTwins(){
         for(int j=0; j < formas.size();j++){
            if(encontrado!=NOENCONTRADO&&j!=encontrado&&((((Sala)formas.get(j)).getName()).compareTo(((Sala)formas.get(encontrado)).getName())==0)&&(((((Sala)formas.get(j)).getName()).compareTo("> Mecánica")==0)||((((Sala)formas.get(j)).getName()).compareTo("> Electricidad")==0))){
               twins = j;
               System.out.println(twins);
            }
            else twins = NOTWINS;
         }
      	 
      }
   
   
      public static final int NOENCONTRADO = 100;
      public static final int NOTWINS = 100;
   
      private ArrayList formas;
      private MouseListener currentMouseListener;
      private MouseMotionListener currentMouseMotionListener;
      private int encontrado, twins;
      private Sala sala;
      private int piso;
      private Image fondo;
      private JApplet applet;
      private AppletContext context;
      private Container content;
   }
