private int distanceToLeaf(Node n) {
   if (graph.getSuccessors(n).isEmpty()) return 0;
   int result = 0;
   for (Object x : graph.getSuccessors(n)) {
     int tmp = distanceToLeaf((Node) x);
     if (tmp > result) result = tmp;
   }
   return 1 + result;
 }
 public Point2D getAnchorPosition(DerivationViewer.AnchorType type) {
   switch (type) {
     case ANCHOR_ROOT:
       return transform(root);
     case ANCHOR_LEFTMOST_LEAF:
       Node n = root;
       while (graph.getSuccessorCount(n) != 0) n = (Node) graph.getSuccessors(n).toArray()[0];
       return transform(n);
     default:
       return new Point2D.Double(0, 0);
   }
 }
  public DerivationTreeTransformer(DerivationTree t, Dimension d, boolean isAnchored) {
    this.isAnchored = isAnchored;
    anchorPoint = new Point2D.Double(0, 0);
    graph = t;
    DelegateForest<Node, DerivationTreeEdge> del = new DelegateForest<Node, DerivationTreeEdge>(t);
    del.setRoot(t.getRoot());
    del.setRoot(t.getSourceRoot());
    root = t.getRoot();
    sourceRoot = t.getSourceRoot();
    Y_DIST = d.getHeight() / (2 * (1 + distanceToLeaf(root)));
    int leafCount = 0;
    for (Node n : t.getVertices()) {
      if (t.outDegree(n) == 0) leafCount++;
    }
    X_DIST = d.getWidth() / leafCount;

    treeLayout = new TreeLayout<Node, DerivationTreeEdge>(del, (int) Math.round(X_DIST));
  }