in kit/src/main/java/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeGesture.java [245:331]
private void updateSceneGraphObjectSize() {
assert resizer != null;
// Put the scene graph object back in its size/location at mouse pressed time
resizer.revertToOriginalSize();
if (relocater != null) {
relocater.revertToOriginalLocation();
}
final Node sceneGraphObject = resizer.getSceneGraphObject();
sceneGraphObject.getParent().layout();
// Compute mouse displacement in local coordinates of scene graph object
final double startSceneX = getMousePressedEvent().getSceneX();
final double startSceneY = getMousePressedEvent().getSceneY();
final double currentSceneX = getLastMouseEvent().getSceneX();
final double currentSceneY = getLastMouseEvent().getSceneY();
final Point2D start = sceneGraphObject.sceneToLocal(startSceneX, startSceneY, true /* rootScene */);
final Point2D current = sceneGraphObject.sceneToLocal(currentSceneX, currentSceneY, true /* rootScene */);
final double rawDeltaX, rawDeltaY;
if ((start != null) && (current != null)) {
rawDeltaX = current.getX() - start.getX();
rawDeltaY = current.getY() - start.getY();
} else {
// sceneGraphObject is bizarrely configured (eg it has scaleX=0)
// We use the scene coordinates
rawDeltaX = currentSceneX - startSceneX;
rawDeltaY = currentSceneY - startSceneY;
}
// Clamps deltaX/deltaY relatively to tunable.
// Example: tunable == E => clampDeltaX = rawDeltaX, clampDeltaY = 0.0
final Point2D clampDelta = tunable.clampVector(rawDeltaX, rawDeltaY);
final double clampDeltaX = clampDelta.getX();
final double clampDeltaY = clampDelta.getY();
// Compute candidateBounds
final Bounds layoutBounds = sceneGraphObject.getLayoutBounds();
final Bounds resizedBounds = tunable.getResizedBounds(layoutBounds, clampDeltaX, clampDeltaY);
final Bounds candidateBounds;
if (isSnapRequired()) {
final double ratio = layoutBounds.getHeight() / layoutBounds.getWidth();
candidateBounds = tunable.snapBounds(resizedBounds, ratio);
} else {
candidateBounds = resizedBounds;
}
// Computes new layout bounds from the candidate bounds
final double candidateWidth = candidateBounds.getWidth();
final double candidateHeight = candidateBounds.getHeight();
final Bounds newLayoutBounds = resizer.computeBounds(candidateWidth, candidateHeight);
final Bounds guidedLayoutBounds;
if (resizingGuideController == null) {
guidedLayoutBounds = newLayoutBounds;
} else if (guidesDisabled) {
resizingGuideController.clear();
guidedLayoutBounds = newLayoutBounds;
} else {
resizingGuideController.match(newLayoutBounds);
final double suggestedWidth = resizingGuideController.getSuggestedWidth();
final double suggestedHeight = resizingGuideController.getSuggestedHeight();
guidedLayoutBounds = resizer.computeBounds(suggestedWidth, suggestedHeight);
}
// Now computes the new location (in parent's local coordinate space)
final CardinalPoint fix = tunable.getOpposite();
final Point2D currentFixPos = fix.getPosition(layoutBounds);
final Point2D newFixPos = fix.getPosition(guidedLayoutBounds);
final Point2D currentParent = sceneGraphObject.localToParent(currentFixPos);
final Point2D newParent = sceneGraphObject.localToParent(newFixPos);
final double layoutDX = currentParent.getX() - newParent.getX();
final double layoutDY = currentParent.getY() - newParent.getY();
final double newLayoutX = sceneGraphObject.getLayoutX() + layoutDX;
final double newLayoutY = sceneGraphObject.getLayoutY() + layoutDY;
// Apply the new size and new location
resizer.changeWidth(guidedLayoutBounds.getWidth());
resizer.changeHeight(guidedLayoutBounds.getHeight());
if (relocater != null) {
sceneGraphObject.getParent().layout();
relocater.moveToLayoutX(newLayoutX, guidedLayoutBounds);
relocater.moveToLayoutY(newLayoutY, guidedLayoutBounds);
}
sceneGraphObject.getParent().layout();
updateHudWindow();
}