diff options
author | Carolyn MacLeod <carolyn> | 2010-04-27 16:57:47 +0000 |
---|---|---|
committer | Carolyn MacLeod <carolyn> | 2010-04-27 16:57:47 +0000 |
commit | 3432d57cc04ef1f655fa110268dd9aa31a9cd42d (patch) | |
tree | 651d2687b367c31bba350e7345ccb23e554ed743 | |
parent | bb50d013efc19825e8fad10d3794d4669d974d4f (diff) | |
download | eclipse.platform.swt-3432d57cc04ef1f655fa110268dd9aa31a9cd42d.tar.gz eclipse.platform.swt-3432d57cc04ef1f655fa110268dd9aa31a9cd42d.tar.xz eclipse.platform.swt-3432d57cc04ef1f655fa110268dd9aa31a9cd42d.zip |
fixing and adding debug
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT Accessibility/win32/org/eclipse/swt/accessibility/Accessible.java | 960 |
1 files changed, 605 insertions, 355 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Accessibility/win32/org/eclipse/swt/accessibility/Accessible.java b/bundles/org.eclipse.swt/Eclipse SWT Accessibility/win32/org/eclipse/swt/accessibility/Accessible.java index 732dd6e308..9d973a8e87 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Accessibility/win32/org/eclipse/swt/accessibility/Accessible.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Accessibility/win32/org/eclipse/swt/accessibility/Accessible.java @@ -46,12 +46,12 @@ public class Accessible { static final int MAX_RELATION_TYPES = 15; static final int TABLE_MODEL_CHANGE_SIZE = 5; static final int TEXT_CHANGE_SIZE = 4; - static final boolean DEBUG = Device.DEBUG; - static int UniqueID = 1; + static final boolean DEBUG = false; + static int UniqueID = -0x10; int refCount = 0, enumIndex = 0; COMObject objIAccessible, objIEnumVARIANT, objIServiceProvider, objIAccessible2, objIAccessibleAction, - objIAccessibleApplication, objIAccessibleComponent, /*objIAccessibleEditableText,*/ objIAccessibleHyperlink, - objIAccessibleHypertext, objIAccessibleImage, objIAccessibleTable2, objIAccessibleTableCell, + objIAccessibleApplication, /*objIAccessibleComponent,*/ /*objIAccessibleEditableText,*/ objIAccessibleHyperlink, + objIAccessibleHypertext, /*objIAccessibleImage,*/ objIAccessibleTable2, objIAccessibleTableCell, objIAccessibleText, objIAccessibleValue; /* objIAccessibleRelation is defined in Relation class */ IAccessible iaccessible; Vector accessibleListeners = new Vector(); @@ -63,14 +63,13 @@ public class Accessible { Vector accessibleTableCellListeners = new Vector(); Vector accessibleTextExtendedListeners = new Vector(); Vector accessibleValueListeners = new Vector(); - Vector accessibleScrollListeners = new Vector(); Vector accessibleAttributeListeners = new Vector(); Relation relations[] = new Relation[MAX_RELATION_TYPES]; Object[] variants; Accessible parent; Vector children = new Vector(); Control control; - int uniqueID = 0; + int uniqueID = -1; int [] tableChange; // type, rowStart, rowCount, columnStart, columnCount Object [] textDeleted; // type, start, end, text Object [] textInserted; // type, start, end, text @@ -92,8 +91,6 @@ public class Accessible { this.parent = checkNull(parent); this.control = parent.control; parent.children.addElement(this); - // TODO: Should we use the proxy for lightweight children (for IAccessible defaults only)? - this.iaccessible = parent.iaccessible; // use the same proxy for default values? } /** @@ -238,16 +235,17 @@ public class Accessible { }; } - void createIAccessibleComponent() { - objIAccessibleComponent = new COMObject(new int[] {2,0,0,2,1,1}) { - public int /*long*/ method0(int /*long*/[] args) {return QueryInterface(args[0], args[1]);} - public int /*long*/ method1(int /*long*/[] args) {return AddRef();} - public int /*long*/ method2(int /*long*/[] args) {return Release();} - public int /*long*/ method3(int /*long*/[] args) {return get_locationInParent(args[0], args[1]);} - public int /*long*/ method4(int /*long*/[] args) {return get_foreground(args[0]);} - public int /*long*/ method5(int /*long*/[] args) {return get_background(args[0]);} - }; - } + // This method is intentionally commented. We are not providing IAccessibleComponent at this time. +// void createIAccessibleComponent() { +// objIAccessibleComponent = new COMObject(new int[] {2,0,0,2,1,1}) { +// public int /*long*/ method0(int /*long*/[] args) {return QueryInterface(args[0], args[1]);} +// public int /*long*/ method1(int /*long*/[] args) {return AddRef();} +// public int /*long*/ method2(int /*long*/[] args) {return Release();} +// public int /*long*/ method3(int /*long*/[] args) {return get_locationInParent(args[0], args[1]);} +// public int /*long*/ method4(int /*long*/[] args) {return get_foreground(args[0]);} +// public int /*long*/ method5(int /*long*/[] args) {return get_background(args[0]);} +// }; +// } // This method is intentionally commented. We are not providing IAccessibleEditableText at this time. // void createIAccessibleEditableText() { @@ -318,16 +316,17 @@ public class Accessible { }; } - void createIAccessibleImage() { - objIAccessibleImage = new COMObject(new int[] {2,0,0,1,3,2}) { - public int /*long*/ method0(int /*long*/[] args) {return QueryInterface(args[0], args[1]);} - public int /*long*/ method1(int /*long*/[] args) {return AddRef();} - public int /*long*/ method2(int /*long*/[] args) {return Release();} - public int /*long*/ method3(int /*long*/[] args) {return get_description(args[0]);} - public int /*long*/ method4(int /*long*/[] args) {return get_imagePosition((int)/*64*/args[0], args[1], args[2]);} - public int /*long*/ method5(int /*long*/[] args) {return get_imageSize(args[0], args[1]);} - }; - } + // This method is intentionally commented. We are not providing IAccessibleImage at this time. +// void createIAccessibleImage() { +// objIAccessibleImage = new COMObject(new int[] {2,0,0,1,3,2}) { +// public int /*long*/ method0(int /*long*/[] args) {return QueryInterface(args[0], args[1]);} +// public int /*long*/ method1(int /*long*/[] args) {return AddRef();} +// public int /*long*/ method2(int /*long*/[] args) {return Release();} +// public int /*long*/ method3(int /*long*/[] args) {return get_description(args[0]);} +// public int /*long*/ method4(int /*long*/[] args) {return get_imagePosition((int)/*64*/args[0], args[1], args[2]);} +// public int /*long*/ method5(int /*long*/[] args) {return get_imageSize(args[0], args[1]);} +// }; +// } void createIAccessibleTable2() { objIAccessibleTable2 = new COMObject(new int[] {2,0,0,3,1,2,1,1,1,1,1,2,2,2,2,1,2,2,1,1,1,1,1}) { @@ -1096,11 +1095,12 @@ public class Accessible { */ public void sendEvent(int event, Object eventData) { checkWidget(); + if (DEBUG) print(this + ".NotifyWinEvent " + getEventString(event) + " hwnd=" + control.handle + " childID=" + eventChildID()); switch (event) { case ACC.EVENT_TABLE_CHANGED: { if (!(eventData instanceof int[] && ((int[])eventData).length == TABLE_MODEL_CHANGE_SIZE)) break; tableChange = (int[])eventData; - COM.NotifyWinEvent (COM.IA2_EVENT_TABLE_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); + COM.NotifyWinEvent (COM.IA2_EVENT_TABLE_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; } case ACC.EVENT_TEXT_CHANGED: { @@ -1110,11 +1110,11 @@ public class Accessible { switch (type) { case ACC.DELETE: textDeleted = (Object[])eventData; - COM.NotifyWinEvent (COM.IA2_EVENT_TEXT_REMOVED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); + COM.NotifyWinEvent (COM.IA2_EVENT_TEXT_REMOVED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.INSERT: textInserted = (Object[])eventData; - COM.NotifyWinEvent (COM.IA2_EVENT_TEXT_INSERTED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); + COM.NotifyWinEvent (COM.IA2_EVENT_TEXT_INSERTED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; } break; @@ -1123,67 +1123,67 @@ public class Accessible { if (!(eventData instanceof Integer)) break; // int index = ((Integer)eventData).intValue(); // TODO: IA2 currently does not use the index, however the plan is to use it in future - COM.NotifyWinEvent (COM.IA2_EVENT_HYPERTEXT_LINK_SELECTED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); + COM.NotifyWinEvent (COM.IA2_EVENT_HYPERTEXT_LINK_SELECTED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; } case ACC.EVENT_VALUE_CHANGED: - COM.NotifyWinEvent (COM.EVENT_OBJECT_VALUECHANGE, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.EVENT_OBJECT_VALUECHANGE, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_STATE_CHANGED: - COM.NotifyWinEvent (COM.EVENT_OBJECT_STATECHANGE, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.EVENT_OBJECT_STATECHANGE, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_SELECTION_CHANGED: - COM.NotifyWinEvent (COM.EVENT_OBJECT_SELECTIONWITHIN, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.EVENT_OBJECT_SELECTIONWITHIN, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_TEXT_SELECTION_CHANGED: - COM.NotifyWinEvent (COM.EVENT_OBJECT_TEXTSELECTIONCHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.EVENT_OBJECT_TEXTSELECTIONCHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_LOCATION_CHANGED: - COM.NotifyWinEvent (COM.EVENT_OBJECT_LOCATIONCHANGE, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.EVENT_OBJECT_LOCATIONCHANGE, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_NAME_CHANGED: - COM.NotifyWinEvent (COM.EVENT_OBJECT_NAMECHANGE, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.EVENT_OBJECT_NAMECHANGE, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_DESCRIPTION_CHANGED: - COM.NotifyWinEvent (COM.EVENT_OBJECT_DESCRIPTIONCHANGE, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.EVENT_OBJECT_DESCRIPTIONCHANGE, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_DOCUMENT_LOAD_COMPLETE: - COM.NotifyWinEvent (COM.IA2_EVENT_DOCUMENT_LOAD_COMPLETE, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_DOCUMENT_LOAD_COMPLETE, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_DOCUMENT_LOAD_STOPPED: - COM.NotifyWinEvent (COM.IA2_EVENT_DOCUMENT_LOAD_STOPPED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_DOCUMENT_LOAD_STOPPED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_DOCUMENT_RELOAD: - COM.NotifyWinEvent (COM.IA2_EVENT_DOCUMENT_RELOAD, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_DOCUMENT_RELOAD, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_PAGE_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_PAGE_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_PAGE_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_SECTION_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_SECTION_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_SECTION_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_ACTION_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_ACTION_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_ACTION_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_HYPERLINK_START_INDEX_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_HYPERLINK_START_INDEX_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_HYPERLINK_START_INDEX_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_HYPERLINK_END_INDEX_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_HYPERLINK_END_INDEX_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_HYPERLINK_END_INDEX_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_HYPERLINK_ANCHOR_COUNT_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_HYPERLINK_ANCHOR_COUNT_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_HYPERLINK_ANCHOR_COUNT_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_HYPERLINK_SELECTED_LINK_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_HYPERLINK_SELECTED_LINK_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_HYPERLINK_SELECTED_LINK_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_HYPERLINK_ACTIVATED: - COM.NotifyWinEvent (COM.IA2_EVENT_HYPERLINK_ACTIVATED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_HYPERLINK_ACTIVATED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_HYPERTEXT_LINK_COUNT_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_HYPERTEXT_LINK_COUNT_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_HYPERTEXT_LINK_COUNT_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_ATTRIBUTE_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_ATTRIBUTE_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_ATTRIBUTE_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_TABLE_CAPTION_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_TABLE_CAPTION_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_TABLE_CAPTION_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_TABLE_COLUMN_HEADER_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_TABLE_COLUMN_HEADER_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_TABLE_COLUMN_HEADER_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_TABLE_ROW_DESCRIPTION_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_TABLE_ROW_DESCRIPTION_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_TABLE_ROW_DESCRIPTION_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_TABLE_ROW_HEADER_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_TABLE_ROW_HEADER_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_TABLE_ROW_HEADER_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_TABLE_SUMMARY_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_TABLE_SUMMARY_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_TABLE_SUMMARY_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_TEXT_ATTRIBUTE_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_TEXT_ATTRIBUTE_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_TEXT_ATTRIBUTE_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_TEXT_CARET_MOVED: - COM.NotifyWinEvent (COM.IA2_EVENT_TEXT_CARET_MOVED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_TEXT_CARET_MOVED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; case ACC.EVENT_TEXT_COLUMN_CHANGED: - COM.NotifyWinEvent (COM.IA2_EVENT_TEXT_COLUMN_CHANGED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); break; + COM.NotifyWinEvent (COM.IA2_EVENT_TEXT_COLUMN_CHANGED, control.handle, COM.OBJID_CLIENT, eventChildID()); break; } } @@ -1200,7 +1200,8 @@ public class Accessible { */ public void selectionChanged () { checkWidget(); - COM.NotifyWinEvent (COM.EVENT_OBJECT_SELECTIONWITHIN, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); + if (DEBUG) print(this + ".NotifyWinEvent EVENT_OBJECT_SELECTIONWITHIN hwnd=" + control.handle + " childID=" + eventChildID()); + COM.NotifyWinEvent (COM.EVENT_OBJECT_SELECTIONWITHIN, control.handle, COM.OBJID_CLIENT, eventChildID()); } /** @@ -1216,7 +1217,9 @@ public class Accessible { */ public void setFocus(int childID) { checkWidget(); - COM.NotifyWinEvent (COM.EVENT_OBJECT_FOCUS, control.handle, COM.OBJID_CLIENT, childIDToOs(childID)); + int osChildID = childID == ACC.CHILDID_SELF ? eventChildID() : childIDToOs(childID); + if (DEBUG) print(this + ".NotifyWinEvent EVENT_OBJECT_FOCUS hwnd=" + control.handle + " childID=" + osChildID); + COM.NotifyWinEvent (COM.EVENT_OBJECT_FOCUS, control.handle, COM.OBJID_CLIENT, osChildID); } /** @@ -1234,8 +1237,10 @@ public class Accessible { */ public void textCaretMoved (int index) { checkWidget(); - COM.NotifyWinEvent (COM.EVENT_OBJECT_LOCATIONCHANGE, control.handle, COM.OBJID_CARET, COM.CHILDID_SELF); - COM.NotifyWinEvent (ACC.EVENT_TEXT_CARET_MOVED, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); + if (DEBUG) print(this + ".NotifyWinEvent EVENT_OBJECT_LOCATIONCHANGE hwnd=" + control.handle + " childID=" + eventChildID()); + COM.NotifyWinEvent (COM.EVENT_OBJECT_LOCATIONCHANGE, control.handle, COM.OBJID_CARET, eventChildID()); + if (DEBUG) print(this + ".NotifyWinEvent IA2_EVENT_TEXT_CARET_MOVED hwnd=" + control.handle + " childID=" + eventChildID()); + COM.NotifyWinEvent (COM.IA2_EVENT_TEXT_CARET_MOVED, control.handle, COM.OBJID_CLIENT, eventChildID()); } /** @@ -1277,7 +1282,8 @@ public class Accessible { sendEvent(ACC.EVENT_TEXT_CHANGED, eventData); return; } - COM.NotifyWinEvent (COM.EVENT_OBJECT_VALUECHANGE, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); + if (DEBUG) print(this + ".NotifyWinEvent EVENT_OBJECT_VALUECHANGE hwnd=" + control.handle + " childID=" + eventChildID()); + COM.NotifyWinEvent (COM.EVENT_OBJECT_VALUECHANGE, control.handle, COM.OBJID_CLIENT, eventChildID()); } /** @@ -1293,7 +1299,8 @@ public class Accessible { */ public void textSelectionChanged () { checkWidget(); - COM.NotifyWinEvent (COM.EVENT_OBJECT_VALUECHANGE, control.handle, COM.OBJID_CLIENT, COM.CHILDID_SELF); + if (DEBUG) print(this + ".NotifyWinEvent EVENT_OBJECT_VALUECHANGE hwnd=" + control.handle + " childID=" + eventChildID()); + COM.NotifyWinEvent (COM.EVENT_OBJECT_VALUECHANGE, control.handle, COM.OBJID_CLIENT, eventChildID()); } /* QueryInterface([in] iid, [out] ppvObject) @@ -1304,11 +1311,11 @@ public class Accessible { COM.MoveMemory(ppvObject, new int /*long*/[] { 0 }, OS.PTR_SIZEOF); GUID guid = new GUID(); COM.MoveMemory(guid, iid, GUID.sizeof); - if (DEBUG && interesting(guid)) print("QueryInterface guid=" + guidString(guid)); if (COM.IsEqualGUID(guid, COM.IIDIUnknown)) { COM.MoveMemory(ppvObject, new int /*long*/[] { getAddress() }, OS.PTR_SIZEOF); AddRef(); + if (DEBUG) print(this + ".QueryInterface guid=" + guidString(guid) + " returning " + getAddress() + hresult(COM.S_OK)); return COM.S_OK; } @@ -1316,6 +1323,7 @@ public class Accessible { if (objIAccessible == null) createIAccessible(); COM.MoveMemory(ppvObject, new int /*long*/[] { objIAccessible.getAddress() }, OS.PTR_SIZEOF); AddRef(); + if (DEBUG) print(this + ".QueryInterface guid=" + guidString(guid) + " returning " + objIAccessible.getAddress() + hresult(COM.S_OK)); return COM.S_OK; } @@ -1324,27 +1332,41 @@ public class Accessible { COM.MoveMemory(ppvObject, new int /*long*/[] { objIEnumVARIANT.getAddress() }, OS.PTR_SIZEOF); AddRef(); enumIndex = 0; + if (DEBUG) print(this + ".QueryInterface guid=" + guidString(guid) + " returning " + objIEnumVARIANT.getAddress() + hresult(COM.S_OK)); return COM.S_OK; } if (COM.IsEqualGUID(guid, COM.IIDIServiceProvider)) { - if (objIServiceProvider == null) createIServiceProvider(); - COM.MoveMemory(ppvObject, new int /*long*/[] { objIServiceProvider.getAddress() }, OS.PTR_SIZEOF); - AddRef(); - return COM.S_OK; + if (accessibleActionListeners.size() > 0 || accessibleAttributeListeners.size() > 0 || + accessibleHyperlinkListeners.size() > 0 || accessibleTableListeners.size() > 0 || + accessibleTableCellListeners.size() > 0 || accessibleTextExtendedListeners.size() > 0 || + accessibleValueListeners.size() > 0 || getRelationCount() > 0) { + if (objIServiceProvider == null) createIServiceProvider(); + COM.MoveMemory(ppvObject, new int /*long*/[] { objIServiceProvider.getAddress() }, OS.PTR_SIZEOF); + AddRef(); + if (DEBUG) print(this + ".QueryInterface guid=" + guidString(guid) + " returning " + objIServiceProvider.getAddress() + hresult(COM.S_OK)); + return COM.S_OK; + } + if (DEBUG) if (interesting(guid)) print("QueryInterface guid=" + guidString(guid) + " returning" + hresult(COM.E_NOINTERFACE)); + return COM.E_NOINTERFACE; } int code = queryAccessible2Interfaces(guid, ppvObject); - if (code != COM.S_FALSE) return code; + if (code != COM.S_FALSE) { + if (DEBUG) print(this + ".QueryInterface guid=" + guidString(guid) + " returning" + hresult(code)); + return code; + } if (iaccessible != null) { /* Forward any other GUIDs to the OS proxy. */ int /*long*/[] ppv = new int /*long*/[1]; code = iaccessible.QueryInterface(guid, ppv); COM.MoveMemory(ppvObject, ppv, OS.PTR_SIZEOF); + if (DEBUG) if (interesting(guid)) print("QueryInterface guid=" + guidString(guid) + " returning super" + hresult(code)); return code; } + if (DEBUG) if (interesting(guid)) print("QueryInterface guid=" + guidString(guid) + " returning" + hresult(COM.E_NOINTERFACE)); return COM.E_NOINTERFACE; } @@ -1381,9 +1403,10 @@ public class Accessible { objIAccessibleApplication.dispose(); objIAccessibleApplication = null; - if (objIAccessibleComponent != null) - objIAccessibleComponent.dispose(); - objIAccessibleComponent = null; + // The following lines are intentionally commented. We are not providing IAccessibleComponent at this time. +// if (objIAccessibleComponent != null) +// objIAccessibleComponent.dispose(); +// objIAccessibleComponent = null; // The following lines are intentionally commented. We are not providing IAccessibleEditableText at this time. // if (objIAccessibleEditableText != null) @@ -1398,9 +1421,10 @@ public class Accessible { objIAccessibleHypertext.dispose(); objIAccessibleHypertext = null; - if (objIAccessibleImage != null) - objIAccessibleImage.dispose(); - objIAccessibleImage = null; + // The following lines are intentionally commented. We are not providing IAccessibleImage at this time. +// if (objIAccessibleImage != null) +// objIAccessibleImage.dispose(); +// objIAccessibleImage = null; if (objIAccessibleTable2 != null) objIAccessibleTable2.dispose(); @@ -1433,23 +1457,28 @@ public class Accessible { COM.MoveMemory(service, guidService, GUID.sizeof); GUID guid = new GUID(); COM.MoveMemory(guid, riid, GUID.sizeof); - if (DEBUG && interesting(service) && interesting(guid)) - print("QueryService service=" + guidString(service) + " guid=" + guidString(guid)); if (COM.IsEqualGUID(service, COM.IIDIAccessible)) { if (COM.IsEqualGUID(guid, COM.IIDIUnknown) || COM.IsEqualGUID(guid, COM.IIDIDispatch) | COM.IsEqualGUID(guid, COM.IIDIAccessible)) { if (objIAccessible == null) createIAccessible(); + if (DEBUG) print(this + ".QueryService service=" + guidString(service) + " guid=" + guidString(guid) + " returning " + objIAccessible.getAddress() + hresult(COM.S_OK)); COM.MoveMemory(ppvObject, new int /*long*/[] { objIAccessible.getAddress() }, OS.PTR_SIZEOF); AddRef(); return COM.S_OK; } int code = queryAccessible2Interfaces(guid, ppvObject); - if (code != COM.S_FALSE) return code; + if (code != COM.S_FALSE) { + if (DEBUG) print(this + ".QueryService service=" + guidString(service) + " guid=" + guidString(guid) + " returning" + hresult(code)); + return code; + } } if (COM.IsEqualGUID(service, COM.IIDIAccessible2)) { int code = queryAccessible2Interfaces(guid, ppvObject); - if (code != COM.S_FALSE) return code; + if (code != COM.S_FALSE) { + if (DEBUG) print(this + ".*QueryService service=" + guidString(service) + " guid=" + guidString(guid) + " returning" + hresult(code)); + return code; + } } if (iaccessible != null) { @@ -1461,19 +1490,21 @@ public class Accessible { int /*long*/ [] ppvx = new int /*long*/ [1]; code = iserviceProvider.QueryService(service, guid, ppvx); COM.MoveMemory(ppvObject, ppvx, OS.PTR_SIZEOF); + if (DEBUG) if (interesting(service) && interesting(guid)) print("QueryService service=" + guidString(service) + " guid=" + guidString(guid) + " returning super" + hresult(code)); return code; } } + if (DEBUG) if (interesting(service) && interesting(guid)) print("QueryService service=" + guidString(service) + " guid=" + guidString(guid) + " returning" + hresult(COM.E_NOINTERFACE)); return COM.E_NOINTERFACE; } int queryAccessible2Interfaces(GUID guid, int /*long*/ ppvObject) { if (COM.IsEqualGUID(guid, COM.IIDIAccessible2)) { if (accessibleActionListeners.size() > 0 || accessibleAttributeListeners.size() > 0 || - accessibleHyperlinkListeners.size() > 0 || accessibleScrollListeners.size() > 0 || - accessibleTableListeners.size() > 0 || accessibleTableCellListeners.size() > 0 || - accessibleTextExtendedListeners.size() > 0 || accessibleValueListeners.size() > 0 || getRelationCount() > 0) { + accessibleHyperlinkListeners.size() > 0 || accessibleTableListeners.size() > 0 || + accessibleTableCellListeners.size() > 0 || accessibleTextExtendedListeners.size() > 0 || + accessibleValueListeners.size() > 0 || getRelationCount() > 0) { if (objIAccessible2 == null) createIAccessible2(); COM.MoveMemory(ppvObject, new int /*long*/[] { objIAccessible2.getAddress() }, OS.PTR_SIZEOF); AddRef(); @@ -1500,12 +1531,13 @@ public class Accessible { } if (COM.IsEqualGUID(guid, COM.IIDIAccessibleComponent)) { - if (accessibleControlListeners.size() > 0) { // TODO: can we reduce the scope of this somehow? - if (objIAccessibleComponent == null) createIAccessibleComponent(); - COM.MoveMemory(ppvObject, new int /*long*/[] { objIAccessibleComponent.getAddress() }, OS.PTR_SIZEOF); - AddRef(); - return COM.S_OK; - } + // The following lines are intentionally commented. We are not supporting IAccessibleComponent at this time. +// if (accessibleControlListeners.size() > 0) { // TO DO: can we reduce the scope of this somehow? +// if (objIAccessibleComponent == null) createIAccessibleComponent(); +// COM.MoveMemory(ppvObject, new int /*long*/[] { objIAccessibleComponent.getAddress() }, OS.PTR_SIZEOF); +// AddRef(); +// return COM.S_OK; +// } return COM.E_NOINTERFACE; } @@ -1541,12 +1573,13 @@ public class Accessible { } if (COM.IsEqualGUID(guid, COM.IIDIAccessibleImage)) { - if (getRole() == ACC.ROLE_GRAPHIC && (accessibleListeners.size() > 0 || accessibleControlListeners.size() > 0)) { - if (objIAccessibleImage == null) createIAccessibleImage(); - COM.MoveMemory(ppvObject, new int /*long*/[] { objIAccessibleImage.getAddress() }, OS.PTR_SIZEOF); - AddRef(); - return COM.S_OK; - } + // The following lines are intentionally commented. We are not supporting IAccessibleImage at this time. +// if (getRole() == ACC.ROLE_GRAPHIC && (accessibleListeners.size() > 0 || accessibleControlListeners.size() > 0)) { +// if (objIAccessibleImage == null) createIAccessibleImage(); +// COM.MoveMemory(ppvObject, new int /*long*/[] { objIAccessibleImage.getAddress() }, OS.PTR_SIZEOF); +// AddRef(); +// return COM.S_OK; +// } return COM.E_NOINTERFACE; } @@ -1598,8 +1631,9 @@ public class Accessible { return COM.S_FALSE; } - /* accDoDefaultAction([in] varChild) */ + /* IAccessible::accDoDefaultAction([in] varChild) */ int accDoDefaultAction(int /*long*/ varChild) { + if (DEBUG) print(this + ".IAccessible::accDoDefaultAction"); if (accessibleActionListeners.size() > 0) { VARIANT v = getVARIANT(varChild); if (v.vt != COM.VT_I4) return COM.E_INVALIDARG; @@ -1614,25 +1648,29 @@ public class Accessible { return code; } - /* accHitTest([in] xLeft, [in] yTop, [out] pvarChild) */ + /* IAccessible::accHitTest([in] xLeft, [in] yTop, [out] pvarChild) */ int accHitTest(int xLeft, int yTop, int /*long*/ pvarChild) { int osChild = ACC.CHILDID_NONE; int /*long*/ osChildObject = 0; if (iaccessible != null) { /* Get the default child at point (left, top) from the OS. */ int code = iaccessible.accHitTest(xLeft, yTop, pvarChild); - if (accessibleControlListeners.size() == 0) return code; if (code == COM.S_OK) { VARIANT v = getVARIANT(pvarChild); - if (v.vt == COM.VT_I4) osChild = osToChildID(v.lVal); + if (v.vt == COM.VT_I4) osChild = v.lVal; else if (v.vt == COM.VT_DISPATCH) { osChildObject = v.lVal; // TODO: don't use struct. lVal is an int. + if (DEBUG) print(this + ".IAccessible::accHitTest() super returned VT_DISPATCH"); } } + if (accessibleControlListeners.size() == 0) { + if (DEBUG) print(this + ".IAccessible::accHitTest returning childID=" + osChild + " from super" + hresult(code)); + return code; + } } AccessibleControlEvent event = new AccessibleControlEvent(this); - event.childID = osChild; + event.childID = osChild == ACC.CHILDID_NONE ? ACC.CHILDID_NONE : osToChildID(osChild); // TODO: event.accessible = Accessible for osChildObject; event.x = xLeft; event.y = yTop; @@ -1642,21 +1680,27 @@ public class Accessible { } Accessible accessible = event.accessible; if (accessible != null) { + if (DEBUG) print(this + ".IAccessible::accHitTest returning " + accessible.getAddress() + hresult(COM.S_OK)); accessible.AddRef(); setPtrVARIANT(pvarChild, COM.VT_DISPATCH, accessible.getAddress()); return COM.S_OK; } int childID = event.childID; if (childID == ACC.CHILDID_NONE) { - if (osChildObject != 0) return COM.S_OK; + if (osChildObject != 0) { + if (DEBUG) print(this + ".IAccessible::accHitTest returning osChildObject " + osChildObject + " from super" + hresult(COM.S_OK)); + return COM.S_OK; + } + if (DEBUG) print(this + ".IAccessible::accHitTest returning VT_EMPTY" + hresult(COM.S_FALSE)); setIntVARIANT(pvarChild, COM.VT_EMPTY, 0); return COM.S_FALSE; } + if (DEBUG) print(this + ".IAccessible::accHitTest returning " + childIDToOs(childID) + hresult(COM.S_OK)); setIntVARIANT(pvarChild, COM.VT_I4, childIDToOs(childID)); return COM.S_OK; } - /* accLocation([out] pxLeft, [out] pyTop, [out] pcxWidth, [out] pcyHeight, [in] varChild) */ + /* IAccessible::accLocation([out] pxLeft, [out] pyTop, [out] pcxWidth, [out] pcyHeight, [in] varChild) */ int accLocation(int /*long*/ pxLeft, int /*long*/ pyTop, int /*long*/ pcxWidth, int /*long*/ pcyHeight, int /*long*/ varChild) { VARIANT v = getVARIANT(varChild); if (v.vt != COM.VT_I4) return COM.E_INVALIDARG; @@ -1665,7 +1709,10 @@ public class Accessible { /* Get the default location from the OS. */ int code = iaccessible.accLocation(pxLeft, pyTop, pcxWidth, pcyHeight, varChild); if (code == COM.E_INVALIDARG) code = COM.DISP_E_MEMBERNOTFOUND; // proxy doesn't know about app childID - if (accessibleControlListeners.size() == 0) return code; + if (accessibleControlListeners.size() == 0) { + if (DEBUG) print(this + ".IAccessible::accLocation returning from super" + hresult(code)); + return code; + } if (code == COM.S_OK) { int[] pLeft = new int[1], pTop = new int[1], pWidth = new int[1], pHeight = new int[1]; COM.MoveMemory(pLeft, pxLeft, 4); @@ -1686,6 +1733,7 @@ public class Accessible { AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i); listener.getLocation(event); } + if (DEBUG) print(this + ".IAccessible::accLocation(" + v.lVal + ") returning x=" + event.x + " y=" + event.y + "w=" + event.width + "h=" + event.height + hresult(COM.S_OK)); OS.MoveMemory(pxLeft, new int[] { event.x }, 4); OS.MoveMemory(pyTop, new int[] { event.y }, 4); OS.MoveMemory(pcxWidth, new int[] { event.width }, 4); @@ -1693,8 +1741,9 @@ public class Accessible { return COM.S_OK; } - /* accNavigate([in] navDir, [in] varStart, [out] pvarEndUpAt) */ + /* IAccessible::accNavigate([in] navDir, [in] varStart, [out] pvarEndUpAt) */ int accNavigate(int navDir, int /*long*/ varStart, int /*long*/ pvarEndUpAt) { + if (DEBUG) print(this + ".IAccessible::accNavigate"); /* MSAA: "The accNavigate method is deprecated and should not be used." */ int code = COM.DISP_E_MEMBERNOTFOUND; if (iaccessible != null) { @@ -1707,7 +1756,7 @@ public class Accessible { } // TODO: Consider supporting this in future. - /* accSelect([in] flagsSelect, [in] varChild) */ + /* IAccessible::accSelect([in] flagsSelect, [in] varChild) */ int accSelect(int flagsSelect, int /*long*/ varChild) { int code = COM.DISP_E_MEMBERNOTFOUND; if (iaccessible != null) { @@ -1715,10 +1764,11 @@ public class Accessible { code = iaccessible.accSelect(flagsSelect, varChild); if (code == COM.E_INVALIDARG) code = COM.DISP_E_MEMBERNOTFOUND; // proxy doesn't know about app childID } + if (DEBUG) print(this + ".IAccessible::accSelect(" + flagsSelect + ") returning" + hresult(code)); return code; } - /* get_accChild([in] varChild, [out] ppdispChild) + /* IAccessible::get_accChild([in] varChild, [out] ppdispChild) * Ownership of ppdispChild transfers from callee to caller so reference count on ppdispChild * must be incremented before returning. The caller is responsible for releasing ppdispChild. */ @@ -1726,6 +1776,7 @@ public class Accessible { VARIANT v = getVARIANT(varChild); if (v.vt != COM.VT_I4) return COM.E_INVALIDARG; if (v.lVal == COM.CHILDID_SELF) { + if (DEBUG) print(this + ".IAccessible::get_accChild(" + v.lVal + ") returning " + getAddress() + hresult(COM.S_OK)); AddRef(); COM.MoveMemory(ppdispChild, new int /*long*/[] { getAddress() }, OS.PTR_SIZEOF); return COM.S_OK; @@ -1745,25 +1796,30 @@ public class Accessible { } Accessible accessible = event.accessible; if (accessible != null) { + if (DEBUG) print(this + ".IAccessible::get_accChild(" + v.lVal + ") returning " + accessible.getAddress() + hresult(COM.S_OK)); accessible.AddRef(); COM.MoveMemory(ppdispChild, new int /*long*/[] { accessible.getAddress() }, OS.PTR_SIZEOF); return COM.S_OK; } + if (DEBUG) print(this + ".IAccessible::get_accChild(" + v.lVal + ") returning from super" + hresult(code)); return code; } - /* get_accChildCount([out] pcountChildren) */ + /* IAccessible::get_accChildCount([out] pcountChildren) */ int get_accChildCount(int /*long*/ pcountChildren) { int osChildCount = 0; if (iaccessible != null) { /* Get the default child count from the OS. */ int code = iaccessible.get_accChildCount(pcountChildren); - if (accessibleControlListeners.size() == 0) return code; if (code == COM.S_OK) { int[] pChildCount = new int[1]; COM.MoveMemory(pChildCount, pcountChildren, 4); osChildCount = pChildCount[0]; } + if (accessibleControlListeners.size() == 0) { + if (DEBUG) print(this + ".IAccessible::get_accChildCount() returning " + osChildCount + " from super" + hresult(code)); + return code; + } } AccessibleControlEvent event = new AccessibleControlEvent(this); @@ -1773,13 +1829,14 @@ public class Accessible { AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i); listener.getChildCount(event); } - + if (DEBUG) print(this + ".IAccessible::get_accChildCount() returning " + event.detail + hresult(COM.S_OK)); COM.MoveMemory(pcountChildren, new int[] { event.detail }, 4); return COM.S_OK; } - /* get_accDefaultAction([in] varChild, [out] pszDefaultAction) */ + /* IAccessible::get_accDefaultAction([in] varChild, [out] pszDefaultAction) */ int get_accDefaultAction(int /*long*/ varChild, int /*long*/ pszDefaultAction) { + if (DEBUG) print(this + ".IAccessible::get_accDefaultAction"); VARIANT v = getVARIANT(varChild); if (v.vt != COM.VT_I4) return COM.E_INVALIDARG; int code = COM.DISP_E_MEMBERNOTFOUND; @@ -1817,14 +1874,16 @@ public class Accessible { return COM.S_OK; } - /* get_accDescription([in] varChild, [out] pszDescription) */ + /* IAccessible::get_accDescription([in] varChild, [out] pszDescription) */ int get_accDescription(int /*long*/ varChild, int /*long*/ pszDescription) { + if (DEBUG) print(this + ".IAccessible::get_accDescription"); /* * MSAA: "The accDescription property is not supported in the transition to * UI Automation. MSAA servers and applications should not use it." * * TODO: Description was exposed as SWT API. We will need to either deprecate this (?), * or find a suitable replacement. Also, check description property on other platforms. + * If it is truly deprecated for MSAA, then perhaps it can be reused for IAccessibleImage. * Note that the trick to expose tree columns (below) was not supported by screen readers, * so it should be replaced. */ @@ -1891,7 +1950,7 @@ public class Accessible { return COM.S_OK; } - /* get_accFocus([out] pvarChild) + /* IAccessible::get_accFocus([out] pvarChild) * Ownership of pvarChild transfers from callee to caller so reference count on pvarChild * must be incremented before returning. The caller is responsible for releasing pvarChild. */ @@ -1900,41 +1959,51 @@ public class Accessible { if (iaccessible != null) { /* Get the default focus child from the OS. */ int code = iaccessible.get_accFocus(pvarChild); - if (accessibleControlListeners.size() == 0) return code; if (code == COM.S_OK) { VARIANT v = getVARIANT(pvarChild); - if (v.vt == COM.VT_I4) osChild = osToChildID(v.lVal); + if (v.vt == COM.VT_I4) osChild = v.lVal; + // TODO: need to check VT_DISPATCH (don't use struct) + if (DEBUG) if (v.vt == COM.VT_DISPATCH) print("IAccessible::get_accFocus() super returned VT_DISPATCH"); + } + if (accessibleControlListeners.size() == 0) { + if (DEBUG) print(this + ".IAccessible::get_accFocus() returning childID=" + osChild + " from super" + hresult(code)); + return code; } } AccessibleControlEvent event = new AccessibleControlEvent(this); - event.childID = osChild; + event.childID = osChild == ACC.CHILDID_NONE ? ACC.CHILDID_NONE : osToChildID(osChild); for (int i = 0; i < accessibleControlListeners.size(); i++) { AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i); listener.getFocus(event); } Accessible accessible = event.accessible; if (accessible != null) { + if (DEBUG) print(this + ".IAccessible::get_accFocus() returning accessible " + accessible.getAddress() + hresult(COM.S_OK)); accessible.AddRef(); setPtrVARIANT(pvarChild, COM.VT_DISPATCH, accessible.getAddress()); return COM.S_OK; } int childID = event.childID; if (childID == ACC.CHILDID_NONE) { + if (DEBUG) print(this + ".IAccessible::get_accFocus() returning VT_EMPTY" + hresult(COM.S_FALSE)); setIntVARIANT(pvarChild, COM.VT_EMPTY, 0); return COM.S_FALSE; } if (childID == ACC.CHILDID_SELF) { + if (DEBUG) print(this + ".IAccessible::get_accFocus() returning accessible " + getAddress() + hresult(COM.S_OK)); AddRef(); setPtrVARIANT(pvarChild, COM.VT_DISPATCH, getAddress()); return COM.S_OK; } + if (DEBUG) print(this + ".IAccessible::get_accFocus() returning childID " + childIDToOs(childID) + hresult(COM.S_OK)); setIntVARIANT(pvarChild, COM.VT_I4, childIDToOs(childID)); return COM.S_OK; } - /* get_accHelp([in] varChild, [out] pszHelp) */ + /* IAccessible::get_accHelp([in] varChild, [out] pszHelp) */ int get_accHelp(int /*long*/ varChild, int /*long*/ pszHelp) { + if (DEBUG) print(this + ".IAccessible::get_accHelp"); VARIANT v = getVARIANT(varChild); if (v.vt != COM.VT_I4) return COM.E_INVALIDARG; int code = COM.DISP_E_MEMBERNOTFOUND; @@ -1969,8 +2038,9 @@ public class Accessible { return COM.S_OK; } - /* get_accHelpTopic([out] pszHelpFile, [in] varChild, [out] pidTopic) */ + /* IAccessible::get_accHelpTopic([out] pszHelpFile, [in] varChild, [out] pidTopic) */ int get_accHelpTopic(int /*long*/ pszHelpFile, int /*long*/ varChild, int /*long*/ pidTopic) { + if (DEBUG) print(this + ".IAccessible::get_accHelpTopic"); /* MSAA: "The accHelpTopic property is deprecated and should not be used." */ int code = COM.DISP_E_MEMBERNOTFOUND; if (iaccessible != null) { @@ -1982,8 +2052,9 @@ public class Accessible { return code; } - /* get_accKeyboardShortcut([in] varChild, [out] pszKeyboardShortcut) */ + /* IAccessible::get_accKeyboardShortcut([in] varChild, [out] pszKeyboardShortcut) */ int get_accKeyboardShortcut(int /*long*/ varChild, int /*long*/ pszKeyboardShortcut) { + if (DEBUG) print(this + ".IAccessible::get_accKeyboardShortcut"); VARIANT v = getVARIANT(varChild); if (v.vt != COM.VT_I4) return COM.E_INVALIDARG; int code = COM.DISP_E_MEMBERNOTFOUND; @@ -2018,7 +2089,7 @@ public class Accessible { return COM.S_OK; } - /* get_accName([in] varChild, [out] pszName) */ + /* IAccessible::get_accName([in] varChild, [out] pszName) */ int get_accName(int /*long*/ varChild, int /*long*/ pszName) { VARIANT v = getVARIANT(varChild); if (v.vt != COM.VT_I4) return COM.E_INVALIDARG; @@ -2027,8 +2098,6 @@ public class Accessible { if (iaccessible != null) { /* Get the default name from the OS. */ code = iaccessible.get_accName(varChild, pszName); - if (code == COM.E_INVALIDARG) code = COM.S_FALSE; // proxy doesn't know about app childID - if (accessibleListeners.size() == 0) return code; if (code == COM.S_OK) { int /*long*/[] pName = new int /*long*/[1]; COM.MoveMemory(pName, pszName, OS.PTR_SIZEOF); @@ -2039,6 +2108,11 @@ public class Accessible { osName = new String(buffer); } } + if (code == COM.E_INVALIDARG) code = COM.S_FALSE; // proxy doesn't know about app childID + if (accessibleListeners.size() == 0) { + if (DEBUG) print(this + ".IAccessible::get_accName(" + v.lVal + ") returning name=" + osName + " from super" + hresult(code)); + return code; + } } AccessibleEvent event = new AccessibleEvent(this); @@ -2048,18 +2122,18 @@ public class Accessible { AccessibleListener listener = (AccessibleListener) accessibleListeners.elementAt(i); listener.getName(event); } + if (DEBUG) print(this + ".IAccessible::get_accName(" + v.lVal + ") returning " + event.result + hresult(event.result == null ? code : event.result.length() == 0 ? COM.S_FALSE : COM.S_OK)); if (event.result == null) return code; if (event.result.length() == 0) return COM.S_FALSE; setString(pszName, event.result); return COM.S_OK; } - /* get_accParent([out] ppdispParent) + /* IAccessible::get_accParent([out] ppdispParent) * Ownership of ppdispParent transfers from callee to caller so reference count on ppdispParent * must be incremented before returning. The caller is responsible for releasing ppdispParent. */ int get_accParent(int /*long*/ ppdispParent) { - if (DEBUG) System.out.println("get_accParent"); int code = COM.DISP_E_MEMBERNOTFOUND; if (iaccessible != null) { /* Currently, we don't expose this as API. Forward to the proxy. */ @@ -2071,10 +2145,11 @@ public class Accessible { COM.MoveMemory(ppdispParent, new int /*long*/[] { parent.getAddress() }, OS.PTR_SIZEOF); code = COM.S_OK; } + if (DEBUG) print(this + ".IAccessible::get_accParent() returning" + (parent != null ? " " + parent.getAddress() : " from super") + hresult(code)); return code; } - /* get_accRole([in] varChild, [out] pvarRole) */ + /* IAccessible::get_accRole([in] varChild, [out] pvarRole) */ int get_accRole(int /*long*/ varChild, int /*long*/ pvarRole) { VARIANT v = getVARIANT(varChild); if (v.vt != COM.VT_I4) return COM.E_INVALIDARG; @@ -2101,17 +2176,17 @@ public class Accessible { AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i); listener.getRole(event); } - if (DEBUG) print("IAccessible::get_accRole(" + v.lVal + ") returning " + getRoleString(roleToOs(event.detail))); + if (DEBUG) print(this + ".IAccessible::get_accRole(" + v.lVal + ") returning " + getRoleString(roleToOs(event.detail)) + hresult(COM.S_OK)); setIntVARIANT(pvarRole, COM.VT_I4, roleToOs(event.detail)); return COM.S_OK; } - /* get_accSelection([out] pvarChildren) + /* IAccessible::get_accSelection([out] pvarChildren) * Ownership of pvarChildren transfers from callee to caller so reference count on pvarChildren * must be incremented before returning. The caller is responsible for releasing pvarChildren. */ int get_accSelection(int /*long*/ pvarChildren) { - if (DEBUG) System.out.println("get_accSelection"); + if (DEBUG) print(this + ".IAccessible::get_accSelection"); int osChild = ACC.CHILDID_NONE; int /*long*/ osChildObject = 0; if (iaccessible != null) { @@ -2164,7 +2239,7 @@ public class Accessible { return COM.S_OK; } - /* get_accState([in] varChild, [out] pvarState) */ + /* IAccessible::get_accState([in] varChild, [out] pvarState) */ int get_accState(int /*long*/ varChild, int /*long*/ pvarState) { VARIANT v = getVARIANT(varChild); if (v.vt != COM.VT_I4) return COM.E_INVALIDARG; @@ -2219,12 +2294,12 @@ public class Accessible { state &= ~ COM.STATE_SYSTEM_CHECKED; state |= COM.STATE_SYSTEM_MIXED; } - if (DEBUG) print("IAccessible::get_accState(" + v.lVal + ") returning " + getStateString(state)); + if (DEBUG) print(this + ".IAccessible::get_accState(" + v.lVal + ") returning" + getStateString(state) + hresult(COM.S_OK)); setIntVARIANT(pvarState, COM.VT_I4, state); return COM.S_OK; } - /* get_accValue([in] varChild, [out] pszValue) */ + /* IAccessible::get_accValue([in] varChild, [out] pszValue) */ int get_accValue(int /*long*/ varChild, int /*long*/ pszValue) { VARIANT v = getVARIANT(varChild); if (v.vt != COM.VT_I4) return COM.E_INVALIDARG; @@ -2233,8 +2308,6 @@ public class Accessible { if (iaccessible != null) { /* Get the default value string from the OS. */ code = iaccessible.get_accValue(varChild, pszValue); - if (code == COM.E_INVALIDARG) code = COM.DISP_E_MEMBERNOTFOUND; // proxy doesn't know about app childID - if (accessibleControlListeners.size() == 0) return code; if (code == COM.S_OK) { int /*long*/[] pValue = new int /*long*/[1]; COM.MoveMemory(pValue, pszValue, OS.PTR_SIZEOF); @@ -2245,6 +2318,11 @@ public class Accessible { osValue = new String(buffer); } } + if (code == COM.E_INVALIDARG) code = COM.DISP_E_MEMBERNOTFOUND; // proxy doesn't know about app childID + if (accessibleControlListeners.size() == 0) { + if (DEBUG) print(this + ".IAccessible::get_accValue(" + v.lVal + ") returning value=" + osValue + " from super" + hresult(code)); + return code; + } } AccessibleControlEvent event = new AccessibleControlEvent(this); @@ -2254,7 +2332,7 @@ public class Accessible { AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i); listener.getValue(event); } - if (DEBUG) print("IAccessible::get_accValue(" + v.lVal + ") returning " + event.result); + if (DEBUG) print(this + ".IAccessible::get_accValue(" + v.lVal + ") returning " + event.result + hresult(event.result == null ? code : COM.S_OK)); if (event.result == null) return code; // empty string is a valid value, so do not test for it setString(pszValue, event.result); @@ -2293,6 +2371,7 @@ public class Accessible { * must be incremented before returning. The caller is responsible for releasing rgvar. */ int Next(int celt, int /*long*/ rgvar, int /*long*/ pceltFetched) { + if (DEBUG) print(this + ".IEnumVARIANT::Next"); /* If there are no listeners, query the proxy for * its IEnumVariant, and get the Next items from it. */ @@ -2357,9 +2436,10 @@ public class Accessible { } return COM.S_FALSE; } - + /* IEnumVARIANT::Skip([in] celt) over the specified number of elements in the enumeration sequence. */ int Skip(int celt) { + if (DEBUG) print(this + ".IEnumVARIANT::Skip"); /* If there are no listeners, query the proxy * for its IEnumVariant, and tell it to Skip. */ @@ -2384,6 +2464,7 @@ public class Accessible { /* IEnumVARIANT::Reset() the enumeration sequence to the beginning. */ int Reset() { + if (DEBUG) print(this + ".IEnumVARIANT::Reset"); /* If there are no listeners, query the proxy * for its IEnumVariant, and tell it to Reset. */ @@ -2406,6 +2487,7 @@ public class Accessible { * must be incremented before returning. The caller is responsible for releasing ppEnum. */ int Clone(int /*long*/ ppEnum) { + if (DEBUG) print(this + ".IEnumVARIANT::Clone"); /* If there are no listeners, query the proxy for * its IEnumVariant, and get the Clone from it. */ @@ -2430,6 +2512,7 @@ public class Accessible { /* IAccessible2::get_nRelations([out] pNRelations) */ int get_nRelations(int /*long*/ pNRelations) { int count = getRelationCount(); + if (DEBUG) print(this + ".IAccessible2::get_nRelations returning " + count + hresult(COM.S_OK)); COM.MoveMemory(pNRelations, new int [] { count }, 4); return COM.S_OK; } @@ -2441,11 +2524,13 @@ public class Accessible { Relation relation = (Relation)relations[type]; if (relation != null) i++; if (i == relationIndex) { + if (DEBUG) print(this + ".IAccessible2::get_relation(" + relationIndex + ") returning " + relation.objIAccessibleRelation.getAddress() + hresult(COM.S_OK)); relation.AddRef(); COM.MoveMemory(ppRelation, new int /*long*/[] { relation.objIAccessibleRelation.getAddress() }, OS.PTR_SIZEOF); return COM.S_OK; } } + if (DEBUG) print(this + ".IAccessible2::get_relation(" + relationIndex + ") returning" + hresult(COM.E_INVALIDARG)); return COM.E_INVALIDARG; } @@ -2461,6 +2546,7 @@ public class Accessible { count++; } } + if (DEBUG) print(this + ".IAccessible2::get_relations(" + maxRelations + ") returning " + count + hresult(COM.S_OK)); COM.MoveMemory(pNRelations, new int [] { count }, 4); return COM.S_OK; } @@ -2468,19 +2554,21 @@ public class Accessible { /* IAccessible2::get_role([out] pRole) */ int get_role(int /*long*/ pRole) { int role = getRole(); - if (DEBUG) print("IAccessible::get_accRole() returning " + getRoleString(role)); + if (DEBUG) print(this + ".IAccessible::get_accRole() returning " + getRoleString(role) + hresult(COM.S_OK)); COM.MoveMemory(pRole, new int [] { role }, 4); return COM.S_OK; } /* IAccessible2::scrollTo([in] scrollType) */ int scrollTo(int scrollType) { + if (DEBUG) print(this + ".IAccessible2::scrollTo"); if (scrollType < ACC.SCROLL_TYPE_LEFT_EDGE || scrollType > ACC.SCROLL_TYPE_ANYWHERE) return COM.E_INVALIDARG; return COM.E_NOTIMPL; } /* IAccessible2::scrollToPoint([in] coordinateType, [in] x, [in] y) */ int scrollToPoint(int coordinateType, int x, int y) { + if (DEBUG) print(this + ".IAccessible2::scrollToPoint"); if (coordinateType != COM.IA2_COORDTYPE_SCREEN_RELATIVE) return COM.E_INVALIDARG; return COM.E_NOTIMPL; } @@ -2499,6 +2587,7 @@ public class Accessible { //find this guy's 1-based index in the children of the parent (0 for N/A) int positionInGroup = 0; COM.MoveMemory(pPositionInGroup, new int [] { positionInGroup }, 4); + if (DEBUG) print(this + ".IAccessible2::get_groupPosition() returning" + hresult(groupLevel == 0 && similarItemsInGroup == 0 && positionInGroup == 0 ? COM.S_FALSE : COM.S_OK)); if (groupLevel == 0 && similarItemsInGroup == 0 && positionInGroup == 0) return COM.S_FALSE; return COM.S_OK; } @@ -2527,7 +2616,7 @@ public class Accessible { if (getRole() == ACC.ROLE_TEXT && accessibleTextExtendedListeners.size() > 0) { ia2States |= COM.IA2_STATE_EDITABLE; } - if (DEBUG) print("IAccessible2::get_states returning " + getIA2StatesString(ia2States)); + if (DEBUG) print(this + ".IAccessible2::get_states returning" + getIA2StatesString(ia2States) + hresult(COM.S_OK)); COM.MoveMemory(pStates, new int [] { ia2States }, 4); return COM.S_OK; } @@ -2571,13 +2660,15 @@ public class Accessible { /* IAccessible2::get_uniqueID([out] pUniqueID) */ int get_uniqueID(int /*long*/ pUniqueID) { - if (uniqueID == 0) uniqueID = UniqueID++; + if (uniqueID == -1) uniqueID = UniqueID--; + if (DEBUG) print(this + ".IAccessible2::get_uniqueID returning " + uniqueID + hresult(COM.S_OK)); COM.MoveMemory(pUniqueID, new int /*long*/ [] { uniqueID }, 4); return COM.S_OK; } /* IAccessible2::get_windowHandle([out] pWindowHandle) */ int get_windowHandle(int /*long*/ pWindowHandle) { + if (DEBUG) print(this + ".IAccessible2::get_windowHandle returning " + control.handle + hresult(COM.S_OK)); COM.MoveMemory(pWindowHandle, new int /*long*/ [] { control.handle }, OS.PTR_SIZEOF); return COM.S_OK; } @@ -2637,6 +2728,7 @@ public class Accessible { // } } + if (DEBUG) print(this + ".IAccessible2::get_indexInParent returning " + indexInParent + hresult(indexInParent == -1 ? COM.S_FALSE : COM.S_OK)); COM.MoveMemory(pIndexInParent, new int [] { indexInParent }, 4); return indexInParent == -1 ? COM.S_FALSE : COM.S_OK; } @@ -2658,6 +2750,7 @@ public class Accessible { ptr = COM.SysAllocString(data); COM.MoveMemory(pLocale + 2 * OS.PTR_SIZEOF, new int /*long*/[] {ptr}, OS.PTR_SIZEOF); + if (DEBUG) print(this + ".IAccessible2::get_locale() returning" + hresult(COM.S_OK)); return COM.S_OK; } @@ -2691,6 +2784,7 @@ public class Accessible { if (getRole() == ACC.ROLE_TEXT) { attributes += "text-model:a1;"; } + if (DEBUG) print(this + ".IAccessible2::get_attributes() returning " + attributes + hresult(attributes.length() == 0 ? COM.S_FALSE : COM.S_OK)); setString(pbstrAttributes, attributes); if (attributes.length() == 0) return COM.S_FALSE; return COM.S_OK; @@ -2703,6 +2797,7 @@ public class Accessible { AccessibleActionListener listener = (AccessibleActionListener) accessibleActionListeners.elementAt(i); listener.getActionCount(event); } + if (DEBUG) print(this + ".IAccessibleAction::get_nActions() returning " + event.count + hresult(COM.S_OK)); COM.MoveMemory(pNActions, new int [] { event.count }, 4); return COM.S_OK; } @@ -2715,6 +2810,7 @@ public class Accessible { AccessibleActionListener listener = (AccessibleActionListener) accessibleActionListeners.elementAt(i); listener.doAction(event); } + if (DEBUG) print(this + ".IAccessibleAction::doAction(" + actionIndex + ") returning" + hresult(event.result == null || !event.result.equals(ACC.OK) ? COM.E_INVALIDARG : COM.S_OK)); if (event.result == null || !event.result.equals(ACC.OK)) return COM.E_INVALIDARG; return COM.S_OK; } @@ -2727,6 +2823,7 @@ public class Accessible { AccessibleActionListener listener = (AccessibleActionListener) accessibleActionListeners.elementAt(i); listener.getDescription(event); } + if (DEBUG) print(this + ".IAccessibleAction::get_description(" + actionIndex + ") returning " + event.result + hresult(event.result == null || event.result.length() == 0 ? COM.S_FALSE : COM.S_OK)); setString(pbstrDescription, event.result); if (event.result == null || event.result.length() == 0) return COM.S_FALSE; return COM.S_OK; @@ -2755,7 +2852,7 @@ public class Accessible { } i = j + 1; } - if (DEBUG) print("IAccessibleAction::get_keyBinding(index=" + actionIndex + ",max=" + nMaxBindings+ ") returning count=" + count); + if (DEBUG) print(this + ".IAccessibleAction::get_keyBinding(index=" + actionIndex + " max=" + nMaxBindings + ") returning count=" + count + hresult(count == 0 ? COM.S_FALSE : COM.S_OK)); COM.MoveMemory(pNBindings, new int [] { count }, 4); if (count == 0) { setString(ppbstrKeyBindings, null); @@ -2773,6 +2870,7 @@ public class Accessible { AccessibleActionListener listener = (AccessibleActionListener) accessibleActionListeners.elementAt(i); listener.getName(event); } + if (DEBUG) print(this + ".IAccessibleAction::get_name(" + actionIndex + ") returning " + event.result + hresult(event.result == null || event.result.length() == 0 ? COM.S_FALSE : COM.S_OK)); if (event.result == null || event.result.length() == 0) { setString(pbstrName, null); return COM.S_FALSE; @@ -2790,6 +2888,7 @@ public class Accessible { AccessibleActionListener listener = (AccessibleActionListener) accessibleActionListeners.elementAt(i); listener.getName(event); } + if (DEBUG) print(this + ".IAccessibleAction::get_localizedName(" + actionIndex + ") returning " + event.result + hresult(event.result == null || event.result.length() == 0 ? COM.S_FALSE : COM.S_OK)); if (event.result == null || event.result.length() == 0) { setString(pbstrLocalizedName, null); return COM.S_FALSE; @@ -2801,6 +2900,7 @@ public class Accessible { /* IAccessibleApplication::get_appName([out] pbstrName) */ int get_appName(int /*long*/ pbstrName) { String appName = Display.getAppName(); + if (DEBUG) print(this + ".IAccessibleApplication::get_appName() returning " + appName + hresult(appName == null || appName.length() == 0 ? COM.S_FALSE : COM.S_OK)); if (appName == null || appName.length() == 0) { setString(pbstrName, null); return COM.S_FALSE; @@ -2812,6 +2912,7 @@ public class Accessible { /* IAccessibleApplication::get_appVersion([out] pbstrVersion) */ int get_appVersion(int /*long*/ pbstrVersion) { String appVersion = Display.getAppVersion(); + if (DEBUG) print(this + ".IAccessibleApplication::get_appVersion() returning" + appVersion + hresult(appVersion == null || appVersion.length() == 0 ? COM.S_FALSE : COM.S_OK)); if (appVersion == null || appVersion.length() == 0) { setString(pbstrVersion, null); return COM.S_FALSE; @@ -2823,6 +2924,7 @@ public class Accessible { /* IAccessibleApplication::get_toolkitName([out] pbstrName) */ int get_toolkitName(int /*long*/ pbstrName) { String toolkitName = "SWT"; + if (DEBUG) print(this + ".IAccessibleApplication::get_toolkitName() returning" + toolkitName + hresult(COM.S_OK)); setString(pbstrName, toolkitName); return COM.S_OK; } @@ -2830,42 +2932,46 @@ public class Accessible { /* IAccessibleApplication::get_toolkitVersion([out] pbstrVersion) */ int get_toolkitVersion(int /*long*/ pbstrVersion) { String toolkitVersion = "" + SWT.getVersion(); //$NON-NLS-1$ + if (DEBUG) print(this + ".IAccessibleApplication::get_toolkitVersion() returning" + toolkitVersion + hresult(COM.S_OK)); setString(pbstrVersion, toolkitVersion); return COM.S_OK; } - /* IAccessibleComponent::get_locationInParent([out] pX, [out] pY) */ - int get_locationInParent(int /*long*/ pX, int /*long*/ pY) { - // TODO: support transparently (hard for fake parents - screen vs. parent coords) - AccessibleControlEvent event = new AccessibleControlEvent(this); - for (int i = 0; i < accessibleControlListeners.size(); i++) { - AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i); - listener.getLocation (event); - } - COM.MoveMemory(pX, new int [] { event.x }, 4); - COM.MoveMemory(pY, new int [] { event.y }, 4); - return COM.S_OK; - } - - /* IAccessibleComponent::get_foreground([out] pForeground) */ - int get_foreground(int /*long*/ pForeground) { - Color color = control.getForeground(); - COM.MoveMemory(pForeground, new int [] { color.handle }, 4); - if (DEBUG) print("IAccessibleComponent::get_foreground returning " + color.handle); - return COM.S_OK; - } - - /* IAccessibleComponent::get_background([out] pBackground) */ - int get_background(int /*long*/ pBackground) { - Color color = control.getBackground(); - COM.MoveMemory(pBackground, new int [] { color.handle }, 4); - if (DEBUG) print("IAccessibleComponent::get_background returning " + color.handle); - return COM.S_OK; - } + // The following 3 method are intentionally commented. We are not providing IAccessibleComponent at this time. +// /* IAccessibleComponent::get_locationInParent([out] pX, [out] pY) */ +// int get_locationInParent(int /*long*/ pX, int /*long*/ pY) { +// if (DEBUG) print(this + ".IAccessibleComponent::get_locationInParent"); +// // TO DO: support transparently (hard for lightweight parents - screen vs. parent coords) +// AccessibleControlEvent event = new AccessibleControlEvent(this); +// for (int i = 0; i < accessibleControlListeners.size(); i++) { +// AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i); +// listener.getLocation (event); +// } +// COM.MoveMemory(pX, new int [] { event.x }, 4); +// COM.MoveMemory(pY, new int [] { event.y }, 4); +// return COM.S_OK; +// } +// +// /* IAccessibleComponent::get_foreground([out] pForeground) */ +// int get_foreground(int /*long*/ pForeground) { +// Color color = control.getForeground(); +// if (DEBUG) print(this + ".IAccessibleComponent::get_foreground returning " + color.handle); +// COM.MoveMemory(pForeground, new int [] { color.handle }, 4); +// return COM.S_OK; +// } +// +// /* IAccessibleComponent::get_background([out] pBackground) */ +// int get_background(int /*long*/ pBackground) { +// Color color = control.getBackground(); +// if (DEBUG) print(this + ".IAccessibleComponent::get_background returning " + color.handle); +// COM.MoveMemory(pBackground, new int [] { color.handle }, 4); +// return COM.S_OK; +// } // The following 7 method are intentionally commented. We are not providing IAccessibleEditableText at this time. - /* IAccessibleEditableText::copyText([in] startOffset, [in] endOffset) */ +// /* IAccessibleEditableText::copyText([in] startOffset, [in] endOffset) */ // int copyText(int startOffset, int endOffset) { +// if (DEBUG) print(this + ".IAccessibleEditableText::copyText"); // AccessibleEditableTextEvent event = new AccessibleEditableTextEvent(this); // event.start = startOffset; // event.end = endOffset; @@ -2879,6 +2985,7 @@ public class Accessible { // // /* IAccessibleEditableText::deleteText([in] startOffset, [in] endOffset) */ // int deleteText(int startOffset, int endOffset) { +// if (DEBUG) print(this + ".IAccessibleEditableText::deleteText"); // AccessibleEditableTextEvent event = new AccessibleEditableTextEvent(this); // event.start = startOffset; // event.end = endOffset; @@ -2892,6 +2999,7 @@ public class Accessible { // // /* IAccessibleEditableText::insertText([in] offset, [in] pbstrText) */ // int insertText(int offset, int /*long*/ pbstrText) { +// if (DEBUG) print(this + ".IAccessibleEditableText::insertText"); // AccessibleEditableTextEvent event = new AccessibleEditableTextEvent(this); // event.offset = offset; // event.string = pbstrText; @@ -2905,6 +3013,7 @@ public class Accessible { // // /* IAccessibleEditableText::cutText([in] startOffset, [in] endOffset) */ // int cutText(int startOffset, int endOffset) { +// if (DEBUG) print(this + ".IAccessibleEditableText::cutText"); // AccessibleEditableTextEvent event = new AccessibleEditableTextEvent(this); // event.start = startOffset; // event.end = endOffset; @@ -2918,6 +3027,7 @@ public class Accessible { // // /* IAccessibleEditableText::pasteText([in] offset) */ // int pasteText(int offset) { +// if (DEBUG) print(this + ".IAccessibleEditableText::pasteText"); // AccessibleEditableTextEvent event = new AccessibleEditableTextEvent(this); // event.offset = offset; // for (int i = 0; i < accessibleEditableTextListeners.size(); i++) { @@ -2930,6 +3040,7 @@ public class Accessible { // // /* IAccessibleEditableText::replaceText([in] startOffset, [in] endOffset, [in] pbstrText) */ // int replaceText(int startOffset, int endOffset, int /*long*/ pbstrText) { +// if (DEBUG) print(this + ".IAccessibleEditableText::replaceText"); // AccessibleEditableTextEvent event = new AccessibleEditableTextEvent(this); // event.start = startOffset; // event.end = endOffset; @@ -2944,6 +3055,7 @@ public class Accessible { // // /* IAccessibleEditableText::setAttributes([in] startOffset, [in] endOffset, [in] pbstrAttributes) */ // int setAttributes(int startOffset, int endOffset, int /*long*/ pbstrAttributes) { +// if (DEBUG) print(this + ".IAccessibleEditableText::setAttributes"); // AccessibleEditableTextEvent event = new AccessibleEditableTextEvent(this); // event.start = startOffset; // event.end = endOffset; @@ -2958,6 +3070,7 @@ public class Accessible { /* IAccessibleHyperlink::get_anchor([in] index, [out] pAnchor) */ int get_anchor(int index, int /*long*/ pAnchor) { + if (DEBUG) print(this + ".IAccessibleHyperlink::get_anchor"); AccessibleHyperlinkEvent event = new AccessibleHyperlinkEvent(this); event.index = index; for (int i = 0; i < accessibleHyperlinkListeners.size(); i++) { @@ -2977,6 +3090,7 @@ public class Accessible { /* IAccessibleHyperlink::get_anchorTarget([in] index, [out] pAnchorTarget) */ int get_anchorTarget(int index, int /*long*/ pAnchorTarget) { + if (DEBUG) print(this + ".IAccessibleHyperlink::get_anchorTarget"); AccessibleHyperlinkEvent event = new AccessibleHyperlinkEvent(this); event.index = index; for (int i = 0; i < accessibleHyperlinkListeners.size(); i++) { @@ -2996,6 +3110,7 @@ public class Accessible { /* IAccessibleHyperlink::get_startIndex([out] pIndex) */ int get_startIndex(int /*long*/ pIndex) { + if (DEBUG) print(this + ".IAccessibleHyperlink::get_startIndex"); AccessibleHyperlinkEvent event = new AccessibleHyperlinkEvent(this); for (int i = 0; i < accessibleHyperlinkListeners.size(); i++) { AccessibleHyperlinkListener listener = (AccessibleHyperlinkListener) accessibleHyperlinkListeners.elementAt(i); @@ -3007,6 +3122,7 @@ public class Accessible { /* IAccessibleHyperlink::get_endIndex([out] pIndex) */ int get_endIndex(int /*long*/ pIndex) { + if (DEBUG) print(this + ".IAccessibleHyperlink::get_endIndex"); AccessibleHyperlinkEvent event = new AccessibleHyperlinkEvent(this); for (int i = 0; i < accessibleHyperlinkListeners.size(); i++) { AccessibleHyperlinkListener listener = (AccessibleHyperlinkListener) accessibleHyperlinkListeners.elementAt(i); @@ -3024,6 +3140,7 @@ public class Accessible { /* IAccessibleHypertext::get_nHyperlinks([out] pHyperlinkCount) */ int get_nHyperlinks(int /*long*/ pHyperlinkCount) { + if (DEBUG) print(this + ".IAccessibleHypertext::get_nHyperlinks"); AccessibleTextEvent event = new AccessibleTextEvent(this); for (int i = 0; i < accessibleTextExtendedListeners.size(); i++) { AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) accessibleTextExtendedListeners.elementAt(i); @@ -3035,6 +3152,7 @@ public class Accessible { /* IAccessibleHypertext::get_hyperlink([in] index, [out] ppHyperlink) */ int get_hyperlink(int index, int /*long*/ ppHyperlink) { + if (DEBUG) print(this + ".IAccessibleHypertext::get_hyperlink"); AccessibleTextEvent event = new AccessibleTextEvent(this); event.index = index; for (int i = 0; i < accessibleTextExtendedListeners.size(); i++) { @@ -3053,6 +3171,7 @@ public class Accessible { /* IAccessibleHypertext::get_hyperlinkIndex([in] charIndex, [out] pHyperlinkIndex) */ int get_hyperlinkIndex(int charIndex, int /*long*/ pHyperlinkIndex) { + if (DEBUG) print(this + ".IAccessibleHypertext::get_hyperlinkIndex"); AccessibleTextEvent event = new AccessibleTextEvent(this); event.offset = charIndex; event.index = -1; @@ -3065,46 +3184,50 @@ public class Accessible { return COM.S_OK; } - /* IAccessibleImage::get_description([out] pbstrDescription) */ - int get_description(int /*long*/ pbstrDescription) { - // TODO: Does it make sense to just reuse description? - AccessibleEvent event = new AccessibleEvent(this); - event.childID = ACC.CHILDID_SELF; - for (int i = 0; i < accessibleListeners.size(); i++) { - AccessibleListener listener = (AccessibleListener) accessibleListeners.elementAt(i); - listener.getDescription(event); - } - setString(pbstrDescription, event.result); - if (event.result == null) return COM.S_FALSE; - return COM.S_OK; - } - - /* IAccessibleImage::get_imagePosition([in] coordinateType, [out] pX, [out] pY) */ - int get_imagePosition(int coordinateType, int /*long*/ pX, int /*long*/ pY) { - // TODO: does it make sense to just reuse getLocation? - AccessibleControlEvent event = new AccessibleControlEvent(this); - event.childID = ACC.CHILDID_SELF; - for (int i = 0; i < accessibleControlListeners.size(); i++) { - AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i); - listener.getLocation(event); - } - COM.MoveMemory(pX, new int [] { event.x }, 4); - COM.MoveMemory(pY, new int [] { event.y }, 4); - return COM.S_OK; - } - - /* IAccessibleImage::get_imageSize([out] pHeight, [out] pWidth) */ - int get_imageSize(int /*long*/ pHeight, int /*long*/ pWidth) { - // TODO: does it make sense to just reuse getLocation? - AccessibleControlEvent event = new AccessibleControlEvent(this); - for (int i = 0; i < accessibleControlListeners.size(); i++) { - AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i); - listener.getLocation(event); - } - COM.MoveMemory(pHeight, new int [] { event.height }, 4); - COM.MoveMemory(pWidth, new int [] { event.width }, 4); - return COM.S_OK; - } + // The following 3 method are intentionally commented. We are not providing IAccessibleImage at this time. +// /* IAccessibleImage::get_description([out] pbstrDescription) */ +// int get_description(int /*long*/ pbstrDescription) { +// if (DEBUG) print(this + ".IAccessibleImage::get_description"); +// // TO DO: Does it make sense to just reuse description? +// AccessibleEvent event = new AccessibleEvent(this); +// event.childID = ACC.CHILDID_SELF; +// for (int i = 0; i < accessibleListeners.size(); i++) { +// AccessibleListener listener = (AccessibleListener) accessibleListeners.elementAt(i); +// listener.getDescription(event); +// } +// setString(pbstrDescription, event.result); +// if (event.result == null) return COM.S_FALSE; +// return COM.S_OK; +// } +// +// /* IAccessibleImage::get_imagePosition([in] coordinateType, [out] pX, [out] pY) */ +// int get_imagePosition(int coordinateType, int /*long*/ pX, int /*long*/ pY) { +// if (DEBUG) print(this + ".IAccessibleImage::get_imagePosition"); +// // TO DO: does it make sense to just reuse getLocation? +// AccessibleControlEvent event = new AccessibleControlEvent(this); +// event.childID = ACC.CHILDID_SELF; +// for (int i = 0; i < accessibleControlListeners.size(); i++) { +// AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i); +// listener.getLocation(event); +// } +// COM.MoveMemory(pX, new int [] { event.x }, 4); +// COM.MoveMemory(pY, new int [] { event.y }, 4); +// return COM.S_OK; +// } +// +// /* IAccessibleImage::get_imageSize([out] pHeight, [out] pWidth) */ +// int get_imageSize(int /*long*/ pHeight, int /*long*/ pWidth) { +// if (DEBUG) print(this + ".IAccessibleImage::get_imageSize"); +// // TO DO: does it make sense to just reuse getLocation? +// AccessibleControlEvent event = new AccessibleControlEvent(this); +// for (int i = 0; i < accessibleControlListeners.size(); i++) { +// AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i); +// listener.getLocation(event); +// } +// COM.MoveMemory(pHeight, new int [] { event.height }, 4); +// COM.MoveMemory(pWidth, new int [] { event.width }, 4); +// return COM.S_OK; +// } /* IAccessibleTable2::get_cellAt([in] row, [in] column, [out] ppCell) */ int get_cellAt(int row, int column, int /*long*/ ppCell) { @@ -3116,7 +3239,7 @@ public class Accessible { listener.getCell(event); } Accessible accessible = event.accessible; - if (DEBUG) print("IAccessibleTable2::get_cellAt(row=" + row + ", column=" + column + ") returning " + accessible); + if (DEBUG) print(this + ".IAccessibleTable2::get_cellAt(row=" + row + ", column=" + column + ") returning " + accessible); if (accessible == null) return COM.E_INVALIDARG; accessible.AddRef(); COM.MoveMemory(ppCell, new int /*long*/[] { accessible.getAddress() }, OS.PTR_SIZEOF); @@ -3131,7 +3254,7 @@ public class Accessible { listener.getCaption(event); } Accessible accessible = event.accessible; - if (DEBUG) print("IAccessibleTable2::get_caption() returning " + accessible); + if (DEBUG) print(this + ".IAccessibleTable2::get_caption() returning " + accessible); if (accessible == null) { COM.MoveMemory(ppAccessible, new int /*long*/[] { 0 }, OS.PTR_SIZEOF); return COM.S_FALSE; @@ -3149,8 +3272,8 @@ public class Accessible { AccessibleTableListener listener = (AccessibleTableListener) accessibleTableListeners.elementAt(i); listener.getColumnDescription(event); } + if (DEBUG) print(this + ".IAccessibleTable2::get_columnDescription(column=" + column + ") returning " + event.result); setString(pbstrDescription, event.result); - if (DEBUG) print("IAccessibleTable2::get_columnDescription(column=" + column + ") returning " + event.result); if (event.result == null) return COM.S_FALSE; return COM.S_OK; } @@ -3162,7 +3285,7 @@ public class Accessible { AccessibleTableListener listener = (AccessibleTableListener) accessibleTableListeners.elementAt(i); listener.getColumnCount(event); } - if (DEBUG) print("IAccessibleTable2::get_nColumns() returning " + event.count); + if (DEBUG) print(this + ".IAccessibleTable2::get_nColumns() returning " + event.count); COM.MoveMemory(pColumnCount, new int [] { event.count }, 4); return COM.S_OK; } @@ -3174,7 +3297,7 @@ public class Accessible { AccessibleTableListener listener = (AccessibleTableListener) accessibleTableListeners.elementAt(i); listener.getRowCount(event); } - if (DEBUG) print("IAccessibleTable2::get_nRows() returning " + event.count); + if (DEBUG) print(this + ".IAccessibleTable2::get_nRows() returning " + event.count); COM.MoveMemory(pRowCount, new int [] { event.count }, 4); return COM.S_OK; } @@ -3186,7 +3309,7 @@ public class Accessible { AccessibleTableListener listener = (AccessibleTableListener) accessibleTableListeners.elementAt(i); listener.getSelectedCellCount(event); } - if (DEBUG) print("IAccessibleTable2::get_nSelectedCells() returning " + event.count); + if (DEBUG) print(this + ".IAccessibleTable2::get_nSelectedCells() returning " + event.count); COM.MoveMemory(pCellCount, new int [] { event.count }, 4); return COM.S_OK; } @@ -3198,7 +3321,7 @@ public class Accessible { AccessibleTableListener listener = (AccessibleTableListener) accessibleTableListeners.elementAt(i); listener.getSelectedColumnCount(event); } - if (DEBUG) print("IAccessibleTable2::get_nSelectedColumns() returning " + event.count); + if (DEBUG) print(this + ".IAccessibleTable2::get_nSelectedColumns() returning " + event.count); COM.MoveMemory(pColumnCount, new int [] { event.count }, 4); return COM.S_OK; } @@ -3210,7 +3333,7 @@ public class Accessible { AccessibleTableListener listener = (AccessibleTableListener) accessibleTableListeners.elementAt(i); listener.getSelectedRowCount(event); } - if (DEBUG) print("IAccessibleTable2::get_nSelectedRows() returning " + event.count); + if (DEBUG) print(this + ".IAccessibleTable2::get_nSelectedRows() returning " + event.count); COM.MoveMemory(pRowCount, new int [] { event.count }, 4); return COM.S_OK; } @@ -3223,8 +3346,8 @@ public class Accessible { AccessibleTableListener listener = (AccessibleTableListener) accessibleTableListeners.elementAt(i); listener.getRowDescription(event); } + if (DEBUG) print(this + ".IAccessibleTable2::get_rowDescription(row=" + row + ") returning " + event.result); setString(pbstrDescription, event.result); - if (DEBUG) print("IAccessibleTable2::get_rowDescription(row=" + row + ") returning " + event.result); if (event.result == null) return COM.S_FALSE; return COM.S_OK; } @@ -3236,7 +3359,7 @@ public class Accessible { AccessibleTableListener listener = (AccessibleTableListener) accessibleTableListeners.elementAt(i); listener.getSelectedCells(event); } - if (DEBUG) print("IAccessibleTable2::get_selectedCells() returning " + (event.accessibles == null ? "null" : "accessibles[" + event.accessibles.length + "]")); + if (DEBUG) print(this + ".IAccessibleTable2::get_selectedCells() returning " + (event.accessibles == null ? "null" : "accessibles[" + event.accessibles.length + "]")); if (event.accessibles == null || event.accessibles.length == 0) { COM.MoveMemory(ppCells, new int /*long*/[] { 0 }, OS.PTR_SIZEOF); COM.MoveMemory(pNSelectedCells, new int [] { 0 }, 4); @@ -3266,7 +3389,7 @@ public class Accessible { listener.getSelectedColumns(event); } int count = event.selected == null ? 0 : event.selected.length; - if (DEBUG) print("IAccessibleTable2::get_selectedColumns() returning " + (count == 0 ? "null" : "selected[" + count + "]")); + if (DEBUG) print(this + ".IAccessibleTable2::get_selectedColumns() returning " + (count == 0 ? "null" : "selected[" + count + "]")); if (count == 0) { COM.MoveMemory(ppSelectedColumns, new int /*long*/[] { 0 }, OS.PTR_SIZEOF); COM.MoveMemory(pNColumns, new int [] { 0 }, 4); @@ -3287,7 +3410,7 @@ public class Accessible { listener.getSelectedRows(event); } int count = event.selected == null ? 0 : event.selected.length; - if (DEBUG) print("IAccessibleTable2::get_selectedRows() returning " + (count == 0 ? "null" : "selected[" + count + "]")); + if (DEBUG) print(this + ".IAccessibleTable2::get_selectedRows() returning " + (count == 0 ? "null" : "selected[" + count + "]")); if (count == 0) { COM.MoveMemory(ppSelectedRows, new int /*long*/[] { 0 }, OS.PTR_SIZEOF); COM.MoveMemory(pNRows, new int [] { 0 }, 4); @@ -3308,7 +3431,7 @@ public class Accessible { listener.getSummary(event); } Accessible accessible = event.accessible; - if (DEBUG) print("IAccessibleTable2::get_summary() returning " + accessible); + if (DEBUG) print(this + ".IAccessibleTable2::get_summary() returning " + accessible); if (accessible == null) { COM.MoveMemory(ppAccessible, new int /*long*/[] { 0 }, OS.PTR_SIZEOF); return COM.S_FALSE; @@ -3326,7 +3449,7 @@ public class Accessible { AccessibleTableListener listener = (AccessibleTableListener) accessibleTableListeners.elementAt(i); listener.isColumnSelected(event); } - if (DEBUG) print("IAccessibleTable2::get_isColumnSelected() returning " + event.isSelected); + if (DEBUG) print(this + ".IAccessibleTable2::get_isColumnSelected() returning " + event.isSelected); COM.MoveMemory(pIsSelected, new int [] {event.isSelected ? 1 : 0}, 4); return COM.S_OK; } @@ -3339,7 +3462,7 @@ public class Accessible { AccessibleTableListener listener = (AccessibleTableListener) accessibleTableListeners.elementAt(i); listener.isRowSelected(event); } - if (DEBUG) print("IAccessibleTable2::get_isRowSelected() returning " + event.isSelected); + if (DEBUG) print(this + ".IAccessibleTable2::get_isRowSelected() returning " + event.isSelected); COM.MoveMemory(pIsSelected, new int [] {event.isSelected ? 1 : 0}, 4); return COM.S_OK; } @@ -3352,7 +3475,7 @@ public class Accessible { AccessibleTableListener listener = (AccessibleTableListener) accessibleTableListeners.elementAt(i); listener.setSelectedRow(event); } - if (DEBUG) print("IAccessibleTable2::selectRow() returning " + (event.result == null ? "E_INVALIDARG" : event.result)); + if (DEBUG) print(this + ".IAccessibleTable2::selectRow() returning " + (event.result == null ? "E_INVALIDARG" : event.result)); if (event.result == null || !event.result.equals(ACC.OK)) return COM.E_INVALIDARG; return COM.S_OK; } @@ -3365,7 +3488,7 @@ public class Accessible { AccessibleTableListener listener = (AccessibleTableListener) accessibleTableListeners.elementAt(i); listener.setSelectedColumn(event); } - if (DEBUG) print("IAccessibleTable2::selectColumn() returning " + (event.result == null ? "E_INVALIDARG" : event.result)); + if (DEBUG) print(this + ".IAccessibleTable2::selectColumn() returning " + (event.result == null ? "E_INVALIDARG" : event.result)); if (event.result == null || !event.result.equals(ACC.OK)) return COM.E_INVALIDARG; return COM.S_OK; } @@ -3378,7 +3501,7 @@ public class Accessible { AccessibleTableListener listener = (AccessibleTableListener) accessibleTableListeners.elementAt(i); listener.deselectRow(event); } - if (DEBUG) print("IAccessibleTable2::unselectRow() returning " + (event.result == null ? "E_INVALIDARG" : event.result)); + if (DEBUG) print(this + ".IAccessibleTable2::unselectRow() returning " + (event.result == null ? "E_INVALIDARG" : event.result)); if (event.result == null || !event.result.equals(ACC.OK)) return COM.E_INVALIDARG; return COM.S_OK; } @@ -3391,14 +3514,14 @@ public class Accessible { AccessibleTableListener listener = (AccessibleTableListener) accessibleTableListeners.elementAt(i); listener.deselectColumn(event); } - if (DEBUG) print("IAccessibleTable2::unselectColumn() returning " + (event.result == null ? "E_INVALIDARG" : event.result)); + if (DEBUG) print(this + ".IAccessibleTable2::unselectColumn() returning " + (event.result == null ? "E_INVALIDARG" : event.result)); if (event.result == null || !event.result.equals(ACC.OK)) return COM.E_INVALIDARG; return COM.S_OK; } /* IAccessibleTable2::get_modelChange([out] pModelChange) */ int get_modelChange(int /*long*/ pModelChange) { - if (DEBUG) print("IAccessibleTable2::get_modelChange() returning " + (tableChange == null ? "null" : "tableChange=" + tableChange[0] + ", " + tableChange[1] + ", " + tableChange[2] + ", " + tableChange[3])); + if (DEBUG) print(this + ".IAccessibleTable2::get_modelChange() returning " + (tableChange == null ? "null" : "tableChange=" + tableChange[0] + ", " + tableChange[1] + ", " + tableChange[2] + ", " + tableChange[3])); if (tableChange == null) { COM.MoveMemory(pModelChange, new int /*long*/ [] { 0 }, OS.PTR_SIZEOF); return COM.S_FALSE; @@ -3414,7 +3537,7 @@ public class Accessible { AccessibleTableCellListener listener = (AccessibleTableCellListener) accessibleTableCellListeners.elementAt(i); listener.getColumnSpan(event); } - if (DEBUG) print("IAccessibleTableCell::get_columnExtent() returning " + event.count); + if (DEBUG) print(this + ".IAccessibleTableCell::get_columnExtent() returning " + event.count); COM.MoveMemory(pNColumnsSpanned, new int [] { event.count }, 4); return COM.S_OK; } @@ -3426,7 +3549,7 @@ public class Accessible { AccessibleTableCellListener listener = (AccessibleTableCellListener) accessibleTableCellListeners.elementAt(i); listener.getColumnHeaders(event); } - if (DEBUG) print("IAccessibleTableCell::get_columnHeaderCells() returning " + (event.accessibles == null ? "null" : "accessibles[" + event.accessibles.length + "]")); + if (DEBUG) print(this + ".IAccessibleTableCell::get_columnHeaderCells() returning " + (event.accessibles == null ? "null" : "accessibles[" + event.accessibles.length + "]")); if (event.accessibles == null || event.accessibles.length == 0) { COM.MoveMemory(ppCellAccessibles, new int /*long*/[] { 0 }, OS.PTR_SIZEOF); COM.MoveMemory(pNColumnHeaderCells, new int [] { 0 }, 4); @@ -3455,7 +3578,7 @@ public class Accessible { AccessibleTableCellListener listener = (AccessibleTableCellListener) accessibleTableCellListeners.elementAt(i); listener.getColumnIndex(event); } - if (DEBUG) print("IAccessibleTableCell::get_columnIndex() returning " + event.index); + if (DEBUG) print(this + ".IAccessibleTableCell::get_columnIndex() returning " + event.index); COM.MoveMemory(pColumnIndex, new int [] { event.index }, 4); return COM.S_OK; } @@ -3467,7 +3590,7 @@ public class Accessible { AccessibleTableCellListener listener = (AccessibleTableCellListener) accessibleTableCellListeners.elementAt(i); listener.getRowSpan(event); } - if (DEBUG) print("IAccessibleTableCell::get_rowExtent() returning " + event.count); + if (DEBUG) print(this + ".IAccessibleTableCell::get_rowExtent() returning " + event.count); COM.MoveMemory(pNRowsSpanned, new int [] { event.count }, 4); return COM.S_OK; } @@ -3479,7 +3602,7 @@ public class Accessible { AccessibleTableCellListener listener = (AccessibleTableCellListener) accessibleTableCellListeners.elementAt(i); listener.getRowHeaders(event); } - if (DEBUG) print("IAccessibleTableCell::get_rowHeaderCells() returning " + (event.accessibles == null ? "null" : "accessibles[" + event.accessibles.length + "]")); + if (DEBUG) print(this + ".IAccessibleTableCell::get_rowHeaderCells() returning " + (event.accessibles == null ? "null" : "accessibles[" + event.accessibles.length + "]")); if (event.accessibles == null || event.accessibles.length == 0) { COM.MoveMemory(ppCellAccessibles, new int /*long*/[] { 0 }, OS.PTR_SIZEOF); COM.MoveMemory(pNRowHeaderCells, new int [] { 0 }, 4); @@ -3508,7 +3631,7 @@ public class Accessible { AccessibleTableCellListener listener = (AccessibleTableCellListener) accessibleTableCellListeners.elementAt(i); listener.getRowIndex(event); } - if (DEBUG) print("IAccessibleTableCell::get_rowIndex() returning " + event.index); + if (DEBUG) print(this + ".IAccessibleTableCell::get_rowIndex() returning " + event.index); COM.MoveMemory(pRowIndex, new int [] { event.index }, 4); return COM.S_OK; } @@ -3520,13 +3643,14 @@ public class Accessible { AccessibleTableCellListener listener = (AccessibleTableCellListener) accessibleTableCellListeners.elementAt(i); listener.isSelected(event); } - if (DEBUG) print("IAccessibleTableCell::get_isSelected() returning " + event.isSelected); + if (DEBUG) print(this + ".IAccessibleTableCell::get_isSelected() returning " + event.isSelected); COM.MoveMemory(pIsSelected, new int [] {event.isSelected ? 1 : 0}, 4); return COM.S_OK; } /* IAccessibleTableCell::get_rowColumnExtents([out] pRow, [out] pColumn, [out] pRowExtents, [out] pColumnExtents, [out] pIsSelected) */ int get_rowColumnExtents(int /*long*/ pRow, int /*long*/ pColumn, int /*long*/ pRowExtents, int /*long*/ pColumnExtents, int /*long*/ pIsSelected) { + if (DEBUG) print(this + ".IAccessibleTableCell::get_rowColumnExtents"); // TODO: should we implement this? It is just a convenience function. return COM.DISP_E_MEMBERNOTFOUND; // AccessibleTableCellEvent event = new AccessibleTableCellEvent(this); @@ -3549,7 +3673,7 @@ public class Accessible { listener.getTable(event); } Accessible accessible = event.accessible; - if (DEBUG) print("IAccessibleTableCell::get_table() returning " + accessible); + if (DEBUG) print(this + ".IAccessibleTableCell::get_table() returning " + accessible); if (accessible == null) { // TODO: This is not supposed to return S_FALSE. We need to lookup the table role parent and return that. COM.MoveMemory(ppTable, new int /*long*/[] { 0 }, OS.PTR_SIZEOF); @@ -3562,9 +3686,10 @@ public class Accessible { /* IAccessibleText::addSelection([in] startOffset, [in] endOffset) */ int addSelection(int startOffset, int endOffset) { + if (DEBUG) print(this + ".IAccessibleText::addSelection(" + startOffset + ", " + endOffset + ")"); AccessibleTextEvent event = new AccessibleTextEvent(this); - event.start = startOffset; - event.end = endOffset; + event.start = startOffset == COM.IA2_TEXT_OFFSET_LENGTH ? getCharacterCount() : startOffset; + event.end = endOffset == COM.IA2_TEXT_OFFSET_LENGTH ? getCharacterCount() : endOffset; for (int i = 0; i < accessibleTextExtendedListeners.size(); i++) { AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) accessibleTextExtendedListeners.elementAt(i); listener.addSelection(event); @@ -3576,7 +3701,7 @@ public class Accessible { /* IAccessibleText::get_attributes([in] offset, [out] pStartOffset, [out] pEndOffset, [out] pbstrTextAttributes) */ int get_attributes(int offset, int /*long*/ pStartOffset, int /*long*/ pEndOffset, int /*long*/ pbstrTextAttributes) { AccessibleTextAttributeEvent event = new AccessibleTextAttributeEvent(this); - event.offset = offset; + event.offset = offset == COM.IA2_TEXT_OFFSET_LENGTH ? getCharacterCount() : offset; for (int i = 0; i < accessibleAttributeListeners.size(); i++) { AccessibleAttributeListener listener = (AccessibleAttributeListener) accessibleAttributeListeners.elementAt(i); listener.getTextAttributes(event); @@ -3626,7 +3751,7 @@ public class Accessible { textAttributes += event.attributes[i] + ":" + event.attributes[i+1] + ";"; } } - if (DEBUG) print("IAccessibleText::get_attributes(" + offset + ") returning start = " + event.start + ", end = " + event.end + ", attributes = " + textAttributes); + if (DEBUG) print(this + ".IAccessibleText::get_attributes(" + offset + ") returning start = " + event.start + ", end = " + event.end + ", attributes = " + textAttributes); COM.MoveMemory(pStartOffset, new int [] { event.start }, 4); COM.MoveMemory(pEndOffset, new int [] { event.end }, 4); setString(pbstrTextAttributes, textAttributes); @@ -3636,41 +3761,24 @@ public class Accessible { /* IAccessibleText::get_caretOffset([out] pOffset) */ int get_caretOffset(int /*long*/ pOffset) { - AccessibleTextEvent event = new AccessibleTextEvent(this); - event.offset = -1; - for (int i = 0; i < accessibleTextExtendedListeners.size(); i++) { - AccessibleTextListener listener = (AccessibleTextListener) accessibleTextExtendedListeners.elementAt(i); - listener.getCaretOffset (event); - } - if (event.offset == -1) { - for (int i = 0; i < accessibleTextListeners.size(); i++) { - event.childID = ACC.CHILDID_SELF; - AccessibleTextListener listener = (AccessibleTextListener) accessibleTextListeners.elementAt(i); - listener.getCaretOffset (event); - } - } - if (DEBUG) print("IAccessibleText::get_caretOffset returning " + event.offset); - COM.MoveMemory(pOffset, new int [] { event.offset }, 4); - if (event.offset == -1) return COM.S_FALSE; + int offset = getCaretOffset(); + if (DEBUG) print(this + ".IAccessibleText::get_caretOffset returning " + offset + hresult(offset == -1 ? COM.S_FALSE : COM.S_OK)); + COM.MoveMemory(pOffset, new int [] { offset }, 4); + if (offset == -1) return COM.S_FALSE; return COM.S_OK; } - /* IAccessibleText::get_characterExtents([in] offset, [in] coordType, [out] pX, [out] pY, [out] pWidth, [out] pHeight) */ int get_characterExtents(int offset, int coordType, int /*long*/ pX, int /*long*/ pY, int /*long*/ pWidth, int /*long*/ pHeight) { + int length = getCharacterCount(); AccessibleTextEvent event = new AccessibleTextEvent(this); - for (int i = 0; i < accessibleTextExtendedListeners.size(); i++) { - AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) accessibleTextExtendedListeners.elementAt(i); - listener.getCharacterCount(event); - } - int length = event.count; - event.count = 0; - event.start = offset < 0 ? 0 : offset; - event.end = offset >= length ? length : offset + 1; + event.start = offset == COM.IA2_TEXT_OFFSET_LENGTH ? length : offset < 0 ? 0 : offset; + event.end = offset == COM.IA2_TEXT_OFFSET_LENGTH || offset >= length ? length : offset + 1; for (int i = 0; i < accessibleTextExtendedListeners.size(); i++) { AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) accessibleTextExtendedListeners.elementAt(i); listener.getTextBounds(event); } /* Note: event.rectangles is not used here, because IAccessibleText::get_characterExtents is just for one character. */ + if (DEBUG) print(this + ".IAccessibleText::get_characterExtents(" + offset + ") returning " + event.x + ", " + event.y + ", " + event.width + ", " + event.height); COM.MoveMemory(pX, new int [] { event.x }, 4); COM.MoveMemory(pY, new int [] { event.y }, 4); COM.MoveMemory(pWidth, new int [] { event.width }, 4); @@ -3697,6 +3805,7 @@ public class Accessible { } event.count = event.offset != -1 && event.length > 0 ? 1 : 0; } + if (DEBUG) print(this + ".IAccessibleText::get_nSelections returning " + event.count); COM.MoveMemory(pNSelections, new int [] { event.count }, 4); return COM.S_OK; } @@ -3711,11 +3820,12 @@ public class Accessible { AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) accessibleTextExtendedListeners.elementAt(i); listener.getOffsetAtPoint(event); } - COM.MoveMemory(pOffset, new int [] { event.offset }, 4); + if (DEBUG) print(this + ".IAccessibleText::get_offsetAtPoint(" + x + ", " + y + ") returning " + event.offset + hresult(event.offset == -1 ? COM.S_FALSE : COM.S_OK)); /* * Note that the current IA2 spec says to return 0 when there's nothing to return, * but since 0 is a valid return value, the spec is going to be updated to return -1. */ + COM.MoveMemory(pOffset, new int [] { event.offset }, 4); if (event.offset == -1) return COM.S_FALSE; return COM.S_OK; } @@ -3741,7 +3851,7 @@ public class Accessible { event.start = event.offset; event.end = event.offset + event.length; } - if (DEBUG) print("IAccessibleText::get_selection(" + selectionIndex + ") returning " + event.start + ", " + event.end); + if (DEBUG) print(this + ".IAccessibleText::get_selection(" + selectionIndex + ") returning " + event.start + ", " + event.end); COM.MoveMemory(pStartOffset, new int [] { event.start }, 4); COM.MoveMemory(pEndOffset, new int [] { event.end }, 4); /* @@ -3755,8 +3865,14 @@ public class Accessible { /* IAccessibleText::get_text([in] startOffset, [in] endOffset, [out] pbstrText) */ int get_text(int startOffset, int endOffset, int /*long*/ pbstrText) { AccessibleTextEvent event = new AccessibleTextEvent(this); - event.start = startOffset; - event.end = endOffset; + event.start = startOffset == COM.IA2_TEXT_OFFSET_LENGTH ? getCharacterCount() : startOffset; + event.end = endOffset == COM.IA2_TEXT_OFFSET_LENGTH ? getCharacterCount() : endOffset; + if (event.start > event.end) { + /* IA2 spec says that indices can be exchanged. */ + int temp = event.start; + event.start = event.end; + event.end = temp; + } event.count = 0; event.type = ACC.TEXT_BOUNDARY_ALL; for (int i = 0; i < accessibleTextExtendedListeners.size(); i++) { @@ -3776,7 +3892,7 @@ public class Accessible { event.result = e.result; } } - if (DEBUG) print("IAccessibleText::get_text(" + startOffset + ", " + endOffset + ") returning " + event.result); + if (DEBUG) print(this + ".IAccessibleText::get_text(" + startOffset + ", " + endOffset + ") returning " + event.result + hresult(event.result == null ? COM.E_INVALIDARG : COM.S_OK)); setString(pbstrText, event.result); if (event.result == null) return COM.E_INVALIDARG; return COM.S_OK; @@ -3785,8 +3901,9 @@ public class Accessible { /* IAccessibleText::get_textBeforeOffset([in] offset, [in] boundaryType, [out] pStartOffset, [out] pEndOffset, [out] pbstrText) */ int get_textBeforeOffset(int offset, int boundaryType, int /*long*/ pStartOffset, int /*long*/ pEndOffset, int /*long*/ pbstrText) { AccessibleTextEvent event = new AccessibleTextEvent(this); - event.start = offset; - event.end = offset; + int charCount = getCharacterCount(); + event.start = offset == COM.IA2_TEXT_OFFSET_LENGTH ? charCount : offset == COM.IA2_TEXT_OFFSET_CARET ? getCaretOffset() : offset; + event.end = event.start == charCount ? event.start : event.start + 1; event.count = -1; switch (boundaryType) { case COM.IA2_TEXT_BOUNDARY_CHAR: event.type = ACC.TEXT_BOUNDARY_CHAR; break; @@ -3800,6 +3917,7 @@ public class Accessible { AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) accessibleTextExtendedListeners.elementAt(i); listener.getText(event); } + if (DEBUG) print(this + ".IAccessibleText::get_textBeforeOffset(" + offset + ") returning start=" + event.start + ", end=" + event.end + " " + event.result + hresult(event.result == null ? COM.S_FALSE : COM.S_OK)); COM.MoveMemory(pStartOffset, new int [] { event.start }, 4); COM.MoveMemory(pEndOffset, new int [] { event.end }, 4); setString(pbstrText, event.result); @@ -3810,8 +3928,9 @@ public class Accessible { /* IAccessibleText::get_textAfterOffset([in] offset, [in] boundaryType, [out] pStartOffset, [out] pEndOffset, [out] pbstrText) */ int get_textAfterOffset(int offset, int boundaryType, int /*long*/ pStartOffset, int /*long*/ pEndOffset, int /*long*/ pbstrText) { AccessibleTextEvent event = new AccessibleTextEvent(this); - event.start = offset; - event.end = offset; + int charCount = getCharacterCount(); + event.start = offset == COM.IA2_TEXT_OFFSET_LENGTH ? charCount : offset == COM.IA2_TEXT_OFFSET_CARET ? getCaretOffset() : offset; + event.end = event.start == charCount ? event.start : event.start + 1; event.count = 1; switch (boundaryType) { case COM.IA2_TEXT_BOUNDARY_CHAR: event.type = ACC.TEXT_BOUNDARY_CHAR; break; @@ -3825,6 +3944,7 @@ public class Accessible { AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) accessibleTextExtendedListeners.elementAt(i); listener.getText(event); } + if (DEBUG) print(this + ".IAccessibleText::get_textAfterOffset(" + offset + ") returning start=" + event.start + ", end=" + event.end + " " + event.result + hresult(event.result == null ? COM.S_FALSE : COM.S_OK)); COM.MoveMemory(pStartOffset, new int [] { event.start }, 4); COM.MoveMemory(pEndOffset, new int [] { event.end }, 4); setString(pbstrText, event.result); @@ -3835,8 +3955,9 @@ public class Accessible { /* IAccessibleText::get_textAtOffset([in] offset, [in] boundaryType, [out] pStartOffset, [out] pEndOffset, [out] pbstrText) */ int get_textAtOffset(int offset, int boundaryType, int /*long*/ pStartOffset, int /*long*/ pEndOffset, int /*long*/ pbstrText) { AccessibleTextEvent event = new AccessibleTextEvent(this); - event.start = offset; - event.end = offset; + int charCount = getCharacterCount(); + event.start = offset == COM.IA2_TEXT_OFFSET_LENGTH ? charCount : offset == COM.IA2_TEXT_OFFSET_CARET ? getCaretOffset() : offset; + event.end = event.start == charCount ? event.start : event.start + 1; event.count = 0; switch (boundaryType) { case COM.IA2_TEXT_BOUNDARY_CHAR: event.type = ACC.TEXT_BOUNDARY_CHAR; break; @@ -3847,11 +3968,7 @@ public class Accessible { case COM.IA2_TEXT_BOUNDARY_ALL: { event.type = ACC.TEXT_BOUNDARY_ALL; event.start = 0; - for (int i = 0; i < accessibleTextExtendedListeners.size(); i++) { - AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) accessibleTextExtendedListeners.elementAt(i); - listener.getCharacterCount(event); - } - event.end = event.count; + event.end = charCount; event.count = 0; break; } @@ -3861,6 +3978,7 @@ public class Accessible { AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) accessibleTextExtendedListeners.elementAt(i); listener.getText(event); } + if (DEBUG) print(this + ".IAccessibleText::get_textAtOffset(" + offset + ") returning start=" + event.start + ", end=" + event.end + " " + event.result + hresult(event.result == null ? COM.S_FALSE : COM.S_OK)); COM.MoveMemory(pStartOffset, new int [] { event.start }, 4); COM.MoveMemory(pEndOffset, new int [] { event.end }, 4); setString(pbstrText, event.result); @@ -3876,6 +3994,7 @@ public class Accessible { AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) accessibleTextExtendedListeners.elementAt(i); listener.removeSelection(event); } + if (DEBUG) print(this + ".IAccessibleText::removeSelection(" + selectionIndex + ") returning" + hresult(event.result == null || !event.result.equals(ACC.OK) ? COM.E_INVALIDARG : COM.S_OK)); if (event.result == null || !event.result.equals(ACC.OK)) return COM.E_INVALIDARG; return COM.S_OK; } @@ -3883,11 +4002,12 @@ public class Accessible { /* IAccessibleText::setCaretOffset([in] offset) */ int setCaretOffset(int offset) { AccessibleTextEvent event = new AccessibleTextEvent(this); - event.offset = offset; + event.offset = offset == COM.IA2_TEXT_OFFSET_LENGTH ? getCharacterCount() : offset; for (int i = 0; i < accessibleTextExtendedListeners.size(); i++) { AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) accessibleTextExtendedListeners.elementAt(i); listener.setCaretOffset(event); } + if (DEBUG) print(this + ".IAccessibleText::setCaretOffset(" + offset + ") returning" + hresult(event.result == null || !event.result.equals(ACC.OK) ? COM.E_INVALIDARG : COM.S_OK)); if (event.result == null || !event.result.equals(ACC.OK)) return COM.E_INVALIDARG; // TODO: @retval E_FAIL if the caret cannot be set ? return COM.S_OK; } @@ -3896,42 +4016,28 @@ public class Accessible { int setSelection(int selectionIndex, int startOffset, int endOffset) { AccessibleTextEvent event = new AccessibleTextEvent(this); event.index = selectionIndex; - event.start = startOffset; - event.end = endOffset; + event.start = startOffset == COM.IA2_TEXT_OFFSET_LENGTH ? getCharacterCount() : startOffset; + event.end = endOffset == COM.IA2_TEXT_OFFSET_LENGTH ? getCharacterCount() : endOffset; for (int i = 0; i < accessibleTextExtendedListeners.size(); i++) { AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) accessibleTextExtendedListeners.elementAt(i); listener.setSelection(event); } - if (DEBUG) print("IAccessibleText::setSelection(index=" + selectionIndex + ", start=" + event.start + ", end=" + event.end + ") returning " + (event.result.equals(ACC.OK) ? "OK" : "INVALIDARG")); + if (DEBUG) print(this + ".IAccessibleText::setSelection(index=" + selectionIndex + ", start=" + event.start + ", end=" + event.end + ") returning " + (event.result.equals(ACC.OK) ? "OK" : "INVALIDARG")); if (event.result == null || !event.result.equals(ACC.OK)) return COM.E_INVALIDARG; return COM.S_OK; } /* IAccessibleText::get_nCharacters([out] pNCharacters) */ int get_nCharacters(int /*long*/ pNCharacters) { - AccessibleTextEvent event = new AccessibleTextEvent(this); - event.count = -1; - for (int i = 0; i < accessibleTextExtendedListeners.size(); i++) { - AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) accessibleTextExtendedListeners.elementAt(i); - listener.getCharacterCount(event); - } - if (event.count == -1) { - AccessibleControlEvent e = new AccessibleControlEvent(this); - e.childID = ACC.CHILDID_SELF; - for (int i = 0; i < accessibleControlListeners.size(); i++) { - AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i); - listener.getRole(e); - listener.getValue(e); - } - // TODO: Consider passing the value through for other roles as well (i.e. combo, etc). Keep in sync with get_text. - event.count = e.detail == ACC.ROLE_TEXT && e.result != null ? e.result.length() : 0; - } - COM.MoveMemory(pNCharacters, new int [] { event.count }, 4); + int count = getCharacterCount(); + COM.MoveMemory(pNCharacters, new int [] { count }, 4); + if (DEBUG) print(this + ".IAccessibleText::get_nCharacters returning " + count); return COM.S_OK; } /* IAccessibleText::scrollSubstringTo([in] startIndex, [in] endIndex, [in] scrollType) */ int scrollSubstringTo(int startIndex, int endIndex, int scrollType) { + if (DEBUG) print(this + ".IAccessibleText::scrollSubstringTo"); AccessibleTextEvent event = new AccessibleTextEvent(this); event.start = startIndex; event.end = endIndex; @@ -3954,6 +4060,7 @@ public class Accessible { /* IAccessibleText::scrollSubstringToPoint([in] startIndex, [in] endIndex, [in] coordinateType, [in] x, [in] y) */ int scrollSubstringToPoint(int startIndex, int endIndex, int coordinateType, int x, int y) { + if (DEBUG) print(this + ".IAccessibleText::scrollSubstringToPoint"); AccessibleTextEvent event = new AccessibleTextEvent(this); event.start = startIndex; event.end = endIndex; @@ -3970,6 +4077,7 @@ public class Accessible { /* IAccessibleText::get_newText([out] pNewText) */ int get_newText(int /*long*/ pNewText) { + if (DEBUG) print(this + ".IAccessibleText::get_newText"); String text = null; int start = 0; int end = 0; @@ -3987,6 +4095,7 @@ public class Accessible { /* IAccessibleText::get_oldText([out] pOldText) */ int get_oldText(int /*long*/ pOldText) { + if (DEBUG) print(this + ".IAccessibleText::get_oldText"); String text = null; int start = 0; int end = 0; @@ -4009,20 +4118,21 @@ public class Accessible { AccessibleValueListener listener = (AccessibleValueListener) accessibleValueListeners.elementAt(i); listener.getCurrentValue(event); } - if (event.value == null) return COM.S_FALSE; + if (DEBUG) print(this + ".IAccessibleValue::get_currentValue returning " + event.value + hresult(event.value == null ? COM.S_FALSE : COM.S_OK)); setNumberVARIANT(pCurrentValue, event.value); return COM.S_OK; } /* IAccessibleValue::setCurrentValue([in] value) */ int setCurrentValue(int /*long*/ value) { + if (DEBUG) print(this + ".IAccessibleValue::setCurrentValue"); AccessibleValueEvent event = new AccessibleValueEvent(this); event.value = getNumberVARIANT(value); - // TODO: clip to min/max? See IA2 doc. for (int i = 0; i < accessibleValueListeners.size(); i++) { AccessibleValueListener listener = (AccessibleValueListener) accessibleValueListeners.elementAt(i); listener.setCurrentValue(event); } + //if (event.value == null) return COM.S_FALSE; return COM.S_OK; } @@ -4033,7 +4143,7 @@ public class Accessible { AccessibleValueListener listener = (AccessibleValueListener) accessibleValueListeners.elementAt(i); listener.getMaximumValue(event); } - if (event.value == null) return COM.S_FALSE; + if (DEBUG) print(this + ".IAccessibleValue::get_maximumValue returning " + event.value + hresult(event.value == null ? COM.S_FALSE : COM.S_OK)); setNumberVARIANT(pMaximumValue, event.value); return COM.S_OK; } @@ -4045,33 +4155,63 @@ public class Accessible { AccessibleValueListener listener = (AccessibleValueListener) accessibleValueListeners.elementAt(i); listener.getMinimumValue(event); } - if (event.value == null) return COM.S_FALSE; + if (DEBUG) print(this + ".IAccessibleValue::get_minimumValue returning " + event.value + hresult(event.value == null ? COM.S_FALSE : COM.S_OK)); setNumberVARIANT(pMinimumValue, event.value); return COM.S_OK; } + int eventChildID() { + if (parent == null) return COM.CHILDID_SELF; + if (uniqueID == -1) uniqueID = UniqueID--; + return uniqueID; + } + + void checkUniqueID(int childID) { + /* If the application is using child ids, check whether there's a corresponding + * accessible, and if so, use the child id as that accessible's unique id. */ + AccessibleControlEvent event = new AccessibleControlEvent(this); + event.childID = childID; + for (int l = 0; l < accessibleControlListeners.size(); l++) { + AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(l); + listener.getChild(event); + } + Accessible accessible = event.accessible; + if (accessible != null && accessible.uniqueID == -1) { + accessible.uniqueID = childID; + } + } + int childIDToOs(int childID) { if (childID == ACC.CHILDID_SELF) return COM.CHILDID_SELF; - /* - * Feature of Windows: - * In Windows XP, tree item ids are 1-based indices. Previous versions - * of Windows use the tree item handle for the accessible child ID. - * For backward compatibility, we still take a handle childID for tree - * items on XP. All other childIDs are 1-based indices. - */ - if (!(control instanceof Tree)) return childID + 1; - if (OS.COMCTL32_MAJOR < 6) return childID; - return (int)/*64*/OS.SendMessage (control.handle, OS.TVM_MAPHTREEITEMTOACCID, childID, 0); + /* ChildIDs are 1-based indices. */ + int osChildID = childID + 1; + if (control instanceof Tree) { + /* + * Feature of Windows: + * Before Windows XP, tree item ids were 1-based indices. + * Windows XP and later use the tree item handle for the + * accessible child ID. For backward compatibility, we still + * take 1-based childIDs for tree items prior to Windows XP. + */ + if (OS.COMCTL32_MAJOR < 6) { + osChildID = childID; + } else { + osChildID = (int)/*64*/OS.SendMessage (control.handle, OS.TVM_MAPHTREEITEMTOACCID, childID, 0); + } + } + checkUniqueID(osChildID); + return osChildID; } int osToChildID(int osChildID) { if (osChildID == COM.CHILDID_SELF) return ACC.CHILDID_SELF; /* * Feature of Windows: - * In Windows XP, tree item ids are 1-based indices. Previous versions - * of Windows use the tree item handle for the accessible child ID. - * For backward compatibility, we still take a handle childID for tree - * items on XP. All other childIDs are 1-based indices. + * Before Windows XP, tree item ids were 1-based indices. + * Windows XP and later use the tree item handle for the + * accessible child ID. For backward compatibility, we still + * take 1-based childIDs for tree items prior to Windows XP. + * All other childIDs are 1-based indices. */ if (!(control instanceof Tree)) return osChildID - 1; if (OS.COMCTL32_MAJOR < 6) return osChildID; @@ -4229,6 +4369,45 @@ public class Accessible { return ACC.ROLE_CLIENT_AREA; } + int getCaretOffset() { + AccessibleTextEvent event = new AccessibleTextEvent(this); + event.offset = -1; + for (int i = 0; i < accessibleTextExtendedListeners.size(); i++) { + AccessibleTextListener listener = (AccessibleTextListener) accessibleTextExtendedListeners.elementAt(i); + listener.getCaretOffset (event); + } + if (event.offset == -1) { + for (int i = 0; i < accessibleTextListeners.size(); i++) { + event.childID = ACC.CHILDID_SELF; + AccessibleTextListener listener = (AccessibleTextListener) accessibleTextListeners.elementAt(i); + listener.getCaretOffset (event); + } + } + return event.offset; + } + + /* IAccessibleText::get_characterExtents([in] offset, [in] coordType, [out] pX, [out] pY, [out] pWidth, [out] pHeight) */ + int getCharacterCount() { + AccessibleTextEvent event = new AccessibleTextEvent(this); + event.count = -1; + for (int i = 0; i < accessibleTextExtendedListeners.size(); i++) { + AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) accessibleTextExtendedListeners.elementAt(i); + listener.getCharacterCount(event); + } + if (event.count == -1) { + AccessibleControlEvent e = new AccessibleControlEvent(this); + e.childID = ACC.CHILDID_SELF; + for (int i = 0; i < accessibleControlListeners.size(); i++) { + AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i); + listener.getRole(e); + listener.getValue(e); + } + // TODO: Consider passing the value through for other roles as well (i.e. combo, etc). Keep in sync with get_text. + event.count = e.detail == ACC.ROLE_TEXT && e.result != null ? e.result.length() : 0; + } + return event.count; + } + int getRelationCount() { int count = 0; for (int type = 0; type < MAX_RELATION_TYPES; type++) { @@ -4244,8 +4423,7 @@ public class Accessible { AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i); listener.getRole(event); } - int role = event.detail; - return role; + return event.detail; } VARIANT getVARIANT(int /*long*/ variant) { @@ -4276,7 +4454,10 @@ public class Accessible { } void setNumberVARIANT(int /*long*/ variant, Number number) { - if (number instanceof Double) { + if (number == null) { + COM.MoveMemory(variant, new short[] { COM.VT_EMPTY }, 2); + COM.MoveMemory(variant + 8, new int[] { 0 }, 4); + } else if (number instanceof Double) { COM.MoveMemory(variant, new short[] { COM.VT_R8 }, 2); COM.MoveMemory(variant + 8, new double[] { number.doubleValue() }, 8); } else if (number instanceof Float) { @@ -4323,34 +4504,10 @@ public class Accessible { // START DEBUG CODE static void print (String str) { - System.out.println (str); + if (DEBUG) System.out.println (str); } - - String getStateString(int state) { - StringBuffer stateString = new StringBuffer(); - if ((state & COM.STATE_SYSTEM_SELECTED) != 0) stateString.append(" STATE_SYSTEM_SELECTED"); - if ((state & COM.STATE_SYSTEM_SELECTABLE) != 0) stateString.append(" STATE_SYSTEM_SELECTABLE"); - if ((state & COM.STATE_SYSTEM_MULTISELECTABLE) != 0) stateString.append(" STATE_SYSTEM_MULTISELECTABLE"); - if ((state & COM.STATE_SYSTEM_FOCUSED) != 0) stateString.append(" STATE_SYSTEM_FOCUSED"); - if ((state & COM.STATE_SYSTEM_FOCUSABLE) != 0) stateString.append(" STATE_SYSTEM_FOCUSABLE"); - if ((state & COM.STATE_SYSTEM_PRESSED) != 0) stateString.append(" STATE_SYSTEM_PRESSED"); - if ((state & COM.STATE_SYSTEM_CHECKED) != 0) stateString.append(" STATE_SYSTEM_CHECKED"); - if ((state & COM.STATE_SYSTEM_EXPANDED) != 0) stateString.append(" STATE_SYSTEM_EXPANDED"); - if ((state & COM.STATE_SYSTEM_COLLAPSED) != 0) stateString.append(" STATE_SYSTEM_COLLAPSED"); - if ((state & COM.STATE_SYSTEM_HOTTRACKED) != 0) stateString.append(" STATE_SYSTEM_HOTTRACKED"); - if ((state & COM.STATE_SYSTEM_BUSY) != 0) stateString.append(" STATE_SYSTEM_BUSY"); - if ((state & COM.STATE_SYSTEM_READONLY) != 0) stateString.append(" STATE_SYSTEM_READONLY"); - if ((state & COM.STATE_SYSTEM_INVISIBLE) != 0) stateString.append(" STATE_SYSTEM_INVISIBLE"); - if ((state & COM.STATE_SYSTEM_OFFSCREEN) != 0) stateString.append(" STATE_SYSTEM_OFFSCREEN"); - if ((state & COM.STATE_SYSTEM_SIZEABLE) != 0) stateString.append(" STATE_SYSTEM_SIZEABLE"); - if ((state & COM.STATE_SYSTEM_LINKED) != 0) stateString.append(" STATE_SYSTEM_LINKED"); - if ((state & COM.STATE_SYSTEM_UNAVAILABLE) != 0) stateString.append(" STATE_SYSTEM_UNAVAILABLE"); - stateString.append("Unknown state[s] (" + Integer.toHexString(state) + ")"); - return stateString.toString(); - } - String getRoleString(int role) { - switch (role) { + if (DEBUG) switch (role) { case COM.ROLE_SYSTEM_CLIENT: return "ROLE_SYSTEM_CLIENT"; case COM.ROLE_SYSTEM_WINDOW: return "ROLE_SYSTEM_WINDOW"; case COM.ROLE_SYSTEM_MENUBAR: return "ROLE_SYSTEM_MENUBAR"; @@ -4407,9 +4564,35 @@ public class Accessible { } return "Unknown role (" + role + ")"; } - + String getStateString(int state) { + if (state == 0) return " no state bits set"; + StringBuffer stateString = new StringBuffer(); + if (DEBUG) { + if ((state & COM.STATE_SYSTEM_SELECTED) != 0) stateString.append(" STATE_SYSTEM_SELECTED"); + if ((state & COM.STATE_SYSTEM_SELECTABLE) != 0) stateString.append(" STATE_SYSTEM_SELECTABLE"); + if ((state & COM.STATE_SYSTEM_MULTISELECTABLE) != 0) stateString.append(" STATE_SYSTEM_MULTISELECTABLE"); + if ((state & COM.STATE_SYSTEM_FOCUSED) != 0) stateString.append(" STATE_SYSTEM_FOCUSED"); + if ((state & COM.STATE_SYSTEM_FOCUSABLE) != 0) stateString.append(" STATE_SYSTEM_FOCUSABLE"); + if ((state & COM.STATE_SYSTEM_PRESSED) != 0) stateString.append(" STATE_SYSTEM_PRESSED"); + if ((state & COM.STATE_SYSTEM_CHECKED) != 0) stateString.append(" STATE_SYSTEM_CHECKED"); + if ((state & COM.STATE_SYSTEM_EXPANDED) != 0) stateString.append(" STATE_SYSTEM_EXPANDED"); + if ((state & COM.STATE_SYSTEM_COLLAPSED) != 0) stateString.append(" STATE_SYSTEM_COLLAPSED"); + if ((state & COM.STATE_SYSTEM_HOTTRACKED) != 0) stateString.append(" STATE_SYSTEM_HOTTRACKED"); + if ((state & COM.STATE_SYSTEM_BUSY) != 0) stateString.append(" STATE_SYSTEM_BUSY"); + if ((state & COM.STATE_SYSTEM_READONLY) != 0) stateString.append(" STATE_SYSTEM_READONLY"); + if ((state & COM.STATE_SYSTEM_INVISIBLE) != 0) stateString.append(" STATE_SYSTEM_INVISIBLE"); + if ((state & COM.STATE_SYSTEM_OFFSCREEN) != 0) stateString.append(" STATE_SYSTEM_OFFSCREEN"); + if ((state & COM.STATE_SYSTEM_SIZEABLE) != 0) stateString.append(" STATE_SYSTEM_SIZEABLE"); + if ((state & COM.STATE_SYSTEM_LINKED) != 0) stateString.append(" STATE_SYSTEM_LINKED"); + if ((state & COM.STATE_SYSTEM_UNAVAILABLE) != 0) stateString.append(" STATE_SYSTEM_UNAVAILABLE"); + if (stateString.length() == 0) stateString.append(" Unknown state[s] (" + Integer.toHexString(state) + ")"); + } + return stateString.toString(); + } String getIA2StatesString(int ia2States) { + if (ia2States == 0) return " no state bits set"; StringBuffer stateString = new StringBuffer(); + if (DEBUG) { if ((ia2States & COM.IA2_STATE_ACTIVE) != 0) stateString.append(" IA2_STATE_ACTIVE"); if ((ia2States & COM.IA2_STATE_EDITABLE) != 0) stateString.append(" IA2_STATE_EDITABLE"); if ((ia2States & COM.IA2_STATE_SINGLE_LINE) != 0) stateString.append(" IA2_STATE_SINGLE_LINE"); @@ -4417,11 +4600,68 @@ public class Accessible { if ((ia2States & COM.IA2_STATE_REQUIRED) != 0) stateString.append(" IA2_STATE_REQUIRED"); if ((ia2States & COM.IA2_STATE_INVALID_ENTRY) != 0) stateString.append(" IA2_STATE_INVALID_ENTRY"); if ((ia2States & COM.IA2_STATE_SUPPORTS_AUTOCOMPLETION) != 0) stateString.append(" IA2_STATE_SUPPORTS_AUTOCOMPLETION"); - stateString.append("Unknown IA2 state[s] (" + ia2States + ")"); + if (stateString.length() == 0) stateString.append(" Unknown IA2 state[s] (" + ia2States + ")"); + } return stateString.toString(); } - + String getEventString(int event) { + if (DEBUG) switch (event) { + case ACC.EVENT_TABLE_CHANGED: return "IA2_EVENT_TABLE_CHANGED"; + case ACC.EVENT_TEXT_CHANGED: return "IA2_EVENT_TEXT_REMOVED or IA2_EVENT_TEXT_INSERTED"; + case ACC.EVENT_HYPERTEXT_LINK_SELECTED: return "IA2_EVENT_HYPERTEXT_LINK_SELECTED"; + case ACC.EVENT_VALUE_CHANGED: return "EVENT_OBJECT_VALUECHANGE"; + case ACC.EVENT_STATE_CHANGED: return "EVENT_OBJECT_STATECHANGE"; + case ACC.EVENT_SELECTION_CHANGED: return "EVENT_OBJECT_SELECTIONWITHIN"; + case ACC.EVENT_TEXT_SELECTION_CHANGED: return "EVENT_OBJECT_TEXTSELECTIONCHANGED"; + case ACC.EVENT_LOCATION_CHANGED: return "EVENT_OBJECT_LOCATIONCHANGE"; + case ACC.EVENT_NAME_CHANGED: return "EVENT_OBJECT_NAMECHANGE"; + case ACC.EVENT_DESCRIPTION_CHANGED: return "EVENT_OBJECT_DESCRIPTIONCHANGE"; + case ACC.EVENT_DOCUMENT_LOAD_COMPLETE: return "IA2_EVENT_DOCUMENT_LOAD_COMPLETE"; + case ACC.EVENT_DOCUMENT_LOAD_STOPPED: return "IA2_EVENT_DOCUMENT_LOAD_STOPPED"; + case ACC.EVENT_DOCUMENT_RELOAD: return "IA2_EVENT_DOCUMENT_RELOAD"; + case ACC.EVENT_PAGE_CHANGED: return "IA2_EVENT_PAGE_CHANGED"; + case ACC.EVENT_SECTION_CHANGED: return "IA2_EVENT_SECTION_CHANGED"; + case ACC.EVENT_ACTION_CHANGED: return "IA2_EVENT_ACTION_CHANGED"; + case ACC.EVENT_HYPERLINK_START_INDEX_CHANGED: return "IA2_EVENT_HYPERLINK_START_INDEX_CHANGED"; + case ACC.EVENT_HYPERLINK_END_INDEX_CHANGED: return "IA2_EVENT_HYPERLINK_END_INDEX_CHANGED"; + case ACC.EVENT_HYPERLINK_ANCHOR_COUNT_CHANGED: return "IA2_EVENT_HYPERLINK_ANCHOR_COUNT_CHANGED"; + case ACC.EVENT_HYPERLINK_SELECTED_LINK_CHANGED: return "IA2_EVENT_HYPERLINK_SELECTED_LINK_CHANGED"; + case ACC.EVENT_HYPERLINK_ACTIVATED: return "IA2_EVENT_HYPERLINK_ACTIVATED"; + case ACC.EVENT_HYPERTEXT_LINK_COUNT_CHANGED: return "IA2_EVENT_HYPERTEXT_LINK_COUNT_CHANGED"; + case ACC.EVENT_ATTRIBUTE_CHANGED: return "IA2_EVENT_ATTRIBUTE_CHANGED"; + case ACC.EVENT_TABLE_CAPTION_CHANGED: return "IA2_EVENT_TABLE_CAPTION_CHANGED"; + case ACC.EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED: return "IA2_EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED"; + case ACC.EVENT_TABLE_COLUMN_HEADER_CHANGED: return "IA2_EVENT_TABLE_COLUMN_HEADER_CHANGED"; + case ACC.EVENT_TABLE_ROW_DESCRIPTION_CHANGED: return "IA2_EVENT_TABLE_ROW_DESCRIPTION_CHANGED"; + case ACC.EVENT_TABLE_ROW_HEADER_CHANGED: return "IA2_EVENT_TABLE_ROW_HEADER_CHANGED"; + case ACC.EVENT_TABLE_SUMMARY_CHANGED: return "IA2_EVENT_TABLE_SUMMARY_CHANGED"; + case ACC.EVENT_TEXT_ATTRIBUTE_CHANGED: return "IA2_EVENT_TEXT_ATTRIBUTE_CHANGED"; + case ACC.EVENT_TEXT_CARET_MOVED: return "IA2_EVENT_TEXT_CARET_MOVED"; + case ACC.EVENT_TEXT_COLUMN_CHANGED: return "IA2_EVENT_TEXT_COLUMN_CHANGED"; + } + return "Unknown event (" + event + ")"; + } + private String hresult(int code) { + if (DEBUG) switch (code) { + case COM.S_OK: return " S_OK"; + case COM.S_FALSE: return " S_FALSE"; + case COM.E_ACCESSDENIED: return " E_ACCESSDENIED"; + case COM.E_FAIL: return " E_FAIL"; + case COM.E_INVALIDARG: return " E_INVALIDARG"; + case COM.E_NOINTERFACE: return " E_NOINTERFACE"; + case COM.E_NOTIMPL: return " E_NOTIMPL"; + case COM.E_NOTSUPPORTED: return " E_NOTSUPPORTED"; + case COM.E_OUTOFMEMORY: return " E_OUTOFMEMORY"; + case COM.E_POINTER: return " E_POINTER"; + case COM.DISP_E_EXCEPTION: return " DISP_E_EXCEPTION"; + case COM.DISP_E_MEMBERNOTFOUND: return " DISP_E_MEMBERNOTFOUND"; + case COM.DISP_E_UNKNOWNINTERFACE: return " DISP_E_UNKNOWNINTERFACE"; + case COM.DISP_E_UNKNOWNNAME: return " DISP_E_UNKNOWNNAME"; + } + return " HRESULT=" + code; + } boolean interesting(GUID guid) { + if (DEBUG) { if (COM.IsEqualGUID(guid, COM.IIDIUnknown)) return true; if (COM.IsEqualGUID(guid, COM.IIDIAccessible)) return true; if (COM.IsEqualGUID(guid, COM.IIDIEnumVARIANT)) return true; @@ -4441,9 +4681,11 @@ public class Accessible { if (COM.IsEqualGUID(guid, COM.IIDIAccessibleImage)) return true; if (COM.IsEqualGUID(guid, COM.IIDIAccessibleApplication)) return true; if (COM.IsEqualGUID(guid, COM.IIDIAccessibleContext)) return true; + } return false; } String guidString(GUID guid) { + if (DEBUG) { final GUID IIDIAccessibleHandler = IIDFromString("{03022430-ABC4-11D0-BDE2-00AA001A1953}"); //$NON-NLS-1$ final GUID IIDIAccessor = IIDFromString("{0C733A8C-2A1C-11CE-ADE5-00AA0044773D}"); //$NON-NLS-1$ final GUID IIDIAdviseSink2 = IIDFromString("{00000125-0000-0000-C000-000000000046}"); //$NON-NLS-1$ @@ -4641,14 +4883,17 @@ public class Accessible { if (COM.IsEqualGUID(guid, IIDIAccIdentity)) return "IIDIAccIdentity"; if (COM.IsEqualGUID(guid, IIDIAccPropServer)) return "IIDIAccPropServer"; if (COM.IsEqualGUID(guid, IIDIAccPropServices)) return "IIDIAccPropServices"; + } return StringFromIID(guid); } static GUID IIDFromString(String lpsz) { + if (DEBUG) { int length = lpsz.length(); char[] buffer = new char[length + 1]; lpsz.getChars(0, length, buffer, 0); GUID lpiid = new GUID(); if (COM.IIDFromString(buffer, lpiid) == COM.S_OK) return lpiid; + } return null; } static String StringFromIID(GUID guid) { @@ -4667,5 +4912,10 @@ public class Accessible { } return zeros.substring(0, Math.max(0, length - tlen)) + t; } + public String toString () { + String toString = super.toString(); + if (DEBUG) return toString.substring(toString.lastIndexOf('.') + 1) + "(" + getRoleString(getRole()) + ")"; + return toString; + } // END DEBUG CODE } |