package tim.prune.gui;
import java.util.ArrayList;
import javax.swing.AbstractListModel;
import tim.prune.data.DataPoint;
import tim.prune.data.Track;
/**
* Class to deal with the matching of waypoint names
* and the representation in a list
*/
public class WaypointNameMatcher extends AbstractListModel<String>
{
private ArrayList<DataPoint> _waypoints = null;
private int _numPoints = 0;
private String[] _waypointNames = null;
private ArrayList<DataPoint> _matches = null;
/**
* Initialisation giving Track object
* @param inTrack Track object
*/
public void init(Track inTrack)
{
// Get list of waypoints from track
_waypoints = new ArrayList<DataPoint>();
inTrack.getWaypoints(_waypoints);
// Initialise match flags and waypoint names
_numPoints = _waypoints.size();
_waypointNames = new String[_numPoints];
for (int i=0; i<_numPoints; i++) {
_waypointNames[i] = _waypoints.get(i).getWaypointName().toLowerCase();
}
_matches = new ArrayList<DataPoint>();
findMatches(null);
}
/**
* Search for the given term and collect the matches
* @param inSearch string to search for
*/
public void findMatches(String inSearch)
{
// Reset array
_matches.clear();
// Convert search to lower case to match name array
String search = null;
if (inSearch != null && !inSearch.equals("")) {
search = inSearch.toLowerCase();
}
// Loop through waypoint names
for (int i=0; i<_numPoints; i++)
{
if (search == null || _waypointNames[i].indexOf(search) >= 0)
{
_matches.add(_waypoints.get(i));
}
}
fireChanged();
}
/**
* @see javax.swing.ListModel#getSize()
*/
public int getSize()
{
if (_numPoints == 0) return 0;
return _matches.size();
}
/**
* @see javax.swing.ListModel#getElementAt(int)
*/
public String getElementAt(int inIndex)
{
return _matches.get(inIndex).getWaypointName();
}
/**
* Get the waypoint at the given index
* @param inIndex index number, starting at 0
* @return DataPoint object
*/
public DataPoint getWaypoint(int inIndex)
{
return _matches.get(inIndex);
}
/**
* Fire event to notify that contents have changed
*/
public void fireChanged()
{
this.fireContentsChanged(this, 0, getSize()-1);
}
}