package org.simantics.selectionview; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.IWorkbenchSite; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.common.utils.Logger; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.variable.Variable; import org.simantics.db.layer0.variable.Variables; import org.simantics.ui.selection.AnyResource; import org.simantics.ui.selection.WorkbenchSelectionElement; import org.simantics.views.swt.SWTViewLoaderProcess; import org.simantics.views.swt.client.base.SWTRoot; public class MultiTypedTabContribution extends AbstractTypedTabContribution { public MultiTypedTabContribution(ReadGraph graph, Resource configuration) throws DatabaseException { super(graph, configuration); } static class Contribution extends ModelledTabContributor { private String viewURI; public Contribution(String viewURI) { this.viewURI = viewURI; } @Override public void createControls(Composite body, IWorkbenchSite site) { try { final SWTViewLoaderProcess loader = new SWTViewLoaderProcess(null, site); final SWTRoot root = loader.load(viewURI, runtime); root.createControls(body); body.addListener(SWT.Dispose, new Listener() { @Override public void handleEvent(Event event) { if(!loader.isDisposed()) loader.dispose(); } }); } catch (DatabaseException e) { e.printStackTrace(); Logger.defaultLogError(e); } } @Override public boolean equals(Object obj) { if (this == obj) return true; else if (obj == null) return false; else if (!(obj instanceof Contribution)) return false; Contribution c = (Contribution)obj; return viewURI.equals(c.viewURI); } @Override public int hashCode() { return viewURI.hashCode(); } } @Override public boolean accept(ReadGraph graph, Object input) throws DatabaseException { return true; } @Override public boolean accept(ReadGraph graph, Object input, Collection type) throws DatabaseException { return true; } @Override public void getContributors(ReadGraph graph, Object input, Integer priority, String label, Collection result) throws DatabaseException { Collection objects; if (input instanceof Collection) { objects = (Collection) input; } else { objects = Collections.singletonList(input); } SelectionViewResources SEL = SelectionViewResources.getInstance(graph); Resource view = graph.getPossibleObject(configuration, SEL.VariableTabContribution_HasView); if(view == null) { throw new DatabaseException("No view for " + graph.getPossibleURI(configuration)); } Set actualResult = new HashSet<>(objects.size()); for (Object obj : objects) { Resource resource = getPossibleResource(graph, obj); if (resource == null) continue; Collection ts = graph.getTypes(resource); if (!Collections.disjoint(types, ts)) { Variable variable = Variables.getVariable(graph, resource); actualResult.add(variable); } } if (!actualResult.isEmpty()) { final String viewURI = graph.getPossibleURI(view); result.add(new ComparableTabContributor(new Contribution(viewURI), priority, actualResult, label)); } } private Resource getPossibleResource(ReadGraph graph, Object obj) { if (obj instanceof Resource) return (Resource) obj; if (obj instanceof WorkbenchSelectionElement) return ((WorkbenchSelectionElement) obj).getContent(new AnyResource(graph)); return null; } }