Skip to content

Commit 05972e9

Browse files
committed
Filter to projects in action classes instead of anonymous overrides
Move the project-filtering logic from anonymous getSelectedResources() overrides in ResourceMgmtActionProvider into the action classes themselves (OpenResourceAction, CloseResourceAction, CloseUnrelatedProjectsAction). This fixes the API analysis build failure caused by illegally subclassing these action classes. The updateSelection() methods now filter getSelectedResources() to IProject instances, so mixed selections (e.g. Ctrl+A) correctly enable/disable Open/Close Project actions. The resourceChanged() methods also use stream-based project checks instead of selectionIsOfType() to react properly to project state changes during mixed selections.
1 parent e1e0229 commit 05972e9

File tree

4 files changed

+15
-35
lines changed

4 files changed

+15
-35
lines changed

bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CloseResourceAction.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package org.eclipse.ui.actions;
1717

1818
import java.util.ArrayList;
19-
import java.util.Iterator;
2019
import java.util.List;
2120

2221
import org.eclipse.core.resources.IFile;
@@ -229,15 +228,14 @@ protected boolean updateSelection(IStructuredSelection s) {
229228
// don't call super since we want to enable if open project is selected.
230229
setText(defaultText);
231230
setToolTipText(defaultToolTip);
232-
List<? extends IResource> selectedResources = getSelectedResources();
233-
if (selectedResources.isEmpty() || selectedResources.stream().anyMatch(r -> !(r instanceof IProject))) {
231+
List<IProject> projects = getSelectedResources().stream()
232+
.filter(IProject.class::isInstance).map(IProject.class::cast).toList();
233+
if (projects.isEmpty()) {
234234
return false;
235235
}
236236

237237
boolean hasOpenProjects = false;
238-
Iterator<? extends IResource> resources = selectedResources.iterator();
239-
while (resources.hasNext()) {
240-
IProject currentResource = (IProject) resources.next();
238+
for (IProject currentResource : projects) {
241239
if (currentResource.isOpen()) {
242240
if (hasOpenProjects) {
243241
setText(pluralText);
@@ -259,7 +257,7 @@ public synchronized void resourceChanged(IResourceChangeEvent event) {
259257
// Warning: code duplicated in OpenResourceAction
260258
List<? extends IResource> sel = getSelectedResources();
261259
// don't bother looking at delta if selection not applicable
262-
if (selectionIsOfType(IResource.PROJECT)) {
260+
if (sel.stream().anyMatch(IProject.class::isInstance)) {
263261
IResourceDelta delta = event.getDelta();
264262
if (delta != null) {
265263
IResourceDelta[] projDeltas = delta.getAffectedChildren(IResourceDelta.CHANGED);

bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CloseUnrelatedProjectsAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ protected List<? extends IResource> getSelectedResources() {
262262
public void resourceChanged(IResourceChangeEvent event) {
263263
// don't bother looking at delta if selection not applicable
264264
List<? extends IResource> selectedResources = super.getSelectedResources();
265-
if (!selectedResources.isEmpty() && selectedResources.stream().allMatch(r -> r instanceof IProject)) {
265+
if (selectedResources.stream().anyMatch(IProject.class::isInstance)) {
266266
IResourceDelta delta = event.getDelta();
267267
if (delta != null) {
268268
IResourceDelta[] projDeltas = delta.getAffectedChildren(IResourceDelta.CHANGED);

bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/OpenResourceAction.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ public void resourceChanged(IResourceChangeEvent event) {
190190
// Warning: code duplicated in CloseResourceAction
191191
List<? extends IResource> sel = getSelectedResources();
192192
// don't bother looking at delta if selection not applicable
193-
if (selectionIsOfType(IResource.PROJECT)) {
193+
if (sel.stream().anyMatch(IProject.class::isInstance)) {
194194
IResourceDelta delta = event.getDelta();
195195
if (delta != null) {
196196
IResourceDelta[] projDeltas = delta.getAffectedChildren(IResourceDelta.CHANGED);
@@ -304,14 +304,15 @@ protected boolean updateSelection(IStructuredSelection s) {
304304
// selected.
305305
setText(IDEWorkbenchMessages.OpenResourceAction_text);
306306
setToolTipText(IDEWorkbenchMessages.OpenResourceAction_toolTip);
307-
List<? extends IResource> selectedResources = getSelectedResources();
308-
if (selectedResources.isEmpty() || selectedResources.stream().anyMatch(r -> !(r instanceof IProject))) {
307+
List<IProject> projects = getSelectedResources().stream()
308+
.filter(IProject.class::isInstance).map(IProject.class::cast).toList();
309+
if (projects.isEmpty()) {
309310
return false;
310311
}
311312

312313
boolean hasClosedProjects = false;
313-
for (IResource currentResource : selectedResources) {
314-
if (!((IProject) currentResource).isOpen()) {
314+
for (IProject currentResource : projects) {
315+
if (!currentResource.isOpen()) {
315316
if (hasClosedProjects) {
316317
setText(IDEWorkbenchMessages.OpenResourceAction_text_plural);
317318
setToolTipText(IDEWorkbenchMessages.OpenResourceAction_toolTip_plural);

bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/ResourceMgmtActionProvider.java

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323
import org.eclipse.core.resources.ICommand;
2424
import org.eclipse.core.resources.IProject;
25-
import org.eclipse.core.resources.IResource;
2625
import org.eclipse.core.resources.IncrementalProjectBuilder;
2726
import org.eclipse.core.resources.ResourcesPlugin;
2827
import org.eclipse.core.resources.WorkspaceJob;
@@ -208,29 +207,11 @@ boolean hasBuilder(IProject project) {
208207
protected void makeActions() {
209208
IShellProvider sp = () -> shell;
210209

211-
openProjectAction = new OpenResourceAction(sp) {
212-
@Override
213-
protected synchronized List<? extends IResource> getSelectedResources() {
214-
return super.getSelectedResources().stream()
215-
.filter(IProject.class::isInstance).toList();
216-
}
217-
};
210+
openProjectAction = new OpenResourceAction(sp);
218211

219-
closeProjectAction = new CloseResourceAction(sp) {
220-
@Override
221-
protected synchronized List<? extends IResource> getSelectedResources() {
222-
return super.getSelectedResources().stream()
223-
.filter(IProject.class::isInstance).toList();
224-
}
225-
};
212+
closeProjectAction = new CloseResourceAction(sp);
226213

227-
closeUnrelatedProjectsAction = new CloseUnrelatedProjectsAction(sp) {
228-
@Override
229-
protected List<? extends IResource> getSelectedResources() {
230-
return super.getSelectedResources().stream()
231-
.filter(IProject.class::isInstance).toList();
232-
}
233-
};
214+
closeUnrelatedProjectsAction = new CloseUnrelatedProjectsAction(sp);
234215

235216
refreshAction = new RefreshAction(sp) {
236217
@Override

0 commit comments

Comments
 (0)