package com.redhat.ceylon.eclipse.core.debug.presentation;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.model.IThread;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
import org.eclipse.jdt.debug.core.IJavaThreadGroup;
import org.eclipse.jdt.internal.debug.ui.monitors.JavaElementContentProvider;
import org.eclipse.jdt.internal.debug.ui.threadgroups.JavaDebugTargetContentProvider;
import com.redhat.ceylon.eclipse.core.debug.model.CeylonJDIDebugTarget;
import com.redhat.ceylon.ide.common.debug.agent.CeylonDebugEvaluationThread;
public class CeylonDebugTargetContentProvider extends
JavaDebugTargetContentProvider {
protected int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
int childCount = super.getChildCount(element, context, monitor);
if (childCount > 0) {
if (IDebugUIConstants.ID_DEBUG_VIEW.equals(context.getId())) {
if (element instanceof CeylonJDIDebugTarget) {
CeylonJDIDebugTarget target = (CeylonJDIDebugTarget) element;
if (JavaElementContentProvider.isDisplayThreadGroups()) {
if (target.hasCeylonEvaluationThreadGroup()) {
childCount --;
}
} else {
if (target.hasCeylonEvaluationThread()) {
childCount --;
}
}
}
}
}
return childCount;
}
@Override
protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
if (IDebugUIConstants.ID_DEBUG_VIEW.equals(context.getId())) {
if (JavaElementContentProvider.isDisplayThreadGroups()) {
List<IJavaThreadGroup> groups = new ArrayList<>();
for (IJavaThreadGroup group : ((IJavaDebugTarget)parent).getRootThreadGroups()) {
if (! CeylonDebugEvaluationThread.name.equals(group.getName())) {
groups.add(group);
}
}
return getElements(groups.toArray(new IJavaThreadGroup[groups.size()]), index, length);
} else {
List<IThread> threads = new ArrayList<>();
for (IThread thread : ((IJavaDebugTarget)parent).getThreads()) {
if (! CeylonDebugEvaluationThread.name.equals(thread.getName())) {
threads.add(thread);
}
}
return getElements(threads.toArray(new IThread[threads.size()]), index, length);
}
} else {
return super.getChildren(parent, index, length, context, monitor);
}
}
}