From: Frédéric Perrin Date: Thu, 30 Jan 2020 16:19:03 +0000 (+0000) Subject: Add a panel to select by segment X-Git-Tag: v19.2.fp6^2 X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=commitdiff_plain;h=ec05ac5e6b31bbc2d88f16dba1c6bdbc556cf6db Add a panel to select by segment --- diff --git a/src/tim/prune/data/Track.java b/src/tim/prune/data/Track.java index ef099d4..b6e0549 100644 --- a/src/tim/prune/data/Track.java +++ b/src/tim/prune/data/Track.java @@ -818,6 +818,24 @@ public class Track } } + /** + * Collect all segment starts into the given list + * @param inList List to fill with waypoints + */ + public void getSegmentStarts(List inList) + { + // clear list + inList.clear(); + // loop over points and copy all segment starts into list + for (int i=0; i<=_numPoints-1; i++) + { + if (_dataPoints[i] != null && _dataPoints[i].getSegmentStart()) + { + inList.add(_dataPoints[i]); + } + } + } + /** * Search for the given Point in the track and return the index diff --git a/src/tim/prune/gui/SegmentListModel.java b/src/tim/prune/gui/SegmentListModel.java new file mode 100644 index 0000000..bfe53af --- /dev/null +++ b/src/tim/prune/gui/SegmentListModel.java @@ -0,0 +1,72 @@ +package tim.prune.gui; + +import java.util.ArrayList; +import javax.swing.AbstractListModel; + +import tim.prune.data.DataPoint; +import tim.prune.data.Track; +import tim.prune.I18nManager; + +/** + * Class to act as list model for the segment list + */ +public class SegmentListModel extends AbstractListModel +{ + Track _track = null; + ArrayList _segmentStarts = null; + + /** + * Constructor giving Track object + * @param inTrack Track object + */ + public SegmentListModel(Track inTrack) + { + _track = inTrack; + _segmentStarts = new ArrayList(); + _track.getSegmentStarts(_segmentStarts); + } + + /** + * @see javax.swing.ListModel#getSize() + */ + public int getSize() + { + return _segmentStarts.size(); + } + + /** + * @see javax.swing.ListModel#getElementAt(int) + */ + public String getElementAt(int inIndex) + { + return I18nManager.getText("details.lists.segments.label") + (inIndex + 1) + " (" + (getSegmentStart(inIndex) + 1) + " " + I18nManager.getText("details.lists.segments.to") + " " + (getSegmentEnd(inIndex) + 1) + ")"; + } + + /** + * Fire event to notify that contents have changed + */ + public void fireChanged() + { + _track.getSegmentStarts(_segmentStarts); + this.fireContentsChanged(this, 0, getSize()-1); + } + + /** + + */ + public int getSegmentStart(int inIndex) + { + return _track.getPointIndex(_segmentStarts.get(inIndex)); + } + + public int getSegmentEnd(int inIndex) + { + if (inIndex < getSize() - 1) { + return _track.getPointIndex(_segmentStarts.get(inIndex + 1)) - 1; + } + else + { + return _track.getNumPoints() - 1; + } + } +} diff --git a/src/tim/prune/gui/SelectorDisplay.java b/src/tim/prune/gui/SelectorDisplay.java index 9dfc24f..92b2153 100644 --- a/src/tim/prune/gui/SelectorDisplay.java +++ b/src/tim/prune/gui/SelectorDisplay.java @@ -53,6 +53,10 @@ public class SelectorDisplay extends GenericDisplay private JPanel _audioListPanel = null; private JList _audioList = null; private MediaListModel _audioListModel = null; + // Segments + private JPanel _segmentListPanel = null; + private JList _segmentList = null; + private SegmentListModel _segmentListModel = null; // scrollbar interval private static final int SCROLLBAR_INTERVAL = 50; @@ -144,6 +148,18 @@ public class SelectorDisplay extends GenericDisplay // don't add audio list either _listsPanel.setAlignmentX(Component.LEFT_ALIGNMENT); + // Segment list + _segmentListModel = new SegmentListModel(_trackInfo.getTrack()); + _segmentList = new JList(_segmentListModel); + _segmentList.addListSelectionListener(new ListSelectionListener() { + public void valueChanged(ListSelectionEvent e) + { + if (!e.getValueIsAdjusting()) { + selectSegment(_segmentList.getSelectedIndex()); + } + }}); + _segmentListPanel = makeListPanel("details.lists.segments", _segmentList); + // add the controls to the main panel mainPanel.add(trackDetailsPanel); mainPanel.add(Box.createVerticalStrut(5)); @@ -189,6 +205,18 @@ public class SelectorDisplay extends GenericDisplay _trackInfo.selectAudio(inIndex); } + /** + * + */ + private void selectSegment(int inIndex) + { + if (inIndex >= 0) { + int start = _segmentListModel.getSegmentStart(inIndex); + int end = _segmentListModel.getSegmentEnd(inIndex); + _trackInfo.getSelection().selectRange(start, end); + } + } + /** * Select the specified waypoint * @param inWaypointIndex index of selected waypoint @@ -258,7 +286,7 @@ public class SelectorDisplay extends GenericDisplay _ignoreScrollEvents = false; // update waypoints and photos if necessary - if ((inUpdateType | + if ((inUpdateType & (DataSubscriber.DATA_ADDED_OR_REMOVED | DataSubscriber.DATA_EDITED | DataSubscriber.WAYPOINTS_MODIFIED)) > 0) { _waypointListModel.fireChanged(); @@ -280,6 +308,28 @@ public class SelectorDisplay extends GenericDisplay _waypointList.clearSelection(); } } + if ((inUpdateType & (DataSubscriber.DATA_ADDED_OR_REMOVED | DataSubscriber.DATA_EDITED)) > 0) + { + _segmentListModel.fireChanged(); + if (_segmentListModel.getSize() > 1) + { + _listsPanel.add(_segmentListPanel); + } + } + // Deselect segment if selection goes beyond the selected + // segment + if ((inUpdateType & DataSubscriber.SELECTION_CHANGED) > 0) + { + int segmentSelected = _segmentList.getSelectedIndex(); + if (segmentSelected >= 0) + { + if (_trackInfo.getSelection().getStart() != _segmentListModel.getSegmentStart(segmentSelected) || + _trackInfo.getSelection().getEnd() != _segmentListModel.getSegmentEnd(segmentSelected)) + { + _segmentList.clearSelection(); + } + } + } // Hide photo list if no photos loaded, same for audio redrawLists(_photoListModel.getSize() > 0, _audioListModel.getSize() > 0); @@ -348,6 +398,7 @@ public class SelectorDisplay extends GenericDisplay _listsPanel.removeAll(); _listsPanel.setLayout(new GridLayout(0, 1)); _listsPanel.add(_waypointListPanel); + _listsPanel.add(_segmentListPanel); if (inShowPhotos) { _listsPanel.add(_photoListPanel); } diff --git a/src/tim/prune/lang/prune-texts_en.properties b/src/tim/prune/lang/prune-texts_en.properties index 7b7742f..35ac13b 100644 --- a/src/tim/prune/lang/prune-texts_en.properties +++ b/src/tim/prune/lang/prune-texts_en.properties @@ -765,6 +765,9 @@ details.range.gradient=Gradient details.lists.waypoints=Waypoints details.lists.photos=Photos details.lists.audio=Audio +details.lists.segments=Segments +details.lists.segments.label=Segment # +details.lists.segments.to=to details.photodetails=Photo details details.nophoto=No photo selected details.photo.loading=Loading