]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.charts/src/org/simantics/charts/ui/ChartItemLabelRule.java b/bundles/org.simantics.charts/src/org/simantics/charts/ui/ChartItemLabelRule.java
new file mode 100644 (file)
index 0000000..189c9e0
--- /dev/null
@@ -0,0 +1,118 @@
+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