]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/function/deletebydate/DateInfoList.java
Version 17, September 2014
[GpsPrune.git] / tim / prune / function / deletebydate / DateInfoList.java
diff --git a/tim/prune/function/deletebydate/DateInfoList.java b/tim/prune/function/deletebydate/DateInfoList.java
new file mode 100644 (file)
index 0000000..7628667
--- /dev/null
@@ -0,0 +1,121 @@
+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)
+       {
+               if (_previousInfo != null && _previousInfo.isSameDate(inDate))
+               {
+                       // found it
+                       _previousInfo.incrementCount();
+               }
+               else
+               {
+                       // loop through list, seeing if date already present
+                       boolean foundDate = false;
+                       for (DateInfo info : _infoList)
+                       {
+                               if (info.isSameDate(inDate))
+                               {
+                                       info.incrementCount();
+                                       _previousInfo = info;
+                                       foundDate = true;
+                                       break;
+                               }
+                       }
+                       // create new info if necessary
+                       if (!foundDate)
+                       {
+                               _previousInfo = new DateInfo(inDate);
+                               _previousInfo.incrementCount();
+                               _infoList.add(_previousInfo);
+                               _hasBeenSorted = false;
+                       }
+               }
+       }
+
+       /**
+        * Clear the whole list
+        */
+       public void clearAll()
+       {
+               _infoList.clear();
+               _previousInfo = null;
+               _hasBeenSorted = true;
+       }
+
+       /**
+        * not used, can be removed
+        * @return true if any points without dates were found
+        */
+       public boolean hasDatelessPoints()
+       {
+               if (_infoList.isEmpty()) {return false;}
+               sort();
+               DateInfo firstInfo = _infoList.get(0);
+               return (firstInfo != null && firstInfo.isDateless() && firstInfo.getPointCount() > 0);
+       }
+
+       /**
+        * @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);
+       }
+}