package interfaces.JGUI; import java.awt.*; import java.awt.image.*; import java.net.*; public class Map extends Panel { MapApplet m_mapApplet; ResultTable m_resultTable; URL codeBase; Image m_origMapImage; Image m_cropMapImage; Image m_pinImage; ImageFilter m_cropFilter; String pictureName; int m_imageSize; int m_panelSize; double m_cornerX; double m_cornerY; double m_origCornerX; double m_origCornerY; double m_dPinX; double m_dPinY; int m_size; int m_origSize; int m_pinX; int m_pinY; int m_totalPixel; int m_currentPixel; int m_pPinX; int m_pPinY; int m_pCornerX; int m_pCornerY; boolean m_drawPin = false; // 0.005 deg = 1 miles Map(MapApplet mapApplet) { m_panelSize = 600; m_mapApplet = mapApplet; pictureName = "usmap.jpg"; m_dPinX = 37.0; m_dPinY = -96.0; m_size = 4096; defineCorner(); m_origCornerX = m_cornerX; m_origCornerY = m_cornerY; m_origSize = 4096; codeBase = m_mapApplet.getCodeBase(); m_origMapImage = m_mapApplet.getImage(codeBase, "interfaces\\Jgui\\images\\" + pictureName); m_pinImage = m_mapApplet.getImage(codeBase, "interfaces\\Jgui\\images\\" + "pinpos.jpg"); m_cropFilter = new CropImageFilter(0, 0, 600, 600); m_currentPixel = 600; m_totalPixel = 600; m_pCornerX = 0; m_pCornerY = 0; m_cropMapImage = m_mapApplet.createImage(new FilteredImageSource (m_origMapImage.getSource(), m_cropFilter)); } public void paint(Graphics g) { int width= m_cropMapImage.getWidth(this); int height = m_cropMapImage.getHeight(this); int m_imageSize = (width > height) ? width : height; float factor = (float)m_panelSize / m_imageSize; if(!g.drawImage(m_cropMapImage, 0, 0, (int)(width * factor), (int)(height * factor), this)) { g.drawString("Loading " + pictureName + ".....", 25, 70); } if (m_drawPin) { paintPin(g); } paintNumber(g); } public void paintPin(Graphics g) { g.drawImage(m_pinImage, m_pinX, m_pinY - 18, this); } public void paintNumber(Graphics g) { for (int i = 0 ; i < m_resultTable.size() ; i++) { int x = (int)((m_resultTable.getX(i) - m_cornerX) * 600 / (m_size * Globals.m_mileToDeg)); int y = (int)((m_resultTable.getY(i) - m_cornerY) * 600 / (m_size * Globals.m_mileToDeg)); g.setColor(Color.blue); if (i + 1 < 10) g.fillRect(x - 6, y - 7, 12, 14); else g.fillRect(x - 7, y - 7, 14, 14); g.setColor(Color.white); g.setFont(new Font("Monospaced", Font.BOLD, 10)); if (i + 1 < 10) g.drawString((i + 1) + "", x - 3, y + 4); else g.drawString((i + 1) + "", x - 6, y + 4); } } public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { if ((infoflags & ImageObserver.ALLBITS) == ImageObserver.ALLBITS) { repaint(); return false; } else { return true; } } public void drawMap(String cityName, double x, double y, int size) { m_dPinX = x; m_dPinY = y; m_size = size; defineCorner(); m_origCornerX = m_cornerX; m_origCornerY = m_cornerY; m_origSize = size; pictureName = cityName; URL codeBase = m_mapApplet.getCodeBase(); if (pictureName.equalsIgnoreCase("Ithaca")) { m_origMapImage = m_mapApplet.getImage(codeBase, "interfaces\\Jgui\\images\\" + pictureName + ".jpg"); m_cropFilter = new CropImageFilter(0, 0, 2240, 2240); m_currentPixel = 2240; m_totalPixel = 2240; } m_pCornerX = 0; m_pCornerY = 0; m_cropMapImage = m_mapApplet.createImage(new FilteredImageSource (m_origMapImage.getSource(), m_cropFilter)); repaint(); } public void drawZoom(String zoomFactor) { double zoom; if (zoomFactor.equals("x1")) zoom = 1.0; else if (zoomFactor.equals("x2")) zoom = 2.0; else if (zoomFactor.equals("x4")) zoom = 4.0; else if (zoomFactor.equals("x8")) zoom = 8.0; else if (zoomFactor.equals("x0.5")) zoom = 0.5; else return; int cropX, cropY; m_size = (int) (m_size / zoom); int offSet = (int) (m_currentPixel / (2 * zoom)); if ((m_pPinX - offSet) < 0) { cropX = 0; m_cornerX = m_origCornerX; } else if ((m_pPinX + offSet) > m_totalPixel) { cropX = m_totalPixel - (int) (m_currentPixel / zoom); m_cornerX = m_origCornerX + ((m_origSize - m_size) * Globals.m_mileToDeg); } else { cropX = m_pPinX - offSet; m_cornerX = m_dPinX - (m_size * Globals.m_mileToDeg) / 2; } if ((m_pPinY - offSet) < 0) { cropY = 0; m_cornerY = m_origCornerY; } else if ((m_pPinY + offSet) > m_totalPixel) { cropY = m_totalPixel - (int) (m_currentPixel / zoom); m_cornerY = m_origCornerY + ((m_origSize - m_size) * Globals.m_mileToDeg); } else { cropY = m_pPinY - offSet; m_cornerY = m_dPinY - (m_size * Globals.m_mileToDeg) / 2; } m_currentPixel = (int) (m_currentPixel / zoom); m_pCornerX = cropX; m_pCornerY = cropY; m_cropFilter = new CropImageFilter(cropX, cropY, m_currentPixel, m_currentPixel); m_cropMapImage = m_mapApplet.createImage(new FilteredImageSource (m_origMapImage.getSource(), m_cropFilter)); reDrawPin(); return; } public void drawPin(int x, int y) { m_drawPin = true; m_pinX = x; m_pinY = y; m_dPinX = m_cornerX + ((double)x / 600) * m_size * Globals.m_mileToDeg; m_dPinY = m_cornerY + ((double)y / 600) * m_size * Globals.m_mileToDeg; m_pPinX = m_pCornerX + (int)(((double)x / 600) * m_currentPixel); m_pPinY = m_pCornerY + (int)(((double)y / 600) * m_currentPixel); repaint(); } public void reDrawPin() { m_pinX = (int)((m_dPinX - m_cornerX) * 600 / (m_size * Globals.m_mileToDeg)); m_pinY = (int)((m_dPinY - m_cornerY) * 600 / (m_size * Globals.m_mileToDeg)); repaint(); } public double getPinX() { return m_dPinX; } public double getPinY() { return m_dPinY; } public int getScale() { return m_size; } private void defineCorner() { m_cornerX = m_dPinX - (m_size * Globals.m_mileToDeg) / 2; m_cornerY = m_dPinY - (m_size * Globals.m_mileToDeg) / 2; } public void showResult(ResultTable resultTable) { m_resultTable = resultTable; repaint(); } }