public void execute(Object parent,Object root){
  mxIGraphModel model=graph.getModel();
  if (root == null) {
    if (graph.getEdges(parent,model.getParent(parent),invert,!invert,false).length > 0) {
      root=parent;
    }
 else {
      Object[] roots=graph.findTreeRoots(parent,true,invert);
      if (roots.length > 0) {
        for (int i=0; i < roots.length; i++) {
          if (!isVertexIgnored(roots[i]) && graph.getEdges(roots[i],null,invert,!invert,false).length > 0) {
            root=roots[i];
            break;
          }
        }
      }
    }
  }
  if (root != null) {
    parent=model.getParent(root);
    model.beginUpdate();
    try {
      TreeNode node=dfs(root,parent,null);
      if (node != null) {
        layout(node);
        double x0=graph.getGridSize();
        double y0=x0;
        if (!moveTree || model.getParent(parent) == model.getRoot()) {
          mxGeometry g=model.getGeometry(root);
          if (g != null) {
            x0=g.getX();
            y0=g.getY();
          }
        }
        mxRectangle bounds=null;
        if (horizontal) {
          bounds=horizontalLayout(node,x0,y0,null);
        }
 else {
          bounds=verticalLayout(node,null,x0,y0,null);
        }
        if (bounds != null) {
          double dx=0;
          double dy=0;
          if (bounds.getX() < 0) {
            dx=Math.abs(x0 - bounds.getX());
          }
          if (bounds.getY() < 0) {
            dy=Math.abs(y0 - bounds.getY());
          }
          if (parent != null) {
            mxRectangle size=graph.getStartSize(parent);
            dx+=size.getWidth();
            dy+=size.getHeight();
            if (resizeParent && !graph.isCellCollapsed(parent)) {
              mxGeometry g=model.getGeometry(parent);
              if (g != null) {
                double width=bounds.getWidth() + size.getWidth() - bounds.getX() + 2 * x0;
                double height=bounds.getHeight() + size.getHeight() - bounds.getY() + 2 * y0;
                g=(mxGeometry)g.clone();
                if (g.getWidth() > width) {
                  dx+=(g.getWidth() - width) / 2;
                }
 else {
                  g.setWidth(width);
                }
                if (g.getHeight() > height) {
                  if (horizontal) {
                    dy+=(g.getHeight() - height) / 2;
                  }
                }
 else {
                  g.setHeight(height);
                }
                model.setGeometry(parent,g);
              }
            }
          }
          moveNode(node,dx,dy);
        }
      }
    }
  finally {
      model.endUpdate();
    }
  }
}

public void execute ( Object parent , Object root ) { mxIGraphModel model = graph . getModel ( ) ; if ( root == null ) { if ( graph . getEdges ( parent , model . getParent ( parent ) , invert , ! invert , false ) . length > 0 ) { root = parent ; } else { Object [ ] roots = graph . findTreeRoots ( parent , true , invert ) ; if ( roots . length > 0 ) { for ( int i = 0 ; i < roots . length ; i ++ ) { if ( ! isVertexIgnored ( roots [ i ] ) && graph . getEdges ( roots [ i ] , null , invert , ! invert , false ) . length > 0 ) { root = roots [ i ] ; break ; } } } } } if ( root != null ) { parent = model . getParent ( root ) ; model . beginUpdate ( ) ; try { TreeNode node = dfs ( root , parent , null ) ; if ( node != null ) { layout ( node ) ; double x0 = graph . getGridSize ( ) ; double y0 = x0 ; if ( ! moveTree || model . getParent ( parent ) == model . getRoot ( ) ) { mxGeometry g = model . getGeometry ( root ) ; if ( g != null ) { x0 = g . getX ( ) ; y0 = g . getY ( ) ; } } mxRectangle bounds = null ; if ( horizontal ) { bounds = horizontalLayout ( node , x0 , y0 , null ) ; } else { bounds = verticalLayout ( node , null , x0 , y0 , null ) ; } if ( bounds != null ) { double dx = 0 ; double dy = 0 ; if ( bounds . getX ( ) < 0 ) { dx = Math . abs ( x0 - bounds . getX ( ) ) ; } if ( bounds . getY ( ) < 0 ) { dy = Math . abs ( y0 - bounds . getY ( ) ) ; } if ( parent != null ) { mxRectangle size = graph . getStartSize ( parent ) ; dx += size . getWidth ( ) ; dy += size . getHeight ( ) ; if ( resizeParent && ! graph . isCellCollapsed ( parent ) ) { mxGeometry g = model . getGeometry ( parent ) ; if ( g != null ) { double width = bounds . getWidth ( ) + size . getWidth ( ) - bounds . getX ( ) + 2 * x0 ; double height = bounds . getHeight ( ) + size . getHeight ( ) - bounds . getY ( ) + 2 * y0 ; g = ( mxGeometry ) g . clone ( ) ; if ( g . getWidth ( ) > width ) { dx += ( g . getWidth ( ) - width ) / 2 ; } else { g . setWidth ( width ) ; } if ( g . getHeight ( ) > height ) { if ( horizontal ) { dy += ( g . getHeight ( ) - height ) / 2 ; } } else { g . setHeight ( height ) ; } model . setGeometry ( parent , g ) ; } } } moveNode ( node , dx , dy ) ; } } } finally { model . endUpdate ( ) ; } } }
implements < mxgraphlayout . execute > . if the parent has any connected edges , then it is used as the root of the tree . else , < mxgraph . findtreeroots > will be used to find a suitable root node within the set of children of the given parent .
