Skip to content

Commit 8d5d3ca

Browse files
Michael Straußkevinrushforth
authored andcommitted
8268225: Support :focus-visible and :focus-within CSS pseudoclasses
Reviewed-by: kcr, aghaisas
1 parent 437c078 commit 8d5d3ca

File tree

22 files changed

+624
-174
lines changed

22 files changed

+624
-174
lines changed

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/DatePickerContent.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -66,6 +66,7 @@
6666

6767
import com.sun.javafx.scene.control.skin.resources.ControlResources;
6868
import com.sun.javafx.scene.traversal.Direction;
69+
import com.sun.javafx.scene.traversal.TraversalMethod;
6970

7071
import static com.sun.javafx.PlatformUtil.*;
7172
import com.sun.javafx.scene.NodeHelper;
@@ -170,7 +171,7 @@ public DatePickerContent(final DatePicker datePicker) {
170171
if (newFocusOwner == gridPane) {
171172
if (oldFocusOwner instanceof DateCell) {
172173
// Backwards traversal, skip gridPane.
173-
NodeHelper.traverse(gridPane, Direction.PREVIOUS);
174+
NodeHelper.traverse(gridPane, Direction.PREVIOUS, TraversalMethod.DEFAULT);
174175
} else {
175176
// Forwards traversal, pass focus to day cell.
176177
if (lastFocusedDayCell != null) {

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/ButtonBehavior.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2010, 2020, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -178,8 +178,7 @@ protected void keyReleased(KeyEvent e) {
178178
* potentially arming the Button, this will transfer focus to the button
179179
*/
180180
protected void mousePressed(MouseEvent e) {
181-
// if the button is not already focused, then request the focus
182-
if (! getNode().isFocused() && getNode().isFocusTraversable()) {
181+
if (getNode().isFocusTraversable()) {
183182
getNode().requestFocus();
184183
}
185184

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/FocusTraversalInputMap.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2015, 2022, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
2626

2727
import com.sun.javafx.scene.NodeHelper;
2828
import com.sun.javafx.scene.traversal.Direction;
29+
import com.sun.javafx.scene.traversal.TraversalMethod;
2930
import javafx.event.EventTarget;
3031
import javafx.scene.Node;
3132
import com.sun.javafx.scene.control.inputmap.InputMap;
@@ -86,61 +87,62 @@ public static <N extends Node> InputMap<N> createInputMap(N node) {
8687
*
8788
* @param node The node to traverse on
8889
* @param dir The direction to traverse
90+
* @param method The focus traversal method
8991
*/
90-
public static void traverse(final Node node, final Direction dir) {
92+
public static void traverse(final Node node, final Direction dir, TraversalMethod method) {
9193
if (node == null) {
9294
throw new IllegalArgumentException("Attempting to traverse on a null Node. " +
9395
"Most probably a KeyEvent has been fired with a null target specified.");
9496
}
95-
NodeHelper.traverse(node, dir);
97+
NodeHelper.traverse(node, dir, method);
9698
}
9799

98100
/**
99101
* Calls the focus traversal engine and indicates that traversal should
100102
* go the next focusTraversable Node above the current one.
101103
*/
102104
public static final void traverseUp(KeyEvent e) {
103-
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.UP);
105+
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.UP, TraversalMethod.KEY);
104106
}
105107

106108
/**
107109
* Calls the focus traversal engine and indicates that traversal should
108110
* go the next focusTraversable Node below the current one.
109111
*/
110112
public static final void traverseDown(KeyEvent e) {
111-
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.DOWN);
113+
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.DOWN, TraversalMethod.KEY);
112114
}
113115

114116
/**
115117
* Calls the focus traversal engine and indicates that traversal should
116118
* go the next focusTraversable Node left of the current one.
117119
*/
118120
public static final void traverseLeft(KeyEvent e) {
119-
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.LEFT);
121+
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.LEFT, TraversalMethod.KEY);
120122
}
121123

122124
/**
123125
* Calls the focus traversal engine and indicates that traversal should
124126
* go the next focusTraversable Node right of the current one.
125127
*/
126128
public static final void traverseRight(KeyEvent e) {
127-
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.RIGHT);
129+
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.RIGHT, TraversalMethod.KEY);
128130
}
129131

130132
/**
131133
* Calls the focus traversal engine and indicates that traversal should
132134
* go the next focusTraversable Node in the focus traversal cycle.
133135
*/
134136
public static final void traverseNext(KeyEvent e) {
135-
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.NEXT);
137+
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.NEXT, TraversalMethod.KEY);
136138
}
137139

138140
/**
139141
* Calls the focus traversal engine and indicates that traversal should
140142
* go the previous focusTraversable Node in the focus traversal cycle.
141143
*/
142144
public static final void traversePrevious(KeyEvent e) {
143-
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.PREVIOUS);
145+
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.PREVIOUS, TraversalMethod.KEY);
144146
}
145147

