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) {
|