public void run(JGraphFacade graph) {
		if (graph.getRootCount() == 0)
			graph.findTreeRoots();

		nodes.clear();
		for (int i = 0; i < graph.getRootCount(); i++) {
			graph.dfs(graph.getRootAt(i), new JGraphFacade.CellVisitor() {
				public void visit(Object parent, Object cell,
						Object previousSibling, int layer, int sibling) {
					if (!nodes.keySet().contains(cell)) {
						TreeNode parentNode = getTreeNode(parent);
						TreeNode childNode = getTreeNode(cell);
						if (parentNode != null)
							parentNode.children.add(childNode);
					}
				}
			});
		}

		Object root = (graph.getRootCount() == 1) ? graph.getRootAt(0) : null;
		TreeNode tree = getTreeNode(root);

		if (null == tree) {
			return;
		}
		double depth = tree.getDepth();

		// The bounds of the component
		if (graph.getRootCount() == 1) {
			Point2D loc = graph.getLocation(graph.getRootAt(0));
			rootx = (int) loc.getX();
			rooty = (int) loc.getY();
		} else {
			Rectangle2D rect = graph.getGraphBounds();
			if (rect != null) {
				rootx = (int) rect.getX() + (rect.getWidth() / 2);
				rooty = (int) rect.getY() + (rect.getHeight() / 2);
			}
		}

		if (autoRadius) {
			radiusx = Math.min(maxradiusx, Math.max(minradiusx, rootx / depth));
			radiusy = Math.min(maxradiusx, Math.max(minradiusy, rooty / depth));
		}

		layoutTree0(graph, tree);
		// dispatchResult(graph, nodes.values());
	}