diff --git a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/handlers/TraversePageHandler.java b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/handlers/TraversePageHandler.java index 3697e69de4a..a8435c3dce1 100644 --- a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/handlers/TraversePageHandler.java +++ b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/handlers/TraversePageHandler.java @@ -41,11 +41,12 @@ public final Object execute(final ExecutionEvent event) { int traversalDirection = translateToTraversalDirection(forward); Control control = focusControl; do { - if (control instanceof CTabFolder folder && isFinalItemInCTabFolder(folder, forward) - && !hasHiddenItem(folder)) { - loopToFirstOrLastItem(folder, forward); - traversalDirection = translateToTraversalDirection(!forward); // we are in the second-to-last item in the given - // direction. Now, use the Traverse-event to move back by one + if (control instanceof CTabFolder) { + CTabFolder folder = getTopLevelCTabFolderInParentHierarchy(control); + if (isFinalItemInCTabFolder(folder, forward) && !hasHiddenItem(folder)) { + loopToFirstOrLastItem(folder, forward); + traversalDirection = translateToTraversalDirection(!forward); + } } if (control.traverse(traversalDirection)) { return null; @@ -59,6 +60,22 @@ public final Object execute(final ExecutionEvent event) { return null; } + /** + * @param c a {@code Control}. + * @return the top-level {@code CTabFolder} in the parent hierarchy. + */ + private CTabFolder getTopLevelCTabFolderInParentHierarchy(Control c) { + Control current = c; + CTabFolder ret = null; + do { + if (current instanceof CTabFolder folder) { + ret = folder; + } + current = current.getParent(); + } while (current != null); + return ret; + } + private boolean hasHiddenItem(CTabFolder folder) { return Arrays.stream(folder.getItems()).anyMatch(i -> !i.isShowing()); }