import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
+import java.awt.GridLayout;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
+import javax.swing.ListSelectionModel;
import javax.swing.border.EtchedBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import tim.prune.DataSubscriber;
import tim.prune.I18nManager;
-import tim.prune.data.DataPoint;
-import tim.prune.data.Photo;
import tim.prune.data.TrackInfo;
/**
private JScrollBar _scroller = null;
private boolean _ignoreScrollEvents = false;
- // Photos
- private JList _photoList = null;
- private PhotoListModel _photoListModel = null;
+ // Panel containing lists
+ private JPanel _listsPanel = null;
+ private int _visiblePanels = 1;
// Waypoints
+ private JPanel _waypointListPanel = null;
private JList _waypointList = null;
private WaypointListModel _waypointListModel = null;
+ // Photos
+ private JPanel _photoListPanel = null;
+ private JList _photoList = null;
+ private MediaListModel _photoListModel = null;
+ // Audio files
+ private JPanel _audioListPanel = null;
+ private JList _audioList = null;
+ private MediaListModel _audioListModel = null;
// scrollbar interval
private static final int SCROLLBAR_INTERVAL = 50;
_trackpointsLabel = new JLabel(I18nManager.getText("details.notrack"));
trackDetailsPanel.add(_trackpointsLabel);
_filenameLabel = new JLabel("");
+ _filenameLabel.setMinimumSize(new Dimension(120, 10));
trackDetailsPanel.add(_filenameLabel);
// Scroll bar
_scroller = new JScrollBar(JScrollBar.HORIZONTAL, 0, SCROLLBAR_INTERVAL, 0, 100);
_scroller.addAdjustmentListener(new AdjustmentListener() {
- public void adjustmentValueChanged(AdjustmentEvent e)
- {
+ public void adjustmentValueChanged(AdjustmentEvent e) {
selectPoint(e.getValue());
}
});
_scroller.setEnabled(false);
// Add panel for waypoints / photos
- JPanel listsPanel = new JPanel();
- listsPanel.setLayout(new BoxLayout(listsPanel, BoxLayout.Y_AXIS));
- listsPanel.setBorder(BorderFactory.createCompoundBorder(
+ _listsPanel = new JPanel();
+ _listsPanel.setLayout(new GridLayout(0, 1));
+ _listsPanel.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), BorderFactory.createEmptyBorder(3, 3, 3, 3))
);
_waypointListModel = new WaypointListModel(_trackInfo.getTrack());
public void valueChanged(ListSelectionEvent e)
{
if (!e.getValueIsAdjusting()) selectWaypoint(_waypointList.getSelectedIndex());
- }});
- listsPanel.add(new JLabel(I18nManager.getText("details.waypointsphotos.waypoints")));
- listsPanel.add(new JScrollPane(_waypointList));
- _photoListModel = new PhotoListModel(_trackInfo.getPhotoList());
+ }
+ });
+ _waypointListPanel = makeListPanel("details.lists.waypoints", _waypointList);
+ _listsPanel.add(_waypointListPanel);
+ // photo list
+ _photoListModel = new MediaListModel(_trackInfo.getPhotoList());
_photoList = new JList(_photoListModel);
_photoList.setVisibleRowCount(NUM_LIST_ENTRIES);
_photoList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e)
{
- if (!e.getValueIsAdjusting()) selectPhoto(_photoList.getSelectedIndex());
+ if (!e.getValueIsAdjusting()) {
+ selectPhoto(_photoList.getSelectedIndex());
+ }
+ }});
+ _photoListPanel = makeListPanel("details.lists.photos", _photoList);
+ // don't add photo list (because there aren't any photos yet)
+
+ // List for audio clips
+ _audioListModel = new MediaListModel(_trackInfo.getAudioList());
+ _audioList = new JList(_audioListModel);
+ _audioList.addListSelectionListener(new ListSelectionListener() {
+ public void valueChanged(ListSelectionEvent e)
+ {
+ if (!e.getValueIsAdjusting()) {
+ selectAudio(_audioList.getSelectedIndex());
+ }
}});
- listsPanel.add(new JLabel(I18nManager.getText("details.waypointsphotos.photos")));
- listsPanel.add(new JScrollPane(_photoList));
- listsPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
+ _audioListPanel = makeListPanel("details.lists.audio", _audioList);
+ // don't add audio list either
+ _listsPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
// add the controls to the main panel
mainPanel.add(trackDetailsPanel);
mainPanel.add(Box.createVerticalStrut(5));
mainPanel.add(_scroller);
mainPanel.add(Box.createVerticalStrut(5));
- mainPanel.add(listsPanel);
// add the main panel at the top
add(mainPanel, BorderLayout.NORTH);
+ // and lists in the centre
+ add(_listsPanel, BorderLayout.CENTER);
// set preferred width to be small
setPreferredSize(new Dimension(100, 100));
}
*/
private void selectPoint(int inValue)
{
- if (_track != null && !_ignoreScrollEvents)
- {
- _trackInfo.getSelection().selectPoint(inValue);
+ if (_track != null && !_ignoreScrollEvents) {
+ _trackInfo.selectPoint(inValue);
}
}
_trackInfo.selectPhoto(inPhotoIndex);
}
+ /**
+ * Select the specified audio clip
+ * @param inIndex index of selected audio clip
+ */
+ private void selectAudio(int inIndex)
+ {
+ _trackInfo.selectAudio(inIndex);
+ }
/**
* Select the specified waypoint
*/
private void selectWaypoint(int inWaypointIndex)
{
- if (inWaypointIndex >= 0)
- {
+ if (inWaypointIndex >= 0) {
_trackInfo.selectPoint(_waypointListModel.getWaypoint(inWaypointIndex));
}
}
}
else if (numFiles > 1)
{
- _filenameLabel.setText(I18nManager.getText("details.track.numfiles") + ": "
- + numFiles);
+ _filenameLabel.setText(I18nManager.getText("details.track.numfiles") + ": " + numFiles);
}
else _filenameLabel.setText("");
}
}
else
{
- _scroller.setMaximum(_track.getNumPoints() + SCROLLBAR_INTERVAL);
+ _scroller.setMaximum(_track.getNumPoints() -1 + SCROLLBAR_INTERVAL);
if (currentPointIndex >= 0)
_scroller.setValue(currentPointIndex);
_scroller.setEnabled(true);
{
_waypointListModel.fireChanged();
}
- if ((inUpdateType |
+ if ((inUpdateType &
(DataSubscriber.DATA_ADDED_OR_REMOVED | DataSubscriber.DATA_EDITED | DataSubscriber.PHOTOS_MODIFIED)) > 0)
{
_photoListModel.fireChanged();
+ _audioListModel.fireChanged();
}
// Deselect selected waypoint if selected point has since changed
if (_waypointList.getSelectedIndex() >= 0)
{
if (_trackInfo.getCurrentPoint() == null
+ || _waypointList.getSelectedIndex() >= _waypointListModel.getSize()
|| !_waypointListModel.getWaypoint(_waypointList.getSelectedIndex()).equals(_trackInfo.getCurrentPoint()))
{
// point is selected in list but different from current point - deselect
_waypointList.clearSelection();
}
}
- // Do the same for the photos
- if (_photoList.getSelectedIndex() >= 0)
+ // Hide photo list if no photos loaded, same for audio
+ redrawLists(_photoListModel.getSize() > 0, _audioListModel.getSize() > 0);
+
+ // Make sure correct photo is selected
+ if (_photoListModel.getSize() > 0)
{
- DataPoint trackPoint = _trackInfo.getCurrentPoint();
- Photo selectedPhoto = _photoListModel.getPhoto(_photoList.getSelectedIndex());
- // Get selected Photo, if it's still there
- DataPoint photoPoint = null;
- if (selectedPhoto != null) {
- photoPoint = _photoListModel.getPhoto(_photoList.getSelectedIndex()).getDataPoint();
+ int photoIndex = _trackInfo.getSelection().getCurrentPhotoIndex();
+ int listSelection = _photoList.getSelectedIndex();
+ // Change listbox selection if indexes not equal
+ if (listSelection != photoIndex)
+ {
+ if (photoIndex < 0) {
+ _photoList.clearSelection();
+ }
+ else {
+ _photoList.setSelectedIndex(photoIndex);
+ }
}
- // Compare selected photo with selected point
- if ( (photoPoint != null && (trackPoint == null || !photoPoint.equals(trackPoint)))
- || (_trackInfo.getSelection().getCurrentPhotoIndex() < 0) )
+ }
+ // Same for audio clips
+ if (_audioListModel.getSize() > 0)
+ {
+ int audioIndex = _trackInfo.getSelection().getCurrentAudioIndex();
+ int listSelection = _audioList.getSelectedIndex();
+ // Change listbox selection if indexes not equal
+ if (listSelection != audioIndex)
{
- // photo is selected in list but different from current point - deselect
- _photoList.clearSelection();
- _trackInfo.getSelection().deselectPhoto();
+ if (audioIndex < 0) {
+ _audioList.clearSelection();
+ }
+ else {
+ _audioList.setSelectedIndex(audioIndex);
+ }
}
}
}
+
+ /**
+ * Make one of the three list panels
+ * @param inNameKey key for heading text
+ * @param inList list object
+ * @return panel object
+ */
+ private static JPanel makeListPanel(String inNameKey, JList inList)
+ {
+ JPanel panel = new JPanel();
+ panel.setLayout(new BorderLayout());
+ panel.add(new JLabel(I18nManager.getText(inNameKey)), BorderLayout.NORTH);
+ inList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ panel.add(new JScrollPane(inList), BorderLayout.CENTER);
+ return panel;
+ }
+
+ /**
+ * Redraw the list panels in the display according to which ones should be shown
+ * @param inShowPhotos true to show photo list
+ * @param inShowAudio true to show audio list
+ */
+ private void redrawLists(boolean inShowPhotos, boolean inShowAudio)
+ {
+ // exit if same as last time
+ int panels = 1 + (inShowPhotos?2:0) + (inShowAudio?4:0);
+ if (panels == _visiblePanels) return;
+ _visiblePanels = panels;
+ // remove all panels and re-add them
+ _listsPanel.removeAll();
+ _listsPanel.setLayout(new GridLayout(0, 1));
+ _listsPanel.add(_waypointListPanel);
+ if (inShowPhotos) {
+ _listsPanel.add(_photoListPanel);
+ }
+ if (inShowAudio) {
+ _listsPanel.add(_audioListPanel);
+ }
+ _listsPanel.invalidate();
+ _listsPanel.getParent().validate();
+ }
}