package tim.prune.gui.profile;
import tim.prune.data.Track;
import tim.prune.data.UnitSet;
/**
* Abstract class for all sources of profile data,
* including altitudes and speeds
*/
public abstract class ProfileData
{
/** Track object */
protected final Track _track;
/** Unit set to use */
protected UnitSet _unitSet = null;
/** Flag for availability of any data */
protected boolean _hasData = false;
/** Array of booleans for data per point */
protected boolean[] _pointHasData = null;
/** Array of values per point */
protected double[] _pointValues = null;
/** Minimum value for track */
protected double _minValue = 0.0;
/** Maximum value for track */
protected double _maxValue = 0.0;
/**
* Constructor giving track object
* @param inTrack track object
*/
public ProfileData(Track inTrack)
{
_track = inTrack;
}
/**
* @return true if this source has any data at all
*/
public boolean hasData() {
return _hasData;
}
/**
* @param inPointNum index of point
* @return true if that point has data
*/
public boolean hasData(int inPointNum)
{
return (_hasData && _pointHasData != null && inPointNum >= 0
&& inPointNum < _pointHasData.length && _pointHasData[inPointNum]);
}
/**
* @param inPointNum index of point
* @return value corresponding to that point
*/
public double getData(int inPointNum)
{
if (!hasData(inPointNum)) {return 0.0;}
return _pointValues[inPointNum];
}
/**
* @return minimum value
*/
public double getMinValue() {
return _minValue;
}
/**
* @return maximum value
*/
public double getMaxValue() {
return _maxValue;
}
/**
* Get the data from the track and populate the value arrays
*/
public abstract void init(UnitSet inUnitSet);
/**
* Set the UnitSet to use for the calculations
* @param inUnitSet unit set
*/
protected void setUnitSet(UnitSet inUnitSet) {
_unitSet = inUnitSet;
}
/**
* @return text for label including units
*/
public abstract String getLabel();
/**
* @return key for message when no data available
*/
public abstract String getNoDataKey();
/**
* Initialise the data arrays to the correct size
*/
protected void initArrays()
{
int numTrackPoints = _track.getNumPoints();
if (_pointHasData == null || _pointHasData.length != numTrackPoints)
{
_pointHasData = new boolean[numTrackPoints];
_pointValues = new double[numTrackPoints];
}
}
}