/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package moppydesk.playlist;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.AbstractTableModel;
/**
*
* @author AJ (MrSolidSnake745)
* Class that represents a playlist
*/
public class MoppyPlaylist extends AbstractTableModel {
private List<MoppySong> playlist = new ArrayList<>();
private int currentIndex = -1;
private static final int COL_COUNT = 3;
private static final int INDICATOR_INDEX = 0;
private static final int TITLE_INDEX = 2;
private static final int PLAYED_INDEX = 1;
public MoppyPlaylist() {
}
public void addSong(File file) {playlist.add(new MoppySong(file)); fireTableDataChanged();}
public void currentSongFinished() {if(currentIndex != -1) {playlist.get(currentIndex).setPlayed(true);} fireTableDataChanged();}
public void currentSongReset() {if(currentIndex != -1) {playlist.get(currentIndex).setPlayed(false);} fireTableDataChanged();}
public Boolean isFinished() {
if(isEmpty()) return true;
for (MoppySong s: playlist) {if(!(s.getPlayed())) return false;}
return true;
}
public Boolean isEmpty() {return playlist.isEmpty();}
public Boolean isFirstSong() {return currentIndex == 0;}
public Boolean isLastSong() {return currentIndex == playlist.size() - 1;}
public int getIndex() {return currentIndex;}
public String getCurrentSongName() {return playlist.get(currentIndex).getName();}
public Boolean getCurrentSongPlayed() {return playlist.get(currentIndex).getPlayed();}
public void randomize() {Collections.shuffle(playlist); reset();}
public File getNextSong() {
if(!isLastSong()) {
currentSongFinished();
return playlist.get(++currentIndex).getFile();
}
return null;
}
public File getPreviousSong() {
if(!isFirstSong()) {
--currentIndex; currentSongReset();
return playlist.get(currentIndex).getFile();
}
return null;
}
public void reset() {
currentIndex = -1;
for (MoppySong i: playlist) {i.setPlayed(false);}
fireTableDataChanged();
}
public void clear() {
currentIndex = -1;
playlist.clear();
fireTableDataChanged();
}
public boolean savePlaylistFile(File input) {
try {
FileWriter fr = new FileWriter(input);
BufferedWriter br = new BufferedWriter(fr);
for (MoppySong i: playlist) {
br.write(i.getName() + ";" + i.getFile().getPath());
br.newLine();
}
br.close();
return true;
} catch (IOException ex) {
Logger.getLogger(MoppyPlaylist.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
}
public boolean loadPlaylistFile(File input) {
try {
FileReader fr = new FileReader(input);
BufferedReader br = new BufferedReader(fr);
List<MoppySong> newpl = new ArrayList<>();
String s = br.readLine();
while (s != null) {
String[] line = s.split(";");
if(line.length == 2) { newpl.add(new MoppySong(line[0], line[1])); }
s = br.readLine();
}
br.close();
playlist = newpl;
fireTableDataChanged();
return true;
} catch (IOException ex) {
Logger.getLogger(MoppyPlaylist.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
}
// <editor-fold defaultstate="collapsed" desc="TableModel Implementation">
@Override
public int getRowCount() { return playlist.size(); }
@Override
public int getColumnCount() { return COL_COUNT; }
@Override
public boolean isCellEditable(int row, int column) { return false; } //Setting all cells to read only
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
MoppySong song = playlist.get(rowIndex);
switch (columnIndex) {
case INDICATOR_INDEX:
if(rowIndex == currentIndex) return " ► ";
return "";
case TITLE_INDEX:
return song.getName();
case PLAYED_INDEX:
return song.getPlayed();
default:
return new Object();
}
}
@Override
public Class getColumnClass(int column) {
switch (column) {
case INDICATOR_INDEX:
return String.class;
case TITLE_INDEX:
return String.class;
case PLAYED_INDEX:
return Boolean.class;
default:
return Object.class;
}
}
@Override
public String getColumnName(int column) {
switch (column) {
case INDICATOR_INDEX:
return "";
case TITLE_INDEX:
return "Name";
case PLAYED_INDEX:
return "Played";
default:
return "";
}
}
// </editor-fold>
}