/**
* 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.variablesview;
import java.util.ArrayList;
import org.absmodels.abs.plugin.debug.model.VariableValuePair;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import abs.backend.java.lib.runtime.ABSObject;
import abs.backend.java.observing.ObjectView;
import abs.backend.java.observing.TaskStackFrameView;
/**
* The TreeContentProvider for the TreeViewer of the VariableView. This class provides
* the structural information about the variable / object tree, i.e. what the children of specific
* elements are.
* @author tfischer
*/
public class VariableContentProvider implements ITreeContentProvider {
@Override
public Object[] getChildren(Object parentElement) {
if(parentElement != null){
if(parentElement instanceof TaskStackFrameView){
TaskStackFrameView stackFrame = (TaskStackFrameView) parentElement;
ArrayList<VariableValuePair> children = new ArrayList<VariableValuePair>();
for(String variableName : stackFrame.getVariableNames()){
children.add(new VariableValuePair(variableName, stackFrame.getValue(variableName)));
}
return children.toArray();
} else if(parentElement instanceof ObjectView){
ObjectView obj = (ObjectView)parentElement;
ArrayList<VariableValuePair> children = new ArrayList<VariableValuePair>();
for(String fieldName : obj.getFieldNames()){
try {
children.add(new VariableValuePair(fieldName, obj.getFieldValue(fieldName)));
} catch (NoSuchFieldException e) {
//can never happen. Since we iterate over the field names, the field is guaranteed
//to exist as long as the objectView is implemented correctly.
}
}
return children.toArray();
} else if(parentElement instanceof VariableValuePair){
return getChildren(((VariableValuePair)parentElement).getValue());
} else if(parentElement instanceof ABSObject){
return getChildren(((ABSObject)parentElement).getView());
}
}
//single (or unknown) value - no children
return new Object[0];
}
@Override
public Object[] getElements(Object inputElement) {
if (inputElement != null){
if (inputElement instanceof TaskStackFrameView
|| inputElement instanceof ObjectView){
return getChildren(inputElement);
} else if (inputElement instanceof Object[]) {
return (Object[]) inputElement;
}
}
return new Object[0];
}
@Override
public boolean hasChildren(Object element) {
if(element instanceof TaskStackFrameView){
TaskStackFrameView stackFrame = (TaskStackFrameView)element;
if(stackFrame.getStack() == null){
return false;
} else{
return stackFrame.getStack().getFrames().size() > 0;
}
} else if(element instanceof ObjectView){
return ((ObjectView)element).getFieldNames().size() > 0;
} else if(element instanceof VariableValuePair){
return hasChildren(((VariableValuePair)element).getValue());
} else if(element instanceof ABSObject){
return hasChildren(((ABSObject)element).getView());
} else{
return false;
}
}
@Override
public Object getParent(Object element) {
//unnecessary to implement this method here
return null;
}
@Override
public void dispose() { }
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { }
}