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