Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Moffatt2012-06-21 19:20:09 +0000
committerEric Moffatt2012-06-21 19:20:09 +0000
commit7e4f7fe862a8927af779392e2478906c30695916 (patch)
tree49060def49609174ddff3af86ed955442c60e89b
parent15d628a715ffac802a765355aa74a2bed6064ef8 (diff)
downloadeclipse.platform.ui-7e4f7fe862a8927af779392e2478906c30695916.tar.gz
eclipse.platform.ui-7e4f7fe862a8927af779392e2478906c30695916.tar.xz
eclipse.platform.ui-7e4f7fe862a8927af779392e2478906c30695916.zip
Fix for Bug 376011 - [accessibility] Eclipse 4.2 tab traversal needsv20120621-192009
refining
-rw-r--r--bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java58
1 files changed, 58 insertions, 0 deletions
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java
index dfb1477d876..4b098dd9fe0 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java
@@ -15,8 +15,10 @@ import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
+import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.services.events.IEventBroker;
+import org.eclipse.e4.ui.di.Focus;
import org.eclipse.e4.ui.internal.workbench.renderers.swt.BasicPartList;
import org.eclipse.e4.ui.internal.workbench.renderers.swt.SWTRenderersMessages;
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
@@ -67,6 +69,8 @@ import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
@@ -94,6 +98,13 @@ public class StackRenderer extends LazyStackRenderer {
private static final String SHELL_CLOSE_EDITORS_MENU = "shell_close_editors_menu"; //$NON-NLS-1$
private static final String STACK_SELECTED_PART = "stack_selected_part"; //$NON-NLS-1$
+ /**
+ * Add this tag to prevent the next tab's activation from granting focus to
+ * the part. This is used to keep the focus on the CTF when traversing the
+ * tabs using the keyboard.
+ */
+ private static final String INHIBIT_FOCUS = "InhibitFocus"; //$NON-NLS-1$
+
// Minimum characters in for stacks outside the shared area
private static int MIN_VIEW_CHARS = 1;
@@ -204,6 +215,27 @@ public class StackRenderer extends LazyStackRenderer {
}
}
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer#requiresFocus
+ * (org.eclipse.e4.ui.model.application.ui.basic.MPart)
+ */
+ @Override
+ protected boolean requiresFocus(MPart element) {
+ MUIElement inStack = element.getCurSharedRef() != null ? element
+ .getCurSharedRef() : element;
+ if (inStack.getParent() != null
+ && inStack.getParent().getTransientData()
+ .containsKey(INHIBIT_FOCUS)) {
+ inStack.getParent().getTransientData().remove(INHIBIT_FOCUS);
+ return false;
+ }
+
+ return super.requiresFocus(element);
+ }
+
private boolean isValid(MUIElement element) {
if (element == null || !element.isToBeRendered()) {
return false;
@@ -835,6 +867,32 @@ public class StackRenderer extends LazyStackRenderer {
// Match the selected TabItem to its Part
final CTabFolder ctf = (CTabFolder) me.getWidget();
+
+ // Handle traverse events for accessibility
+ ctf.addTraverseListener(new TraverseListener() {
+ public void keyTraversed(TraverseEvent e) {
+ if (e.detail == SWT.TRAVERSE_ARROW_NEXT
+ || e.detail == SWT.TRAVERSE_ARROW_PREVIOUS) {
+ me.getTransientData().put(INHIBIT_FOCUS, true);
+ } else if (e.detail == SWT.TRAVERSE_RETURN) {
+ me.getTransientData().remove(INHIBIT_FOCUS);
+ CTabItem cti = ctf.getSelection();
+ if (cti != null) {
+ MUIElement stackElement = (MUIElement) cti
+ .getData(OWNING_ME);
+ if (stackElement instanceof MPlaceholder)
+ stackElement = ((MPlaceholder) stackElement)
+ .getRef();
+ if (stackElement instanceof MPart) {
+ MPart thePart = (MPart) stackElement;
+ ContextInjectionFactory.invoke(thePart.getObject(),
+ Focus.class, thePart.getContext());
+ }
+ }
+ }
+ }
+ });
+
ctf.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}

Back to the top