Merge develop to Release_2_8_3_Branch
[jalview.git] / src / jalview / jbgui / PDBDocFieldPreferences.java
diff --git a/src/jalview/jbgui/PDBDocFieldPreferences.java b/src/jalview/jbgui/PDBDocFieldPreferences.java
new file mode 100644 (file)
index 0000000..2021d0b
--- /dev/null
@@ -0,0 +1,228 @@
+package jalview.jbgui;
+
+import jalview.ws.dbsources.PDBRestClient.PDBDocField;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+
+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<String, PDBDocField> map = new HashMap<String, PDBDocField>();
+
+  private static Collection<PDBDocField> searchSummaryFields = new HashSet<PDBDocField>();
+
+  private static Collection<PDBDocField> structureSummaryFields = new HashSet<PDBDocField>();
+
+  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 Feild", "Show in search summary" };
+      break;
+    case STRUCTURE_CHOOSER:
+      columnNames = new String[]
+      { "PDB Feild", "Show in structure summary" };
+      break;
+    case PREFERENCES:
+      columnNames = new String[]
+      { "PDB Feild", "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<PDBDocField> getSearchSummaryFields()
+  {
+    return searchSummaryFields;
+  }
+
+  public static void setSearchSummaryFields(
+          Collection<PDBDocField> searchSummaryFields)
+  {
+    PDBDocFieldPreferences.searchSummaryFields = searchSummaryFields;
+  }
+
+  public static Collection<PDBDocField> getStructureSummaryFields()
+  {
+    return structureSummaryFields;
+  }
+
+  public static void setStructureSummaryFields(
+          Collection<PDBDocField> 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.
+      return col == 1 || col == 2;
+
+    }
+
+    /*
+     * 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<PDBDocField> prefConfig,
+            PDBDocField pdbField,
+            boolean selected)
+    {
+      if (prefConfig.contains(pdbField) && !selected)
+      {
+        prefConfig.remove(pdbField);
+      }
+
+      if (!prefConfig.contains(pdbField) && selected)
+      {
+        prefConfig.add(pdbField);
+      }
+    }
+
+  }
+}