]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/SCLAction.java
47c7d346657d2caa7116a332a5f79860a6fb6e4a
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / SCLAction.java
1 package org.simantics.modeling;
2
3 import org.simantics.Simantics;
4 import org.simantics.db.ReadGraph;
5 import org.simantics.db.Resource;
6 import org.simantics.db.common.request.ResourceRead;
7 import org.simantics.db.exception.DatabaseException;
8 import org.simantics.db.layer0.adapter.ActionFactory;
9 import org.simantics.db.layer0.variable.Variable;
10 import org.simantics.db.layer0.variable.Variables;
11 import org.simantics.diagram.Logger;
12 import org.simantics.scl.runtime.function.Function1;
13
14 public class SCLAction implements ActionFactory {
15
16         final private Resource rule;
17     
18     public SCLAction(ReadGraph graph, Resource rule) throws DatabaseException {
19         this.rule = rule;
20     }
21     
22     static class RuleFunctionRequest extends ResourceRead<Function1<Resource,Object>> {
23
24                 protected RuleFunctionRequest(Resource rule) {
25                         super(rule);
26                 }
27
28                 @Override
29                 public Function1<Resource, Object> perform(ReadGraph graph) throws DatabaseException {
30                 Variable ruleVariable = Variables.getVariable(graph, resource);
31                 ModelingResources MOD = ModelingResources.getInstance(graph);
32                 return ruleVariable.getPossiblePropertyValue(graph, MOD.SCLAction_action);
33                 }
34         
35     }
36     
37     public static class SCLActionRunnable implements Runnable {
38         
39         public Resource rule;
40         public Resource target;
41         
42         public SCLActionRunnable(Resource rule, Resource target) {
43                 this.rule = rule;
44                 this.target = target;
45         }
46         
47                 @Override
48                 public void run() {
49                         Resource resource = (Resource)target;
50                         Simantics.getSession().markUndoPoint();
51                         try {
52                                 Function1<Resource, Object> function = Simantics.getSession().syncRequest(new RuleFunctionRequest(rule));
53                                 function.apply(resource);
54                         } catch (DatabaseException e) {
55                                 Logger.defaultLogError(e);
56                         }
57                 }
58         
59     }
60
61         @Override
62         public Runnable create(final Object target) {
63                 return new SCLActionRunnable(rule, (Resource)target);
64         }
65
66 }