package net.filebot.ui.filter; import static net.filebot.MediaTypes.*; import static net.filebot.media.XattrMetaInfo.*; import static net.filebot.util.FileUtilities.*; import java.awt.Color; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CancellationException; import javax.swing.BorderFactory; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; import net.filebot.util.ui.LoadingOverlayPane; import net.filebot.web.Episode; import net.filebot.web.Movie; import net.filebot.web.SeriesInfo; import net.miginfocom.swing.MigLayout; class AttributeTool extends Tool<TableModel> { private JTable table = new JTable(new FileAttributesTableModel()); public AttributeTool() { super("Attributes"); table.setAutoCreateRowSorter(true); table.setAutoCreateColumnsFromModel(true); table.setFillsViewportHeight(true); table.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); table.setBackground(Color.white); table.setGridColor(new Color(0xEEEEEE)); table.setRowHeight(25); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setBorder(BorderFactory.createEmptyBorder()); setLayout(new MigLayout("insets 0, fill")); add(new LoadingOverlayPane(scrollPane, this), "grow"); } @Override protected TableModel createModelInBackground(List<File> root) { FileAttributesTableModel model = new FileAttributesTableModel(); if (root.isEmpty()) { return model; } List<File> files = listFiles(root, filter(VIDEO_FILES, SUBTITLE_FILES), HUMAN_NAME_ORDER); for (File file : files) { Object metaObject = xattr.getMetaInfo(file); String originalName = xattr.getOriginalName(file); if (metaObject instanceof Episode) { SeriesInfo seriesInfo = ((Episode) metaObject).getSeriesInfo(); if (seriesInfo != null) { model.addRow(String.format("%s::%d", seriesInfo.getDatabase(), seriesInfo.getId()), metaObject, originalName, file); } } else if (metaObject instanceof Movie) { Movie movie = (Movie) metaObject; if (movie.getTmdbId() > 0) { model.addRow(String.format("%s::%d", "TheMovieDB", movie.getTmdbId()), metaObject, originalName, file); } else if (movie.getImdbId() > 0) { model.addRow(String.format("%s::%d", "OMDb", movie.getImdbId()), metaObject, originalName, file); } } if (Thread.interrupted()) { throw new CancellationException(); } } return model; } @Override protected void setModel(TableModel model) { table.setModel(model); } private static class FileAttributesTableModel extends AbstractTableModel { private final List<Object[]> rows = new ArrayList<Object[]>(); public boolean addRow(Object... row) { if (row.length != getColumnCount()) return false; return rows.add(row); } @Override public int getColumnCount() { return 4; } @Override public String getColumnName(int column) { switch (column) { case 0: return "Meta ID"; case 1: return "Meta Attributes"; case 2: return "Original Name"; case 3: return "File Path"; } return null; } @Override public int getRowCount() { return rows.size(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { return rows.get(rowIndex)[columnIndex]; } } }