diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CloseUnrelatedProjectsAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CloseUnrelatedProjectsAction.java index 2e0901417b56..54eebcb244b0 100644 --- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CloseUnrelatedProjectsAction.java +++ b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CloseUnrelatedProjectsAction.java @@ -30,6 +30,7 @@ import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.IShellProvider; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Shell; @@ -130,6 +131,25 @@ public CloseUnrelatedProjectsAction(IShellProvider provider){ initAction(); } + /** + * Overrides to avoid calling the expensive + * {@code computeRelated(List)} during selection changes. Uses only + * the raw selection to determine enablement. + */ + @Override + protected boolean updateSelection(IStructuredSelection s) { + selectionDirty = true; + if (!selectionIsOfType(IResource.PROJECT)) { + return false; + } + for (IResource resource : super.getSelectedResources()) { + if (resource instanceof IProject project && project.isOpen()) { + return true; + } + } + return false; + } + @Override public void run() { if (promptForConfirmation()) {