--- /dev/null
+package tim.prune.gui.colour;
+
+import java.awt.Color;
+import java.util.ArrayList;
+
+import tim.prune.data.DataPoint;
+import tim.prune.data.FileInfo;
+import tim.prune.data.SourceInfo;
+import tim.prune.data.TrackInfo;
+
+/**
+ * Colours points according to which file (or source) they came from
+ */
+public class FileColourer extends DiscretePointColourer
+{
+ /**
+ * Constructor
+ * @param inStartColour start colour of scale
+ * @param inEndColour end colour of scale
+ * @param inWrapLength number of unique colours before wrap
+ */
+ public FileColourer(Color inStartColour, Color inEndColour, int inWrapLength)
+ {
+ super(inStartColour, inEndColour, inWrapLength);
+ }
+
+ /**
+ * Calculate the colours for each of the points in the given track
+ * @param inTrack track object
+ */
+ @Override
+ public void calculateColours(TrackInfo inTrackInfo)
+ {
+ // initialise the array to the right size
+ final int numPoints = inTrackInfo == null ? 0 : inTrackInfo.getTrack().getNumPoints();
+ init(numPoints);
+
+ // loop over track points
+ FileInfo fInfo = inTrackInfo.getFileInfo();
+ ArrayList<SourceInfo> sourceList = new ArrayList<SourceInfo>();
+ for (int i=0; i<numPoints; i++)
+ {
+ DataPoint p = inTrackInfo.getTrack().getPoint(i);
+ if (p != null && !p.isWaypoint())
+ {
+ SourceInfo sInfo = fInfo.getSourceForPoint(p);
+ // Is this info object already in the list?
+ int foundIndex = -1;
+ int sIndex = 0;
+ for (SourceInfo si : sourceList) {
+ if (si == sInfo) {
+ foundIndex = sIndex;
+ break;
+ }
+ sIndex++;
+ }
+ // Add source info to list
+ if (foundIndex < 0)
+ {
+ sourceList.add(sInfo);
+ foundIndex = sourceList.size()-1;
+ }
+ // use this foundIndex to find the colour
+ setColour(i, foundIndex);
+ }
+ }
+ // generate the colours needed
+ generateDiscreteColours(sourceList.size());
+ }
+}