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 49 jmethodID isJavaWindowMethod; 50 jmethodID isSameObjectMethod; 51 jmethodID getAccessibleContextFromHWNDMethod; 52 jmethodID getHWNDFromAccessibleContextMethod; 53 54 jmethodID getAccessibleContextAtMethod; 55 jmethodID getAccessibleContextWithFocusMethod; 56 57 jmethodID getAccessibleNameFromContextMethod; 58 jmethodID getAccessibleDescriptionFromContextMethod; 59 jmethodID getAccessibleRoleStringFromContextMethod; 60 jmethodID getAccessibleRoleStringFromContext_en_USMethod; 61 jmethodID getAccessibleStatesStringFromContextMethod; 62 jmethodID getAccessibleStatesStringFromContext_en_USMethod; 63 jmethodID getAccessibleParentFromContextMethod; 64 jmethodID getAccessibleIndexInParentFromContextMethod; 65 jmethodID getAccessibleChildrenCountFromContextMethod; 66 jmethodID getAccessibleChildFromContextMethod; 67 jmethodID getAccessibleBoundsOnScreenFromContextMethod; 68 jmethodID getAccessibleXcoordFromContextMethod; 69 jmethodID getAccessibleYcoordFromContextMethod; 70 jmethodID getAccessibleHeightFromContextMethod; 71 jmethodID getAccessibleWidthFromContextMethod; 72 73 jmethodID getAccessibleComponentFromContextMethod; 74 jmethodID getAccessibleActionFromContextMethod; 75 jmethodID getAccessibleSelectionFromContextMethod; 76 jmethodID getAccessibleTextFromContextMethod; 77 jmethodID getAccessibleValueFromContextMethod; 78 79 /* begin AccessibleTable */ 80 jmethodID getAccessibleTableFromContextMethod; 81 jmethodID getAccessibleTableRowHeaderMethod; 82 jmethodID getAccessibleTableColumnHeaderMethod; 83 jmethodID getAccessibleTableRowCountMethod; 84 jmethodID getAccessibleTableColumnCountMethod; 85 jmethodID getAccessibleTableCaptionMethod; 86 jmethodID getAccessibleTableSummaryMethod; 87 88 jmethodID getContextFromAccessibleTableMethod; 89 jmethodID getAccessibleTableCellAccessibleContextMethod; 90 jmethodID getAccessibleTableCellIndexMethod; 91 jmethodID getAccessibleTableCellRowExtentMethod; 92 jmethodID getAccessibleTableCellColumnExtentMethod; 93 jmethodID isAccessibleTableCellSelectedMethod; 94 95 jmethodID getAccessibleTableRowHeaderRowCountMethod; 96 jmethodID getAccessibleTableColumnHeaderRowCountMethod; 97 98 jmethodID getAccessibleTableRowHeaderColumnCountMethod; 99 jmethodID getAccessibleTableColumnHeaderColumnCountMethod; 100 101 jmethodID getAccessibleTableRowDescriptionMethod; 102 jmethodID getAccessibleTableColumnDescriptionMethod; 103 104 jmethodID getAccessibleTableRowSelectionCountMethod; 105 jmethodID isAccessibleTableRowSelectedMethod; 106 jmethodID getAccessibleTableRowSelectionsMethod; 107 108 jmethodID getAccessibleTableColumnSelectionCountMethod; 109 jmethodID isAccessibleTableColumnSelectedMethod; 110 jmethodID getAccessibleTableColumnSelectionsMethod; 111 112 jmethodID getAccessibleTableRowMethod; 113 jmethodID getAccessibleTableColumnMethod; 114 jmethodID getAccessibleTableIndexMethod; 115 116 /* end AccessibleTable */ 117 118 /* begin AccessibleRelationSet */ 119 120 jmethodID getAccessibleRelationSetMethod; 121 jmethodID getAccessibleRelationCountMethod; 122 jmethodID getAccessibleRelationKeyMethod; 123 jmethodID getAccessibleRelationTargetCountMethod; 124 jmethodID getAccessibleRelationTargetMethod; 125 126 /* end AccessibleRelationSet */ 127 128 // AccessibleHypertext methods 129 jmethodID getAccessibleHypertextMethod; 130 jmethodID getAccessibleHyperlinkCountMethod; 131 jmethodID getAccessibleHyperlinkTextMethod; 132 jmethodID getAccessibleHyperlinkURLMethod; 133 jmethodID getAccessibleHyperlinkStartIndexMethod; 134 jmethodID getAccessibleHyperlinkEndIndexMethod; 135 jmethodID getAccessibleHypertextLinkIndexMethod; 136 jmethodID getAccessibleHyperlinkMethod; 137 jmethodID activateAccessibleHyperlinkMethod; 138 139 // AccessibleKeyBinding 140 jmethodID getAccessibleKeyBindingsCountMethod; 141 jmethodID getAccessibleKeyBindingCharMethod; 142 jmethodID getAccessibleKeyBindingModifiersMethod; 143 144 // AccessibleIcon 145 jmethodID getAccessibleIconsCountMethod; 146 jmethodID getAccessibleIconDescriptionMethod; 147 jmethodID getAccessibleIconHeightMethod; 148 jmethodID getAccessibleIconWidthMethod; 149 150 // AccessibleAction 151 jmethodID getAccessibleActionsCountMethod; 152 jmethodID getAccessibleActionNameMethod; 153 jmethodID doAccessibleActionsMethod; 154 155 // AccessibleText 156 jmethodID getAccessibleCharCountFromContextMethod; 157 jmethodID getAccessibleCaretPositionFromContextMethod; 158 jmethodID getAccessibleIndexAtPointFromContextMethod; 159 160 jmethodID getAccessibleLetterAtIndexFromContextMethod; 161 jmethodID getAccessibleWordAtIndexFromContextMethod; 162 jmethodID getAccessibleSentenceAtIndexFromContextMethod; 163 164 jmethodID getAccessibleTextSelectionStartFromContextMethod; 165 jmethodID getAccessibleTextSelectionEndFromContextMethod; 166 jmethodID getAccessibleTextSelectedTextFromContextMethod; 167 jmethodID getAccessibleAttributesAtIndexFromContextMethod; 168 jmethodID getAccessibleAttributeSetAtIndexFromContextMethod; 169 jmethodID getAccessibleTextRectAtIndexFromContextMethod; 170 jmethodID getAccessibleXcoordTextRectAtIndexFromContextMethod; 171 jmethodID getAccessibleYcoordTextRectAtIndexFromContextMethod; 172 jmethodID getAccessibleHeightTextRectAtIndexFromContextMethod; 173 jmethodID getAccessibleWidthTextRectAtIndexFromContextMethod; 174 jmethodID getAccessibleTextLineLeftBoundsFromContextMethod; 175 jmethodID getAccessibleTextLineRightBoundsFromContextMethod; 176 jmethodID getAccessibleTextRangeFromContextMethod; 177 178 jmethodID getCurrentAccessibleValueFromContextMethod; 179 jmethodID getMaximumAccessibleValueFromContextMethod; 180 jmethodID getMinimumAccessibleValueFromContextMethod; 181 182 jmethodID addAccessibleSelectionFromContextMethod; 183 jmethodID clearAccessibleSelectionFromContextMethod; 184 jmethodID getAccessibleSelectionContextFromContextMethod; 185 jmethodID getAccessibleSelectionCountFromContextMethod; 186 jmethodID isAccessibleChildSelectedFromContextMethod; 187 jmethodID removeAccessibleSelectionFromContextMethod; 188 jmethodID selectAllAccessibleSelectionFromContextMethod; 189 190 jmethodID addJavaEventNotificationMethod; 191 jmethodID removeJavaEventNotificationMethod; 192 jmethodID addAccessibilityEventNotificationMethod; 193 jmethodID removeAccessibilityEventNotificationMethod; 194 195 jmethodID getBoldFromAttributeSetMethod; 196 jmethodID getItalicFromAttributeSetMethod; 197 jmethodID getUnderlineFromAttributeSetMethod; 198 jmethodID getStrikethroughFromAttributeSetMethod; 199 jmethodID getSuperscriptFromAttributeSetMethod; 200 jmethodID getSubscriptFromAttributeSetMethod; 201 jmethodID getBackgroundColorFromAttributeSetMethod; 202 jmethodID getForegroundColorFromAttributeSetMethod; 203 jmethodID getFontFamilyFromAttributeSetMethod; 204 jmethodID getFontSizeFromAttributeSetMethod; 205 jmethodID getAlignmentFromAttributeSetMethod; 206 jmethodID getBidiLevelFromAttributeSetMethod; 207 jmethodID getFirstLineIndentFromAttributeSetMethod; 208 jmethodID getLeftIndentFromAttributeSetMethod; 209 jmethodID getRightIndentFromAttributeSetMethod; 210 jmethodID getLineSpacingFromAttributeSetMethod; 211 jmethodID getSpaceAboveFromAttributeSetMethod; 212 jmethodID getSpaceBelowFromAttributeSetMethod; 213 214 jmethodID setTextContentsMethod; 215 jmethodID getParentWithRoleMethod; 216 jmethodID getTopLevelObjectMethod; 217 jmethodID getParentWithRoleElseRootMethod; 218 jmethodID getObjectDepthMethod; 219 jmethodID getActiveDescendentMethod; 220 221 /** 222 * Additional methods for Teton 223 */ 224 jmethodID getVirtualAccessibleNameFromContextMethod; // Ben Key 225 jmethodID requestFocusMethod; 226 jmethodID selectTextRangeMethod; 227 jmethodID getTextAttributesInRangeMethod; 228 jmethodID getVisibleChildrenCountMethod; 229 jmethodID getVisibleChildMethod; 230 jmethodID setCaretPositionMethod; 231 232 jmethodID getCaretLocationMethod; 233 jmethodID getCaretLocationXMethod; 234 jmethodID getCaretLocationYMethod; 235 jmethodID getCaretLocationHeightMethod; 236 jmethodID getCaretLocationWidthMethod; 237 238 public: 239 AccessBridgeJavaEntryPoints(JNIEnv *jniEnvironment, jobject bridgeObject); 240 ~AccessBridgeJavaEntryPoints(); 241 BOOL BuildJavaEntryPoints(); 242 243 // HWND management methods 244 BOOL isJavaWindow(jint window); 245 jobject getAccessibleContextFromHWND(jint window); 246 HWND getHWNDFromAccessibleContext(jobject accessibleContext); 247 248 // version methods 249 BOOL getVersionInfo(AccessBridgeVersionInfo *info); 250 251 // verification methods 252 BOOL verifyAccessibleText(jobject obj); 253 254 /* ===== utility methods ===== */ 255 BOOL isSameObject(jobject obj1, jobject obj2); 256 BOOL setTextContents(const jobject accessibleContext, const wchar_t *text); 257 jobject getParentWithRole (const jobject accessibleContext, const wchar_t *role); 258 jobject getTopLevelObject (const jobject accessibleContext); 259 jobject getParentWithRoleElseRoot (const jobject accessibleContext, const wchar_t *role); 260 jint getObjectDepth (const jobject accessibleContext); 261 jobject getActiveDescendent (const jobject accessibleContext); 262 263 // Accessible Context methods 264 jobject getAccessibleContextAt(jint x, jint y, jobject AccessibleContext); 265 jobject getAccessibleContextWithFocus(); 266 BOOL getAccessibleContextInfo(jobject AccessibleContext, AccessibleContextInfo *info); 267 jobject getAccessibleChildFromContext(jobject AccessibleContext, jint childIndex); 268 jobject getAccessibleParentFromContext(jobject AccessibleContext); 269 270 /* begin AccessibleTable methods */ 271 272 BOOL getAccessibleTableInfo(jobject acParent, AccessibleTableInfo *tableInfo); 273 BOOL getAccessibleTableCellInfo(jobject accessibleTable,jint row, jint column, 274 AccessibleTableCellInfo *tableCellInfo); 275 276 BOOL getAccessibleTableRowHeader(jobject acParent, AccessibleTableInfo *tableInfo); 277 BOOL getAccessibleTableColumnHeader(jobject acParent, AccessibleTableInfo *tableInfo); 278 279 jobject getAccessibleTableRowDescription(jobject acParent, jint row); 280 jobject getAccessibleTableColumnDescription(jobject acParent, jint column); 281 282 jint getAccessibleTableRowSelectionCount(jobject accessibleTable); 283 BOOL isAccessibleTableRowSelected(jobject accessibleTable, jint row); 284 BOOL getAccessibleTableRowSelections(jobject accessibleTable, jint count, jint *selections); 285 286 jint getAccessibleTableColumnSelectionCount(jobject accessibleTable); 287 BOOL isAccessibleTableColumnSelected(jobject accessibleTable, jint column); 288 BOOL getAccessibleTableColumnSelections(jobject accessibleTable, jint count, jint *selections); 289 290 jint getAccessibleTableRow(jobject accessibleTable, jint index); 291 jint getAccessibleTableColumn(jobject accessibleTable, jint index); 292 jint getAccessibleTableIndex(jobject accessibleTable, jint row, jint column); 293 294 /* end AccessibleTable methods */ 295 296 BOOL getAccessibleRelationSet(jobject accessibleContext, AccessibleRelationSetInfo *relationSetInfo); 297 298 // AccessibleHypertext methods 299 BOOL getAccessibleHypertext(jobject accessibleContext, AccessibleHypertextInfo *hyperlink); 300 301 BOOL activateAccessibleHyperlink(jobject accessibleContext, jobject accessibleHyperlink); 302 303 BOOL getAccessibleHypertextExt(const jobject accessibleContext, 304 const jint nStartIndex, 305 /* OUT */ AccessibleHypertextInfo *hypertext); 306 jint getAccessibleHyperlinkCount(const jobject accessibleContext); 307 jint getAccessibleHypertextLinkIndex(const jobject accessibleContext, 308 const jint nIndex); 309 BOOL getAccessibleHyperlink(const jobject accessibleContext, 310 const jint nIndex, 311 /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo); 312 313 // Accessible Keybinding methods 314 BOOL getAccessibleKeyBindings(jobject accessibleContext, AccessibleKeyBindings *keyBindings); 315 316 // AccessibleIcon methods 317 BOOL getAccessibleIcons(jobject accessibleContext, AccessibleIcons *icons); 318 319 // AccessibleActionMethods 320 BOOL getAccessibleActions(jobject accessibleContext, AccessibleActions *actions); 321 BOOL doAccessibleActions(jobject accessibleContext, AccessibleActionsToDo *actionsToDo, jint *failure); 322 323 // Accessible Text methods 324 BOOL getAccessibleTextInfo(jobject AccessibleContext, AccessibleTextInfo *textInfo, jint x, jint y); 325 BOOL getAccessibleTextItems(jobject AccessibleContext, AccessibleTextItemsInfo *textItems, jint index); 326 BOOL getAccessibleTextSelectionInfo(jobject AccessibleContext, AccessibleTextSelectionInfo *selectionInfo); 327 BOOL getAccessibleTextAttributes(jobject AccessibleContext, jint index, AccessibleTextAttributesInfo *attributes); 328 BOOL getAccessibleTextRect(jobject AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index); 329 BOOL getAccessibleCaretRect(jobject AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index); 330 BOOL getAccessibleTextLineBounds(jobject AccessibleContext, jint index, jint *startIndex, jint *endIndex); 331 BOOL getAccessibleTextRange(jobject AccessibleContext, jint start, jint end, wchar_t *text, short len); 332 333 // Accessible Value methods 334 BOOL getCurrentAccessibleValueFromContext(jobject AccessibleContext, wchar_t *value, short len); 335 BOOL getMaximumAccessibleValueFromContext(jobject AccessibleContext, wchar_t *value, short len); 336 BOOL getMinimumAccessibleValueFromContext(jobject AccessibleContext, wchar_t *value, short len); 337 338 // Accessible Selection methods 339 void addAccessibleSelectionFromContext(jobject AccessibleContext, int i); 340 void clearAccessibleSelectionFromContext(jobject AccessibleContext); 341 jobject getAccessibleSelectionFromContext(jobject AccessibleContext, int i); 342 int getAccessibleSelectionCountFromContext(jobject AccessibleContext); 343 BOOL isAccessibleChildSelectedFromContext(jobject AccessibleContext, int i); 344 void removeAccessibleSelectionFromContext(jobject AccessibleContext, int i); 345 void selectAllAccessibleSelectionFromContext(jobject AccessibleContext); 346 347 // Event handling methods 348 BOOL addJavaEventNotification(jlong type); 349 BOOL removeJavaEventNotification(jlong type); 350 BOOL addAccessibilityEventNotification(jlong type); 351 BOOL removeAccessibilityEventNotification(jlong type); 352 353 /** 354 * Additional methods for Teton 355 */ 356 357 /** 358 * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns 359 * whether successful. 360 * 361 * Bug ID 4916682 - Implement JAWS AccessibleName policy 362 */ 363 BOOL getVirtualAccessibleName(const jobject accessibleContext, wchar_t *name, int len); 364 365 /** 366 * Request focus for a component. Returns whether successful; 367 * 368 * Bug ID 4944757 - requestFocus method needed 369 */ 370 BOOL requestFocus(const jobject accessibleContext); 371 372 /** 373 * Selects text between two indices. Selection includes the text at the start index 374 * and the text at the end index. Returns whether successful; 375 * 376 * Bug ID 4944758 - selectTextRange method needed 377 */ 378 BOOL selectTextRange(const jobject accessibleContext, int startIndex, int endIndex); 379 380 /** 381 * Get text attributes between two indices. The attribute list includes the text at the 382 * start index and the text at the end index. Returns whether successful; 383 * 384 * Bug ID 4944761 - getTextAttributes between two indices method needed 385 */ 386 BOOL getTextAttributesInRange(const jobject accessibleContext, int startIndex, int endIndex, 387 AccessibleTextAttributesInfo *attributes, short *len); 388 389 /** 390 * Gets the number of visible children of a component. Returns -1 on error. 391 * 392 * Bug ID 4944762- getVisibleChildren for list-like components needed 393 */ 394 int getVisibleChildrenCount(const jobject accessibleContext); 395 396 /** 397 * Gets the visible children of an AccessibleContext. Returns whether successful; 398 * 399 * Bug ID 4944762- getVisibleChildren for list-like components needed 400 */ 401 BOOL getVisibleChildren(const jobject accessibleContext, const int startIndex, 402 VisibleChildrenInfo *visibleChildrenInfo); 403 404 /** 405 * Set the caret to a text position. Returns whether successful; 406 * 407 * Bug ID 4944770 - setCaretPosition method needed 408 */ 409 BOOL setCaretPosition(const jobject accessibleContext, int position); 410 411 /** 412 * Gets the bounding rectangle for the text caret 413 */ 414 BOOL getCaretLocation(jobject AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index); 415 416 }; 417 418 #endif