package com.vividsolutions.jump.workbench.ui.zoom;
import java.util.Collection;
import java.util.Iterator;
import java.util.StringTokenizer;
import javax.swing.JOptionPane;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jump.I18N;
import com.vividsolutions.jump.feature.Feature;
import com.vividsolutions.jump.geom.EnvelopeUtil;
import com.vividsolutions.jump.util.CoordinateArrays;
import com.vividsolutions.jump.util.StringUtil;
import com.vividsolutions.jump.workbench.WorkbenchContext;
import com.vividsolutions.jump.workbench.model.Layer;
import com.vividsolutions.jump.workbench.model.LayerManager;
import com.vividsolutions.jump.workbench.plugin.AbstractPlugIn;
import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory;
import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck;
import com.vividsolutions.jump.workbench.plugin.PlugInContext;
public class ZoomToCoordinatePlugIn extends AbstractPlugIn {
private Coordinate lastCoordinate = new Coordinate(0, 0);
public boolean execute(PlugInContext context) throws Exception {
reportNothingToUndoYet(context);
Coordinate coordinate = prompt(context);
if (coordinate == null) {
return false;
}
lastCoordinate = coordinate;
context.getLayerViewPanel().getViewport()
.zoom(toEnvelope(coordinate, context.getLayerManager()));
return true;
}
private Coordinate prompt(PlugInContext context) {
while (true) {
try {
return toCoordinate(JOptionPane.showInputDialog(context
.getWorkbenchFrame(),
I18N.get("ui.zoom.ZoomToCoordinatePlugIn.enter-coordinate-to-zoom-to"), lastCoordinate.x + ", "
+ lastCoordinate.y));
} catch (Exception e) {
JOptionPane.showMessageDialog(context.getWorkbenchFrame(), e
.getMessage(),
context.getWorkbenchFrame().getTitle(),
JOptionPane.ERROR_MESSAGE);
}
}
}
private Envelope toEnvelope(Coordinate coordinate, LayerManager layerManager) {
int segments = 0;
int segmentSum = 0;
outer : for (Iterator i = layerManager.iterator(); i.hasNext(); ) {
Layer layer = (Layer) i.next();
for (Iterator j = layer.getFeatureCollectionWrapper().iterator(); j
.hasNext(); ) {
Feature feature = (Feature) j.next();
Collection coordinateArrays = CoordinateArrays.toCoordinateArrays(feature.getGeometry(), false);
for (Iterator k = coordinateArrays.iterator(); k.hasNext(); ) {
Coordinate[] coordinates = (Coordinate[]) k.next();
for (int a = 1; a < coordinates.length; a++) {
segments++;
segmentSum += coordinates[a].distance(coordinates[a-1]);
if (segments > 100) { break outer; }
}
}
}
}
Envelope envelope = new Envelope(coordinate);
//Choose a reasonable magnification [Jon Aquino 10/22/2003]
if (segmentSum > 0) {
envelope = EnvelopeUtil.expand(envelope,
segmentSum / (double) segments);
} else {
envelope = EnvelopeUtil.expand(envelope, 50);
}
return envelope;
}
private Coordinate toCoordinate(String s) throws Exception {
if (s == null) {
return null;
}
if (s.trim().length() == 0) {
return null;
}
s = StringUtil.replaceAll(s, ",", " ");
StringTokenizer tokenizer = new StringTokenizer(s);
String x = tokenizer.nextToken();
if (!StringUtil.isNumber(x)) {
throw new Exception("Not a number: " + x);
}
String y = tokenizer.nextToken();
if (!StringUtil.isNumber(y)) {
throw new Exception("Not a number: " + y);
}
return new Coordinate(Double.parseDouble(x), Double.parseDouble(y));
}
public MultiEnableCheck createEnableCheck(
final WorkbenchContext workbenchContext) {
EnableCheckFactory checkFactory = new EnableCheckFactory(
workbenchContext);
return new MultiEnableCheck().add(checkFactory
.createWindowWithLayerViewPanelMustBeActiveCheck());
}
}