/** * */ package se.sics.kompics.ide.views; import java.util.Collection; import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.widgets.Display; import se.sics.kompics.ide.Activator; import se.sics.kompics.ide.Model; import se.sics.kompics.ide.model.ast.ASTChannel; import se.sics.kompics.ide.model.ast.ASTComponentDefinition; import se.sics.kompics.ide.model.ast.ASTEvent; import se.sics.kompics.ide.model.ast.ASTHandler; import se.sics.kompics.ide.model.ast.ASTModelObject; import se.sics.kompics.ide.model.ast.ASTPortType; /** * The <code>ModelContentProvider</code> . * * @author Lars Kroll <lkr@lars-kroll.com> * @version $Id: $ * */ public class ModelContentProvider implements IStructuredContentProvider, ITreeContentProvider { private Model model = Model.eINSTANCE; private final ModelView view; private TreeViewer viewer; private TreeObject invisibleRoot = null; private AtomicBoolean refreshing = new AtomicBoolean(false); public ModelContentProvider(ModelView view, TreeViewer viewer) { model.setContentProvider(this); this.view = view; this.viewer = viewer; } @Override public void dispose() { model.unsetContentProvider(); } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // TODO Auto-generated method stub } @Override public Object[] getChildren(Object parentElement) { if (parentElement instanceof TreeObject) { return ((TreeObject) parentElement).getChildren(); } return new Object[0]; } private void initialize() { refreshing.set(false); invisibleRoot = new TreeObject(""); TreeObject components = new TreeObject("Components"); TreeObject ports = new TreeObject("Port Types"); TreeObject events = new TreeObject("Event Types"); TreeObject channels = new TreeObject("Channels"); TreeObject handlers = new TreeObject("Handlers"); invisibleRoot.addChild(components); invisibleRoot.addChild(ports); invisibleRoot.addChild(events); invisibleRoot.addChild(channels); invisibleRoot.addChild(handlers); Collection<ASTComponentDefinition> comps = Model.getComponents(); for (ASTComponentDefinition c : comps) { ModelTreeObject mto = new ModelTreeObject(c); components.addChild(mto); initializeChildren(c, mto); } Collection<ASTEvent> evs = Model.getEvents(); for (ASTEvent e : evs) { ModelTreeObject mto = new ModelTreeObject(e); events.addChild(mto); initializeChildren(e, mto); } Collection<ASTPortType> pts = Model.getPorts(); for (ASTPortType p : pts) { ModelTreeObject mto = new ModelTreeObject(p); ports.addChild(mto); initializeChildren(p, mto); } Collection<ASTChannel> chs = Model.getChannels(); for (ASTChannel c : chs) { ModelTreeObject mto = new ModelTreeObject(c); channels.addChild(mto); initializeChildren(c, mto); } Collection<ASTHandler> hs = Model.getHandlers(); for (ASTHandler h : hs) { ModelTreeObject mto = new ModelTreeObject(h); handlers.addChild(mto); initializeChildren(h, mto); } } private void initializeChildren(ASTModelObject obj, ModelTreeObject parent) { Set<ASTModelObject> children = obj.getChildren(); for (ASTModelObject child : children) { ModelTreeObject mto = new ModelTreeObject(child); parent.addChild(mto); initializeChildren(child, mto); } } @Override public Object getParent(Object element) { if (element instanceof TreeObject) { return ((TreeObject) element).getParent(); } return null; } @Override public boolean hasChildren(Object element) { if (element instanceof TreeObject) { return ((TreeObject) element).hasChildren(); } return false; } @Override public Object[] getElements(Object inputElement) { if (inputElement.equals(view.getViewSite())) { if (invisibleRoot == null) initialize(); return getChildren(invisibleRoot); } return getChildren(inputElement); } public void refresh() { String log = "Trying to refresh the Content Provider..."; if (refreshing.compareAndSet(false, true)) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { viewer.refresh(); } }); log += "success!"; invisibleRoot = null; } else { log += "fail :("; } //Activator.log(log); } }