/*******************************************************************************
* 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);
}
}