package bluej.graph;
import bluej.pkgmgr.Package;
import bluej.pkgmgr.target.Target;
import javafx.scene.input.KeyCode;
import threadchecker.OnThread;
import threadchecker.Tag;
| A strategy to move graph selections with keyboard input.
|
| @author fisker
|
@OnThread(Tag.FXPlatform)
public class TraverseStrategyImpl
implements TraverseStrategy{
private double calcDistance(Target vertex1, Target vertex2)
{
if (vertex1 == null || vertex2 == null) {
return Double.POSITIVE_INFINITY;
}
int x1 = vertex1.getX() + vertex1.getWidth() / 2;
int y1 = vertex1.getY() + vertex1.getHeight() / 2;
int x2 = vertex2.getX() + vertex2.getWidth() / 2;
int y2 = vertex2.getY() + vertex2.getHeight() / 2;
double d = Math.sqrt(Math.pow((x2 - x1), 2) + Math.pow((y2 - y1), 2));
return d;
}
| Given a currently selected vertex and a key press, decide which vertex
| should be selected next.
|
| @param graph The graph we're looking at.
| @param currentVertex The currently selected vertex.
| @param key The key that was pressed.
| @return A vertex that should be selected now.
|
public Target findNextVertex(Package graph, Target currentVertex, KeyCode key)
{
int currentVertexCenterX = currentVertex.getX() + currentVertex.getWidth() / 2;
int currentVertexCenterY = currentVertex.getY() + currentVertex.getHeight() / 2;
int x;
int y;
double closest = Double.POSITIVE_INFINITY;
double currentDistance;
Target closestVertex = null;
boolean left, right, up, down, notSelf, inRightRegion;
for (Target v : graph.getVertices()) {
x = v.getX() + v.getWidth() / 2 - currentVertexCenterX;
y = v.getY() + v.getHeight() / 2 - currentVertexCenterY;
left = key == KeyCode.LEFT && y >= x && y <= -x;
right = key == KeyCode.RIGHT && y <= x && y >= -x;
up = key == KeyCode.UP && y <= x && y <= -x;
down = key == KeyCode.DOWN && y >= x && y >= -x;
notSelf = currentVertex != v;
inRightRegion = (left || right || up || down) && notSelf;
if (inRightRegion) {
if (closestVertex == null) {
closestVertex = v;
closest = calcDistance(v, currentVertex);
}
if (closest > (currentDistance = calcDistance(v, currentVertex))) {
closest = currentDistance;
closestVertex = v;
}
}
}
if (closestVertex == null) {
closestVertex = currentVertex;
}
return closestVertex;
}
}
top,
use,
map,
class TraverseStrategyImpl
. calcDistance
. findNextVertex
83 neLoCode
+ 8 LoComm