1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2011 Association for Decentralized Information Management in
\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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.charts.ui;
\r
14 import java.util.ArrayList;
\r
15 import java.util.Collections;
\r
16 import java.util.List;
\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
45 public class AddVariableToChartAction implements Runnable {
\r
48 Resource subscription;
\r
52 String subscriptionName;
\r
53 SubscriptionsResult subscriptions;
\r
54 List<VariableReference> refs;
\r
55 List<String> variableReferences; // String references
\r
57 public AddVariableToChartAction( Resource chart, Resource subscription, List<VariableReference> refs ) {
\r
60 this.subscription = subscription;
\r
64 * Reads necessary data from session.
\r
66 * @throws DatabaseException
\r
68 public void init() throws DatabaseException
\r
70 Simantics.getSession().sync( new ReadRequest() {
\r
72 public void run(ReadGraph g) throws DatabaseException {
\r
79 * Reads necessary data from session.
\r
81 * @throws DatabaseException
\r
83 public void init( ReadGraph g ) throws DatabaseException
\r
85 Layer0 L0 = Layer0.getInstance(g);
\r
87 chartName = g.getPossibleRelatedValue(chart, L0.HasName, Bindings.STRING);
\r
88 model = g.syncRequest(new PossibleModel(chart));
\r
91 model = g.syncRequest(new PossibleModel(subscription));
\r
92 if (model == null) throw new DatabaseException("Model was not found");
\r
94 Variable configuration = Variables.getConfigurationContext(g, model);
\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
101 for (VariableReference var : refs) {
\r
102 if ( var.label == null ) {
\r
103 variableReferences.add( var.getVariableId().toPossibleString(g, configuration) );
\r
109 * Opens dialog, if clicked OK, writes to graph async.
\r
111 * Remember to run this in SWT Thread.
\r
113 public void runInSwt() {
\r
115 final Display display = Display.getCurrent();
\r
116 final Shell shell = display.getActiveShell();
\r
118 Simantics.getSession().markUndoPoint();
\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
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
136 if ( d.open() == Dialog.OK ) {
\r
138 // (New) Subscription
\r
139 int j = subscriptions.names.indexOf( data.subscription );
\r
140 Resource subscription;
\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
147 subscription = subscriptions.resources.get(j);
\r
149 if ( subscription == null ) continue;
\r
152 // New Subscription Item
\r
153 NewSubscriptionItem ns = new NewSubscriptionItem(
\r
161 var.getVariableId(),
\r
165 Simantics.getSession().sync( ns );
\r
166 if (ns.subscriptionItem == null) continue;
\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
182 } catch (DatabaseException e) {
\r
183 ShowError.showError(e.getClass().getName(), e.getLocalizedMessage(), e);
\r
191 * Executes run in SWT Thread
\r
193 public void run() {
\r
194 Display display = PlatformUI.getWorkbench().getDisplay();
\r
195 if ( display.getThread() == Thread.currentThread() ) {
\r
198 display.asyncExec( new Runnable() {
\r
200 public void run() {
\r