package org.iplantc.phyloviewer.shared.scene; import java.util.ArrayList; import org.iplantc.phyloviewer.shared.layout.ILayoutData; import org.iplantc.phyloviewer.shared.math.Box2D; import org.iplantc.phyloviewer.shared.math.Vector2; import org.iplantc.phyloviewer.shared.model.IDocument; import org.iplantc.phyloviewer.shared.model.INode; public class DrawableBuilderCladogram implements IDrawableBuilder { Vector2 pixelOffset = new Vector2(7, 2); @Override public Drawable[] buildNode(INode node, IDocument document, ILayoutData layout) { Vector2 position = layout.getPosition(node); Point point = new Point(position); point.setContext(Drawable.Context.CONTEXT_NODE); return new Drawable[] { point }; } @Override public Drawable[] buildBranch(INode parent, INode child, IDocument document, ILayoutData layout) { Vector2 start = layout.getPosition(parent); Vector2 end = layout.getPosition(child); Vector2 vertices[] = new Vector2[3]; vertices[0] = start; vertices[1] = new Vector2(start.getX(), end.getY()); vertices[2] = end; Box2D box = new Box2D(); box.expandBy(start); box.expandBy(end); Line line = new Line(vertices, box); line.setContext(Drawable.Context.CONTEXT_BRANCH); ArrayList<Drawable> drawables = new ArrayList<Drawable>(); drawables.add(line); if(document != null && document.hasBranchDecoration(child.getId())) { double halfBase = 0.015; Vector2 horizontalLine = end.subtract(vertices[1]); double halfLength = horizontalLine.length() / 2.0; Vector2 midPoint = new Vector2(start.getX() + halfLength, end.getY()); Vector2 v0 = midPoint.subtract(new Vector2(halfBase, -halfBase)); Vector2 v1 = midPoint.add(new Vector2(0.0, -halfBase)); Vector2 v2 = midPoint.add(new Vector2(halfBase, halfBase)); Polygon triangle = Polygon.createTriangle(v0, v1, v2); triangle.setContext(Drawable.Context.CONTEXT_BRANCH); drawables.add(triangle); } return (Drawable[])drawables.toArray(new Drawable[drawables.size()]); } @Override public Drawable buildText(INode node, IDocument document, ILayoutData layout) { String text = document.getLabel(node); Vector2 position = layout.getPosition(node); Text drawable = new Text(text, position, pixelOffset); drawable.setContext(Drawable.Context.CONTEXT_LABEL); return drawable; } @Override public Drawable[] buildNodeAbstraction(INode node, IDocument document, ILayoutData layout) { Box2D boundingBox = layout.getBoundingBox(node); Vector2 min = boundingBox.getMin(); Vector2 max = boundingBox.getMax(); double x = max.getX(); double y0 = min.getY(); double y1 = max.getY(); Vector2 v0 = layout.getPosition(node); Vector2 v1 = new Vector2(x, y0); Vector2 v2 = new Vector2(x, y1); Polygon triangle = Polygon.createTriangle(v0, v1, v2); triangle.setContext(Drawable.Context.CONTEXT_GLYPH); String text = document.getLabel(node); Vector2 position = new Vector2(max.getX(), (min.getY() + max.getY()) / 2.0); Text drawable = new Text(text, position, pixelOffset); drawable.setContext(Drawable.Context.CONTEXT_LABEL); return new Drawable[] { triangle, drawable }; } }