Clover icon

Coverage Report

  1. Project Clover database Thu Aug 13 2020 12:04:21 BST
  2. Package jalview.fts.core

File GFTSPanel.java

 

Coverage histogram

../../../img/srcFileCovDistChart4.png
44% of files have more coverage

Code metrics

90
349
67
2
1,088
927
131
0.38
5.21
33.5
1.96

Classes

Class Line # Actions
GFTSPanel 89 342 125
0.3569979735.7%
GFTSPanel.DeferredTextInputListener 740 7 6
0.2307692323.1%
 

Contributing tests

This file is covered by 2 tests. .

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ 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.fts.core;
23   
24    import jalview.bin.Cache;
25    import jalview.fts.api.FTSDataColumnI;
26    import jalview.fts.api.GFTSPanelI;
27    import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
28    import jalview.gui.Desktop;
29    import jalview.gui.IProgressIndicator;
30    import jalview.gui.JvSwingUtils;
31    import jalview.gui.SequenceFetcher;
32    import jalview.io.cache.JvCacheableInputBox;
33    import jalview.util.MessageManager;
34    import jalview.util.Platform;
35   
36    import java.awt.BorderLayout;
37    import java.awt.CardLayout;
38    import java.awt.Dimension;
39    import java.awt.Font;
40    import java.awt.event.ActionEvent;
41    import java.awt.event.ActionListener;
42    import java.awt.event.FocusAdapter;
43    import java.awt.event.FocusEvent;
44    import java.awt.event.FocusListener;
45    import java.awt.event.ItemEvent;
46    import java.awt.event.ItemListener;
47    import java.awt.event.KeyAdapter;
48    import java.awt.event.KeyEvent;
49    import java.awt.event.MouseAdapter;
50    import java.awt.event.MouseEvent;
51    import java.text.DecimalFormat;
52    import java.util.ArrayList;
53    import java.util.Arrays;
54    import java.util.Collection;
55    import java.util.Collections;
56    import java.util.Comparator;
57    import java.util.HashSet;
58    import java.util.List;
59   
60    import javax.swing.ImageIcon;
61    import javax.swing.JButton;
62    import javax.swing.JCheckBox;
63    import javax.swing.JComboBox;
64    import javax.swing.JFrame;
65    import javax.swing.JInternalFrame;
66    import javax.swing.JLabel;
67    import javax.swing.JPanel;
68    import javax.swing.JScrollPane;
69    import javax.swing.JTabbedPane;
70    import javax.swing.JTable;
71    import javax.swing.Timer;
72    import javax.swing.event.ChangeEvent;
73    import javax.swing.event.ChangeListener;
74    import javax.swing.event.DocumentEvent;
75    import javax.swing.event.DocumentListener;
76    import javax.swing.event.InternalFrameEvent;
77    import javax.swing.table.DefaultTableModel;
78    import javax.swing.table.TableColumn;
79   
80    /**
81    * This class provides the swing GUI layout for FTS Panel and implements most of
82    * the contracts defined in GFSPanelI
83    *
84    * @author tcnofoegbu
85    *
86    */
87   
88    @SuppressWarnings("serial")
 
