summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarolyn MacLeod <carolyn>2010-08-23 20:56:21 +0000
committerCarolyn MacLeod <carolyn>2010-08-23 20:56:21 +0000
commitb510a609efb167e4cea70fe9230f07370102b2c9 (patch)
tree3a922d3bf4e2563c12a1367e593ca994aa6d7bef
parentbbdac150fcb1dab1262b5a7dbd03d0bf78d2fa17 (diff)
downloadeclipse.platform.swt-b510a609efb167e4cea70fe9230f07370102b2c9.tar.gz
eclipse.platform.swt-b510a609efb167e4cea70fe9230f07370102b2c9.tar.xz
eclipse.platform.swt-b510a609efb167e4cea70fe9230f07370102b2c9.zip
Bug 320066 - DROP_DOWN ToolItems need accessible name
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Accessibility/win32/org/eclipse/swt/accessibility/Accessible.java61
1 files changed, 60 insertions, 1 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 2fec2a13dd..37d866a667 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
@@ -75,6 +75,7 @@ public class Accessible {
int [] tableChange; // type, rowStart, rowCount, columnStart, columnCount
Object [] textDeleted; // type, start, end, text
Object [] textInserted; // type, start, end, text
+ ToolItem item;
static {
String property = System.getProperty (PROPERTY_USEIA2);
@@ -92,6 +93,7 @@ public class Accessible {
* <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
* </ul>
*
+ * @see #dispose
* @see Control#getAccessible
*
* @since 3.6
@@ -127,6 +129,11 @@ public class Accessible {
AddRef();
}
+ Accessible(Accessible parent, int /*long*/ iaccessible_address) {
+ this(parent);
+ iaccessible = new IAccessible(iaccessible_address);
+ }
+
static Accessible checkNull (Accessible parent) {
if (parent == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
return parent;
@@ -1885,20 +1892,72 @@ public class Accessible {
COM.MoveMemory(ppdispChild, new int /*long*/[] { getAddress() }, OS.PTR_SIZEOF);
return COM.S_OK;
}
+ final int childID = osToChildID(v.lVal);
int code = COM.S_FALSE;
+ Accessible osAccessible = null;
if (iaccessible != null) {
/* Get the default child from the OS. */
code = iaccessible.get_accChild(varChild, ppdispChild);
if (code == COM.E_INVALIDARG) code = COM.S_FALSE; // proxy doesn't know about app childID
+ if (code == COM.S_OK && control instanceof ToolBar) {
+ ToolBar toolBar = (ToolBar) control;
+ final ToolItem item = toolBar.getItem(childID);
+ if (item != null && (item.getStyle() & SWT.DROP_DOWN) != 0) {
+ int /*long*/[] addr = new int /*long*/[1];
+ COM.MoveMemory(addr, ppdispChild, OS.PTR_SIZEOF);
+ boolean found = false;
+ for (int i = 0; i < children.size(); i++) {
+ Accessible accChild = (Accessible)children.elementAt(i);
+ if (accChild.item == item) {
+ /*
+ * MSAA uses a new accessible for the child
+ * so we dispose the old and use the new.
+ */
+ accChild.dispose();
+ accChild.item = null;
+ found = true;
+ break;
+ }
+ }
+ osAccessible = new Accessible(this, addr[0]);
+ osAccessible.item = item;
+ if (!found) {
+ item.addListener(SWT.Dispose, new Listener() {
+ public void handleEvent(Event e) {
+ for (int i = 0; i < children.size(); i++) {
+ Accessible accChild = (Accessible)children.elementAt(i);
+ if (accChild.item == item) {
+ accChild.dispose();
+ }
+ }
+ }
+ });
+ }
+ osAccessible.addAccessibleListener(new AccessibleAdapter() {
+ public void getName(AccessibleEvent e) {
+ if (e.childID == ACC.CHILDID_SELF) {
+ AccessibleEvent event = new AccessibleEvent(Accessible.this);
+ event.childID = childID;
+ for (int i = 0; i < accessibleListeners.size(); i++) {
+ AccessibleListener listener = (AccessibleListener) accessibleListeners.elementAt(i);
+ listener.getName(event);
+ }
+ e.result = event.result;
+ }
+ }
+ });
+ }
+ }
}
AccessibleControlEvent event = new AccessibleControlEvent(this);
- event.childID = osToChildID(v.lVal);
+ event.childID = childID;
for (int i = 0; i < accessibleControlListeners.size(); i++) {
AccessibleControlListener listener = (AccessibleControlListener) accessibleControlListeners.elementAt(i);
listener.getChild(event);
}
Accessible accessible = event.accessible;
+ if (accessible == null) accessible = osAccessible;
if (accessible != null) {
if (DEBUG) print(this + ".IAccessible::get_accChild(" + v.lVal + ") returning " + accessible.getAddress() + hresult(COM.S_OK));
accessible.AddRef();