package com.vividsolutions.jump.workbench.ui.cursortool;
import java.awt.Shape;
import java.awt.geom.NoninvertibleTransformException;
import java.awt.geom.Point2D;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.util.Assert;
import com.vividsolutions.jump.feature.Feature;
import com.vividsolutions.jump.util.Block;
import com.vividsolutions.jump.util.CollectionUtil;
import com.vividsolutions.jump.util.StringUtil;
import com.vividsolutions.jump.workbench.model.Layer;
import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory;
public abstract class AbstractClickSelectedLineStringsTool extends
SpecifyFeaturesTool {
public AbstractClickSelectedLineStringsTool() {
setViewClickBuffer(10);
}
protected static final String NO_SELECTED_LINESTRINGS_HERE_MESSAGE = "No selected LineStrings here";
protected void warnLayerNotEditable(Layer layer) {
getWorkbench().getFrame()
.warnUser(layer.getName() + " is not editable");
}
public String getName() {
return super.getName().replaceAll("Line String", "LineString");
}
protected Coordinate getModelSource() {
return getModelDestination();
}
protected Shape getShape(Point2D source, Point2D destination)
throws Exception {
return null;
}
protected Point getModelClickPoint() {
return new GeometryFactory().createPoint(getModelDestination());
}
protected void gestureFinished() throws Exception {
reportNothingToUndoYet();
if (!check(checkFactory().createAtLeastNLayersMustBeEditableCheck(1))) {
return;
}
if (!check(checkFactory().createAtLeastNItemsMustBeSelectedCheck(1))) {
return;
}
Collection nearbyLineStringFeatures = CollectionUtil.select(
CollectionUtil.concatenate(layerToSpecifiedFeaturesMap()
.values()), new Block() {
public Object yield(Object feature) {
return getPanel().getSelectionManager()
.getFeaturesWithSelectedItems().contains(
feature)
&& ((Feature) feature).getGeometry() instanceof LineString ? Boolean.TRUE
: Boolean.FALSE;
}
});
if (nearbyLineStringFeatures.isEmpty()) {
getWorkbench().getFrame().warnUser(
NO_SELECTED_LINESTRINGS_HERE_MESSAGE);
return;
}
gestureFinished(nearbyLineStringFeatures);
}
private EnableCheckFactory checkFactory() {
return new EnableCheckFactory(getWorkbench().getContext());
}
protected abstract void gestureFinished(Collection nearbyLineStringFeatures)
throws NoninvertibleTransformException;
protected Layer layer(Feature feature, Map layerToSpecifiedFeaturesMap) {
for (Iterator i = layerToSpecifiedFeaturesMap.keySet().iterator(); i
.hasNext();) {
Layer layer = (Layer) i.next();
Collection features = (Collection) layerToSpecifiedFeaturesMap
.get(layer);
if (features.contains(feature)) {
return layer;
}
}
Assert.shouldNeverReachHere();
return null;
}
}