analysis.lami: correctly handle Number (double, long etc.) type graphing
[deliverable/tracecompass.git] / analysis / org.eclipse.tracecompass.analysis.lami.ui / src / org / eclipse / tracecompass / internal / provisional / analysis / lami / ui / format / LamiLabelFormat.java
diff --git a/analysis/org.eclipse.tracecompass.analysis.lami.ui/src/org/eclipse/tracecompass/internal/provisional/analysis/lami/ui/format/LamiLabelFormat.java b/analysis/org.eclipse.tracecompass.analysis.lami.ui/src/org/eclipse/tracecompass/internal/provisional/analysis/lami/ui/format/LamiLabelFormat.java
new file mode 100644 (file)
index 0000000..9574789
--- /dev/null
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EfficiOS Inc., Jonathan Rajotte-Julien
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.internal.provisional.analysis.lami.ui.format;
+
+import java.text.FieldPosition;
+import java.text.Format;
+import java.text.ParsePosition;
+import java.util.Map.Entry;
+
+
+import org.eclipse.jdt.annotation.Nullable;
+
+import com.google.common.collect.BiMap;
+
+/**
+ * Format label based on a given Map<String, Integer>
+ *
+ * @author Jonathan Rajotte-Julien
+ */
+public class LamiLabelFormat extends Format {
+
+    private static final long serialVersionUID = 4939553034329681316L;
+
+    private static final String SWTCHART_EMPTY_LABEL = " "; //$NON-NLS-1$
+    private static final String UNKNOWN_REPRESENTATION = "?"; //$NON-NLS-1$
+    private final BiMap<@Nullable String, Integer> fMap;
+
+    /**
+     * Constructor
+     *
+     * @param map
+     *            Map of indices to labels
+     */
+    public LamiLabelFormat(BiMap<@Nullable String, Integer> map) {
+        super();
+        fMap = map;
+    }
+
+    @Override
+    public @Nullable StringBuffer format(@Nullable Object obj, @Nullable StringBuffer toAppendTo, @Nullable FieldPosition pos) {
+        if (obj == null || toAppendTo == null) {
+            return new StringBuffer(SWTCHART_EMPTY_LABEL);
+        }
+
+        Double doubleObj = (Double) obj;
+
+        /*
+         * Return a string buffer with a space in it since SWT does not like to
+         * draw empty strings.
+         */
+        if ((doubleObj % 1 != 0) || !fMap.containsValue((doubleObj.intValue()))) {
+            return new StringBuffer(SWTCHART_EMPTY_LABEL);
+        }
+
+        for (Entry<@Nullable String, Integer> entry : fMap.entrySet()) {
+            /*
+             * FIXME: Find if the elements are the same, based on their double
+             * value, because SWTChart uses double values so we do the same
+             * check. The loss of precision could lead to false positives.
+             */
+            if (Double.compare(entry.getValue().doubleValue(), doubleObj.doubleValue()) == 0) {
+                if (entry.getKey() == null) {
+                    return new StringBuffer(UNKNOWN_REPRESENTATION);
+                }
+                return toAppendTo.append(entry.getKey());
+            }
+        }
+        return new StringBuffer(SWTCHART_EMPTY_LABEL);
+    }
+
+    @Override
+    public @Nullable Object parseObject(@Nullable String source, @Nullable ParsePosition pos) {
+        return fMap.get(source);
+    }
+
+}
This page took 0.025534 seconds and 5 git commands to generate.