--- /dev/null
+package org.simantics.charts.ui;\r
+\r
+import java.util.Collections;\r
+import java.util.Map;\r
+\r
+import org.simantics.browsing.ui.model.labels.LabelRule;\r
+import org.simantics.charts.ontology.ChartResource;\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.Databoard;\r
+import org.simantics.databoard.binding.Binding;\r
+import org.simantics.databoard.util.URIStringUtils;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.request.PossibleActiveExperiment;\r
+import org.simantics.db.layer0.request.PossibleModel;\r
+import org.simantics.db.layer0.variable.RVI;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.db.layer0.variable.Variables;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.modeling.ModelingResources;\r
+import org.simantics.modeling.subscription.SubscriptionItemLabel;\r
+\r
+/**\r
+ * Used for labeling both chart plots and subscription items.\r
+ * \r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class ChartItemLabelRule implements LabelRule {\r
+\r
+ public static final ChartItemLabelRule INSTANCE = new ChartItemLabelRule();\r
+\r
+ @Override\r
+ public boolean isCompatible(Class<?> contentType) {\r
+ return contentType.equals(Resource.class);\r
+ }\r
+\r
+ public String getLabel_(ReadGraph graph, Resource item) throws DatabaseException {\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ ChartResource CHART = ChartResource.getInstance(graph);\r
+ ModelingResources MOD = ModelingResources.getInstance(graph);\r
+\r
+ StringBuilder sb = new StringBuilder();\r
+\r
+ Integer index = graph.getPossibleRelatedValue(item, CHART.Chart_Item_Index, Bindings.INTEGER);\r
+ sb.append( index==null ? "" : index+". " );\r
+\r
+ String subscriptionItemLabel = null;\r
+ String unitStr = null;\r
+ SubscriptionState subscriptionState = SubscriptionState.IGNORE;\r
+ Resource subscriptionItem = graph.getPossibleObject(item, CHART.Chart_Item_HasSubscriptionItem);\r
+ if (subscriptionItem != null) {\r
+ subscriptionItemLabel = graph.getPossibleRelatedValue(subscriptionItem, L0.HasLabel, Bindings.STRING);\r
+\r
+ Binding rviBinding = graph.getService(Databoard.class).getBindingUnchecked( RVI.class );\r
+ RVI rvi = graph.getPossibleRelatedValue(subscriptionItem, MOD.Subscription_Item_VariableId, rviBinding);\r
+\r
+ // Create label from rvi if subscription has no label\r
+ if (subscriptionItemLabel == null || subscriptionItemLabel.isEmpty()) {\r
+ Variable configuration = Variables.getPossibleConfigurationContext(graph, subscriptionItem);\r
+ if (rvi != null && configuration != null) {\r
+ subscriptionItemLabel = rvi.asPossibleString(graph, configuration);\r
+ if (subscriptionItemLabel == null)\r
+ subscriptionItemLabel = rvi.toPossibleString(graph, configuration);\r
+ if (subscriptionItemLabel != null) {\r
+ subscriptionItemLabel = SubscriptionItemLabel.removeVariablePrefixPath(subscriptionItemLabel);\r
+ subscriptionItemLabel = URIStringUtils.unescape(subscriptionItemLabel);\r
+ }\r
+ }\r
+ }\r
+\r
+ subscriptionState = getSubscriptionState(graph, rvi, subscriptionItem);\r
+ unitStr = graph.getPossibleRelatedValue(subscriptionItem, MOD.Subscription_Item_Unit, Bindings.STRING);\r
+ }\r
+ if (subscriptionItemLabel!=null) {\r
+ sb.append(subscriptionItemLabel);\r
+ } else {\r
+ sb.append("<not associated to a subscription item>");\r
+ }\r
+\r
+ if ( unitStr != null && !unitStr.isEmpty() ) {\r
+ sb.append(" [");\r
+ sb.append(unitStr);\r
+ sb.append("]");\r
+ }\r
+\r
+ if (subscriptionState == SubscriptionState.INVALID)\r
+ sb.append(" (invalid subscription)");\r
+\r
+ return sb.toString();\r
+ }\r
+\r
+ private static SubscriptionState getSubscriptionState(ReadGraph graph, RVI rvi, Resource subscriptionItem) throws DatabaseException {\r
+ Resource model = graph.sync( new PossibleModel(subscriptionItem) );\r
+ if (model == null)\r
+ return SubscriptionState.IGNORE;\r
+ Resource run = graph.sync( new PossibleActiveExperiment(model) );\r
+ if (run == null)\r
+ return SubscriptionState.IGNORE;\r
+ Variable base = Variables.getPossibleVariable(graph, run);\r
+ if (base == null)\r
+ return SubscriptionState.IGNORE;\r
+ Variable var = rvi.resolvePossible(graph, base);\r
+ return var != null ? SubscriptionState.VALID : SubscriptionState.INVALID;\r
+ }\r
+\r
+ @Override\r
+ public Map<String, String> getLabel(ReadGraph graph, Object content) throws DatabaseException {\r
+ return Collections.singletonMap(ChartItemImageRule.COLUMN_KEY, getLabel_(graph, (Resource) content));\r
+ }\r
+\r
+ public static enum SubscriptionState {\r
+ IGNORE,\r
+ INVALID,\r
+ VALID\r
+ }\r
+\r
+}\r