@Override
    public Map<TreeNode, Bounds> getNodeBounds() {
        if (nodeBounds == null) {
            nodeBounds = new HashMap<>();
            for (final Entry<TreeNode, Point> entry : positions.entrySet()) {
                final TreeNode node = entry.getKey();
                final Point pos = entry.getValue();
                final Dimension dimension = nodeExtentProvider.getExtents(node);
                final double w = dimension.getWidth();
                final double h = dimension.getHeight();
                final double x = pos.getX() - w / 2;
                final double y = pos.getY() - h / 2;
                nodeBounds.put(node, new Bounds(x, y, w, h));
            }
        }
        return nodeBounds;
    }
In difference to the original algorithm we also pass in extra level
information.
stroom-core-client-widget/src/main/java/stroom/widget/htree/client/treelayout/AbegoTreeLayout.java