OK +1 from me.
-phil.
On 7/11/19, 2:47 PM, Sergey Bylokhov wrote:
On 11/07/2019 11:31, Phil Race wrote:
It seems we don't have a method like boolean
Toolkit.isModifierKeyCode(int keyCode) ? I mean if we did, then it
could internally know what are the modifier keys for the current
platform and you wouldn't have that set of ORs.
As far as I understand no we do not have such methods, we rarely use
keyCode for modifiers keys itself, usually we use the modifiers masks
which are applies to some other key events.
Why was the return value being ignored here ? I presume this method
must have a side-effect that is part of what you are describing ?
7113 Component component = renderer.getTableCellRendererComponent(
7114 JTable.this, null, false, false,
This code was added back in 1997 as a first draft of accessibility
support for JTable.
Initially we use this component in the similar way as an editor in the
current fix, something like this:
================
Component component = renderer.getTableCellRendererComponent(
JTable.this, null, false, row, column);
if (component instanceof Accessible) {
return (Accessible) component;
} else {
return new AccessibleJTableCell(column, row, JTable.this);
}
================
But since then we move this code to the AccessibleJTableCell itself:
================
8023 protected class AccessibleJTableCell extends
AccessibleContext
8024 implements Accessible, AccessibleComponent {
...........
...........
8068 protected AccessibleContext
getCurrentAccessibleContext() {
8069 TableColumn aColumn =
getColumnModel().getColumn(column);
8070 TableCellRenderer renderer =
aColumn.getCellRenderer();
8071 if (renderer == null) {
8072 Class<?> columnClass = getColumnClass(column);
8073 renderer = getDefaultRenderer(columnClass);
8074 }
8075 Component component =
renderer.getTableCellRendererComponent(
8076 JTable.this, getValueAt(row,
column),
8077 false, false, row, column);
8078 if (component instanceof Accessible) {
8079 return component.getAccessibleContext();
8080 } else {
8081 return null;
8082 }
8083 }
...........
...........
8092 protected Component getCurrentComponent() {
8093 TableColumn aColumn =
getColumnModel().getColumn(column);
8094 TableCellRenderer renderer =
aColumn.getCellRenderer();
8095 if (renderer == null) {
8096 Class<?> columnClass = getColumnClass(column);
8097 renderer = getDefaultRenderer(columnClass);
8098 }
8099 return renderer.getTableCellRendererComponent(
8100 JTable.this, null, false, false,
8101 row, column);
8102 }
================
7115 row, column); -phil
On 7/10/19 10:16 PM, Sergey Bylokhov wrote:
Hello.
Please review the fix for JDK 13.
Bug: https://bugs.openjdk.java.net/browse/JDK-8226653
Fix: http://cr.openjdk.java.net/~serb/8226653/webrev.01
Short description:
If the user starts to edit the cell in the "default" JTable then we
show the text editor in the cell but did not transfer the focus to it.
This feature breaks the accessibility tools, which cannot report
information about the current editor.
I suggest to try it in the SwingSet2 to see how this feature actually
works. The idea of the current fix is to disable this feature + some
other related small fixes.
Long description(from small changes to big):
- CAccessible.java:
When the user completes the editing of the cell we post
ACCESSIBLE_TABLE_MODEL_CHANGED event, and we need to notify the
native system that the data inside the table was changed.
- JTable.processKeyBinding():
1) We do not want to start editing of the cell if the only modifier
key is pressed, but some of the modifier keys were missed:
VK_ALT_GRAPH and KeyEvent.VK_META(which is CMD key on the
macOS).
2) To enable the "surrendersFocusOnKeystroke" property, I have
to add
one more flag, because I cannot do this via the public API:
https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/javax/swing/JTable.html#setSurrendersFocusOnKeystroke(boolean)
Note that it is specified as "false" by default, and setting it
to "true" even under the Accessibility tool may break the spec.
Probably we need to clarify this behavior in JDK 14.
- JTable.java.getAccessibleAt()/getAccessibleChild():
The accessibility API represent the table as a grid of cells,
and ignores
the real child of the table. Each cell is represented as a
AccessibleJTableCell, this AccessibleJTableCell is used as a
proxy object
and transfer all requests to the real component which is
responsible to
draw the cell. Note that it is specified that the render is
returned by
some of its methods:
https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/javax/swing/JTable.AccessibleJTable.AccessibleJTableCell.html#getCurrentAccessibleContext()
So we cannot modify these methods to return context of the
editor, instead
I added the switch before we return "AccessibleJTableCell".
In JDK 14 it can be moved to the "right" place.
Addition thoughts about "FocusOnKeystroke" feature:
- We can leave this feature as-is and report the current editor to
the accessibility tool even if the editor is not focused, but
this may
confuse the user because it will not be possible to move the
cursor or
select the text from the keyboard and this is not expected
behavior of the
text editor.
- We also can disable the editing of the cell on the fly, and start
it only
if the user emulates the mouse click inside the table.
- Or we can leave everything as-is and move the responsibility for
this
feature to the application, which will enable or disable
"FocusOnKeystroke" feature.