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