On Thu, 21 Dec 2023 21:13:14 GMT, Alexander Zuev <[email protected]> wrote:
>> NSAccessibility Outline is an accessibility representation of trees.
>> This representation requires that the visible children be represented as a
>> flat array.
>> The child linearization algorithm available in
>> ```CAccessibility.getChildrenAndRolesRecursive()``` is universal, i.e.
>> suitable for any object with the role of a tree, but is not efficient, since
>> it traverses the entire tree and selects suitable children.
>> For JTree, this algorithm can be optimized by using TreePath, but the old
>> algorithm will have to be retained to maintain versatility.
>
> src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibility.java line 799:
>
>> 797: for (int i = 0; i < count; i++) {
>> 798: TreePath path = tree.getPathForRow(i);
>> 799: Accessible an =
>> createAccessibleTreeNode(tree, path);
>
> I see that you are creating the accessible tree node with reflection calling
> its constructor. Can you just elaborate if it is the only way to get hold of
> it and why getting a tree.getAccessible().getAccessibleChild(i) does not work
> or what kind of problem getting the tree node this way creates?
A little lower, the access algorithm is implemented in the way you showed.
But to speed things up, I want to avoid recursion through the native and for
this it is easier to initialize those nodes that are present in the tree path
through the constructor. Why do I propose to use reflection? Otherwise, you
will either have to make the constructor of a double-nested class public, or
create a chain of methods that allow you to instantiate this class through a
new call in CAccessibility.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/17165#discussion_r1436078711