89    public abstract class GFTSPanel extends JPanel implements GFTSPanelI
90    {
91    private static final Font VERDANA_12 = new Font("Verdana", 0, 12);
92   
93    protected JInternalFrame mainFrame = new JInternalFrame(
94    getFTSFrameTitle());
95   
96    protected JTabbedPane tabs = new JTabbedPane();
97   
98    protected IProgressIndicator progressIndicator;
99   
100    protected JComboBox<FTSDataColumnI> cmb_searchTarget = new JComboBox<>();
101   
102    protected JButton btn_ok = new JButton();
103   
104    protected JButton btn_back = new JButton();
105   
106    protected JButton btn_cancel = new JButton();
107   
108    protected JCheckBox btn_autosearch = new JCheckBox();
109   
110    protected JvCacheableInputBox<String> txt_search;
111   
112    protected SequenceFetcher seqFetcher;
113   
114    protected Collection<FTSDataColumnI> wantedFields;
115   
116    private String lastSearchTerm = "";
117   
118    protected JButton btn_next_page = new JButton();
119   
120    protected JButton btn_prev_page = new JButton();
121   
122    protected StringBuilder errorWarning = new StringBuilder();
123   
124    protected ImageIcon warningImage = new ImageIcon(
125    getClass().getResource("/images/warning.gif"));
126   
127    protected ImageIcon loadingImage = new ImageIcon(
128    getClass().getResource("/images/loading.gif"));
129   
130    protected ImageIcon balnkPlaceholderImage = new ImageIcon(
131    getClass().getResource("/images/blank_16x16_placeholder.png"));
132   
133    protected JLabel lbl_warning = new JLabel(warningImage);
134   
135    protected JLabel lbl_loading = new JLabel(loadingImage);
136   
137    protected JLabel lbl_blank = new JLabel(balnkPlaceholderImage);
138   
139    JTabbedPane tabbedPane = new JTabbedPane();
140   
141    private JPanel pnl_actions = new JPanel();
142   
143    private JPanel pnl_results = new JPanel(new CardLayout());
144   
145    private JPanel pnl_inputs = new JPanel();
146   
147    private BorderLayout mainLayout = new BorderLayout();
148   
149    protected Object[] previousWantedFields;
150   
151    protected int resultSetCount;
152   
153    protected int totalResultSetCount;
154   
155    protected int offSet;
156   
157    protected int pageLimit;
158   
159    protected HashSet<String> paginatorCart = new HashSet<>();
160   
161    private static final int MIN_WIDTH = 670;
162   
163    private static final int MIN_HEIGHT = 300;
164   
165    protected static final DecimalFormat totalNumberformatter = new DecimalFormat(
166    "###,###");
167   
168    private JTable tbl_summary = new JTable()
169    {
170    private boolean inLayout;
171   
 
172  14 toggle @Override
173    public boolean getScrollableTracksViewportWidth()
174    {
175  14 return hasExcessWidth();
176   
177    }
178   
 
179  2 toggle @Override
180    public void doLayout()
181    {
182  2 if (hasExcessWidth())
183    {
184  2 autoResizeMode = AUTO_RESIZE_SUBSEQUENT_COLUMNS;
185    }
186  2 inLayout = true;
187  2 super.doLayout();
188  2 inLayout = false;
189  2 autoResizeMode = AUTO_RESIZE_OFF;
190    }
191   
 
192  16 toggle protected boolean hasExcessWidth()
193    {
194  16 return getPreferredSize().width < getParent().getWidth();
195    }
196   
 
197  0 toggle @Override
198    public void columnMarginChanged(ChangeEvent e)
199    {
200  0 if (isEditing())
201    {
202  0 removeEditor();
203    }
204  0 TableColumn resizingColumn = getTableHeader().getResizingColumn();
205    // Need to do this here, before the parent's
206    // layout manager calls getPreferredSize().
207  0 if (resizingColumn != null && autoResizeMode == AUTO_RESIZE_OFF
208    && !inLayout)
209    {
210  0 resizingColumn.setPreferredWidth(resizingColumn.getWidth());
211  0 String colHeader = resizingColumn.getHeaderValue().toString();
212  0 getTempUserPrefs().put(colHeader, resizingColumn.getWidth());
213    }
214  0 resizeAndRepaint();
215    }
216   
 
217  0 toggle @Override
218    public String getToolTipText(MouseEvent evt)
219    {
220  0 String toolTipText = null;
221  0 java.awt.Point pnt = evt.getPoint();
222  0 int rowIndex = rowAtPoint(pnt);
223  0 int colIndex = columnAtPoint(pnt);
224   
225  0 try
226    {
227  0 if (getValueAt(rowIndex, colIndex) == null)
228    {
229  0 return null;
230    }
231  0 toolTipText = getValueAt(rowIndex, colIndex).toString();
232   
233    } catch (Exception e)
234    {
235  0 e.printStackTrace();
236    }
237  0 toolTipText = (toolTipText == null ? null
238  0 : (toolTipText.length() > 500
239    ? JvSwingUtils.wrapTooltip(true,
240    toolTipText.subSequence(0, 500) + "...")
241    : JvSwingUtils.wrapTooltip(true, toolTipText)));
242   
243  0 return toolTipText;
244    }
245    };
246   
247    protected JScrollPane scrl_searchResult = new JScrollPane(tbl_summary);
248   
 
249  0 toggle public GFTSPanel()
250    {
251  0 this(null);
252    }
253   
 
254  1 toggle public GFTSPanel(SequenceFetcher fetcher)
255    {
256  1 try
257    {
258  1 if (fetcher == null)
259    {
260  1 tabs = null;
261    }
262  1 jbInit();
263  1 if (fetcher != null)
264    {
265  0 tabs.addTab(MessageManager.getString("label.retrieve_ids"),
266    fetcher);
267  0 fetcher.embedIn(this);
268    }
269  1 mainFrame.setMinimumSize(new Dimension(MIN_WIDTH, MIN_HEIGHT));
270  1 final JPanel ftsPanel = this;
271  1 mainFrame.addFocusListener(new FocusAdapter()
272    {
 
273  1 toggle @Override
274    public void focusGained(FocusEvent e)
275    {
276    // TODO: make selected tab gain focus in correct widget
277  1 if (tabs != null
278    && tabs.getSelectedComponent() == ftsPanel)
279    {
280  0 txt_search.getComponent().requestFocusInWindow();
281    }
282    }
283    });
284  1 mainFrame.invalidate();
285  1 mainFrame.pack();
286    } catch (Exception e)
287    {
288  0 e.printStackTrace();
289    }
290    }
291   
292    /**
293    * Initializes the GUI default properties
294    *
295    * @throws Exception
296    */
 
297  1 toggle private void jbInit() throws Exception
298    {
299   
300  1 txt_search = new JvCacheableInputBox<>(getCacheKey());
301  1 populateCmbSearchTargetOptions();
302  1 Integer width = getTempUserPrefs().get("FTSPanel.width") == null ? 800
303    : getTempUserPrefs().get("FTSPanel.width");
304  1 Integer height = getTempUserPrefs().get("FTSPanel.height") == null ? 400
305    : getTempUserPrefs().get("FTSPanel.height");
306  1 lbl_warning.setVisible(false);
307  1 lbl_warning.setFont(VERDANA_12);
308  1 lbl_loading.setVisible(false);
309  1 lbl_loading.setFont(VERDANA_12);
310  1 lbl_blank.setVisible(true);
311  1 lbl_blank.setFont(VERDANA_12);
312   
313  1 tbl_summary.setAutoCreateRowSorter(true);
314  1 tbl_summary.getTableHeader().setReorderingAllowed(false);
315  1 tbl_summary.addMouseListener(new MouseAdapter()
316    {
 
317  0 toggle @Override
318    public void mouseClicked(MouseEvent e)
319    {
320  0 validateSelection();
321    }
322   
 
323  0 toggle @Override
324    public void mouseReleased(MouseEvent e)
325    {
326  0 validateSelection();
327    }
328    });
329  1 tbl_summary.addKeyListener(new KeyAdapter()
330    {
 
331  0 toggle @Override
332    public void keyPressed(KeyEvent evt)
333    {
334  0 validateSelection();
335  0 switch (evt.getKeyCode())
336    {
337  0 case KeyEvent.VK_ESCAPE: // escape key
338  0 btn_back_ActionPerformed();
339  0 break;
340  0 case KeyEvent.VK_ENTER: // enter key
341  0 if (btn_ok.isEnabled())
342    {
343  0 okAction();
344    }
345  0 evt.consume();
346  0 break;
347  0 case KeyEvent.VK_TAB: // tab key
348  0 if (evt.isShiftDown())
349    {
350  0 tabbedPane.requestFocus();
351    }
352    else
353    {
354  0 btn_back.requestFocus();
355    }
356  0 evt.consume();
357  0 break;
358  0 default:
359  0 return;
360    }
361    }
362    });
363   
364  1 JButton txt_help = new JButton("?");
365  1 txt_help.setFont(VERDANA_12);
366  1 txt_help.setPreferredSize(new Dimension(15, 15));
367  1 txt_help.setToolTipText(MessageManager.getString("action.help"));
368  1 txt_help.addActionListener(new ActionListener()
369    {
 
370  0 toggle @Override
371    public void actionPerformed(ActionEvent e)
372    {
373  0 showHelp();
374    }
375    });
376   
377  1 btn_autosearch.setText(MessageManager.getString("option.autosearch"));
378  1 btn_autosearch.setToolTipText(
379    MessageManager.getString("option.enable_disable_autosearch"));
380  1 btn_autosearch.setSelected(!Platform.isJS()
381    && Cache.getDefault(getAutosearchPreference(), true));
382  1 btn_autosearch.addActionListener(new java.awt.event.ActionListener()
383    {
 
384  0 toggle @Override
385    public void actionPerformed(ActionEvent e)
386    {
387  0 jalview.bin.Cache.setProperty(getAutosearchPreference(),
388    Boolean.toString(btn_autosearch.isSelected()));
389    }
390    });
391  1 btn_back.setFont(VERDANA_12);
392  1 btn_back.setText(MessageManager.getString("action.back"));
393  1 btn_back.addActionListener(new java.awt.event.ActionListener()
394    {
 
395  0 toggle @Override
396    public void actionPerformed(ActionEvent e)
397    {
398  0 btn_back_ActionPerformed();
399    }
400    });
401  1 btn_back.addKeyListener(new KeyAdapter()
402    {
 
403  0 toggle @Override
404    public void keyPressed(KeyEvent evt)
405    {
406  0 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
407    {
408  0 btn_back_ActionPerformed();
409    }
410    }
411    });
412   
413  1 btn_ok.setEnabled(false);
414  1 btn_ok.setFont(VERDANA_12);
415  1 btn_ok.setText(MessageManager.getString("action.ok"));
416  1 btn_ok.addActionListener(new java.awt.event.ActionListener()
417    {
 
418  0 toggle @Override
419    public void actionPerformed(ActionEvent e)
420    {
421  0 okAction();
422    }
423    });
424  1 btn_ok.addKeyListener(new KeyAdapter()
425    {
 
426  0 toggle @Override
427    public void keyPressed(KeyEvent evt)
428    {
429  0 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
430    {
431  0 okAction();
432    }
433    }
434    });
435  1 btn_next_page.setEnabled(false);
436  1 btn_next_page.setToolTipText(
437    MessageManager.getString("label.next_page_tooltip"));
438  1 btn_next_page.setFont(VERDANA_12);
439  1 btn_next_page.setText(MessageManager.getString("action.next_page"));
440  1 btn_next_page.addActionListener(new java.awt.event.ActionListener()
441    {
 
442  0 toggle @Override
443    public void actionPerformed(ActionEvent e)
444    {
445  0 nextPageAction();
446    }
447    });
448  1 btn_next_page.addKeyListener(new KeyAdapter()
449    {
 
450  0 toggle @Override
451    public void keyPressed(KeyEvent evt)
452    {
453  0 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
454    {
455  0 nextPageAction();
456    }
457    }
458    });
459   
460  1 btn_prev_page.setEnabled(false);
461  1 btn_prev_page.setToolTipText(
462    MessageManager.getString("label.prev_page_tooltip"));
463  1 btn_prev_page.setFont(VERDANA_12);
464  1 btn_prev_page.setText(MessageManager.getString("action.prev_page"));
465  1 btn_prev_page.addActionListener(new java.awt.event.ActionListener()
466    {
 
467  0 toggle @Override
468    public void actionPerformed(ActionEvent e)
469    {
470  0 prevPageAction();
471    }
472    });
473  1 btn_prev_page.addKeyListener(new KeyAdapter()
474    {
 
475  0 toggle @Override
476    public void keyPressed(KeyEvent evt)
477    {
478  0 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
479    {
480  0 prevPageAction();
481    }
482    }
483    });
484   
485  1 if (isPaginationEnabled())
486    {
487  1 btn_prev_page.setVisible(true);
488  1 btn_next_page.setVisible(true);
489    }
490    else
491    {
492  0 btn_prev_page.setVisible(false);
493  0 btn_next_page.setVisible(false);
494    }
495   
496  1 btn_cancel.setFont(VERDANA_12);
497  1 btn_cancel.setText(MessageManager.getString("action.cancel"));
498  1 btn_cancel.addActionListener(new java.awt.event.ActionListener()
499    {
 
500  0 toggle @Override
501    public void actionPerformed(ActionEvent e)
502    {
503  0 btn_cancel_ActionPerformed();
504    }
505    });
506  1 btn_cancel.addKeyListener(new KeyAdapter()
507    {
 
508  0 toggle @Override
509    public void keyPressed(KeyEvent evt)
510    {
511  0 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
512    {
513  0 btn_cancel_ActionPerformed();
514    }
515    }
516    });
517  1 scrl_searchResult.setPreferredSize(new Dimension(width, height));
518   
519  1 cmb_searchTarget.setFont(VERDANA_12);
520  1 cmb_searchTarget.addItemListener(new ItemListener()
521    {
 
522  0 toggle @Override
523    public void itemStateChanged(ItemEvent e)
524    {
525  0 if (e.getStateChange() == ItemEvent.SELECTED)
526    {
527  0 String tooltipText;
528  0 if ("all".equalsIgnoreCase(
529    getCmbSearchTarget().getSelectedItem().toString()))
530    {
531  0 tooltipText = MessageManager.getString("label.search_all");
532    }
533  0 else if ("pdb id".equalsIgnoreCase(
534    getCmbSearchTarget().getSelectedItem().toString()))
535    {
536  0 tooltipText = MessageManager
537    .getString("label.separate_multiple_accession_ids");
538    }
539    else
540    {
541  0 tooltipText = MessageManager.formatMessage(
542    "label.separate_multiple_query_values", new Object[]
543    { getCmbSearchTarget().getSelectedItem().toString() });
544    }
545  0 txt_search.getComponent().setToolTipText(
546    JvSwingUtils.wrapTooltip(true, tooltipText));
547  0 searchAction(true);
548    }
549    }
550    });
551   
552  1 txt_search.getComponent().setFont(VERDANA_12);
553   
554  1 txt_search.addKeyListener(new KeyAdapter()
555    {
 
556  0 toggle @Override
557    public void keyPressed(KeyEvent e)
558    {
559  0 if (e.getKeyCode() == KeyEvent.VK_ENTER)
560    {
561  0 if (getTypedText() == null || getTypedText().isEmpty())
562    {
563  0 return;
564    }
565  0 String primaryKeyName = getFTSRestClient()
566    .getPrimaryKeyColumn().getName();
567  0 if (primaryKeyName.equalsIgnoreCase(getCmbSearchTarget()
568    .getSelectedItem().toString()))
569    {
570    // TODO: nicer to show the list in the result set before
571    // viewing in Jalview perhaps ?
572  0 transferToSequenceFetcher(getTypedText());
573    }
574    else
575    {
576  0 performSearchAction();
577    }
578    }
579    }
580    });
581  1 final DeferredTextInputListener listener = new DeferredTextInputListener(
582    1500, new ActionListener()
583    {
 
584  0 toggle @Override
585    public void actionPerformed(ActionEvent e)
586    {
587  0 if (btn_autosearch.isSelected()
588    || txt_search.wasEnterPressed())
589    {
590  0 performSearchAction();
591    }
592    }
593    }, false);
594  1 txt_search.addDocumentListener(listener);
595   
596  1 txt_search.addFocusListener(new FocusListener()
597    {
 
598  0 toggle @Override
599    public void focusGained(FocusEvent e)
600    {
601  0 listener.start();
602    }
603   
 
604  0 toggle @Override
605    public void focusLost(FocusEvent e)
606    {
607    // listener.stop();
608    }
609    });
610   
611  1 txt_search.addActionListener(new ActionListener()
612    {
 
613  0 toggle @Override
614    public void actionPerformed(ActionEvent e)
615    {
616  0 performSearchAction();
617    }
618    });
619  1 final String searchTabTitle = MessageManager
620    .getString("label.search_result");
621  1 final String configureCols = MessageManager
622    .getString("label.configure_displayed_columns");
623  1 ChangeListener changeListener = new ChangeListener()
624    {
 
625  1 toggle @Override
626    public void stateChanged(ChangeEvent changeEvent)
627    {
628  1 JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent
629    .getSource();
630  1 int index = sourceTabbedPane.getSelectedIndex();
631   
632  1 btn_back.setVisible(true);
633  1 btn_cancel.setVisible(true);
634  1 btn_ok.setVisible(true);
635  1 if (sourceTabbedPane.getTitleAt(index).equals(configureCols))
636    {
637  0 btn_back.setVisible(false);
638  0 btn_cancel.setVisible(false);
639  0 btn_ok.setVisible(false);
640  0 btn_back.setEnabled(false);
641  0 btn_cancel.setEnabled(false);
642  0 btn_ok.setEnabled(false);
643  0 btn_next_page.setEnabled(false);
644  0 btn_prev_page.setEnabled(false);
645  0 txt_search.getComponent().setEnabled(false);
646  0 cmb_searchTarget.setEnabled(false);
647  0 previousWantedFields = getFTSRestClient()
648    .getAllDefaultDisplayedFTSDataColumns()
649    .toArray(new Object[0]);
650    }
651  1 if (sourceTabbedPane.getTitleAt(index).equals(searchTabTitle))
652    {
653  1 btn_back.setEnabled(true);
654  1 btn_cancel.setEnabled(true);
655  1 refreshPaginatorState();
656  1 txt_search.getComponent().setEnabled(true);
657  1 cmb_searchTarget.setEnabled(true);
658  1 if (wantedFieldsUpdated())
659    {
660  0 searchAction(true);
661  0 paginatorCart.clear();
662    }
663    else
664    {
665  1 validateSelection();
666    }
667    }
668    }
669    };
670  1 tabbedPane.addChangeListener(changeListener);
671  1 tabbedPane.setPreferredSize(new Dimension(width, height));
672  1 tabbedPane.add(searchTabTitle, scrl_searchResult);
673  1 tabbedPane.add(configureCols, new FTSDataColumnPreferences(
674    PreferenceSource.SEARCH_SUMMARY, getFTSRestClient()));
675   
676  1 pnl_actions.add(btn_back);
677  1 pnl_actions.add(btn_ok);
678  1 pnl_actions.add(btn_cancel);
679   
680  1 pnl_results.add(tabbedPane);
681  1 pnl_inputs.add(cmb_searchTarget);
682  1 pnl_inputs.add(txt_search.getComponent());
683  1 pnl_inputs.add(txt_help);
684  1 pnl_inputs.add(btn_autosearch);
685  1 pnl_inputs.add(lbl_loading);
686  1 pnl_inputs.add(lbl_warning);
687  1 pnl_inputs.add(lbl_blank);
688  1 pnl_inputs.add(btn_prev_page);
689  1 pnl_inputs.add(btn_next_page);
690   
691  1 this.setLayout(mainLayout);
692  1 this.add(pnl_inputs, java.awt.BorderLayout.NORTH);
693  1 this.add(pnl_results, java.awt.BorderLayout.CENTER);
694  1 this.add(pnl_actions, java.awt.BorderLayout.SOUTH);
695  1 mainFrame.setVisible(true);
696  1 if (tabs != null)
697    {
698  0 tabs.setOpaque(true);
699  0 tabs.insertTab(MessageManager.getString("label.free_text_search"),
700    null, this, "", 0);
701  0 mainFrame.setContentPane(tabs);
702  0 tabs.setVisible(true);
703    }
704    else
705    {
706  1 mainFrame.setContentPane(this);
707    }
708  1 mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
709  1 mainFrame.addInternalFrameListener(
710    new javax.swing.event.InternalFrameAdapter()
711    {
 
712  0 toggle @Override
713    public void internalFrameClosing(InternalFrameEvent e)
714    {
715  0 closeAction();
716    }
717    });
718  1 mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
719  1 Integer x = getTempUserPrefs().get("FTSPanel.x");
720  1 Integer y = getTempUserPrefs().get("FTSPanel.y");
721  1 if (x != null && y != null)
722    {
723  0 mainFrame.setLocation(x, y);
724    }
725  1 Desktop.addInternalFrame(mainFrame, getFTSFrameTitle(), width, height);
726    }
727   
728    abstract protected void showHelp();
729   
 
730  0 toggle protected void closeAction()
731    {
732  0 getTempUserPrefs().put("FTSPanel.width", this.getWidth());
733  0 getTempUserPrefs().put("FTSPanel.height", pnl_results.getHeight());
734  0 getTempUserPrefs().put("FTSPanel.x", mainFrame.getX());
735  0 getTempUserPrefs().put("FTSPanel.y", mainFrame.getY());
736  0 mainFrame.dispose();
737  0 txt_search.persistCache();
738    }
739   
 
740    public class DeferredTextInputListener implements DocumentListener
741    {
742    private final Timer swingTimer;
743   
 
744  1 toggle public DeferredTextInputListener(int timeOut, ActionListener listener,
745    boolean repeats)
746    {
747  1 swingTimer = new Timer(timeOut, listener);
748  1 swingTimer.setRepeats(repeats);
749    }
750   
 
751  0 toggle public void start()
752    {
753  0 swingTimer.start();
754    }
755   
 
756  0 toggle public void stop()
757    {
758  0 swingTimer.stop();
759    }
760   
 
761  0 toggle @Override
762    public void insertUpdate(DocumentEvent e)
763    {
764  0 swingTimer.restart();
765    }
766   
 
767  0 toggle @Override
768    public void removeUpdate(DocumentEvent e)
769    {
770  0 swingTimer.restart();
771    }
772   
 
773  0 toggle @Override
774    public void changedUpdate(DocumentEvent e)
775    {
776  0 swingTimer.restart();
777    }
778   
779    }
780   
 
781  0 toggle void performSearchAction()
782    {
783  0 String typed = getTypedText();
784  0 if (typed != null && typed.length() > 0
785    && !typed.equalsIgnoreCase(lastSearchTerm))
786    {
787  0 searchAction(true);
788  0 paginatorCart.clear();
789  0 lastSearchTerm = typed;
790    }
791    }
792   
 
793  1 toggle public boolean wantedFieldsUpdated()
794    {
795  1 if (previousWantedFields == null)
796    {
797  1 return false;
798    }
799   
800  0 return Arrays.equals(getFTSRestClient()
801    .getAllDefaultDisplayedFTSDataColumns().toArray(new Object[0]),
802    previousWantedFields) ? false : true;
803   
804    }
805   
 
806  1 toggle public void validateSelection()
807    {
808  1 if (tbl_summary.getSelectedRows().length > 0
809    || !paginatorCart.isEmpty())
810    {
811  0 btn_ok.setEnabled(true);
812    }
813    else
814    {
815  1 btn_ok.setEnabled(false);
816    }
817    }
818   
 
819  1 toggle public JComboBox<FTSDataColumnI> getCmbSearchTarget()
820    {
821  1 return cmb_searchTarget;
822    }
823   
 
824  0 toggle public JInternalFrame getMainFrame()
825    {
826  0 return mainFrame;
827    }
828   
 
829  0 toggle protected void delayAndEnableActionButtons()
830    {
831  0 new Thread()
832    {
 
833  0 toggle @Override
834    public void run()
835    {
836  0 try
837    {
838  0 Thread.sleep(1500);
839    } catch (InterruptedException e)
840    {
841  0 e.printStackTrace();
842    }
843  0 btn_ok.setEnabled(true);
844  0 btn_back.setEnabled(true);
845  0 btn_cancel.setEnabled(true);
846    }
847    }.start();
848    }
849   
 
850  0 toggle protected void checkForErrors()
851    {
852  0 lbl_warning.setVisible(false);
853  0 lbl_blank.setVisible(true);
854  0 if (errorWarning.length() > 0)
855    {
856  0 lbl_loading.setVisible(false);
857  0 lbl_blank.setVisible(false);
858  0 lbl_warning.setToolTipText(
859    JvSwingUtils.wrapTooltip(true, errorWarning.toString()));
860  0 lbl_warning.setVisible(true);
861    }
862    }
863   
864    /**
865    * Action on Back button is to close this panel and open a new Sequence
866    * Fetcher panel
867    */
 
868  0 toggle public void btn_back_ActionPerformed()
869    {
870  0 closeAction();
871  0 new SequenceFetcher(progressIndicator);
872    }
873   
 
874  0 toggle protected void disableActionButtons()
875    {
876  0 btn_ok.setEnabled(false);
877  0 btn_back.setEnabled(false);
878  0 btn_cancel.setEnabled(false);
879    }
880   
 
881  0 toggle public void btn_cancel_ActionPerformed()
882    {
883  0 closeAction();
884    }
885   
886    /**
887    * Populates search target combo-box options
888    */
 
889  2 toggle public void populateCmbSearchTargetOptions()
890    {
891  2 List<FTSDataColumnI> searchableTargets = new ArrayList<>();
892  2 try
893    {
894  2 Collection<FTSDataColumnI> foundFTSTargets = getFTSRestClient()
895    .getSearchableDataColumns();
896  2 searchableTargets.addAll(foundFTSTargets);
897    } catch (Exception e)
898    {
899  0 e.printStackTrace();
900    }
901   
902  2 Collections.sort(searchableTargets, new Comparator<FTSDataColumnI>()
903    {
 
904  40 toggle @Override
905    public int compare(FTSDataColumnI o1, FTSDataColumnI o2)
906    {
907  40 return o1.getName().compareTo(o2.getName());
908    }
909    });
910   
911  2 for (FTSDataColumnI searchTarget : searchableTargets)
912    {
913  18 cmb_searchTarget.addItem(searchTarget);
914    }
915    }
916   
 
917  0 toggle public void transferToSequenceFetcher(String ids)
918    {
919  0 seqFetcher.setQuery(ids);
920  0 Thread worker = new Thread(seqFetcher);
921  0 worker.start();
922    }
923   
 
924  0 toggle @Override
925    public String getTypedText()
926    {
927  0 return txt_search.getUserInput();
928    }
929   
 
930  0 toggle @Override
931    public JTable getResultTable()
932    {
933  0 return tbl_summary;
934    }
935   
 
936  0 toggle public void reset()
937    {
938  0 lbl_loading.setVisible(false);
939  0 errorWarning.setLength(0);
940  0 lbl_warning.setVisible(false);
941  0 lbl_blank.setVisible(true);
942  0 btn_ok.setEnabled(false);
943  0 mainFrame.setTitle(getFTSFrameTitle());
944  0 refresh();
945  0 tbl_summary.setModel(new DefaultTableModel());
946  0 tbl_summary.setVisible(false);
947    }
948   
 
949  1 toggle @Override
950    public void setPrevPageButtonEnabled(boolean isEnabled)
951    {
952  1 btn_prev_page.setEnabled(isEnabled);
953    }
954   
 
955  1 toggle @Override
956    public void setNextPageButtonEnabled(boolean isEnabled)
957    {
958  1 btn_next_page.setEnabled(isEnabled);
959    }
960   
 
961  0 toggle @Override
962    public void setErrorMessage(String message)
963    {
964  0 errorWarning.append(message);
965    }
966   
 
967  0 toggle @Override
968    public void updateSearchFrameTitle(String title)
969    {
970  0 mainFrame.setTitle(title);
971    }
972   
 
973  0 toggle @Override
974    public void setSearchInProgress(Boolean isSearchInProgress)
975    {
976  0 lbl_blank.setVisible(!isSearchInProgress);
977  0 lbl_loading.setVisible(isSearchInProgress);
978  0 txt_search.setEditable(!isSearchInProgress);
979    }
980   
 
981  0 toggle @Override
982    public void prevPageAction()
983    {
984  0 updatePaginatorCart();
985  0 if (offSet >= pageLimit)
986    {
987  0 offSet = offSet - pageLimit;
988  0 searchAction(false);
989    }
990    else
991    {
992  0 refreshPaginatorState();
993    }
994    }
995   
 
996  0 toggle @Override
997    public void nextPageAction()
998    {
999  0 updatePaginatorCart();
1000  0 offSet = offSet + pageLimit;
1001  0 searchAction(false);
1002    }
1003   
 
1004  0 toggle public void updatePaginatorCart()
1005    {
1006  0 int primaryKeyColIndex = 0;
1007  0 JTable resultTable = getResultTable();
1008  0 int totalRows = resultTable.getRowCount();
1009  0 try
1010    {
1011  0 primaryKeyColIndex = getFTSRestClient()
1012    .getPrimaryKeyColumIndex(wantedFields, false);
1013    } catch (Exception e)
1014    {
1015  0 e.printStackTrace();
1016    }
1017   
1018  0 for (int row = 0; row < totalRows; row++)
1019    {
1020  0 String id = (String) resultTable.getValueAt(row, primaryKeyColIndex);
1021  0 if (paginatorCart.contains(id))
1022    {
1023  0 paginatorCart.remove(id);
1024    }
1025    }
1026  0 int[] selectedRows = resultTable.getSelectedRows();
1027  0 for (int summaryRow : selectedRows)
1028    {
1029  0 String idStr = resultTable.getValueAt(summaryRow, primaryKeyColIndex)
1030    .toString();
1031  0 paginatorCart.add(idStr);
1032    }
1033    }
1034   
 
1035  0 toggle public void updateSummaryTableSelections()
1036    {
1037  0 JTable resultTable = getResultTable();
1038  0 if (paginatorCart.isEmpty())
1039    {
1040  0 return;
1041    }
1042  0 int primaryKeyColIndex = 0;
1043  0 try
1044    {
1045  0 primaryKeyColIndex = getFTSRestClient()
1046    .getPrimaryKeyColumIndex(wantedFields, false);
1047    } catch (Exception e)
1048    {
1049  0 e.printStackTrace();
1050    }
1051  0 int totalRows = resultTable.getRowCount();
1052  0 for (int row = 0; row < totalRows; row++)
1053    {
1054  0 String id = (String) resultTable.getValueAt(row, primaryKeyColIndex);
1055  0 if (paginatorCart.contains(id))
1056    {
1057  0 resultTable.addRowSelectionInterval(row, row);
1058    }
1059    }
1060  0 validateSelection();
1061    }
1062   
 
1063  1 toggle public void refreshPaginatorState()
1064    {
1065  1 setPrevPageButtonEnabled(false);
1066  1 setNextPageButtonEnabled(false);
1067  1 if (resultSetCount == 0 && pageLimit == 0)
1068    {
1069  1 return;
1070    }
1071  0 if (resultSetCount >= pageLimit)
1072    {
1073  0 setNextPageButtonEnabled(true);
1074    }
1075  0 if (offSet >= pageLimit)
1076    {
1077  0 setPrevPageButtonEnabled(true);
1078    }
1079    }
1080   
 
1081  0 toggle public void refresh()
1082    {
1083  0 mainFrame.setTitle(getFTSFrameTitle());
1084    }
1085   
1086    @Override
1087    public abstract void okAction();
1088    }