From 2aa86f68e7d8805e57710e95945a28bb0c0ef75d Mon Sep 17 00:00:00 2001 From: Federico Jeanne Date: Tue, 25 Nov 2025 10:50:32 +0100 Subject: [PATCH] Fix traversal of CTabFolders with PgUp/PgDown #2864 When traversing from an editor with tabs (e.g. a POM or MANIFEST editor), which is a CTabFolder itself, I made sure that the traversal happens from the top-level CTabFolder i.e. from the one that contains all open editors instead of trying to traverse inside the editor itself. Fixes https://github.com/eclipse-platform/eclipse.platform.ui/issues/2864 Co-authored-by: Christopher Hermann Co-authored-by: Matthias Becker --- .../handlers/TraversePageHandler.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) 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()); }