/** * Returns the right most child of parent * * @param parent * @return the right most child of parent given. */ private GXMoreThanNode getRightMostChild(GXMoreThanNode parent) { GXMoreThanNode rightMost = parent.getChildren().get(0); // run through children for (GXMoreThanNode child : parent.getChildren()) { if (child.getX() < rightMost.getX()) { rightMost = child; } } return rightMost; }
/** * Lays out row with respect to it's children. * * @param yLocation - the vertical location to start placing the nodes. * @param row - the row who's nodes we'd like to lay out. */ private void placeRow(List<GXMoreThanNode> row, int yLocation) { List<GXMoreThanNode> childlessStrand = new ArrayList<GXMoreThanNode>(); GXMoreThanNode parentLeft = null; // for each parent in this parent row for (int j = 0; j < row.size(); j++) { GXMoreThanNode parentRight = row.get(j); // if the node has children if (!parentRight.getChildren().isEmpty()) { // place the node in the center above his children int parentX = 0; for (GXMoreThanNode child : parentRight.getChildren()) { parentX += child.getX(); } parentX /= parentRight.getChildren().size(); parentRight.setLocation(parentX, yLocation); // and layout the childless strand if (!childlessStrand.isEmpty()) { placeChildless(childlessStrand, parentLeft, parentRight, yLocation); childlessStrand.clear(); } parentLeft = parentRight; } else { // accumulate the childless nodes childlessStrand.add(parentRight); } } // place childless who are extra on the right. as in did not get taken care of when // the parents were laid out. if (!childlessStrand.isEmpty()) { placeChildless(childlessStrand, parentLeft, null, yLocation); } }
/** * Shifts the given tree by the shift factor given to the right. * * @param root - root of tree to shift * @param shift - factor to shirt by */ private void shiftTree(GXMoreThanNode root, int shift) { root.setLocation(root.getX() + shift, root.getY()); for (GXMoreThanNode child : root.getChildren()) { shiftTree(child, shift); } }