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