]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/function/deletebydate/DateInfoList.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / function / deletebydate / DateInfoList.java
diff --git a/src/tim/prune/function/deletebydate/DateInfoList.java b/src/tim/prune/function/deletebydate/DateInfoList.java
new file mode 100644 (file)
index 0000000..979325b
--- /dev/null
@@ -0,0 +1,109 @@
+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);
+       }
+}