/*******************************************************************************
* Copyright (c) 2012 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.internal.cdt.ui.breakpoints;
import java.text.MessageFormat;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.cdt.debug.core.model.ICBreakpoint;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.tcf.internal.cdt.ui.Activator;
import org.eclipse.tcf.internal.cdt.ui.ImageCache;
import org.eclipse.tcf.internal.debug.model.ITCFConstants;
import org.eclipse.tcf.internal.debug.model.TCFBreakpointsModel;
import org.eclipse.ui.model.IWorkbenchAdapter;
/**
* Element which represents a breakpoint scope grouping in Breakpoints view.
*
* Scope grouping contains both a filter and context IDs string, however
* only one of them can be active on a breakpoint at one time.
*
*/
public class BreakpointScopeCategory extends PlatformObject implements IWorkbenchAdapter {
private static Object[] EMPTY_CHILDREN_ARRAY = new Object[0];
private String fFilter;
private String fContextIds;
public BreakpointScopeCategory(String filter, String contextIds) {
fFilter = filter;
fContextIds = contextIds;
}
public String getFilter() {
return fFilter;
}
public String getContextIds() {
return fContextIds;
}
/**
* Sets the given filter and context strings to all breakpoints which match
* the group's current scope settings.
*/
void setFilter(String filter, String contextIds) {
final List bps = findCategoryBreakpoints();
fFilter = filter;
fContextIds = contextIds;
if (bps.isEmpty()) return; // No breakpoints to update
try {
ResourcesPlugin.getWorkspace().run(
new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
for (ICBreakpoint bp : bps) {
getScopeExtension(bp).setPropertiesFilter(fFilter);
getScopeExtension(bp).setRawContextIds(fContextIds);
}
}
},
new NullProgressMonitor()
);
}
catch (CoreException e) {
Activator.log(e);
}
}
public String getLabel(Object o) {
if (getFilter() != null && getContextIds() != null) {
return MessageFormat.format(Messages.BreakpointScopeCategory_filter_and_contexts_label, new Object[] { getFilter(), getContextIds() });
} else if (getFilter() != null) {
return MessageFormat.format(Messages.BreakpointScopeCategory_filter_label, new Object[] { getFilter() });
} else if (getContextIds() != null) {
return MessageFormat.format(Messages.BreakpointScopeCategory_contexts_label, new Object[] { getContextIds() });
}
return Messages.BreakpointScopeCategory_global_label;
}
public ImageDescriptor getImageDescriptor(Object object) {
return ImageCache.getImageDescriptor(ImageCache.IMG_BREAKPOINT_SCOPE);
}
public Object[] getChildren(Object o) {
// Not used
return EMPTY_CHILDREN_ARRAY;
}
public Object getParent(Object o) {
// Not used
return null;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof BreakpointScopeCategory) {
BreakpointScopeCategory other = (BreakpointScopeCategory)obj;
return ((getFilter() == null && other.getFilter() == null) ||
(getFilter() != null && getFilter().equals(other.getFilter()))) &&
((getContextIds() == null && other.getContextIds() == null) ||
(getContextIds() != null && getContextIds().equals(other.getContextIds())));
}
return false;
}
@Override
public int hashCode() {
return (getFilter() != null ? getFilter().hashCode() : 0) +
(getContextIds() != null ? getContextIds().hashCode() : 0);
}
private List findCategoryBreakpoints() {
List categoryBreakpoints = new LinkedList();
IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints();
for (IBreakpoint bp : breakpoints) {
IMarker bpMarker = bp.getMarker();
if (bp instanceof ICBreakpoint && bpMarker != null) {
String filter = bpMarker.getAttribute(TCFBreakpointsModel.ATTR_CONTEXT_QUERY, (String)null);
String contextIds = bpMarker.getAttribute(TCFBreakpointsModel.ATTR_CONTEXTIDS, (String)null);
if( ((getFilter() == null && filter == null) ||
(getFilter() != null && getFilter().equals(filter))) &&
((getContextIds() == null && contextIds == null) ||
(getContextIds() != null && getContextIds().equals(contextIds))) )
{
categoryBreakpoints.add((ICBreakpoint)bp);
}
}
}
return categoryBreakpoints;
}
private TCFBreakpointScopeExtension getScopeExtension(ICBreakpoint bp) throws CoreException {
return (TCFBreakpointScopeExtension) bp.getExtension(
ITCFConstants.ID_TCF_DEBUG_MODEL, TCFBreakpointScopeExtension.class);
}
}