package com.aerodynelabs.habtk.charts;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.jfree.data.Range;
import org.jfree.data.xy.AbstractXYDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYDomainInfo;
import com.aerodynelabs.map.MapPath;
@SuppressWarnings("serial")
public class ElevationTimeSeriesCollection extends AbstractXYDataset implements XYDataset, XYDomainInfo {
// XXX implement XYRangeInfo
private ArrayList<MapPath> data = new ArrayList<MapPath>();
@Override
public int getItemCount(int series) {
return data.get(series).getPath().size();
}
@Override
public Number getX(int series, int item) {
Long time = new Long(data.get(series).getPath().get(item).getTime());
time *= 1000l;
return time.doubleValue();
}
@Override
public Number getY(int series, int item) {
return data.get(series).getPath().get(item).getAltitude();
}
@Override
public int getSeriesCount() {
return data.size();
}
@Override
public Comparable<String> getSeriesKey(int series) {
// XXX Improve series keys for unnamed paths
String name = data.get(series).getName();
if(name == null) name = Integer.toString(data.get(series).hashCode());
return name;
}
public void addSeries(MapPath path) {
data.add(path);
super.fireDatasetChanged();
}
@SuppressWarnings("rawtypes")
@Override
public Range getDomainBounds(List visibleSeriesKeys, boolean includeInterval) {
long min = Long.MAX_VALUE;
long max = Long.MIN_VALUE;
for(int i = 0; i < data.size(); i++) {
for(int j = 0; j < visibleSeriesKeys.size(); j++) {
Object o = visibleSeriesKeys.get(j);
String key = o.toString();
if(getSeriesKey(i).equals(key)) {
MapPath path = data.get(i);
min = Math.min(min, path.getStartTime()*1000);
max = Math.max(max, path.getEndTime()*1000);
break;
}
}
}
if(min == Long.MAX_VALUE) return new Range(new Date().getTime(), new Date().getTime());
return new Range(min, max);
}
}