package jalview.jbgui; import jalview.ws.dbsources.PDBRestClient.PDBDocField; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashSet; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; @SuppressWarnings("serial") public class PDBDocFieldPreferences extends JScrollPane { protected JTable tbl_pdbDocFieldConfig = new JTable(); protected JScrollPane scrl_pdbDocFieldConfig = new JScrollPane( tbl_pdbDocFieldConfig); private HashMap map = new HashMap(); private static Collection searchSummaryFields = new LinkedHashSet(); private static Collection structureSummaryFields = new LinkedHashSet(); public enum PreferenceSource { SEARCH_SUMMARY, STRUCTURE_CHOOSER, PREFERENCES; } private PreferenceSource currentSource; static { searchSummaryFields.add(PDBDocField.PDB_ID); searchSummaryFields.add(PDBDocField.TITLE); structureSummaryFields.add(PDBDocField.PDB_ID); structureSummaryFields.add(PDBDocField.TITLE); } public PDBDocFieldPreferences(PreferenceSource source) { tbl_pdbDocFieldConfig.setAutoCreateRowSorter(true); this.getViewport().add(tbl_pdbDocFieldConfig); this.currentSource = source; String[] columnNames = null; switch (source) { case SEARCH_SUMMARY: columnNames = new String[] { "PDB Field", "Show in search summary" }; break; case STRUCTURE_CHOOSER: columnNames = new String[] { "PDB Field", "Show in structure summary" }; break; case PREFERENCES: columnNames = new String[] { "PDB Field", "Show in search summary", "Show in structure summary" }; break; default: break; } Object[][] data = new Object[PDBDocField.values().length - 1][3]; int x = 0; for (PDBDocField field : PDBDocField.values()) { if (field.getName().equalsIgnoreCase("all")) { continue; } switch (source) { case SEARCH_SUMMARY: data[x++] = new Object[] { field.getName(), searchSummaryFields.contains(field) }; break; case STRUCTURE_CHOOSER: data[x++] = new Object[] { field.getName(), structureSummaryFields.contains(field) }; break; case PREFERENCES: data[x++] = new Object[] { field.getName(), searchSummaryFields.contains(field), structureSummaryFields.contains(field) }; break; default: break; } map.put(field.getName(), field); } PDBFieldTableModel model = new PDBFieldTableModel(columnNames, data); tbl_pdbDocFieldConfig.setModel(model); } public static Collection getSearchSummaryFields() { return searchSummaryFields; } public static void setSearchSummaryFields( Collection searchSummaryFields) { PDBDocFieldPreferences.searchSummaryFields = searchSummaryFields; } public static Collection getStructureSummaryFields() { return structureSummaryFields; } public static void setStructureSummaryFields( Collection structureSummaryFields) { PDBDocFieldPreferences.structureSummaryFields = structureSummaryFields; } class PDBFieldTableModel extends AbstractTableModel { public PDBFieldTableModel(String[] columnNames, Object[][] data) { this.data = data; this.columnNames = columnNames; } private Object[][] data; private String[] columnNames; public int getColumnCount() { return columnNames.length; } public int getRowCount() { return data.length; } public String getColumnName(int col) { return columnNames[col]; } public Object getValueAt(int row, int col) { return data[row][col]; } /* * JTable uses this method to determine the default renderer/ editor for * each cell. If we didn't implement this method, then the last column would * contain text ("true"/"false"), rather than a check box. */ public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } /* * Don't need to implement this method unless your table's editable. */ public boolean isCellEditable(int row, int col) { // Note that the data/cell address is constant, // no matter where the cell appears onscreen. // !isPDBID(row, col) ensures the PDB_Id cell is never editable as it // serves as a unique id for each row. return (col == 1 || col == 2) && !isPDBID(row, col); } /** * Determines whether the data in a given cell is a PDB ID. * * @param row * @param col * @return */ public boolean isPDBID(int row, int col) { boolean matched = false; String name = getValueAt(row, 0).toString(); PDBDocField pdbField = map.get(name); if (pdbField == PDBDocField.PDB_ID) { matched = true; } return matched; } /* * Don't need to implement this method unless your table's data can change. */ public void setValueAt(Object value, int row, int col) { data[row][col] = value; fireTableCellUpdated(row, col); String name = getValueAt(row, 0).toString(); boolean selected = ((Boolean) value).booleanValue(); PDBDocField pdbField = map.get(name); if (currentSource == PreferenceSource.SEARCH_SUMMARY) { updatePrefs(searchSummaryFields, pdbField, selected); } else if (currentSource == PreferenceSource.STRUCTURE_CHOOSER) { updatePrefs(structureSummaryFields, pdbField, selected); } else if (currentSource == PreferenceSource.PREFERENCES) { if (col == 1) { updatePrefs(searchSummaryFields, pdbField, selected); } else if (col == 2) { updatePrefs(structureSummaryFields, pdbField, selected); } } } private void updatePrefs(Collection prefConfig, PDBDocField pdbField, boolean selected) { if (prefConfig.contains(pdbField) && !selected) { prefConfig.remove(pdbField); } if (!prefConfig.contains(pdbField) && selected) { prefConfig.add(pdbField); } } } }