in graphLayout/jetbrains.mps.graphLayout.layeredLayout/source_gen/jetbrains/mps/graphLayout/layeredLayout/BKCoordinatePlacer.java [210:264]
public Map<Node, Node> computeBlocks(Iterator<List<Node>> layerIterator, final Edge.Direction dir, int layerDirection) {
Map<Node, Node> roots = new NodeMap<Node>(myGraph);
for (Node node : ListSequence.fromList(myGraph.getNodes())) {
MapSequence.fromMap(roots).put(node, node);
}
final Wrappers._T<_FunctionTypes._return_P2_E0<? extends Integer, ? super Edge, ? super Edge>> edgeComparator = new Wrappers._T<_FunctionTypes._return_P2_E0<? extends Integer, ? super Edge, ? super Edge>>();
int initPositionValue;
if (layerDirection == LEFTMOST) {
edgeComparator.value = new _FunctionTypes._return_P2_E0<Integer, Edge, Edge>() {
public Integer invoke(Edge a, Edge b) {
return MapSequence.fromMap(myPosInLayer).get(a.getTarget(dir)) - MapSequence.fromMap(myPosInLayer).get(b.getTarget(dir));
}
};
initPositionValue = -1;
} else {
edgeComparator.value = new _FunctionTypes._return_P2_E0<Integer, Edge, Edge>() {
public Integer invoke(Edge a, Edge b) {
return MapSequence.fromMap(myPosInLayer).get(b.getTarget(dir)) - MapSequence.fromMap(myPosInLayer).get(a.getTarget(dir));
}
};
initPositionValue = Integer.MAX_VALUE;
}
layerIterator.next();
while (layerIterator.hasNext()) {
int curConnectedPos = initPositionValue;
Iterator<Node> nodeIterator = getListIterator(layerIterator.next(), layerDirection);
while (nodeIterator.hasNext()) {
Node node = nodeIterator.next();
if (ListSequence.fromList(node.getEdges(dir)).count() > 0) {
List<Edge> sortedByPos = ListSequence.fromList(node.getEdges(dir)).sort(new Comparator<Edge>() {
public int compare(Edge a, Edge b) {
return edgeComparator.value.invoke(a, b);
}
}, true).toListSequence();
List<Edge> candidates = ListSequence.fromList(new ArrayList<Edge>());
ListSequence.fromList(candidates).addElement(ListSequence.fromList(sortedByPos).getElement((ListSequence.fromList(sortedByPos).count() - 1) / 2));
ListSequence.fromList(candidates).addElement(ListSequence.fromList(sortedByPos).getElement(ListSequence.fromList(sortedByPos).count() / 2));
if (layerDirection != LEFTMOST) {
candidates = ListSequence.fromList(candidates).reversedList();
}
boolean hasDummy0 = ListSequence.fromList(candidates).getElement(0).getSource().isDummy() || ListSequence.fromList(candidates).getElement(0).getTarget().isDummy();
boolean hasDummy1 = ListSequence.fromList(candidates).getElement(1).getSource().isDummy() || ListSequence.fromList(candidates).getElement(1).getTarget().isDummy();
if (hasDummy1 && !(hasDummy0)) {
candidates = ListSequence.fromList(candidates).reversedList();
}
for (Edge candidate : ListSequence.fromList(candidates)) {
if (MapSequence.fromMap(roots).get(node) == node) {
curConnectedPos = this.tryToAddRoot(node, roots, candidate, curConnectedPos, dir, layerDirection);
}
}
}
}
}
return roots;
}