package org.jactr.eclipse.runtime.ui.simple;
/*
* default logging
*/
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import javolution.util.FastList;
import org.antlr.runtime.tree.CommonTree;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Composite;
import org.jactr.eclipse.runtime.session.ISession;
import org.jactr.eclipse.ui.content.ACTRLabelProvider;
import org.jactr.eclipse.ui.content.AbstractACTRContentProvider;
import org.jactr.io.antlr3.builder.JACTRBuilder;
import org.jactr.io.antlr3.misc.ASTSupport;
public abstract class SimpleVerticalASTViewComponent implements
IOrientedComponent
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(SimpleVerticalASTViewComponent.class);
private TreeViewer _treeViewer;
private ASTSupport _astSupport = new ASTSupport();
private ACTRLabelProvider _labelProvider = new ACTRLabelProvider();
private ITreeContentProvider _contentProvider = new AbstractACTRContentProvider() {
public void inputChanged(
Viewer viewer,
Object oldInput,
Object newInput)
{
if (newInput instanceof CommonTree)
setRoot((CommonTree) newInput);
}
};
public void dispose()
{
_treeViewer.getTree().dispose();
_treeViewer = null;
}
public void createPartControl(Composite parent)
{
_treeViewer = new TreeViewer(parent);
_treeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
_treeViewer.setContentProvider(_contentProvider);
_treeViewer.setLabelProvider(_labelProvider);
}
/**
* @param session
* @param modelName
* @param time
* @param isPostConflictResolution
* @param container
*/
abstract protected void getAST(ISession session, String modelName,
double time, boolean isPostConflictResolution,
Collection<CommonTree> container);
public void setData(ISession session, String modelName, double time,
boolean isPostConflictResolution)
{
final FastList<CommonTree> trees = FastList.newInstance();
getAST(session, modelName, time, isPostConflictResolution, trees);
if (trees.size() == 0)
{
noAST();
FastList.recycle(trees);
return;
}
Collection<Object> collapsedElements = new LinkedList<Object>();
getCollapsedEntries(_treeViewer.getInput(), collapsedElements);
/*
* combine the asts
*/
CommonTree root = _astSupport.create(JACTRBuilder.MODEL, "data");
for (CommonTree tree : trees)
root.addChild(tree);
_treeViewer.getTree().setRedraw(false);
_treeViewer.setInput(root);
collapseElements(root, collapsedElements);
_treeViewer.getTree().setRedraw(true);
}
public void noAST()
{
_treeViewer.setInput(_astSupport.create(JACTRBuilder.MODEL, "no data"));
}
public void setFocus()
{
_treeViewer.getTree().setFocus();
}
private void getCollapsedEntries(Object element,
Collection<Object> collapsedElements)
{
getCollapsedEntries(element, collapsedElements, "", 0);
}
private void getCollapsedEntries(Object element,
Collection<Object> collapsedElements, String prefix, int index)
{
if (element == null) return;
if (element instanceof CommonTree)
{
CommonTree ct = (CommonTree) element;
String path = prefix + "." + ct.getText() + index;
if (!_treeViewer.getExpandedState(ct)) collapsedElements.add(path);
List children = ct.getChildren();
if (children != null) for (int i = 0; i < children.size(); i++)
getCollapsedEntries(children.get(i), collapsedElements, path, i);
}
}
private void collapseElements(Object newElement,
Collection<Object> collapsedOldElements)
{
collapseElements(newElement, collapsedOldElements, "", 0);
}
private void collapseElements(Object newElement,
Collection<Object> collapsedOldElements, String prefix, int index)
{
if (newElement == null) return;
if (newElement instanceof CommonTree)
{
CommonTree ct = (CommonTree) newElement;
String path = prefix + "." + ct.getText() + index;
if (collapsedOldElements.contains(path))
_treeViewer.setExpandedState(ct, false);
List children = ct.getChildren();
if (children != null) for (int i = 0; i < children.size(); i++)
collapseElements(children.get(i), collapsedOldElements, path, i);
}
}
}