package arida.ufc.br.moap.vis.engine.jxmap; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.List; import org.jdesktop.swingx.JXMapKit; import org.jdesktop.swingx.JXMapViewer; import org.jdesktop.swingx.painter.CompoundPainter; import org.jdesktop.swingx.painter.Painter; import arida.ufc.br.moap.vis.api.IFeaturable; import arida.ufc.br.moap.vis.engine.api.ILayer; import arida.ufc.br.moap.vis.engine.api.IVisualizationEngine; public class JXMapEngine { private JXMapKit map; private IVisualizationEngine engine; private List<ILayer> layers; public JXMapEngine(JXMapKit map, IVisualizationEngine engine) { this.map = map; this.engine = engine; this.layers = new ArrayList<ILayer>(); } public JXMapKit getMap() { return map; } public void setMap(JXMapKit map) { this.map = map; } public void run() { CompoundPainter<JXMapViewer> cp = getLayerCompoundPainter(layers); this.map.getMainMap().setOverlayPainter(cp); //this.map.updateUI(); }; public void addLayer(int i, ILayer layer) { this.layers.add(i, layer); } public void addLayer(ILayer layer) { this.layers.add(layer); } public void removeLayer(ILayer layer) { this.layers.remove(layer); } public void removeLayer(int i) { this.layers.remove(i); } private Painter<JXMapViewer> getLayerPainter(final ILayer layer) { Painter<JXMapViewer> overlay = new Painter<JXMapViewer>() { @Override public void paint(Graphics2D g, JXMapViewer map, int arg2, int arg3) { Rectangle2D rect = map.getViewportBounds(); g.translate(-rect.getX(), -rect.getY()); g.setStroke(layer.getStroke()); g.setColor(layer.getColor()); for (IFeaturable feature : layer.getFeaturables()) { Shape shape = engine.getShape(map, feature); g.draw(shape); g.fill(shape); } } }; return overlay; } @SuppressWarnings({ "unchecked" }) private CompoundPainter<JXMapViewer> getLayerCompoundPainter( final List<ILayer> layers) { CompoundPainter<JXMapViewer> cp = new CompoundPainter<JXMapViewer>(); cp.setCacheable(false); int size = layers.size(); Painter<JXMapViewer>[] paintersArray = new Painter[size]; for (int i = 0; i < size; i++) { ILayer layer = layers.get(i); paintersArray[i] = getLayerPainter(layer); } cp.setPainters(paintersArray); return cp; } }