X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.selectionview%2Fsrc%2Forg%2Fsimantics%2Fselectionview%2FStandardSelectionProcessor.java;fp=bundles%2Forg.simantics.selectionview%2Fsrc%2Forg%2Fsimantics%2Fselectionview%2FStandardSelectionProcessor.java;h=7b5cdf98c007972495c948de0a5fe46284ab72e2;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.selectionview/src/org/simantics/selectionview/StandardSelectionProcessor.java b/bundles/org.simantics.selectionview/src/org/simantics/selectionview/StandardSelectionProcessor.java new file mode 100644 index 000000000..7b5cdf98c --- /dev/null +++ b/bundles/org.simantics.selectionview/src/org/simantics/selectionview/StandardSelectionProcessor.java @@ -0,0 +1,155 @@ +package org.simantics.selectionview; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +import org.simantics.Logger; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.PossibleIndexRoot; +import org.simantics.db.common.utils.Functions; +import org.simantics.db.common.utils.NameUtils; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.SelectionHints; +import org.simantics.db.layer0.adapter.Instances; +import org.simantics.db.layer0.request.VariableIndexRoot; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.db.layer0.variable.Variables; +import org.simantics.layer0.Layer0; +import org.simantics.ui.selection.WorkbenchSelectionUtils; +import org.simantics.utils.ui.ISelectionUtils; + +public class StandardSelectionProcessor implements SelectionProcessor { + + private static Resource getIndexRoot(ReadGraph graph, Object selection) throws DatabaseException { + + Variable variable = WorkbenchSelectionUtils.getPossibleVariable(graph, selection); + if (variable != null) { + return graph.sync(new VariableIndexRoot(variable)); + } + + variable = ISelectionUtils.filterSingleSelection(selection, Variable.class); + if (variable != null) { + return graph.sync(new VariableIndexRoot(variable)); + } + + Resource indexRoot = ISelectionUtils.getSinglePossibleKey(selection, SelectionHints.KEY_MODEL, Resource.class, false); + if (indexRoot == null) { + Resource r = ISelectionUtils.getSinglePossibleKey(selection, SelectionHints.KEY_MAIN, Resource.class); + if (r != null) + indexRoot = graph.sync(new PossibleIndexRoot(r)); + } + + return indexRoot != null && graph.isInstanceOf(indexRoot, Layer0.getInstance(graph).IndexRoot) ? indexRoot : null; + } + + @Override + public Collection process(Object selection, ReadGraph graph) { + return processStatic(selection, graph); + } + + public static Collection processStatic(Object selection, ReadGraph graph) { + + try { + + SelectionViewResources SEL = SelectionViewResources.getInstance(graph); + Instances contributionFinder = graph.adapt(SEL.TabContribution, Instances.class); + Instances transformationFinder = graph.adapt(SEL.SelectionTransformation, Instances.class); + + ArrayList> contributions = new ArrayList>(); + + Resource index = getIndexRoot(graph, selection); + if(index != null) { + + for(Resource r : contributionFinder.find(graph, index)) { + TabContribution contribution = graph.adapt(r, TabContribution.class); + contributions.add(contribution); + if(DebugPolicy.DEBUG) System.err.println("-contribution " + graph.getURI(r)); + } + + ArrayList transforms = new ArrayList(); + transforms.addAll(transformationFinder.find(graph, index)); + if(DebugPolicy.DEBUG) { + for(Resource r : transforms) + System.err.println("-transform " + NameUtils.getSafeLabel(graph, r)); + } + + HashSet inputs = new HashSet(); + HashSet newInputs = new HashSet(); + inputs.add(selection); + boolean changed = true; + while(changed) { + for(Resource tr : transforms) { + for(Object input : inputs) { + try { + Object newInput = Functions.exec(graph, tr, graph, input); + if(newInput != null) + newInputs.add(newInput); + } catch (DatabaseException e) { + } + } + } + changed = inputs.addAll(newInputs); + newInputs.clear(); + } + + + if(DebugPolicy.DEBUG) { + for(Object o : inputs) + System.err.println("-input " + inputName(graph, o)); + } + + Set result = new HashSet(); + for(TabContribution c : contributions) { + for(Object input : inputs) { + try { + if(DebugPolicy.DEBUG) { + System.err.println("contribution: " + c); + System.err.println("->input: " + input); + System.err.println("->input name: " + inputName(graph, input)); + } + if (c.accept(graph, input)) + c.contribute(graph, input, result); + } catch (ClassCastException e) { + Logger.defaultLogError(e); + } catch (Exception e) { + Logger.defaultLogError(e); + } + } + } + + if(DebugPolicy.DEBUG) { + System.err.println("result: " + result); + } + + return result; + + } + + + } catch (DatabaseException e) { + + e.printStackTrace(); + + } + + return Collections.emptyList(); + + } + + private static String inputName(ReadGraph graph, Object o) throws DatabaseException { + if(o instanceof Resource) { + return "Resource: " + NameUtils.getURIOrSafeNameInternal(graph, (Resource)o); + } else if(o instanceof Variable) { + return "Variable: " + ((Variable)o).getURI(graph) + " " + NameUtils.getSafeLabel(graph, (Resource)((Variable)o).getPossiblePropertyValue(graph, Variables.TYPE)); + } else if(o instanceof SelectionInput) { + return "SelectionInput: " + o.toString(); + } else { + return "Object(" + o.getClass().getSimpleName() + "): " + o.toString(); + } + } + +}