/*******************************************************************************
* Copyright (c) 2013 Max Hohenegger.
* 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
*
* Contributors:
* Max Hohenegger - initial API and implementation - Bug 418168
*******************************************************************************/
package org.eclipse.nebula.visualization.xygraph.dataprovider;
import org.eclipse.nebula.visualization.xygraph.dataprovider.CircularBufferDataProvider;
import org.eclipse.nebula.visualization.xygraph.dataprovider.ISample;
import org.eclipse.nebula.visualization.xygraph.linearscale.Range;
/**
* {@link CircularBufferDataProvider} with a limited window on the trace data
* for computing data ranges.
*/
public class ClippedCircularBufferDataProvider extends CircularBufferDataProvider {
private int clippingWindow;
public ClippedCircularBufferDataProvider(boolean chronological, int bufferSize, int clippingWindow) {
super(chronological);
setBufferSize(bufferSize);
setClippingWindow(clippingWindow);
}
public void setClippingWindow(int clippingWindow) {
assert clippingWindow > 0;
assert clippingWindow <= getSize();
this.clippingWindow = clippingWindow;
}
public int getClippingWindow() {
return clippingWindow;
}
/**
* Ranges are computed from local min/max values from within the given
* window.
*/
@Override
protected void updateDataRange() {
if (!dataRangedirty)
return;
dataRangedirty = false;
if (getSize() > 0) {
int lowerBound = 0;
if (getSize() > clippingWindow) {
lowerBound = (getSize() - 1) - clippingWindow;
}
double xMin = getSample(lowerBound).getXValue();
double yMin = getSample(lowerBound).getYValue();
double xMax = xMin;
double yMax = yMin;
for (int i = lowerBound + 1; i < getSize(); i++) {
ISample dp = getSample(i);
if (xMin > dp.getXValue() - dp.getXMinusError())
xMin = dp.getXValue() - dp.getXMinusError();
if (xMax < dp.getXValue() + dp.getXPlusError())
xMax = dp.getXValue() + dp.getXPlusError();
if (yMin > dp.getYValue() - dp.getYMinusError())
yMin = dp.getYValue() - dp.getYMinusError();
if (yMax < dp.getYValue() + dp.getYPlusError())
yMax = dp.getYValue() + dp.getYPlusError();
}
xDataMinMax = new Range(xMin, xMax);
yDataMinMax = new Range(yMin, yMax);
} else {
xDataMinMax = null;
yDataMinMax = null;
}
}
}