package tim.prune.data;
-import java.util.List;
-
+import java.util.Iterator;
+import java.util.Set;
import tim.prune.UpdateMessageBroker;
/**
*/
public class TrackInfo
{
- private UpdateMessageBroker _broker = null;
private Track _track = null;
private Selection _selection = null;
private FileInfo _fileInfo = null;
- // TODO: How to store photos? In separate list to be maintained or dynamic? Only store pointless photos?
private PhotoList _photoList = null;
/**
* Constructor
* @param inTrack Track object
- * @param inBroker broker object
*/
- public TrackInfo(Track inTrack, UpdateMessageBroker inBroker)
+ public TrackInfo(Track inTrack)
{
- _broker = inBroker;
_track = inTrack;
- _selection = new Selection(_track, inBroker);
+ _selection = new Selection(_track);
_fileInfo = new FileInfo();
_photoList = new PhotoList();
}
return _track.getPoint(_selection.getCurrentPointIndex());
}
-
/**
- * Load the specified data into the Track
- * @param inFieldArray array of Field objects describing fields
- * @param inPointArray 2d object array containing data
- * @param inAltFormat altitude format
+ * Get the currently selected photo, if any
+ * @return Photo if selected, otherwise null
*/
- public void loadTrack(Field[] inFieldArray, Object[][] inPointArray, int inAltFormat)
+ public Photo getCurrentPhoto()
{
- _track.cropTo(0);
- _track.load(inFieldArray, inPointArray, inAltFormat);
- _selection.clearAll();
+ return _photoList.getPhoto(_selection.getCurrentPhotoIndex());
}
/**
- * Add a List of Photos
- * @param inList List containing Photo objects
- * @return number of photos added
+ * Add a Set of Photos
+ * @param inSet Set containing Photo objects
+ * @return array containing number of photos and number of points added
*/
- public int addPhotos(List inList)
+ public int[] addPhotos(Set<Photo> inSet)
{
- // Firstly count number to add to make array
+ // Firstly count number of points and photos to add
int numPhotosToAdd = 0;
- if (inList != null && !inList.isEmpty())
+ int numPointsToAdd = 0;
+ Iterator<Photo> iterator = null;
+ if (inSet != null && !inSet.isEmpty())
{
- for (int i=0; i<inList.size(); i++)
+ iterator = inSet.iterator();
+ while (iterator.hasNext())
{
try
{
- Photo photo = (Photo) inList.get(i);
+ Photo photo = iterator.next();
if (photo != null && !_photoList.contains(photo))
{
numPhotosToAdd++;
+ if (photo.getDataPoint() != null)
+ {
+ numPointsToAdd++;
+ }
}
}
catch (ClassCastException ce) {}
// If there are any photos to add, add them
if (numPhotosToAdd > 0)
{
- DataPoint[] dataPoints = new DataPoint[numPhotosToAdd];
+ DataPoint[] dataPoints = new DataPoint[numPointsToAdd];
int pointNum = 0;
+ boolean hasAltitude = false;
// Add each Photo in turn
- for (int i=0; i<inList.size(); i++)
+ iterator = inSet.iterator();
+ while (iterator.hasNext())
{
try
{
- Photo photo = (Photo) inList.get(i);
+ Photo photo = iterator.next();
if (photo != null && !_photoList.contains(photo))
{
+ // Add photo
_photoList.addPhoto(photo);
- dataPoints[pointNum] = photo.getDataPoint();
- pointNum++;
+ // Add point if there is one
+ if (photo.getDataPoint() != null)
+ {
+ dataPoints[pointNum] = photo.getDataPoint();
+ // Check if any points have altitudes
+ hasAltitude |= (photo.getDataPoint().getAltitude() != null);
+ pointNum++;
+ }
}
}
catch (ClassCastException ce) {}
}
- _track.appendPoints(dataPoints);
+ if (numPointsToAdd > 0)
+ {
+ // add points to track
+ _track.appendPoints(dataPoints);
+ // modify track field list
+ _track.getFieldList().extendList(Field.LATITUDE);
+ _track.getFieldList().extendList(Field.LONGITUDE);
+ if (hasAltitude) {_track.getFieldList().extendList(Field.ALTITUDE);}
+ }
}
- return numPhotosToAdd;
+ int[] result = {numPhotosToAdd, numPointsToAdd};
+ return result;
}
*/
public boolean deleteRange()
{
- // TODO: Check whether to delete photos associated with this range
- int currPoint = _selection.getCurrentPointIndex();
int startSel = _selection.getStart();
int endSel = _selection.getEnd();
boolean answer = _track.deleteRange(startSel, endSel);
{
if (_track.deletePoint(_selection.getCurrentPointIndex()))
{
- // TODO: Check whether to delete photo associated with this point
_selection.modifyPointDeleted();
- _broker.informSubscribers();
+ UpdateMessageBroker.informSubscribers();
return true;
}
return false;
/**
- * Compress the track to the given resolution
- * @param inResolution resolution
- * @return number of points deleted
+ * Delete the currently selected photo and optionally its point too
+ * @param inPointToo true to also delete associated point
+ * @return true if delete successful
*/
- public int compress(int inResolution)
+ public boolean deleteCurrentPhoto(boolean inPointToo)
{
- int numDeleted = _track.compress(inResolution);
- if (numDeleted > 0)
- _selection.clearAll();
- return numDeleted;
+ // delete currently selected photo
+ int photoIndex = _selection.getCurrentPhotoIndex();
+ if (photoIndex >= 0)
+ {
+ Photo photo = _photoList.getPhoto(photoIndex);
+ _photoList.deletePhoto(photoIndex);
+ // has it got a point?
+ if (photo.getDataPoint() != null)
+ {
+ if (inPointToo)
+ {
+ // delete point
+ int pointIndex = _track.getPointIndex(photo.getDataPoint());
+ _track.deletePoint(pointIndex);
+ }
+ else
+ {
+ // disconnect point from photo
+ photo.getDataPoint().setPhoto(null);
+ photo.setDataPoint(null);
+ }
+ }
+ // update subscribers
+ _selection.modifyPointDeleted();
+ UpdateMessageBroker.informSubscribers();
+ }
+ return true;
}
/**
- * Delete all the duplicate points in the track
+ * Delete all the points which have been marked for deletion
* @return number of points deleted
*/
- public int deleteDuplicates()
+ public int deleteMarkedPoints()
{
- int numDeleted = _track.deleteDuplicates();
- if (numDeleted > 0)
+ int numDeleted = _track.deleteMarkedPoints();
+ if (numDeleted > 0) {
_selection.clearAll();
+ UpdateMessageBroker.informSubscribers();
+ }
return numDeleted;
}
/**
* Interpolate extra points between two selected ones
- * @param inStartIndex start index of interpolation
* @param inNumPoints num points to insert
* @return true if successful
*/
public boolean interpolate(int inNumPoints)
{
boolean success = _track.interpolate(_selection.getStart(), inNumPoints);
- if (success)
+ if (success) {
_selection.selectRangeEnd(_selection.getEnd() + inNumPoints);
+ }
+ return success;
+ }
+
+
+ /**
+ * Average selected points to create a new one
+ * @return true if successful
+ */
+ public boolean average()
+ {
+ boolean success = _track.average(_selection.getStart(), _selection.getEnd());
+ if (success) {
+ _selection.selectPoint(_selection.getEnd()+1);
+ }
return success;
}
// give to selection
_selection.selectPoint(index);
}
+
+ /**
+ * Select the given Photo and its point if any
+ * @param inPhotoIndex index of photo to select
+ */
+ public void selectPhoto(int inPhotoIndex)
+ {
+ // Find Photo object
+ Photo photo = _photoList.getPhoto(inPhotoIndex);
+ if (photo != null)
+ {
+ // Find point object and its index
+ int pointIndex = _track.getPointIndex(photo.getDataPoint());
+ // give to selection object
+ _selection.selectPhotoAndPoint(inPhotoIndex, pointIndex);
+ }
+ else
+ {
+ // no photo, just reset selection
+ _selection.selectPhotoAndPoint(-1, -1);
+ }
+ }
}