]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.charts/src/org/simantics/charts/ui/AddVariableToChartAction.java
Sync git svn branch with SVN repository r33406.
[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 AddVariableToChartAction 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         return this;\r
77         }\r
78 \r
79         /**\r
80          * Reads necessary data from session.\r
81          * \r
82          * @throws DatabaseException\r
83          */\r
84         public AddVariableToChartAction init( ReadGraph g ) throws DatabaseException \r
85         {\r
86         Layer0 L0 = Layer0.getInstance(g);\r
87         if(chart != null) {\r
88             chartName = g.getPossibleRelatedValue(chart, L0.HasName, Bindings.STRING);\r
89             model = g.syncRequest(new PossibleModel(chart));\r
90         }\r
91         else\r
92             model = g.syncRequest(new PossibleModel(subscription));\r
93         if (model == null) throw new DatabaseException("Model was not found");\r
94 \r
95                 Variable configuration = Variables.getConfigurationContext(g, model);\r
96         \r
97                 subscriptions = g.sync( new SubscriptionsQuery(model) );\r
98                 if(subscription != null)\r
99                     subscriptionName = g.getPossibleRelatedValue(subscription, L0.HasLabel, Bindings.STRING);\r
100                 variableReferences = new ArrayList<String>();\r
101                 \r
102                 for (VariableReference var : refs) {\r
103                         if ( var.label == null ) {\r
104                                 variableReferences.add( var.getVariableId().toPossibleString(g, configuration) );\r
105                         }\r
106                 }\r
107 \r
108                 return this;\r
109         }\r
110         \r
111         /**\r
112          * Opens dialog, if clicked OK, writes to graph async.\r
113          * \r
114          * Remember to run this in SWT Thread.\r
115          */\r
116         public void runInSwt() {\r
117                                 \r
118             final Display display = Display.getCurrent();\r
119         final Shell shell = display.getActiveShell();\r
120 \r
121         Simantics.getSession().markUndoPoint();\r
122 \r
123                 for (int i=0; i<refs.size(); i++) {\r
124                         VariableReference var = refs.get(i);\r
125                         String varStrRef = variableReferences.get(i);\r
126 \r
127                 try {\r
128                 ChartAndSubscriptionItemData data = new ChartAndSubscriptionItemData();\r
129                 data.index = chart != null ? Simantics.sync(new NextChartItemIndexQuery(chart)) : -1;\r
130                 data.mutableCollectionSettings = true;\r
131                 data.chartName = chartName;\r
132                 data.hasSubscriptionItem = true;\r
133                 data.subscriptions = subscriptions.toNames();\r
134                 data.subscription = subscriptionName;\r
135                 data.binaryMode = var.getDatatype() instanceof BooleanType;\r
136                 data.variableReference = varStrRef;             \r
137                                 ChartAndSubscriptionItemDialog d = new ChartAndSubscriptionItemDialog(shell, data, chart != null); \r
138                                 \r
139                         if ( d.open() == Dialog.OK ) {\r
140                                 \r
141                                 // (New) Subscription\r
142                                 int j = subscriptions.names.indexOf( data.subscription );\r
143                                 Resource subscription;\r
144                                 if (j<0) {\r
145                                         // Create new subscription\r
146                                         NewSubscription ns = new NewSubscription(model, data.subscription);\r
147                                                 Simantics.getSession().sync( ns );\r
148                                         subscription = ns.subscription;\r
149                                 } else {\r
150                                         subscription = subscriptions.resources.get(j);\r
151                                 }                       \r
152                                 if ( subscription == null ) continue;\r
153                                 \r
154                                 \r
155                                 // New Subscription Item\r
156                                 NewSubscriptionItem ns = new NewSubscriptionItem(\r
157                                                 subscription,\r
158                                                 data.interval,\r
159                                                 data.deadband,\r
160                                                 data.gain,\r
161                                                 data.bias,\r
162                                                 data.unit,\r
163                                                 data.label,\r
164                                                 var.getVariableId(),\r
165                                                 var.getDatatype()\r
166                                                 );\r
167                                 \r
168                                 Simantics.getSession().sync( ns );\r
169                                 if (ns.subscriptionItem == null) continue;\r
170                                                         \r
171                                 // New Chart Item\r
172                                 if(chart != null) {\r
173                                 ChartItemDescriptor cid = new ChartItemDescriptor();\r
174                                 cid.drawMode = data.drawmode;\r
175                                 cid.renderer = var.getDatatype() instanceof BooleanType ? Renderer.Binary : Renderer.Analog;\r
176                                 cid.scale = data.scale;\r
177                                 cid.min = data.min;\r
178                                 cid.max = data.max;\r
179                                 cid.subscriptionItem = ns.subscriptionItem;\r
180                                 cid.color = data.color;\r
181                                 AddChartItem ci = new AddChartItem(     chart, Collections.singletonList( cid ) );\r
182                                 Simantics.getSession().sync( ci );\r
183                                 }\r
184                         }\r
185                         } catch (DatabaseException e) {\r
186                                 ShowError.showError(e.getClass().getName(), e.getLocalizedMessage(), e);\r
187                         }\r
188                         \r
189                 }\r
190                                 \r
191         }\r
192         \r
193         /**\r
194          * Executes run in SWT Thread\r
195          */\r
196         public void run() {\r
197             Display display = PlatformUI.getWorkbench().getDisplay();\r
198                 if ( display.getThread() == Thread.currentThread() ) {\r
199                         runInSwt();\r
200                 } else {\r
201                         display.asyncExec( new Runnable() {\r
202                                 @Override\r
203                                 public void run() {\r
204                                         runInSwt();\r
205                                 }} );\r
206                 }\r
207         }\r
208         \r
209 }\r
210 \r