2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
3 * Copyright (C) 2014 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.jbgui;
24 import jalview.datamodel.SequenceI;
25 import jalview.fts.api.FTSDataColumnI;
26 import jalview.fts.core.FTSDataColumnPreferences;
27 import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
28 import jalview.fts.service.pdb.PDBFTSRestClient;
29 import jalview.gui.AlignmentPanel;
30 import jalview.gui.Desktop;
31 import jalview.gui.JvSummaryTable;
32 import jalview.gui.JvSwingUtils;
33 import jalview.util.MessageManager;
35 import java.awt.BorderLayout;
36 import java.awt.CardLayout;
37 import java.awt.Component;
38 import java.awt.Dimension;
39 import java.awt.FlowLayout;
40 import java.awt.GridLayout;
41 import java.awt.event.ActionEvent;
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.util.Arrays;
49 import java.util.HashMap;
52 import javax.swing.ImageIcon;
53 import javax.swing.JButton;
54 import javax.swing.JCheckBox;
55 import javax.swing.JComboBox;
56 import javax.swing.JFrame;
57 import javax.swing.JInternalFrame;
58 import javax.swing.JLabel;
59 import javax.swing.JList;
60 import javax.swing.JPanel;
61 import javax.swing.JScrollPane;
62 import javax.swing.JSeparator;
63 import javax.swing.JTabbedPane;
64 import javax.swing.JTable;
65 import javax.swing.JTextField;
66 import javax.swing.ListCellRenderer;
67 import javax.swing.event.ChangeEvent;
68 import javax.swing.event.ChangeListener;
69 import javax.swing.event.DocumentEvent;
70 import javax.swing.event.DocumentListener;
71 import javax.swing.event.InternalFrameEvent;
73 @SuppressWarnings("serial")
75 * GUI layout for structure chooser
79 public abstract class GStructureChooser extends JPanel implements
82 protected JPanel statusPanel = new JPanel();
84 public JLabel statusBar = new JLabel();
86 private JPanel pnl_actionsAndStatus = new JPanel(new BorderLayout());
88 protected String frameTitle = MessageManager
89 .getString("label.structure_chooser");
91 protected JInternalFrame mainFrame = new JInternalFrame(frameTitle);
93 protected JComboBox<FilterOption> cmb_filterOption = new JComboBox<FilterOption>();
95 protected AlignmentPanel ap;
97 protected StringBuilder errorWarning = new StringBuilder();
99 protected JLabel lbl_result = new JLabel(
100 MessageManager.getString("label.select"));
102 protected JButton btn_view = new JButton();
104 protected JButton btn_cancel = new JButton();
106 protected JButton btn_pdbFromFile = new JButton();
108 protected JButton btn_runPhyre2Prediction = new JButton();
110 protected JTextField txt_search = new JTextField(14);
112 private JPanel pnl_actions = new JPanel();
114 private JPanel pnl_main = new JPanel();
116 private JPanel pnl_idInput = new JPanel(new FlowLayout());
118 private JPanel pnl_fileChooser = new JPanel(new FlowLayout());
120 private JPanel pnl_phyre2Prediction = new JPanel(new FlowLayout());
122 private JPanel pnl_phyre2PredictionBL = new JPanel(new BorderLayout());
124 private JPanel pnl_idInputBL = new JPanel(new BorderLayout());
126 private JPanel pnl_fileChooserBL = new JPanel(new BorderLayout());
128 private JPanel pnl_locPDB = new JPanel(new BorderLayout());
130 protected JPanel pnl_switchableViews = new JPanel(new CardLayout());
132 protected CardLayout layout_switchableViews = (CardLayout) (pnl_switchableViews
135 private BorderLayout mainLayout = new BorderLayout();
137 protected JCheckBox chk_rememberSettings = new JCheckBox(
138 MessageManager.getString("label.dont_ask_me_again"));
140 protected JCheckBox chk_invertFilter = new JCheckBox(
141 MessageManager.getString("label.invert"));
143 protected ImageIcon loadingImage = new ImageIcon(getClass().getResource(
144 "/images/loading.gif"));
146 protected ImageIcon goodImage = new ImageIcon(getClass().getResource(
147 "/images/good.png"));
149 protected ImageIcon errorImage = new ImageIcon(getClass().getResource(
150 "/images/error.png"));
152 protected ImageIcon warningImage = new ImageIcon(getClass().getResource(
153 "/images/warning.gif"));
155 protected JLabel lbl_warning = new JLabel(warningImage);
157 protected JLabel lbl_loading = new JLabel(loadingImage);
159 protected JLabel lbl_pdbManualFetchStatus = new JLabel(errorImage);
161 protected JLabel lbl_fromFileStatus = new JLabel(errorImage);
163 protected AssciateSeqPanel phyre2InputAssSeqPanel = new AssciateSeqPanel();
165 protected AssciateSeqPanel idInputAssSeqPanel = new AssciateSeqPanel();
167 protected AssciateSeqPanel fileChooserAssSeqPanel = new AssciateSeqPanel();
169 protected static final String VIEWS_FILTER = "VIEWS_FILTER";
171 protected static final String VIEWS_FROM_FILE = "VIEWS_FROM_FILE";
173 protected static final String VIEWS_ENTER_ID = "VIEWS_ENTER_ID";
175 protected static final String VIEWS_LOCAL_PDB = "VIEWS_LOCAL_PDB";
177 protected static final String VIEWS_PHYRE2_PREDICTION = "VIEWS_PHYRE2_PREDICTION";
179 protected JTable tbl_local_pdb = new JTable();
181 protected JScrollPane scrl_localPDB = new JScrollPane(tbl_local_pdb);
183 protected JTabbedPane pnl_filter = new JTabbedPane();
185 protected FTSDataColumnPreferences pdbDocFieldPrefs = new FTSDataColumnPreferences(
186 PreferenceSource.STRUCTURE_CHOOSER,
187 PDBFTSRestClient.getInstance());
189 protected FTSDataColumnI[] previousWantedFields;
191 protected static Map<String, Integer> tempUserPrefs = new HashMap<String, Integer>();
193 private JTable tbl_summary = new JvSummaryTable(tempUserPrefs);
196 protected JScrollPane scrl_foundStructures = new JScrollPane(tbl_summary);
198 JPanel phyreResultPanel = new JPanel(new BorderLayout());
200 protected static Map<String, Integer> tempPrefsForPhyre = new HashMap<String, Integer>();
202 private JTable tbl_phyre2_summary = new JvSummaryTable(tempPrefsForPhyre);
204 protected JScrollPane scrl_phyre2Summary = new JScrollPane(
207 public GStructureChooser()
212 mainFrame.setVisible(false);
213 mainFrame.invalidate();
215 } catch (Exception e)
222 * Initializes the GUI default properties
226 @SuppressWarnings("unchecked")
227 private void jbInit() throws Exception
229 Integer width = tempUserPrefs.get("structureChooser.width") == null ? 800
230 : tempUserPrefs.get("structureChooser.width");
231 Integer height = tempUserPrefs.get("structureChooser.height") == null ? 400
232 : tempUserPrefs.get("structureChooser.height");
233 tbl_summary.setAutoCreateRowSorter(true);
234 tbl_summary.getTableHeader().setReorderingAllowed(false);
235 tbl_summary.addMouseListener(new MouseAdapter()
238 public void mouseClicked(MouseEvent e)
240 validateSelections();
244 public void mouseReleased(MouseEvent e)
246 validateSelections();
249 tbl_summary.addKeyListener(new KeyAdapter()
252 public void keyPressed(KeyEvent evt)
254 validateSelections();
255 switch (evt.getKeyCode())
257 case KeyEvent.VK_ESCAPE: // escape key
260 case KeyEvent.VK_ENTER: // enter key
261 if (btn_view.isEnabled())
263 ok_ActionPerformed();
266 case KeyEvent.VK_TAB: // tab key
267 if (evt.isShiftDown())
269 pnl_filter.requestFocus();
273 btn_view.requestFocus();
282 tbl_local_pdb.setAutoCreateRowSorter(true);
283 tbl_local_pdb.getTableHeader().setReorderingAllowed(false);
284 tbl_local_pdb.addMouseListener(new MouseAdapter()
287 public void mouseClicked(MouseEvent e)
289 validateSelections();
293 public void mouseReleased(MouseEvent e)
295 validateSelections();
298 tbl_local_pdb.addKeyListener(new KeyAdapter()
301 public void keyPressed(KeyEvent evt)
303 validateSelections();
304 switch (evt.getKeyCode())
306 case KeyEvent.VK_ESCAPE: // escape key
309 case KeyEvent.VK_ENTER: // enter key
310 if (btn_view.isEnabled())
312 ok_ActionPerformed();
315 case KeyEvent.VK_TAB: // tab key
316 if (evt.isShiftDown())
318 cmb_filterOption.requestFocus();
322 if (btn_view.isEnabled())
324 btn_view.requestFocus();
328 btn_cancel.requestFocus();
338 btn_view.setFont(new java.awt.Font("Verdana", 0, 12));
339 btn_view.setText(MessageManager.getString("action.view"));
340 btn_view.addActionListener(new java.awt.event.ActionListener()
343 public void actionPerformed(ActionEvent e)
345 ok_ActionPerformed();
348 btn_view.addKeyListener(new KeyAdapter()
351 public void keyPressed(KeyEvent evt)
353 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
355 ok_ActionPerformed();
360 btn_cancel.setFont(new java.awt.Font("Verdana", 0, 12));
361 btn_cancel.setText(MessageManager.getString("action.cancel"));
362 btn_cancel.addActionListener(new java.awt.event.ActionListener()
365 public void actionPerformed(ActionEvent e)
367 closeAction(pnl_filter.getHeight());
370 btn_cancel.addKeyListener(new KeyAdapter()
373 public void keyPressed(KeyEvent evt)
375 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
377 closeAction(pnl_filter.getHeight());
382 btn_pdbFromFile.setFont(new java.awt.Font("Verdana", 0, 12));
383 String btn_title = MessageManager.getString("label.select_pdb_file");
384 btn_pdbFromFile.setText(btn_title + " ");
385 btn_pdbFromFile.addActionListener(new java.awt.event.ActionListener()
388 public void actionPerformed(ActionEvent e)
390 pdbFromFile_actionPerformed();
393 btn_pdbFromFile.addKeyListener(new KeyAdapter()
396 public void keyPressed(KeyEvent evt)
398 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
400 pdbFromFile_actionPerformed();
405 btn_pdbFromFile.setFont(new java.awt.Font("Verdana", 0, 12));
406 tbl_phyre2_summary.setAutoCreateRowSorter(true);
407 tbl_phyre2_summary.getTableHeader().setReorderingAllowed(false);
409 tbl_phyre2_summary.addMouseListener(new MouseAdapter()
412 public void mouseClicked(MouseEvent e)
414 validateSelections();
418 public void mouseReleased(MouseEvent e)
420 validateSelections();
423 tbl_phyre2_summary.addKeyListener(new KeyAdapter()
426 public void keyPressed(KeyEvent evt)
428 validateSelections();
429 switch (evt.getKeyCode())
431 case KeyEvent.VK_ESCAPE: // escape key
434 case KeyEvent.VK_ENTER: // enter key
435 if (btn_view.isEnabled())
437 ok_ActionPerformed();
440 case KeyEvent.VK_TAB: // tab key
441 if (evt.isShiftDown())
443 cmb_filterOption.requestFocus();
447 if (btn_view.isEnabled())
449 btn_view.requestFocus();
453 btn_cancel.requestFocus();
464 String btn_runPhyre2Prediction_title = MessageManager
465 .getString("label.run_phyre2_prediction");
466 btn_runPhyre2Prediction
467 .setText(btn_runPhyre2Prediction_title + " ");
468 btn_runPhyre2Prediction
469 .addActionListener(new java.awt.event.ActionListener()
472 public void actionPerformed(ActionEvent e)
474 predict3DModelWithPhyre2();
477 btn_runPhyre2Prediction.addKeyListener(new KeyAdapter()
480 public void keyPressed(KeyEvent evt)
482 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
484 predict3DModelWithPhyre2();
489 scrl_foundStructures.setPreferredSize(new Dimension(width, height));
491 scrl_localPDB.setPreferredSize(new Dimension(width, height));
493 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
495 cmb_filterOption.setFont(new java.awt.Font("Verdana", 0, 12));
496 chk_invertFilter.setFont(new java.awt.Font("Verdana", 0, 12));
497 chk_rememberSettings.setFont(new java.awt.Font("Verdana", 0, 12));
498 chk_rememberSettings.setVisible(false);
499 txt_search.setToolTipText(JvSwingUtils.wrapTooltip(true,
500 MessageManager.getString("label.enter_pdb_id")));
501 cmb_filterOption.setToolTipText(MessageManager
502 .getString("info.select_filter_option"));
503 txt_search.getDocument().addDocumentListener(new DocumentListener()
506 public void insertUpdate(DocumentEvent e)
508 txt_search_ActionPerformed();
512 public void removeUpdate(DocumentEvent e)
514 txt_search_ActionPerformed();
518 public void changedUpdate(DocumentEvent e)
520 txt_search_ActionPerformed();
524 cmb_filterOption.addItemListener(this);
526 // add CustomComboSeparatorsRenderer to filter option combo-box
527 cmb_filterOption.setRenderer(new CustomComboSeparatorsRenderer(
528 (ListCellRenderer<Object>) cmb_filterOption.getRenderer())
531 protected boolean addSeparatorAfter(JList list, FilterOption value,
534 return value.isAddSeparatorAfter();
538 chk_invertFilter.addItemListener(this);
540 pnl_actions.add(chk_rememberSettings);
541 pnl_actions.add(btn_view);
542 pnl_actions.add(btn_cancel);
544 // pnl_filter.add(lbl_result);
545 pnl_main.add(cmb_filterOption);
546 pnl_main.add(lbl_loading);
547 pnl_main.add(chk_invertFilter);
548 lbl_loading.setVisible(false);
550 pnl_fileChooser.add(btn_pdbFromFile);
551 pnl_fileChooser.add(lbl_fromFileStatus);
552 pnl_fileChooserBL.add(fileChooserAssSeqPanel, BorderLayout.NORTH);
553 pnl_fileChooserBL.add(pnl_fileChooser, BorderLayout.CENTER);
555 scrl_phyre2Summary.setPreferredSize(new Dimension(width, height));
557 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
559 phyreResultPanel.add(pnl_phyre2Prediction, BorderLayout.NORTH);
560 phyreResultPanel.add(scrl_phyre2Summary, BorderLayout.CENTER);
562 pnl_phyre2Prediction.add(btn_runPhyre2Prediction);
563 pnl_phyre2PredictionBL.add(phyre2InputAssSeqPanel, BorderLayout.NORTH);
564 pnl_phyre2PredictionBL.add(phyreResultPanel, BorderLayout.CENTER);
566 pnl_idInput.add(txt_search);
567 pnl_idInput.add(lbl_pdbManualFetchStatus);
568 pnl_idInputBL.add(idInputAssSeqPanel, BorderLayout.NORTH);
569 pnl_idInputBL.add(pnl_idInput, BorderLayout.CENTER);
571 final String foundStructureSummary = MessageManager
572 .getString("label.found_structures_summary");
573 final String configureCols = MessageManager
574 .getString("label.configure_displayed_columns");
575 ChangeListener changeListener = new ChangeListener()
578 public void stateChanged(ChangeEvent changeEvent)
580 JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent
582 int index = sourceTabbedPane.getSelectedIndex();
583 btn_view.setVisible(true);
584 btn_cancel.setVisible(true);
585 if (sourceTabbedPane.getTitleAt(index).equals(configureCols))
587 btn_view.setEnabled(false);
588 btn_cancel.setEnabled(false);
589 btn_view.setVisible(false);
590 btn_cancel.setVisible(false);
591 previousWantedFields = pdbDocFieldPrefs
592 .getStructureSummaryFields().toArray(
593 new FTSDataColumnI[0]);
595 if (sourceTabbedPane.getTitleAt(index)
596 .equals(foundStructureSummary))
598 btn_cancel.setEnabled(true);
599 if (wantedFieldsUpdated())
605 validateSelections();
610 pnl_filter.addChangeListener(changeListener);
611 pnl_filter.setPreferredSize(new Dimension(width, height));
612 pnl_filter.add(foundStructureSummary, scrl_foundStructures);
613 pnl_filter.add(configureCols, pdbDocFieldPrefs);
615 pnl_locPDB.add(scrl_localPDB);
617 pnl_switchableViews.add(pnl_fileChooserBL, VIEWS_FROM_FILE);
618 pnl_switchableViews.add(pnl_idInputBL, VIEWS_ENTER_ID);
619 pnl_switchableViews.add(pnl_filter, VIEWS_FILTER);
620 pnl_switchableViews.add(pnl_locPDB, VIEWS_LOCAL_PDB);
622 .add(pnl_phyre2PredictionBL, VIEWS_PHYRE2_PREDICTION);
624 this.setLayout(mainLayout);
625 this.add(pnl_main, java.awt.BorderLayout.NORTH);
626 this.add(pnl_switchableViews, java.awt.BorderLayout.CENTER);
627 // this.add(pnl_actions, java.awt.BorderLayout.SOUTH);
628 statusPanel.setLayout(new GridLayout());
629 pnl_actionsAndStatus.add(pnl_actions, BorderLayout.CENTER);
630 pnl_actionsAndStatus.add(statusPanel, BorderLayout.SOUTH);
631 statusPanel.add(statusBar, null);
632 this.add(pnl_actionsAndStatus, java.awt.BorderLayout.SOUTH);
635 .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
638 public void internalFrameClosing(InternalFrameEvent e)
640 closeAction(pnl_filter.getHeight());
643 mainFrame.setVisible(true);
644 mainFrame.setContentPane(this);
645 mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
646 Integer x = tempUserPrefs.get("structureChooser.x");
647 Integer y = tempUserPrefs.get("structureChooser.y");
648 if (x != null && y != null)
650 mainFrame.setLocation(x, y);
652 Desktop.addInternalFrame(mainFrame, frameTitle, width, height);
655 protected void closeAction(int preferredHeight)
657 // System.out.println(">>>>>>>>>> closing internal frame!!!");
658 // System.out.println("width : " + mainFrame.getWidth());
659 // System.out.println("heigh : " + mainFrame.getHeight());
660 // System.out.println("x : " + mainFrame.getX());
661 // System.out.println("y : " + mainFrame.getY());
662 tempUserPrefs.put("structureChooser.width", pnl_filter.getWidth());
663 tempUserPrefs.put("structureChooser.height", preferredHeight);
664 tempUserPrefs.put("structureChooser.x", mainFrame.getX());
665 tempUserPrefs.put("structureChooser.y", mainFrame.getY());
669 public boolean wantedFieldsUpdated()
671 if (previousWantedFields == null)
676 FTSDataColumnI[] currentWantedFields = pdbDocFieldPrefs
677 .getStructureSummaryFields().toArray(new FTSDataColumnI[0]);
678 return Arrays.equals(currentWantedFields, previousWantedFields) ? false
685 * Event listener for the 'filter' combo-box and 'invert' check-box
687 public void itemStateChanged(ItemEvent e)
693 * This inner class provides the data model for the structure filter combo-box
698 public class FilterOption
702 private String value;
706 private boolean addSeparatorAfter;
708 public FilterOption(String name, String value, String view,
709 boolean addSeparatorAfter)
714 this.addSeparatorAfter = addSeparatorAfter;
717 public String getName()
722 public void setName(String name)
727 public String getValue()
732 public void setValue(String value)
737 public String getView()
742 public void setView(String view)
748 public String toString()
753 public boolean isAddSeparatorAfter()
755 return addSeparatorAfter;
758 public void setAddSeparatorAfter(boolean addSeparatorAfter)
760 this.addSeparatorAfter = addSeparatorAfter;
765 * This inner class provides the provides the data model for associate
766 * sequence combo-box - cmb_assSeq
771 public class AssociateSeqOptions
773 private SequenceI sequence;
777 public AssociateSeqOptions(SequenceI seq)
780 this.name = (seq.getName().length() >= 23) ? seq.getName().substring(
781 0, 23) : seq.getName();
784 public AssociateSeqOptions(String name, SequenceI seq)
791 public String toString()
796 public String getName()
801 public void setName(String name)
806 public SequenceI getSequence()
811 public void setSequence(SequenceI sequence)
813 this.sequence = sequence;
819 * This inner class holds the Layout and configuration of the panel which
820 * handles association of manually fetched structures to a unique sequence
821 * when more than one sequence selection is made
826 public class AssciateSeqPanel extends JPanel implements ItemListener
828 private JComboBox<AssociateSeqOptions> cmb_assSeq = new JComboBox<AssociateSeqOptions>();
830 private JLabel lbl_associateSeq = new JLabel();
832 public AssciateSeqPanel()
834 this.setLayout(new FlowLayout());
835 this.add(cmb_assSeq);
836 this.add(lbl_associateSeq);
837 cmb_assSeq.setToolTipText(MessageManager
838 .getString("info.associate_wit_sequence"));
839 cmb_assSeq.addItemListener(this);
842 public void loadCmbAssSeq()
844 populateCmbAssociateSeqOptions(cmb_assSeq, lbl_associateSeq);
847 public JComboBox<AssociateSeqOptions> getCmb_assSeq()
852 public void setCmb_assSeq(JComboBox<AssociateSeqOptions> cmb_assSeq)
854 this.cmb_assSeq = cmb_assSeq;
858 public void itemStateChanged(ItemEvent e)
860 if (e.getStateChange() == ItemEvent.SELECTED)
862 cmbAssSeqStateChanged();
867 public JTable getResultTable()
872 public JComboBox<FilterOption> getCmbFilterOption()
874 return cmb_filterOption;
878 public JTable getPhyreResultTable()
880 return tbl_phyre2_summary;
883 public abstract class CustomComboSeparatorsRenderer implements
884 ListCellRenderer<Object>
886 private ListCellRenderer<Object> regent;
888 private JPanel separatorPanel = new JPanel(new BorderLayout());
890 private JSeparator jSeparator = new JSeparator();
892 public CustomComboSeparatorsRenderer(ListCellRenderer<Object> listCellRenderer)
894 this.regent = listCellRenderer;
898 public Component getListCellRendererComponent(JList list,
900 int index, boolean isSelected, boolean cellHasFocus)
903 Component comp = regent.getListCellRendererComponent(list, value,
904 index, isSelected, cellHasFocus);
906 && addSeparatorAfter(list, (FilterOption) value, index))
908 separatorPanel.removeAll();
909 separatorPanel.add(comp, BorderLayout.CENTER);
910 separatorPanel.add(jSeparator, BorderLayout.SOUTH);
911 return separatorPanel;
919 protected abstract boolean addSeparatorAfter(JList list,
924 protected abstract void stateChanged(ItemEvent e);
926 protected abstract void ok_ActionPerformed();
928 protected abstract void pdbFromFile_actionPerformed();
930 protected abstract void txt_search_ActionPerformed();
932 public abstract void populateCmbAssociateSeqOptions(
933 JComboBox<AssociateSeqOptions> cmb_assSeq, JLabel lbl_associateSeq);
935 public abstract void cmbAssSeqStateChanged();
937 public abstract void tabRefresh();
939 public abstract void validateSelections();
941 public abstract void predict3DModelWithPhyre2();