/*******************************************************************************
* Copyright (c) 2010 Oak Ridge National Laboratory.
* 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.nebula.visualization.xygraph.dataprovider;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.nebula.visualization.xygraph.linearscale.Range;
/**
* This gives the most common implementation of the {@link IDataProvider}
* interface.
*
* @author Xihui Chen
* @author Kay Kasemir (synchronization)
*/
public abstract class AbstractDataProvider implements IDataProvider {
protected boolean chronological = false;
protected List<IDataProviderListener> listeners;
protected Range xDataMinMax = null;
protected Range yDataMinMax = null;
/**
* @param trace
* the trace which the data provider will provide data to.
* @param chronological
* true if the data is sorted chronologically on xAxis, which
* means the data is sorted on X Axis.
*/
public AbstractDataProvider(boolean chronological) {
this.chronological = chronological;
listeners = new ArrayList<IDataProviderListener>();
}
/*
* (non-Javadoc)
*
* @see org.csstudio.sns.widgets.figureparts.IDataProvider#getSize()
*/
public abstract int getSize();
/*
* (non-Javadoc)
*
* @see org.csstudio.sns.widgets.figureparts.IDataProvider#getSample(int)
*/
public abstract ISample getSample(int index);
/**
* the update needed when {@link #fireDataChange()} was called.
*/
protected abstract void innerUpdate();
/**
* update xDataMinMax and yDataMinMax whenever data changed.
*/
protected abstract void updateDataRange();
/*
* (non-Javadoc)
*
* @see org.csstudio.sns.widgets.figureparts.IDataProvider#getXDataMinMax()
*/
synchronized public Range getXDataMinMax() {
if (getSize() <= 0)
return null;
updateDataRange();
return xDataMinMax;
}
/*
* (non-Javadoc)
*
* @see org.csstudio.sns.widgets.figureparts.IDataProvider#getYDataMinMax()
*/
synchronized public Range getYDataMinMax() {
if (getSize() <= 0)
return null;
updateDataRange();
return yDataMinMax;
}
/**
* @param chronological
* the chronological to set
*/
public void setChronological(boolean chronological) {
this.chronological = chronological;
}
/*
* (non-Javadoc)
*
* @see org.csstudio.sns.widgets.figureparts.IDataProvider#isChronological()
*/
public boolean isChronological() {
return chronological;
}
/*
* (non-Javadoc)
*
* @see org.csstudio.sns.widgets.figureparts.IDataProvider#
* addDataProviderListener (org.csstudio.sns.widgets.figureparts
* .IDataProviderListener)
*/
public void addDataProviderListener(final IDataProviderListener listener) {
if (listeners.contains(listener))
return;
listeners.add(listener);
}
/*
* (non-Javadoc)
*
* @see org.csstudio.sns.widgets.figureparts.IDataProvider#
* removeDataProviderListener (org.csstudio.sns.widgets.figureparts
* .IDataProviderListener)
*/
public boolean removeDataProviderListener(final IDataProviderListener listener) {
return listeners.remove(listener);
}
protected void fireDataChange() {
innerUpdate();
for (IDataProviderListener listener : listeners) {
listener.dataChanged(this);
}
}
}