package jeql.workbench.ui.geomview; import java.awt.Graphics2D; import jeql.workbench.ui.geomview.style.Style; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryCollection; public class LayerRenderer implements Renderer { private Layer layer; private GeometryList geomCont; private Viewport viewport; private boolean isCancelled = false; public LayerRenderer(Layer layer, Viewport viewport) { this(layer, layer.getSource(), viewport); } public LayerRenderer(Layer layer, GeometryList geomCont, Viewport viewport) { this.layer = layer; this.geomCont = geomCont; this.viewport = viewport; } public void render(Graphics2D g) { if (! layer.isEnabled()) return; try { for (int i = 0; i < geomCont.size(); i++) { Geometry geom = geomCont.getGeometry(i); if (geom == null) continue; render(g, viewport, geom, geomCont.getStyle(i)); //render(g, viewport, geom, layer.getStyle()); } } catch (Exception ex) { System.out.println(ex); // not much we can do about it - just carry on } } private void render(Graphics2D g, Viewport viewport, Geometry geometry, Style style) throws Exception { // cull non-visible geometries // for maximum rendering speed this needs to be checked for each component if (! viewport.intersectsInModel(geometry.getEnvelopeInternal())) return; if (geometry instanceof GeometryCollection) { renderGeometryCollection(g, viewport, (GeometryCollection) geometry, style); return; } style.paint(geometry, viewport, g); } private void renderGeometryCollection(Graphics2D g, Viewport viewport, GeometryCollection gc, Style style ) throws Exception { /** * Render each element separately. * Otherwise it is not possible to render both filled and non-filled * (1D) elements correctly. * This also allows cancellation. */ for (int i = 0; i < gc.getNumGeometries(); i++) { render(g, viewport, gc.getGeometryN(i), style); if (isCancelled) return; } } public void cancel() { isCancelled = true; } }