Major facelift. Icons for everything, lays out much more nicely. All the

games and all the puzzles.


git-svn-id: https://samskivert.googlecode.com/svn/trunk@636 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
mdb
2002-03-03 20:56:12 +00:00
parent d28142f3fa
commit ed488b3a97
19 changed files with 284 additions and 116 deletions
+1 -1
View File
@@ -29,8 +29,8 @@
<mkdir dir="${javadoc.dir}"/>
<!-- copy media into the target directory -->
<copy todir="${deploy.dir}/classes">
<fileset dir="${src.dir}" includes="**/*.gif"/>
<fileset dir="${src.dir}" includes="**/*.jpg"/>
<fileset dir="${src.dir}" includes="**/*.png"/>
</copy>
<copy todir="${deploy.dir}/classes/conf">
<fileset dir="conf"/>
@@ -1,11 +1,12 @@
//
// $Id: ChooserFrame.java,v 1.8 2002/03/03 17:21:46 mdb Exp $
// $Id: ChooserFrame.java,v 1.9 2002/03/03 20:56:12 mdb Exp $
package robodj.chooser;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import com.samskivert.swing.*;
@@ -16,6 +17,7 @@ import com.samskivert.swing.util.TaskMaster;
import robodj.Log;
import robodj.Version;
import robodj.repository.*;
import robodj.util.ButtonUtil;
import robodj.util.ServerControl.PlayingListener;
public class ChooserFrame extends JFrame
@@ -58,11 +60,20 @@ public class ChooserFrame extends JFrame
JPanel cbar = new JPanel(bgl);
// add some fake control buttons for now
cbar.add(createControlButton("Back", "back"));
cbar.add(_stop = createControlButton("Stop", "stop"));
cbar.add(_pause = createControlButton("Pause", "pause"));
cbar.add(createControlButton("Skip", "skip"));
cbar.add(createControlButton("Exit", "exit"));
cbar.add(ButtonUtil.createControlButton(
BACK_TIP, "back", BACK_ICON_PATH, this, true));
_stop = ButtonUtil.createControlButton(
STOP_TIP, "stop", STOP_ICON_PATH, this, true);
cbar.add(_stop);
_pauseIcon = ButtonUtil.getIcon(PAUSE_ICON_PATH);
_playIcon = ButtonUtil.getIcon(PLAY_ICON_PATH);
_pause = ButtonUtil.createControlButton(
"", "pause", _pauseIcon, this, true);
cbar.add(_pause);
cbar.add(ButtonUtil.createControlButton(
SKIP_TIP, "skip", SKIP_ICON_PATH, this, true));
cbar.add(ButtonUtil.createControlButton(
EXIT_TIP, "exit", EXIT_ICON_PATH, this, true));
// stick it into the frame
top.add(cbar, GroupLayout.FIXED);
@@ -78,14 +89,6 @@ public class ChooserFrame extends JFrame
TaskMaster.invokeMethodTask("refreshPlaying", Chooser.scontrol, this);
}
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)
{
String cmd = e.getActionCommand();
@@ -133,12 +136,14 @@ public class ChooserFrame extends JFrame
public void playingUpdated (int songid, boolean paused)
{
if (songid == -1 || paused) {
_pause.setLabel("Play");
_pause.setToolTipText(PLAY_TIP);
_pause.setActionCommand("play");
_pause.setIcon(_playIcon);
} else {
_pause.setLabel("Pause");
_pause.setToolTipText(PAUSE_TIP);
_pause.setActionCommand("pause");
_pause.setIcon(_pauseIcon);
}
_stop.setEnabled(songid != -1);
@@ -149,4 +154,26 @@ public class ChooserFrame extends JFrame
/** A reference to the stop button. */
protected JButton _stop;
// used when toggling between play and pause
protected ImageIcon _playIcon;
protected ImageIcon _pauseIcon;
// icon paths
protected static final String ICON_ROOT = "/robodj/chooser/images/";
protected static final String PLAY_ICON_PATH = ICON_ROOT + "play.png";
protected static final String PAUSE_ICON_PATH = ICON_ROOT + "pause.png";
protected static final String STOP_ICON_PATH = ICON_ROOT + "stop.png";
protected static final String SKIP_ICON_PATH = ICON_ROOT + "skip.png";
protected static final String BACK_ICON_PATH = ICON_ROOT + "back.png";
protected static final String EXIT_ICON_PATH = ICON_ROOT + "exit.png";
// button tips
protected static final String PLAY_TIP = "Play";
protected static final String PAUSE_TIP =
"Pause the currently playing song";
protected static final String STOP_TIP = "Stop the currently playing song";
protected static final String SKIP_TIP = "Skip to the next song";
protected static final String BACK_TIP = "Skip to the previous song";
protected static final String EXIT_TIP = "Exit";
}
@@ -1,5 +1,5 @@
//
// $Id: EntryList.java,v 1.11 2002/02/28 16:32:45 mdb Exp $
// $Id: EntryList.java,v 1.12 2002/03/03 20:56:12 mdb Exp $
package robodj.chooser;
@@ -18,37 +18,39 @@ import com.samskivert.swing.util.*;
import robodj.Log;
import robodj.repository.*;
import robodj.util.ButtonUtil;
public abstract class EntryList extends JPanel
public abstract class EntryList extends JScrollPane
implements TaskObserver, ActionListener, AncestorListener
{
public EntryList ()
{
GroupLayout gl = new VGroupLayout(GroupLayout.STRETCH);
gl.setOffAxisPolicy(GroupLayout.STRETCH);
setLayout(gl);
// create the pane that will hold the buttons
gl = new VGroupLayout(GroupLayout.NONE);
GroupLayout gl = new VGroupLayout(GroupLayout.NONE);
gl.setOffAxisPolicy(GroupLayout.STRETCH);
gl.setJustification(GroupLayout.TOP);
_bpanel = new ScrollablePanel();
gl.setGap(2);
_bpanel = new ScrollablePanel() {
// make the playlist fit the width of the scrolling viewport
public boolean getScrollableTracksViewportWidth () {
return true;
}
};
_bpanel.setLayout(gl);
// give ourselves a wee bit of a border
_bpanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
// put it into a scrolling pane
_scroller = new JScrollPane(_bpanel);
add(_scroller);
// add our navigation button
_upbut = new JButton("Up");
_upbut.setActionCommand("up");
_upbut.addActionListener(this);
add(_upbut, GroupLayout.FIXED);
// set our viewport view
setViewportView(_bpanel);
// use a special font for our name buttons
_nameFont = new Font("Helvetica", Font.PLAIN, 10);
_titleFont = new Font("Helvetica", Font.BOLD, 14);
_nameFont = new Font("Helvetica", Font.PLAIN, 12);
// create our icons
_browseIcon = ButtonUtil.getIcon(BROWSE_ICON_PATH);
_playIcon = ButtonUtil.getIcon(PLAY_ICON_PATH);
// listen to ancestor events
addAncestorListener(this);
@@ -131,17 +133,9 @@ public abstract class EntryList extends JPanel
*/
protected void populateEntries (Entry[] entries)
{
// disable the up button because we're at the top level
_upbut.setEnabled(false);
// clear out any existing children
_bpanel.removeAll();
// adjust our layout policy
GroupLayout gl = (GroupLayout)_bpanel.getLayout();
gl.setOffAxisPolicy(GroupLayout.EQUALIZE);
gl.setOffAxisJustification(GroupLayout.LEFT);
// sort our entries
Comparator ecomp = new Comparator() {
public int compare (Object o1, Object o2) {
@@ -165,26 +159,30 @@ public abstract class EntryList extends JPanel
}
// create a browse and a play button
JPanel hpanel = new JPanel();
gl = new HGroupLayout(GroupLayout.NONE);
GroupLayout gl = new HGroupLayout(GroupLayout.NONE);
gl.setOffAxisPolicy(GroupLayout.STRETCH);
gl.setJustification(GroupLayout.LEFT);
hpanel.setLayout(gl);
JPanel hpanel = new JPanel(gl);
JButton button;
button = new JButton(entries[i].title);
button.setFont(_nameFont);
button.setActionCommand("browse");
button.addActionListener(this);
button.putClientProperty("entry", entries[i]);
button.setToolTipText("Entry ID: " + entries[i].entryid);
hpanel.add(button);
button = new JButton("Play");
button.setActionCommand("playall");
button.addActionListener(this);
// add a browse button
button = ButtonUtil.createControlButton(
BROWSE_ENTRY_TIP, "browse", _browseIcon, this, true);
button.putClientProperty("entry", entries[i]);
hpanel.add(button);
hpanel.add(button, GroupLayout.FIXED);
// add a play all button
button = ButtonUtil.createControlButton(
PLAY_ENTRY_TIP, "playall", _playIcon, this, true);
button.putClientProperty("entry", entries[i]);
hpanel.add(button, GroupLayout.FIXED);
// add the entry title
JLabel entryLabel = new JLabel(entries[i].title);
entryLabel.setFont(_nameFont);
entryLabel.setToolTipText(entries[i].title +
" (" + entries[i].entryid + ")");
hpanel.add(entryLabel);
_bpanel.add(hpanel);
}
@@ -211,21 +209,33 @@ public abstract class EntryList extends JPanel
protected void populateSong (Entry entry)
{
// enable the up button because we're looking at a song
_upbut.setEnabled(true);
// clear out any existing children
_bpanel.removeAll();
// adjust our layout policy
((GroupLayout)_bpanel.getLayout()).setOffAxisPolicy(
GroupLayout.NONE);
GroupLayout gl = new HGroupLayout(HGroupLayout.STRETCH);
gl.setJustification(GroupLayout.LEFT);
JPanel header = new JPanel(gl);
// create a combo box and accoutrements for selecting the category
JPanel catPanel = new JPanel(new HGroupLayout(GroupLayout.STRETCH));
JLabel catLabel = new JLabel("Set category");
// add the album title
JLabel label = new JLabel(entry.title);
label.setToolTipText(entry.title);
label.setFont(_titleFont);
header.add(label);
// add a button for getting the heck out of here
JButton upbtn = ButtonUtil.createControlButton(
UP_TIP, "up", ButtonUtil.getIcon(UP_ICON_PATH), this, true);
header.add(upbtn, GroupLayout.FIXED);
// create an edit button
JButton ebtn = ButtonUtil.createControlButton(
EDIT_TIP, "edit", ButtonUtil.getIcon(EDIT_ICON_PATH), this, true);
header.add(ebtn, GroupLayout.FIXED);
// add a combo box for categorizing
JComboBox catcombo =
new JComboBox(ModelUtil.catBoxNames(Chooser.model));
header.add(catcombo, GroupLayout.FIXED);
// configure the combo box
catcombo.addActionListener(this);
@@ -234,20 +244,7 @@ public abstract class EntryList extends JPanel
int catidx = ModelUtil.getCategoryIndex(Chooser.model, catid);
catcombo.setSelectedIndex(catidx+1);
// create an edit button
JButton ebtn = new JButton("Edit entry");
ebtn.setActionCommand("edit");
ebtn.addActionListener(this);
// wire it all up
catPanel.add(catLabel, GroupLayout.FIXED);
catPanel.add(catcombo);
catPanel.add(ebtn, GroupLayout.FIXED);
_bpanel.add(catPanel, GroupLayout.FIXED);
// add a label for the title
JLabel label = new JLabel(entry.title);
_bpanel.add(label);
_bpanel.add(header, GroupLayout.FIXED);
// sort the songs by position
Comparator scomp = new Comparator() {
@@ -263,13 +260,23 @@ public abstract class EntryList extends JPanel
// and add buttons for every song
for (int i = 0; i < entry.songs.length; i++) {
JButton button = new JButton(entry.songs[i].title);
button.setFont(_nameFont);
button.setActionCommand("play");
button.addActionListener(this);
button.setHorizontalAlignment(JButton.LEFT);
gl = new HGroupLayout(GroupLayout.NONE);
gl.setJustification(GroupLayout.LEFT);
JPanel hpanel = new JPanel(gl);
// add a button for playing the song
JButton button = ButtonUtil.createControlButton(
PLAY_SONG_TIP, "play", _playIcon, this, true);
button.putClientProperty("song", entry.songs[i]);
_bpanel.add(button);
hpanel.add(button, GroupLayout.FIXED);
// add the song title
JLabel trackLabel = new JLabel(entry.songs[i].title);
trackLabel.setFont(_nameFont);
trackLabel.setToolTipText(entry.songs[i].title);
hpanel.add(trackLabel);
_bpanel.add(hpanel);
}
// reset our scroll position so that we're displaying the top of
@@ -278,12 +285,12 @@ public abstract class EntryList extends JPanel
// we've removed and added components so we need to revalidate
revalidate();
repaint();
}
protected void clearScrollPosition ()
{
BoundedRangeModel model =
_scroller.getVerticalScrollBar().getModel();
BoundedRangeModel model = getVerticalScrollBar().getModel();
model.setValue(model.getMinimum());
}
@@ -326,7 +333,7 @@ public abstract class EntryList extends JPanel
TaskMaster.invokeMethodTask("recategorizeEntry", this, this);
} else {
System.out.println("Unknown action event: " + cmd);
Log.warning("Unknown action event: " + cmd);
}
}
@@ -338,6 +345,7 @@ public abstract class EntryList extends JPanel
// we need to revalidate the component because we added a child
revalidate();
repaint();
// start up the task that reads the CD info from the database
TaskMaster.invokeMethodTask("readEntries", this, this);
@@ -354,14 +362,31 @@ public abstract class EntryList extends JPanel
// nothing doing
}
protected JScrollPane _scroller;
protected JPanel _bpanel;
protected JButton _upbut;
protected Entry[] _entries;
protected Entry _entry;
protected int _newcatid;
protected Font _titleFont;
protected Font _nameFont;
protected ImageIcon _playIcon;
protected ImageIcon _browseIcon;
protected static final String PLAY_ENTRY_TIP =
"Append this album to the playlist";
protected static final String PLAY_SONG_TIP =
"Append this song to the playlist";
protected static final String BROWSE_ENTRY_TIP =
"Browse the songs in this album";
protected static final String UP_TIP =
"Back up to albums listing";
protected static final String EDIT_TIP =
"Edit the album information";
protected static final String ICON_ROOT = "/robodj/chooser/images/";
protected static final String PLAY_ICON_PATH = ICON_ROOT + "play.png";
protected static final String BROWSE_ICON_PATH = ICON_ROOT + "browse.png";
protected static final String UP_ICON_PATH = ICON_ROOT + "up.png";
protected static final String EDIT_ICON_PATH = ICON_ROOT + "edit.png";
}
@@ -1,5 +1,5 @@
//
// $Id: PlaylistPanel.java,v 1.12 2002/03/03 17:21:46 mdb Exp $
// $Id: PlaylistPanel.java,v 1.13 2002/03/03 20:56:12 mdb Exp $
package robodj.chooser;
@@ -18,6 +18,7 @@ import com.samskivert.util.StringUtil;
import robodj.Log;
import robodj.repository.*;
import robodj.util.ButtonUtil;
import robodj.util.ServerControl.PlayingListener;
public class PlaylistPanel extends JPanel
@@ -32,6 +33,7 @@ public class PlaylistPanel extends JPanel
// create the pane that will hold the buttons
gl = new VGroupLayout(GroupLayout.NONE);
gl.setJustification(GroupLayout.TOP);
gl.setGap(2);
_bpanel = new SmartPanel();
_bpanel.setLayout(gl);
@@ -47,12 +49,20 @@ public class PlaylistPanel extends JPanel
JPanel cbar = new JPanel(bgl);
// add our control buttons
cbar.add(_clearbut = createControlButton("Clear", "clear"));
cbar.add(createControlButton("Refresh", "refresh"));
_clearbut = ButtonUtil.createControlButton(
CLEAR_TIP, "clear", CLEAR_ICON_PATH, this);
cbar.add(_clearbut);
cbar.add(ButtonUtil.createControlButton(
REFRESH_TIP, "refresh", REFRESH_ICON_PATH, this));
add(cbar, GroupLayout.FIXED);
// use a special font for our name buttons
_nameFont = new Font("Helvetica", Font.PLAIN, 10);
_nameFont = new Font("Helvetica", Font.PLAIN, 12);
// create our icons
_skiptoIcon = ButtonUtil.getIcon(SKIPTO_ICON_PATH);
_removeSongIcon = ButtonUtil.getIcon(REMOVE_SONG_ICON_PATH);
_removeEntryIcon = ButtonUtil.getIcon(REMOVE_ENTRY_ICON_PATH);
// add ourselves as a playing listener
Chooser.scontrol.addPlayingListener(this);
@@ -61,14 +71,6 @@ public class PlaylistPanel extends JPanel
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)
{
String cmd = e.getActionCommand();
@@ -264,7 +266,8 @@ public class PlaylistPanel extends JPanel
JLabel label = new JLabel(entry.entry.title + " - " +
entry.entry.artist);
tpanel.add(label);
tpanel.add(newButton("Remove", "remove_all", entry));
tpanel.add(newButton(REMOVE_ENTRY_TIP, "remove_all",
_removeEntryIcon, entry));
_bpanel.add(tpanel);
}
@@ -276,15 +279,17 @@ public class PlaylistPanel extends JPanel
gl.setJustification(GroupLayout.LEFT);
hpanel.setLayout(gl);
hpanel.add(newButton(SKIPTO_TIP, "skipto", _skiptoIcon, entry));
hpanel.add(newButton(REMOVE_SONG_TIP, "remove",
_removeSongIcon, entry));
entry.label = new JLabel(entry.song.title);
entry.label.setForeground((entry.song.songid == _playid) ?
Color.red : Color.black);
entry.label.setFont(_nameFont);
entry.label.setToolTipText(entry.song.title);
hpanel.add(entry.label);
hpanel.add(newButton("Skip to", "skipto", entry));
hpanel.add(newButton("Remove", "remove", entry));
// let the bpanel know that we want to scroll the active track
// label into place once we're all laid out
if (entry.song.songid == _playid) {
@@ -304,13 +309,11 @@ public class PlaylistPanel extends JPanel
_bpanel.revalidate();
}
protected JButton newButton (String label, String command,
Object clientProperty)
protected JButton newButton (String tooltip, String command,
ImageIcon icon, Object clientProperty)
{
JButton button = new JButton(label);
button.setFont(_nameFont);
button.setActionCommand(command);
button.addActionListener(this);
JButton button = ButtonUtil.createControlButton(
tooltip, command, icon, this, true);
button.putClientProperty("entry", clientProperty);
return button;
}
@@ -387,6 +390,12 @@ public class PlaylistPanel extends JPanel
}
}
// make the playlist fit the width of the scrolling viewport
public boolean getScrollableTracksViewportWidth ()
{
return true;
}
protected JComponent _target;
}
@@ -398,4 +407,28 @@ public class PlaylistPanel extends JPanel
protected int _oldid = -1;
protected Font _nameFont;
protected ImageIcon _skiptoIcon;
protected ImageIcon _removeSongIcon;
protected ImageIcon _removeEntryIcon;
// icon paths
protected static final String ICON_ROOT = "/robodj/chooser/images/";
protected static final String REFRESH_ICON_PATH = ICON_ROOT + "refresh.png";
protected static final String CLEAR_ICON_PATH = ICON_ROOT + "clear.png";
protected static final String SKIPTO_ICON_PATH = ICON_ROOT + "skip.png";
protected static final String REMOVE_ENTRY_ICON_PATH =
ICON_ROOT + "remove_entry.png";
protected static final String REMOVE_SONG_ICON_PATH =
ICON_ROOT + "remove_song.png";
// button tips
protected static final String REFRESH_TIP = "Refresh the playlist";
protected static final String CLEAR_TIP =
"Clear all songs from the playlist";
protected static final String SKIPTO_TIP = "Skip to this song";
protected static final String REMOVE_ENTRY_TIP =
"Remove all songs in this entry from the playlist";
protected static final String REMOVE_SONG_TIP =
"Remove this song from the playlist";
}
@@ -1,5 +1,5 @@
//
// $Id: SearchPanel.java,v 1.2 2002/02/22 07:55:49 mdb Exp $
// $Id: SearchPanel.java,v 1.3 2002/03/03 20:56:12 mdb Exp $
package robodj.chooser;
@@ -63,6 +63,11 @@ public class SearchPanel extends JPanel
// create and add a query entry list for the query
_qlist = new QueryEntryList(_query);
add(_qlist);
// we need to revalidate ourselves and repaint because we've
// added a component
revalidate();
repaint();
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 873 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 941 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 727 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

