package org.freeplane.features.map;
import org.freeplane.features.map.MapController.Direction;
import org.freeplane.features.mode.Controller;
public class MapNavigationUtils {
public static NodeModel findNext(final Direction direction, NodeModel current, final NodeModel end) {
if (current.getChildCount() != 0) {
final NodeModel next = (NodeModel) current.getChildAt(0);
if (atEnd(next, end)) {
return null;
}
return next;
}
for (;;) {
final NodeModel parentNode = current.getParentNode();
if (parentNode == null) {
return current;
}
final int index = parentNode.getIndex(current) + 1;
final int childCount = parentNode.getChildCount();
if (index < childCount) {
if (direction == Direction.FORWARD_N_FOLD) {
Controller.getCurrentModeController().getMapController().setFolded(current, true);
}
final NodeModel next = (NodeModel) parentNode.getChildAt(index);
if (atEnd(next, end)) {
return null;
}
return next;
}
current = parentNode;
if (atEnd(current, end)) {
return null;
}
}
}
private static boolean atEnd(NodeModel current, final NodeModel end) {
return end != null && current.equals(end);
}
public static NodeModel findPrevious(final Direction direction, NodeModel current, final NodeModel end) {
for (;;) {
final NodeModel parentNode = current.getParentNode();
if (parentNode == null) {
break;
}
if (direction == Direction.BACK_N_FOLD) {
Controller.getCurrentModeController().getMapController().setFolded(current, true);
}
final int index = parentNode.getIndex(current) - 1;
if (index < 0) {
if (direction == Direction.BACK_N_FOLD) {
Controller.getCurrentModeController().getMapController().setFolded(parentNode, true);
}
if (atEnd(parentNode, end)) {
return null;
}
return parentNode;
}
current = (NodeModel) parentNode.getChildAt(index);
if (atEnd(current, end)) {
return null;
}
break;
}
for (;;) {
if (current.getChildCount() == 0) {
if (atEnd(current, end)) {
return null;
}
return current;
}
current = (NodeModel) current.getChildAt(current.getChildCount() - 1);
}
}
}