Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
8268225: Support :focus-visible and :focus-within CSS pseudoclasses
Reviewed-by: kcr, aghaisas
  • Loading branch information
Michael Strauß authored and kevinrushforth committed Jul 11, 2022
1 parent 437c078 commit 8d5d3ca
Show file tree
Hide file tree
Showing 22 changed files with 624 additions and 174 deletions.
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2022, 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
Expand Down Expand Up @@ -66,6 +66,7 @@

import com.sun.javafx.scene.control.skin.resources.ControlResources;
import com.sun.javafx.scene.traversal.Direction;
import com.sun.javafx.scene.traversal.TraversalMethod;

import static com.sun.javafx.PlatformUtil.*;
import com.sun.javafx.scene.NodeHelper;
Expand Down Expand Up @@ -170,7 +171,7 @@ public DatePickerContent(final DatePicker datePicker) {
if (newFocusOwner == gridPane) {
if (oldFocusOwner instanceof DateCell) {
// Backwards traversal, skip gridPane.
NodeHelper.traverse(gridPane, Direction.PREVIOUS);
NodeHelper.traverse(gridPane, Direction.PREVIOUS, TraversalMethod.DEFAULT);
} else {
// Forwards traversal, pass focus to day cell.
if (lastFocusedDayCell != null) {
Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010, 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2022, 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
Expand Down Expand Up @@ -178,8 +178,7 @@ protected void keyReleased(KeyEvent e) {
* potentially arming the Button, this will transfer focus to the button
*/
protected void mousePressed(MouseEvent e) {
// if the button is not already focused, then request the focus
if (! getNode().isFocused() && getNode().isFocusTraversable()) {
if (getNode().isFocusTraversable()) {
getNode().requestFocus();
}

Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2022, 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
Expand All @@ -26,6 +26,7 @@

import com.sun.javafx.scene.NodeHelper;
import com.sun.javafx.scene.traversal.Direction;
import com.sun.javafx.scene.traversal.TraversalMethod;
import javafx.event.EventTarget;
import javafx.scene.Node;
import com.sun.javafx.scene.control.inputmap.InputMap;
Expand Down Expand Up @@ -86,61 +87,62 @@ public static <N extends Node> InputMap<N> createInputMap(N node) {
*
* @param node The node to traverse on
* @param dir The direction to traverse
* @param method The focus traversal method
*/
public static void traverse(final Node node, final Direction dir) {
public static void traverse(final Node node, final Direction dir, TraversalMethod method) {
if (node == null) {
throw new IllegalArgumentException("Attempting to traverse on a null Node. " +
"Most probably a KeyEvent has been fired with a null target specified.");
}
NodeHelper.traverse(node, dir);
NodeHelper.traverse(node, dir, method);
}

/**
* Calls the focus traversal engine and indicates that traversal should
* go the next focusTraversable Node above the current one.
*/
public static final void traverseUp(KeyEvent e) {
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.UP);
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.UP, TraversalMethod.KEY);
}

/**
* Calls the focus traversal engine and indicates that traversal should
* go the next focusTraversable Node below the current one.
*/
public static final void traverseDown(KeyEvent e) {
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.DOWN);
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.DOWN, TraversalMethod.KEY);
}

/**
* Calls the focus traversal engine and indicates that traversal should
* go the next focusTraversable Node left of the current one.
*/
public static final void traverseLeft(KeyEvent e) {
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.LEFT);
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.LEFT, TraversalMethod.KEY);
}

/**
* Calls the focus traversal engine and indicates that traversal should
* go the next focusTraversable Node right of the current one.
*/
public static final void traverseRight(KeyEvent e) {
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.RIGHT);
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.RIGHT, TraversalMethod.KEY);
}

/**
* Calls the focus traversal engine and indicates that traversal should
* go the next focusTraversable Node in the focus traversal cycle.
*/
public static final void traverseNext(KeyEvent e) {
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.NEXT);
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.NEXT, TraversalMethod.KEY);
}

