package com.vividsolutions.jump.workbench.ui;
import java.awt.geom.NoninvertibleTransformException;
import java.awt.geom.Point2D;
import java.util.*;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jump.util.StringUtil;
import com.vividsolutions.jump.feature.AttributeType;
import com.vividsolutions.jump.feature.Feature;
import com.vividsolutions.jump.geom.EnvelopeUtil;
import com.vividsolutions.jump.workbench.model.Layer;
import com.vividsolutions.jump.workbench.ui.cursortool.SpecifyFeaturesTool;
/**
* To customize the LayerViewPanel's tooltips, call LayerViewPanel#setToolTipText.
* You can specify attribute names in curly brackets e.g. {fid}.
*/
public class ToolTipWriter {
private boolean enabled = false;
private LayerViewPanel panel;
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public ToolTipWriter(LayerViewPanel panel) {
this.panel = panel;
}
public String write(String template, Point2D mouseLocation) {
int PIXEL_BUFFER = 2;
if (!enabled) {
return null;
}
Map layerToSpecifiedFeaturesMap;
try {
layerToSpecifiedFeaturesMap =
SpecifyFeaturesTool.layerToSpecifiedFeaturesMap(
panel.getLayerManager().iterator(),
EnvelopeUtil.expand(
new Envelope(
panel.getViewport().toModelCoordinate(mouseLocation)),
PIXEL_BUFFER / panel.getViewport().getScale()));
} catch (NoninvertibleTransformException e) {
return "";
}
if (layerToSpecifiedFeaturesMap.isEmpty()) {
return null;
}
if (template == null || template.trim().length() == 0) {
return writeDefaultToolTip(layerToSpecifiedFeaturesMap);
}
String toolTip = template;
for (Iterator i = extractAttributeNames(template).iterator(); i.hasNext();) {
String attributeName = (String) i.next();
toolTip =
StringUtil.replaceAll(
toolTip,
"{" + attributeName + "}",
findValue(attributeName, layerToSpecifiedFeaturesMap));
}
return toolTip;
}
private String writeDefaultToolTip(Map layerToSpecifiedFeaturesMap) {
Feature feature =
(Feature) ((Collection) layerToSpecifiedFeaturesMap
.values()
.iterator()
.next())
.iterator()
.next();
String toolTip = "<html>";
toolTip += format("FID", "" + feature.getID());
for (int i = 0; i < Math.min(4, feature.getSchema().getAttributeCount()); i++) {
if (feature.getSchema().getAttributeType(i) == AttributeType.GEOMETRY) {
continue;
}
toolTip += "<br>"
+ format(feature.getSchema().getAttributeName(i), feature.getAttribute(i));
}
toolTip += "</html>";
return toolTip;
}
private String format(String name, Object value) {
return "<b>" + name + ":</b> " + value;
}
private String findValue(String attributeName, Map layerToSpecifiedFeaturesMap) {
for (Iterator i = layerToSpecifiedFeaturesMap.keySet().iterator();
i.hasNext();
) {
Layer layer = (Layer) i.next();
for (int j = 0;
j
< layer
.getFeatureCollectionWrapper()
.getFeatureSchema()
.getAttributeCount();
j++) {
if ("fid".equalsIgnoreCase(attributeName)) {
return ""
+ ((Feature) ((Collection) layerToSpecifiedFeaturesMap.get(layer))
.iterator()
.next())
.getID();
}
if (layer
.getFeatureCollectionWrapper()
.getFeatureSchema()
.getAttributeName(j)
.equalsIgnoreCase(attributeName)) {
return ""
+ (
(Feature) ((Collection) layerToSpecifiedFeaturesMap
.get(layer))
.iterator()
.next())
.getAttribute(
j);
}
}
}
return "";
}
private Set extractAttributeNames(String template) {
TreeSet attributeNames = new TreeSet();
String currentAttributeName = "";
for (int i = 0; i < template.length(); i++) {
switch (template.charAt(i)) {
case '{' :
currentAttributeName = "";
break;
case '}' :
attributeNames.add(currentAttributeName.trim());
currentAttributeName = "";
break;
default :
currentAttributeName += template.charAt(i);
break;
}
}
return attributeNames;
}
}