/**
* Copyright (c) 2009-2011, The HATS Consortium. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package org.absmodels.abs.plugin.debug.views.debugview;
import static org.absmodels.abs.plugin.debug.DebugUtils.getDebugger;
import static org.absmodels.abs.plugin.util.Constants.EMPTY_OBJECT_ARRAY;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.absmodels.abs.plugin.debug.DebugUtils;
import org.absmodels.abs.plugin.debug.model.Objects;
import org.absmodels.abs.plugin.debug.model.Tasks;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Display;
import abs.backend.java.debugging.COGInfo;
import abs.backend.java.debugging.DebugModel;
import abs.backend.java.debugging.TaskInfo;
import abs.backend.java.observing.COGView;
import abs.backend.java.observing.TaskStackFrameView;
import abs.backend.java.observing.TaskStackView;
import abs.backend.java.observing.TaskView;
/**
* The TreeContentProvider for the TreeViewer of the DebugView. This class provides
* the structural information about the debug tree, i.e. what the children of specific
* elements are.
* @author tfischer
*/
public class DebugTreeContentProvider implements ITreeContentProvider{
private final class COGViewComparator implements Comparator<COGView> {
@Override
public int compare(COGView o1, COGView o2) {
return ((Integer)o1.getID()).compareTo(o2.getID());
}
}
@Override
public Object[] getChildren(Object parentElement) {
DebugModel model = getDebugger().getModel();
if(model != null && parentElement != null){
if(parentElement instanceof DebugModel){
List<COGView> cogs = ((DebugModel)parentElement).getCOGs();
Collections.sort(cogs, new COGViewComparator());
return cogs.toArray();
} else if(parentElement instanceof COGView){
COGView cog = (COGView)parentElement;
Tasks t = getDebugger().getTasks(cog);
Objects o = getDebugger().getObjects(cog);
return new Object[] {t, o};
} else if (parentElement instanceof Tasks){
return model.getTasks(((Tasks)parentElement).getCOG()).toArray();
} else if (parentElement instanceof Objects){
return ((Objects)parentElement).getObjects().toArray();
} else if(parentElement instanceof TaskView){
TaskView t = (TaskView)parentElement;
TaskStackView s = t.getStack();
ArrayList<TaskStackFrameView> list = new ArrayList<TaskStackFrameView>(s.getFrames());
Collections.reverse(list);
return list.toArray();
}
}
return EMPTY_OBJECT_ARRAY;
}
@Override
public Object[] getElements(Object elem) {
if (elem instanceof Object[]) {
return (Object[]) elem;
}
return EMPTY_OBJECT_ARRAY;
}
@Override
public Object getParent(Object element) {
//for working auto expansion, getParent needs to be implemented here.
if(element != null){
if(element instanceof TaskStackFrameView){
return ((TaskStackFrameView)element).getStack().getTask();
} else if(element instanceof TaskView){
return DebugUtils.getDebugger().getTasks(((TaskView)element).getCOG());
} else if(element instanceof Tasks){
return ((Tasks)element).getCOG();
} else if(element instanceof COGView){
return DebugUtils.getDebugger().getModel();
}
}
return null;
}
@Override
public boolean hasChildren(Object element) {
DebugModel model = getDebugger().getModel();
if(model != null && element != null){
if(element instanceof DebugModel){
return ((DebugModel)element).getCOGs().size() > 0;
} else if(element instanceof Tasks){
return model.getTasks(((Tasks)element).getCOG()).size() > 0;
} else if(element instanceof Objects){
return ((Objects)element).getObjects().size() > 0;
} else if(element instanceof COGView){
return true;
} else if(element instanceof TaskView){
TaskView task = (TaskView)element;
if(task.getStack() == null){
return false;
} else if(task.getStack().getFrames() == null){
return false;
} else{
return ((TaskView)element).getStack().getFrames().size() > 0;
}
}
}
return false;
}
@Override
public void dispose() { }
/**
* @exception SWTException might get thrown by asyncExec, if the reciever has been disposed
*/
@Override
public void inputChanged(final Viewer viewer, Object arg1, final Object arg2) {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
if(arg2 instanceof Object[] && ((Object[])arg2).length == 1
&& ((Object[])arg2)[0] != null && ((Object[])arg2)[0] instanceof DebugModel){
DebugModel debugModel = (DebugModel)((Object[])arg2)[0];
List<COGInfo> cogs = debugModel.getCOGInfos();
if(!cogs.isEmpty()){
List<TaskInfo> tasks = cogs.get(0).getTasks();
if(!tasks.isEmpty()){
TaskView taskView = tasks.get(0).getTaskView();
((TreeViewer)viewer).setSelection(new StructuredSelection(taskView));
}
}
}
}
});
}
}