]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/data/TrackInfo.java
Version 10, May 2010
[GpsPrune.git] / tim / prune / data / TrackInfo.java
index f8e3c844b8ac86bc46c7c45bf8b78c7bc976f88e..6fa8e90b2e54ba39186053fcc38a1433d5ec298c 100644 (file)
@@ -10,7 +10,6 @@ import tim.prune.UpdateMessageBroker;
  */
 public class TrackInfo
 {
-       private UpdateMessageBroker _broker = null;
        private Track _track = null;
        private Selection _selection = null;
        private FileInfo _fileInfo = null;
@@ -20,13 +19,11 @@ public class TrackInfo
        /**
         * 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();
        }
@@ -58,6 +55,14 @@ public class TrackInfo
                return _fileInfo;
        }
 
+       /**
+        * Replace the file info with a previously made clone
+        * @param inInfo cloned file info
+        */
+       public void setFileInfo(FileInfo inInfo) {
+               _fileInfo = inInfo;
+       }
+
        /**
         * @return the PhotoList object
         */
@@ -85,31 +90,17 @@ public class TrackInfo
        }
 
 
-       /**
-        * 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
-        */
-       public void loadTrack(Field[] inFieldArray, Object[][] inPointArray, int inAltFormat)
-       {
-               _track.cropTo(0);
-               _track.load(inFieldArray, inPointArray, inAltFormat);
-               _selection.clearAll();
-       }
-
-
        /**
         * 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)
+       public int[] addPhotos(Set<Photo> inSet)
        {
                // Firstly count number of points and photos to add
                int numPhotosToAdd = 0;
                int numPointsToAdd = 0;
-               Iterator iterator = null;
+               Iterator<Photo> iterator = null;
                if (inSet != null && !inSet.isEmpty())
                {
                        iterator = inSet.iterator();
@@ -117,7 +108,7 @@ public class TrackInfo
                        {
                                try
                                {
-                                       Photo photo = (Photo) iterator.next();
+                                       Photo photo = iterator.next();
                                        if (photo != null && !_photoList.contains(photo))
                                        {
                                                numPhotosToAdd++;
@@ -142,7 +133,7 @@ public class TrackInfo
                        {
                                try
                                {
-                                       Photo photo = (Photo) iterator.next();
+                                       Photo photo = iterator.next();
                                        if (photo != null && !_photoList.contains(photo))
                                        {
                                                // Add photo
@@ -198,7 +189,7 @@ public class TrackInfo
                if (_track.deletePoint(_selection.getCurrentPointIndex()))
                {
                        _selection.modifyPointDeleted();
-                       _broker.informSubscribers();
+                       UpdateMessageBroker.informSubscribers();
                        return true;
                }
                return false;
@@ -236,38 +227,22 @@ public class TrackInfo
                        }
                        // update subscribers
                        _selection.modifyPointDeleted();
-                       _broker.informSubscribers();
+                       UpdateMessageBroker.informSubscribers();
                }
                return true;
        }
 
 
        /**
-        * Compress the track to the given resolution
-        * @param inResolution resolution
+        * Delete all the points which have been marked for deletion
         * @return number of points deleted
         */
-       public int compress(int inResolution)
+       public int deleteMarkedPoints()
        {
-               int numDeleted = _track.compress(inResolution);
+               int numDeleted = _track.deleteMarkedPoints();
                if (numDeleted > 0) {
                        _selection.clearAll();
-                       _broker.informSubscribers();
-               }
-               return numDeleted;
-       }
-
-
-       /**
-        * Delete all the duplicate points in the track
-        * @return number of points deleted
-        */
-       public int deleteDuplicates()
-       {
-               int numDeleted = _track.deleteDuplicates();
-               if (numDeleted > 0) {
-                       _selection.clearAll();
-                       _broker.informSubscribers();
+                       UpdateMessageBroker.informSubscribers();
                }
                return numDeleted;
        }
@@ -282,18 +257,57 @@ public class TrackInfo
                return _track.cloneRange(_selection.getStart(), _selection.getEnd());
        }
 
