From 41fc995e4ce5b80b809a0f183f4d93804a3377cb Mon Sep 17 00:00:00 2001 From: Tanish Ranjan Date: Sun, 9 Feb 2025 19:14:34 +0530 Subject: [PATCH] Added toggle for filtering failed tasks This commit introduces a toggle action to filter out successful tasks from the execution page and expand all failed tasks. --- .../ui/internal/i18n/UiMessages.java | 1 + .../view/ExpandAllFailedTasksAction.java | 97 +++++++++++++++++++ .../view/execution/ExecutionPage.java | 4 + .../ExecutionPageContentProvider.java | 24 ++++- .../view/task/UiContributionManager.java | 2 + .../ui/internal/i18n/UiMessages.properties | 1 + 6 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/ExpandAllFailedTasksAction.java diff --git a/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/i18n/UiMessages.java b/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/i18n/UiMessages.java index 3b042be2f..663d88d0b 100644 --- a/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/i18n/UiMessages.java +++ b/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/i18n/UiMessages.java @@ -23,6 +23,7 @@ public final class UiMessages extends NLS { public static String Button_Label_Browse; + public static String Action_FilterFailedTasks_Tooltip; public static String Action_ExpandNodes_Tooltip; public static String Action_CollapseNodes_Tooltip; public static String Action_ShowFilter_Tooltip; diff --git a/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/ExpandAllFailedTasksAction.java b/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/ExpandAllFailedTasksAction.java new file mode 100644 index 000000000..e934dad3d --- /dev/null +++ b/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/ExpandAllFailedTasksAction.java @@ -0,0 +1,97 @@ +/******************************************************************************* + * Copyright (c) 2023 Gradle Inc. and others + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + ******************************************************************************/ +package org.eclipse.buildship.ui.internal.view; + +import org.gradle.tooling.events.FailureResult; +import org.gradle.tooling.events.FinishEvent; +import org.gradle.tooling.events.OperationResult; + +import com.google.common.base.Preconditions; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.viewers.AbstractTreeViewer; + +import org.eclipse.buildship.ui.internal.PluginImages; +import org.eclipse.buildship.ui.internal.PluginImage.ImageState; +import org.eclipse.buildship.ui.internal.i18n.UiMessages; +import org.eclipse.buildship.ui.internal.util.nodeselection.NodeSelection; +import org.eclipse.buildship.ui.internal.util.nodeselection.SelectionSpecificAction; +import org.eclipse.buildship.ui.internal.view.execution.ExecutionPageContentProvider; +import org.eclipse.buildship.ui.internal.view.execution.OperationItem; + +/** + * + */ +public final class ExpandAllFailedTasksAction extends Action implements SelectionSpecificAction { + + private final AbstractTreeViewer treeViewer; + private ExecutionPageContentProvider contentProvider = null; + + public ExpandAllFailedTasksAction(AbstractTreeViewer treeViewer) { + super(null, AS_CHECK_BOX); + this.treeViewer = Preconditions.checkNotNull(treeViewer); + + + setToolTipText(UiMessages.Action_FilterFailedTasks_Tooltip); + setImageDescriptor(PluginImages.OPERATION_FAILURE.withState(ImageState.ENABLED).getImageDescriptor()); + } + + public void setContentProvider(ExecutionPageContentProvider contentProvider) { + this.contentProvider = contentProvider; + setChecked(contentProvider.isFilterFailedItemsEnabled()); + } + + @Override + public void run() { + + this.contentProvider.toggleFilterFailedItems(); + setChecked(this.contentProvider.isFilterFailedItemsEnabled()); + + this.treeViewer.collapseAll(); + + Object rootObject = this.treeViewer.getInput(); + + if (rootObject instanceof OperationItem) { + OperationItem root = (OperationItem) rootObject; + recursivelyExpand(root); + } + + } + + private void recursivelyExpand(OperationItem parent) { + FinishEvent event = parent.getFinishEvent(); + if (event != null) { + OperationResult result = event.getResult(); + if (result instanceof FailureResult) { + // Result failed (expand ancestors up to this element) + this.treeViewer.expandToLevel(parent, 0); + } + } + for (OperationItem item: parent.getChildren()) { + recursivelyExpand(item); + } + } + + @Override + public boolean isVisibleFor(NodeSelection selection) { + return true; + } + + @Override + public boolean isEnabledFor(NodeSelection selection) { + return true; + } + + @Override + public void setEnabledFor(NodeSelection selection) { + setEnabled(this.contentProvider != null); + } + +} diff --git a/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/execution/ExecutionPage.java b/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/execution/ExecutionPage.java index c3a8cc839..ac6ae68b1 100644 --- a/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/execution/ExecutionPage.java +++ b/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/execution/ExecutionPage.java @@ -59,6 +59,7 @@ import org.eclipse.buildship.ui.internal.util.widget.PatternFilter; import org.eclipse.buildship.ui.internal.view.BasePage; import org.eclipse.buildship.ui.internal.view.CollapseAllTreeNodesAction; +import org.eclipse.buildship.ui.internal.view.ExpandAllFailedTasksAction; import org.eclipse.buildship.ui.internal.view.ExpandAllTreeNodesAction; import org.eclipse.buildship.ui.internal.view.MultiPageView; import org.eclipse.buildship.ui.internal.view.PageSite; @@ -290,6 +291,9 @@ private void populateToolBar() { toolbarManager.appendToGroup(MultiPageView.PAGE_GROUP, new ExpandAllTreeNodesAction(getPageControl().getViewer())); toolbarManager.appendToGroup(MultiPageView.PAGE_GROUP, new CollapseAllTreeNodesAction(getPageControl().getViewer())); toolbarManager.appendToGroup(MultiPageView.PAGE_GROUP, new ShowFilterAction(getPageControl())); + ExpandAllFailedTasksAction action = new ExpandAllFailedTasksAction(getPageControl().getViewer()); + action.setContentProvider((ExecutionPageContentProvider)getPageControl().getViewer().getContentProvider()); + toolbarManager.appendToGroup(MultiPageView.PAGE_GROUP, action); toolbarManager.appendToGroup(MultiPageView.PAGE_GROUP, new Separator()); toolbarManager.appendToGroup(MultiPageView.PAGE_GROUP, new SwitchToConsoleViewAction(this)); toolbarManager.appendToGroup(MultiPageView.PAGE_GROUP, new Separator()); diff --git a/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/execution/ExecutionPageContentProvider.java b/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/execution/ExecutionPageContentProvider.java index ec984c9a1..4d90ae1c9 100644 --- a/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/execution/ExecutionPageContentProvider.java +++ b/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/execution/ExecutionPageContentProvider.java @@ -9,6 +9,10 @@ ******************************************************************************/ package org.eclipse.buildship.ui.internal.view.execution; +import java.util.stream.Collectors; + +import org.gradle.tooling.events.FailureResult; + import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; @@ -17,6 +21,8 @@ */ public class ExecutionPageContentProvider implements ITreeContentProvider { + private boolean filterFailedItems = false; + @Override public Object[] getElements(Object inputElement) { return getChildren(inputElement); @@ -24,7 +30,15 @@ public Object[] getElements(Object inputElement) { @Override public Object[] getChildren(Object parent) { - return parent instanceof OperationItem ? ((OperationItem)parent).getChildren().toArray() : new Object[0]; + if (this.isFilterFailedItemsEnabled()) { + if (parent instanceof OperationItem) { + return ((OperationItem)parent).getChildren().stream().filter(operationItem -> operationItem.getFinishEvent().getResult() instanceof FailureResult).collect(Collectors.toList()).toArray(); + } else { + return new Object[0]; + } + } else { + return parent instanceof OperationItem ? ((OperationItem)parent).getChildren().toArray() : new Object[0]; + } } @Override @@ -44,4 +58,12 @@ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { @Override public void dispose() { } + + public boolean isFilterFailedItemsEnabled() { + return this.filterFailedItems; + } + + public void toggleFilterFailedItems() { + this.filterFailedItems = !this.filterFailedItems; + } } diff --git a/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/task/UiContributionManager.java b/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/task/UiContributionManager.java index 1549b560f..4a5c3f3be 100644 --- a/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/task/UiContributionManager.java +++ b/org.eclipse.buildship.ui/src/main/java/org/eclipse/buildship/ui/internal/view/task/UiContributionManager.java @@ -27,6 +27,7 @@ import org.eclipse.buildship.ui.internal.util.nodeselection.SelectionSpecificAction; import org.eclipse.buildship.ui.internal.util.selection.ContextActivatingViewPartListener; import org.eclipse.buildship.ui.internal.view.CollapseAllTreeNodesAction; +import org.eclipse.buildship.ui.internal.view.ExpandAllFailedTasksAction; import org.eclipse.buildship.ui.internal.view.ExpandAllTreeNodesAction; import org.eclipse.buildship.ui.internal.view.ShowFilterAction; @@ -94,6 +95,7 @@ public void wire() { private void populateToolBar() { IToolBarManager manager = this.taskView.getViewSite().getActionBars().getToolBarManager(); manager.add(new GroupMarker(TOOLBAR_TREE_GROUP)); + manager.appendToGroup(TOOLBAR_TREE_GROUP, new ExpandAllFailedTasksAction(this.taskView.getTreeViewer())); manager.appendToGroup(TOOLBAR_TREE_GROUP, new ExpandAllTreeNodesAction(this.taskView.getTreeViewer())); manager.appendToGroup(TOOLBAR_TREE_GROUP, new CollapseAllTreeNodesAction(this.taskView.getTreeViewer())); manager.appendToGroup(TOOLBAR_TREE_GROUP, new ShowFilterAction(this.taskView.getFilteredTree())); diff --git a/org.eclipse.buildship.ui/src/main/resources/org/eclipse/buildship/ui/internal/i18n/UiMessages.properties b/org.eclipse.buildship.ui/src/main/resources/org/eclipse/buildship/ui/internal/i18n/UiMessages.properties index 7acac4166..60defdd0e 100644 --- a/org.eclipse.buildship.ui/src/main/resources/org/eclipse/buildship/ui/internal/i18n/UiMessages.properties +++ b/org.eclipse.buildship.ui/src/main/resources/org/eclipse/buildship/ui/internal/i18n/UiMessages.properties @@ -12,6 +12,7 @@ Title_Gradle_Build_Script_Compare=Gradle Build Script Compare Button_Label_Browse=Browse... +Action_FilterFailedTasks_Tooltip=Filter Failed Tasks Action_ExpandNodes_Tooltip=Expand All Action_CollapseNodes_Tooltip=Collapse All Action_ShowFilter_Tooltip=Show Filter