]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.charts/src/org/simantics/charts/ui/AddVariableToChartAction.java
994624a8b1169d82adc3b0589f2968539a578905
[simantics/platform.git] / bundles / org.simantics.charts / src / org / simantics / charts / ui / AddVariableToChartAction.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2011 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.ArrayList;\r
15 import java.util.Collections;\r
16 import java.util.List;\r
17 \r
18 import org.eclipse.jface.dialogs.Dialog;\r
19 import org.eclipse.swt.widgets.Display;\r
20 import org.eclipse.swt.widgets.Shell;\r
21 import org.eclipse.ui.PlatformUI;\r
22 import org.simantics.Simantics;\r
23 import org.simantics.charts.query.AddChartItem;\r
24 import org.simantics.charts.query.ChartAndSubscriptionItemData;\r
25 import org.simantics.charts.query.ChartItemDescriptor;\r
26 import org.simantics.charts.query.NextChartItemIndexQuery;\r
27 import org.simantics.databoard.Bindings;\r
28 import org.simantics.databoard.type.BooleanType;\r
29 import org.simantics.db.ReadGraph;\r
30 import org.simantics.db.Resource;\r
31 import org.simantics.db.common.request.ReadRequest;\r
32 import org.simantics.db.exception.DatabaseException;\r
33 import org.simantics.db.layer0.request.PossibleModel;\r
34 import org.simantics.db.layer0.variable.Variable;\r
35 import org.simantics.db.layer0.variable.VariableReference;\r
36 import org.simantics.db.layer0.variable.Variables;\r
37 import org.simantics.layer0.Layer0;\r
38 import org.simantics.modeling.subscription.NewSubscription;\r
39 import org.simantics.modeling.subscription.NewSubscriptionItem;\r
40 import org.simantics.modeling.subscription.SubscriptionsQuery;\r
41 import org.simantics.modeling.subscription.SubscriptionsQuery.SubscriptionsResult;\r
42 import org.simantics.trend.configuration.TrendItem.Renderer;\r
43 import org.simantics.utils.ui.dialogs.ShowError;\r
44 \r
45 public class AddVariableToChartAction implements Runnable {\r
46 \r
47         Resource chart;\r
48         Resource subscription;\r
49         Resource model;\r
50         \r
51         String chartName;\r
52         String subscriptionName;\r
53         SubscriptionsResult subscriptions;\r
54         List<VariableReference> refs;\r
55         List<String> variableReferences; // String references\r
56         \r
57         public AddVariableToChartAction( Resource chart, Resource subscription, List<VariableReference> refs ) {\r
58                 this.refs = refs;\r
59                 this.chart = chart;\r
60                 this.subscription = subscription;\r
61         }\r
62         \r
63         /**\r
64          * Reads necessary data from session.\r
65          * \r
66          * @throws DatabaseException\r
67          */\r
68         public void init() throws DatabaseException \r
69         {\r
70         Simantics.getSession().sync( new ReadRequest() {\r
71                         @Override\r
72                         public void run(ReadGraph g) throws DatabaseException {\r
73                                 init(g);\r
74                         }\r
75                 } );\r
76         }\r
77 \r
78         /**\r
79          * Reads necessary data from session.\r
80          * \r
81          * @throws DatabaseException\r
82          */\r
83         public void init( ReadGraph g ) throws DatabaseException \r
84         {\r
85         Layer0 L0 = Layer0.getInstance(g);\r
86         if(chart != null) {\r
87             chartName = g.getPossibleRelatedValue(chart, L0.HasName, Bindings.STRING);\r
88             model = g.syncRequest(new PossibleModel(chart));\r
89         }\r
90         else\r
91             model = g.syncRequest(new PossibleModel(subscription));\r
92         if (model == null) throw new DatabaseException("Model was not found");\r
93 \r
94                 Variable configuration = Variables.getConfigurationContext(g, model);\r
95         \r
96                 subscriptions = g.sync( new SubscriptionsQuery(model) );\r
97                 if(subscription != null)\r
98                     subscriptionName = g.getPossibleRelatedValue(subscription, L0.HasLabel, Bindings.STRING);\r
99                 variableReferences = new ArrayList<String>();\r
100                 \r
101                 for (VariableReference var : refs) {\r
102                         if ( var.label == null ) {\r
103                                 variableReferences.add( var.getVariableId().toPossibleString(g, configuration) );\r
104                         }\r
105                 }\r
106         }\r
107         \r
108         /**\r
109          * Opens dialog, if clicked OK, writes to graph async.\r
110          * \r
111          * Remember to run this in SWT Thread.\r
112          */\r
113         public void runInSwt() {\r
114                                 \r
115             final Display display = Display.getCurrent();\r
116         final Shell shell = display.getActiveShell();\r
117 \r
118         Simantics.getSession().markUndoPoint();\r
119 \r
120                 for (int i=0; i<refs.size(); i++) {\r
121                         VariableReference var = refs.get(i);\r
122                         String varStrRef = variableReferences.get(i);\r
123 \r
124                 try {\r
125                 ChartAndSubscriptionItemData data = new ChartAndSubscriptionItemData();\r
126                 data.index = chart != null ? Simantics.sync(new NextChartItemIndexQuery(chart)) : -1;\r
127                 data.mutableCollectionSettings = true;\r
128                 data.chartName = chartName;\r
129                 data.hasSubscriptionItem = true;\r
130                 data.subscriptions = subscriptions.toNames();\r
131                 data.subscription = subscriptionName;\r
132                 data.binaryMode = var.getDatatype() instanceof BooleanType;\r
133                 data.variableReference = varStrRef;             \r
134                                 ChartAndSubscriptionItemDialog d = new ChartAndSubscriptionItemDialog(shell, data, chart != null); \r
135                                 \r
136                         if ( d.open() == Dialog.OK ) {\r
137                                 \r
138                                 // (New) Subscription\r
139                                 int j = subscriptions.names.indexOf( data.subscription );\r
140                                 Resource subscription;\r
141                                 if (j<0) {\r
142                                         // Create new subscription\r
143                                         NewSubscription ns = new NewSubscription(model, data.subscription);\r
144                                                 Simantics.getSession().sync( ns );\r
145                                         subscription = ns.subscription;\r
146                                 } else {\r
147                                         subscription = subscriptions.resources.get(j);\r
148                                 }                       \r
149                                 if ( subscription == null ) continue;\r
150                                 \r
151                                 \r
152                                 // New Subscription Item\r
153                                 NewSubscriptionItem ns = new NewSubscriptionItem(\r
154                                                 subscription,\r
155                                                 data.interval,\r
156                                                 data.deadband,\r
157                                                 data.gain,\r
158                                                 data.bias,\r
159                                                 data.unit,\r
160                                                 data.label,\r
161                                                 var.getVariableId(),\r
162                                                 var.getDatatype()\r
163                                                 );\r
164                                 \r
165                                 Simantics.getSession().sync( ns );\r
166                                 if (ns.subscriptionItem == null) continue;\r
167                                                         \r
168                                 // New Chart Item\r
169                                 if(chart != null) {\r
170                                 ChartItemDescriptor cid = new ChartItemDescriptor();\r
171                                 cid.drawMode = data.drawmode;\r
172                                 cid.renderer = var.getDatatype() instanceof BooleanType ? Renderer.Binary : Renderer.Analog;\r
173                                 cid.scale = data.scale;\r
174                                 cid.min = data.min;\r
175                                 cid.max = data.max;\r
176                                 cid.subscriptionItem = ns.subscriptionItem;\r
177                                 cid.color = data.color;\r
178                                 AddChartItem ci = new AddChartItem(     chart, Collections.singletonList( cid ) );\r
179                                 Simantics.getSession().sync( ci );\r
180                                 }\r
181                         }\r
182                         } catch (DatabaseException e) {\r
183                                 ShowError.showError(e.getClass().getName(), e.getLocalizedMessage(), e);\r
184                         }\r
185                         \r
186                 }\r
187                                 \r
188         }\r
189         \r
190         /**\r
191          * Executes run in SWT Thread\r
192          */\r
193         public void run() {\r
194             Display display = PlatformUI.getWorkbench().getDisplay();\r
195                 if ( display.getThread() == Thread.currentThread() ) {\r
196                         runInSwt();\r
197                 } else {\r
198                         display.asyncExec( new Runnable() {\r
199                                 @Override\r
200                                 public void run() {\r
201                                         runInSwt();\r
202                                 }} );\r
203                 }\r
204         }\r
205         \r
206 }\r
207 \r