More and better playlist management.
git-svn-id: https://samskivert.googlecode.com/svn/trunk@177 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: ChooserFrame.java,v 1.4 2001/07/12 23:06:55 mdb Exp $
|
// $Id: ChooserFrame.java,v 1.5 2001/07/13 00:11:05 mdb Exp $
|
||||||
|
|
||||||
package robodj.chooser;
|
package robodj.chooser;
|
||||||
|
|
||||||
@@ -33,13 +33,13 @@ public class ChooserFrame
|
|||||||
|
|
||||||
// the top of the UI is the browser and the playlist manager
|
// the top of the UI is the browser and the playlist manager
|
||||||
JTabbedPane tpane = new JTabbedPane();
|
JTabbedPane tpane = new JTabbedPane();
|
||||||
BrowsePanel bpanel = new BrowsePanel();
|
|
||||||
String tip = "Browse and select tunes to play.";
|
|
||||||
tpane.addTab("Browse", null, bpanel, tip);
|
|
||||||
|
|
||||||
PlaylistPanel ppanel = new PlaylistPanel();
|
PlaylistPanel ppanel = new PlaylistPanel();
|
||||||
tip = "View and manipulate the playlist.";
|
String tip = "View and manipulate the playlist.";
|
||||||
tpane.addTab("Playlist", null, ppanel, tip);
|
tpane.addTab("Playlist", null, ppanel, tip);
|
||||||
|
|
||||||
|
BrowsePanel bpanel = new BrowsePanel();
|
||||||
|
tip = "Browse and select tunes to play.";
|
||||||
|
tpane.addTab("Browse", null, bpanel, tip);
|
||||||
top.add(tpane);
|
top.add(tpane);
|
||||||
|
|
||||||
// the bottom is the control bar
|
// the bottom is the control bar
|
||||||
@@ -50,8 +50,6 @@ public class ChooserFrame
|
|||||||
// add some fake control buttons for now
|
// add some fake control buttons for now
|
||||||
cbar.add(_pause = createControlButton("Pause", "pause"));
|
cbar.add(_pause = createControlButton("Pause", "pause"));
|
||||||
cbar.add(createControlButton("Stop", "stop"));
|
cbar.add(createControlButton("Stop", "stop"));
|
||||||
cbar.add(createControlButton("Skip", "skip"));
|
|
||||||
cbar.add(createControlButton("Clear", "clear"));
|
|
||||||
cbar.add(createControlButton("Exit", "exit"));
|
cbar.add(createControlButton("Exit", "exit"));
|
||||||
|
|
||||||
// stick it into the frame
|
// stick it into the frame
|
||||||
|
|||||||
@@ -1,17 +1,26 @@
|
|||||||
//
|
//
|
||||||
// $Id: PlaylistPanel.java,v 1.1 2001/07/12 23:06:55 mdb Exp $
|
// $Id: PlaylistPanel.java,v 1.2 2001/07/13 00:11:05 mdb Exp $
|
||||||
|
|
||||||
package robodj.chooser;
|
package robodj.chooser;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Font;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
|
||||||
import com.samskivert.swing.*;
|
import com.samskivert.swing.*;
|
||||||
|
import com.samskivert.swing.util.*;
|
||||||
|
import com.samskivert.util.StringUtil;
|
||||||
|
|
||||||
|
import robodj.Log;
|
||||||
|
import robodj.repository.*;
|
||||||
|
|
||||||
public class PlaylistPanel
|
public class PlaylistPanel
|
||||||
extends JPanel
|
extends JPanel
|
||||||
implements ActionListener
|
implements TaskObserver, ActionListener
|
||||||
{
|
{
|
||||||
public PlaylistPanel ()
|
public PlaylistPanel ()
|
||||||
{
|
{
|
||||||
@@ -31,11 +40,29 @@ public class PlaylistPanel
|
|||||||
JScrollPane bscroll = new JScrollPane(_bpanel);
|
JScrollPane bscroll = new JScrollPane(_bpanel);
|
||||||
add(bscroll);
|
add(bscroll);
|
||||||
|
|
||||||
// add our navigation button
|
GroupLayout bgl = new HGroupLayout(GroupLayout.NONE);
|
||||||
_clearbut = new JButton("Clear");
|
bgl.setJustification(GroupLayout.RIGHT);
|
||||||
_clearbut.setActionCommand("clear");
|
JPanel cbar = new JPanel(bgl);
|
||||||
_clearbut.addActionListener(this);
|
|
||||||
add(_clearbut, GroupLayout.FIXED);
|
// add our control buttons
|
||||||
|
cbar.add(_clearbut = createControlButton("Clear", "clear"));
|
||||||
|
cbar.add(createControlButton("Skip", "skip"));
|
||||||
|
cbar.add(createControlButton("Refresh", "refresh"));
|
||||||
|
add(cbar, GroupLayout.FIXED);
|
||||||
|
|
||||||
|
// use a special font for our name buttons
|
||||||
|
_nameFont = new Font("Helvetica", Font.PLAIN, 10);
|
||||||
|
|
||||||
|
// load up the playlist
|
||||||
|
refreshPlaylist();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected JButton createControlButton (String label, String action)
|
||||||
|
{
|
||||||
|
JButton cbut = new JButton(label);
|
||||||
|
cbut.setActionCommand(action);
|
||||||
|
cbut.addActionListener(this);
|
||||||
|
return cbut;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void actionPerformed (ActionEvent e)
|
public void actionPerformed (ActionEvent e)
|
||||||
@@ -45,9 +72,181 @@ public class PlaylistPanel
|
|||||||
|
|
||||||
} else if (cmd.equals("clear")) {
|
} else if (cmd.equals("clear")) {
|
||||||
Chooser.scontrol.clear();
|
Chooser.scontrol.clear();
|
||||||
|
|
||||||
|
} else if (cmd.equals("skip")) {
|
||||||
|
Chooser.scontrol.skip();
|
||||||
|
|
||||||
|
} else if (cmd.equals("refresh")) {
|
||||||
|
refreshPlaylist();
|
||||||
|
|
||||||
|
} else if (cmd.equals("skipto")) {
|
||||||
|
JButton src = (JButton)e.getSource();
|
||||||
|
PlaylistEntry entry =
|
||||||
|
(PlaylistEntry)src.getClientProperty("entry");
|
||||||
|
Chooser.scontrol.skipto(entry.song.songid);
|
||||||
|
refreshPlaylist();
|
||||||
|
|
||||||
|
} else if (cmd.equals("remove")) {
|
||||||
|
JButton src = (JButton)e.getSource();
|
||||||
|
PlaylistEntry entry =
|
||||||
|
(PlaylistEntry)src.getClientProperty("entry");
|
||||||
|
Chooser.scontrol.remove(entry.song.songid);
|
||||||
|
refreshPlaylist();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void refreshPlaylist ()
|
||||||
|
{
|
||||||
|
// stick a "loading" label in the list to let the user know
|
||||||
|
// what's up
|
||||||
|
_bpanel.removeAll();
|
||||||
|
_bpanel.add(new JLabel("Loading..."));
|
||||||
|
|
||||||
|
// start up the task that reads the CD info from the database
|
||||||
|
TaskMaster.invokeMethodTask("readPlaylist", this, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void readPlaylist ()
|
||||||
|
throws SQLException
|
||||||
|
{
|
||||||
|
// clear out any previous playlist
|
||||||
|
_plist.clear();
|
||||||
|
|
||||||
|
// find out what's currently playing
|
||||||
|
String playing = Chooser.scontrol.getPlaying();
|
||||||
|
playing = StringUtil.split(playing, ":")[1].trim();
|
||||||
|
_playid = -1;
|
||||||
|
if (!playing.equals("<none>")) {
|
||||||
|
try {
|
||||||
|
_playid = Integer.parseInt(playing);
|
||||||
|
} catch (NumberFormatException nfe) {
|
||||||
|
Log.warning("Unable to parse currently playing id '" +
|
||||||
|
playing + "'.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the playlist from the music daemon
|
||||||
|
String[] plist = Chooser.scontrol.getPlaylist();
|
||||||
|
|
||||||
|
// parse it into playlist entries
|
||||||
|
for (int i = 0; i < plist.length; i++) {
|
||||||
|
String[] toks = StringUtil.split(plist[i], "\t");
|
||||||
|
int eid, sid;
|
||||||
|
try {
|
||||||
|
eid = Integer.parseInt(toks[0]);
|
||||||
|
sid = Integer.parseInt(toks[1]);
|
||||||
|
} catch (NumberFormatException nfe) {
|
||||||
|
Log.warning("Bogus playlist record: '" + plist[i] + "'.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Entry entry = Chooser.model.getEntry(eid);
|
||||||
|
Song song = entry.getSong(sid);
|
||||||
|
_plist.add(new PlaylistEntry(entry, song));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void taskCompleted (String name, Object result)
|
||||||
|
{
|
||||||
|
if (name.equals("readPlaylist")) {
|
||||||
|
populatePlaylist();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void taskFailed (String name, Throwable exception)
|
||||||
|
{
|
||||||
|
String msg;
|
||||||
|
if (Exception.class.equals(exception.getClass())) {
|
||||||
|
msg = exception.getMessage();
|
||||||
|
} else {
|
||||||
|
msg = exception.toString();
|
||||||
|
}
|
||||||
|
JOptionPane.showMessageDialog(this, msg, "Error",
|
||||||
|
JOptionPane.ERROR_MESSAGE);
|
||||||
|
Log.logStackTrace(exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void populatePlaylist ()
|
||||||
|
{
|
||||||
|
// clear out any existing children
|
||||||
|
_bpanel.removeAll();
|
||||||
|
|
||||||
|
// adjust our layout policy
|
||||||
|
GroupLayout gl = (GroupLayout)_bpanel.getLayout();
|
||||||
|
gl.setOffAxisPolicy(GroupLayout.EQUALIZE);
|
||||||
|
gl.setOffAxisJustification(GroupLayout.LEFT);
|
||||||
|
|
||||||
|
// add buttons for every entry
|
||||||
|
String title = null;
|
||||||
|
for (int i = 0; i < _plist.size(); i++) {
|
||||||
|
PlaylistEntry entry = (PlaylistEntry)_plist.get(i);
|
||||||
|
|
||||||
|
// add record/artist indicators when the record and artist
|
||||||
|
// changes
|
||||||
|
if (!entry.entry.title.equals(title)) {
|
||||||
|
title = entry.entry.title;
|
||||||
|
JLabel label = new JLabel(entry.entry.title + " - " +
|
||||||
|
entry.entry.artist);
|
||||||
|
_bpanel.add(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
// create a browse and a play button
|
||||||
|
JPanel hpanel = new JPanel();
|
||||||
|
gl = new HGroupLayout(GroupLayout.NONE);
|
||||||
|
gl.setOffAxisPolicy(GroupLayout.STRETCH);
|
||||||
|
gl.setJustification(GroupLayout.LEFT);
|
||||||
|
hpanel.setLayout(gl);
|
||||||
|
|
||||||
|
entry.label = new JLabel(entry.song.title);
|
||||||
|
if (entry.song.songid == _playid) {
|
||||||
|
entry.label.setForeground(Color.red);
|
||||||
|
}
|
||||||
|
entry.label.setFont(_nameFont);
|
||||||
|
hpanel.add(entry.label);
|
||||||
|
|
||||||
|
JButton button;
|
||||||
|
button = new JButton("Skip to");
|
||||||
|
button.setFont(_nameFont);
|
||||||
|
button.setActionCommand("skipto");
|
||||||
|
button.addActionListener(this);
|
||||||
|
button.putClientProperty("entry", entry);
|
||||||
|
hpanel.add(button);
|
||||||
|
|
||||||
|
button = new JButton("Remove");
|
||||||
|
button.setActionCommand("remove");
|
||||||
|
button.setFont(_nameFont);
|
||||||
|
button.addActionListener(this);
|
||||||
|
button.putClientProperty("entry", entry);
|
||||||
|
hpanel.add(button);
|
||||||
|
|
||||||
|
_bpanel.add(hpanel);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if there were no entries, stick a label in to that effect
|
||||||
|
if (_plist.size() == 0) {
|
||||||
|
_bpanel.add(new JLabel("Nothing playing."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static class PlaylistEntry
|
||||||
|
{
|
||||||
|
public Entry entry;
|
||||||
|
|
||||||
|
public Song song;
|
||||||
|
|
||||||
|
public JLabel label;
|
||||||
|
|
||||||
|
public PlaylistEntry (Entry entry, Song song)
|
||||||
|
{
|
||||||
|
this.entry = entry;
|
||||||
|
this.song = song;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected JPanel _bpanel;
|
protected JPanel _bpanel;
|
||||||
protected JButton _clearbut;
|
protected JButton _clearbut;
|
||||||
|
|
||||||
|
protected ArrayList _plist = new ArrayList();
|
||||||
|
protected int _playid;
|
||||||
|
|
||||||
|
protected Font _nameFont;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user