in kit/src/main/java/com/oracle/javafx/scenebuilder/kit/editor/panel/content/util/CardinalPoint.java [237:342]
public Bounds snapBounds(Bounds bounds, double ratio) {
/*
*
* NW N NE
* *----------------*----------------*
* | |
* | |
* | |
* W * * E
* | |
* | |
* | |
* *----------------*----------------*
* SW S SE
*
*
*/
final double minX = bounds.getMinX();
final double minY = bounds.getMinY();
final double maxX = bounds.getMaxX();
final double maxY = bounds.getMaxY();
final double snapWidth = bounds.getHeight() / ratio;
final double snapDX = snapWidth - bounds.getWidth();
final double snapHeight = bounds.getWidth() * ratio;
final double snapDY = snapHeight - bounds.getHeight();
final double newMinX, newMinY, newMaxX, newMaxY;
// x axis
switch(this) {
case N:
case S:
newMinX = minX - snapDX / 2.0;
newMaxX = maxX + snapDX / 2.0;
break;
case E:
case W:
newMinX = minX;
newMaxX = maxX;
break;
case NW:
case SW:
if (Math.abs(snapDX) >= Math.abs(snapDY)) {
newMinX = minX - snapDX;
} else {
newMinX = minX;
}
newMaxX = maxX;
break;
case NE:
case SE:
newMinX = minX;
if (Math.abs(snapDX) >= Math.abs(snapDY)) {
newMaxX = maxX + snapDX;
} else {
newMaxX = maxX;
}
break;
default:
// Emergency code
assert false : "Unexpected " + this;
newMinX = minX;
newMaxX = maxX;
break;
}
// y axis
switch(this) {
case N:
case S:
newMinY = minY;
newMaxY = maxY;
break;
case E:
case W:
newMinY = minY - snapDY / 2.0;
newMaxY = maxY + snapDY / 2.0;
break;
case NW:
case NE:
if (Math.abs(snapDY) > Math.abs(snapDX)) {
newMinY = minY - snapDY;
} else {
newMinY = minY;
}
newMaxY = maxY;
break;
case SW:
case SE:
newMinY = minY;
if (Math.abs(snapDY) > Math.abs(snapDX)) {
newMaxY = maxY + snapDY;
} else {
newMaxY = maxY;
}
break;
default:
// Emergency code
assert false : "Unexpected " + this;
newMinY = minY;
newMaxY = maxY;
break;
}
return new BoundingBox(newMinX, newMinY, newMaxX - newMinX, newMaxY - newMinY);
}