/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package io.neocdtv.simpleplayer.ui; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.DefaultListModel; import javax.swing.DropMode; import javax.swing.JList; import javax.swing.ListSelectionModel; /** * * @author xix */ public class PlaylistUI extends JList<PlaylistEntry> { private static PlaylistUI INSTANCE; public static PlaylistUI getInstance() { if (INSTANCE == null) { INSTANCE = new PlaylistUI(); } return INSTANCE; } private final static Logger LOGGER = Logger.getLogger(PlaylistUI.class.getName()); private int playingIndex = 0; private PlaylistUI() { super(new DefaultListModel<PlaylistEntry>()); setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); setDragEnabled(true); setTransferHandler(new PlaylistTransferHandler()); setDropMode(DropMode.INSERT); } @Override public DefaultListModel<PlaylistEntry> getModel() { return (DefaultListModel<PlaylistEntry>) super.getModel(); } public void addElement(final String url) { getModel().addElement(new PlaylistEntry(url, url)); } public String getSelectedTrackUrl() { LOGGER.log(Level.INFO, "getting track url for current playlist entry..."); String selectedTrackUrl = null; final int selectedIndex = getSelectedIndex(); LOGGER.log(Level.INFO, "selected index {0} ", selectedIndex); if (selectedIndex >= 0) { selectedTrackUrl = getModel().get(selectedIndex).getPath(); playingIndex = selectedIndex; } LOGGER.log(Level.INFO, "selected playlist track {0}", selectedTrackUrl); ensureIndexIsVisible(selectedIndex); return selectedTrackUrl; } public String getNextSelectedTrackUrl() { LOGGER.log(Level.INFO, "getting track url for next selected playlist entry..."); String nextSelectedTrackUrl = null; int selectedIndex = getSelectedIndex(); if (selectedIndex >= 0) { if (selectedIndex == getModel().getSize()) { selectedIndex = 0; } else { selectedIndex++; } playingIndex = selectedIndex; setSelectedIndex(selectedIndex); nextSelectedTrackUrl = getModel().get(selectedIndex).getPath(); } LOGGER.log(Level.INFO, "next playlist track {0}", nextSelectedTrackUrl); ensureIndexIsVisible(selectedIndex); return nextSelectedTrackUrl; } public String getNextTrackUrl() { LOGGER.log(Level.INFO, "getting track url for next playlist entry..."); String nextTrackUrl = null; if (getModel().getSize() > 0 && playingIndex >= 0) { playingIndex++; if (playingIndex >= getModel().getSize()) { playingIndex = 0; } setSelectedIndex(playingIndex); nextTrackUrl = getModel().get(playingIndex).getPath(); } ensureIndexIsVisible(playingIndex); return nextTrackUrl; } void selectAll() { final DefaultListModel<PlaylistEntry> model = getModel(); for (int i = 0; i < model.getSize(); i++) { int[] indicies = new int[model.getSize()]; indicies[i] = i; setSelectedIndices(indicies); } } void removeSelected() { final DefaultListModel<PlaylistEntry> model = getModel(); final List<PlaylistEntry> selectedValuesList = getSelectedValuesList(); for (PlaylistEntry entry: selectedValuesList) { model.removeElement(entry); } } }