import java.util.Collections;\r
import java.util.HashSet;\r
import java.util.List;\r
+import java.util.Optional;\r
import java.util.Set;\r
\r
import org.simantics.Simantics;\r
import org.simantics.browsing.ui.common.ErrorLogger;\r
+import org.simantics.charts.internal.JsonUtils;\r
import org.simantics.databoard.type.Datatype;\r
import org.simantics.databoard.util.ObjectUtils;\r
import org.simantics.db.ReadGraph;\r
import org.simantics.modeling.PropertyVariables;\r
import org.simantics.modeling.PropertyVariablesImpl;\r
import org.simantics.modeling.utils.VariableReferences;\r
-import org.simantics.utils.datastructures.Callback;\r
-import org.simantics.utils.datastructures.collections.CollectionUtils;\r
import org.simantics.utils.ui.ISelectionUtils;\r
\r
/**\r
Resource targetModel = g.syncRequest(new PossibleModel(subscription));\r
\r
if(source instanceof RVI) {\r
+ RVI rvi = (RVI)source;\r
+ List<VariableReference> refs = Collections.singletonList(new VariableReference(rvi, getDatatype(g, targetModel, rvi), null));\r
+ return addSubscriptions(g, subscription, refs, Collections.<Resource>emptySet());\r
+ }\r
\r
- RVI rvi = (RVI)source;\r
- List<VariableReference> refs = CollectionUtils.toList(new VariableReference(rvi, getDatatype(g, targetModel, rvi), null));\r
- if (!refs.isEmpty())\r
- return addSubscriptions(g, subscription, refs, Collections.<Resource>emptySet());\r
- \r
+ List<PropertyVariables> vars = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, PropertyVariables.class);\r
+ if (!vars.isEmpty()) {\r
+ // FIXME: this is a hack for indexed value support\r
+ vars = PropertyVariablesImpl.resolve(g, vars);\r
+ List<VariableReference> references = g.syncRequest(VariableReferences.toReferences(targetModel, vars));\r
+ if (!references.isEmpty())\r
+ return addSubscriptions(g, subscription, references, Collections.<Resource>emptySet());\r
} else {\r
- \r
- List<PropertyVariables> vars = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, PropertyVariables.class);\r
- if (!vars.isEmpty()) {\r
- // FIXME: this is a hack for indexed value support\r
- vars = PropertyVariablesImpl.resolve(g, vars);\r
+ List<Resource> srcs = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, Resource.class);\r
+ ModelingResources MOD = ModelingResources.getInstance(g);\r
+ Set<Resource> movedItems = new HashSet<>();\r
+ for (Resource src : srcs) {\r
+ if (g.isInstanceOf(src, MOD.Subscription_Item)) {\r
+ Resource model = g.syncRequest(new PossibleModel(src));\r
+ if (ObjectUtils.objectEquals(targetModel, model))\r
+ movedItems.add(src);\r
+ }\r
+ }\r
+ if (!movedItems.isEmpty())\r
+ return addSubscriptions(g, subscription, Collections.emptyList(), movedItems);\r
+ }\r
\r
- List<VariableReference> references = g.syncRequest(VariableReferences.toReferences(targetModel, vars));\r
- if (!references.isEmpty())\r
- return addSubscriptions(g, subscription, references, Collections.<Resource>emptySet());\r
- } else {\r
- List<Resource> srcs = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, Resource.class);\r
- ModelingResources MOD = ModelingResources.getInstance(g);\r
- Set<Resource> movedItems = new HashSet<Resource>();\r
- for (Resource src : srcs) {\r
- if (g.isInstanceOf(src, MOD.Subscription_Item)) {\r
- Resource model = g.syncRequest(new PossibleModel(src));\r
- if (ObjectUtils.objectEquals(targetModel, model))\r
- movedItems.add(src);\r
- }\r
- }\r
- if (!movedItems.isEmpty())\r
- return addSubscriptions(g, subscription, Collections.<VariableReference>emptyList(), movedItems);\r
- }\r
- \r
+ if (source instanceof String) {\r
+ // JSON ?\r
+ Optional<Variable> v = JsonUtils.tryParseJsonPropertyVariable(g, (String) source);\r
+ if (v.isPresent()) {\r
+ List<VariableReference> references = g.syncRequest(VariableReferences.variablesToReferences(targetModel, Collections.singletonList(v.get())));\r
+ return addSubscriptions(g, subscription, references, Collections.emptySet());\r
+ }\r
}\r
\r
return null;\r
}\r
\r
- private Runnable addSubscriptions(ReadGraph graph, final Resource subscription, final List<VariableReference> references,\r
- final Set<Resource> movedSubscriptionItems) throws DatabaseException {\r
- final AddVariableToChartAction action = new AddVariableToChartAction(null, subscription, references);\r
- action.init(graph);\r
- return new Runnable() {\r
- @Override\r
- public void run() {\r
- action.run();\r
- if(!movedSubscriptionItems.isEmpty()) {\r
- Simantics.getSession().asyncRequest(new WriteRequest() {\r
- @Override\r
- public void perform(WriteGraph graph) throws DatabaseException {\r
- Layer0 L0 = Layer0.getInstance(graph);\r
- for (Resource item : movedSubscriptionItems) {\r
- graph.deny(item, L0.PartOf);\r
- graph.claim(subscription, L0.ConsistsOf, item);\r
- }\r
- }\r
- }, new Callback<DatabaseException>() {\r
- @Override\r
- public void run(DatabaseException e) {\r
- if (e != null)\r
- ErrorLogger.defaultLogError(e);\r
+ private Runnable addSubscriptions(ReadGraph graph, Resource subscription, List<VariableReference> references,\r
+ Set<Resource> movedSubscriptionItems) throws DatabaseException {\r
+ AddVariableToChartAction action = new AddVariableToChartAction(null, subscription, references).init(graph);\r
+ return () -> {\r
+ action.run();\r
+ if(!movedSubscriptionItems.isEmpty()) {\r
+ Simantics.getSession().asyncRequest(new WriteRequest() {\r
+ @Override\r
+ public void perform(WriteGraph graph) throws DatabaseException {\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ for (Resource item : movedSubscriptionItems) {\r
+ graph.deny(item, L0.PartOf);\r
+ graph.claim(subscription, L0.ConsistsOf, item);\r
}\r
- });\r
- }\r
+ }\r
+ }, e -> {\r
+ if (e != null)\r
+ ErrorLogger.defaultLogError(e);\r
+ });\r
}\r
};\r
}\r