/** 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; }