X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.browsing.ui.model%2Fsrc%2Forg%2Fsimantics%2Fbrowsing%2Fui%2Fmodel%2Fbrowsecontexts%2FBrowseContext.java;h=3a185f5850bf62de7b0d9af14058ae3192b54ae0;hb=HEAD;hp=e57bfacca92d11b8b71d7eba4b2a8f1e0aa4c8e1;hpb=1dfeb7d5c49b1391cd9d877e1eddab18995cb151;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.browsing.ui.model/src/org/simantics/browsing/ui/model/browsecontexts/BrowseContext.java b/bundles/org.simantics.browsing.ui.model/src/org/simantics/browsing/ui/model/browsecontexts/BrowseContext.java index e57bfacca..3a185f585 100644 --- a/bundles/org.simantics.browsing.ui.model/src/org/simantics/browsing/ui/model/browsecontexts/BrowseContext.java +++ b/bundles/org.simantics.browsing.ui.model/src/org/simantics/browsing/ui/model/browsecontexts/BrowseContext.java @@ -22,9 +22,7 @@ import java.util.Map; import java.util.Set; import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Shell; import org.simantics.browsing.ui.BuiltinKeys; import org.simantics.browsing.ui.CheckedState; import org.simantics.browsing.ui.NodeContext; @@ -59,13 +57,13 @@ import org.simantics.browsing.ui.model.visuals.VisualsContribution; import org.simantics.db.ReadGraph; import org.simantics.db.RequestProcessor; import org.simantics.db.Resource; +import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener; +import org.simantics.db.common.request.ResourceRead; +import org.simantics.db.common.request.UnaryRead; +import org.simantics.db.common.utils.NameUtils; import org.simantics.db.exception.DatabaseException; import org.simantics.db.exception.ResourceNotFoundException; import org.simantics.db.layer0.variable.Variable; -import org.simantics.db.request.Read; -import org.simantics.graphviz.Graph; -import org.simantics.graphviz.Node; -import org.simantics.graphviz.ui.GraphvizComponent; import org.simantics.scl.reflection.OntologyVersions; import org.simantics.viewpoint.ontology.ViewpointResource; import org.slf4j.Logger; @@ -81,21 +79,21 @@ public class BrowseContext { private static final Logger LOGGER = LoggerFactory.getLogger(BrowseContext.class); public static final boolean DEBUG = false; - NodeTypeMultiMap childContributions = new NodeTypeMultiMap(); - NodeTypeMultiMap parentContributions = new NodeTypeMultiMap(); - OrderedNodeTypeMultiMap labelContributions = new OrderedNodeTypeMultiMap(); - OrderedNodeTypeMultiMap imageContributions = new OrderedNodeTypeMultiMap(); - OrderedNodeTypeMultiMap checkedStateContributions = new OrderedNodeTypeMultiMap(); - OrderedNodeTypeMultiMap labelDecorationContributions = new OrderedNodeTypeMultiMap(); - OrderedNodeTypeMultiMap imageDecorationContributions = new OrderedNodeTypeMultiMap(); - OrderedNodeTypeMultiMap modifierContributions = new OrderedNodeTypeMultiMap(); - OrderedNodeTypeMultiMap sorterContributions = new OrderedNodeTypeMultiMap(); - OrderedNodeTypeMultiMap flatNodeContributions = new OrderedNodeTypeMultiMap(); + NodeTypeMultiMap childContributions = new NodeTypeMultiMap<>(); + NodeTypeMultiMap parentContributions = new NodeTypeMultiMap<>(); + OrderedNodeTypeMultiMap labelContributions = new OrderedNodeTypeMultiMap<>(); + OrderedNodeTypeMultiMap imageContributions = new OrderedNodeTypeMultiMap<>(); + OrderedNodeTypeMultiMap checkedStateContributions = new OrderedNodeTypeMultiMap<>(); + OrderedNodeTypeMultiMap labelDecorationContributions = new OrderedNodeTypeMultiMap<>(); + OrderedNodeTypeMultiMap imageDecorationContributions = new OrderedNodeTypeMultiMap<>(); + OrderedNodeTypeMultiMap modifierContributions = new OrderedNodeTypeMultiMap<>(); + OrderedNodeTypeMultiMap sorterContributions = new OrderedNodeTypeMultiMap<>(); + OrderedNodeTypeMultiMap flatNodeContributions = new OrderedNodeTypeMultiMap<>(); OrderedNodeTypeMultiMap tooltipContributions = new OrderedNodeTypeMultiMap<>(); private final String[] uris; - private BrowseContext(String[] uris) { + private BrowseContext(String... uris) { if (uris == null) throw new NullPointerException("null URIs"); this.uris = uris; @@ -114,6 +112,38 @@ public class BrowseContext { return defaultContext; } + private static BrowseContext loadCachedVisuals(ReadGraph g, Resource visualsContributionResource) throws DatabaseException, InvalidContribution { + try { + return g.syncRequest(new ResourceRead(visualsContributionResource) { + @Override + public BrowseContext perform(ReadGraph graph) throws DatabaseException { + try { + BrowseContext bc = new BrowseContext(); + VisualsContribution.load(g, visualsContributionResource, + bc.labelContributions, + bc.imageContributions, + bc.checkedStateContributions, + bc.labelDecorationContributions, + bc.imageDecorationContributions, + bc.modifierContributions, + bc.sorterContributions, + bc.flatNodeContributions, + bc.tooltipContributions + ); + return bc; + } catch (InvalidContribution e) { + throw new DatabaseException(e); + } + } + }, TransientCacheAsyncListener.instance()); + } catch (DatabaseException e) { + Throwable c = e.getCause(); + if (c instanceof InvalidContribution) + throw (InvalidContribution) c; + throw e; + } + } + /** * Creates a new BrowseContext for the given Collection of {@link Resource}s. * @@ -130,24 +160,31 @@ public class BrowseContext { for(Resource childContributionResource : g.getObjects(browseContextResource, vr.BrowseContext_HasChildContribution)) { - ChildContribution contribution = ChildContribution.create(g, childContributionResource); - browseContext.childContributions.put(contribution.getParentNodeType(), contribution); - browseContext.parentContributions.put(contribution.getChildNodeType(), contribution); + try { + ChildContribution contribution = ChildContribution.createCached(g, childContributionResource); + browseContext.childContributions.put(contribution.getParentNodeType(), contribution); + browseContext.parentContributions.put(contribution.getChildNodeType(), contribution); + } catch (DatabaseException e) { + LOGGER.error("Failed to load child contribution " + NameUtils.getSafeName(g, childContributionResource), e); + } } for(Resource visualsContributionResource : g.getObjects(browseContextResource, vr.BrowseContext_HasVisualsContribution)) { - VisualsContribution.load(g, visualsContributionResource, - browseContext.labelContributions, - browseContext.imageContributions, - browseContext.checkedStateContributions, - browseContext.labelDecorationContributions, - browseContext.imageDecorationContributions, - browseContext.modifierContributions, - browseContext.sorterContributions, - browseContext.flatNodeContributions, - browseContext.tooltipContributions - ); + try { + BrowseContext visuals = loadCachedVisuals(g, visualsContributionResource); + visuals.labelContributions.appendTo(browseContext.labelContributions); + visuals.imageContributions.appendTo(browseContext.imageContributions); + visuals.checkedStateContributions.appendTo(browseContext.checkedStateContributions); + visuals.labelDecorationContributions.appendTo(browseContext.labelDecorationContributions); + visuals.imageDecorationContributions.appendTo(browseContext.imageDecorationContributions); + visuals.modifierContributions.appendTo(browseContext.modifierContributions); + visuals.sorterContributions.appendTo(browseContext.sorterContributions); + visuals.flatNodeContributions.appendTo(browseContext.flatNodeContributions); + visuals.tooltipContributions.appendTo(browseContext.tooltipContributions); + } catch (DatabaseException e) { + LOGGER.error("Failed to load visuals contribution " + NameUtils.getSafeName(g, visualsContributionResource), e); + } } } //browseContext.visualize(); @@ -155,11 +192,11 @@ public class BrowseContext { } public static Set getBrowseContextClosure(RequestProcessor processor, final Set browseContexts) throws DatabaseException { - return processor.syncRequest(new Read>() { + return processor.syncRequest(new UnaryRead, Set>(browseContexts) { @Override public Set perform(ReadGraph graph) throws DatabaseException { - Collection browseContextResources = new ArrayList(browseContexts.size()); - for (String browseContext : browseContexts) { + Collection browseContextResources = new ArrayList<>(parameter.size()); + for (String browseContext : parameter) { try { browseContextResources.add(graph.getResource(browseContext)); } catch (ResourceNotFoundException e) { @@ -167,19 +204,29 @@ public class BrowseContext { } } Collection allBrowseContextResources = BrowseContext.findSubcontexts(graph, browseContextResources); - Set result = new HashSet(); + Set result = new HashSet<>(); for (Resource r : allBrowseContextResources) result.add(graph.getURI(r)); - return result; + return result; + } + }, TransientCacheAsyncListener.instance()); + } + + public static Collection findSubcontexts(ReadGraph g, Collection browseContexts) + throws DatabaseException { + return g.syncRequest(new UnaryRead, Collection>(browseContexts) { + @Override + public Collection perform(ReadGraph graph) throws DatabaseException { + return findSubcontexts0(graph, parameter); } - }); + }, TransientCacheAsyncListener.instance()); } - public static Collection findSubcontexts(ReadGraph g, + private static Collection findSubcontexts0(ReadGraph g, Collection browseContexts) throws DatabaseException { ViewpointResource vr = ViewpointResource.getInstance(g); - HashSet result = new HashSet(browseContexts); - ArrayList stack = new ArrayList(browseContexts); + HashSet result = new HashSet<>(browseContexts); + ArrayList stack = new ArrayList<>(browseContexts); while(!stack.isEmpty()) { Resource cur = stack.remove(stack.size()-1); for(Resource sc : g.getObjects(cur, vr.BrowseContext_Includes)) @@ -188,7 +235,7 @@ public class BrowseContext { } return result; } - + /** * Finds the possible children of the given {@link NodeContext} parameter. * @@ -469,36 +516,6 @@ public class BrowseContext { return tooltip; return null; } - - private Graph toGraph() { - Graph graph = new Graph(); - new Node(graph, "Foo"); - return graph; - } - - @SuppressWarnings("unused") - private void visualize() { - final Graph graph = toGraph(); - - // Show it - new Thread() { - public void run() { - final Display display = new Display(); - final Shell shell = new Shell(display); - - GraphvizComponent comp = new GraphvizComponent(shell, 0); - comp.setGraph(graph); - - comp.setBounds(0, 0, 800, 600); - shell.pack(); - shell.open (); - while (!shell.isDisposed()) { - if (!display.readAndDispatch()) display.sleep(); - } - display.dispose(); - } - }.start(); - } @Override public int hashCode() {