1 /* 2 * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 /* 27 * A class to manage JNI calls into AccessBridge.java 28 */ 29 30 #include "AccessBridgePackages.h" 31 32 #include <windows.h> 33 #include <jni.h> 34 35 #ifndef __AccessBridgeJavaEntryPoints_H__ 36 #define __AccessBridgeJavaEntryPoints_H__ 37 38 class AccessBridgeJavaEntryPoints { 39 JNIEnv *jniEnv; 40 41 jobject accessBridgeObject; 42 43 jclass bridgeClass; 44 jclass eventHandlerClass; 45 46 jmethodID decrementReferenceMethod; 47 jmethodID getJavaVersionPropertyMethod; 48 jmethodID getAccessBridgeVersionMethod; 49 50 jmethodID isJavaWindowMethod; 51 jmethodID isSameObjectMethod; 52 jmethodID getAccessibleContextFromHWNDMethod; 53 jmethodID getHWNDFromAccessibleContextMethod; 54 55 jmethodID getAccessibleContextAtMethod; 56 jmethodID getAccessibleContextWithFocusMethod; 57 58 jmethodID getAccessibleNameFromContextMethod; 59 jmethodID getAccessibleDescriptionFromContextMethod; 60 jmethodID getAccessibleRoleStringFromContextMethod; 61 jmethodID getAccessibleRoleStringFromContext_en_USMethod; 62 jmethodID getAccessibleStatesStringFromContextMethod; 63 jmethodID getAccessibleStatesStringFromContext_en_USMethod; 64 jmethodID getAccessibleParentFromContextMethod; 65 jmethodID getAccessibleIndexInParentFromContextMethod; 66 jmethodID getAccessibleChildrenCountFromContextMethod; 67 jmethodID getAccessibleChildFromContextMethod; 68 jmethodID getAccessibleBoundsOnScreenFromContextMethod; 69 jmethodID getAccessibleXcoordFromContextMethod; 70 jmethodID getAccessibleYcoordFromContextMethod; 71 jmethodID getAccessibleHeightFromContextMethod; 72 jmethodID getAccessibleWidthFromContextMethod; 73 74 jmethodID getAccessibleComponentFromContextMethod; 75 jmethodID getAccessibleActionFromContextMethod; 76 jmethodID getAccessibleSelectionFromContextMethod; 77 jmethodID getAccessibleTextFromContextMethod; 78 jmethodID getAccessibleValueFromContextMethod; 79 80 /* begin AccessibleTable */ 81 jmethodID getAccessibleTableFromContextMethod; 82 jmethodID getAccessibleTableRowHeaderMethod; 83 jmethodID getAccessibleTableColumnHeaderMethod; 84 jmethodID getAccessibleTableRowCountMethod; 85 jmethodID getAccessibleTableColumnCountMethod; 86 jmethodID getAccessibleTableCaptionMethod; 87 jmethodID getAccessibleTableSummaryMethod; 88 89 jmethodID getContextFromAccessibleTableMethod; 90 jmethodID getAccessibleTableCellAccessibleContextMethod; 91 jmethodID getAccessibleTableCellIndexMethod; 92 jmethodID getAccessibleTableCellRowExtentMethod; 93 jmethodID getAccessibleTableCellColumnExtentMethod; 94 jmethodID isAccessibleTableCellSelectedMethod; 95 96 jmethodID getAccessibleTableRowHeaderRowCountMethod; 97 jmethodID getAccessibleTableColumnHeaderRowCountMethod; 98 99 jmethodID getAccessibleTableRowHeaderColumnCountMethod; 100 jmethodID getAccessibleTableColumnHeaderColumnCountMethod; 101 102 jmethodID getAccessibleTableRowDescriptionMethod; 103 jmethodID getAccessibleTableColumnDescriptionMethod; 104 105 jmethodID getAccessibleTableRowSelectionCountMethod; 106 jmethodID isAccessibleTableRowSelectedMethod; 107 jmethodID getAccessibleTableRowSelectionsMethod; 108 109 jmethodID getAccessibleTableColumnSelectionCountMethod; 110 jmethodID isAccessibleTableColumnSelectedMethod; 111 jmethodID getAccessibleTableColumnSelectionsMethod; 112 113 jmethodID getAccessibleTableRowMethod; 114 jmethodID getAccessibleTableColumnMethod; 115 jmethodID getAccessibleTableIndexMethod; 116 117 /* end AccessibleTable */ 118 119 /* begin AccessibleRelationSet */ 120 121 jmethodID getAccessibleRelationSetMethod; 122 jmethodID getAccessibleRelationCountMethod; 123 jmethodID getAccessibleRelationKeyMethod; 124 jmethodID getAccessibleRelationTargetCountMethod; 125 jmethodID getAccessibleRelationTargetMethod; 126 127 /* end AccessibleRelationSet */ 128 129 // AccessibleHypertext methods 130 jmethodID getAccessibleHypertextMethod; 131 jmethodID getAccessibleHyperlinkCountMethod; 132 jmethodID getAccessibleHyperlinkTextMethod; 133 jmethodID getAccessibleHyperlinkURLMethod; 134 jmethodID getAccessibleHyperlinkStartIndexMethod; 135 jmethodID getAccessibleHyperlinkEndIndexMethod; 136 jmethodID getAccessibleHypertextLinkIndexMethod; 137 jmethodID getAccessibleHyperlinkMethod; 138 jmethodID activateAccessibleHyperlinkMethod; 139 140 // AccessibleKeyBinding 141 jmethodID getAccessibleKeyBindingsCountMethod; 142 jmethodID getAccessibleKeyBindingCharMethod; 143 jmethodID getAccessibleKeyBindingModifiersMethod; 144 145 // AccessibleIcon 146 jmethodID getAccessibleIconsCountMethod; 147 jmethodID getAccessibleIconDescriptionMethod; 148 jmethodID getAccessibleIconHeightMethod; 149 jmethodID getAccessibleIconWidthMethod; 150 151 // AccessibleAction 152 jmethodID getAccessibleActionsCountMethod; 153 jmethodID getAccessibleActionNameMethod; 154 jmethodID doAccessibleActionsMethod; 155 156 // AccessibleText 157 jmethodID getAccessibleCharCountFromContextMethod; 158 jmethodID getAccessibleCaretPositionFromContextMethod; 159 jmethodID getAccessibleIndexAtPointFromContextMethod; 160 161 jmethodID getAccessibleLetterAtIndexFromContextMethod; 162 jmethodID getAccessibleWordAtIndexFromContextMethod; 163 jmethodID getAccessibleSentenceAtIndexFromContextMethod; 164 165 jmethodID getAccessibleTextSelectionStartFromContextMethod; 166 jmethodID getAccessibleTextSelectionEndFromContextMethod; 167 jmethodID getAccessibleTextSelectedTextFromContextMethod; 168 jmethodID getAccessibleAttributesAtIndexFromContextMethod; 169 jmethodID getAccessibleAttributeSetAtIndexFromContextMethod; 170 jmethodID getAccessibleTextRectAtIndexFromContextMethod; 171 jmethodID getAccessibleXcoordTextRectAtIndexFromContextMethod; 172 jmethodID getAccessibleYcoordTextRectAtIndexFromContextMethod; 173 jmethodID getAccessibleHeightTextRectAtIndexFromContextMethod; 174 jmethodID getAccessibleWidthTextRectAtIndexFromContextMethod; 175 jmethodID getAccessibleTextLineLeftBoundsFromContextMethod; 176 jmethodID getAccessibleTextLineRightBoundsFromContextMethod; 177 jmethodID getAccessibleTextRangeFromContextMethod; 178 179 jmethodID getCurrentAccessibleValueFromContextMethod; 180 jmethodID getMaximumAccessibleValueFromContextMethod; 181 jmethodID getMinimumAccessibleValueFromContextMethod; 182 183 jmethodID addAccessibleSelectionFromContextMethod; 184 jmethodID clearAccessibleSelectionFromContextMethod; 185 jmethodID getAccessibleSelectionContextFromContextMethod; 186 jmethodID getAccessibleSelectionCountFromContextMethod; 187 jmethodID isAccessibleChildSelectedFromContextMethod; 188 jmethodID removeAccessibleSelectionFromContextMethod; 189 jmethodID selectAllAccessibleSelectionFromContextMethod; 190 191 jmethodID addJavaEventNotificationMethod; 192 jmethodID removeJavaEventNotificationMethod; 193 jmethodID addAccessibilityEventNotificationMethod; 194 jmethodID removeAccessibilityEventNotificationMethod; 195 196 jmethodID getBoldFromAttributeSetMethod; 197 jmethodID getItalicFromAttributeSetMethod; 198 jmethodID getUnderlineFromAttributeSetMethod; 199 jmethodID getStrikethroughFromAttributeSetMethod; 200 jmethodID getSuperscriptFromAttributeSetMethod; 201 jmethodID getSubscriptFromAttributeSetMethod; 202 jmethodID getBackgroundColorFromAttributeSetMethod; 203 jmethodID getForegroundColorFromAttributeSetMethod; 204 jmethodID getFontFamilyFromAttributeSetMethod; 205 jmethodID getFontSizeFromAttributeSetMethod; 206 jmethodID getAlignmentFromAttributeSetMethod; 207 jmethodID getBidiLevelFromAttributeSetMethod; 208 jmethodID getFirstLineIndentFromAttributeSetMethod; 209 jmethodID getLeftIndentFromAttributeSetMethod; 210 jmethodID getRightIndentFromAttributeSetMethod; 211 jmethodID getLineSpacingFromAttributeSetMethod; 212 jmethodID getSpaceAboveFromAttributeSetMethod; 213 jmethodID getSpaceBelowFromAttributeSetMethod; 214 215 jmethodID setTextContentsMethod; 216 jmethodID getParentWithRoleMethod; 217 jmethodID getTopLevelObjectMethod; 218 jmethodID getParentWithRoleElseRootMethod; 219 jmethodID getObjectDepthMethod; 220 jmethodID getActiveDescendentMethod; 221 222 /** 223 * Additional methods for Teton 224 */ 225 jmethodID getVirtualAccessibleNameFromContextMethod; // Ben Key 226 jmethodID requestFocusMethod; 227 jmethodID selectTextRangeMethod; 228 jmethodID getTextAttributesInRangeMethod; 229 jmethodID getVisibleChildrenCountMethod; 230 jmethodID getVisibleChildMethod; 231 jmethodID setCaretPositionMethod; 232 233 jmethodID getCaretLocationMethod; 234 jmethodID getCaretLocationXMethod; 235 jmethodID getCaretLocationYMethod; 236 jmethodID getCaretLocationHeightMethod; 237 jmethodID getCaretLocationWidthMethod; 238 239 public: 240 AccessBridgeJavaEntryPoints(JNIEnv *jniEnvironment, jobject bridgeObject); 241 ~AccessBridgeJavaEntryPoints(); 242 BOOL BuildJavaEntryPoints(); 243 244 // HWND management methods 245 BOOL isJavaWindow(jint window); 246 jobject getAccessibleContextFromHWND(jint window); 247 HWND getHWNDFromAccessibleContext(jobject accessibleContext); 248 249 // version methods 250 BOOL getVersionInfo(AccessBridgeVersionInfo *info); 251 252 // verification methods 253 BOOL verifyAccessibleText(jobject obj); 254 255 /* ===== utility methods ===== */ 256 BOOL isSameObject(jobject obj1, jobject obj2); 257 BOOL setTextContents(const jobject accessibleContext, const wchar_t *text); 258 jobject getParentWithRole (const jobject accessibleContext, const wchar_t *role); 259 jobject getTopLevelObject (const jobject accessibleContext); 260 jobject getParentWithRoleElseRoot (const jobject accessibleContext, const wchar_t *role); 261 jint getObjectDepth (const jobject accessibleContext); 262 jobject getActiveDescendent (const jobject accessibleContext); 263 264 // Accessible Context methods 265 jobject getAccessibleContextAt(jint x, jint y, jobject AccessibleContext); 266 jobject getAccessibleContextWithFocus(); 267 BOOL getAccessibleContextInfo(jobject AccessibleContext, AccessibleContextInfo *info); 268 jobject getAccessibleChildFromContext(jobject AccessibleContext, jint childIndex); 269 jobject getAccessibleParentFromContext(jobject AccessibleContext); 270 271 /* begin AccessibleTable methods */ 272 273 BOOL getAccessibleTableInfo(jobject acParent, AccessibleTableInfo *tableInfo); 274 BOOL getAccessibleTableCellInfo(jobject accessibleTable,jint row, jint column, 275 AccessibleTableCellInfo *tableCellInfo); 276 277 BOOL getAccessibleTableRowHeader(jobject acParent, AccessibleTableInfo *tableInfo); 278 BOOL getAccessibleTableColumnHeader(jobject acParent, AccessibleTableInfo *tableInfo); 279 280 jobject getAccessibleTableRowDescription(jobject acParent, jint row); 281 jobject getAccessibleTableColumnDescription(jobject acParent, jint column); 282 283 jint getAccessibleTableRowSelectionCount(jobject accessibleTable); 284 BOOL isAccessibleTableRowSelected(jobject accessibleTable, jint row); 285 BOOL getAccessibleTableRowSelections(jobject accessibleTable, jint count, jint *selections); 286 287 jint getAccessibleTableColumnSelectionCount(jobject accessibleTable); 288 BOOL isAccessibleTableColumnSelected(jobject accessibleTable, jint column); 289 BOOL getAccessibleTableColumnSelections(jobject accessibleTable, jint count, jint *selections); 290 291 jint getAccessibleTableRow(jobject accessibleTable, jint index); 292 jint getAccessibleTableColumn(jobject accessibleTable, jint index); 293 jint getAccessibleTableIndex(jobject accessibleTable, jint row, jint column); 294 295 /* end AccessibleTable methods */ 296 297 BOOL getAccessibleRelationSet(jobject accessibleContext, AccessibleRelationSetInfo *relationSetInfo); 298 299 // AccessibleHypertext methods 300 BOOL getAccessibleHypertext(jobject accessibleContext, AccessibleHypertextInfo *hyperlink); 301 302 BOOL activateAccessibleHyperlink(jobject accessibleContext, jobject accessibleHyperlink); 303 304 BOOL getAccessibleHypertextExt(const jobject accessibleContext, 305 const jint nStartIndex, 306 /* OUT */ AccessibleHypertextInfo *hypertext); 307 jint getAccessibleHyperlinkCount(const jobject accessibleContext); 308 jint getAccessibleHypertextLinkIndex(const jobject accessibleContext, 309 const jint nIndex); 310 BOOL getAccessibleHyperlink(const jobject accessibleContext, 311 const jint nIndex, 312 /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo); 313 314 // Accessible Keybinding methods 315 BOOL getAccessibleKeyBindings(jobject accessibleContext, AccessibleKeyBindings *keyBindings); 316 317 // AccessibleIcon methods 318 BOOL getAccessibleIcons(jobject accessibleContext, AccessibleIcons *icons); 319 320 // AccessibleActionMethods 321 BOOL getAccessibleActions(jobject accessibleContext, AccessibleActions *actions); 322 BOOL doAccessibleActions(jobject accessibleContext, AccessibleActionsToDo *actionsToDo, jint *failure); 323 324 // Accessible Text methods 325 BOOL getAccessibleTextInfo(jobject AccessibleContext, AccessibleTextInfo *textInfo, jint x, jint y); 326 BOOL getAccessibleTextItems(jobject AccessibleContext, AccessibleTextItemsInfo *textItems, jint index); 327 BOOL getAccessibleTextSelectionInfo(jobject AccessibleContext, AccessibleTextSelectionInfo *selectionInfo); 328 BOOL getAccessibleTextAttributes(jobject AccessibleContext, jint index, AccessibleTextAttributesInfo *attributes); 329 BOOL getAccessibleTextRect(jobject AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index); 330 BOOL getAccessibleCaretRect(jobject AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index); 331 BOOL getAccessibleTextLineBounds(jobject AccessibleContext, jint index, jint *startIndex, jint *endIndex); 332 BOOL getAccessibleTextRange(jobject AccessibleContext, jint start, jint end, wchar_t *text, short len); 333 334 // Accessible Value methods 335 BOOL getCurrentAccessibleValueFromContext(jobject AccessibleContext, wchar_t *value, short len); 336 BOOL getMaximumAccessibleValueFromContext(jobject AccessibleContext, wchar_t *value, short len); 337 BOOL getMinimumAccessibleValueFromContext(jobject AccessibleContext, wchar_t *value, short len); 338 339 // Accessible Selection methods 340 void addAccessibleSelectionFromContext(jobject AccessibleContext, int i); 341 void clearAccessibleSelectionFromContext(jobject AccessibleContext); 342 jobject getAccessibleSelectionFromContext(jobject AccessibleContext, int i); 343 int getAccessibleSelectionCountFromContext(jobject AccessibleContext); 344 BOOL isAccessibleChildSelectedFromContext(jobject AccessibleContext, int i); 345 void removeAccessibleSelectionFromContext(jobject AccessibleContext, int i); 346 void selectAllAccessibleSelectionFromContext(jobject AccessibleContext); 347 348 // Event handling methods 349 BOOL addJavaEventNotification(jlong type); 350 BOOL removeJavaEventNotification(jlong type); 351 BOOL addAccessibilityEventNotification(jlong type); 352 BOOL removeAccessibilityEventNotification(jlong type); 353 354 /** 355 * Additional methods for Teton 356 */ 357 358 /** 359 * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns 360 * whether successful. 361 * 362 * Bug ID 4916682 - Implement JAWS AccessibleName policy 363 */ 364 BOOL getVirtualAccessibleName(const jobject accessibleContext, wchar_t *name, int len); 365 366 /** 367 * Request focus for a component. Returns whether successful; 368 * 369 * Bug ID 4944757 - requestFocus method needed 370 */ 371 BOOL requestFocus(const jobject accessibleContext); 372 373 /** 374 * Selects text between two indices. Selection includes the text at the start index 375 * and the text at the end index. Returns whether successful; 376 * 377 * Bug ID 4944758 - selectTextRange method needed 378 */ 379 BOOL selectTextRange(const jobject accessibleContext, int startIndex, int endIndex); 380 381 /** 382 * Get text attributes between two indices. The attribute list includes the text at the 383 * start index and the text at the end index. Returns whether successful; 384 * 385 * Bug ID 4944761 - getTextAttributes between two indices method needed 386 */ 387 BOOL getTextAttributesInRange(const jobject accessibleContext, int startIndex, int endIndex, 388 AccessibleTextAttributesInfo *attributes, short *len); 389 390 /** 391 * Gets the number of visible children of a component. Returns -1 on error. 392 * 393 * Bug ID 4944762- getVisibleChildren for list-like components needed 394 */ 395 int getVisibleChildrenCount(const jobject accessibleContext); 396 397 /** 398 * Gets the visible children of an AccessibleContext. Returns whether successful; 399 * 400 * Bug ID 4944762- getVisibleChildren for list-like components needed 401 */ 402 BOOL getVisibleChildren(const jobject accessibleContext, const int startIndex, 403 VisibleChildrenInfo *visibleChildrenInfo); 404 405 /** 406 * Set the caret to a text position. Returns whether successful; 407 * 408 * Bug ID 4944770 - setCaretPosition method needed 409 */ 410 BOOL setCaretPosition(const jobject accessibleContext, int position); 411 412 /** 413 * Gets the bounding rectangle for the text caret 414 */ 415 BOOL getCaretLocation(jobject AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index); 416 417 }; 418 419 #endif