package ch.rakudave.jnetmap.view.jung;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.util.List;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import org.apache.commons.collections15.Transformer;
import ch.rakudave.jnetmap.model.IF.NetworkIF;
import ch.rakudave.jnetmap.model.device.Device;
import ch.rakudave.jnetmap.model.device.Device.Type;
import ch.rakudave.jnetmap.util.Icons;
import edu.uci.ics.jung.visualization.FourPassImageShaper;
import edu.uci.ics.jung.visualization.decorators.EllipseVertexShapeTransformer;
import edu.uci.ics.jung.visualization.decorators.VertexIconShapeTransformer;
import edu.uci.ics.jung.visualization.picking.PickedState;
/**
* Custom JUNG transformers for vertices
* @author rakudave
*/
public class VertexTransformers {
public static Transformer<Device, Icon> iconTransformer(final PickedState<Device> pi) {
return new Transformer<Device, Icon>() {
@Override
public Icon transform(Device arg0) {
return getIcon(arg0, (pi.isPicked(arg0))?"_s":"");
}
};
}
private static Icon getIcon(Device d, String flag) {
Type type = d.getType();
if (type != null) {
if (type.equals(Type.Other)) {
ImageIcon img = Icons.fromBase64(d.getOtherID());
if (img != null) return img;
} else {
return Icons.getCisco(type.toString().toLowerCase() + flag);
}
}
return Icons.getCisco("workstation" + flag);
}
public static Transformer<Device, Shape> shapeTransformer() {
return new DeviceVertexIconShapeTransformer<Device>(new EllipseVertexShapeTransformer<Device>());
}
public static Transformer<Device, String> tooltipTransformer() {
return new Transformer<Device, String>() {
@Override
public String transform(Device arg0) {
List<NetworkIF> nifs = arg0.getInterfaces();
if (nifs.isEmpty()) return "---";
int i = 0;
StringBuffer sb = new StringBuffer("<html>");
for (NetworkIF nif : nifs) {
sb.append(nif.getName());
if (nif.getAddress() != null) {
sb.append(": ");
sb.append(nif.getAddress().getHostAddress());
}
if (++i != nifs.size()) sb.append("<br />");
}
return sb.append("</html>").toString();
}
};
}
public static class DeviceVertexIconShapeTransformer<V> extends VertexIconShapeTransformer<V> {
public DeviceVertexIconShapeTransformer(Transformer<V,Shape> delegate) {
super(delegate);
}
public Shape transform(V v) {
Icon icon = getIcon((Device) v, "");
if (icon != null && icon instanceof ImageIcon) {
Image image = ((ImageIcon) icon).getImage();
Shape shape = shapeMap.get(image);
if (shape == null) {
shape = FourPassImageShaper.getShape(image, 30);
if(shape.getBounds().getWidth() > 0 &&
shape.getBounds().getHeight() > 0) {
int width = image.getWidth(null);
int height = image.getHeight(null);
AffineTransform transform =
AffineTransform.getTranslateInstance(-width / 2, -height / 2);
shape = transform.createTransformedShape(shape);
shapeMap.put(image, shape);
}
}
return shape;
} else {
return delegate.transform(v);
}
}
}
}