package com.vividsolutions.jump.workbench.ui.renderer; import java.awt.Graphics2D; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import com.vividsolutions.jump.feature.Feature; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.ui.LayerViewPanel; import com.vividsolutions.jump.workbench.ui.renderer.style.Style; /** * @see SimpleFeatureCollectionRenderer * @see FeatureCollectionRenderer */ public class ImageCachingFeatureCollectionRenderer extends ImageCachingRenderer { public ImageCachingFeatureCollectionRenderer(Object contentID, LayerViewPanel panel) { super(contentID, panel); } private Collection styles = new ArrayList(); private Map layerToFeaturesMap = new HashMap(); protected void setLayerToFeaturesMap(Map layerToFeaturesMap) { this.layerToFeaturesMap = layerToFeaturesMap; } protected void setStyles(Collection styles) { this.styles = styles; } protected void renderHook(ThreadSafeImage image, Collection features, Layer layer, final Style style) throws Exception { if (!layer.isVisible()) { return; } if (style == null || !style.isEnabled()) { return; } style.initialize(layer); //new ArrayList to avoid ConcurrentModificationException. [Jon Aquino] // Revert to the original list, as the features may be a LazyList // containing a huge number of features from a database. Monitor the // frequency of ConcurrentModificationException errors. [Jon Aquino // 2005-03-02] for (Iterator i = features.iterator(); i.hasNext();) { final Feature feature = (Feature) i.next(); if (cancelled) { break; } if (feature.getGeometry() == null || feature.getGeometry().isEmpty()) { continue; } //Because image.draw is synchronized, it might be faster to do //several paints inside #draw. [Jon Aquino] image.draw(new ThreadSafeImage.Drawer() { public void draw(Graphics2D g) throws Exception { style.paint(feature, g, panel.getViewport()); } }); } } protected void renderHook(ThreadSafeImage image) throws Exception { for (Iterator i = styles.iterator(); i.hasNext();) { Style style = (Style) i.next(); for (Iterator j = layerToFeaturesMap.keySet().iterator(); j .hasNext();) { Layer layer = (Layer) j.next(); Collection features = (Collection) layerToFeaturesMap .get(layer); renderHook(image, features, layer, style); } } } }