146148
private static Node getNode(KeyEvent e) {

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/SliderBehavior.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -109,8 +109,7 @@ public void trackPress(MouseEvent e, double position) {
109109
// determine the percentage of the way between min and max
110110
// represented by this mouse event
111111
final Slider slider = getNode();
112-
// If not already focused, request focus
113-
if (!slider.isFocused()) slider.requestFocus();
112+
slider.requestFocus();
114113
if (slider.getOrientation().equals(Orientation.HORIZONTAL)) {
115114
slider.adjustValue(position * (slider.getMax() - slider.getMin()) + slider.getMin());
116115
} else {
@@ -123,9 +122,8 @@ public void trackPress(MouseEvent e, double position) {
123122
* track and 1.0 being the end
124123
*/
125124
public void thumbPressed(MouseEvent e, double position) {
126-
// If not already focused, request focus
127125
final Slider slider = getNode();
128-
if (!slider.isFocused()) slider.requestFocus();
126+
slider.requestFocus();
129127
slider.setValueChanging(true);
130128
}
131129

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/TwoLevelFocusBehavior.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
2626
package com.sun.javafx.scene.control.behavior;
2727

2828
import com.sun.javafx.scene.NodeHelper;
29+
import com.sun.javafx.scene.traversal.TraversalMethod;
2930
import javafx.css.PseudoClass;
3031
import javafx.scene.Node;
3132
import javafx.scene.control.Control;
@@ -104,27 +105,27 @@ public void dispose() {
104105
switch (((KeyEvent)event).getCode()) {
105106
case TAB :
106107
if (((KeyEvent)event).isShiftDown()) {
107-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS);
108+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS, TraversalMethod.KEY);
108109
}
109110
else {
110-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT);
111+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT, TraversalMethod.KEY);
111112
}
112113
event.consume();
113114
break;
114115
case UP :
115-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP);
116+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP, TraversalMethod.KEY);
116117
event.consume();
117118
break;
118119
case DOWN :
119-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN);
120+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN, TraversalMethod.KEY);
120121
event.consume();
121122
break;
122123
case LEFT :
123-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT);
124+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT, TraversalMethod.KEY);
124125
event.consume();
125126
break;
126127
case RIGHT :
127-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT);
128+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT, TraversalMethod.KEY);
128129
event.consume();
129130
break;
130131
case ENTER :

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/TwoLevelFocusComboBehavior.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
2626
package com.sun.javafx.scene.control.behavior;
2727

2828
import com.sun.javafx.scene.NodeHelper;
29+
import com.sun.javafx.scene.traversal.TraversalMethod;
2930
import javafx.scene.Node;
3031

3132
import javafx.scene.Scene;
@@ -84,27 +85,27 @@ public void dispose() {
8485
switch (((KeyEvent)event).getCode()) {
8586
case TAB :
8687
if (((KeyEvent)event).isShiftDown()) {
87-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS);
88+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS, TraversalMethod.KEY);
8889
}
8990
else {
90-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT);
91+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT, TraversalMethod.KEY);
9192
}
9293
event.consume();
9394
break;
9495
case UP :
95-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP);
96+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP, TraversalMethod.KEY);
9697
event.consume();
9798
break;
9899
case DOWN :
99-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN);
100+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN, TraversalMethod.KEY);
100101
event.consume();
101102
break;
102103
case LEFT :
103-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT);
104+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT, TraversalMethod.KEY);
104105
event.consume();
105106
break;
106107
case RIGHT :
107-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT);
108+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT, TraversalMethod.KEY);
108109
event.consume();
109110
break;
110111
case ENTER :

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/TwoLevelFocusListBehavior.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,7 @@
2727

2828
import com.sun.javafx.scene.NodeHelper;
2929
import com.sun.javafx.scene.control.Properties;
30+
import com.sun.javafx.scene.traversal.TraversalMethod;
3031
import javafx.scene.Node;
3132
import javafx.scene.Parent;
3233

@@ -86,27 +87,27 @@ public void dispose() {
8687
switch (((KeyEvent)event).getCode()) {
8788
case TAB :
8889
if (((KeyEvent)event).isShiftDown()) {
89-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS);
90+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS, TraversalMethod.KEY);
9091
}
9192
else {
92-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT);
93+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT, TraversalMethod.KEY);
9394
}
9495
event.consume();
9596
break;
9697
case UP :
97-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP);
98+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP, TraversalMethod.KEY);
9899
event.consume();
99100
break;
100101
case DOWN :
101-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN);
102+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN, TraversalMethod.KEY);
102103
event.consume();
103104
break;
104105
case LEFT :
105-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT);
106+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT, TraversalMethod.KEY);
106107
event.consume();
107108
break;
108109
case RIGHT :
109-
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT);
110+
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT, TraversalMethod.KEY);
110111
event.consume();
111112
break;
112113
case ENTER :

0 commit comments

Comments
 (0)