protected GraphLayout doLayoutCopy(LayoutInfo patchInfo) { Graph graph = patchInfo.getGraph(); final Map<Node, Integer> components = ConnectivityComponents.getComponents(graph); int numComponents = 0; for (Node node : ListSequence.fromList(graph.getNodes())) { numComponents = Math.max(numComponents, MapSequence.fromMap(components).get(node)); } numComponents++; List<LayoutInfoCopier> copiers = ListSequence.fromList(new ArrayList<LayoutInfoCopier>(numComponents)); List<GraphLayout> subgraphLayouts = ListSequence.fromList(new ArrayList<GraphLayout>(numComponents)); for (int num = 0; num < numComponents; num++) { LayoutInfoCopier copier = new LayoutInfoCopier(patchInfo); ListSequence.fromList(copiers).addElement(copier); final int curComponent = num; copier.copySubgraph( new Filter<INode>() { public boolean accept(INode node) { Node myNode = ((Node) node); return (Integer) MapSequence.fromMap(components).get(myNode) == curComponent; } }); LayoutInfo subgraphInfo = copier.getLayoutInfoCopy(); ListSequence.fromList(subgraphLayouts).addElement(doLayoutConnectedGraph(subgraphInfo)); } List<Rectangle> subgraphLayoutRects = ListSequence.fromList(new ArrayList<Rectangle>(numComponents)); for (GraphLayout layout : ListSequence.fromList(subgraphLayouts)) { ListSequence.fromList(subgraphLayoutRects).addElement(layout.getContainingRectangle()); } List<Dimension> subgraphLayoutShifts = getSubgraphLayoutShifts(subgraphLayoutRects); GraphLayout graphLayout = GraphLayoutFactory.createGraphLayout(graph); for (int num = 0; num < numComponents; num++) { LayoutInfoCopier copier = ListSequence.fromList(copiers).getElement(num); GraphLayout layout = ListSequence.fromList(subgraphLayouts).getElement(num); Dimension shift = ListSequence.fromList(subgraphLayoutShifts).getElement(num); for (INode node : SetSequence.fromSet(copier.getCopiedNodes())) { Rectangle rect = layout.getNodeLayout(copier.getNodeCopy(node)); rect.translate(shift.width, shift.height); graphLayout.setLayoutFor(node, rect); } for (IEdge edge : SetSequence.fromSet(copier.getCopiedEdges())) { List<Point> path = layout.getEdgeLayout(copier.getEdgeCopy(edge)); for (Point point : ListSequence.fromList(path)) { point.translate(shift.width, shift.height); } graphLayout.setLayoutFor(edge, path); if (SetSequence.fromSet(patchInfo.getLabeledEdges()).contains(edge)) { Rectangle rect = layout.getLabelLayout(copier.getEdgeCopy(edge)); rect.translate(shift.width, shift.height); graphLayout.setLabelLayout(edge, rect); } } } return graphLayout; }