package com.robonobo.gui.model;
import java.util.*;
import javax.swing.text.Document;
import ca.odell.glazedlists.*;
import ca.odell.glazedlists.swing.TextComponentMatcherEditor;
import com.robonobo.core.api.RobonoboException;
import com.robonobo.core.api.model.*;
import com.robonobo.gui.frames.RobonoboFrame;
@SuppressWarnings("serial")
public class MyLibraryTableModel extends GlazedTrackListTableModel {
public static MyLibraryTableModel create(RobonoboFrame frame, Document searchTextDoc) {
EventList<Track> el = new BasicEventList<Track>();
SortedList<Track> sl = new SortedList<Track>(el, new TrackComparator());
TextComponentMatcherEditor<Track> matchEdit = new TextComponentMatcherEditor<Track>(searchTextDoc, new TrackFilterator());
matchEdit.setLive(true);
FilterList<Track> fl = new FilterList<Track>(sl, matchEdit);
return new MyLibraryTableModel(frame, el, sl, fl);
}
private MyLibraryTableModel(RobonoboFrame frame, EventList<Track> el, SortedList<Track> sl, FilterList<Track> fl) {
super(frame, el, sl, fl);
}
private boolean trackBelongsInMyLib(Track t) {
return (t instanceof SharedTrack) || (t instanceof DownloadingTrack);
}
@Override
public void trackUpdated(String streamId, Track t) {
// Override the super method - add this track to our library if we're now sharing/downloading it
updateLock.lock();
try {
if(containsTrack(streamId)) {
if(trackBelongsInMyLib(t))
super.trackUpdated(streamId, t);
else
deleteTrack(streamId);
} else {
if(trackBelongsInMyLib(t))
add(t);
}
} finally {
updateLock.unlock();
}
}
@Override
public void tracksUpdated(Collection<Track> trax) {
// Override the super method - add/remove to our library as appropriate
updateLock.lock();
try {
List<Track> traxToUpdate = new ArrayList<Track>();
List<Track> traxToAdd = new ArrayList<Track>();
List<String> sidsToDel = new ArrayList<String>();
for(Track t : trax) {
Integer idx = trackIndices.get(t.getStream().getStreamId());
if (idx != null) {
if(trackBelongsInMyLib(t))
traxToUpdate.add(t);
else
sidsToDel.add(t.stream.streamId);
} else {
if ((t instanceof SharedTrack) || (t instanceof DownloadingTrack))
traxToAdd.add(t);
}
}
if(traxToAdd.size() > 0)
add(traxToAdd);
if(sidsToDel.size() > 0)
deleteTracks(sidsToDel);
if(traxToUpdate.size() > 0)
super.tracksUpdated(traxToUpdate);
} finally {
updateLock.unlock();
}
}
@Override
public void allTracksLoaded() {
// Do nothing
}
@Override
public boolean allowDelete() {
return true;
}
@Override
public String deleteTracksTooltipDesc() {
return "Remove tracks from library";
}
@Override
public String longDeleteTracksDesc() {
return "remove these tracks from your music library";
}
@Override
public void deleteTracks(List<String> streamIds) {
// We delete downloads all at once to avoid starting downloads we're about to delete
List<String> dlSids = new ArrayList<String>();
try {
for (String sid : streamIds) {
Track t = control.getTrack(sid);
if (t instanceof DownloadingTrack)
dlSids.add(sid);
else if (t instanceof SharedTrack)
control.deleteShare(sid);
}
StringBuffer sb = new StringBuffer("DEBUG: MLTM deleting downloads:");
for (String sid : dlSids) {
sb.append(" ").append(sid);
}
log.debug(sb);
control.deleteDownloads(dlSids);
} catch (RobonoboException ex) {
log.error("Error deleting share/download", ex);
}
super.deleteTracks(streamIds);
}
}