]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.charts/src/org/simantics/charts/ui/ChartItemLabelRule.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.charts / src / org / simantics / charts / ui / ChartItemLabelRule.java
1 package org.simantics.charts.ui;\r
2 \r
3 import java.util.Collections;\r
4 import java.util.Map;\r
5 \r
6 import org.simantics.browsing.ui.model.labels.LabelRule;\r
7 import org.simantics.charts.ontology.ChartResource;\r
8 import org.simantics.databoard.Bindings;\r
9 import org.simantics.databoard.Databoard;\r
10 import org.simantics.databoard.binding.Binding;\r
11 import org.simantics.databoard.util.URIStringUtils;\r
12 import org.simantics.db.ReadGraph;\r
13 import org.simantics.db.Resource;\r
14 import org.simantics.db.exception.DatabaseException;\r
15 import org.simantics.db.layer0.request.PossibleActiveExperiment;\r
16 import org.simantics.db.layer0.request.PossibleModel;\r
17 import org.simantics.db.layer0.variable.RVI;\r
18 import org.simantics.db.layer0.variable.Variable;\r
19 import org.simantics.db.layer0.variable.Variables;\r
20 import org.simantics.layer0.Layer0;\r
21 import org.simantics.modeling.ModelingResources;\r
22 import org.simantics.modeling.subscription.SubscriptionItemLabel;\r
23 \r
24 /**\r
25  * Used for labeling both chart plots and subscription items.\r
26  * \r
27  * @author Tuukka Lehtonen\r
28  */\r
29 public class ChartItemLabelRule implements LabelRule {\r
30 \r
31     public static final ChartItemLabelRule INSTANCE = new ChartItemLabelRule();\r
32 \r
33     @Override\r
34     public boolean isCompatible(Class<?> contentType) {\r
35         return contentType.equals(Resource.class);\r
36     }\r
37 \r
38     public String getLabel_(ReadGraph graph, Resource item) throws DatabaseException {\r
39         Layer0 L0 = Layer0.getInstance(graph);\r
40         ChartResource CHART = ChartResource.getInstance(graph);\r
41         ModelingResources MOD = ModelingResources.getInstance(graph);\r
42 \r
43         StringBuilder sb = new StringBuilder();\r
44 \r
45         Integer index = graph.getPossibleRelatedValue(item, CHART.Chart_Item_Index, Bindings.INTEGER);\r
46         sb.append( index==null ? "" : index+". " );\r
47 \r
48         String subscriptionItemLabel = null;\r
49         String unitStr = null;\r
50         SubscriptionState subscriptionState = SubscriptionState.IGNORE;\r
51         Resource subscriptionItem = graph.getPossibleObject(item, CHART.Chart_Item_HasSubscriptionItem);\r
52         if (subscriptionItem != null) {\r
53             subscriptionItemLabel = graph.getPossibleRelatedValue(subscriptionItem, L0.HasLabel, Bindings.STRING);\r
54 \r
55             Binding rviBinding = graph.getService(Databoard.class).getBindingUnchecked( RVI.class );\r
56             RVI rvi = graph.getPossibleRelatedValue(subscriptionItem, MOD.Subscription_Item_VariableId, rviBinding);\r
57 \r
58             // Create label from rvi if subscription has no label\r
59             if (subscriptionItemLabel == null || subscriptionItemLabel.isEmpty()) {\r
60                 Variable configuration = Variables.getPossibleConfigurationContext(graph, subscriptionItem);\r
61                 if (rvi != null && configuration != null) {\r
62                     subscriptionItemLabel = rvi.asPossibleString(graph, configuration);\r
63                     if (subscriptionItemLabel == null)\r
64                         subscriptionItemLabel = rvi.toPossibleString(graph, configuration);\r
65                     if (subscriptionItemLabel != null) {\r
66                         subscriptionItemLabel = SubscriptionItemLabel.removeVariablePrefixPath(subscriptionItemLabel);\r
67                         subscriptionItemLabel = URIStringUtils.unescape(subscriptionItemLabel);\r
68                     }\r
69                 }\r
70             }\r
71 \r
72             subscriptionState = getSubscriptionState(graph, rvi, subscriptionItem);\r
73             unitStr = graph.getPossibleRelatedValue(subscriptionItem, MOD.Subscription_Item_Unit, Bindings.STRING);\r
74         }\r
75         if (subscriptionItemLabel!=null) {\r
76             sb.append(subscriptionItemLabel);\r
77         } else {\r
78             sb.append("<not associated to a subscription item>");\r
79         }\r
80 \r
81         if ( unitStr != null && !unitStr.isEmpty() ) {\r
82             sb.append(" [");\r
83             sb.append(unitStr);\r
84             sb.append("]");\r
85         }\r
86 \r
87         if (subscriptionState == SubscriptionState.INVALID)\r
88             sb.append(" (invalid subscription)");\r
89 \r
90         return sb.toString();\r
91     }\r
92 \r
93     private static SubscriptionState getSubscriptionState(ReadGraph graph, RVI rvi, Resource subscriptionItem) throws DatabaseException {\r
94         Resource model = graph.sync( new PossibleModel(subscriptionItem) );\r
95         if (model == null)\r
96             return SubscriptionState.IGNORE;\r
97         Resource run = graph.sync( new PossibleActiveExperiment(model) );\r
98         if (run == null)\r
99             return SubscriptionState.IGNORE;\r
100         Variable base = Variables.getPossibleVariable(graph, run);\r
101         if (base == null)\r
102             return SubscriptionState.IGNORE;\r
103         Variable var = rvi.resolvePossible(graph, base);\r
104         return var != null ? SubscriptionState.VALID :  SubscriptionState.INVALID;\r
105     }\r
106 \r
107     @Override\r
108     public Map<String, String> getLabel(ReadGraph graph, Object content) throws DatabaseException {\r
109         return Collections.singletonMap(ChartItemImageRule.COLUMN_KEY, getLabel_(graph, (Resource) content));\r
110     }\r
111 \r
112     public static enum SubscriptionState {\r
113         IGNORE,\r
114         INVALID,\r
115         VALID\r
116     }\r
117 \r
118 }\r