< prev index next >

src/jdk.accessibility/windows/classes/com/sun/java/accessibility/internal/AccessBridge.java

Print this page

        

@@ -1455,10 +1455,28 @@
         }
         debugString("[ERROR]: getAccessibleStatesStringFromContext; ac = null");
         return null;
     }
 
+    private int get_nonVisibleChildrenCountBeforeIndex(AccessibleContext parentAC, int beforeIndex) {
+        if (parentAC == null || beforeIndex < 0 || beforeIndex >= parentAC.getAccessibleChildrenCount()) {
+            return 0;
+        } else {
+            int childrenCount = parentAC.getAccessibleChildrenCount();
+            int nonVisibleChildrenCount = 0;
+            if (beforeIndex >= childrenCount) {
+                beforeIndex = childrenCount - 1;
+            }
+            for (int i = 0; i <= beforeIndex; i++) {
+                if (!parentAC.getAccessibleChild(i).getAccessibleContext().getAccessibleStateSet().contains(AccessibleState.SHOWING)) {
+                    nonVisibleChildrenCount++;
+                }
+            }
+            return nonVisibleChildrenCount;
+        }
+    }
+
     /**
      * returns the AccessibleParent from an AccessibleContext
      */
     private AccessibleContext getAccessibleParentFromContext(final AccessibleContext ac) {
         if (ac==null)

@@ -1485,11 +1503,16 @@
         if (ac==null)
             return -1;
         return InvocationUtils.invokeAndWait(new Callable<Integer>() {
             @Override
             public Integer call() throws Exception {
-                return ac.getAccessibleIndexInParent();
+                int indexInParent = ac.getAccessibleIndexInParent();
+                Accessible parent = ac.getAccessibleParent();
+                if (parent != null) {
+                    indexInParent -= get_nonVisibleChildrenCountBeforeIndex(parent.getAccessibleContext(), indexInParent);
+                }
+                return indexInParent;
             }
         }, ac);
     }
 
     /**

@@ -1499,11 +1522,12 @@
         if (ac==null)
             return -1;
         return InvocationUtils.invokeAndWait(new Callable<Integer>() {
             @Override
             public Integer call() throws Exception {
-                return ac.getAccessibleChildrenCount();
+                int childrenCount = ac.getAccessibleChildrenCount();
+                return childrenCount - get_nonVisibleChildrenCountBeforeIndex(ac, childrenCount);
             }
         }, ac);
     }
 
     /**

@@ -1535,11 +1559,12 @@
 
         if (table == null) {
             return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
                 @Override
                 public AccessibleContext call() throws Exception {
-                    Accessible a = ac.getAccessibleChild(index);
+                    int visibleIndex = index + get_nonVisibleChildrenCountBeforeIndex(ac, index);
+                    Accessible a = ac.getAccessibleChild(visibleIndex);
                     if (a != null) {
                         return a.getAccessibleContext();
                     }
                     return null;
                 }

@@ -3515,11 +3540,22 @@
                     AccessibleRelationSet ars = ac.getAccessibleRelationSet();
                     if (ars != null) {
                         AccessibleRelation[] relations = ars.toArray();
                         if (relations != null && i >= 0 && i < relations.length) {
                             Object[] targets = relations[i].getTarget();
-                            return targets.length;
+                            if (targets != null) {
+                                int nonVisibleTargets = 0;
+                                for (Object target : targets) {
+                                    if (target instanceof Accessible) {
+                                        AccessibleContext ac = ((Accessible) target).getAccessibleContext();
+                                        if (!ac.getAccessibleStateSet().contains(AccessibleState.SHOWING)) {
+                                            nonVisibleTargets++;
+                                        }
+                                    }
+                                }
+                                return targets.length - nonVisibleTargets;
+                            }
                         }
                     }
                 }
                 return -1;
             }

@@ -3530,22 +3566,22 @@
      * returns the jth target in the ith relation in the AccessibleContext's
      * AccessibleRelationSet
      */
     private AccessibleContext getAccessibleRelationTarget(final AccessibleContext ac,
                                                          final int i, final int j) {
-        debugString("[INFO]: ***** getAccessibleRelationTarget");
+        debugString("[INFO]: ***** getAccessibleRelationTarget: get target[" + j + "] from relation[" + i + "] ");
         return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
             @Override
             public AccessibleContext call() throws Exception {
                 if (ac != null) {
                     AccessibleRelationSet ars = ac.getAccessibleRelationSet();
                     if (ars != null) {
                         AccessibleRelation[] relations = ars.toArray();
                         if (relations != null && i >= 0 && i < relations.length) {
                             Object[] targets = relations[i].getTarget();
                             if (targets != null && j >= 0 & j < targets.length) {
-                                Object o = targets[j];
+                                Object o = targets[j + get_NonVisibleTargetCountBeforeIndex(targets, j)];
                                 if (o instanceof Accessible) {
                                     return ((Accessible) o).getAccessibleContext();
                                 }
                             }
                         }

@@ -3554,10 +3590,26 @@
                 return null;
             }
         }, ac);
     }
 
+    private int get_NonVisibleTargetCountBeforeIndex(Object[] targets, int indexBefore) {
+        if (indexBefore == 0 || indexBefore >= targets.length) {
+            return 0;
+        }
+        int nonVisibleTargetsCount = 0;
+        for (int i = 0 ; i <= indexBefore; i++) {
+            if (targets[i] instanceof Accessible) {
+                AccessibleContext ac = ((Accessible) targets[i]).getAccessibleContext();
+                if (ac != null && !ac.getAccessibleStateSet().contains(AccessibleState.SHOWING)) {
+                    nonVisibleTargetsCount++;
+                }
+            }
+        }
+        return nonVisibleTargetsCount;
+    }
+
     // ========= AccessibleHypertext =========
 
     private Map<AccessibleHypertext, AccessibleContext> hyperTextContextMap = new WeakHashMap<>();
     private Map<AccessibleHyperlink, AccessibleContext> hyperLinkContextMap = new WeakHashMap<>();
 
< prev index next >