]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.charts/src/org/simantics/charts/ui/SubscriptionDropActionFactory.java
fe865cb8d4cfa462207ad23505031080db967903
[simantics/platform.git] / bundles / org.simantics.charts / src / org / simantics / charts / ui / SubscriptionDropActionFactory.java
1 /*******************************************************************************\r
2  * Copyright (c) 2014 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.charts.ui;\r
13 \r
14 import java.util.Collections;\r
15 import java.util.HashSet;\r
16 import java.util.List;\r
17 import java.util.Set;\r
18 \r
19 import org.simantics.Simantics;\r
20 import org.simantics.browsing.ui.common.ErrorLogger;\r
21 import org.simantics.databoard.type.Datatype;\r
22 import org.simantics.databoard.util.ObjectUtils;\r
23 import org.simantics.db.ReadGraph;\r
24 import org.simantics.db.Resource;\r
25 import org.simantics.db.WriteGraph;\r
26 import org.simantics.db.common.request.WriteRequest;\r
27 import org.simantics.db.exception.DatabaseException;\r
28 import org.simantics.db.layer0.SelectionHints;\r
29 import org.simantics.db.layer0.adapter.DropActionFactory;\r
30 import org.simantics.db.layer0.request.PossibleActiveVariableFromVariable;\r
31 import org.simantics.db.layer0.request.PossibleModel;\r
32 import org.simantics.db.layer0.variable.RVI;\r
33 import org.simantics.db.layer0.variable.Variable;\r
34 import org.simantics.db.layer0.variable.VariableReference;\r
35 import org.simantics.db.layer0.variable.Variables;\r
36 import org.simantics.layer0.Layer0;\r
37 import org.simantics.modeling.ModelingResources;\r
38 import org.simantics.modeling.PropertyVariables;\r
39 import org.simantics.modeling.PropertyVariablesImpl;\r
40 import org.simantics.modeling.utils.VariableReferences;\r
41 import org.simantics.utils.datastructures.Callback;\r
42 import org.simantics.utils.datastructures.collections.CollectionUtils;\r
43 import org.simantics.utils.ui.ISelectionUtils;\r
44 \r
45 /**\r
46  * @author Tuukka Lehtonen\r
47  */\r
48 public class SubscriptionDropActionFactory implements DropActionFactory {\r
49 \r
50     @Override\r
51     public Runnable create(ReadGraph g, Object target, Object source, int operation) throws DatabaseException {\r
52         //System.out.println("DROP: " + source + " -> " + target);\r
53 \r
54         final Resource subscription = ISelectionUtils.getSinglePossibleKey(target, SelectionHints.KEY_MAIN, Resource.class);\r
55         if (subscription == null)\r
56             return null;\r
57         Resource targetModel = g.syncRequest(new PossibleModel(subscription));\r
58 \r
59         if(source instanceof RVI) {\r
60 \r
61                 RVI rvi = (RVI)source;\r
62                 List<VariableReference> refs = CollectionUtils.toList(new VariableReference(rvi, getDatatype(g, targetModel, rvi), null));\r
63                 if (!refs.isEmpty())\r
64                         return addSubscriptions(g, subscription, refs, Collections.<Resource>emptySet());\r
65                 \r
66         } else {\r
67         \r
68                 List<PropertyVariables> vars = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, PropertyVariables.class);\r
69                 if (!vars.isEmpty()) {\r
70                         // FIXME: this is a hack for indexed value support\r
71                         vars = PropertyVariablesImpl.resolve(g, vars);\r
72 \r
73                         List<VariableReference> references = g.syncRequest(VariableReferences.toReferences(targetModel, vars));\r
74                         if (!references.isEmpty())\r
75                                 return addSubscriptions(g, subscription, references, Collections.<Resource>emptySet());\r
76                 } else {\r
77                         List<Resource> srcs = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, Resource.class);\r
78                         ModelingResources MOD = ModelingResources.getInstance(g);\r
79                         Set<Resource> movedItems = new HashSet<Resource>();\r
80                         for (Resource src : srcs) {\r
81                                 if (g.isInstanceOf(src, MOD.Subscription_Item)) {\r
82                                         Resource model = g.syncRequest(new PossibleModel(src));\r
83                                         if (ObjectUtils.objectEquals(targetModel, model))\r
84                                                 movedItems.add(src);\r
85                                 }\r
86                         }\r
87                         if (!movedItems.isEmpty())\r
88                                 return addSubscriptions(g, subscription, Collections.<VariableReference>emptyList(), movedItems);\r
89                 }\r
90         \r
91         }\r
92 \r
93         return null;\r
94     }\r
95 \r
96     private Runnable addSubscriptions(ReadGraph graph, final Resource subscription, final List<VariableReference> references,\r
97             final Set<Resource> movedSubscriptionItems) throws DatabaseException {\r
98         final AddVariableToChartAction action = new AddVariableToChartAction(null, subscription, references);\r
99         action.init(graph);\r
100         return new Runnable() {\r
101             @Override\r
102             public void run() {\r
103                 action.run();\r
104                 if(!movedSubscriptionItems.isEmpty()) {\r
105                     Simantics.getSession().asyncRequest(new WriteRequest() {\r
106                         @Override\r
107                         public void perform(WriteGraph graph) throws DatabaseException {\r
108                             Layer0 L0 = Layer0.getInstance(graph);\r
109                             for (Resource item : movedSubscriptionItems) {\r
110                                 graph.deny(item, L0.PartOf);\r
111                                 graph.claim(subscription, L0.ConsistsOf, item);\r
112                             }\r
113                         }\r
114                     }, new Callback<DatabaseException>() {\r
115                         @Override\r
116                         public void run(DatabaseException e) {\r
117                             if (e != null)\r
118                                 ErrorLogger.defaultLogError(e);\r
119                         }\r
120                     });\r
121                 }\r
122             }\r
123         };\r
124     }\r
125 \r
126     static Datatype getDatatype(ReadGraph graph, Resource resource, RVI rvi) throws DatabaseException {\r
127         Variable configuration = Variables.getConfigurationContext(graph, resource);\r
128         Variable active = graph.syncRequest(new PossibleActiveVariableFromVariable(configuration));\r
129         Variable var = rvi.resolve(graph, active != null ? active : configuration);\r
130         return var.getDatatype(graph);\r
131     }\r
132 \r
133 }\r