JAL-1270 more fix for failing Functional test
[jalview.git] / src / jalview / jbgui / GPDBSearchPanel.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
3  * Copyright (C) 2014 The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21
22 package jalview.jbgui;
23
24 import jalview.gui.Desktop;
25 import jalview.gui.JvSwingUtils;
26 import jalview.jbgui.PDBDocFieldPreferences.PreferenceSource;
27 import jalview.util.MessageManager;
28 import jalview.ws.dbsources.PDBRestClient.PDBDocField;
29
30 import java.awt.BorderLayout;
31 import java.awt.CardLayout;
32 import java.awt.Dimension;
33 import java.awt.event.ActionEvent;
34 import java.awt.event.ActionListener;
35 import java.awt.event.KeyAdapter;
36 import java.awt.event.KeyEvent;
37 import java.awt.event.MouseAdapter;
38 import java.awt.event.MouseEvent;
39 import java.util.Arrays;
40
41 import javax.swing.ImageIcon;
42 import javax.swing.JButton;
43 import javax.swing.JComboBox;
44 import javax.swing.JFrame;
45 import javax.swing.JInternalFrame;
46 import javax.swing.JLabel;
47 import javax.swing.JPanel;
48 import javax.swing.JScrollPane;
49 import javax.swing.JTabbedPane;
50 import javax.swing.JTable;
51 import javax.swing.JTextField;
52 import javax.swing.event.ChangeEvent;
53 import javax.swing.event.ChangeListener;
54 import javax.swing.event.DocumentEvent;
55 import javax.swing.event.DocumentListener;
56
57 /**
58  * GUI layout for PDB Fetch Panel
59  * 
60  * @author tcnofoegbu
61  *
62  */
63 @SuppressWarnings("serial")
64 public abstract class GPDBSearchPanel extends JPanel
65 {
66   protected String frameTitle = MessageManager
67           .getString("label.pdb_sequence_getcher");
68
69   protected JInternalFrame mainFrame = new JInternalFrame(frameTitle);
70
71   protected JComboBox<PDBDocField> cmb_searchTarget = new JComboBox<PDBDocField>();
72
73   protected JButton btn_ok = new JButton();
74
75   protected JButton btn_back = new JButton();
76
77   protected JButton btn_cancel = new JButton();
78
79   protected JTextField txt_search = new JTextField(20);
80
81   protected JTable tbl_summary = new JTable()
82   {
83     @Override
84     public String getToolTipText(MouseEvent evt)
85     {
86       String toolTipText = null;
87       java.awt.Point pnt = evt.getPoint();
88       int rowIndex = rowAtPoint(pnt);
89       int colIndex = columnAtPoint(pnt);
90
91       try
92       {
93         if (getValueAt(rowIndex, colIndex) == null)
94         {
95           return null;
96         }
97         toolTipText = getValueAt(rowIndex, colIndex).toString();
98
99       } catch (Exception e)
100       {
101         e.printStackTrace();
102       }
103       toolTipText = (toolTipText == null ? null
104               : (toolTipText.length() > 500 ? JvSwingUtils.wrapTooltip(
105                       true, toolTipText.subSequence(0, 500) + "...")
106                       : JvSwingUtils.wrapTooltip(true, toolTipText)));
107
108       return toolTipText;
109     }
110   };
111
112   protected StringBuilder errorWarning = new StringBuilder();
113
114   protected JScrollPane scrl_searchResult = new JScrollPane(tbl_summary);
115
116   protected ImageIcon warningImage = new ImageIcon(getClass().getResource(
117           "/images/warning.gif"));
118
119   protected ImageIcon loadingImage = new ImageIcon(getClass().getResource(
120           "/images/loading.gif"));
121
122   protected JLabel lbl_warning = new JLabel(warningImage);
123
124   protected JLabel lbl_loading = new JLabel(loadingImage);
125
126   private JTabbedPane tabbedPane = new JTabbedPane();
127
128   private PDBDocFieldPreferences pdbDocFieldPrefs = new PDBDocFieldPreferences(
129           PreferenceSource.SEARCH_SUMMARY);
130
131   private JPanel pnl_actions = new JPanel();
132
133   private JPanel pnl_results = new JPanel(new CardLayout());
134
135   private JPanel pnl_inputs = new JPanel();
136
137   private BorderLayout mainLayout = new BorderLayout();
138
139   protected PDBDocField[] previousWantedFields;
140
141   public GPDBSearchPanel()
142   {
143     try
144     {
145       jbInit();
146       mainFrame.invalidate();
147       mainFrame.pack();
148     } catch (Exception e)
149     {
150       e.printStackTrace();
151     }
152   }
153
154   /**
155    * Initializes the GUI default properties
156    * 
157    * @throws Exception
158    */
159   private void jbInit() throws Exception
160   {
161     lbl_warning.setVisible(false);
162     lbl_warning.setFont(new java.awt.Font("Verdana", 0, 12));
163     lbl_loading.setVisible(false);
164     lbl_loading.setFont(new java.awt.Font("Verdana", 0, 12));
165
166     tbl_summary.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
167     tbl_summary.setAutoCreateRowSorter(true);
168     tbl_summary.getTableHeader().setReorderingAllowed(false);
169     tbl_summary.addMouseListener(new MouseAdapter()
170     {
171       @Override
172       public void mouseClicked(MouseEvent e)
173       {
174         validateSelection();
175       }
176
177       @Override
178       public void mouseReleased(MouseEvent e)
179       {
180         validateSelection();
181       }
182     });
183     tbl_summary.addKeyListener(new KeyAdapter()
184     {
185       @Override
186       public void keyPressed(KeyEvent evt)
187       {
188         validateSelection();
189         switch (evt.getKeyCode())
190         {
191         case KeyEvent.VK_ESCAPE: // escape key
192           btn_back_ActionPerformed();
193           break;
194         case KeyEvent.VK_ENTER: // enter key
195           if (btn_ok.isEnabled())
196           {
197             btn_ok_ActionPerformed();
198           }
199           evt.consume();
200           break;
201         case KeyEvent.VK_TAB: // tab key
202           if (evt.isShiftDown())
203           {
204             tabbedPane.requestFocus();
205           }
206           else
207           {
208             btn_back.requestFocus();
209           }
210           evt.consume();
211           break;
212         default:
213           return;
214         }
215       }
216     });
217
218     btn_back.setFont(new java.awt.Font("Verdana", 0, 12));
219     btn_back.setText(MessageManager.getString("action.back"));
220     btn_back.addActionListener(new java.awt.event.ActionListener()
221     {
222       @Override
223       public void actionPerformed(ActionEvent e)
224       {
225         btn_back_ActionPerformed();
226       }
227     });
228     btn_back.addKeyListener(new KeyAdapter()
229     {
230       @Override
231       public void keyPressed(KeyEvent evt)
232       {
233         if (evt.getKeyCode() == KeyEvent.VK_ENTER)
234         {
235           btn_back_ActionPerformed();
236         }
237       }
238     });
239
240     btn_ok.setEnabled(false);
241     btn_ok.setFont(new java.awt.Font("Verdana", 0, 12));
242     btn_ok.setText(MessageManager.getString("action.ok"));
243     btn_ok.addActionListener(new java.awt.event.ActionListener()
244     {
245       @Override
246       public void actionPerformed(ActionEvent e)
247       {
248         btn_ok_ActionPerformed();
249       }
250     });
251     btn_ok.addKeyListener(new KeyAdapter()
252     {
253       @Override
254       public void keyPressed(KeyEvent evt)
255       {
256         if (evt.getKeyCode() == KeyEvent.VK_ENTER)
257         {
258           btn_ok_ActionPerformed();
259         }
260       }
261     });
262
263     btn_cancel.setFont(new java.awt.Font("Verdana", 0, 12));
264     btn_cancel.setText(MessageManager.getString("action.cancel"));
265     btn_cancel.addActionListener(new java.awt.event.ActionListener()
266     {
267       @Override
268       public void actionPerformed(ActionEvent e)
269       {
270         btn_cancel_ActionPerformed();
271       }
272     });
273     btn_cancel.addKeyListener(new KeyAdapter()
274     {
275       @Override
276       public void keyPressed(KeyEvent evt)
277       {
278         if (evt.getKeyCode() == KeyEvent.VK_ENTER)
279         {
280           btn_cancel_ActionPerformed();
281         }
282       }
283     });
284
285     scrl_searchResult.setPreferredSize(new Dimension(500, 300));
286     scrl_searchResult
287             .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
288
289     cmb_searchTarget.setFont(new java.awt.Font("Verdana", 0, 12));
290     cmb_searchTarget.addActionListener(new ActionListener()
291     {
292       @Override
293       public void actionPerformed(ActionEvent e)
294       {
295         String tooltipText;
296         if ("all".equalsIgnoreCase(getCmbSearchTarget().getSelectedItem()
297                 .toString()))
298         {
299           tooltipText = MessageManager.getString("label.search_all");
300         }
301         else if ("pdb id".equalsIgnoreCase(getCmbSearchTarget()
302                 .getSelectedItem().toString()))
303         {
304           tooltipText = MessageManager
305                   .getString("label.separate_multiple_accession_ids");
306         }
307         else
308         {
309           tooltipText = MessageManager.formatMessage(
310                   "label.separate_multiple_query_values",
311                   new Object[] { getCmbSearchTarget().getSelectedItem()
312                           .toString() });
313         }
314         txt_search.setToolTipText(JvSwingUtils.wrapTooltip(true,
315                 tooltipText));
316         txt_search_ActionPerformed();
317       }
318     });
319
320     populateCmbSearchTargetOptions();
321
322     txt_search.setFont(new java.awt.Font("Verdana", 0, 12));
323
324     txt_search.addKeyListener(new KeyAdapter()
325     {
326       @Override
327       public void keyPressed(KeyEvent e)
328       {
329         if (e.getKeyCode() == KeyEvent.VK_ENTER)
330         {
331           if (txt_search.getText() == null
332                   || txt_search.getText().isEmpty())
333           {
334             return;
335           }
336           if ("pdb id".equalsIgnoreCase(getCmbSearchTarget()
337                   .getSelectedItem().toString()))
338           {
339             transferToSequenceFetcher(txt_search.getText());
340           }
341         }
342       }
343     });
344
345     txt_search.getDocument().addDocumentListener(new DocumentListener()
346     {
347       @Override
348       public void insertUpdate(DocumentEvent e)
349       {
350         txt_search_ActionPerformed();
351       }
352
353       @Override
354       public void removeUpdate(DocumentEvent e)
355       {
356         txt_search_ActionPerformed();
357       }
358
359       @Override
360       public void changedUpdate(DocumentEvent e)
361       {
362         txt_search_ActionPerformed();
363       }
364     });
365
366     final String searchTabTitle = MessageManager
367             .getString("label.search_result");
368     final String configureCols = MessageManager
369             .getString("label.configure_displayed_columns");
370     ChangeListener changeListener = new ChangeListener()
371     {
372       @Override
373       public void stateChanged(ChangeEvent changeEvent)
374       {
375         JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent
376                 .getSource();
377         int index = sourceTabbedPane.getSelectedIndex();
378
379         btn_back.setVisible(true);
380         btn_cancel.setVisible(true);
381         btn_ok.setVisible(true);
382         if (sourceTabbedPane.getTitleAt(index).equals(configureCols))
383         {
384           btn_back.setVisible(false);
385           btn_cancel.setVisible(false);
386           btn_ok.setVisible(false);
387           btn_back.setEnabled(false);
388           btn_cancel.setEnabled(false);
389           btn_ok.setEnabled(false);
390           previousWantedFields = PDBDocFieldPreferences
391                   .getSearchSummaryFields().toArray(new PDBDocField[0]);
392         }
393         if (sourceTabbedPane.getTitleAt(index).equals(searchTabTitle))
394         {
395           btn_back.setEnabled(true);
396           btn_cancel.setEnabled(true);
397           if (wantedFieldsUpdated())
398           {
399             txt_search_ActionPerformed();
400           }
401           else
402           {
403             validateSelection();
404           }
405         }
406       }
407     };
408     tabbedPane.addChangeListener(changeListener);
409     tabbedPane.setPreferredSize(new Dimension(500, 300));
410     tabbedPane.add(searchTabTitle, scrl_searchResult);
411     tabbedPane.add(configureCols, pdbDocFieldPrefs);
412
413     pnl_actions.add(btn_back);
414     pnl_actions.add(btn_ok);
415     pnl_actions.add(btn_cancel);
416
417     pnl_results.add(tabbedPane);
418     pnl_inputs.add(cmb_searchTarget);
419     pnl_inputs.add(txt_search);
420     pnl_inputs.add(lbl_loading);
421     pnl_inputs.add(lbl_warning);
422
423     this.setLayout(mainLayout);
424     this.add(pnl_inputs, java.awt.BorderLayout.NORTH);
425     this.add(pnl_results, java.awt.BorderLayout.CENTER);
426     this.add(pnl_actions, java.awt.BorderLayout.SOUTH);
427     mainFrame.setVisible(true);
428     mainFrame.setContentPane(this);
429     mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
430     Desktop.addInternalFrame(mainFrame, frameTitle, 800, 400);
431   }
432
433   public boolean wantedFieldsUpdated()
434   {
435     if (previousWantedFields == null)
436     {
437       return true;
438     }
439
440     return Arrays.equals(PDBDocFieldPreferences.getSearchSummaryFields()
441             .toArray(new PDBDocField[0]), previousWantedFields) ? false
442             : true;
443
444   }
445
446   public void validateSelection()
447   {
448     if (tbl_summary.getSelectedRows().length > 0)
449     {
450       btn_ok.setEnabled(true);
451     }
452     else
453     {
454       btn_ok.setEnabled(false);
455     }
456   }
457
458   public JComboBox<PDBDocField> getCmbSearchTarget()
459   {
460     return cmb_searchTarget;
461   }
462
463   public JTextField getTxtSearch()
464   {
465     return txt_search;
466   }
467
468   public JInternalFrame getMainFrame()
469   {
470     return mainFrame;
471   }
472
473   public abstract void transferToSequenceFetcher(String ids);
474
475   public abstract void txt_search_ActionPerformed();
476
477   public abstract void btn_ok_ActionPerformed();
478
479   public abstract void btn_back_ActionPerformed();
480
481   public abstract void btn_cancel_ActionPerformed();
482
483   public abstract void populateCmbSearchTargetOptions();
484
485 }