]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.charts/src/org/simantics/charts/query/AddChartItem.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.charts / src / org / simantics / charts / query / AddChartItem.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2011 Association for Decentralized Information Management\r
3  * in 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.query;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collection;\r
16 import java.util.List;\r
17 import java.util.Set;\r
18 \r
19 import org.eclipse.core.runtime.preferences.IEclipsePreferences;\r
20 import org.eclipse.core.runtime.preferences.InstanceScope;\r
21 import org.simantics.charts.ontology.ChartResource;\r
22 import org.simantics.charts.preference.ChartPreferences;\r
23 import org.simantics.databoard.Bindings;\r
24 import org.simantics.databoard.type.BooleanType;\r
25 import org.simantics.databoard.type.Datatype;\r
26 import org.simantics.db.ReadGraph;\r
27 import org.simantics.db.Resource;\r
28 import org.simantics.db.WriteGraph;\r
29 import org.simantics.db.common.CommentMetadata;\r
30 import org.simantics.db.common.request.Queries;\r
31 import org.simantics.db.common.request.WriteResultRequest;\r
32 import org.simantics.db.exception.DatabaseException;\r
33 import org.simantics.db.request.WriteResult;\r
34 import org.simantics.diagram.stubs.G2DResource;\r
35 import org.simantics.layer0.Layer0;\r
36 import org.simantics.modeling.ModelingResources;\r
37 import org.simantics.trend.configuration.Scale;\r
38 import org.simantics.trend.configuration.TrendItem.DrawMode;\r
39 import org.simantics.trend.configuration.TrendItem.Renderer;\r
40 \r
41 /**\r
42  * @author Tuukka Lehtonen\r
43  */\r
44 public class AddChartItem extends WriteResultRequest<Collection<Resource>> {\r
45 \r
46     Resource chart;\r
47     Collection<ChartItemDescriptor> items;\r
48     public Resource chartItem;\r
49 \r
50     public AddChartItem(Resource chart, Collection<ChartItemDescriptor> items) {\r
51         this.chart = chart;\r
52         this.items = items;\r
53     }\r
54 \r
55     @Override\r
56     public Collection<Resource> perform(WriteGraph graph) throws DatabaseException {\r
57         Layer0 L0 = Layer0.getInstance(graph);\r
58         ChartResource CHART = ChartResource.getInstance(graph);\r
59 \r
60         int nextIndex = graph.sync( new NextChartItemIndexQuery(chart) );\r
61         \r
62         List<Resource> result = new ArrayList<Resource>();\r
63         \r
64         nextReference:\r
65             for (ChartItemDescriptor desc : items) {\r
66                 if (desc.subscriptionItem == null)\r
67                     continue;\r
68 \r
69                 // Ensure plot is not already in the chart\r
70                 for (Resource chartItem : graph.syncRequest(Queries.objectsWithType(chart, L0.ConsistsOf, CHART.Chart_Item))) {\r
71                     Resource subscriptionItem = graph.getPossibleObject(chartItem, CHART.Chart_Item_HasSubscriptionItem);\r
72                     if (desc.subscriptionItem.equals(subscriptionItem)) {\r
73                         // Update fields\r
74                         if ( desc.index!=null ) {\r
75                             graph.claimLiteral(chartItem, CHART.Chart_Item_Index, desc.index);\r
76                             if (desc.min!=null) graph.claimLiteral(chartItem, CHART.Chart_Item_ScaleMode_Min, desc.min, Bindings.DOUBLE);\r
77                             if (desc.max!=null) graph.claimLiteral(chartItem, CHART.Chart_Item_ScaleMode_Max, desc.max, Bindings.DOUBLE);\r
78                             if (desc.renderer!=null) graph.claim(chartItem, CHART.Chart_Item_Renderer, getRenderer(graph, desc.renderer));\r
79                             if (desc.subscriptionItem!=null) graph.claim(chartItem, CHART.Chart_Item_HasSubscriptionItem, desc.subscriptionItem);\r
80                             \r
81                             Resource rdm = getDrawmode( graph, desc.drawMode );\r
82                             if ( rdm != null ) graph.claim(chartItem, CHART.Chart_Item_DrawMode, rdm);\r
83                         }\r
84                         continue nextReference;\r
85                     }\r
86                 }\r
87 \r
88                 // Create & Link new plot\r
89                 Resource chartItem = graph.newResource();\r
90                 graph.claim(chartItem, L0.InstanceOf, null, CHART.Chart_Item);\r
91                 graph.claim(chart, L0.ConsistsOf, chartItem);\r
92                 graph.claimLiteral(chartItem, L0.HasName, desc.name, Bindings.STRING);\r
93                 graph.claim(chartItem, CHART.Chart_Item_HasSubscriptionItem, desc.subscriptionItem);\r
94                 graph.claim(chartItem, CHART.Chart_Item_Renderer, getRenderer(graph, desc.renderer));\r
95                 int index = desc.index!=null ? desc.index : nextIndex++;\r
96                 graph.claimLiteral(chartItem, CHART.Chart_Item_Index, index);\r
97                 if (desc.color != null)\r
98                     graph.claimLiteral(chartItem, G2DResource.getInstance(graph).HasColor, desc.color, Bindings.FLOAT_ARRAY);\r
99 \r
100                 IEclipsePreferences pn = InstanceScope.INSTANCE.getNode( ChartPreferences.P_NODE );\r
101 \r
102                 // Draw Mode\r
103                 {\r
104                     String sdm = pn.get(ChartPreferences.P_DRAWMODE, ChartPreferences.DEFAULT_DRAWMODE);\r
105                     DrawMode dm = desc.drawMode != null ? desc.drawMode : DrawMode.valueOf( sdm );\r
106                     Resource rdm = getDrawmode( graph, dm );\r
107                     if ( rdm != null ) {\r
108                         graph.claim(chartItem, CHART.Chart_Item_DrawMode, rdm);\r
109                     }\r
110                 }\r
111 \r
112                 // Scale Mode\r
113                 {\r
114                         Scale scale = desc.scale;\r
115                         if ( scale == null ) {\r
116                         String sdm = pn.get(ChartPreferences.P_SCALEMODE, ChartPreferences.DEFAULT_SCALEMODE);\r
117                         if ( sdm.equals("Auto") ) {\r
118                                 scale = new Scale.Auto();\r
119                         } else {\r
120                                 scale = new Scale.Manual(0, 100);\r
121                         }                               \r
122                         }\r
123                         \r
124                     if ( scale instanceof Scale.Auto ) {\r
125                         Resource r = CHART.ScaleMode_AutoScale;\r
126                         graph.claim(chartItem, CHART.Chart_Item_ScaleMode, r);\r
127                     } else {\r
128                         graph.claim(chartItem, CHART.Chart_Item_ScaleMode, CHART.ScaleMode_ManualScale);\r
129                     }\r
130 \r
131                     if (desc.min!=null) graph.claimLiteral(chartItem, CHART.Chart_Item_ScaleMode_Min, desc.min, Bindings.DOUBLE);\r
132                     if (desc.max!=null) graph.claimLiteral(chartItem, CHART.Chart_Item_ScaleMode_Max, desc.max, Bindings.DOUBLE);\r
133                 }\r
134                 \r
135                 this.chartItem = chartItem;\r
136                 \r
137                 result.add(chartItem);\r
138                 \r
139                 CommentMetadata cm = graph.getMetadata(CommentMetadata.class);\r
140                 graph.addMetadata(cm.add("Added chart item " + chartItem));\r
141             }\r
142         \r
143         return result;\r
144         \r
145     }\r
146 \r
147     public static Resource getDrawmode(ReadGraph graph, DrawMode dm)\r
148     {\r
149         ChartResource CHART = ChartResource.getInstance(graph);\r
150         if ( dm == DrawMode.Average ) return CHART.DrawMode_Average;\r
151         if ( dm == DrawMode.Sample ) return CHART.DrawMode_Sample;\r
152         if ( dm == DrawMode.Line ) return CHART.DrawMode_Line;\r
153         if ( dm == DrawMode.Deviation ) return CHART.DrawMode_Deviation;\r
154         if ( dm == DrawMode.DeviationAndAverage ) return CHART.DrawMode_DeviationAndAverage;\r
155         if ( dm == DrawMode.DeviationAndLine ) return CHART.DrawMode_DeviationAndLine;\r
156         if ( dm == DrawMode.DeviationAndSample ) return CHART.DrawMode_DeviationAndSample;\r
157         return null;\r
158     }\r
159     \r
160     public static Resource getRenderer(ReadGraph graph, Renderer renderer) {\r
161         ChartResource CHART = ChartResource.getInstance(graph);\r
162         switch (renderer) {\r
163             case Analog:\r
164                 return CHART.Renderer_Analog;\r
165             case Binary:\r
166                 return CHART.Renderer_Binary;\r
167             default:\r
168                 throw new UnsupportedOperationException("invalid renderer: " + renderer);\r
169         }\r
170     }\r
171 \r
172     public static ChartItemDescriptor createDescriptor(ReadGraph graph, Resource subscriptionItem) throws DatabaseException {\r
173         ModelingResources MOD = ModelingResources.getInstance(graph);\r
174 \r
175         ChartItemDescriptor desc = new ChartItemDescriptor();\r
176         desc.subscriptionItem = subscriptionItem;\r
177         Datatype datatype = graph.getPossibleRelatedValue(subscriptionItem, MOD.Subscription_Item_Datatype, Bindings.getBindingUnchecked(Datatype.class));\r
178         desc.renderer = datatype instanceof BooleanType ? Renderer.Binary : Renderer.Analog;\r
179 \r
180         return desc;\r
181     }\r
182 \r
183     public static WriteResult<Collection<Resource>> addAndMoveChartItems(final Resource chart, final List<ChartItemDescriptor> references,\r
184             final Set<Resource> movedPlots) {\r
185         return new WriteResultRequest<Collection<Resource>>() {\r
186             @Override\r
187             public Collection<Resource> perform(WriteGraph graph) throws DatabaseException {\r
188                 List<Resource> result = new ArrayList<Resource>();\r
189                 result.addAll(new AddChartItem(chart, references).perform(graph));\r
190                 Layer0 L0 = Layer0.getInstance(graph);\r
191                 for (Resource plot : movedPlots) {\r
192                     graph.deny(plot, L0.PartOf);\r
193                     graph.claim(chart, L0.ConsistsOf, plot);\r
194                     result.add(plot);\r
195                 }\r
196                 return result;\r
197             }\r
198         };\r
199     }\r
200 \r
201 }\r