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);
}
}