/**
* Calls the focus traversal engine and indicates that traversal should
* go the previous focusTraversable Node in the focus traversal cycle.
*/
public static final void traversePrevious(KeyEvent e) {
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.PREVIOUS);
traverse(getNode(e), com.sun.javafx.scene.traversal.Direction.PREVIOUS, TraversalMethod.KEY);
}

private static Node getNode(KeyEvent e) {
Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2022, 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
Expand Down Expand Up @@ -109,8 +109,7 @@ public void trackPress(MouseEvent e, double position) {
// determine the percentage of the way between min and max
// represented by this mouse event
final Slider slider = getNode();
// If not already focused, request focus
if (!slider.isFocused()) slider.requestFocus();
slider.requestFocus();
if (slider.getOrientation().equals(Orientation.HORIZONTAL)) {
slider.adjustValue(position * (slider.getMax() - slider.getMin()) + slider.getMin());
} else {
Expand All @@ -123,9 +122,8 @@ public void trackPress(MouseEvent e, double position) {
* track and 1.0 being the end
*/
public void thumbPressed(MouseEvent e, double position) {
// If not already focused, request focus
final Slider slider = getNode();
if (!slider.isFocused()) slider.requestFocus();
slider.requestFocus();
slider.setValueChanging(true);
}

Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2022, 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
Expand All @@ -26,6 +26,7 @@
package com.sun.javafx.scene.control.behavior;

import com.sun.javafx.scene.NodeHelper;
import com.sun.javafx.scene.traversal.TraversalMethod;
import javafx.css.PseudoClass;
import javafx.scene.Node;
import javafx.scene.control.Control;
Expand Down Expand Up @@ -104,27 +105,27 @@ public void dispose() {
switch (((KeyEvent)event).getCode()) {
case TAB :
if (((KeyEvent)event).isShiftDown()) {
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS, TraversalMethod.KEY);
}
else {
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT, TraversalMethod.KEY);
}
event.consume();
break;
case UP :
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP, TraversalMethod.KEY);
event.consume();
break;
case DOWN :
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN, TraversalMethod.KEY);
event.consume();
break;
case LEFT :
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT, TraversalMethod.KEY);
event.consume();
break;
case RIGHT :
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT, TraversalMethod.KEY);
event.consume();
break;
case ENTER :
Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2022, 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
Expand All @@ -26,6 +26,7 @@
package com.sun.javafx.scene.control.behavior;

import com.sun.javafx.scene.NodeHelper;
import com.sun.javafx.scene.traversal.TraversalMethod;
import javafx.scene.Node;

import javafx.scene.Scene;
Expand Down Expand Up @@ -84,27 +85,27 @@ public void dispose() {
switch (((KeyEvent)event).getCode()) {
case TAB :
if (((KeyEvent)event).isShiftDown()) {
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS, TraversalMethod.KEY);
}
else {
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT, TraversalMethod.KEY);
}
event.consume();
break;
case UP :
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP, TraversalMethod.KEY);
event.consume();
break;
case DOWN :
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN, TraversalMethod.KEY);
event.consume();
break;
case LEFT :
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT, TraversalMethod.KEY);
event.consume();
break;
case RIGHT :
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT, TraversalMethod.KEY);
event.consume();
break;
case ENTER :
Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2022, 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
Expand Down Expand Up @@ -27,6 +27,7 @@

import com.sun.javafx.scene.NodeHelper;
import com.sun.javafx.scene.control.Properties;
import com.sun.javafx.scene.traversal.TraversalMethod;
import javafx.scene.Node;
import javafx.scene.Parent;

Expand Down Expand Up @@ -86,27 +87,27 @@ public void dispose() {
switch (((KeyEvent)event).getCode()) {
case TAB :
if (((KeyEvent)event).isShiftDown()) {
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS, TraversalMethod.KEY);
}
else {
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT, TraversalMethod.KEY);
}
event.consume();
break;
case UP :
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP, TraversalMethod.KEY);
event.consume();
break;
case DOWN :
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN, TraversalMethod.KEY);
event.consume();
break;
case LEFT :
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT, TraversalMethod.KEY);
event.consume();
break;
case RIGHT :
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT);
NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT, TraversalMethod.KEY);
event.consume();
break;
case ENTER :
Expand Down

1 comment on commit 8d5d3ca

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.