+package tim.prune.function.autoplay;
+
+import tim.prune.data.DataPoint;
+import tim.prune.data.Timestamp;
+
+/**
+ * Holds the information about a single point required for the sorting
+ */
+public class PointInfo implements Comparable<PointInfo>
+{
+ /** Timestamp of the point, if any */
+ private Timestamp _timestamp = null;
+ /** Point index in the track */
+ private int _pointIndex = 0;
+ /** Segment flag of point */
+ private boolean _segmentFlag = false;
+
+
+ /**
+ * Constructor
+ * @param inPoint point from track
+ * @param inIndex index of point in track
+ */
+ public PointInfo(DataPoint inPoint, int inIndex)
+ {
+ if (inPoint.hasTimestamp())
+ {
+ _timestamp = inPoint.getTimestamp();
+ }
+ else if (inPoint.getPhoto() != null && inPoint.getPhoto().hasTimestamp())
+ {
+ _timestamp = inPoint.getPhoto().getTimestamp();
+ }
+ _pointIndex = inIndex;
+ _segmentFlag = inPoint.getSegmentStart();
+ }
+
+ /** @return timestamp */
+ public Timestamp getTimestamp() {
+ return _timestamp;
+ }
+
+ /** @return point index */
+ public int getIndex() {
+ return _pointIndex;
+ }
+
+ /** @return segment flag */
+ public boolean getSegmentFlag() {
+ return _segmentFlag;
+ }
+
+ /**
+ * Sort two objects by timestamp and if times equal then by point index
+ */
+ public int compareTo(PointInfo inOther)
+ {
+ long timeDiff = 0;
+ final boolean thisHasTime = (_timestamp != null);
+ final boolean otherHasTime = (inOther._timestamp != null);
+ if (thisHasTime && otherHasTime)
+ {
+ timeDiff = _timestamp.getMillisecondsSince(inOther._timestamp);
+ }
+ else if (thisHasTime)
+ {
+ timeDiff = -1; // points without time to the end
+ }
+ else if (otherHasTime)
+ {
+ timeDiff = 1;
+ }
+ // If the times are equal (or both missing) then use the point index
+ if (timeDiff == 0) {
+ return _pointIndex - inOther._pointIndex;
+ }
+ // Otherwise, compare by time
+ return (timeDiff < 0 ? -1 : 1);
+ }
+
+ @Override
+ public boolean equals(Object inOther)
+ {
+ if (inOther == null) return false;
+ try
+ {
+ PointInfo other = (PointInfo) inOther;
+ if (_pointIndex != other._pointIndex) return false;
+ final boolean thisHasTime = (_timestamp != null);
+ final boolean otherHasTime = (other._timestamp != null);
+ if (thisHasTime != otherHasTime) {return false;}
+ if (!thisHasTime && !otherHasTime) {return true;}
+ return _timestamp.isEqual(other._timestamp);
+ }
+ catch (ClassCastException cce) {}
+ return false;
+ }
+}