--- /dev/null
+package tim.prune.function.deletebydate;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * List of date info objects for use by the table model
+ */
+public class DateInfoList
+{
+ /** list of info about points according to date */
+ private List<DateInfo> _infoList = new ArrayList<DateInfo>();
+ /** previously used dateinfo object to reduce list searching */
+ private DateInfo _previousInfo = null;
+ /** true if the list has been sorted, false otherwise */
+ private boolean _hasBeenSorted = false;
+
+
+ /**
+ * Add a point to the corresponding dateinfo
+ * @param inDate date of current point, or null if no timestamp
+ */
+ public void addPoint(Date inDate)
+ {
+ DateInfo currentInfo = null;
+ if (_previousInfo != null && _previousInfo.isSameDate(inDate))
+ {
+ // found it
+ currentInfo = _previousInfo;
+ }
+ else
+ {
+ // loop through list, to see if date already present
+ for (DateInfo info : _infoList)
+ {
+ if (info.isSameDate(inDate))
+ {
+ currentInfo = info;
+ break;
+ }
+ }
+ // create new info if necessary
+ if (currentInfo == null)
+ {
+ currentInfo = new DateInfo(inDate);
+ _infoList.add(currentInfo);
+ _hasBeenSorted = false;
+ }
+ _previousInfo = currentInfo;
+ }
+ // Now we've identified the current info or created a new one
+ currentInfo.incrementCount();
+ }
+
+ /**
+ * Clear the whole list
+ */
+ public void clearAll()
+ {
+ _infoList.clear();
+ _previousInfo = null;
+ _hasBeenSorted = true;
+ }
+
+ /**
+ * @return number of entries in the list, including dateless points
+ */
+ public int getNumEntries()
+ {
+ return _infoList.size();
+ }
+
+ /**
+ * @return the total number of points found, which should match the track size
+ */
+ public int getTotalNumPoints()
+ {
+ int total = 0;
+ for (DateInfo info : _infoList) {
+ total += info.getPointCount();
+ }
+ return total;
+ }
+
+ /**
+ * Sort the info list by ascending timestamps
+ */
+ private void sort()
+ {
+ if (!_hasBeenSorted)
+ {
+ Collections.sort(_infoList);
+ _hasBeenSorted = true;
+ }
+ }
+
+ /**
+ * Get the DateInfo object at the given index
+ * @param inIndex index in (sorted) list
+ * @return corresponding object (may throw exception if out of range)
+ */
+ public DateInfo getDateInfo(int inIndex)
+ {
+ sort();
+ return _infoList.get(inIndex);
+ }
+}