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