4b400a3c8840999117622dade934069dcb6c645a
[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[] { "PDB Field", "Show in search summary" };
54       break;
55     case STRUCTURE_CHOOSER:
56       columnNames = new String[] { "PDB Field", "Show in structure summary" };
57       break;
58     case PREFERENCES:
59       columnNames = new String[] { "PDB Field", "Show in search summary",
60           "Show in structure summary" };
61       break;
62     default:
63       break;
64     }
65
66     Object[][] data = new Object[PDBDocField.values().length - 1][3];
67     int x = 0;
68     for (PDBDocField field : PDBDocField.values())
69     {
70       if (field.getName().equalsIgnoreCase("all"))
71       {
72         continue;
73       }
74
75       switch (source)
76       {
77       case SEARCH_SUMMARY:
78         data[x++] = new Object[] { field.getName(),
79             searchSummaryFields.contains(field) };
80         break;
81       case STRUCTURE_CHOOSER:
82         data[x++] = new Object[] { field.getName(),
83             structureSummaryFields.contains(field) };
84         break;
85       case PREFERENCES:
86         data[x++] = new Object[] { field.getName(),
87             searchSummaryFields.contains(field),
88             structureSummaryFields.contains(field) };
89         break;
90       default:
91         break;
92       }
93       map.put(field.getName(), field);
94     }
95
96     PDBFieldTableModel model = new PDBFieldTableModel(columnNames, data);
97     tbl_pdbDocFieldConfig.setModel(model);
98   }
99
100   public static Collection<PDBDocField> getSearchSummaryFields()
101   {
102     return searchSummaryFields;
103   }
104
105   public static void setSearchSummaryFields(
106           Collection<PDBDocField> searchSummaryFields)
107   {
108     PDBDocFieldPreferences.searchSummaryFields = searchSummaryFields;
109   }
110
111   public static Collection<PDBDocField> getStructureSummaryFields()
112   {
113     return structureSummaryFields;
114   }
115
116   public static void setStructureSummaryFields(
117           Collection<PDBDocField> structureSummaryFields)
118   {
119     PDBDocFieldPreferences.structureSummaryFields = structureSummaryFields;
120   }
121
122   class PDBFieldTableModel extends AbstractTableModel
123   {
124
125     public PDBFieldTableModel(String[] columnNames, Object[][] data)
126     {
127       this.data = data;
128       this.columnNames = columnNames;
129     }
130
131     private Object[][] data;
132
133     private String[] columnNames;
134
135     public int getColumnCount()
136     {
137       return columnNames.length;
138     }
139
140     public int getRowCount()
141     {
142       return data.length;
143     }
144
145     public String getColumnName(int col)
146     {
147       return columnNames[col];
148     }
149
150     public Object getValueAt(int row, int col)
151     {
152       return data[row][col];
153     }
154
155     /*
156      * JTable uses this method to determine the default renderer/ editor for
157      * each cell. If we didn't implement this method, then the last column would
158      * contain text ("true"/"false"), rather than a check box.
159      */
160     public Class getColumnClass(int c)
161     {
162       return getValueAt(0, c).getClass();
163     }
164
165     /*
166      * Don't need to implement this method unless your table's editable.
167      */
168     public boolean isCellEditable(int row, int col)
169     {
170       // Note that the data/cell address is constant,
171       // no matter where the cell appears onscreen.
172       // !isPDBID(row, col) ensures the PDB_Id cell is never editable as it
173       // serves as a unique id for each row.
174       return (col == 1 || col == 2) && !isPDBID(row, col);
175
176     }
177
178     /**
179      * Determines whether the data in a given cell is a PDB ID.
180      * 
181      * @param row
182      * @param col
183      * @return
184      */
185
186     public boolean isPDBID(int row, int col)
187     {
188       boolean matched = false;
189       String name = getValueAt(row, 0).toString();
190       PDBDocField pdbField = map.get(name);
191       if (pdbField == PDBDocField.PDB_ID)
192       {
193         matched = true;
194       }
195       return matched;
196     }
197
198     /*
199      * Don't need to implement this method unless your table's data can change.
200      */
201     public void setValueAt(Object value, int row, int col)
202     {
203       data[row][col] = value;
204       fireTableCellUpdated(row, col);
205
206       String name = getValueAt(row, 0).toString();
207       boolean selected = ((Boolean) value).booleanValue();
208
209       PDBDocField pdbField = map.get(name);
210
211       if (currentSource == PreferenceSource.SEARCH_SUMMARY)
212       {
213         updatePrefs(searchSummaryFields, pdbField, selected);
214       }
215       else if (currentSource == PreferenceSource.STRUCTURE_CHOOSER)
216       {
217         updatePrefs(structureSummaryFields, pdbField, selected);
218       }
219       else if (currentSource == PreferenceSource.PREFERENCES)
220       {
221         if (col == 1)
222         {
223           updatePrefs(searchSummaryFields, pdbField, selected);
224         }
225         else if (col == 2)
226         {
227           updatePrefs(structureSummaryFields, pdbField, selected);
228         }
229       }
230     }
231
232     private void updatePrefs(Collection<PDBDocField> prefConfig,
233             PDBDocField pdbField, boolean selected)
234     {
235       if (prefConfig.contains(pdbField) && !selected)
236       {
237         prefConfig.remove(pdbField);
238       }
239
240       if (!prefConfig.contains(pdbField) && selected)
241       {
242         prefConfig.add(pdbField);
243       }
244     }
245
246   }
247 }