package com.robonobo.gui.model;
import java.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.robonobo.core.RobonoboController;
import com.robonobo.core.api.model.Playlist;
@SuppressWarnings("serial")
public class PlaylistListModel extends SortedListModel<Playlist> {
RobonoboController control;
Set<Long> plIds = new HashSet<Long>();
Map<Long, Integer> unseenMap = new HashMap<Long, Integer>();
Map<Long, Boolean> hasCommentMap = new HashMap<Long, Boolean>();
Log log = LogFactory.getLog(getClass());
public PlaylistListModel(RobonoboController control) {
this.control = control;
}
@Override
public Object getElementAt(int index) {
String title = get(index).getTitle();
return title;
}
public Playlist getPlaylistAt(int index) {
return get(index);
}
public int getPlaylistIndex(Playlist p) {
return list.indexOf(p);
}
public int numUnseen(int index) {
Playlist p = get(index);
Long plId = p.getPlaylistId();
Integer result = unseenMap.get(plId);
if(result == null)
return 0;
return result;
}
public boolean hasComments(long plId) {
Boolean result = hasCommentMap.get(plId);
if(result == null)
return false;
return result;
}
/**
* @return whether the value changed or not
*/
public void setHasComments(long plId, boolean has) {
Boolean had = hasCommentMap.get(plId);
if(had == null)
had = false;
hasCommentMap.put(plId, has);
boolean changed = (has != had);
if(changed)
fireContentsChanged(this, 0, getSize()-1);
}
public void markAllAsSeen(int index) {
Playlist p = get(index);
Long plId = p.getPlaylistId();
unseenMap.put(plId, 0);
}
@Override
public void insertSorted(Playlist p) {
long plId = p.getPlaylistId();
if(plIds.contains(plId)) {
reInsertSorted(p);
return;
}
plIds.add(plId);
int unseen = control.numUnseenTracks(p);
unseenMap.put(plId, unseen);
super.insertSorted(p);
}
@Override
public void remove(Playlist p) {
long plId = p.getPlaylistId();
plIds.remove(plId);
unseenMap.remove(plId);
hasCommentMap.remove(plId);
super.remove(p);
}
private void reInsertSorted(Playlist p) {
super.remove(p);
super.insertSorted(p);
}
public boolean hasPlaylist(long plId) {
return plIds.contains(plId);
}
}