--- /dev/null
+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];
+ }
+ }
+}