/*
* Playlists.java
*
* Created on May 18, 2007, 12:13:17 PM
*
* displays the playlists in the collection for the specified mode. the items
* can be dragged off onto the playlist creation panel.
*
*/
package com.pugh.sockso.gui;
import com.pugh.sockso.db.Database;
import com.pugh.sockso.resources.Resources;
import com.pugh.sockso.Utils;
import com.pugh.sockso.music.Playlist;
import com.pugh.sockso.music.CollectionManager;
import com.pugh.sockso.music.CollectionManagerListener;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JPopupMenu;
import javax.swing.DefaultListModel;
import javax.swing.JMenuItem;
import javax.swing.ImageIcon;
import org.apache.log4j.Logger;
public class Playlists extends MusicList implements CollectionManagerListener {
private static final Logger log = Logger.getLogger( Playlists.class );
public static final int USER_PLAYLISTS = 1;
public static final int SITE_PLAYLISTS = 2;
private final Database db;
private final CollectionManager cm;
private final Resources r;
private final DefaultListModel model;
private final int mode;
public Playlists( final Database db, final CollectionManager cm, final Resources r, final int mode ) {
this.db = db;
this.cm = cm;
this.r = r;
this.mode = mode;
model = new DefaultListModel();
addMouseListener( new MouseAdapter() {
@Override
public void mouseClicked( final MouseEvent evt ) {
// screen for right-clicks
if ( evt.getButton() == MouseEvent.BUTTON3 )
handleRightClick( evt );
}
});
setModel( model );
cm.addCollectionManagerListener( this );
}
/**
* handles a right-click on the control
*
* @param evt the MouseEvent object
*
*/
private void handleRightClick( final MouseEvent evt ) {
final Point p = evt.getPoint();
// select the list item under the mouse
this.setSelectedIndex( locationToIndex(p) );
if ( getSelectedIndex() == -1 ) return;
final JMenuItem delete = new JMenuItem( "Delete", new ImageIcon(r.getImage("icons/16x16/delete.png")) );
delete.addActionListener( new ActionListener() {
public void actionPerformed( final ActionEvent evt ) {
deleteSelectedItem();
}
});
// show the popup menu
final JPopupMenu menu = new JPopupMenu();
menu.add( delete );
menu.show( this, (int)p.getX(), (int)p.getY() );
}
/**
* does exactly what it says on the tin. tries to remove the
* selected playlist from the collection, and if this works then
* it's removed from the list aswell.
*
*/
private void deleteSelectedItem() {
final int index = getSelectedIndex();
if ( index != -1 ) {
final Playlist playlist = (Playlist) model.getElementAt( index );
cm.removePlaylist( playlist.getId() );
}
}
/**
* completely refreshes the list with all the playlists
* from the database
*
*/
protected void refresh() {
model.clear();
ResultSet rs = null;
PreparedStatement st = null;
try {
final String sql = " select p.id as id, p.name as name " +
" from playlists p " +
" where user_id is " +(mode == USER_PLAYLISTS ? " not " : "" )+ " null " +
" order by p.name asc ";
st = db.prepare( sql );
rs = st.executeQuery();
while ( rs.next() )
model.addElement( new Playlist(rs.getInt("id"),rs.getString("name")) );
}
catch ( final SQLException e ) {
log.error( e.getMessage() );
}
finally {
Utils.close( rs );
Utils.close( st );
}
}
/**
* handles changes in the collection that will effect playlists
*
* @param type the change type
* @param message description
*
*/
public void collectionManagerChangePerformed( final int type, final String message ) {
if ( type == CollectionManagerListener.PLAYLISTS_CHANGED )
refresh();
}
}