package com.vividsolutions.jump.workbench.model;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Polygon;
import com.vividsolutions.jump.I18N;
import com.vividsolutions.jump.feature.AttributeType;
import com.vividsolutions.jump.feature.BasicFeature;
import com.vividsolutions.jump.feature.Feature;
import com.vividsolutions.jump.feature.FeatureSchema;
import com.vividsolutions.jump.util.Blackboard;
import com.vividsolutions.jump.workbench.WorkbenchContext;
import com.vividsolutions.jump.workbench.ui.plugin.PersistentBlackboardPlugIn;
import com.vividsolutions.jump.workbench.ui.renderer.style.BasicStyle;
import java.awt.Color;
import java.awt.Font;
import java.util.Collection;
import org.openjump.core.ui.plugin.tools.AdvancedMeasureOptionsPanel;
import org.openjump.core.ui.plugin.tools.MeasurementStyle;
/**
* A special LayerFinder for the AdvancedMeasureTool.
*
* @author Matthias Scholz <ms@jammerhund.de>
*/
public class MeasureLayerFinder extends SystemLayerFinder {
public static final String FEATURE_ATTRIBUTE_AREA = "area";
public static final String FEATURE_ATTRIBUTE_LENGTH = "length";
public static final String FEATURE_ATTRIBUTE_POINTS = "points";
public static final String LAYER_NAME = I18N.get("model.MeasureLayerFinder.measure");
private static Layer measureLayer = null;
WorkbenchContext context = null;
public MeasureLayerFinder(LayerManagerProxy layerManagerProxy, WorkbenchContext context) {
super(LAYER_NAME, layerManagerProxy);
this.context = context;
}
@Override
protected void applyStyles(Layer layer) {
Object font;
Object color;
Object string;
// get the persitent values from the Blackboard and apply
Blackboard blackboard = PersistentBlackboardPlugIn.get(context);
// first the basic styling, such as line and fill
BasicStyle basicStyle = layer.getBasicStyle();
color = blackboard.get(AdvancedMeasureOptionsPanel.BB_LINE_COLOR, AdvancedMeasureOptionsPanel.DEFAULT_LINE_COLOR);
if (color instanceof Color) basicStyle.setLineColor((Color) color);
basicStyle.setAlpha(100); // TODO or wait for JDK7 with a new ColorChooser ;-)
basicStyle.setLineWidth(2); // TODO: There must be a version two ;-)
basicStyle.setRenderingLine(blackboard.get(AdvancedMeasureOptionsPanel.BB_LINE_PAINT, AdvancedMeasureOptionsPanel.DEFAULT_LINE_PAINT));
color = blackboard.get(AdvancedMeasureOptionsPanel.BB_FILL_COLOR, AdvancedMeasureOptionsPanel.DEFAULT_FILL_COLOR);
if (color instanceof Color) basicStyle.setFillColor((Color) color);
basicStyle.setRenderingFill(blackboard.get(AdvancedMeasureOptionsPanel.BB_FILL_PAINT, AdvancedMeasureOptionsPanel.DEFAULT_FILL_PAINT));
layer.setDrawingLast(true);
// and second the special measurement stylings
MeasurementStyle measurementStyle = new MeasurementStyle();
measurementStyle.setEnabled(true);
// summary
measurementStyle.setPaintSummaryLength(blackboard.get(AdvancedMeasureOptionsPanel.BB_SUMMARY_PAINT_LENGTH, AdvancedMeasureOptionsPanel.DEFAULT_SUMMARY_PAINT_LENGTH));
measurementStyle.setPaintSummaryArea(blackboard.get(AdvancedMeasureOptionsPanel.BB_SUMMARY_PAINT_AREA, AdvancedMeasureOptionsPanel.DEFAULT_SUMMARY_PAINT_AREA));
font = blackboard.get(AdvancedMeasureOptionsPanel.BB_SUMMARY_FONT, AdvancedMeasureOptionsPanel.DEFAULT_SUMMARY_FONT);
if (font instanceof Font) measurementStyle.setSummaryFont((Font) font);
color = blackboard.get(AdvancedMeasureOptionsPanel.BB_SUMMARY_FONT_COLOR, AdvancedMeasureOptionsPanel.DEFAULT_SUMMARY_COLOR);
if (color instanceof Color) measurementStyle.setSummaryColor((Color) color);
// vertex
measurementStyle.setVertexPaintDistance(blackboard.get(AdvancedMeasureOptionsPanel.BB_VERTEX_PAINT_DISTANCE, AdvancedMeasureOptionsPanel.DEFAULT_VERTEX_PAINT_DISTANCE));
font = blackboard.get(AdvancedMeasureOptionsPanel.BB_VERTEX_FONT, AdvancedMeasureOptionsPanel.DEFAULT_VERTEX_FONT);
if (font instanceof Font) measurementStyle.setVertexFont((Font) font);
color = blackboard.get(AdvancedMeasureOptionsPanel.BB_VERTEX_FONT_COLOR, AdvancedMeasureOptionsPanel.DEFAULT_VERTEX_FONT_COLOR);
if (color instanceof Color) measurementStyle.setVertexFontColor((Color) color);
measurementStyle.setVertexPaint(blackboard.get(AdvancedMeasureOptionsPanel.BB_VERTEX_PAINT, AdvancedMeasureOptionsPanel.DEFAULT_VERTEX_PAINT));
color = blackboard.get(AdvancedMeasureOptionsPanel.BB_VERTEX_FIRST_COLOR, AdvancedMeasureOptionsPanel.DEFAULT_VERTEX_FIRST_COLOR);
if (color instanceof Color) measurementStyle.setVertexFirstColor((Color) color);
string = blackboard.get(AdvancedMeasureOptionsPanel.BB_VERTEX_FIRST_FORM, AdvancedMeasureOptionsPanel.DEFAULT_VERTEX_FIRST_FORM);
if (string instanceof String) measurementStyle.setVertexFirstForm((String) string);
measurementStyle.setVertexFirstSize(blackboard.get(AdvancedMeasureOptionsPanel.BB_VERTEX_FIRST_SIZE, AdvancedMeasureOptionsPanel.DEFAULT_VERTEX_FIRST_SIZE));
color = blackboard.get(AdvancedMeasureOptionsPanel.BB_VERTEX_FOLLOWING_COLOR, AdvancedMeasureOptionsPanel.DEFAULT_VERTEX_FOLLOWING_COLOR);
if (color instanceof Color) measurementStyle.setVertexFollowingColor((Color) color);
string = blackboard.get(AdvancedMeasureOptionsPanel.BB_VERTEX_FOLLOWING_FORM, AdvancedMeasureOptionsPanel.DEFAULT_VERTEX_FOLLOWING_FORM);
if (string instanceof String) measurementStyle.setVertexFollowingForm((String) string);
measurementStyle.setVertexFollowingSize(blackboard.get(AdvancedMeasureOptionsPanel.BB_VERTEX_FOLLOWING_SIZE, AdvancedMeasureOptionsPanel.DEFAULT_VERTEX_FOLLOWING_SIZE));
// finally add the Style
layer.addStyle(measurementStyle);
}
/**
* Builds a new Feature from a Geometry with the given FeatureSchema.
* This Feature can later be added to Layer.
*
* @param measureGeometry
* @param schema
* @return a new Feature having measureGeometry as Geometry and schema as FeatureSchema
*/
private Feature toFeature(Geometry measureGeometry, FeatureSchema schema) {
Feature feature = new BasicFeature(schema);
feature.setGeometry(measureGeometry);
feature.setAttribute(FEATURE_ATTRIBUTE_LENGTH, measureGeometry.getLength());
feature.setAttribute(FEATURE_ATTRIBUTE_AREA, measureGeometry instanceof Polygon ? measureGeometry.getArea() : 0);
feature.setAttribute(FEATURE_ATTRIBUTE_POINTS, measureGeometry.getNumPoints());
return feature;
}
/**
* Sets the new measure Geometry. This clears all old Features on the
* measurelayer and add's the new Features.
*
* @param measureGeometry
*/
public void setMeasure(Geometry measureGeometry) {
if (getLayer() == null) {
initLayer();
}
if (measureGeometry != null) {
getLayer().getFeatureCollectionWrapper().add(toFeature(measureGeometry,
getLayer().getFeatureCollectionWrapper().getFeatureSchema()));
}
}
/**
* Return the measurelayer. If not exists until now, create a new one.
*
* @return the measure layer
*/
public Layer getMeasureLayer() {
if (getLayer() == null) {
initLayer();
}
return measureLayer;
}
/**
* Initialises the Layer for our measurement needs.
*/
private void initLayer() {
measureLayer = createLayer();
measureLayer.setSelectable(false);
// Add a LayerListener to compute the FeatureAttributes, if a Feature was changed
measureLayer.getLayerManager().addLayerListener(new LayerAdapter() {
@Override
public void featuresChanged(FeatureEvent e) {
super.featuresChanged(e);
// we are only interested on the measureLayer
if (e.getLayer().equals(measureLayer)) {
Collection<Feature> features = e.getFeatures();
for (Feature feature : features) {
feature.setAttribute(FEATURE_ATTRIBUTE_LENGTH, feature.getGeometry().getLength());
feature.setAttribute(FEATURE_ATTRIBUTE_AREA, feature.getGeometry() instanceof Polygon ? feature.getGeometry().getArea() : 0);
feature.setAttribute(FEATURE_ATTRIBUTE_POINTS, feature.getGeometry().getNumPoints());
}
}
}
});
measureLayer.getFeatureCollectionWrapper().getFeatureSchema().addAttribute(FEATURE_ATTRIBUTE_AREA, AttributeType.DOUBLE);
measureLayer.getFeatureCollectionWrapper().getFeatureSchema().addAttribute(FEATURE_ATTRIBUTE_LENGTH, AttributeType.DOUBLE);
measureLayer.getFeatureCollectionWrapper().getFeatureSchema().addAttribute(FEATURE_ATTRIBUTE_POINTS, AttributeType.INTEGER);
}
}