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