Accessibility: associate labels with FilteredCheckboxTrees

Screen readers cannot detect which label belongs to a
FilteredCheckboxTree automatically. Set an AccessibilityListener
providing a "name" for the trees from the label's text.

Bug: 574933
Change-Id: Ia9a891774850a616b15e5122a8fd7dbc33cd003a
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIUtils.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIUtils.java
index 90298cf..d5f4538 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIUtils.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIUtils.java
@@ -64,6 +64,8 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.accessibility.AccessibleAdapter;
+import org.eclipse.swt.accessibility.AccessibleEvent;
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.events.KeyEvent;
@@ -81,6 +83,7 @@
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.swt.widgets.ToolBar;
 import org.eclipse.swt.widgets.ToolItem;
@@ -806,6 +809,25 @@
 	}
 
 	/**
+	 * Associate a label with a control to make it known to screen readers and
+	 * similar accessibility tools.
+	 *
+	 * @param control
+	 *            to associate the label with
+	 * @param label
+	 *            to associate with the control
+	 */
+	public static void associateLabel(Control control, Label label) {
+		control.getAccessible().addAccessibleListener(new AccessibleAdapter() {
+
+			@Override
+			public void getName(AccessibleEvent e) {
+				e.result = label.getText();
+			}
+		});
+	}
+
+	/**
 	 * Run command with specified id
 	 *
 	 * @param service
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitProjectsImportPage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitProjectsImportPage.java
index ceebedb..a65248a 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitProjectsImportPage.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitProjectsImportPage.java
@@ -31,6 +31,7 @@
 import org.eclipse.core.runtime.SubMonitor;
 import org.eclipse.egit.core.internal.util.ProjectUtil;
 import org.eclipse.egit.ui.Activator;
+import org.eclipse.egit.ui.UIUtils;
 import org.eclipse.egit.ui.internal.GitLabelProvider;
 import org.eclipse.egit.ui.internal.UIText;
 import org.eclipse.egit.ui.internal.components.CachedCheckboxTreeViewer;
@@ -209,6 +210,7 @@
 				listComposite, null, SWT.NONE, filter);
 
 		filteredTree.setInitialText(UIText.WizardProjectsImportPage_filterText);
+		UIUtils.associateLabel(filteredTree.getFilterControl(), title);
 		projectsList = filteredTree.getCheckboxTreeViewer();
 		GridData listData = new GridData(GridData.GRAB_HORIZONTAL
 				| GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/SourceBranchPage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/SourceBranchPage.java
index 3af27e6..578788e 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/SourceBranchPage.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/SourceBranchPage.java
@@ -29,6 +29,7 @@
 import org.eclipse.egit.core.settings.GitSettings;
 import org.eclipse.egit.ui.Activator;
 import org.eclipse.egit.ui.UIPreferences;
+import org.eclipse.egit.ui.UIUtils;
 import org.eclipse.egit.ui.internal.CommonUtils;
 import org.eclipse.egit.ui.internal.UIIcons;
 import org.eclipse.egit.ui.internal.UIText;
@@ -161,6 +162,7 @@
 				return refreshJob;
 			}
 		};
+		UIUtils.associateLabel(fTree.getFilterControl(), label);
 		refsViewer = fTree.getCheckboxTreeViewer();
 
 		ITreeContentProvider provider = new ITreeContentProvider() {
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushTagsPage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushTagsPage.java
index 4943dba..8e92659 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushTagsPage.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushTagsPage.java
@@ -17,6 +17,7 @@
 import java.util.List;
 import java.util.Set;
 
+import org.eclipse.egit.ui.UIUtils;
 import org.eclipse.egit.ui.internal.CommonUtils;
 import org.eclipse.egit.ui.internal.UIText;
 import org.eclipse.egit.ui.internal.components.CachedCheckboxTreeViewer;
@@ -111,6 +112,7 @@
 				SWT.BORDER);
 		tree.setLayoutData(GridDataFactory.fillDefaults().grab(true, true)
 				.span(2, 1).hint(400, 300).create());
+		UIUtils.associateLabel(tree.getFilterControl(), tagsLabel);
 
 		final Button forceUpdateButton = new Button(main, SWT.CHECK);
 		forceUpdateButton