package org.rascalmpl.eclipse.views.values.tree;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.EditorPart;
import org.rascalmpl.eclipse.Activator;
import org.rascalmpl.eclipse.views.values.ValueEditorInput;
import io.usethesource.vallang.IBool;
import io.usethesource.vallang.IConstructor;
import io.usethesource.vallang.IDateTime;
import io.usethesource.vallang.IExternalValue;
import io.usethesource.vallang.IInteger;
import io.usethesource.vallang.IList;
import io.usethesource.vallang.IMap;
import io.usethesource.vallang.INode;
import io.usethesource.vallang.IRational;
import io.usethesource.vallang.IReal;
import io.usethesource.vallang.ISet;
import io.usethesource.vallang.ISourceLocation;
import io.usethesource.vallang.IString;
import io.usethesource.vallang.ITuple;
import io.usethesource.vallang.IValue;
import io.usethesource.vallang.visitors.IValueVisitor;
import org.rascalmpl.values.ValueFactoryFactory;
public class Editor extends EditorPart {
public static final String EditorId = "org.rascalmpl.eclipse.views.values.tree.editor";
private TreeViewer treeViewer;
private static final Object[] empty = new Object[0];
public Editor() {
}
@Override
public String getTitle() {
IEditorInput editorInput = getEditorInput();
if (editorInput != null) {
return editorInput.getName();
}
return "Value";
}
public TreeViewer getViewer() {
return treeViewer;
}
public static void open(final IValue value) {
if (value == null) {
return;
}
IWorkbench wb = PlatformUI.getWorkbench();
IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
if (win == null && wb.getWorkbenchWindowCount() != 0) {
win = wb.getWorkbenchWindows()[0];
}
if (win != null) {
final IWorkbenchPage page = win.getActivePage();
if (page != null) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
try {
page.openEditor(new ValueEditorInput(value, true, 2), Editor.EditorId);
} catch (PartInitException e) {
Activator.log("failed to open tree editor", e);
}
}
});
}
}
}
@Override
public void doSave(IProgressMonitor monitor) {
}
@Override
public void doSaveAs() {
}
@Override
public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
setSite(site);
setInput(input);
if (!(input instanceof ValueEditorInput)) {
throw new PartInitException("not a value input");
}
}
@Override
public boolean isDirty() {
return false;
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
@Override
public void createPartControl(Composite parent) {
parent.setLayout(new FillLayout());
treeViewer = new TreeViewer(parent);
treeViewer.setContentProvider(new ValueContentProvider());
treeViewer.setLabelProvider(new ValueLabelProvider());
IEditorInput input = getEditorInput();
treeViewer.setInput(((ValueEditorInput) input).getValue());
}
@Override
public void setFocus() {
}
private class ValueContentProvider implements ITreeContentProvider {
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public Object[] getChildren(Object parentElement) {
return ((IValue) parentElement).accept(new IValueVisitor<Object[], RuntimeException>() {
public Object[] visitBoolean(IBool boolValue) {
return empty;
}
public Object[] visitConstructor(IConstructor o)
{
Object[] children = new Object[o.arity()];
int i = 0;
for (IValue child : o) {
children[i++] = child;
}
return children;
}
public Object[] visitExternal(IExternalValue externalValue)
{
return empty;
}
public Object[] visitInteger(IInteger o)
{
return empty;
}
public Object[] visitRational(IRational o)
{
return empty;
}
public Object[] visitList(IList o) {
Object[] children = new Object[o.length()];
int i = 0;
for (IValue child : o) {
children[i++] = child;
}
return children;
}
public Object[] visitMap(IMap o) {
Object[] children = new Object[o.size()];
int i = 0;
for (IValue child : o) {
children[i++] = ValueFactoryFactory.getValueFactory().tuple(child, o.get(child));
}
return children;
}
public Object[] visitNode(INode o) {
Object[] children = new Object[o.arity()];
int i = 0;
for (IValue child : o) {
children[i++] = child;
}
return children;
}
public Object[] visitReal(IReal o) {
return empty;
}
public Object[] visitRelation(ISet o)
{
return visitSet(o);
}
public Object[] visitSet(ISet o) {
Object[] children = new Object[o.size()];
int i = 0;
for (IValue child : o) {
children[i++] = child;
}
return children;
}
public Object[] visitSourceLocation(ISourceLocation o)
{
return empty;
}
public Object[] visitString(IString o) {
return empty;
}
public Object[] visitTuple(ITuple o) {
Object[] children = new Object[o.arity()];
int i = 0;
for (IValue child : o) {
children[i++] = child;
}
return children;
}
public Object[] visitDateTime(IDateTime o)
{
return empty;
}
public Object[] visitListRelation(IList o) {
return visitList(o);
}
});
}
public Object getParent(Object element) {
return null;
}
public boolean hasChildren(Object element) {
return getChildren(element).length != 0;
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
}
private class ValueLabelProvider implements ILabelProvider {
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
public Image getImage(Object element) {
return null;
}
public String getText(Object element) {
IValue value = (IValue) element;
return value.accept(new IValueVisitor<String, RuntimeException>() {
public String visitBoolean(IBool boolValue)
{
return boolValue.toString();
}
public String visitConstructor(IConstructor o)
{
return o.getConstructorType().toString();
}
public String visitExternal(IExternalValue externalValue)
{
return externalValue.getType().toString();
}
public String visitInteger(IInteger o) {
return o.toString();
}
public String visitRational(IRational o) {
return o.toString();
}
public String visitList(IList o) {
return o.getType().toString();
}
public String visitMap(IMap o) {
return o.getType().toString();
}
public String visitNode(INode o) {
return o.getName();
}
public String visitReal(IReal o) {
return o.toString();
}
public String visitRelation(ISet o)
{
return o.getType().toString();
}
public String visitSet(ISet o) {
return o.getType().toString();
}
public String visitSourceLocation(ISourceLocation o) {
return o.toString();
}
public String visitString(IString o) {
return o.toString();
}
public String visitTuple(ITuple o) {
return o.getType().toString();
}
public String visitDateTime(IDateTime o) {
return o.toString();
}
public String visitListRelation(IList o) {
return o.getType().toString();
}
});
}
}
}