2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
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.
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.
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.
22 package jalview.fts.core;
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.io.cache.JvCacheableInputBox;
32 import jalview.util.MessageManager;
34 import java.awt.BorderLayout;
35 import java.awt.CardLayout;
36 import java.awt.Dimension;
37 import java.awt.event.ActionEvent;
38 import java.awt.event.ActionListener;
39 import java.awt.event.FocusAdapter;
40 import java.awt.event.FocusEvent;
41 import java.awt.event.FocusListener;
42 import java.awt.event.ItemEvent;
43 import java.awt.event.ItemListener;
44 import java.awt.event.KeyAdapter;
45 import java.awt.event.KeyEvent;
46 import java.awt.event.MouseAdapter;
47 import java.awt.event.MouseEvent;
48 import java.text.DecimalFormat;
49 import java.util.ArrayList;
50 import java.util.Arrays;
51 import java.util.Collection;
52 import java.util.Collections;
53 import java.util.Comparator;
54 import java.util.HashSet;
55 import java.util.List;
57 import javax.swing.ImageIcon;
58 import javax.swing.JButton;
59 import javax.swing.JCheckBox;
60 import javax.swing.JComboBox;
61 import javax.swing.JFrame;
62 import javax.swing.JInternalFrame;
63 import javax.swing.JLabel;
64 import javax.swing.JPanel;
65 import javax.swing.JScrollPane;
66 import javax.swing.JTabbedPane;
67 import javax.swing.JTable;
68 import javax.swing.Timer;
69 import javax.swing.event.ChangeEvent;
70 import javax.swing.event.ChangeListener;
71 import javax.swing.event.DocumentEvent;
72 import javax.swing.event.DocumentListener;
73 import javax.swing.event.InternalFrameEvent;
74 import javax.swing.table.DefaultTableModel;
75 import javax.swing.table.TableColumn;
78 * This class provides the swing GUI layout for FTS Panel and implements most of
79 * the contracts defined in GFSPanelI
85 @SuppressWarnings("serial")
86 public abstract class GFTSPanel extends JPanel implements GFTSPanelI
88 protected JInternalFrame mainFrame = new JInternalFrame(
91 protected JTabbedPane tabs = jalview.jbgui.GDesktop.createTabbedPane();
93 protected IProgressIndicator progressIndicator;
95 protected JComboBox<FTSDataColumnI> cmb_searchTarget = new JComboBox<>();
97 protected JButton btn_ok = new JButton();
99 protected JButton btn_back = new JButton();
101 protected JButton btn_cancel = new JButton();
103 protected JCheckBox btn_autosearch = new JCheckBox();
105 protected JvCacheableInputBox<String> txt_search;
107 protected SequenceFetcher seqFetcher;
109 protected Collection<FTSDataColumnI> wantedFields;
111 private String lastSearchTerm = "";
113 protected JButton btn_next_page = new JButton();
115 protected JButton btn_prev_page = new JButton();
117 protected StringBuilder errorWarning = new StringBuilder();
119 protected ImageIcon warningImage = new ImageIcon(
120 getClass().getResource("/images/warning.gif"));
122 protected ImageIcon loadingImage = new ImageIcon(
123 getClass().getResource("/images/loading.gif"));
125 protected ImageIcon balnkPlaceholderImage = new ImageIcon(
126 getClass().getResource("/images/blank_16x16_placeholder.png"));
128 protected JLabel lbl_warning = new JLabel(warningImage);
130 protected JLabel lbl_loading = new JLabel(loadingImage);
132 protected JLabel lbl_blank = new JLabel(balnkPlaceholderImage);
134 JTabbedPane tabbedPane = jalview.jbgui.GDesktop.createTabbedPane();
136 private JPanel pnl_actions = new JPanel();
138 private JPanel pnl_results = new JPanel(new CardLayout());
140 private JPanel pnl_inputs = new JPanel();
142 private BorderLayout mainLayout = new BorderLayout();
144 protected Object[] previousWantedFields;
146 protected int resultSetCount;
148 protected int totalResultSetCount;
150 protected int offSet;
152 protected int pageLimit;
154 protected HashSet<String> paginatorCart = new HashSet<>();
156 private static final int MIN_WIDTH = 670;
158 private static final int MIN_HEIGHT = 300;
160 protected static final DecimalFormat totalNumberformatter = new DecimalFormat(
163 private JTable tbl_summary = new JTable()
165 private boolean inLayout;
168 public boolean getScrollableTracksViewportWidth()
170 return hasExcessWidth();
175 public void doLayout()
177 if (hasExcessWidth())
179 autoResizeMode = AUTO_RESIZE_SUBSEQUENT_COLUMNS;
184 autoResizeMode = AUTO_RESIZE_OFF;
187 protected boolean hasExcessWidth()
189 return getPreferredSize().width < getParent().getWidth();
193 public void columnMarginChanged(ChangeEvent e)
199 TableColumn resizingColumn = getTableHeader().getResizingColumn();
200 // Need to do this here, before the parent's
201 // layout manager calls getPreferredSize().
202 if (resizingColumn != null && autoResizeMode == AUTO_RESIZE_OFF
205 resizingColumn.setPreferredWidth(resizingColumn.getWidth());
206 String colHeader = resizingColumn.getHeaderValue().toString();
207 getTempUserPrefs().put(colHeader, resizingColumn.getWidth());
213 public String getToolTipText(MouseEvent evt)
215 String toolTipText = null;
216 java.awt.Point pnt = evt.getPoint();
217 int rowIndex = rowAtPoint(pnt);
218 int colIndex = columnAtPoint(pnt);
222 if (getValueAt(rowIndex, colIndex) == null)
226 toolTipText = getValueAt(rowIndex, colIndex).toString();
228 } catch (Exception e)
232 toolTipText = (toolTipText == null ? null
233 : (toolTipText.length() > 500
234 ? JvSwingUtils.wrapTooltip(true,
235 toolTipText.subSequence(0, 500) + "...")
236 : JvSwingUtils.wrapTooltip(true, toolTipText)));
242 protected JScrollPane scrl_searchResult = new JScrollPane(tbl_summary);
249 public GFTSPanel(SequenceFetcher fetcher)
260 tabs.addTab(MessageManager.getString("label.retrieve_ids"),
262 fetcher.embedIn(this);
264 mainFrame.setMinimumSize(new Dimension(MIN_WIDTH, MIN_HEIGHT));
265 final JPanel ftsPanel = this;
266 mainFrame.addFocusListener(new FocusAdapter()
269 public void focusGained(FocusEvent e)
271 // TODO: make selected tab gain focus in correct widget
273 && tabs.getSelectedComponent() == ftsPanel)
275 txt_search.getComponent().requestFocusInWindow();
279 mainFrame.invalidate();
281 } catch (Exception e)
288 * Initializes the GUI default properties
292 private void jbInit() throws Exception
295 txt_search = new JvCacheableInputBox<>(getCacheKey());
296 populateCmbSearchTargetOptions();
297 Integer width = getTempUserPrefs().get("FTSPanel.width") == null ? 800
298 : getTempUserPrefs().get("FTSPanel.width");
299 Integer height = getTempUserPrefs().get("FTSPanel.height") == null ? 400
300 : getTempUserPrefs().get("FTSPanel.height");
301 lbl_warning.setVisible(false);
302 lbl_warning.setFont(new java.awt.Font("Verdana", 0, 12));
303 lbl_loading.setVisible(false);
304 lbl_loading.setFont(new java.awt.Font("Verdana", 0, 12));
305 lbl_blank.setVisible(true);
306 lbl_blank.setFont(new java.awt.Font("Verdana", 0, 12));
308 tbl_summary.setAutoCreateRowSorter(true);
309 tbl_summary.getTableHeader().setReorderingAllowed(false);
310 tbl_summary.addMouseListener(new MouseAdapter()
313 public void mouseClicked(MouseEvent e)
319 public void mouseReleased(MouseEvent e)
324 tbl_summary.addKeyListener(new KeyAdapter()
327 public void keyPressed(KeyEvent evt)
330 switch (evt.getKeyCode())
332 case KeyEvent.VK_ESCAPE: // escape key
333 btn_back_ActionPerformed();
335 case KeyEvent.VK_ENTER: // enter key
336 if (btn_ok.isEnabled())
342 case KeyEvent.VK_TAB: // tab key
343 if (evt.isShiftDown())
345 tabbedPane.requestFocus();
349 btn_back.requestFocus();
359 btn_autosearch.setText(MessageManager.getString("option.autosearch"));
360 btn_autosearch.setToolTipText(
361 MessageManager.getString("option.enable_disable_autosearch"));
362 btn_autosearch.setSelected(
363 jalview.bin.Cache.getDefault(getAutosearchPreference(), true));
364 btn_autosearch.addActionListener(new java.awt.event.ActionListener()
367 public void actionPerformed(ActionEvent e)
369 jalview.bin.Cache.setProperty(getAutosearchPreference(),
370 Boolean.toString(btn_autosearch.isSelected()));
373 btn_back.setFont(new java.awt.Font("Verdana", 0, 12));
374 btn_back.setText(MessageManager.getString("action.back"));
375 btn_back.addActionListener(new java.awt.event.ActionListener()
378 public void actionPerformed(ActionEvent e)
380 btn_back_ActionPerformed();
383 btn_back.addKeyListener(new KeyAdapter()
386 public void keyPressed(KeyEvent evt)
388 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
390 btn_back_ActionPerformed();
395 btn_ok.setEnabled(false);
396 btn_ok.setFont(new java.awt.Font("Verdana", 0, 12));
397 btn_ok.setText(MessageManager.getString("action.ok"));
398 btn_ok.addActionListener(new java.awt.event.ActionListener()
401 public void actionPerformed(ActionEvent e)
406 btn_ok.addKeyListener(new KeyAdapter()
409 public void keyPressed(KeyEvent evt)
411 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
417 btn_next_page.setEnabled(false);
418 btn_next_page.setToolTipText(
419 MessageManager.getString("label.next_page_tooltip"));
420 btn_next_page.setFont(new java.awt.Font("Verdana", 0, 12));
421 btn_next_page.setText(MessageManager.getString("action.next_page"));
422 btn_next_page.addActionListener(new java.awt.event.ActionListener()
425 public void actionPerformed(ActionEvent e)
430 btn_next_page.addKeyListener(new KeyAdapter()
433 public void keyPressed(KeyEvent evt)
435 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
442 btn_prev_page.setEnabled(false);
443 btn_prev_page.setToolTipText(
444 MessageManager.getString("label.prev_page_tooltip"));
445 btn_prev_page.setFont(new java.awt.Font("Verdana", 0, 12));
446 btn_prev_page.setText(MessageManager.getString("action.prev_page"));
447 btn_prev_page.addActionListener(new java.awt.event.ActionListener()
450 public void actionPerformed(ActionEvent e)
455 btn_prev_page.addKeyListener(new KeyAdapter()
458 public void keyPressed(KeyEvent evt)
460 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
467 if (isPaginationEnabled())
469 btn_prev_page.setVisible(true);
470 btn_next_page.setVisible(true);
474 btn_prev_page.setVisible(false);
475 btn_next_page.setVisible(false);
478 btn_cancel.setFont(new java.awt.Font("Verdana", 0, 12));
479 btn_cancel.setText(MessageManager.getString("action.cancel"));
480 btn_cancel.addActionListener(new java.awt.event.ActionListener()
483 public void actionPerformed(ActionEvent e)
485 btn_cancel_ActionPerformed();
488 btn_cancel.addKeyListener(new KeyAdapter()
491 public void keyPressed(KeyEvent evt)
493 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
495 btn_cancel_ActionPerformed();
499 scrl_searchResult.setPreferredSize(new Dimension(width, height));
501 cmb_searchTarget.setFont(new java.awt.Font("Verdana", 0, 12));
502 cmb_searchTarget.addItemListener(new ItemListener()
505 public void itemStateChanged(ItemEvent e)
507 if (e.getStateChange() == ItemEvent.SELECTED)
510 if ("all".equalsIgnoreCase(
511 getCmbSearchTarget().getSelectedItem().toString()))
513 tooltipText = MessageManager.getString("label.search_all");
515 else if ("pdb id".equalsIgnoreCase(
516 getCmbSearchTarget().getSelectedItem().toString()))
518 tooltipText = MessageManager
519 .getString("label.separate_multiple_accession_ids");
523 tooltipText = MessageManager.formatMessage(
524 "label.separate_multiple_query_values", new Object[]
525 { getCmbSearchTarget().getSelectedItem().toString() });
527 txt_search.getComponent().setToolTipText(
528 JvSwingUtils.wrapTooltip(true, tooltipText));
534 txt_search.getComponent().setFont(new java.awt.Font("Verdana", 0, 12));
536 txt_search.addKeyListener(new KeyAdapter()
539 public void keyPressed(KeyEvent e)
541 if (e.getKeyCode() == KeyEvent.VK_ENTER)
543 if (getTypedText() == null || getTypedText().isEmpty())
547 String primaryKeyName = getFTSRestClient()
548 .getPrimaryKeyColumn().getName();
549 if (primaryKeyName.equalsIgnoreCase(getCmbSearchTarget()
550 .getSelectedItem().toString()))
552 // TODO: nicer to show the list in the result set before
553 // viewing in Jalview perhaps ?
554 transferToSequenceFetcher(getTypedText());
558 performSearchAction();
563 final DeferredTextInputListener listener = new DeferredTextInputListener(
564 1500, new ActionListener()
567 public void actionPerformed(ActionEvent e)
569 if (btn_autosearch.isSelected()
570 || txt_search.wasEnterPressed())
572 performSearchAction();
576 txt_search.addDocumentListener(listener);
578 txt_search.addFocusListener(new FocusListener()
581 public void focusGained(FocusEvent e)
587 public void focusLost(FocusEvent e)
593 txt_search.addActionListener(new ActionListener()
596 public void actionPerformed(ActionEvent e)
598 performSearchAction();
601 final String searchTabTitle = MessageManager
602 .getString("label.search_result");
603 final String configureCols = MessageManager
604 .getString("label.configure_displayed_columns");
605 ChangeListener changeListener = new ChangeListener()
608 public void stateChanged(ChangeEvent changeEvent)
610 JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent
612 int index = sourceTabbedPane.getSelectedIndex();
614 btn_back.setVisible(true);
615 btn_cancel.setVisible(true);
616 btn_ok.setVisible(true);
617 if (sourceTabbedPane.getTitleAt(index).equals(configureCols))
619 btn_back.setVisible(false);
620 btn_cancel.setVisible(false);
621 btn_ok.setVisible(false);
622 btn_back.setEnabled(false);
623 btn_cancel.setEnabled(false);
624 btn_ok.setEnabled(false);
625 btn_next_page.setEnabled(false);
626 btn_prev_page.setEnabled(false);
627 txt_search.getComponent().setEnabled(false);
628 cmb_searchTarget.setEnabled(false);
629 previousWantedFields = getFTSRestClient()
630 .getAllDefaultDisplayedFTSDataColumns()
631 .toArray(new Object[0]);
633 if (sourceTabbedPane.getTitleAt(index).equals(searchTabTitle))
635 btn_back.setEnabled(true);
636 btn_cancel.setEnabled(true);
637 refreshPaginatorState();
638 txt_search.getComponent().setEnabled(true);
639 cmb_searchTarget.setEnabled(true);
640 if (wantedFieldsUpdated())
643 paginatorCart.clear();
652 tabbedPane.addChangeListener(changeListener);
653 tabbedPane.setPreferredSize(new Dimension(width, height));
654 tabbedPane.add(searchTabTitle, scrl_searchResult);
655 tabbedPane.add(configureCols, new FTSDataColumnPreferences(
656 PreferenceSource.SEARCH_SUMMARY, getFTSRestClient()));
658 pnl_actions.add(btn_back);
659 pnl_actions.add(btn_ok);
660 pnl_actions.add(btn_cancel);
662 pnl_results.add(tabbedPane);
663 pnl_inputs.add(cmb_searchTarget);
664 pnl_inputs.add(txt_search.getComponent());
665 pnl_inputs.add(btn_autosearch);
666 pnl_inputs.add(lbl_loading);
667 pnl_inputs.add(lbl_warning);
668 pnl_inputs.add(lbl_blank);
669 pnl_inputs.add(btn_prev_page);
670 pnl_inputs.add(btn_next_page);
672 this.setLayout(mainLayout);
673 this.add(pnl_inputs, java.awt.BorderLayout.NORTH);
674 this.add(pnl_results, java.awt.BorderLayout.CENTER);
675 this.add(pnl_actions, java.awt.BorderLayout.SOUTH);
676 mainFrame.setVisible(true);
679 tabs.setOpaque(true);
680 tabs.insertTab(MessageManager.getString("label.free_text_search"),
682 mainFrame.setContentPane(tabs);
683 tabs.setVisible(true);
687 mainFrame.setContentPane(this);
689 mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
690 mainFrame.addInternalFrameListener(
691 new javax.swing.event.InternalFrameAdapter()
694 public void internalFrameClosing(InternalFrameEvent e)
699 mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
700 Integer x = getTempUserPrefs().get("FTSPanel.x");
701 Integer y = getTempUserPrefs().get("FTSPanel.y");
702 if (x != null && y != null)
704 mainFrame.setLocation(x, y);
706 Desktop.addInternalFrame(mainFrame, getFTSFrameTitle(), width, height);
709 protected void closeAction()
711 getTempUserPrefs().put("FTSPanel.width", this.getWidth());
712 getTempUserPrefs().put("FTSPanel.height", pnl_results.getHeight());
713 getTempUserPrefs().put("FTSPanel.x", mainFrame.getX());
714 getTempUserPrefs().put("FTSPanel.y", mainFrame.getY());
716 txt_search.persistCache();
719 public class DeferredTextInputListener implements DocumentListener
721 private final Timer swingTimer;
723 public DeferredTextInputListener(int timeOut, ActionListener listener,
726 swingTimer = new Timer(timeOut, listener);
727 swingTimer.setRepeats(repeats);
741 public void insertUpdate(DocumentEvent e)
743 swingTimer.restart();
747 public void removeUpdate(DocumentEvent e)
749 swingTimer.restart();
753 public void changedUpdate(DocumentEvent e)
755 swingTimer.restart();
760 void performSearchAction()
762 String typed = getTypedText();
763 if (typed != null && typed.length() > 0
764 && !typed.equalsIgnoreCase(lastSearchTerm))
767 paginatorCart.clear();
768 lastSearchTerm = typed;
772 public boolean wantedFieldsUpdated()
774 if (previousWantedFields == null)
779 return Arrays.equals(getFTSRestClient()
780 .getAllDefaultDisplayedFTSDataColumns().toArray(new Object[0]),
781 previousWantedFields) ? false : true;
785 public void validateSelection()
787 if (tbl_summary.getSelectedRows().length > 0
788 || !paginatorCart.isEmpty())
790 btn_ok.setEnabled(true);
794 btn_ok.setEnabled(false);
798 public JComboBox<FTSDataColumnI> getCmbSearchTarget()
800 return cmb_searchTarget;
803 public JInternalFrame getMainFrame()
808 protected void delayAndEnableActionButtons()
818 } catch (InterruptedException e)
822 btn_ok.setEnabled(true);
823 btn_back.setEnabled(true);
824 btn_cancel.setEnabled(true);
829 protected void checkForErrors()
831 lbl_warning.setVisible(false);
832 lbl_blank.setVisible(true);
833 if (errorWarning.length() > 0)
835 lbl_loading.setVisible(false);
836 lbl_blank.setVisible(false);
837 lbl_warning.setToolTipText(
838 JvSwingUtils.wrapTooltip(true, errorWarning.toString()));
839 lbl_warning.setVisible(true);
844 * Action on Back button is to close this panel and open a new Sequence
847 public void btn_back_ActionPerformed()
850 new SequenceFetcher(progressIndicator);
853 protected void disableActionButtons()
855 btn_ok.setEnabled(false);
856 btn_back.setEnabled(false);
857 btn_cancel.setEnabled(false);
860 public void btn_cancel_ActionPerformed()
866 * Populates search target combo-box options
868 public void populateCmbSearchTargetOptions()
870 List<FTSDataColumnI> searchableTargets = new ArrayList<>();
873 Collection<FTSDataColumnI> foundFTSTargets = getFTSRestClient()
874 .getSearchableDataColumns();
875 searchableTargets.addAll(foundFTSTargets);
876 } catch (Exception e)
881 Collections.sort(searchableTargets, new Comparator<FTSDataColumnI>()
884 public int compare(FTSDataColumnI o1, FTSDataColumnI o2)
886 return o1.getName().compareTo(o2.getName());
890 for (FTSDataColumnI searchTarget : searchableTargets)
892 cmb_searchTarget.addItem(searchTarget);
896 public void transferToSequenceFetcher(String ids)
898 seqFetcher.setQuery(ids);
899 Thread worker = new Thread(seqFetcher);
904 public String getTypedText()
906 return txt_search.getUserInput();
910 public JTable getResultTable()
917 lbl_loading.setVisible(false);
918 errorWarning.setLength(0);
919 lbl_warning.setVisible(false);
920 lbl_blank.setVisible(true);
921 btn_ok.setEnabled(false);
922 mainFrame.setTitle(getFTSFrameTitle());
924 tbl_summary.setModel(new DefaultTableModel());
925 tbl_summary.setVisible(false);
929 public void setPrevPageButtonEnabled(boolean isEnabled)
931 btn_prev_page.setEnabled(isEnabled);
935 public void setNextPageButtonEnabled(boolean isEnabled)
937 btn_next_page.setEnabled(isEnabled);
941 public void setErrorMessage(String message)
943 errorWarning.append(message);
947 public void updateSearchFrameTitle(String title)
949 mainFrame.setTitle(title);
953 public void setSearchInProgress(Boolean isSearchInProgress)
955 lbl_blank.setVisible(!isSearchInProgress);
956 lbl_loading.setVisible(isSearchInProgress);
957 txt_search.setEditable(!isSearchInProgress);
961 public void prevPageAction()
963 updatePaginatorCart();
964 if (offSet >= pageLimit)
966 offSet = offSet - pageLimit;
971 refreshPaginatorState();
976 public void nextPageAction()
978 updatePaginatorCart();
979 offSet = offSet + pageLimit;
983 public void updatePaginatorCart()
985 int primaryKeyColIndex = 0;
986 JTable resultTable = getResultTable();
987 int totalRows = resultTable.getRowCount();
990 primaryKeyColIndex = getFTSRestClient()
991 .getPrimaryKeyColumIndex(wantedFields, false);
992 } catch (Exception e)
997 for (int row = 0; row < totalRows; row++)
999 String id = (String) resultTable.getValueAt(row, primaryKeyColIndex);
1000 if (paginatorCart.contains(id))
1002 paginatorCart.remove(id);
1005 int[] selectedRows = resultTable.getSelectedRows();
1006 for (int summaryRow : selectedRows)
1008 String idStr = resultTable.getValueAt(summaryRow, primaryKeyColIndex)
1010 paginatorCart.add(idStr);
1014 public void updateSummaryTableSelections()
1016 JTable resultTable = getResultTable();
1017 if (paginatorCart.isEmpty())
1021 int primaryKeyColIndex = 0;
1024 primaryKeyColIndex = getFTSRestClient()
1025 .getPrimaryKeyColumIndex(wantedFields, false);
1026 } catch (Exception e)
1028 e.printStackTrace();
1030 int totalRows = resultTable.getRowCount();
1031 for (int row = 0; row < totalRows; row++)
1033 String id = (String) resultTable.getValueAt(row, primaryKeyColIndex);
1034 if (paginatorCart.contains(id))
1036 resultTable.addRowSelectionInterval(row, row);
1039 validateSelection();
1042 public void refreshPaginatorState()
1044 setPrevPageButtonEnabled(false);
1045 setNextPageButtonEnabled(false);
1046 if (resultSetCount == 0 && pageLimit == 0)
1050 if (resultSetCount >= pageLimit)
1052 setNextPageButtonEnabled(true);
1054 if (offSet >= pageLimit)
1056 setPrevPageButtonEnabled(true);
1060 public void refresh()
1062 mainFrame.setTitle(getFTSFrameTitle());
1066 public abstract void okAction();