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.JvSwingUtils;
32 import jalview.util.MessageManager;
34 import java.awt.BorderLayout;
35 import java.awt.CardLayout;
36 import java.awt.Dimension;
37 import java.awt.FlowLayout;
38 import java.awt.GridLayout;
39 import java.awt.event.ActionEvent;
40 import java.awt.event.ItemEvent;
41 import java.awt.event.ItemListener;
42 import java.awt.event.KeyAdapter;
43 import java.awt.event.KeyEvent;
44 import java.awt.event.MouseAdapter;
45 import java.awt.event.MouseEvent;
46 import java.util.Arrays;
48 import javax.swing.ImageIcon;
49 import javax.swing.JButton;
50 import javax.swing.JCheckBox;
51 import javax.swing.JComboBox;
52 import javax.swing.JFrame;
53 import javax.swing.JInternalFrame;
54 import javax.swing.JLabel;
55 import javax.swing.JPanel;
56 import javax.swing.JScrollPane;
57 import javax.swing.JTabbedPane;
58 import javax.swing.JTable;
59 import javax.swing.JTextField;
60 import javax.swing.event.ChangeEvent;
61 import javax.swing.event.ChangeListener;
62 import javax.swing.event.DocumentEvent;
63 import javax.swing.event.DocumentListener;
64 import javax.swing.table.TableColumn;
66 @SuppressWarnings("serial")
68 * GUI layout for structure chooser
72 public abstract class GStructureChooser extends JPanel implements
75 protected JPanel statusPanel = new JPanel();
77 public JLabel statusBar = new JLabel();
79 private JPanel pnl_actionsAndStatus = new JPanel(new BorderLayout());
81 protected String frameTitle = MessageManager
82 .getString("label.structure_chooser");
84 protected JInternalFrame mainFrame = new JInternalFrame(frameTitle);
86 protected JComboBox<FilterOption> cmb_filterOption = new JComboBox<FilterOption>();
88 protected AlignmentPanel ap;
90 protected StringBuilder errorWarning = new StringBuilder();
92 protected JLabel lbl_result = new JLabel(
93 MessageManager.getString("label.select"));
95 protected JButton btn_view = new JButton();
97 protected JButton btn_cancel = new JButton();
99 protected JButton btn_pdbFromFile = new JButton();
101 protected JTextField txt_search = new JTextField(14);
103 private JPanel pnl_actions = new JPanel();
105 private JPanel pnl_main = new JPanel();
107 private JPanel pnl_idInput = new JPanel(new FlowLayout());
109 private JPanel pnl_fileChooser = new JPanel(new FlowLayout());
111 private JPanel pnl_idInputBL = new JPanel(new BorderLayout());
113 private JPanel pnl_fileChooserBL = new JPanel(new BorderLayout());
115 private JPanel pnl_locPDB = new JPanel(new BorderLayout());
117 protected JPanel pnl_switchableViews = new JPanel(new CardLayout());
119 protected CardLayout layout_switchableViews = (CardLayout) (pnl_switchableViews
122 private BorderLayout mainLayout = new BorderLayout();
124 protected JCheckBox chk_rememberSettings = new JCheckBox(
125 MessageManager.getString("label.dont_ask_me_again"));
127 protected JCheckBox chk_invertFilter = new JCheckBox(
128 MessageManager.getString("label.invert"));
130 protected ImageIcon loadingImage = new ImageIcon(getClass().getResource(
131 "/images/loading.gif"));
133 protected ImageIcon goodImage = new ImageIcon(getClass().getResource(
134 "/images/good.png"));
136 protected ImageIcon errorImage = new ImageIcon(getClass().getResource(
137 "/images/error.png"));
139 protected ImageIcon warningImage = new ImageIcon(getClass().getResource(
140 "/images/warning.gif"));
142 protected JLabel lbl_warning = new JLabel(warningImage);
144 protected JLabel lbl_loading = new JLabel(loadingImage);
146 protected JLabel lbl_pdbManualFetchStatus = new JLabel(errorImage);
148 protected JLabel lbl_fromFileStatus = new JLabel(errorImage);
150 protected AssciateSeqPanel idInputAssSeqPanel = new AssciateSeqPanel();
152 protected AssciateSeqPanel fileChooserAssSeqPanel = new AssciateSeqPanel();
154 protected static final String VIEWS_FILTER = "VIEWS_FILTER";
156 protected static final String VIEWS_FROM_FILE = "VIEWS_FROM_FILE";
158 protected static final String VIEWS_ENTER_ID = "VIEWS_ENTER_ID";
160 protected static final String VIEWS_LOCAL_PDB = "VIEWS_LOCAL_PDB";
162 protected JTable tbl_local_pdb = new JTable();
164 protected JScrollPane scrl_localPDB = new JScrollPane(tbl_local_pdb);
166 private JTabbedPane pnl_filter = new JTabbedPane();
168 private FTSDataColumnPreferences pdbDocFieldPrefs = new FTSDataColumnPreferences(
169 PreferenceSource.STRUCTURE_CHOOSER,
170 PDBFTSRestClient.getInstance());
172 protected FTSDataColumnI[] previousWantedFields;
174 protected JTable tbl_summary = new JTable()
176 private boolean inLayout;
179 public boolean getScrollableTracksViewportWidth()
181 return hasExcessWidth();
186 public void doLayout()
188 if (hasExcessWidth())
190 autoResizeMode = AUTO_RESIZE_SUBSEQUENT_COLUMNS;
195 autoResizeMode = AUTO_RESIZE_OFF;
198 protected boolean hasExcessWidth()
200 return getPreferredSize().width < getParent().getWidth();
204 public void columnMarginChanged(ChangeEvent e)
210 TableColumn resizingColumn = getTableHeader().getResizingColumn();
211 // Need to do this here, before the parent's
212 // layout manager calls getPreferredSize().
213 if (resizingColumn != null && autoResizeMode == AUTO_RESIZE_OFF
216 resizingColumn.setPreferredWidth(resizingColumn.getWidth());
222 public String getToolTipText(MouseEvent evt)
224 String toolTipText = null;
225 java.awt.Point pnt = evt.getPoint();
226 int rowIndex = rowAtPoint(pnt);
227 int colIndex = columnAtPoint(pnt);
231 if (getValueAt(rowIndex, colIndex) == null)
235 toolTipText = getValueAt(rowIndex, colIndex).toString();
236 } catch (Exception e)
238 // e.printStackTrace();
240 toolTipText = (toolTipText == null ? null
241 : (toolTipText.length() > 500 ? JvSwingUtils.wrapTooltip(
242 true, "\"" + toolTipText.subSequence(0, 500)
243 + "...\"") : JvSwingUtils.wrapTooltip(true,
249 protected JScrollPane scrl_foundStructures = new JScrollPane(tbl_summary);
251 public GStructureChooser()
256 mainFrame.setVisible(false);
257 mainFrame.invalidate();
259 } catch (Exception e)
266 * Initializes the GUI default properties
270 private void jbInit() throws Exception
272 tbl_summary.setAutoCreateRowSorter(true);
273 tbl_summary.getTableHeader().setReorderingAllowed(false);
274 tbl_summary.addMouseListener(new MouseAdapter()
277 public void mouseClicked(MouseEvent e)
279 validateSelections();
283 public void mouseReleased(MouseEvent e)
285 validateSelections();
288 tbl_summary.addKeyListener(new KeyAdapter()
291 public void keyPressed(KeyEvent evt)
293 validateSelections();
294 switch (evt.getKeyCode())
296 case KeyEvent.VK_ESCAPE: // escape key
299 case KeyEvent.VK_ENTER: // enter key
300 if (btn_view.isEnabled())
302 ok_ActionPerformed();
305 case KeyEvent.VK_TAB: // tab key
306 if (evt.isShiftDown())
308 pnl_filter.requestFocus();
312 btn_view.requestFocus();
321 tbl_local_pdb.setAutoCreateRowSorter(true);
322 tbl_local_pdb.getTableHeader().setReorderingAllowed(false);
323 tbl_local_pdb.addMouseListener(new MouseAdapter()
326 public void mouseClicked(MouseEvent e)
328 validateSelections();
332 public void mouseReleased(MouseEvent e)
334 validateSelections();
337 tbl_local_pdb.addKeyListener(new KeyAdapter()
340 public void keyPressed(KeyEvent evt)
342 validateSelections();
343 switch (evt.getKeyCode())
345 case KeyEvent.VK_ESCAPE: // escape key
348 case KeyEvent.VK_ENTER: // enter key
349 if (btn_view.isEnabled())
351 ok_ActionPerformed();
354 case KeyEvent.VK_TAB: // tab key
355 if (evt.isShiftDown())
357 cmb_filterOption.requestFocus();
361 if (btn_view.isEnabled())
363 btn_view.requestFocus();
367 btn_cancel.requestFocus();
376 btn_view.setFont(new java.awt.Font("Verdana", 0, 12));
377 btn_view.setText(MessageManager.getString("action.view"));
378 btn_view.addActionListener(new java.awt.event.ActionListener()
381 public void actionPerformed(ActionEvent e)
383 ok_ActionPerformed();
386 btn_view.addKeyListener(new KeyAdapter()
389 public void keyPressed(KeyEvent evt)
391 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
393 ok_ActionPerformed();
398 btn_cancel.setFont(new java.awt.Font("Verdana", 0, 12));
399 btn_cancel.setText(MessageManager.getString("action.cancel"));
400 btn_cancel.addActionListener(new java.awt.event.ActionListener()
403 public void actionPerformed(ActionEvent e)
408 btn_cancel.addKeyListener(new KeyAdapter()
411 public void keyPressed(KeyEvent evt)
413 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
420 btn_pdbFromFile.setFont(new java.awt.Font("Verdana", 0, 12));
421 String btn_title = MessageManager.getString("label.select_pdb_file");
422 btn_pdbFromFile.setText(btn_title + " ");
423 btn_pdbFromFile.addActionListener(new java.awt.event.ActionListener()
426 public void actionPerformed(ActionEvent e)
428 pdbFromFile_actionPerformed();
431 btn_pdbFromFile.addKeyListener(new KeyAdapter()
434 public void keyPressed(KeyEvent evt)
436 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
438 pdbFromFile_actionPerformed();
443 scrl_foundStructures.setPreferredSize(new Dimension(500, 300));
445 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
447 scrl_localPDB.setPreferredSize(new Dimension(500, 300));
449 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
451 cmb_filterOption.setFont(new java.awt.Font("Verdana", 0, 12));
452 chk_invertFilter.setFont(new java.awt.Font("Verdana", 0, 12));
453 chk_rememberSettings.setFont(new java.awt.Font("Verdana", 0, 12));
454 chk_rememberSettings.setVisible(false);
456 txt_search.setToolTipText(MessageManager
457 .getString("label.enter_pdb_id"));
458 cmb_filterOption.setToolTipText(MessageManager
459 .getString("info.select_filter_option"));
460 txt_search.getDocument().addDocumentListener(new DocumentListener()
463 public void insertUpdate(DocumentEvent e)
465 txt_search_ActionPerformed();
469 public void removeUpdate(DocumentEvent e)
471 txt_search_ActionPerformed();
475 public void changedUpdate(DocumentEvent e)
477 txt_search_ActionPerformed();
481 cmb_filterOption.addItemListener(this);
482 chk_invertFilter.addItemListener(this);
484 pnl_actions.add(chk_rememberSettings);
485 pnl_actions.add(btn_view);
486 pnl_actions.add(btn_cancel);
488 // pnl_filter.add(lbl_result);
489 pnl_main.add(cmb_filterOption);
490 pnl_main.add(lbl_loading);
491 pnl_main.add(chk_invertFilter);
492 lbl_loading.setVisible(false);
494 pnl_fileChooser.add(btn_pdbFromFile);
495 pnl_fileChooser.add(lbl_fromFileStatus);
496 pnl_fileChooserBL.add(fileChooserAssSeqPanel, BorderLayout.NORTH);
497 pnl_fileChooserBL.add(pnl_fileChooser, BorderLayout.CENTER);
499 pnl_idInput.add(txt_search);
500 pnl_idInput.add(lbl_pdbManualFetchStatus);
501 pnl_idInputBL.add(idInputAssSeqPanel, BorderLayout.NORTH);
502 pnl_idInputBL.add(pnl_idInput, BorderLayout.CENTER);
504 final String foundStructureSummary = MessageManager
505 .getString("label.found_structures_summary");
506 final String configureCols = MessageManager
507 .getString("label.configure_displayed_columns");
508 ChangeListener changeListener = new ChangeListener()
511 public void stateChanged(ChangeEvent changeEvent)
513 JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent
515 int index = sourceTabbedPane.getSelectedIndex();
516 btn_view.setVisible(true);
517 btn_cancel.setVisible(true);
518 if (sourceTabbedPane.getTitleAt(index).equals(configureCols))
520 btn_view.setEnabled(false);
521 btn_cancel.setEnabled(false);
522 btn_view.setVisible(false);
523 btn_cancel.setVisible(false);
524 previousWantedFields = PDBFTSRestClient.getInstance()
525 .getAllDefaulDisplayedDataColumns()
526 .toArray(new FTSDataColumnI[0]);
528 if (sourceTabbedPane.getTitleAt(index)
529 .equals(foundStructureSummary))
531 btn_cancel.setEnabled(true);
532 if (wantedFieldsUpdated())
538 validateSelections();
543 pnl_filter.addChangeListener(changeListener);
544 pnl_filter.setPreferredSize(new Dimension(500, 300));
545 pnl_filter.add(foundStructureSummary, scrl_foundStructures);
546 pnl_filter.add(configureCols, pdbDocFieldPrefs);
548 pnl_locPDB.add(scrl_localPDB);
550 pnl_switchableViews.add(pnl_fileChooserBL, VIEWS_FROM_FILE);
551 pnl_switchableViews.add(pnl_idInputBL, VIEWS_ENTER_ID);
552 pnl_switchableViews.add(pnl_filter, VIEWS_FILTER);
553 pnl_switchableViews.add(pnl_locPDB, VIEWS_LOCAL_PDB);
555 this.setLayout(mainLayout);
556 this.add(pnl_main, java.awt.BorderLayout.NORTH);
557 this.add(pnl_switchableViews, java.awt.BorderLayout.CENTER);
558 // this.add(pnl_actions, java.awt.BorderLayout.SOUTH);
559 statusPanel.setLayout(new GridLayout());
560 pnl_actionsAndStatus.add(pnl_actions, BorderLayout.CENTER);
561 pnl_actionsAndStatus.add(statusPanel, BorderLayout.SOUTH);
562 statusPanel.add(statusBar, null);
563 this.add(pnl_actionsAndStatus, java.awt.BorderLayout.SOUTH);
565 mainFrame.setVisible(true);
566 mainFrame.setContentPane(this);
567 mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
568 Desktop.addInternalFrame(mainFrame, frameTitle, 800, 400);
571 public boolean wantedFieldsUpdated()
573 if (previousWantedFields == null)
578 return Arrays.equals(
579 PDBFTSRestClient.getInstance()
580 .getAllDefaulDisplayedDataColumns()
581 .toArray(new FTSDataColumnI[0]),
582 previousWantedFields) ? false : true;
588 * Event listener for the 'filter' combo-box and 'invert' check-box
590 public void itemStateChanged(ItemEvent e)
596 * This inner class provides the data model for the structure filter combo-box
601 public class FilterOption
605 private String value;
609 public FilterOption(String name, String value, String view)
616 public String getName()
621 public void setName(String name)
626 public String getValue()
631 public void setValue(String value)
636 public String getView()
641 public void setView(String view)
647 public String toString()
654 * This inner class provides the provides the data model for associate
655 * sequence combo-box - cmb_assSeq
660 public class AssociateSeqOptions
662 private SequenceI sequence;
666 public AssociateSeqOptions(SequenceI seq)
669 this.name = (seq.getName().length() >= 23) ? seq.getName().substring(
670 0, 23) : seq.getName();
673 public AssociateSeqOptions(String name, SequenceI seq)
680 public String toString()
685 public String getName()
690 public void setName(String name)
695 public SequenceI getSequence()
700 public void setSequence(SequenceI sequence)
702 this.sequence = sequence;
708 * This inner class holds the Layout and configuration of the panel which
709 * handles association of manually fetched structures to a unique sequence
710 * when more than one sequence selection is made
715 public class AssciateSeqPanel extends JPanel implements ItemListener
717 private JComboBox<AssociateSeqOptions> cmb_assSeq = new JComboBox<AssociateSeqOptions>();
719 private JLabel lbl_associateSeq = new JLabel();
721 public AssciateSeqPanel()
723 this.setLayout(new FlowLayout());
724 this.add(cmb_assSeq);
725 this.add(lbl_associateSeq);
726 cmb_assSeq.setToolTipText(MessageManager
727 .getString("info.associate_wit_sequence"));
728 cmb_assSeq.addItemListener(this);
731 public void loadCmbAssSeq()
733 populateCmbAssociateSeqOptions(cmb_assSeq, lbl_associateSeq);
736 public JComboBox<AssociateSeqOptions> getCmb_assSeq()
741 public void setCmb_assSeq(JComboBox<AssociateSeqOptions> cmb_assSeq)
743 this.cmb_assSeq = cmb_assSeq;
747 public void itemStateChanged(ItemEvent e)
749 if (e.getStateChange() == ItemEvent.SELECTED)
751 cmbAssSeqStateChanged();
756 public JComboBox<FilterOption> getCmbFilterOption()
758 return cmb_filterOption;
761 protected abstract void stateChanged(ItemEvent e);
763 protected abstract void updateCurrentView();
765 protected abstract void populateFilterComboBox();
767 protected abstract void ok_ActionPerformed();
769 protected abstract void pdbFromFile_actionPerformed();
771 protected abstract void txt_search_ActionPerformed();
773 public abstract void populateCmbAssociateSeqOptions(
774 JComboBox<AssociateSeqOptions> cmb_assSeq, JLabel lbl_associateSeq);
776 public abstract void cmbAssSeqStateChanged();
778 public abstract void tabRefresh();
780 public abstract void validateSelections();