< prev index next >

src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibility.java

Print this page




  69     }
  70 
  71     private CAccessibility() {
  72         KeyboardFocusManager.getCurrentKeyboardFocusManager().addPropertyChangeListener("focusOwner", this);
  73     }
  74 
  75     public void propertyChange(final PropertyChangeEvent evt) {
  76         if (evt.getNewValue() == null) return;
  77         focusChanged();
  78     }
  79 
  80     private native void focusChanged();
  81 
  82     static <T> T invokeAndWait(final Callable<T> callable, final Component c) {
  83         try {
  84             return LWCToolkit.invokeAndWait(callable, c);
  85         } catch (final Exception e) { e.printStackTrace(); }
  86         return null;
  87     }
  88 









  89     static void invokeLater(final Runnable runnable, final Component c) {
  90         try {
  91             LWCToolkit.invokeLater(runnable, c);
  92         } catch (InvocationTargetException e) { e.printStackTrace(); }
  93     }
  94 
  95     public static String getAccessibleActionDescription(final AccessibleAction aa, final int index, final Component c) {
  96         if (aa == null) return null;
  97 
  98         return invokeAndWait(new Callable<String>() {
  99             public String call() throws Exception {
 100                 return aa.getAccessibleActionDescription(index);
 101             }
 102         }, c);
 103     }
 104 
 105     public static void doAccessibleAction(final AccessibleAction aa, final int index, final Component c) {
 106         // We make this an invokeLater because we don't need a reply.
 107         if (aa == null) return;
 108 


 164         return invokeAndWait(new Callable<AccessibleContext>() {
 165             public AccessibleContext call() throws Exception {
 166                 return a.getAccessibleContext();
 167             }
 168         }, c);
 169     }
 170 
 171     public static boolean isAccessibleChildSelected(final Accessible a, final int index, final Component c) {
 172         if (a == null) return false;
 173 
 174         return invokeAndWait(new Callable<Boolean>() {
 175             public Boolean call() throws Exception {
 176                 final AccessibleContext ac = a.getAccessibleContext();
 177                 if (ac == null) return Boolean.FALSE;
 178 
 179                 final AccessibleSelection as = ac.getAccessibleSelection();
 180                 if (as == null) return Boolean.FALSE;
 181 
 182                 return as.isAccessibleChildSelected(index);
 183             }
 184         }, c);
 185     }
 186 
 187     public static AccessibleStateSet getAccessibleStateSet(final AccessibleContext ac, final Component c) {
 188         if (ac == null) return null;
 189 
 190         return invokeAndWait(new Callable<AccessibleStateSet>() {
 191             public AccessibleStateSet call() throws Exception {
 192                 return ac.getAccessibleStateSet();
 193             }
 194         }, c);
 195     }
 196 
 197     public static boolean contains(final AccessibleContext ac, final AccessibleState as, final Component c) {
 198         if (ac == null || as == null) return false;
 199 
 200         return invokeAndWait(new Callable<Boolean>() {
 201             public Boolean call() throws Exception {
 202                 final AccessibleStateSet ass = ac.getAccessibleStateSet();
 203                 if (ass == null) return null;
 204                 return ass.contains(as);
 205             }
 206         }, c);
 207     }
 208 
 209     static String getAccessibleRoleFor(final Accessible a) {
 210         final AccessibleContext ac = a.getAccessibleContext();
 211         if (ac == null) return null;
 212 
 213         final AccessibleRole role = ac.getAccessibleRole();
 214         return AWTAccessor.getAccessibleBundleAccessor().getKey(role);
 215     }
 216 
 217     public static String getAccessibleRole(final Accessible a, final Component c) {
 218         if (a == null) return null;
 219 
 220         return invokeAndWait(new Callable<String>() {
 221             public String call() throws Exception {
 222                 final Accessible sa = CAccessible.getSwingAccessible(a);
 223                 final String role = getAccessibleRoleFor(a);
 224 
 225                 if (!"text".equals(role)) return role;
 226                 if (sa instanceof JTextArea || sa instanceof JEditorPane) {


 231         }, c);
 232     }
 233 
 234     public static Point getLocationOnScreen(final AccessibleComponent ac, final Component c) {
 235         if (ac == null) return null;
 236 
 237         return invokeAndWait(new Callable<Point>() {
 238             public Point call() throws Exception {
 239                 return ac.getLocationOnScreen();
 240             }
 241         }, c);
 242     }
 243 
 244     public static int getCharCount(final AccessibleText at, final Component c) {
 245         if (at == null) return 0;
 246 
 247         return invokeAndWait(new Callable<Integer>() {
 248             public Integer call() throws Exception {
 249                 return at.getCharCount();
 250             }
 251         }, c);
 252     }
 253 
 254     // Accessibility Threadsafety for JavaComponentAccessibility.m
 255     public static Accessible getAccessibleParent(final Accessible a, final Component c) {
 256         if (a == null) return null;
 257 
 258         return invokeAndWait(new Callable<Accessible>() {
 259             public Accessible call() throws Exception {
 260                 final AccessibleContext ac = a.getAccessibleContext();
 261                 if (ac == null) return null;
 262                 return ac.getAccessibleParent();
 263             }
 264         }, c);
 265     }
 266 
 267     public static int getAccessibleIndexInParent(final Accessible a, final Component c) {
 268         if (a == null) return -1;
 269 
 270         return invokeAndWait(new Callable<Integer>() {
 271             public Integer call() throws Exception {
 272                 final AccessibleContext ac = a.getAccessibleContext();
 273                 if (ac == null) return null;
 274                 return ac.getAccessibleIndexInParent();
 275             }
 276         }, c);
 277     }
 278 
 279     public static AccessibleComponent getAccessibleComponent(final Accessible a, final Component c) {
 280         if (a == null) return null;
 281 
 282         return invokeAndWait(new Callable<AccessibleComponent>() {
 283             public AccessibleComponent call() throws Exception {
 284                 final AccessibleContext ac = a.getAccessibleContext();
 285                 if (ac == null) return null;
 286                 return ac.getAccessibleComponent();
 287             }
 288         }, c);
 289     }
 290 
 291     public static AccessibleValue getAccessibleValue(final Accessible a, final Component c) {
 292         if (a == null) return null;
 293 
 294         return invokeAndWait(new Callable<AccessibleValue>() {
 295             public AccessibleValue call() throws Exception {
 296                 final AccessibleContext ac = a.getAccessibleContext();


 352                 }
 353 
 354                 return accessibleDescription;
 355             }
 356         }, c);
 357     }
 358 
 359     public static boolean isFocusTraversable(final Accessible a, final Component c) {
 360         if (a == null) return false;
 361 
 362         return invokeAndWait(new Callable<Boolean>() {
 363             public Boolean call() throws Exception {
 364                 final AccessibleContext ac = a.getAccessibleContext();
 365                 if (ac == null) return null;
 366 
 367                 final AccessibleComponent aComp = ac.getAccessibleComponent();
 368                 if (aComp == null) return null;
 369 
 370                 return aComp.isFocusTraversable();
 371             }
 372         }, c);
 373     }
 374 
 375     public static Accessible accessibilityHitTest(final Container parent, final float hitPointX, final float hitPointY) {
 376         return invokeAndWait(new Callable<Accessible>() {
 377             public Accessible call() throws Exception {
 378                 final Point p = parent.getLocationOnScreen();
 379 
 380                 // Make it into local coords
 381                 final Point localPoint = new Point((int)(hitPointX - p.getX()), (int)(hitPointY - p.getY()));
 382 
 383                 final Component component = parent.findComponentAt(localPoint);
 384                 if (component == null) return null;
 385 
 386                 final AccessibleContext axContext = component.getAccessibleContext();
 387                 if (axContext == null) return null;
 388 
 389                 final AccessibleComponent axComponent = axContext.getAccessibleComponent();
 390                 if (axComponent == null) return null;
 391 
 392                 final int numChildren = axContext.getAccessibleChildrenCount();


 411                 final AccessibleContext ac = a.getAccessibleContext();
 412                 if (ac == null) return null;
 413                 return ac.getAccessibleAction();
 414             }
 415         }, c);
 416     }
 417 
 418     public static boolean isEnabled(final Accessible a, final Component c) {
 419         if (a == null) return false;
 420 
 421         return invokeAndWait(new Callable<Boolean>() {
 422             public Boolean call() throws Exception {
 423                 final AccessibleContext ac = a.getAccessibleContext();
 424                 if (ac == null) return null;
 425 
 426                 final AccessibleComponent aComp = ac.getAccessibleComponent();
 427                 if (aComp == null) return null;
 428 
 429                 return aComp.isEnabled();
 430             }
 431         }, c);
 432     }
 433 
 434     // KCH - can we make this a postEvent instead?
 435     public static void requestFocus(final Accessible a, final Component c) {
 436         if (a == null) return;
 437 
 438         invokeLater(new Runnable() {
 439             public void run() {
 440                 final AccessibleContext ac = a.getAccessibleContext();
 441                 if (ac == null) return;
 442 
 443                 final AccessibleComponent aComp = ac.getAccessibleComponent();
 444                 if (aComp == null) return;
 445 
 446                 aComp.requestFocus();
 447             }
 448         }, c);
 449     }
 450 
 451     public static void requestSelection(final Accessible a, final Component c) {




  69     }
  70 
  71     private CAccessibility() {
  72         KeyboardFocusManager.getCurrentKeyboardFocusManager().addPropertyChangeListener("focusOwner", this);
  73     }
  74 
  75     public void propertyChange(final PropertyChangeEvent evt) {
  76         if (evt.getNewValue() == null) return;
  77         focusChanged();
  78     }
  79 
  80     private native void focusChanged();
  81 
  82     static <T> T invokeAndWait(final Callable<T> callable, final Component c) {
  83         try {
  84             return LWCToolkit.invokeAndWait(callable, c);
  85         } catch (final Exception e) { e.printStackTrace(); }
  86         return null;
  87     }
  88 
  89     static <T> T invokeAndWait(final Callable<T> callable, final Component c, final T defValue) {
  90         T value = null;
  91         try {
  92             value = LWCToolkit.invokeAndWait(callable, c);
  93         } catch (final Exception e) { e.printStackTrace(); }
  94 
  95         return value != null ? value : defValue;
  96     }
  97 
  98     static void invokeLater(final Runnable runnable, final Component c) {
  99         try {
 100             LWCToolkit.invokeLater(runnable, c);
 101         } catch (InvocationTargetException e) { e.printStackTrace(); }
 102     }
 103 
 104     public static String getAccessibleActionDescription(final AccessibleAction aa, final int index, final Component c) {
 105         if (aa == null) return null;
 106 
 107         return invokeAndWait(new Callable<String>() {
 108             public String call() throws Exception {
 109                 return aa.getAccessibleActionDescription(index);
 110             }
 111         }, c);
 112     }
 113 
 114     public static void doAccessibleAction(final AccessibleAction aa, final int index, final Component c) {
 115         // We make this an invokeLater because we don't need a reply.
 116         if (aa == null) return;
 117 


 173         return invokeAndWait(new Callable<AccessibleContext>() {
 174             public AccessibleContext call() throws Exception {
 175                 return a.getAccessibleContext();
 176             }
 177         }, c);
 178     }
 179 
 180     public static boolean isAccessibleChildSelected(final Accessible a, final int index, final Component c) {
 181         if (a == null) return false;
 182 
 183         return invokeAndWait(new Callable<Boolean>() {
 184             public Boolean call() throws Exception {
 185                 final AccessibleContext ac = a.getAccessibleContext();
 186                 if (ac == null) return Boolean.FALSE;
 187 
 188                 final AccessibleSelection as = ac.getAccessibleSelection();
 189                 if (as == null) return Boolean.FALSE;
 190 
 191                 return as.isAccessibleChildSelected(index);
 192             }
 193         }, c, false);
 194     }
 195 
 196     public static AccessibleStateSet getAccessibleStateSet(final AccessibleContext ac, final Component c) {
 197         if (ac == null) return null;
 198 
 199         return invokeAndWait(new Callable<AccessibleStateSet>() {
 200             public AccessibleStateSet call() throws Exception {
 201                 return ac.getAccessibleStateSet();
 202             }
 203         }, c);
 204     }
 205 
 206     public static boolean contains(final AccessibleContext ac, final AccessibleState as, final Component c) {
 207         if (ac == null || as == null) return false;
 208 
 209         return invokeAndWait(new Callable<Boolean>() {
 210             public Boolean call() throws Exception {
 211                 final AccessibleStateSet ass = ac.getAccessibleStateSet();
 212                 if (ass == null) return null;
 213                 return ass.contains(as);
 214             }
 215         }, c, false);
 216     }
 217 
 218     static String getAccessibleRoleFor(final Accessible a) {
 219         final AccessibleContext ac = a.getAccessibleContext();
 220         if (ac == null) return null;
 221 
 222         final AccessibleRole role = ac.getAccessibleRole();
 223         return AWTAccessor.getAccessibleBundleAccessor().getKey(role);
 224     }
 225 
 226     public static String getAccessibleRole(final Accessible a, final Component c) {
 227         if (a == null) return null;
 228 
 229         return invokeAndWait(new Callable<String>() {
 230             public String call() throws Exception {
 231                 final Accessible sa = CAccessible.getSwingAccessible(a);
 232                 final String role = getAccessibleRoleFor(a);
 233 
 234                 if (!"text".equals(role)) return role;
 235                 if (sa instanceof JTextArea || sa instanceof JEditorPane) {


 240         }, c);
 241     }
 242 
 243     public static Point getLocationOnScreen(final AccessibleComponent ac, final Component c) {
 244         if (ac == null) return null;
 245 
 246         return invokeAndWait(new Callable<Point>() {
 247             public Point call() throws Exception {
 248                 return ac.getLocationOnScreen();
 249             }
 250         }, c);
 251     }
 252 
 253     public static int getCharCount(final AccessibleText at, final Component c) {
 254         if (at == null) return 0;
 255 
 256         return invokeAndWait(new Callable<Integer>() {
 257             public Integer call() throws Exception {
 258                 return at.getCharCount();
 259             }
 260         }, c, 0);
 261     }
 262 
 263     // Accessibility Threadsafety for JavaComponentAccessibility.m
 264     public static Accessible getAccessibleParent(final Accessible a, final Component c) {
 265         if (a == null) return null;
 266 
 267         return invokeAndWait(new Callable<Accessible>() {
 268             public Accessible call() throws Exception {
 269                 final AccessibleContext ac = a.getAccessibleContext();
 270                 if (ac == null) return null;
 271                 return ac.getAccessibleParent();
 272             }
 273         }, c);
 274     }
 275 
 276     public static int getAccessibleIndexInParent(final Accessible a, final Component c) {
 277         if (a == null) return -1;
 278 
 279         return invokeAndWait(new Callable<Integer>() {
 280             public Integer call() throws Exception {
 281                 final AccessibleContext ac = a.getAccessibleContext();
 282                 if (ac == null) return null;
 283                 return ac.getAccessibleIndexInParent();
 284             }
 285         }, c, -1);
 286     }
 287 
 288     public static AccessibleComponent getAccessibleComponent(final Accessible a, final Component c) {
 289         if (a == null) return null;
 290 
 291         return invokeAndWait(new Callable<AccessibleComponent>() {
 292             public AccessibleComponent call() throws Exception {
 293                 final AccessibleContext ac = a.getAccessibleContext();
 294                 if (ac == null) return null;
 295                 return ac.getAccessibleComponent();
 296             }
 297         }, c);
 298     }
 299 
 300     public static AccessibleValue getAccessibleValue(final Accessible a, final Component c) {
 301         if (a == null) return null;
 302 
 303         return invokeAndWait(new Callable<AccessibleValue>() {
 304             public AccessibleValue call() throws Exception {
 305                 final AccessibleContext ac = a.getAccessibleContext();


 361                 }
 362 
 363                 return accessibleDescription;
 364             }
 365         }, c);
 366     }
 367 
 368     public static boolean isFocusTraversable(final Accessible a, final Component c) {
 369         if (a == null) return false;
 370 
 371         return invokeAndWait(new Callable<Boolean>() {
 372             public Boolean call() throws Exception {
 373                 final AccessibleContext ac = a.getAccessibleContext();
 374                 if (ac == null) return null;
 375 
 376                 final AccessibleComponent aComp = ac.getAccessibleComponent();
 377                 if (aComp == null) return null;
 378 
 379                 return aComp.isFocusTraversable();
 380             }
 381         }, c, false);
 382     }
 383 
 384     public static Accessible accessibilityHitTest(final Container parent, final float hitPointX, final float hitPointY) {
 385         return invokeAndWait(new Callable<Accessible>() {
 386             public Accessible call() throws Exception {
 387                 final Point p = parent.getLocationOnScreen();
 388 
 389                 // Make it into local coords
 390                 final Point localPoint = new Point((int)(hitPointX - p.getX()), (int)(hitPointY - p.getY()));
 391 
 392                 final Component component = parent.findComponentAt(localPoint);
 393                 if (component == null) return null;
 394 
 395                 final AccessibleContext axContext = component.getAccessibleContext();
 396                 if (axContext == null) return null;
 397 
 398                 final AccessibleComponent axComponent = axContext.getAccessibleComponent();
 399                 if (axComponent == null) return null;
 400 
 401                 final int numChildren = axContext.getAccessibleChildrenCount();


 420                 final AccessibleContext ac = a.getAccessibleContext();
 421                 if (ac == null) return null;
 422                 return ac.getAccessibleAction();
 423             }
 424         }, c);
 425     }
 426 
 427     public static boolean isEnabled(final Accessible a, final Component c) {
 428         if (a == null) return false;
 429 
 430         return invokeAndWait(new Callable<Boolean>() {
 431             public Boolean call() throws Exception {
 432                 final AccessibleContext ac = a.getAccessibleContext();
 433                 if (ac == null) return null;
 434 
 435                 final AccessibleComponent aComp = ac.getAccessibleComponent();
 436                 if (aComp == null) return null;
 437 
 438                 return aComp.isEnabled();
 439             }
 440         }, c, false);
 441     }
 442 
 443     // KCH - can we make this a postEvent instead?
 444     public static void requestFocus(final Accessible a, final Component c) {
 445         if (a == null) return;
 446 
 447         invokeLater(new Runnable() {
 448             public void run() {
 449                 final AccessibleContext ac = a.getAccessibleContext();
 450                 if (ac == null) return;
 451 
 452                 final AccessibleComponent aComp = ac.getAccessibleComponent();
 453                 if (aComp == null) return;
 454 
 455                 aComp.requestFocus();
 456             }
 457         }, c);
 458     }
 459 
 460     public static void requestSelection(final Accessible a, final Component c) {


< prev index next >