Skip to content

Commit bdadcb2

Browse files
committed
8284542: [Accessibility] [Win] Missing attribute for toggle state of CheckBox in CheckBoxTreeItem
Reviewed-by: kcr, kizune, angorya
1 parent 6aeaff3 commit bdadcb2

File tree

5 files changed

+141
-7
lines changed

5 files changed

+141
-7
lines changed

modules/javafx.controls/src/main/java/javafx/scene/control/cell/CheckBoxTreeCell.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525

2626
package javafx.scene.control.cell;
2727

28+
import javafx.scene.AccessibleAttribute;
29+
import javafx.scene.AccessibleAttribute.ToggleState;
30+
import javafx.scene.AccessibleRole;
31+
2832
import javafx.scene.control.CheckBoxTreeItem;
2933
import javafx.beans.property.BooleanProperty;
3034
import javafx.beans.property.ObjectProperty;
@@ -344,6 +348,7 @@ private CheckBoxTreeCell(
344348

345349
// by default the graphic is null until the cell stops being empty
346350
setGraphic(null);
351+
setAccessibleRole(AccessibleRole.CHECK_BOX_TREE_ITEM);
347352
}
348353

349354

@@ -479,4 +484,19 @@ public final Callback<TreeItem<T>, ObservableValue<Boolean>> getSelectedStateCal
479484
// This was done to resolve RT-33603, but will impact the ability for
480485
// TreeItem.graphic to change dynamically.
481486
}
487+
488+
/** {@inheritDoc} */
489+
@Override public Object queryAccessibleAttribute(AccessibleAttribute attribute, Object... parameters) {
490+
switch (attribute) {
491+
case TOGGLE_STATE:
492+
if (checkBox.isIndeterminate()) {
493+
return ToggleState.INDETERMINATE;
494+
} else if (checkBox.isSelected()) {
495+
return ToggleState.CHECKED;
496+
} else {
497+
return ToggleState.UNCHECKED;
498+
}
499+
default: return super.queryAccessibleAttribute(attribute, parameters);
500+
}
501+
}
482502
}

modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacAccessible.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,13 @@ private static enum MacRole {
361361
},
362362
null
363363
),
364-
NSAccessibilityRowRole(new AccessibleRole[] {AccessibleRole.LIST_ITEM, AccessibleRole.TABLE_ROW, AccessibleRole.TREE_ITEM, AccessibleRole.TREE_TABLE_ROW},
364+
NSAccessibilityRowRole(new AccessibleRole[] {
365+
AccessibleRole.LIST_ITEM,
366+
AccessibleRole.TABLE_ROW,
367+
AccessibleRole.TREE_ITEM,
368+
AccessibleRole.CHECK_BOX_TREE_ITEM,
369+
AccessibleRole.TREE_TABLE_ROW
370+
},
365371
new MacAttribute[] {
366372
MacAttribute.NSAccessibilitySubroleAttribute,
367373
MacAttribute.NSAccessibilityIndexAttribute,
@@ -483,7 +489,11 @@ static MacRole getRole(AccessibleRole targetRole) {
483489
private static enum MacSubrole {
484490
NSAccessibilityTableRowSubrole(AccessibleRole.LIST_ITEM, AccessibleRole.TABLE_ROW),
485491
NSAccessibilitySecureTextFieldSubrole(AccessibleRole.PASSWORD_FIELD),
486-
NSAccessibilityOutlineRowSubrole(new AccessibleRole[] { AccessibleRole.TREE_ITEM, AccessibleRole.TREE_TABLE_ROW },
492+
NSAccessibilityOutlineRowSubrole(new AccessibleRole[] {
493+
AccessibleRole.TREE_ITEM,
494+
AccessibleRole.CHECK_BOX_TREE_ITEM,
495+
AccessibleRole.TREE_TABLE_ROW
496+
},
487497
new MacAttribute[] {
488498
MacAttribute.NSAccessibilityDisclosedByRowAttribute,
489499
MacAttribute.NSAccessibilityDisclosedRowsAttribute,
@@ -748,8 +758,9 @@ public void sendNotification(AccessibleAttribute notification) {
748758
}
749759

750760
AccessibleRole role = (AccessibleRole) getAttribute(ROLE);
751-
if (role == AccessibleRole.TREE_ITEM || role == AccessibleRole.TREE_TABLE_ROW) {
752-
AccessibleRole containerRole = role == AccessibleRole.TREE_ITEM ? AccessibleRole.TREE_VIEW : AccessibleRole.TREE_TABLE_VIEW;
761+
if (role == AccessibleRole.TREE_ITEM || role == AccessibleRole.CHECK_BOX_TREE_ITEM || role == AccessibleRole.TREE_TABLE_ROW) {
762+
AccessibleRole containerRole = (role == AccessibleRole.TREE_ITEM || role == AccessibleRole.CHECK_BOX_TREE_ITEM) ?
763+
AccessibleRole.TREE_VIEW : AccessibleRole.TREE_TABLE_VIEW;
753764
MacAccessible container = (MacAccessible)getContainerAccessible(containerRole);
754765
if (container != null) {
755766
NSAccessibilityPostNotification(container.getNativeAccessible(), MacNotification.NSAccessibilityRowCountChangedNotification.ptr);

modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinAccessible.java

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -299,14 +299,16 @@ public void sendNotification(AccessibleAttribute notification) {
299299
break;
300300
}
301301
case INDETERMINATE: {
302-
if (getAttribute(ROLE) == AccessibleRole.CHECK_BOX) {
302+
Object role = getAttribute(ROLE);
303+
if (role == AccessibleRole.CHECK_BOX || role == AccessibleRole.CHECK_BOX_TREE_ITEM) {
303304
notifyToggleState();
304305
}
305306
break;
306307
}
307308
case SELECTED: {
308309
Object role = getAttribute(ROLE);
309-
if (role == AccessibleRole.CHECK_BOX || role == AccessibleRole.TOGGLE_BUTTON) {
310+
if (role == AccessibleRole.CHECK_BOX || role == AccessibleRole.TOGGLE_BUTTON
311+
|| role == AccessibleRole.CHECK_BOX_TREE_ITEM) {
310312
notifyToggleState();
311313
break;
312314
}
@@ -431,6 +433,7 @@ private Accessible getContainer() {
431433
case LIST_ITEM: return getContainerAccessible(AccessibleRole.LIST_VIEW);
432434
case TAB_ITEM: return getContainerAccessible(AccessibleRole.TAB_PANE);
433435
case PAGE_ITEM: return getContainerAccessible(AccessibleRole.PAGINATION);
436+
case CHECK_BOX_TREE_ITEM:
434437
case TREE_ITEM: return getContainerAccessible(AccessibleRole.TREE_VIEW);
435438
case TREE_TABLE_ROW:
436439
case TREE_TABLE_CELL: return getContainerAccessible(AccessibleRole.TREE_TABLE_VIEW);
@@ -477,6 +480,7 @@ private int getControlType() {
477480
case COMBO_BOX: return UIA_ComboBoxControlTypeId;
478481
case HYPERLINK: return UIA_HyperlinkControlTypeId;
479482
case TREE_VIEW: return UIA_TreeControlTypeId;
483+
case CHECK_BOX_TREE_ITEM:
480484
case TREE_ITEM: return UIA_TreeItemControlTypeId;
481485
case PROGRESS_INDICATOR: return UIA_ProgressBarControlTypeId;
482486
case TOOL_BAR: return UIA_ToolBarControlTypeId;
@@ -530,6 +534,7 @@ private void changeSelection(boolean add, boolean clear) {
530534
}
531535
break;
532536
}
537+
case CHECK_BOX_TREE_ITEM:
533538
case TREE_ITEM: {
534539
Integer index = (Integer)getAttribute(INDEX);
535540
if (index != null) {
@@ -628,6 +633,12 @@ private long GetPatternProvider(int patternId) {
628633
impl = patternId == UIA_SelectionPatternId ||
629634
patternId == UIA_ScrollPatternId;
630635
break;
636+
case CHECK_BOX_TREE_ITEM:
637+
impl = patternId == UIA_SelectionItemPatternId ||
638+
patternId == UIA_ExpandCollapsePatternId ||
639+
patternId == UIA_ScrollItemPatternId ||
640+
patternId == UIA_TogglePatternId;
641+
break;
631642
case TREE_ITEM:
632643
impl = patternId == UIA_SelectionItemPatternId ||
633644
patternId == UIA_ExpandCollapsePatternId ||
@@ -913,6 +924,15 @@ private WinVariant GetPropertyValue(int propertyId) {
913924
variant.bstrVal = "JavaFXProvider";
914925
break;
915926
}
927+
case UIA_ToggleToggleStatePropertyId: {
928+
AccessibleRole role = (AccessibleRole) getAttribute(ROLE);
929+
if (role == AccessibleRole.CHECK_BOX_TREE_ITEM) {
930+
variant = new WinVariant();
931+
variant.vt = WinVariant.VT_I4;
932+
variant.lVal = get_ToggleState();
933+
}
934+
break;
935+
}
916936
default:
917937
}
918938
return variant;
@@ -1008,7 +1028,8 @@ private long Navigate(int direction) {
10081028
if (isDisposed()) return 0;
10091029
AccessibleRole role = (AccessibleRole)getAttribute(ROLE);
10101030
/* special case for the tree item hierarchy, as expected by Windows */
1011-
boolean treeCell = role == AccessibleRole.TREE_ITEM;
1031+
boolean treeCell = (role == AccessibleRole.TREE_ITEM
1032+
|| role == AccessibleRole.CHECK_BOX_TREE_ITEM);
10121033
Node node = null;
10131034
switch (direction) {
10141035
case NavigateDirection_Parent: {
@@ -1369,6 +1390,7 @@ private void Select() {
13691390
executeAction(AccessibleAction.FIRE);
13701391
break;
13711392
case LIST_ITEM:
1393+
case CHECK_BOX_TREE_ITEM:
13721394
case TREE_ITEM:
13731395
case TABLE_CELL:
13741396
case TREE_TABLE_CELL:
@@ -1562,6 +1584,16 @@ private void Toggle() {
15621584

15631585
private int get_ToggleState() {
15641586
if (isDisposed()) return 0;
1587+
if (getAttribute(ROLE) == AccessibleRole.CHECK_BOX_TREE_ITEM) {
1588+
ToggleState toggleState = (ToggleState)getAttribute(TOGGLE_STATE);
1589+
if (toggleState == ToggleState.INDETERMINATE) {
1590+
return ToggleState_Indeterminate;
1591+
} else if (toggleState == ToggleState.CHECKED) {
1592+
return ToggleState_On;
1593+
} else {
1594+
return ToggleState_Off;
1595+
}
1596+
}
15651597
if (Boolean.TRUE.equals(getAttribute(INDETERMINATE))) {
15661598
return ToggleState_Indeterminate;
15671599
}
@@ -1888,6 +1920,7 @@ private void ScrollIntoView() {
18881920
}
18891921
break;
18901922
}
1923+
case CHECK_BOX_TREE_ITEM:
18911924
case TREE_ITEM: {
18921925
Integer index = (Integer)getAttribute(INDEX);
18931926
if (index != null) {

modules/javafx.graphics/src/main/java/javafx/scene/AccessibleAttribute.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,27 @@ public enum AccessibleAttribute {
337337
*/
338338
INDETERMINATE(Boolean.class),
339339

340+
/**
341+
* Returns {@link ToggleState toggle state} of CheckBox of CheckBoxTreeItem.
342+
* <ul>
343+
* <li>Used by: CheckBoxTreeItem</li>
344+
* <li>Needs notify: yes </li>
345+
* <li>Return Type: {@link ToggleState}
346+
* <ul>
347+
* <li>{@link ToggleState#UNCHECKED ToggleState.UNCHECKED}: control is not selected</li>
348+
* <li>{@link ToggleState#CHECKED ToggleState.CHECKED}: control is selected</li>
349+
* <li>{@link ToggleState#INDETERMINATE ToggleState.INDETERMINATE}:
350+
* selection state of control cannot be determined</li>
351+
* </ul>
352+
* </li>
353+
* <li>Parameters: </li>
354+
* </ul>
355+
*
356+
* @see ToggleState
357+
* @since 21
358+
*/
359+
TOGGLE_STATE(ToggleState.class),
360+
340361
/**
341362
* Returns the item at the given index.
342363
* <ul>
@@ -800,4 +821,26 @@ public enum AccessibleAttribute {
800821
public Class<?> getReturnType() {
801822
return returnClass;
802823
}
824+
825+
/**
826+
* This enum describes the values for {@link AccessibleAttribute#TOGGLE_STATE TOGGLE_STATE} attribute.
827+
*
828+
* @since 21
829+
*/
830+
public enum ToggleState {
831+
/**
832+
* Indicates that the toggle control is not selected.
833+
*/
834+
UNCHECKED,
835+
836+
/**
837+
* Indicates that the toggle control is selected.
838+
*/
839+
CHECKED,
840+
841+
/**
842+
* Indicates that the toggle state of the control cannot be determined.
843+
*/
844+
INDETERMINATE
845+
}
803846
}

modules/javafx.graphics/src/main/java/javafx/scene/AccessibleRole.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,33 @@ public enum AccessibleRole {
739739
*/
740740
TREE_ITEM,
741741

742+
/**
743+
* Check Box Tree Item role.
744+
* <p>
745+
* Attributes:
746+
* <ul>
747+
* <li> {@link AccessibleAttribute#TEXT} </li>
748+
* <li> {@link AccessibleAttribute#INDEX} </li>
749+
* <li> {@link AccessibleAttribute#SELECTED} </li>
750+
* <li> {@link AccessibleAttribute#EXPANDED} </li>
751+
* <li> {@link AccessibleAttribute#LEAF} </li>
752+
* <li> {@link AccessibleAttribute#DISCLOSURE_LEVEL} </li>
753+
* <li> {@link AccessibleAttribute#TREE_ITEM_COUNT} </li>
754+
* <li> {@link AccessibleAttribute#TREE_ITEM_AT_INDEX} </li>
755+
* <li> {@link AccessibleAttribute#TREE_ITEM_PARENT} </li>
756+
* <li> {@link AccessibleAttribute#TOGGLE_STATE} </li>
757+
* </ul>
758+
* Actions:
759+
* <ul>
760+
* <li> {@link AccessibleAction#EXPAND} </li>
761+
* <li> {@link AccessibleAction#COLLAPSE} </li>
762+
* <li> {@link AccessibleAction#REQUEST_FOCUS} </li>
763+
* </ul>
764+
*
765+
* @since 21
766+
*/
767+
CHECK_BOX_TREE_ITEM,
768+
742769
/**
743770
* Tree Table Cell role.
744771
* <p>

0 commit comments

Comments
 (0)