--- /dev/null
+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<String>
+{
+ Track _track = null;
+ ArrayList<DataPoint> _segmentStarts = null;
+
+ /**
+ * Constructor giving Track object
+ * @param inTrack Track object
+ */
+ public SegmentListModel(Track inTrack)
+ {
+ _track = inTrack;
+ _segmentStarts = new ArrayList<DataPoint>();
+ _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;
+ }
+ }
+}
private JPanel _audioListPanel = null;
private JList<String> _audioList = null;
private MediaListModel _audioListModel = null;
+ // Segments
+ private JPanel _segmentListPanel = null;
+ private JList<String> _segmentList = null;
+ private SegmentListModel _segmentListModel = null;
// scrollbar interval
private static final int SCROLLBAR_INTERVAL = 50;
// don't add audio list either
_listsPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
+ // Segment list
+ _segmentListModel = new SegmentListModel(_trackInfo.getTrack());
+ _segmentList = new JList<String>(_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));
_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
_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();
_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);
_listsPanel.removeAll();
_listsPanel.setLayout(new GridLayout(0, 1));
_listsPanel.add(_waypointListPanel);
+ _listsPanel.add(_segmentListPanel);
if (inShowPhotos) {
_listsPanel.add(_photoListPanel);
}