Commit both corner-resize dimensions in one host transaction

This commit is contained in:
2026-11-12 12:27:04 +01:00
parent dfa2dd1508
commit b9d59e162f
5 changed files with 220 additions and 35 deletions
@@ -118,6 +118,95 @@ public final class ProjectionHostChecks {
new javafx.scene.input.PickResult(node, p.getX() + dx, p.getY() + dy)));
}
public static void resizeCorner(DesignerPane pane, DocumentSession document) throws Exception {
String before = document.snapshot().toCompletableFuture().get().text();
fx(
() -> {
pane.kit().editor().getSelection().select(object(pane, "second"));
pane.applyCss();
pane.layout();
return null;
});
Thread.sleep(150);
double initialWidth =
fx(() -> ((SnapshotRegion) object(pane, "second").getSceneGraphObject()).getWidth());
double initialHeight =
fx(() -> ((SnapshotRegion) object(pane, "second").getSceneGraphObject()).getHeight());
fx(
() -> {
var handles = pane.content().lookupHandles(object(pane, "second"));
check(
handles
instanceof
com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.handles
.AbstractGenericHandles<
?>,
"Native resize handles missing");
var handle =
((com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.handles
.AbstractGenericHandles<
?>)
handles)
.getHandleNode(
com.oracle.javafx.scenebuilder.kit.editor.panel.content.util.CardinalPoint
.SE);
mouse(handle, javafx.scene.input.MouseEvent.MOUSE_PRESSED, 0, 0, true);
mouse(handle, javafx.scene.input.MouseEvent.DRAG_DETECTED, 20, 15, true);
mouse(handle, javafx.scene.input.MouseEvent.MOUSE_DRAGGED, 20, 15, true);
mouse(handle, javafx.scene.input.MouseEvent.MOUSE_RELEASED, 20, 15, false);
return null;
});
await(() -> !document.snapshot().toCompletableFuture().get().text().equals(before));
String resized = document.snapshot().toCompletableFuture().get().text();
check(
resized.contains("prefHeight=") && resized.contains("Card"),
"Resize must preserve real Component declaration");
var parser = javax.xml.parsers.DocumentBuilderFactory.newInstance();
parser.setNamespaceAware(true);
parser.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
var resizedXml =
parser
.newDocumentBuilder()
.parse(new org.xml.sax.InputSource(new java.io.StringReader(resized)));
var resizedNodes = resizedXml.getElementsByTagName("*");
org.w3c.dom.Element resizedCard = null;
for (int i = 0; i < resizedNodes.getLength(); i++) {
var candidate = (org.w3c.dom.Element) resizedNodes.item(i);
if (candidate.getAttributeNS("http://javafx.com/fxml/1", "id").equals("second"))
resizedCard = candidate;
}
String storedHeight = resizedCard.getAttribute("prefHeight");
check(
!storedHeight.isBlank() && Double.parseDouble(storedHeight) > initialHeight,
"Corner resize lost height: before="
+ initialHeight
+ " stored="
+ storedHeight
+ " source="
+ resized);
String storedWidth = resizedCard.getAttribute("prefWidth");
check(
!storedWidth.isBlank() && Double.parseDouble(storedWidth) > initialWidth,
"Corner resize lost width: before=" + initialWidth + " stored=" + storedWidth);
await(
() ->
fx(
() ->
source(pane).getText().equals(resized)
&& ((SnapshotRegion) object(pane, "second").getSceneGraphObject())
.getHeight()
> initialHeight));
click(pane, "Undo");
await(() -> document.snapshot().toCompletableFuture().get().text().equals(before));
await(() -> fx(() -> source(pane).getText().equals(before)));
click(pane, "Redo");
await(() -> document.snapshot().toCompletableFuture().get().text().equals(resized));
await(() -> fx(() -> source(pane).getText().equals(resized)));
click(pane, "Undo");
await(() -> document.snapshot().toCompletableFuture().get().text().equals(before));
await(() -> fx(() -> source(pane).getText().equals(before)));
}
public static void run(DesignerPane pane, DocumentSession document) throws Exception {
String original = document.snapshot().toCompletableFuture().get().text();
// The same real application, now with nested, fully-qualified Component declarations.
@@ -185,39 +274,7 @@ public final class ProjectionHostChecks {
pane.layout();
return null;
});
Thread.sleep(150);
fx(
() -> {
var handles = pane.content().lookupHandles(object(pane, "second"));
check(
handles
instanceof
com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.handles
.AbstractGenericHandles<
?>,
"Native resize handles missing");
var handle =
((com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.handles
.AbstractGenericHandles<
?>)
handles)
.getHandleNode(
com.oracle.javafx.scenebuilder.kit.editor.panel.content.util.CardinalPoint
.SE);
mouse(handle, javafx.scene.input.MouseEvent.MOUSE_PRESSED, 0, 0, true);
mouse(handle, javafx.scene.input.MouseEvent.DRAG_DETECTED, 20, 15, true);
mouse(handle, javafx.scene.input.MouseEvent.MOUSE_DRAGGED, 20, 15, true);
mouse(handle, javafx.scene.input.MouseEvent.MOUSE_RELEASED, 20, 15, false);
return null;
});
await(() -> !document.snapshot().toCompletableFuture().get().text().equals(changed));
String resized = document.snapshot().toCompletableFuture().get().text();
check(
resized.contains("prefHeight=") && resized.contains("fixture.components.Card"),
"Resize must preserve real Component declaration");
click(pane, "Undo");
await(() -> document.snapshot().toCompletableFuture().get().text().equals(changed));
await(() -> fx(() -> source(pane).getText().equals(changed)));
resizeCorner(pane, document);
// Exercise the exact Kit relocation command used after a canvas move. Native OS
// dragboard delivery is a separate manual/platform qualification, not synthesized here.
fx(
@@ -243,7 +300,11 @@ public final class ProjectionHostChecks {
document.save(snapshot.revision()).toCompletableFuture().get();
check(
java.nio.file.Files.readString(java.nio.file.Path.of(snapshot.document())).equals(changed),
"Save reformatted source");
"Save reformatted source: expected=["
+ changed
+ "] actual=["
+ java.nio.file.Files.readString(java.nio.file.Path.of(snapshot.document()))
+ "]");
try (var reopened =
pane.kit().host().documents().open(snapshot.document()).toCompletableFuture().get()) {
check(