X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fdata%2FSelection.java;h=81ab64ce7c6cc42dc7df15d788e06a90df9bb31f;hb=f35b6d628f68e3b5ef19965ad8988d0dd1eb8efa;hp=6924d133abca3c541a44d5bf257955a7e1bd3440;hpb=112bb0c9b46894adca9a33ed8c99ea712b253185;p=GpsPrune.git diff --git a/tim/prune/data/Selection.java b/tim/prune/data/Selection.java index 6924d13..81ab64c 100644 --- a/tim/prune/data/Selection.java +++ b/tim/prune/data/Selection.java @@ -12,14 +12,16 @@ public class Selection private Track _track = null; private int _currentPoint = -1; private boolean _valid = false; + private int _prevNumPoints = 0; private int _startIndex = -1, _endIndex = -1; private int _currentPhotoIndex = -1; + private int _currentAudioIndex = -1; private IntegerRange _altitudeRange = null; private int _climb = -1, _descent = -1; private Altitude.Format _altitudeFormat = Altitude.Format.NO_FORMAT; private long _totalSeconds = 0L, _movingSeconds = 0L; private double _angDistance = -1.0, _angMovingDistance = -1.0; - private boolean _multipleSegments = false; + private int _numSegments = 0; /** @@ -65,8 +67,14 @@ public class Selection private void recalculate() { _altitudeFormat = Altitude.Format.NO_FORMAT; - _multipleSegments = false; - if (_track.getNumPoints() > 0 && hasRangeSelected()) + _numSegments = 0; + final int numPoints = _track.getNumPoints(); + // Recheck if the number of points has changed + if (numPoints != _prevNumPoints) { + _prevNumPoints = numPoints; + check(); + } + if (numPoints > 0 && hasRangeSelected()) { _altitudeRange = new IntegerRange(); _climb = 0; @@ -121,13 +129,15 @@ public class Selection double radians = DataPoint.calculateRadiansBetween(lastPoint, currPoint); _angDistance += radians; if (currPoint.getSegmentStart()) { - _multipleSegments = true; + _numSegments++; } else { _angMovingDistance += radians; } } lastPoint = currPoint; + // If it's a track point then there must be at least one segment + if (_numSegments == 0) {_numSegments = 1;} } } if (endTime != null) { @@ -232,27 +242,28 @@ public class Selection } /** - * @return true if track has multiple segments + * @return number of segments in selection */ - public boolean getHasMultipleSegments() + public int getNumSegments() { - return _multipleSegments; + return _numSegments; } /** - * Clear selected point, range and photo + * Clear selected point, range, photo and audio */ public void clearAll() { _currentPoint = -1; selectRange(-1, -1); _currentPhotoIndex = -1; + _currentAudioIndex = -1; check(); } /** - * Deselect range + * Select range from start to end * @param inStartIndex index of start of range * @param inEndIndex index of end of range */ @@ -371,13 +382,15 @@ public class Selection /** * Select the specified photo and point - * @param inPhotoIndex index of selected photo in PhotoList * @param inPointIndex index of selected point + * @param inPhotoIndex index of selected photo in PhotoList + * @param inAudioIndex index of selected audio item */ - public void selectPhotoAndPoint(int inPhotoIndex, int inPointIndex) + public void selectPointPhotoAudio(int inPointIndex, int inPhotoIndex, int inAudioIndex) { - _currentPhotoIndex = inPhotoIndex; _currentPoint = inPointIndex; + _currentPhotoIndex = inPhotoIndex; + _currentAudioIndex = inAudioIndex; check(); } @@ -390,35 +403,40 @@ public class Selection return _currentPhotoIndex; } + /** + * @return currently selected audio index + */ + public int getCurrentAudioIndex() + { + return _currentAudioIndex; + } + /** * Check that the selection still makes sense * and fire update message to listeners */ private void check() { - if (_track != null) + if (_track != null && _track.getNumPoints() > 0) { - if (_track.getNumPoints() > 0) + int maxIndex = _track.getNumPoints() - 1; + if (_currentPoint > maxIndex) { - int maxIndex = _track.getNumPoints() - 1; - if (_currentPoint > maxIndex) - { - _currentPoint = maxIndex; - } - if (_endIndex > maxIndex) - { - _endIndex = maxIndex; - } - if (_startIndex > maxIndex) - { - _startIndex = maxIndex; - } + _currentPoint = maxIndex; } - else + if (_endIndex > maxIndex) { - // track is empty, clear selections - _currentPoint = _startIndex = _endIndex = -1; + _endIndex = maxIndex; } + if (_startIndex > maxIndex) + { + _startIndex = maxIndex; + } + } + else + { + // track is empty, clear selections + _currentPoint = _startIndex = _endIndex = -1; } UpdateMessageBroker.informSubscribers(DataSubscriber.SELECTION_CHANGED); }