diff options
| author | Eric Moffatt | 2012-06-21 19:20:09 +0000 |
|---|---|---|
| committer | Eric Moffatt | 2012-06-21 19:20:09 +0000 |
| commit | 7e4f7fe862a8927af779392e2478906c30695916 (patch) | |
| tree | 49060def49609174ddff3af86ed955442c60e89b | |
| parent | 15d628a715ffac802a765355aa74a2bed6064ef8 (diff) | |
| download | eclipse.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.java | 58 |
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) { } |
