package simpleScope;

import java.nio.DoubleBuffer;
import org.jfree.data.general.DatasetChangeEvent;
import org.jfree.data.xy.AbstractIntervalXYDataset;

/**
 * A slightly faster {@link JFreeChartGraph} dataset backed by a DoubleBuffer
 *  * 
 * @author oliford
 */
public class DoubleBufferDataset extends AbstractIntervalXYDataset {
	private static final long serialVersionUID = 3280193143019651604L;
		
	private Comparable seriesKey;
	
	private DoubleBuffer dBuf;
		
	private double x0, x1, dx;	
	private int nSeries;
	
	public DoubleBufferDataset(Comparable seriesKey) {
		this.seriesKey = seriesKey;
		dBuf = null;
	}
	
	public void setData(DoubleBuffer dBuf, int nSeries, double x0, double x1, double dx){
		synchronized (this) {
			this.nSeries = nSeries;
			this.x0 = x0;
			this.x1 = x1;
			this.dx = dx;
			this.dBuf = dBuf;
		}
	}
	
	public void updateGraph() {	
		DatasetChangeEvent evt = new DatasetChangeEvent(this, this);
		notifyListeners(evt);				
	}	
	
	@Override
	public Comparable getSeriesKey(int series) { return seriesKey;	}
		
	@Override
	public Number getStartX(int series, int item) {
		return x0 + item * dx - dx/2;
	}

	@Override
	public Number getEndX(int series, int item) {
		return x0 + item * dx + dx/2;
	}

	@Override
	public Number getStartY(int series, int item) {
		return getY(series, item);
	}

	@Override
	public Number getEndY(int series, int item) {
		return getY(series, item);
	}

	@Override
	public int getItemCount(int series) {
		return (int)((x1 - x0) / dx);
	}

	@Override
	public Number getX(int series, int item) {
		return x0 + item * dx;
	}

	@Override
	public Number getY(int series, int item) {
		synchronized (this) {
			int i = item * nSeries + series;
			return (dBuf == null || i < 0 || i >= dBuf.capacity()) ? Double.NaN : dBuf.get(i);			
		}
	}

	@Override
	public int getSeriesCount() {
		return nSeries;
	}
	
	
}
