/* * <copyright> * Copyright 2013 BBN Technologies * </copyright> */ package com.bbn.openmap.event; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.net.URL; import com.bbn.openmap.MapBean; import com.bbn.openmap.dataAccess.shape.EsriGraphicList; import com.bbn.openmap.geo.Geo; import com.bbn.openmap.omGraphics.DrawingAttributes; import com.bbn.openmap.omGraphics.OMGraphic; import com.bbn.openmap.omGraphics.OMGraphicList; import com.bbn.openmap.omGraphics.OMLine; import com.bbn.openmap.proj.Proj; import com.bbn.openmap.proj.Projection; /** * AzPanner is an abstract class that handles panning effects for Azimuth * projections. * * @author dietrick */ public abstract class AzimuthPanner { OMGraphicList omGraphics; int oX, oY; DrawingAttributes azDrawing; private AzimuthPanner(int oX, int oY, DrawingAttributes azDrawing) { this.oX = oX; this.oY = oY; this.azDrawing = azDrawing; } public abstract void handlePan(MapBean map, MouseEvent me); public abstract void handleUnpan(MouseEvent me); public void render(Graphics g) { if (omGraphics != null) { omGraphics.render(g); } } /** * @return the azDrawing */ public DrawingAttributes getAzDrawing() { return azDrawing; } /** * @param azDrawing the azDrawing to set */ public void setAzDrawing(DrawingAttributes azDrawing) { this.azDrawing = azDrawing; } /* * (non-Javadoc) * * @see com.bbn.openmap.event.PaintListener#listenerPaint(Object source, * java.awt.Graphics) */ public void listenerPaint(Object source, Graphics graphics) { if (omGraphics != null) { omGraphics.render(graphics); } } public static class Standard extends AzimuthPanner { public Standard(int oX, int oY, DrawingAttributes azDrawing) { super(oX, oY, azDrawing); } public void handlePan(MapBean mapBean, MouseEvent me) { Point2D pnt0 = mapBean.inverse(oX, oY, null); Point2D llp = mapBean.inverse(me.getX(), me.getY(), null); if (llp != null && !llp.equals(pnt0)) { OMGraphicList list = new OMGraphicList(); OMLine line1 = new OMLine(89.9, llp.getX(), llp.getY(), llp.getX(), OMGraphic.LINETYPE_GREATCIRCLE); OMLine line2 = new OMLine(llp.getY(), llp.getX(), -89.9, llp.getX(), OMGraphic.LINETYPE_GREATCIRCLE); list.add(line1); list.add(line2); if (llp.getX() < 0) { OMLine line3 = new OMLine(llp.getY(), -180, llp.getY(), llp.getX(), OMGraphic.LINETYPE_RHUMB); OMLine line4 = new OMLine(llp.getY(), llp.getX(), llp.getY(), 0, OMGraphic.LINETYPE_RHUMB); OMLine line5 = new OMLine(llp.getY(), 0, llp.getY(), 179.9, OMGraphic.LINETYPE_RHUMB); list.add(line3); list.add(line4); list.add(line5); } else { OMLine line3 = new OMLine(llp.getY(), 0, llp.getY(), llp.getX(), OMGraphic.LINETYPE_RHUMB); OMLine line4 = new OMLine(llp.getY(), llp.getX(), llp.getY(), 180, OMGraphic.LINETYPE_RHUMB); OMLine line5 = new OMLine(llp.getY(), -179, llp.getY(), 0, OMGraphic.LINETYPE_RHUMB); list.add(line3); list.add(line4); list.add(line5); } OMLine line6 = new OMLine(pnt0.getY(), pnt0.getX(), llp.getY(), llp.getX(), OMGraphic.LINETYPE_GREATCIRCLE); line6.addArrowHead(true); list.add(line6); getAzDrawing().setTo(list); omGraphics = list; list.generate(mapBean.getRotatedProjection()); mapBean.repaint(); } } public void handleUnpan(MouseEvent me) { omGraphics = null; } } public static class Shapefile extends Standard { EsriGraphicList list = null; public Shapefile(int oX, int oY, DrawingAttributes azDrawing, URL shapefile) { super(oX, oY, azDrawing); list = EsriGraphicList.getEsriGraphicList(shapefile, getAzDrawing(), null); } public void handlePan(MapBean mapBean, MouseEvent me) { Projection proj = mapBean.getRotatedProjection(); Point2D pnt0 = mapBean.inverse(oX, oY, null); Point2D pnt = mapBean.inverse(me.getX(), me.getY(), null); Geo g0 = new Geo(pnt0.getY(), pnt0.getX()); Geo g = new Geo(pnt.getY(), pnt.getX()); double distance = g0.distance(g); double az = g.azimuth(g0); Point2D c = proj.getCenter(); Geo ngc = new Geo(c.getY(), c.getX()).offset(distance, az); Proj newProj = (Proj) mapBean.getProjectionFactory().makeProjection(proj.getClass().getName(), proj); newProj.setRotationAngle(proj.getRotationAngle()); newProj.setCenter(ngc.getLatitude(), ngc.getLongitude()); if (list != null) { OMGraphicList newList = new OMGraphicList(list); newList.generate(newProj); omGraphics = newList; mapBean.repaint(); } } } }