JAL-1667 updated the collection type for searchSummaryFields and structureSummaryFiel...
[jalview.git] / src / jalview / jbgui / PDBDocFieldPreferences.java
1 package jalview.jbgui;
2
3 import jalview.ws.dbsources.PDBRestClient.PDBDocField;
4
5 import java.util.Collection;
6 import java.util.HashMap;
7 import java.util.LinkedHashSet;
8
9 import javax.swing.JScrollPane;
10 import javax.swing.JTable;
11 import javax.swing.table.AbstractTableModel;
12
13 @SuppressWarnings("serial")
14 public class PDBDocFieldPreferences extends JScrollPane
15 {
16   protected JTable tbl_pdbDocFieldConfig = new JTable();
17
18   protected JScrollPane scrl_pdbDocFieldConfig = new JScrollPane(
19           tbl_pdbDocFieldConfig);
20
21   private HashMap<String, PDBDocField> map = new HashMap<String, PDBDocField>();
22
23   private static Collection<PDBDocField> searchSummaryFields = new LinkedHashSet<PDBDocField>();
24
25   private static Collection<PDBDocField> structureSummaryFields = new LinkedHashSet<PDBDocField>();
26
27   public enum PreferenceSource
28   {
29     SEARCH_SUMMARY, STRUCTURE_CHOOSER, PREFERENCES;
30   }
31
32   private PreferenceSource currentSource;
33
34   static
35   {
36     searchSummaryFields.add(PDBDocField.PDB_ID);
37     searchSummaryFields.add(PDBDocField.TITLE);
38
39     structureSummaryFields.add(PDBDocField.PDB_ID);
40     structureSummaryFields.add(PDBDocField.TITLE);
41   }
42
43   public PDBDocFieldPreferences(PreferenceSource source)
44   {
45     tbl_pdbDocFieldConfig.setAutoCreateRowSorter(true);
46     this.getViewport().add(tbl_pdbDocFieldConfig);
47     this.currentSource = source;
48
49     String[] columnNames = null;
50     switch (source)
51     {
52     case SEARCH_SUMMARY:
53       columnNames = new String[]
54       { "PDB Feild", "Show in search summary" };
55       break;
56     case STRUCTURE_CHOOSER:
57       columnNames = new String[]
58       { "PDB Feild", "Show in structure summary" };
59       break;
60     case PREFERENCES:
61       columnNames = new String[]
62       { "PDB Feild", "Show in search summary", "Show in structure summary" };
63       break;
64     default:
65       break;
66     }
67
68     Object[][] data = new Object[PDBDocField.values().length - 1][3];
69     int x = 0;
70     for (PDBDocField field : PDBDocField.values())
71     {
72       if (field.getName().equalsIgnoreCase("all"))
73       {
74         continue;
75       }
76
77       switch (source)
78       {
79       case SEARCH_SUMMARY:
80         data[x++] = new Object[]
81         { field.getName(), searchSummaryFields.contains(field) };
82         break;
83       case STRUCTURE_CHOOSER:
84         data[x++] = new Object[]
85         { field.getName(), structureSummaryFields.contains(field) };
86         break;
87       case PREFERENCES:
88         data[x++] = new Object[]
89         { field.getName(), searchSummaryFields.contains(field),
90             structureSummaryFields.contains(field) };
91         break;
92       default:
93         break;
94       }
95       map.put(field.getName(), field);
96     }
97
98     PDBFieldTableModel model = new PDBFieldTableModel(columnNames, data);
99     tbl_pdbDocFieldConfig.setModel(model);
100   }
101
102   public static Collection<PDBDocField> getSearchSummaryFields()
103   {
104     return searchSummaryFields;
105   }
106
107   public static void setSearchSummaryFields(
108           Collection<PDBDocField> searchSummaryFields)
109   {
110     PDBDocFieldPreferences.searchSummaryFields = searchSummaryFields;
111   }
112
113   public static Collection<PDBDocField> getStructureSummaryFields()
114   {
115     return structureSummaryFields;
116   }
117
118   public static void setStructureSummaryFields(
119           Collection<PDBDocField> structureSummaryFields)
120   {
121     PDBDocFieldPreferences.structureSummaryFields = structureSummaryFields;
122   }
123
124   class PDBFieldTableModel extends AbstractTableModel
125   {
126
127     public PDBFieldTableModel(String[] columnNames, Object[][] data)
128     {
129       this.data = data;
130       this.columnNames = columnNames;
131     }
132
133     private Object[][] data;
134
135     private String[] columnNames;
136
137     public int getColumnCount()
138     {
139       return columnNames.length;
140     }
141
142     public int getRowCount()
143     {
144       return data.length;
145     }
146
147     public String getColumnName(int col)
148     {
149       return columnNames[col];
150     }
151
152     public Object getValueAt(int row, int col)
153     {
154       return data[row][col];
155     }
156
157     /*
158      * JTable uses this method to determine the default renderer/ editor for
159      * each cell. If we didn't implement this method, then the last column would
160      * contain text ("true"/"false"), rather than a check box.
161      */
162     public Class getColumnClass(int c)
163     {
164       return getValueAt(0, c).getClass();
165     }
166
167     /*
168      * Don't need to implement this method unless your table's editable.
169      */
170     public boolean isCellEditable(int row, int col)
171     {
172       // Note that the data/cell address is constant,
173       // no matter where the cell appears onscreen.
174       return col == 1 || col == 2;
175
176     }
177
178     /*
179      * Don't need to implement this method unless your table's data can change.
180      */
181     public void setValueAt(Object value, int row, int col)
182     {
183       data[row][col] = value;
184       fireTableCellUpdated(row, col);
185
186       String name = getValueAt(row, 0).toString();
187       boolean selected = ((Boolean) value).booleanValue();
188
189       PDBDocField pdbField = map.get(name);
190
191       if (currentSource == PreferenceSource.SEARCH_SUMMARY)
192       {
193         updatePrefs(searchSummaryFields, pdbField, selected);
194       }
195       else if (currentSource == PreferenceSource.STRUCTURE_CHOOSER)
196       {
197         updatePrefs(structureSummaryFields, pdbField, selected);
198       }
199       else if (currentSource == PreferenceSource.PREFERENCES)
200       {
201         if (col == 1)
202         {
203           updatePrefs(searchSummaryFields, pdbField, selected);
204         }
205         else if (col == 2)
206         {
207           updatePrefs(structureSummaryFields, pdbField, selected);
208         }
209       }
210     }
211
212     private void updatePrefs(Collection<PDBDocField> prefConfig,
213             PDBDocField pdbField,
214             boolean selected)
215     {
216       if (prefConfig.contains(pdbField) && !selected)
217       {
218         prefConfig.remove(pdbField);
219       }
220
221       if (!prefConfig.contains(pdbField) && selected)
222       {
223         prefConfig.add(pdbField);
224       }
225     }
226
227   }
228 }