blob: 5b39f7701ddc94f98372ae35323017be3759df38 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2013 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
* Freescale Semiconductor - bug 287863
* Patrick Chuong (Texas Instruments) - Improve usability of the breakpoint view (Bug 238956)
*******************************************************************************/
package org.eclipse.debug.internal.ui.actions.breakpointGroups;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointContainer;
import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
import org.eclipse.debug.internal.ui.views.breakpoints.WorkingSetCategory;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.TreePath;
/**
* Removes a breakpoint from a breakpoint working set.
*/
public class RemoveFromWorkingSetAction extends BreakpointSelectionAction {
private BreakpointSetElement[] fBreakpoints;
/**
* Constructs action to remove breakpoints from a category.
*
* @param view
*/
public RemoveFromWorkingSetAction(BreakpointsView view) {
super(BreakpointGroupMessages.RemoveFromWorkingSetAction_0, view);
}
@Override
public void run() {
if (fBreakpoints != null) {
for (int i = 0; i < fBreakpoints.length; i++) {
fBreakpoints[i].container.getOrganizer().removeBreakpoint(fBreakpoints[i].breakpoint, fBreakpoints[i].container.getCategory());
}
}
}
protected static class BreakpointSetElement {
BreakpointSetElement(IBreakpoint b, IBreakpointContainer c) { breakpoint = b; container = c; }
IBreakpoint breakpoint;
IBreakpointContainer container;
}
/**
* Returns a array of breakpoint/container pairs for the selection
*
* All the returned elements contain a breakpoint and a working set container the breakpoint is contained and the breakpoint
* can be removed from.
*
* @param selection
* @return
*/
protected BreakpointSetElement[] getRemovableBreakpoints(IStructuredSelection selection) {
List<BreakpointSetElement> res = new ArrayList<>();
if (selection instanceof ITreeSelection) {
ITreeSelection tSel = (ITreeSelection)selection;
TreePath[] paths = tSel.getPaths();
for (int i = 0; i < paths.length; i++) {
TreePath path = paths[i];
// We can remove Breakpoints from their working set if any of their parents is a non "Other" breakpoint working set
IBreakpoint breakpoint = (IBreakpoint)DebugPlugin.getAdapter(path.getLastSegment(), IBreakpoint.class);
if (breakpoint != null) {
TreePath parents = path.getParentPath();
for (int j = 0; j < parents.getSegmentCount(); j++) {
Object parent = parents.getSegment(j);
if (parent instanceof IBreakpointContainer) {
IBreakpointContainer container = (IBreakpointContainer)parent;
// Test if this is a working set container.
if (container.getCategory() instanceof WorkingSetCategory) {
// Test if this container allows to remove this breakpoint.
if (container.getOrganizer().canRemove(breakpoint, container.getCategory())) {
res.add(new BreakpointSetElement(breakpoint, container));
}
}
}
}
}
}
}
return res.toArray(new BreakpointSetElement[res.size()]);
}
@Override
public boolean isEnabled() {
if(fBreakpoints != null) {
return fBreakpoints.length > 0;
}
return false;
}
@Override
protected boolean updateSelection(IStructuredSelection selection) {
fBreakpoints = getRemovableBreakpoints(selection);
return fBreakpoints.length > 0;
}
}