X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.charts%2Fsrc%2Forg%2Fsimantics%2Fcharts%2Fui%2FSubscriptionDropActionFactory.java;h=ee3975d9515975a7c4f514830d162260221a14ab;hp=fe865cb8d4cfa462207ad23505031080db967903;hb=876ede6b867e2e7966ffb46cc69dc820969c4394;hpb=b9450ae725ed484f18cb4a3a44eddc6da01ec9d7 diff --git a/bundles/org.simantics.charts/src/org/simantics/charts/ui/SubscriptionDropActionFactory.java b/bundles/org.simantics.charts/src/org/simantics/charts/ui/SubscriptionDropActionFactory.java index fe865cb8d..ee3975d95 100644 --- a/bundles/org.simantics.charts/src/org/simantics/charts/ui/SubscriptionDropActionFactory.java +++ b/bundles/org.simantics.charts/src/org/simantics/charts/ui/SubscriptionDropActionFactory.java @@ -14,10 +14,12 @@ package org.simantics.charts.ui; import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Set; import org.simantics.Simantics; import org.simantics.browsing.ui.common.ErrorLogger; +import org.simantics.charts.internal.JsonUtils; import org.simantics.databoard.type.Datatype; import org.simantics.databoard.util.ObjectUtils; import org.simantics.db.ReadGraph; @@ -38,8 +40,6 @@ import org.simantics.modeling.ModelingResources; import org.simantics.modeling.PropertyVariables; import org.simantics.modeling.PropertyVariablesImpl; import org.simantics.modeling.utils.VariableReferences; -import org.simantics.utils.datastructures.Callback; -import org.simantics.utils.datastructures.collections.CollectionUtils; import org.simantics.utils.ui.ISelectionUtils; /** @@ -57,68 +57,64 @@ public class SubscriptionDropActionFactory implements DropActionFactory { Resource targetModel = g.syncRequest(new PossibleModel(subscription)); if(source instanceof RVI) { + RVI rvi = (RVI)source; + List refs = Collections.singletonList(new VariableReference(rvi, getDatatype(g, targetModel, rvi), null)); + return addSubscriptions(g, subscription, refs, Collections.emptySet()); + } - RVI rvi = (RVI)source; - List refs = CollectionUtils.toList(new VariableReference(rvi, getDatatype(g, targetModel, rvi), null)); - if (!refs.isEmpty()) - return addSubscriptions(g, subscription, refs, Collections.emptySet()); - + List vars = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, PropertyVariables.class); + if (!vars.isEmpty()) { + // FIXME: this is a hack for indexed value support + vars = PropertyVariablesImpl.resolve(g, vars); + List references = g.syncRequest(VariableReferences.toReferences(targetModel, vars)); + if (!references.isEmpty()) + return addSubscriptions(g, subscription, references, Collections.emptySet()); } else { - - List vars = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, PropertyVariables.class); - if (!vars.isEmpty()) { - // FIXME: this is a hack for indexed value support - vars = PropertyVariablesImpl.resolve(g, vars); + List srcs = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, Resource.class); + ModelingResources MOD = ModelingResources.getInstance(g); + Set movedItems = new HashSet<>(); + for (Resource src : srcs) { + if (g.isInstanceOf(src, MOD.Subscription_Item)) { + Resource model = g.syncRequest(new PossibleModel(src)); + if (ObjectUtils.objectEquals(targetModel, model)) + movedItems.add(src); + } + } + if (!movedItems.isEmpty()) + return addSubscriptions(g, subscription, Collections.emptyList(), movedItems); + } - List references = g.syncRequest(VariableReferences.toReferences(targetModel, vars)); - if (!references.isEmpty()) - return addSubscriptions(g, subscription, references, Collections.emptySet()); - } else { - List srcs = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, Resource.class); - ModelingResources MOD = ModelingResources.getInstance(g); - Set movedItems = new HashSet(); - for (Resource src : srcs) { - if (g.isInstanceOf(src, MOD.Subscription_Item)) { - Resource model = g.syncRequest(new PossibleModel(src)); - if (ObjectUtils.objectEquals(targetModel, model)) - movedItems.add(src); - } - } - if (!movedItems.isEmpty()) - return addSubscriptions(g, subscription, Collections.emptyList(), movedItems); - } - + if (source instanceof String) { + // JSON ? + Optional v = JsonUtils.tryParseJsonPropertyVariable(g, (String) source); + if (v.isPresent()) { + List references = g.syncRequest(VariableReferences.variablesToReferences(targetModel, Collections.singletonList(v.get()))); + return addSubscriptions(g, subscription, references, Collections.emptySet()); + } } return null; } - private Runnable addSubscriptions(ReadGraph graph, final Resource subscription, final List references, - final Set movedSubscriptionItems) throws DatabaseException { - final AddVariableToChartAction action = new AddVariableToChartAction(null, subscription, references); - action.init(graph); - return new Runnable() { - @Override - public void run() { - action.run(); - if(!movedSubscriptionItems.isEmpty()) { - Simantics.getSession().asyncRequest(new WriteRequest() { - @Override - public void perform(WriteGraph graph) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); - for (Resource item : movedSubscriptionItems) { - graph.deny(item, L0.PartOf); - graph.claim(subscription, L0.ConsistsOf, item); - } - } - }, new Callback() { - @Override - public void run(DatabaseException e) { - if (e != null) - ErrorLogger.defaultLogError(e); + private Runnable addSubscriptions(ReadGraph graph, Resource subscription, List references, + Set movedSubscriptionItems) throws DatabaseException { + AddVariableToChartAction action = new AddVariableToChartAction(null, subscription, references).init(graph); + return () -> { + action.run(); + if(!movedSubscriptionItems.isEmpty()) { + Simantics.getSession().asyncRequest(new WriteRequest() { + @Override + public void perform(WriteGraph graph) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + for (Resource item : movedSubscriptionItems) { + graph.deny(item, L0.PartOf); + graph.claim(subscription, L0.ConsistsOf, item); } - }); - } + } + }, e -> { + if (e != null) + ErrorLogger.defaultLogError(e); + }); } }; }