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 DLL which is loaded by Windows executables to handle communication 28 * between Java VMs purposes of Accessbility. 29 */ 30 31 #ifndef __WinAccessBridge_H__ 32 #define __WinAccessBridge_H__ 33 34 #include <windows.h> 35 #include "AccessBridgePackages.h" 36 #include "AccessBridgeEventHandler.h" 37 #include "AccessBridgeJavaVMInstance.h" 38 #include "AccessBridgeMessageQueue.h" 39 40 41 extern "C" { 42 BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, 43 LPVOID lpvReserved); 44 void AppendToCallOutput(char *s); 45 BOOL CALLBACK AccessBridgeDialogProc(HWND hDlg, UINT message, 46 UINT wParam, LONG lParam); 47 HWND getTopLevelHWND(HWND descendent); 48 } 49 50 LRESULT CALLBACK WinAccessBridgeWindowProc(HWND hWnd, UINT message, 51 UINT wParam, LONG lParam); 52 53 BOOL CALLBACK DeleteItemProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam); 54 55 /** 56 * The WinAccessBridge class. The core of the Windows AT AccessBridge dll 57 */ 58 class WinAccessBridge { 59 HINSTANCE windowsInstance; 60 HWND dialogWindow; 61 AccessBridgeJavaVMInstance *javaVMs; 62 AccessBridgeEventHandler *eventHandler; 63 AccessBridgeMessageQueue *messageQueue; 64 65 public: 66 WinAccessBridge(HINSTANCE hInstance); 67 ~WinAccessBridge(); 68 BOOL initWindow(); 69 70 HWND showWinAccessBridgeGUI(int showCommand); 71 72 // IPC with the Java AccessBridge DLL 73 LRESULT rendezvousWithNewJavaDLL(HWND JavaBridgeDLLwindow, long vmID); 74 75 void sendPackage(char *buffer, long bufsize, HWND destWindow); 76 BOOL sendMemoryPackage(char *buffer, long bufsize, HWND destWindow); 77 BOOL queuePackage(char *buffer, long bufsize); 78 BOOL receiveAQueuedPackage(); 79 void preProcessPackage(char *buffer, long bufsize); 80 void processPackage(char *buffer, long bufsize); 81 void JavaVMDestroyed(HWND VMBridgeDLLWindow); 82 83 // Java VM object memory management 84 void releaseJavaObject(long vmID, JOBJECT64 object); 85 86 // Version info 87 BOOL getVersionInfo(long vmID, AccessBridgeVersionInfo *info); 88 89 // HWND management methods 90 HWND getNextJavaWindow(HWND previous); 91 BOOL isJavaWindow(HWND window); 92 BOOL getAccessibleContextFromHWND(HWND window, long *vmID, JOBJECT64 *AccessibleContext); 93 HWND getHWNDFromAccessibleContext(long vmID, JOBJECT64 accessibleContext); 94 95 /* Additional utility methods */ 96 BOOL isSameObject(long vmID, JOBJECT64 obj1, JOBJECT64 obj2); 97 98 BOOL setTextContents (const long vmID, const AccessibleContext accessibleContext, const wchar_t *text); 99 100 AccessibleContext getParentWithRole (const long vmID, const AccessibleContext accessibleContext, 101 const wchar_t *role); 102 103 AccessibleContext getTopLevelObject (const long vmID, const AccessibleContext accessibleContext); 104 105 AccessibleContext getParentWithRoleElseRoot (const long vmID, const AccessibleContext accessibleContext, 106 const wchar_t *role); 107 108 int getObjectDepth (const long vmID, const AccessibleContext accessibleContext); 109 110 AccessibleContext getActiveDescendent (const long vmID, const AccessibleContext accessibleContext); 111 112 113 // Accessible Context methods 114 BOOL getAccessibleContextAt(long vmID, JOBJECT64 AccessibleContextParent, 115 jint x, jint y, JOBJECT64 *AccessibleContext); 116 BOOL getAccessibleContextWithFocus(HWND window, long *vmID, JOBJECT64 *AccessibleContext); 117 BOOL getAccessibleContextInfo(long vmID, JOBJECT64 AccessibleContext, AccessibleContextInfo *info); 118 JOBJECT64 getAccessibleChildFromContext(long vmID, JOBJECT64 AccessibleContext, jint childIndex); 119 JOBJECT64 getAccessibleParentFromContext(long vmID, JOBJECT64 AccessibleContext); 120 121 /* begin AccessibleTable methods */ 122 BOOL getAccessibleTableInfo(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo); 123 BOOL getAccessibleTableCellInfo(long vmID, JOBJECT64 accessibleTable, jint row, jint column, 124 AccessibleTableCellInfo *tableCellInfo); 125 126 BOOL getAccessibleTableRowHeader(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo); 127 BOOL getAccessibleTableColumnHeader(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo); 128 129 JOBJECT64 getAccessibleTableRowDescription(long vmID, JOBJECT64 acParent, jint row); 130 JOBJECT64 getAccessibleTableColumnDescription(long vmID, JOBJECT64 acParent, jint column); 131 132 jint getAccessibleTableRowSelectionCount(long vmID, JOBJECT64 accessibleTable); 133 BOOL isAccessibleTableRowSelected(long vmID, JOBJECT64 accessibleTable, jint row); 134 BOOL getAccessibleTableRowSelections(long vmID, JOBJECT64 accessibleTable, jint count, 135 jint *selections); 136 137 jint getAccessibleTableColumnSelectionCount(long vmID, JOBJECT64 accessibleTable); 138 BOOL isAccessibleTableColumnSelected(long vmID, JOBJECT64 accessibleTable, jint column); 139 BOOL getAccessibleTableColumnSelections(long vmID, JOBJECT64 accessibleTable, jint count, 140 jint *selections); 141 142 jint getAccessibleTableRow(long vmID, JOBJECT64 accessibleTable, jint index); 143 jint getAccessibleTableColumn(long vmID, JOBJECT64 accessibleTable, jint index); 144 jint getAccessibleTableIndex(long vmID, JOBJECT64 accessibleTable, jint row, jint column); 145 146 /* end AccessibleTable methods */ 147 148 // --------- AccessibleRelationSet methods 149 BOOL getAccessibleRelationSet(long vmID, JOBJECT64 accessibleContext, AccessibleRelationSetInfo *relationSet); 150 151 // --------- AccessibleHypertext methods 152 BOOL getAccessibleHypertext(long vmID, JOBJECT64 accessibleContext, AccessibleHypertextInfo *hypertextInfo); 153 BOOL activateAccessibleHyperlink(long vmID, JOBJECT64 accessibleContext, JOBJECT64 accessibleHyperlink); 154 155 jint getAccessibleHyperlinkCount(const long vmID, 156 const AccessibleContext accessibleContext); 157 158 BOOL getAccessibleHypertextExt(const long vmID, 159 const AccessibleContext accessibleContext, 160 const jint nStartIndex, 161 /* OUT */ AccessibleHypertextInfo *hypertextInfo); 162 163 jint getAccessibleHypertextLinkIndex(const long vmID, 164 const AccessibleHypertext hypertext, 165 const jint nIndex); 166 167 BOOL getAccessibleHyperlink(const long vmID, 168 const AccessibleHypertext hypertext, 169 const jint nIndex, 170 /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo); 171 172 173 /* Accessible KeyBindings, Icons and Actions */ 174 BOOL getAccessibleKeyBindings(long vmID, JOBJECT64 accessibleContext, 175 AccessibleKeyBindings *keyBindings); 176 177 BOOL getAccessibleIcons(long vmID, JOBJECT64 accessibleContext, 178 AccessibleIcons *icons); 179 180 BOOL getAccessibleActions(long vmID, JOBJECT64 accessibleContext, 181 AccessibleActions *actions); 182 183 BOOL doAccessibleActions(long vmID, JOBJECT64 accessibleContext, 184 AccessibleActionsToDo *actionsToDo, jint *failure); 185 186 187 // Accessible Text methods 188 BOOL getAccessibleTextInfo(long vmID, JOBJECT64 AccessibleContext, AccessibleTextInfo *textInfo, jint x, jint y); 189 BOOL getAccessibleTextItems(long vmID, JOBJECT64 AccessibleContext, AccessibleTextItemsInfo *textItems, jint index); 190 BOOL getAccessibleTextSelectionInfo(long vmID, JOBJECT64 AccessibleContext, AccessibleTextSelectionInfo *selectionInfo); 191 BOOL getAccessibleTextAttributes(long vmID, JOBJECT64 AccessibleContext, jint index, AccessibleTextAttributesInfo *attributes); 192 BOOL getAccessibleTextRect(long vmID, JOBJECT64 AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index); 193 BOOL getAccessibleTextLineBounds(long vmID, JOBJECT64 AccessibleContext, jint index, jint *startIndex, jint *endIndex); 194 BOOL getAccessibleTextRange(long vmID, JOBJECT64 AccessibleContext, jint start, jint end, wchar_t *text, short len); 195 196 // Accessible Value methods 197 BOOL getCurrentAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext, wchar_t *value, short len); 198 BOOL getMaximumAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext, wchar_t *value, short len); 199 BOOL getMinimumAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext, wchar_t *value, short len); 200 201 // Accessible Selection methods 202 void addAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i); 203 void clearAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext); 204 JOBJECT64 getAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i); 205 int getAccessibleSelectionCountFromContext(long vmID, JOBJECT64 AccessibleContext); 206 BOOL isAccessibleChildSelectedFromContext(long vmID, JOBJECT64 AccessibleContext, int i); 207 void removeAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i); 208 void selectAllAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext); 209 210 // Event handling methods 211 void addJavaEventNotification(jlong type); 212 void removeJavaEventNotification(jlong type); 213 void addAccessibilityEventNotification(jlong type); 214 void removeAccessibilityEventNotification(jlong type); 215 216 void setPropertyChangeFP(AccessBridge_PropertyChangeFP fp); 217 void setJavaShutdownFP(AccessBridge_JavaShutdownFP fp); 218 void setFocusGainedFP(AccessBridge_FocusGainedFP fp); 219 void setFocusLostFP(AccessBridge_FocusLostFP fp); 220 void setCaretUpdateFP(AccessBridge_CaretUpdateFP fp); 221 void setMouseClickedFP(AccessBridge_MouseClickedFP fp); 222 void setMouseEnteredFP(AccessBridge_MouseEnteredFP fp); 223 void setMouseExitedFP(AccessBridge_MouseExitedFP fp); 224 void setMousePressedFP(AccessBridge_MousePressedFP fp); 225 void setMouseReleasedFP(AccessBridge_MouseReleasedFP fp); 226 void setMenuCanceledFP(AccessBridge_MenuCanceledFP fp); 227 void setMenuDeselectedFP(AccessBridge_MenuDeselectedFP fp); 228 void setMenuSelectedFP(AccessBridge_MenuSelectedFP fp); 229 void setPopupMenuCanceledFP(AccessBridge_PopupMenuCanceledFP fp); 230 void setPopupMenuWillBecomeInvisibleFP(AccessBridge_PopupMenuWillBecomeInvisibleFP fp); 231 void setPopupMenuWillBecomeVisibleFP(AccessBridge_PopupMenuWillBecomeVisibleFP fp); 232 233 void setPropertyNameChangeFP(AccessBridge_PropertyNameChangeFP fp); 234 void setPropertyDescriptionChangeFP(AccessBridge_PropertyDescriptionChangeFP fp); 235 void setPropertyStateChangeFP(AccessBridge_PropertyStateChangeFP fp); 236 void setPropertyValueChangeFP(AccessBridge_PropertyValueChangeFP fp); 237 void setPropertySelectionChangeFP(AccessBridge_PropertySelectionChangeFP fp); 238 void setPropertyTextChangeFP(AccessBridge_PropertyTextChangeFP fp); 239 void setPropertyCaretChangeFP(AccessBridge_PropertyCaretChangeFP fp); 240 void setPropertyVisibleDataChangeFP(AccessBridge_PropertyVisibleDataChangeFP fp); 241 void setPropertyChildChangeFP(AccessBridge_PropertyChildChangeFP fp); 242 void setPropertyActiveDescendentChangeFP(AccessBridge_PropertyActiveDescendentChangeFP fp); 243 244 void setPropertyTableModelChangeFP(AccessBridge_PropertyTableModelChangeFP fp); 245 246 /** 247 * Additional methods for Teton 248 */ 249 250 /** 251 * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns 252 * whether successful. 253 * 254 * Bug ID 4916682 - Implement JAWS AccessibleName policy 255 */ 256 BOOL getVirtualAccessibleName(long vmID, AccessibleContext accessibleContext, wchar_t *name, int len); 257 258 /** 259 * Request focus for a component. Returns whether successful; 260 * 261 * Bug ID 4944757 - requestFocus method needed 262 */ 263 BOOL requestFocus(long vmID, AccessibleContext accessibleContext); 264 265 /** 266 * Selects text between two indices. Selection includes the text at the start index 267 * and the text at the end index. Returns whether successful; 268 * 269 * Bug ID 4944758 - selectTextRange method needed 270 */ 271 BOOL selectTextRange(long vmID, AccessibleContext accessibleContext, int startIndex, int endIndex); 272 273 /** 274 * Get text attributes between two indices. The attribute list includes the text at the 275 * start index and the text at the end index. Returns whether successful; 276 * 277 * Bug ID 4944761 - getTextAttributes between two indices method needed 278 */ 279 BOOL getTextAttributesInRange(long vmID, AccessibleContext accessibleContext, int startIndex, int endIndex, 280 AccessibleTextAttributesInfo *attributes, short *len); 281 282 /** 283 * Gets number of visible children of a component. Returns -1 on error. 284 * 285 * Bug ID 4944762- getVisibleChildren for list-like components needed 286 */ 287 int getVisibleChildrenCount(long vmID, AccessibleContext accessibleContext); 288 289 /** 290 * Gets the visible children of an AccessibleContext. Returns whether successful; 291 * 292 * Bug ID 4944762- getVisibleChildren for list-like components needed 293 */ 294 BOOL getVisibleChildren(long vmID, AccessibleContext accessibleContext, int startIndex, 295 VisibleChildrenInfo *visibleChildrenInfo); 296 297 /** 298 * Set the caret to a text position. Returns whether successful; 299 * 300 * Bug ID 4944770 - setCaretPosition method needed 301 */ 302 BOOL setCaretPosition(long vmID, AccessibleContext accessibleContext, int position); 303 304 305 /** 306 * Gets the text caret bounding rectangle 307 */ 308 BOOL getCaretLocation(long vmID, JOBJECT64 AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index); 309 310 /** 311 * Gets number of events waiting in the message queue 312 */ 313 int getEventsWaiting(); 314 315 }; 316 317 #endif