package net.filebot.ui.subtitle.upload; import static javax.swing.SwingUtilities.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.util.Collection; import java.util.EnumSet; import javax.swing.table.AbstractTableModel; import net.filebot.Language; import net.filebot.web.Movie; class SubtitleMappingTableModel extends AbstractTableModel { private SubtitleMapping[] data; private Runnable onCheckPending; public SubtitleMappingTableModel() { this.data = new SubtitleMapping[0]; } public SubtitleMappingTableModel(Collection<SubtitleMapping> rows) { this.data = rows.toArray(new SubtitleMapping[rows.size()]); for (int i = 0; i < data.length; i++) { data[i].addPropertyChangeListener(new UpdateRowListener(i)); } } public SubtitleMappingTableModel onCheckPending(Runnable onCheckPending) { this.onCheckPending = onCheckPending; return this; } public SubtitleMapping[] getData() { return data.clone(); } @Override public int getColumnCount() { return 5; } @Override public String getColumnName(int column) { switch (column) { case 0: return "Movie / Series"; case 1: return "Video File"; case 2: return "Subtitle File"; case 3: return "Language"; case 4: return "Status"; } return null; } @Override public int getRowCount() { return data.length; } @Override public Object getValueAt(int row, int column) { switch (column) { case 0: return data[row].getIdentity(); case 1: return data[row].getVideo(); case 2: return data[row].getSubtitle(); case 3: return data[row].getLanguage(); case 4: return data[row].getStatus(); } return null; } @Override public void setValueAt(Object value, int row, int column) { if (getColumnClass(column) == Language.class && value instanceof Language) { data[row].setLanguage((Language) value); if (data[row].getStatus() == Status.IdentificationRequired) { data[row].setState(Status.CheckPending); } } } @Override public boolean isCellEditable(int row, int column) { return (column == 0 || column == 1 || column == 3) && EnumSet.of(Status.IdentificationRequired, Status.UploadReady, Status.IllegalInput).contains(data[row].getStatus()); } @Override public Class<?> getColumnClass(int column) { switch (column) { case 0: return Movie.class; case 1: return File.class; case 2: return File.class; case 3: return Language.class; case 4: return Status.class; } return null; } private class UpdateRowListener implements PropertyChangeListener { private final int index; public UpdateRowListener(int index) { this.index = index; } @Override public void propertyChange(PropertyChangeEvent evt) { // update state and subtitle options fireTableRowsUpdated(index, index); if (evt.getNewValue().equals(Status.CheckPending)) { invokeLater(onCheckPending); } } } }