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 tempUserPrefs.put("structureChooser.width", pnl_filter.getWidth());
658 tempUserPrefs.put("structureChooser.height",
659 pnl_filter.getHeight() - 76);
660 tempUserPrefs.put("structureChooser.x", mainFrame.getX());
661 tempUserPrefs.put("structureChooser.y", mainFrame.getY());
665 public boolean wantedFieldsUpdated()
667 if (previousWantedFields == null)
672 FTSDataColumnI[] currentWantedFields = pdbDocFieldPrefs
673 .getStructureSummaryFields().toArray(new FTSDataColumnI[0]);
674 return Arrays.equals(currentWantedFields, previousWantedFields) ? false
681 * Event listener for the 'filter' combo-box and 'invert' check-box
683 public void itemStateChanged(ItemEvent e)
689 * This inner class provides the data model for the structure filter combo-box
694 public class FilterOption
698 private String value;
702 private boolean addSeparatorAfter;
706 * Model for structure filter option
709 * - the name of the Option
711 * - the value of the option
713 * - the category of the filter option
714 * @param addSeparatorAfter
715 * - if true, a horizontal separator is rendered immediately after
716 * this filter option, otherwise
719 public FilterOption(String name, String value, String view,
720 boolean addSeparatorAfter)
725 this.addSeparatorAfter = addSeparatorAfter;
728 public String getName()
733 public void setName(String name)
738 public String getValue()
743 public void setValue(String value)
748 public String getView()
753 public void setView(String view)
759 public String toString()
764 public boolean isAddSeparatorAfter()
766 return addSeparatorAfter;
769 public void setAddSeparatorAfter(boolean addSeparatorAfter)
771 this.addSeparatorAfter = addSeparatorAfter;
776 * This inner class provides the provides the data model for associate
777 * sequence combo-box - cmb_assSeq
782 public class AssociateSeqOptions
784 private SequenceI sequence;
788 public AssociateSeqOptions(SequenceI seq)
791 this.name = (seq.getName().length() >= 23) ? seq.getName().substring(
792 0, 23) : seq.getName();
795 public AssociateSeqOptions(String name, SequenceI seq)
802 public String toString()
807 public String getName()
812 public void setName(String name)
817 public SequenceI getSequence()
822 public void setSequence(SequenceI sequence)
824 this.sequence = sequence;
830 * This inner class holds the Layout and configuration of the panel which
831 * handles association of manually fetched structures to a unique sequence
832 * when more than one sequence selection is made
837 public class AssciateSeqPanel extends JPanel implements ItemListener
839 private JComboBox<AssociateSeqOptions> cmb_assSeq = new JComboBox<AssociateSeqOptions>();
841 private JLabel lbl_associateSeq = new JLabel();
843 public AssciateSeqPanel()
845 this.setLayout(new FlowLayout());
846 this.add(cmb_assSeq);
847 this.add(lbl_associateSeq);
848 cmb_assSeq.setToolTipText(MessageManager
849 .getString("info.associate_wit_sequence"));
850 cmb_assSeq.addItemListener(this);
853 public void loadCmbAssSeq()
855 populateCmbAssociateSeqOptions(cmb_assSeq, lbl_associateSeq);
858 public JComboBox<AssociateSeqOptions> getCmb_assSeq()
863 public void setCmb_assSeq(JComboBox<AssociateSeqOptions> cmb_assSeq)
865 this.cmb_assSeq = cmb_assSeq;
869 public void itemStateChanged(ItemEvent e)
871 if (e.getStateChange() == ItemEvent.SELECTED)
873 cmbAssSeqStateChanged();
878 public JTable getResultTable()
883 public JComboBox<FilterOption> getCmbFilterOption()
885 return cmb_filterOption;
890 * Custom ListCellRenderer for adding a separator between different categories
891 * of structure chooser filter option drop-down.
897 public JTable getPhyreResultTable()
899 return tbl_phyre2_summary;
903 public abstract class CustomComboSeparatorsRenderer implements
904 ListCellRenderer<Object>
906 private ListCellRenderer<Object> regent;
908 private JPanel separatorPanel = new JPanel(new BorderLayout());
910 private JSeparator jSeparator = new JSeparator();
912 public CustomComboSeparatorsRenderer(ListCellRenderer<Object> listCellRenderer)
914 this.regent = listCellRenderer;
918 public Component getListCellRendererComponent(JList list,
920 int index, boolean isSelected, boolean cellHasFocus)
923 Component comp = regent.getListCellRendererComponent(list, value,
924 index, isSelected, cellHasFocus);
926 && addSeparatorAfter(list, (FilterOption) value, index))
928 separatorPanel.removeAll();
929 separatorPanel.add(comp, BorderLayout.CENTER);
930 separatorPanel.add(jSeparator, BorderLayout.SOUTH);
931 return separatorPanel;
939 protected abstract boolean addSeparatorAfter(JList list,
944 protected abstract void stateChanged(ItemEvent e);
946 protected abstract void ok_ActionPerformed();
948 protected abstract void pdbFromFile_actionPerformed();
950 protected abstract void txt_search_ActionPerformed();
952 public abstract void populateCmbAssociateSeqOptions(
953 JComboBox<AssociateSeqOptions> cmb_assSeq, JLabel lbl_associateSeq);
955 public abstract void cmbAssSeqStateChanged();
957 public abstract void tabRefresh();
959 public abstract void validateSelections();
961 public abstract void predict3DModelWithPhyre2();