house keeping
[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 Field", "Show in search summary" };
55       break;
56     case STRUCTURE_CHOOSER:
57       columnNames = new String[]
58       { "PDB Field", "Show in structure summary" };
59       break;
60     case PREFERENCES:
61       columnNames = new String[]
62       { "PDB Field", "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       // !isPDBID(row, col) ensures the PDB_Id cell is never editable as it
175       // serves as a unique id for each row.
176       return (col == 1 || col == 2) && !isPDBID(row, col);
177
178     }
179
180     /**
181      * Determines whether the data in a given cell is a PDB ID.
182      * 
183      * @param row
184      * @param col
185      * @return
186      */
187
188     public boolean isPDBID(int row, int col)
189     {
190       boolean matched = false;
191       String name = getValueAt(row, 0).toString();
192       PDBDocField pdbField = map.get(name);
193       if (pdbField == PDBDocField.PDB_ID)
194       {
195         matched = true;
196       }
197       return matched;
198     }
199
200     /*
201      * Don't need to implement this method unless your table's data can change.
202      */
203     public void setValueAt(Object value, int row, int col)
204     {
205       data[row][col] = value;
206       fireTableCellUpdated(row, col);
207
208       String name = getValueAt(row, 0).toString();
209       boolean selected = ((Boolean) value).booleanValue();
210
211       PDBDocField pdbField = map.get(name);
212
213       if (currentSource == PreferenceSource.SEARCH_SUMMARY)
214       {
215         updatePrefs(searchSummaryFields, pdbField, selected);
216       }
217       else if (currentSource == PreferenceSource.STRUCTURE_CHOOSER)
218       {
219         updatePrefs(structureSummaryFields, pdbField, selected);
220       }
221       else if (currentSource == PreferenceSource.PREFERENCES)
222       {
223         if (col == 1)
224         {
225           updatePrefs(searchSummaryFields, pdbField, selected);
226         }
227         else if (col == 2)
228         {
229           updatePrefs(structureSummaryFields, pdbField, selected);
230         }
231       }
232     }
233
234     private void updatePrefs(Collection<PDBDocField> prefConfig,
235             PDBDocField pdbField,
236             boolean selected)
237     {
238       if (prefConfig.contains(pdbField) && !selected)
239       {
240         prefConfig.remove(pdbField);
241       }
242
243       if (!prefConfig.contains(pdbField) && selected)
244       {
245         prefConfig.add(pdbField);
246       }
247     }
248
249   }
250 }