From 1bdb93c792cf7c218c74ec5cacda8bac1242f73b Mon Sep 17 00:00:00 2001 From: Jose Pereda Date: Thu, 25 Jul 2024 18:28:46 +0000 Subject: [PATCH 01/75] 8334874: Horizontal scroll events from touch pads should scroll the TabPane tabs Reviewed-by: angorya, kcr --- .../scene/control/skin/TabPaneSkin.java | 12 +- .../javafx/scene/control/TabPaneTest.java | 103 +++++++++++++++++- 2 files changed, 111 insertions(+), 4 deletions(-) diff --git a/modules/javafx.controls/src/main/java/javafx/scene/control/skin/TabPaneSkin.java b/modules/javafx.controls/src/main/java/javafx/scene/control/skin/TabPaneSkin.java index 49236076d5c..e17f447a466 100644 --- a/modules/javafx.controls/src/main/java/javafx/scene/control/skin/TabPaneSkin.java +++ b/modules/javafx.controls/src/main/java/javafx/scene/control/skin/TabPaneSkin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -934,17 +934,23 @@ public TabHeaderArea() { // Scrolling the mouse wheel downwards results in the tabs scrolling left (i.e. exposing the right-most tabs) // Scrolling the mouse wheel upwards results in the tabs scrolling right (i.e. exposing th left-most tabs) addEventHandler(ScrollEvent.SCROLL, (ScrollEvent e) -> { + double dx = e.getDeltaX(); + double dy = e.getDeltaY(); + Side side = getSkinnable().getSide(); side = side == null ? Side.TOP : side; switch (side) { default: case TOP: case BOTTOM: - setScrollOffset(scrollOffset + e.getDeltaY()); + // Consider vertical scroll events (dy > dx) from mouse wheel and trackpad, + // and horizontal scroll events from a trackpad (dx > dy) + dx = Math.abs(dy) > Math.abs(dx) ? dy : dx; + setScrollOffset(scrollOffset + dx); break; case LEFT: case RIGHT: - setScrollOffset(scrollOffset - e.getDeltaY()); + setScrollOffset(scrollOffset - dy); break; } diff --git a/modules/javafx.controls/src/test/java/test/javafx/scene/control/TabPaneTest.java b/modules/javafx.controls/src/test/java/test/javafx/scene/control/TabPaneTest.java index 7b624c425e8..76b8c0266ae 100644 --- a/modules/javafx.controls/src/test/java/test/javafx/scene/control/TabPaneTest.java +++ b/modules/javafx.controls/src/test/java/test/javafx/scene/control/TabPaneTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,6 +38,7 @@ import static org.junit.Assert.fail; import javafx.scene.control.SelectionModel; +import javafx.scene.input.ScrollEvent; import test.com.sun.javafx.scene.control.infrastructure.StageLoader; import javafx.application.Platform; import javafx.beans.property.BooleanProperty; @@ -1241,4 +1242,104 @@ public void testSMLeakOnSwitchSkinAndSM() { attemptGC(10, weakSMRef); assertNull(weakSMRef.get()); } + + @Test + public void testVerticalScrollTopSide() { + scrollTabPane(Side.TOP, 0, -100); + } + + @Test + public void testVerticalScrollRightSide() { + scrollTabPane(Side.RIGHT, 0, 100); + } + + @Test + public void testVerticalScrollBottomSide() { + scrollTabPane(Side.BOTTOM, 0, -100); + } + + @Test + public void testVerticalScrollLeftSide() { + scrollTabPane(Side.LEFT, 0, 100); + } + + @Test + public void testHorizontalScrollTopSide() { + scrollTabPane(Side.TOP, -100, 0); + } + + @Test + public void testHorizontalScrollRightSide() { + scrollTabPane(Side.RIGHT, 100, 0); + } + + @Test + public void testHorizontalScrollBottomSide() { + scrollTabPane(Side.BOTTOM, -100, 0); + } + + @Test + public void testHorizontalScrollLeftSide() { + scrollTabPane(Side.LEFT, 100, 0); + } + + private void scrollTabPane(Side side, double deltaX, double deltaY) { + tabPane.setMaxSize(400, 100); + tabPane.setSide(side); + for (int i = 0; i < 40; i++) { + Tab tab = new Tab("Tab " + (1000 + i)); + tabPane.getTabs().add(tab); + } + root.getChildren().add(tabPane); + stage.show(); + + Bounds firstTabBounds = tabPane.lookupAll(".tab-label") + .stream() + .findFirst() + .map(n -> n.localToScene(n.getLayoutBounds())) + .orElse(null); + assertNotNull(firstTabBounds); + + Bounds layoutBounds = tabPane.getLayoutBounds(); + double minX = tabPane.localToScene(layoutBounds).getMinX(); + double minY = tabPane.localToScene(layoutBounds).getMinY(); + double minScrX = tabPane.localToScreen(layoutBounds).getMinX(); + double minScrY = tabPane.localToScreen(layoutBounds).getMinY(); + double x = 50; + double y = 10; + + SceneHelper.processMouseEvent(scene, + MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_MOVED, minX + x, minY + y)); + tk.firePulse(); + + StackPane tabHeaderArea = (StackPane) tabPane.lookup(".tab-header-area"); + assertNotNull(tabHeaderArea); + + Event.fireEvent(tabHeaderArea, new ScrollEvent( + ScrollEvent.SCROLL, + minX + x, minY + y, + minScrX + x, minScrY + y, + false, false, false, false, true, false, + deltaX, deltaY, deltaX, deltaY, + ScrollEvent.HorizontalTextScrollUnits.NONE, 0.0, + ScrollEvent.VerticalTextScrollUnits.NONE, 0.0, + 0, null)); + tk.firePulse(); + + Bounds newFirstTabBounds = tabPane.lookupAll(".tab-label") + .stream() + .findFirst() + .map(n -> n.localToScene(n.getLayoutBounds())) + .orElse(null); + assertNotNull(newFirstTabBounds); + + if (side.equals(Side.TOP) || side.equals(Side.BOTTOM)) { + double delta = Math.abs(deltaY) > Math.abs(deltaX) ? deltaY : deltaX; + assertEquals(firstTabBounds.getMinX() + delta, newFirstTabBounds.getMinX(), 0); + assertEquals(firstTabBounds.getMinY(), newFirstTabBounds.getMinY(), 0); + } else { + assertEquals(firstTabBounds.getMinX(), newFirstTabBounds.getMinX(), 0); + assertEquals(firstTabBounds.getMinY() - deltaY, newFirstTabBounds.getMinY(), 0); + } + } } From cb7127d4b5e0c230adced8d24e7f695c519e9082 Mon Sep 17 00:00:00 2001 From: Andy Goryachev Date: Mon, 29 Jul 2024 15:14:49 +0000 Subject: [PATCH 02/75] 8337229: Missing @Overrides in GlassSystemMenuShim Reviewed-by: kcr --- .../java/com/sun/javafx/tk/quantum/GlassSystemMenuShim.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/javafx.graphics/src/shims/java/com/sun/javafx/tk/quantum/GlassSystemMenuShim.java b/modules/javafx.graphics/src/shims/java/com/sun/javafx/tk/quantum/GlassSystemMenuShim.java index 98b552374f2..232f1582605 100644 --- a/modules/javafx.graphics/src/shims/java/com/sun/javafx/tk/quantum/GlassSystemMenuShim.java +++ b/modules/javafx.graphics/src/shims/java/com/sun/javafx/tk/quantum/GlassSystemMenuShim.java @@ -40,10 +40,12 @@ public GlassSystemMenuShim() { super(); } + @Override public void setMenus(List menus) { super.setMenus(menus); } + @Override public void createMenuBar() { super.createMenuBar(); } From 686a396c6f1a5ee0733a69a046d2131f4649eca8 Mon Sep 17 00:00:00 2001 From: Andy Goryachev Date: Mon, 29 Jul 2024 15:15:12 +0000 Subject: [PATCH 03/75] 8337228: Eclipse: missing dependencies in systemTests-test project Reviewed-by: kcr, jhendrikx --- tests/system/src/test/.classpath | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/src/test/.classpath b/tests/system/src/test/.classpath index 3887b5741c0..f5e67812870 100644 --- a/tests/system/src/test/.classpath +++ b/tests/system/src/test/.classpath @@ -14,7 +14,7 @@ - + From 41de02023571d146f392de012a55011a5f87fc9d Mon Sep 17 00:00:00 2001 From: Andy Goryachev Date: Fri, 2 Aug 2024 18:00:02 +0000 Subject: [PATCH 04/75] 8336331: Doc: Clarification in AccessibleAttribute, AccessibleRole Reviewed-by: arapte, kizune --- .../java/javafx/scene/AccessibleAction.java | 2 +- .../java/javafx/scene/AccessibleAttribute.java | 17 ++++++++++------- .../main/java/javafx/scene/AccessibleRole.java | 3 ++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/modules/javafx.graphics/src/main/java/javafx/scene/AccessibleAction.java b/modules/javafx.graphics/src/main/java/javafx/scene/AccessibleAction.java index 0660f71f9fd..5213804cf5e 100644 --- a/modules/javafx.graphics/src/main/java/javafx/scene/AccessibleAction.java +++ b/modules/javafx.graphics/src/main/java/javafx/scene/AccessibleAction.java @@ -119,7 +119,7 @@ public enum AccessibleAction { /** * Request the node to show a text range, scrolling if required. - *

Used by TextField and TextArea.

+ *

Used by TextArea.

* * Parameters: *