@@ -0,0 +1,78 @@
//
// $Id: ButtonUtil.java,v 1.1 2002/03/03 20:56:12 mdb Exp $
package robodj.util;
import java.awt.Image;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import robodj.Log;
/**
* Routines for creating buttons with icon images.
*/
public class ButtonUtil
{
public static ImageIcon getIcon (String iconPath)
{
try {
InputStream imgin = ButtonUtil.class.getResourceAsStream(iconPath);
if (imgin != null) {
Image image = ImageIO.read(imgin);
return new ImageIcon(image);
}
} catch (IOException ioe) {
Log.warning("Unable to load icon [path=" + iconPath +
", error=" + ioe + "].");
} catch (Exception e) {
Log.warning("Error loading icon [path=" + iconPath + "].");
Log.logStackTrace(e);
}
return null;
}
public static JButton createControlButton (
String tooltip, String action, String iconPath, ActionListener al)
{
return createControlButton(tooltip, action, iconPath, al, false);
}
public static JButton createControlButton (
String tooltip, String action, String iconPath,
ActionListener al, boolean borderless)
{
return createControlButton(
tooltip, action, getIcon(iconPath), al, borderless);
}
public static JButton createControlButton (
String tooltip, String action, ImageIcon icon, ActionListener al)
{
return createControlButton(tooltip, action, icon, al, false);
}
public static JButton createControlButton (
String tooltip, String action, ImageIcon icon,
ActionListener al, boolean borderless)
{
JButton cbut = new JButton(icon);
cbut.setActionCommand(action);
cbut.addActionListener(al);
cbut.setToolTipText(tooltip);
// clear out that annoying fat border that swing uses
cbut.setBorder(borderless ? BorderFactory.createEmptyBorder() :
BorderFactory.createEtchedBorder());
return cbut;
}
}