package nodebox.client.visualizer;
import com.google.common.collect.Iterables;
import nodebox.graphics.Grob;
import java.awt.*;
import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
/**
* Visualizes NodeBox graphics objects.
*/
public final class GrobVisualizer implements Visualizer {
public static final GrobVisualizer INSTANCE = new GrobVisualizer();
private GrobVisualizer() {
}
public boolean accepts(Iterable<?> objects, Class listClass) {
return Grob.class.isAssignableFrom(listClass);
}
public Rectangle2D getBounds(Iterable<?> objects) {
Rectangle2D.Double bounds = new Rectangle2D.Double();
for (Object o : objects) {
if (o instanceof Grob) {
Grob grob = (Grob) o;
bounds.add(grob.getBounds().getRectangle2D());
} else if (o instanceof Iterable) {
bounds.add(getBounds((Iterable<?>) o));
}
}
// Make sure the width and height or greater than zero.
// This happen when drawing a single vertical line, for example.
bounds.width = bounds.width > 0 ? bounds.width : 1;
bounds.height = bounds.height > 0 ? bounds.height : 1;
return bounds;
}
public Point2D getOffset(Iterable<?> objects, Dimension2D size) {
return new Point2D.Double(size.getWidth() / 2, size.getHeight() / 2);
}
@SuppressWarnings("unchecked")
public void draw(Graphics2D g, Iterable<?> objects) {
Object firstObject = Iterables.getFirst(objects, null);
if (firstObject instanceof Grob)
drawGrobs(g, (Iterable<Grob>) objects);
else if (firstObject instanceof Iterable) {
for (Object o : objects)
draw(g, (Iterable<?>) o);
}
}
public static void drawGrobs(Graphics2D g, Iterable<Grob> objects) {
for (Grob grob : objects) {
grob.draw(g);
}
}
}