/*
* The Unified Mapping Platform (JUMP) is an extensible, interactive GUI for
* visualizing and manipulating spatial features with geometry and attributes.
*
* Copyright (C) 2003 Vivid Solutions
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place - Suite 330, Boston, MA 02111-1307, USA.
*
* For more information, contact:
*
* Vivid Solutions
* Suite #1A
* 2328 Government Street
* Victoria BC V8T 5G5
* Canada
*
* (250)385-6040
* www.vividsolutions.com
*/
package com.vividsolutions.jump.workbench.ui.renderer;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.util.Assert;
import com.vividsolutions.jump.workbench.model.Layer;
import com.vividsolutions.jump.workbench.model.Layerable;
import com.vividsolutions.jump.workbench.ui.LayerViewPanel;
//[sstein] : 14.08.2005 added variable maxFeatures with getters and setters
public class LayerRenderer extends FeatureCollectionRenderer {
private Layer layer;
private LayerViewPanel panel;
public static final String ALWAYS_USE_IMAGE_CACHING_KEY = LayerRenderer.class
.getName()
+ " - ALWAYS USE IMAGE CACHING";
public LayerRenderer(final Layer layer, LayerViewPanel panel) {
//Use layer as the contentID [Jon Aquino]
super(layer, panel, new ImageCachingFeatureCollectionRenderer(layer,
panel) {
protected ThreadSafeImage getImage() {
if (!layer.isVisible()) {
return null;
}
return super.getImage();
}
public Runnable createRunnable() {
if (!layer.isVisible()) {
//If the cached image is null, leave it alone. [Jon
// Aquino]
return null;
}
return super.createRunnable();
}
});
this.layer = layer;
this.panel = panel;
}
public Runnable createRunnable() {
if (!render(layer, panel)) {
return null;
}
return super.createRunnable();
}
public void copyTo(Graphics2D graphics) {
if (!render(layer, panel)) {
return;
}
super.copyTo(graphics);
}
public static boolean render(Layerable layerable, LayerViewPanel panel) {
if (!layerable.isVisible()) {
return false;
}
if (!layerable.getLayerManager().getLayerables(Layerable.class).contains(layerable)) {
// Get here after deleting a layer. [Jon Aquino 2005-03-29]
return false;
}
return withinVisibleScaleRange(layerable, panel);
}
public static boolean withinVisibleScaleRange(Layerable layerable,
LayerViewPanel panel) {
// When working with scale, the max is less than the min.
// [Jon Aquino 2005-03-01]
Assert.isTrue(layerable.getMaxScale() == null
|| layerable.getMinScale() == null
|| layerable.getMaxScale().doubleValue() <= layerable
.getMinScale().doubleValue());
if (!layerable.isScaleDependentRenderingEnabled()) {
return true;
}
if (layerable.getMaxScale() != null
&& scale(panel) < layerable.getMaxScale().doubleValue()) {
return false;
}
if (layerable.getMinScale() != null
&& scale(panel) > layerable.getMinScale().doubleValue()) {
return false;
}
return true;
}
/**
* @return the inverse of the viewport's scale; it is inverted so that it
* increases as the user zooms out, as is usually expected
*/
private static double scale(LayerViewPanel panel) {
return 1d / panel.getViewport().getScale();
}
protected Collection styles() {
//new ArrayList to avoid ConcurrentModificationExceptions. [Jon Aquino]
ArrayList styles = new ArrayList(layer.getStyles());
styles.remove(layer.getVertexStyle());
styles.remove(layer.getLabelStyle());
//Move to last. [Jon Aquino]
styles.add(layer.getVertexStyle());
styles.add(layer.getLabelStyle());
return styles;
}
protected boolean useImageCaching(Map layerToFeaturesMap) {
if (layer.getBlackboard().get(ALWAYS_USE_IMAGE_CACHING_KEY, false)) {
return true;
}
return super.useImageCaching(layerToFeaturesMap);
}
protected Map layerToFeaturesMap() {
Envelope viewportEnvelope = panel.getViewport()
.getEnvelopeInModelCoordinates();
return Collections.singletonMap(layer, layer
.getFeatureCollectionWrapper().query(viewportEnvelope));
}
/**
* @return Returns the number of maxFeatures to render
* as vector graphic.
*/
public int getMaxFeatures() {
return super.getMaxFeatures();
}
/**
* @param maxFeatures The maximum number of Features to render
* as vector graphic.<p>
* Use this method before using method render(Object contentID) or render(Object contentID, boolean clearImageCache)
*/
public void setMaxFeatures(int maxFeatures) {
super.setMaxFeatures(maxFeatures);
}
}