X-Git-Url: https://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fdata%2FTrackInfo.java;h=f8e3c844b8ac86bc46c7c45bf8b78c7bc976f88e;hb=da0b1f449260a0b4a94318006382a9039726ef3e;hp=71363dae1053ed3e89dba907a8dea89adfada90f;hpb=312fec956e43f5d0a38617da5d0add9c62563e2c;p=GpsPrune.git diff --git a/tim/prune/data/TrackInfo.java b/tim/prune/data/TrackInfo.java index 71363da..f8e3c84 100644 --- a/tim/prune/data/TrackInfo.java +++ b/tim/prune/data/TrackInfo.java @@ -1,5 +1,7 @@ package tim.prune.data; +import java.util.Iterator; +import java.util.Set; import tim.prune.UpdateMessageBroker; /** @@ -12,6 +14,8 @@ public class TrackInfo private Track _track = null; private Selection _selection = null; private FileInfo _fileInfo = null; + private PhotoList _photoList = null; + /** * Constructor @@ -24,6 +28,7 @@ public class TrackInfo _track = inTrack; _selection = new Selection(_track, inBroker); _fileInfo = new FileInfo(); + _photoList = new PhotoList(); } @@ -53,6 +58,14 @@ public class TrackInfo return _fileInfo; } + /** + * @return the PhotoList object + */ + public PhotoList getPhotoList() + { + return _photoList; + } + /** * Get the currently selected point, if any * @return DataPoint if single point selected, otherwise null @@ -62,6 +75,15 @@ public class TrackInfo return _track.getPoint(_selection.getCurrentPointIndex()); } + /** + * Get the currently selected photo, if any + * @return Photo if selected, otherwise null + */ + public Photo getCurrentPhoto() + { + return _photoList.getPhoto(_selection.getCurrentPhotoIndex()); + } + /** * Load the specified data into the Track @@ -77,13 +99,87 @@ public class TrackInfo } + /** + * 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(Set inSet) + { + // Firstly count number of points and photos to add + int numPhotosToAdd = 0; + int numPointsToAdd = 0; + Iterator iterator = null; + if (inSet != null && !inSet.isEmpty()) + { + iterator = inSet.iterator(); + while (iterator.hasNext()) + { + try + { + Photo 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[numPointsToAdd]; + int pointNum = 0; + boolean hasAltitude = false; + // Add each Photo in turn + iterator = inSet.iterator(); + while (iterator.hasNext()) + { + try + { + Photo photo = (Photo) iterator.next(); + if (photo != null && !_photoList.contains(photo)) + { + // Add photo + _photoList.addPhoto(photo); + // 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) {} + } + 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);} + } + } + int[] result = {numPhotosToAdd, numPointsToAdd}; + return result; + } + + /** * Delete the currently selected range of points * @return true if successful */ public boolean deleteRange() { - int currPoint = _selection.getCurrentPointIndex(); int startSel = _selection.getStart(); int endSel = _selection.getEnd(); boolean answer = _track.deleteRange(startSel, endSel); @@ -109,6 +205,43 @@ public class TrackInfo } + /** + * Delete the currently selected photo and optionally its point too + * @param inPointToo true to also delete associated point + * @return true if delete successful + */ + public boolean deleteCurrentPhoto(boolean inPointToo) + { + // 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(); + _broker.informSubscribers(); + } + return true; + } + + /** * Compress the track to the given resolution * @param inResolution resolution @@ -117,8 +250,10 @@ public class TrackInfo public int compress(int inResolution) { int numDeleted = _track.compress(inResolution); - if (numDeleted > 0) + if (numDeleted > 0) { _selection.clearAll(); + _broker.informSubscribers(); + } return numDeleted; } @@ -130,8 +265,10 @@ public class TrackInfo public int deleteDuplicates() { int numDeleted = _track.deleteDuplicates(); - if (numDeleted > 0) + if (numDeleted > 0) { _selection.clearAll(); + _broker.informSubscribers(); + } return numDeleted; } @@ -159,4 +296,48 @@ public class TrackInfo _selection.selectRangeEnd(_selection.getEnd() + inNumPoints); return success; } + + + /** + * Select the given DataPoint + * @param inPoint DataPoint object to select + */ + public void selectPoint(DataPoint inPoint) + { + // get the index of the given Point + int index = _track.getPointIndex(inPoint); + // 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); + } + } + + + /** + * Fire a trigger to all data subscribers + */ + public void triggerUpdate() + { + _broker.informSubscribers(); + } }