+       /**
+        * Merge the track segments within the given range
+        * @param inStart start index
+        * @param inEnd end index
+        * @return true if successful
+        */
+       public boolean mergeTrackSegments(int inStart, int inEnd)
+       {
+               boolean firstTrackPoint = true;
+               // Loop between start and end
+               for (int i=inStart; i<=inEnd; i++) {
+                       DataPoint point = _track.getPoint(i);
+                       // Set all segments to false apart from first track point
+                       if (point != null && !point.isWaypoint()) {
+                               point.setSegmentStart(firstTrackPoint);
+                               firstTrackPoint = false;
+                       }
+               }
+               // Find following track point, if any
+               DataPoint nextPoint = _track.getNextTrackPoint(inEnd+1);
+               if (nextPoint != null) {nextPoint.setSegmentStart(true);}
+               _selection.markInvalid();
+               UpdateMessageBroker.informSubscribers();
+               return true;
+       }
 
        /**
         * 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) {
+                       selectPoint(_selection.getEnd()+1);
+               }
                return success;
        }
 
@@ -304,10 +318,38 @@ public class TrackInfo
         */
        public void selectPoint(DataPoint inPoint)
        {
-               // get the index of the given Point
-               int index = _track.getPointIndex(inPoint);
+               selectPoint(_track.getPointIndex(inPoint));
+       }
+
+       /**
+        * Select the data point with the given index
+        * @param inPointIndex index of DataPoint to select, or -1 for none
+        */
+       public void selectPoint(int inPointIndex)
+       {
+               if (_selection.getCurrentPointIndex() == inPointIndex || inPointIndex >= _track.getNumPoints()) {return;}
+               // get the index of the current photo
+               int photoIndex = _selection.getCurrentPhotoIndex();
+               // Check if point has photo or not
+               boolean pointHasPhoto = false;
+               if (inPointIndex >= 0)
+               {
+                       Photo pointPhoto = _track.getPoint(inPointIndex).getPhoto();
+                       pointHasPhoto = (pointPhoto != null);
+                       if (pointHasPhoto) {
+                               photoIndex = _photoList.getPhotoIndex(pointPhoto);
+                       }
+               }
+               // Might need to deselect photo
+               if (!pointHasPhoto)
+               {
+                       // selected point hasn't got a photo - deselect photo if necessary
+                       if (photoIndex < 0 || _photoList.getPhoto(photoIndex).isConnected()) {
+                               photoIndex = -1;
+                       }
+               }
                // give to selection
-               _selection.selectPoint(index);
+               _selection.selectPhotoAndPoint(photoIndex, inPointIndex);
        }
 
        /**
@@ -316,28 +358,53 @@ public class TrackInfo
         */
        public void selectPhoto(int inPhotoIndex)
        {
+               if (_selection.getCurrentPhotoIndex() == inPhotoIndex) {return;}
+               // Photo is primary selection here, not as a result of a point selection
+               // Therefore the photo selection takes priority, deselecting point if necessary
                // Find Photo object
                Photo photo = _photoList.getPhoto(inPhotoIndex);
                if (photo != null)
                {
                        // Find point object and its index
                        int pointIndex = _track.getPointIndex(photo.getDataPoint());
+                       // Check whether to deselect current point or not if photo not correlated
+                       if (pointIndex < 0)
+                       {
+                               int currPointIndex = _selection.getCurrentPointIndex();
+                               if (currPointIndex >= 0 && _track.getPoint(currPointIndex).getPhoto() == null)
+                               {
+                                       pointIndex = currPointIndex; // Keep currently selected point
+                               }
+                       }
                        // give to selection object
                        _selection.selectPhotoAndPoint(inPhotoIndex, pointIndex);
                }
-               else
-               {
+               else {
                        // no photo, just reset selection
-                       _selection.selectPhotoAndPoint(-1, -1);
+                       DataPoint currPoint = getCurrentPoint();
+                       if (currPoint != null && currPoint.getPhoto() == null) {
+                               _selection.selectPhotoAndPoint(-1, _selection.getCurrentPointIndex()); // keep point
+                       }
+                       else {
+                               _selection.selectPhotoAndPoint(-1, -1); // deselect point too
+                       }
                }
        }
 
-
        /**
-        * Fire a trigger to all data subscribers
+        * Extend the current selection to end at the given point, eg by shift-clicking
+        * @param inPointNum index of end point
         */
-       public void triggerUpdate()
+       public void extendSelection(int inPointNum)
        {
-               _broker.informSubscribers();
+               // See whether to start selection from current range start or current point
+               int rangeStart = _selection.getStart();
+               if (rangeStart < 0 || _selection.getCurrentPointIndex() != _selection.getEnd()) {
+                       rangeStart = _selection.getCurrentPointIndex();
+               }
+               selectPoint(inPointNum);
+               if (rangeStart < inPointNum) {
+                       _selection.selectRange(rangeStart, inPointNum);
+               }
        }
 }