From ec10b70950716c3dfa163a0a9ed4a91b3b0dadaa Mon Sep 17 00:00:00 2001 From: Deepika Udayagiri Date: Fri, 9 Jan 2026 16:28:20 +0530 Subject: [PATCH 1/2] In Project Explorer, ensure "Select All" (Ctrl+A and menu) works reliably irrespective of first or subsequent selections. --- .../eclipse/ui/navigator/CommonNavigator.java | 68 +++++++++++++++++-- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigator.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigator.java index 7b2827d1efef..64c77bfabd7a 100644 --- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigator.java +++ b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigator.java @@ -16,6 +16,8 @@ *******************************************************************************/ package org.eclipse.ui.navigator; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.PerformanceStats; import org.eclipse.core.runtime.SafeRunner; @@ -29,18 +31,25 @@ import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IMemento; +import org.eclipse.ui.IPartListener2; import org.eclipse.ui.ISaveablePart; import org.eclipse.ui.ISaveablesLifecycleListener; import org.eclipse.ui.ISaveablesSource; import org.eclipse.ui.IViewSite; +import org.eclipse.ui.IWorkbenchCommandConstants; +import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.Saveable; import org.eclipse.ui.SaveablesLifecycleEvent; import org.eclipse.ui.actions.ActionGroup; +import org.eclipse.ui.handlers.IHandlerActivation; +import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.internal.navigator.CommonNavigatorActionGroup; import org.eclipse.ui.internal.navigator.NavigatorContentService; import org.eclipse.ui.internal.navigator.NavigatorPlugin; @@ -160,6 +169,8 @@ public class CommonNavigator extends ViewPart implements ISetSelectionTarget, IS private LinkHelperService linkService; + private IPartListener2 partListener; + public CommonNavigator() { super(); } @@ -255,6 +266,47 @@ public void handleLifecycleEvent(SaveablesLifecycleEvent event) { ColumnViewerToolTipSupport.enableFor(commonViewer); } + // Immediate fallback: handle Ctrl+A at the Tree level + commonViewer.getTree().addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + // MOD1 = Ctrl on Win/Linux, Command on macOS + if ((e.stateMask & SWT.MOD1) != 0 && (e.keyCode == 'a' || e.keyCode == 'A')) { + commonViewer.getTree().selectAll(); + e.doit = false; + } + } + }); + + // Activate the 'Select All' command handler when the view is active + partListener = new IPartListener2() { + private IHandlerActivation activation; + + @Override + public void partActivated(IWorkbenchPartReference ref) { + if (ref.getPart(false) == CommonNavigator.this) { + IHandlerService hs = getSite().getService(IHandlerService.class); + activation = hs.activateHandler(IWorkbenchCommandConstants.EDIT_SELECT_ALL, new AbstractHandler() { + @Override + public Object execute(ExecutionEvent event) { + commonViewer.getTree().selectAll(); + return null; + } + }); + } + } + + @Override + public void partDeactivated(IWorkbenchPartReference ref) { + if (ref.getPart(false) == CommonNavigator.this && activation != null) { + IHandlerService hs = getSite().getService(IHandlerService.class); + hs.deactivateHandler(activation); + activation = null; + } + } + }; + getSite().getPage().addPartListener(partListener); + stats.endRun(); } @@ -308,13 +360,17 @@ public String getFrameToolTipText(Object anElement) { */ @Override public void dispose() { - if (commonManager != null) { - commonManager.dispose(); - } - if (commonActionGroup != null) { - commonActionGroup.dispose(); + try { + getSite().getPage().removePartListener(partListener); + if (commonManager != null) { + commonManager.dispose(); + } + if (commonActionGroup != null) { + commonActionGroup.dispose(); + } + } finally { + super.dispose(); } - super.dispose(); } /** From dd7053818a04f93757dcf856ad683c8c16f9787f Mon Sep 17 00:00:00 2001 From: Deepika Udayagiri Date: Mon, 12 Jan 2026 15:30:54 +0530 Subject: [PATCH 2/2] Revised the fix as per the suggestion. --- bundles/org.eclipse.ui.navigator/plugin.xml | 13 +++- .../eclipse/ui/navigator/CommonNavigator.java | 68 ++----------------- .../CommonNavigatorSelectAllHandler.java | 36 ++++++++++ 3 files changed, 54 insertions(+), 63 deletions(-) create mode 100644 bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigatorSelectAllHandler.java diff --git a/bundles/org.eclipse.ui.navigator/plugin.xml b/bundles/org.eclipse.ui.navigator/plugin.xml index af55b54c8108..f99ac6e37865 100644 --- a/bundles/org.eclipse.ui.navigator/plugin.xml +++ b/bundles/org.eclipse.ui.navigator/plugin.xml @@ -13,5 +13,16 @@ id="org.eclipse.ui.navigator.PluginDropAction"> - + + + + + + + + + diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigator.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigator.java index 64c77bfabd7a..7b2827d1efef 100644 --- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigator.java +++ b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigator.java @@ -16,8 +16,6 @@ *******************************************************************************/ package org.eclipse.ui.navigator; -import org.eclipse.core.commands.AbstractHandler; -import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.PerformanceStats; import org.eclipse.core.runtime.SafeRunner; @@ -31,25 +29,18 @@ import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.KeyAdapter; -import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IMemento; -import org.eclipse.ui.IPartListener2; import org.eclipse.ui.ISaveablePart; import org.eclipse.ui.ISaveablesLifecycleListener; import org.eclipse.ui.ISaveablesSource; import org.eclipse.ui.IViewSite; -import org.eclipse.ui.IWorkbenchCommandConstants; -import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.Saveable; import org.eclipse.ui.SaveablesLifecycleEvent; import org.eclipse.ui.actions.ActionGroup; -import org.eclipse.ui.handlers.IHandlerActivation; -import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.internal.navigator.CommonNavigatorActionGroup; import org.eclipse.ui.internal.navigator.NavigatorContentService; import org.eclipse.ui.internal.navigator.NavigatorPlugin; @@ -169,8 +160,6 @@ public class CommonNavigator extends ViewPart implements ISetSelectionTarget, IS private LinkHelperService linkService; - private IPartListener2 partListener; - public CommonNavigator() { super(); } @@ -266,47 +255,6 @@ public void handleLifecycleEvent(SaveablesLifecycleEvent event) { ColumnViewerToolTipSupport.enableFor(commonViewer); } - // Immediate fallback: handle Ctrl+A at the Tree level - commonViewer.getTree().addKeyListener(new KeyAdapter() { - @Override - public void keyPressed(KeyEvent e) { - // MOD1 = Ctrl on Win/Linux, Command on macOS - if ((e.stateMask & SWT.MOD1) != 0 && (e.keyCode == 'a' || e.keyCode == 'A')) { - commonViewer.getTree().selectAll(); - e.doit = false; - } - } - }); - - // Activate the 'Select All' command handler when the view is active - partListener = new IPartListener2() { - private IHandlerActivation activation; - - @Override - public void partActivated(IWorkbenchPartReference ref) { - if (ref.getPart(false) == CommonNavigator.this) { - IHandlerService hs = getSite().getService(IHandlerService.class); - activation = hs.activateHandler(IWorkbenchCommandConstants.EDIT_SELECT_ALL, new AbstractHandler() { - @Override - public Object execute(ExecutionEvent event) { - commonViewer.getTree().selectAll(); - return null; - } - }); - } - } - - @Override - public void partDeactivated(IWorkbenchPartReference ref) { - if (ref.getPart(false) == CommonNavigator.this && activation != null) { - IHandlerService hs = getSite().getService(IHandlerService.class); - hs.deactivateHandler(activation); - activation = null; - } - } - }; - getSite().getPage().addPartListener(partListener); - stats.endRun(); } @@ -360,17 +308,13 @@ public String getFrameToolTipText(Object anElement) { */ @Override public void dispose() { - try { - getSite().getPage().removePartListener(partListener); - if (commonManager != null) { - commonManager.dispose(); - } - if (commonActionGroup != null) { - commonActionGroup.dispose(); - } - } finally { - super.dispose(); + if (commonManager != null) { + commonManager.dispose(); + } + if (commonActionGroup != null) { + commonActionGroup.dispose(); } + super.dispose(); } /** diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigatorSelectAllHandler.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigatorSelectAllHandler.java new file mode 100644 index 000000000000..a103fb881d2d --- /dev/null +++ b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigatorSelectAllHandler.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2003, 2026 IBM Corporation and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.ui.navigator; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.handlers.HandlerUtil; + +/** + * CommonNavigatorSelectAllHandler is the handler for the select all action. + * + * @since 3.14 + * + */ +public class CommonNavigatorSelectAllHandler extends AbstractHandler { + @Override + public Object execute(ExecutionEvent event) { + IWorkbenchPart part = HandlerUtil.getActivePart(event); + if (part instanceof CommonNavigator navigator) { + navigator.getCommonViewer().getTree().selectAll(); + } + return null; + } +}