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.gui.AlignmentPanel;
26 import jalview.gui.Desktop;
27 import jalview.gui.JvSwingUtils;
28 import jalview.jbgui.PDBDocFieldPreferences.PreferenceSource;
29 import jalview.util.MessageManager;
30 import jalview.ws.dbsources.PDBRestClient;
31 import jalview.ws.dbsources.PDBRestClient.PDBDocField;
33 import java.awt.BorderLayout;
34 import java.awt.CardLayout;
35 import java.awt.Dimension;
36 import java.awt.FlowLayout;
37 import java.awt.event.ActionEvent;
38 import java.awt.event.ItemEvent;
39 import java.awt.event.ItemListener;
40 import java.awt.event.KeyAdapter;
41 import java.awt.event.KeyEvent;
42 import java.awt.event.MouseAdapter;
43 import java.awt.event.MouseEvent;
44 import java.util.Arrays;
46 import javax.swing.ImageIcon;
47 import javax.swing.JButton;
48 import javax.swing.JCheckBox;
49 import javax.swing.JComboBox;
50 import javax.swing.JFrame;
51 import javax.swing.JInternalFrame;
52 import javax.swing.JLabel;
53 import javax.swing.JPanel;
54 import javax.swing.JScrollPane;
55 import javax.swing.JTabbedPane;
56 import javax.swing.JTable;
57 import javax.swing.JTextField;
58 import javax.swing.event.ChangeEvent;
59 import javax.swing.event.ChangeListener;
60 import javax.swing.event.DocumentEvent;
61 import javax.swing.event.DocumentListener;
63 @SuppressWarnings("serial")
65 * GUI layout for structure chooser
69 public abstract class GStructureChooser extends JPanel implements
72 protected String frameTitle = MessageManager
73 .getString("label.structure_chooser");
75 protected JInternalFrame mainFrame = new JInternalFrame(frameTitle);
77 protected JComboBox<FilterOption> cmb_filterOption = new JComboBox<FilterOption>();
79 protected AlignmentPanel ap;
81 protected StringBuilder errorWarning = new StringBuilder();
83 protected JLabel lbl_result = new JLabel(
84 MessageManager.getString("label.select"));
86 protected JButton btn_view = new JButton();
88 protected JButton btn_cancel = new JButton();
90 protected JButton btn_pdbFromFile = new JButton();
92 protected JTextField txt_search = new JTextField(14);
94 private JPanel pnl_actions = new JPanel();
96 private JPanel pnl_main = new JPanel();
98 private JPanel pnl_idInput = new JPanel(new FlowLayout());
100 private JPanel pnl_fileChooser = new JPanel(new FlowLayout());
102 private JPanel pnl_idInputBL = new JPanel(new BorderLayout());
104 private JPanel pnl_fileChooserBL = new JPanel(new BorderLayout());
106 private JPanel pnl_locPDB = new JPanel(new BorderLayout());
108 protected JPanel pnl_switchableViews = new JPanel(new CardLayout());
110 protected CardLayout layout_switchableViews = (CardLayout) (pnl_switchableViews
113 private BorderLayout mainLayout = new BorderLayout();
115 protected JCheckBox chk_rememberSettings = new JCheckBox(
116 MessageManager.getString("label.dont_ask_me_again"));
118 protected JCheckBox chk_invertFilter = new JCheckBox(
119 MessageManager.getString("label.invert"));
121 protected ImageIcon loadingImage = new ImageIcon(getClass().getResource(
122 "/images/loading.gif"));
124 protected ImageIcon goodImage = new ImageIcon(getClass().getResource(
125 "/images/good.png"));
127 protected ImageIcon errorImage = new ImageIcon(getClass().getResource(
128 "/images/error.png"));
130 protected ImageIcon warningImage = new ImageIcon(getClass().getResource(
131 "/images/warning.gif"));
133 protected JLabel lbl_warning = new JLabel(warningImage);
135 protected JLabel lbl_loading = new JLabel(loadingImage);
137 protected JLabel lbl_pdbManualFetchStatus = new JLabel(errorImage);
139 protected JLabel lbl_fromFileStatus = new JLabel(errorImage);
141 protected AssciateSeqPanel idInputAssSeqPanel = new AssciateSeqPanel();
143 protected AssciateSeqPanel fileChooserAssSeqPanel = new AssciateSeqPanel();
145 protected static final String VIEWS_FILTER = "VIEWS_FILTER";
147 protected static final String VIEWS_FROM_FILE = "VIEWS_FROM_FILE";
149 protected static final String VIEWS_ENTER_ID = "VIEWS_ENTER_ID";
151 protected static final String VIEWS_LOCAL_PDB = "VIEWS_LOCAL_PDB";
153 protected JTable tbl_summary = new JTable()
155 public String getToolTipText(MouseEvent evt)
157 String toolTipText = null;
158 java.awt.Point pnt = evt.getPoint();
159 int rowIndex = rowAtPoint(pnt);
160 int colIndex = columnAtPoint(pnt);
164 toolTipText = getValueAt(rowIndex, colIndex).toString();
165 } catch (Exception e)
167 // e.printStackTrace();
169 toolTipText = (toolTipText == null ? null
170 : (toolTipText.length() > 500 ? JvSwingUtils.wrapTooltip(
171 true, "\"" + toolTipText.subSequence(0, 500)
172 + "...\"") : JvSwingUtils.wrapTooltip(true,
178 protected JScrollPane scrl_foundStructures = new JScrollPane(tbl_summary);
180 protected JTable tbl_local_pdb = new JTable();
182 protected JScrollPane scrl_localPDB = new JScrollPane(tbl_local_pdb);
184 private JTabbedPane pnl_filter = new JTabbedPane();
186 private PDBDocFieldPreferences pdbDocFieldPrefs = new PDBDocFieldPreferences(
187 PreferenceSource.STRUCTURE_CHOOSER);
189 protected PDBDocField[] previousWantedFields;
191 public GStructureChooser()
196 mainFrame.setVisible(false);
197 mainFrame.invalidate();
199 } catch (Exception e)
206 * Initializes the GUI default properties
210 private void jbInit() throws Exception
212 tbl_summary.setAutoCreateRowSorter(true);
213 tbl_summary.getTableHeader().setReorderingAllowed(false);
214 tbl_summary.addMouseListener(new MouseAdapter()
216 public void mouseClicked(MouseEvent e)
218 validateSelections();
221 public void mouseReleased(MouseEvent e)
223 validateSelections();
226 tbl_summary.addKeyListener(new KeyAdapter()
229 public void keyPressed(KeyEvent evt)
231 validateSelections();
232 switch (evt.getKeyCode())
234 case KeyEvent.VK_ESCAPE: // escape key
237 case KeyEvent.VK_ENTER: // enter key
238 if (btn_view.isEnabled())
240 ok_ActionPerformed();
243 case KeyEvent.VK_TAB: // tab key
244 if (evt.isShiftDown())
246 pnl_filter.requestFocus();
250 btn_view.requestFocus();
259 tbl_local_pdb.setAutoCreateRowSorter(true);
260 tbl_local_pdb.getTableHeader().setReorderingAllowed(false);
261 tbl_local_pdb.addMouseListener(new MouseAdapter()
263 public void mouseClicked(MouseEvent e)
265 validateSelections();
268 public void mouseReleased(MouseEvent e)
270 validateSelections();
273 tbl_local_pdb.addKeyListener(new KeyAdapter()
276 public void keyPressed(KeyEvent evt)
278 validateSelections();
279 switch (evt.getKeyCode())
281 case KeyEvent.VK_ESCAPE: // escape key
284 case KeyEvent.VK_ENTER: // enter key
285 if (btn_view.isEnabled())
287 ok_ActionPerformed();
290 case KeyEvent.VK_TAB: // tab key
291 if (evt.isShiftDown())
293 cmb_filterOption.requestFocus();
297 if (btn_view.isEnabled())
299 btn_view.requestFocus();
303 btn_cancel.requestFocus();
312 btn_view.setFont(new java.awt.Font("Verdana", 0, 12));
313 btn_view.setText(MessageManager.getString("action.view"));
314 btn_view.addActionListener(new java.awt.event.ActionListener()
316 public void actionPerformed(ActionEvent e)
318 ok_ActionPerformed();
321 btn_view.addKeyListener(new KeyAdapter()
324 public void keyPressed(KeyEvent evt)
326 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
328 ok_ActionPerformed();
333 btn_cancel.setFont(new java.awt.Font("Verdana", 0, 12));
334 btn_cancel.setText(MessageManager.getString("action.cancel"));
335 btn_cancel.addActionListener(new java.awt.event.ActionListener()
337 public void actionPerformed(ActionEvent e)
342 btn_cancel.addKeyListener(new KeyAdapter()
345 public void keyPressed(KeyEvent evt)
347 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
354 btn_pdbFromFile.setFont(new java.awt.Font("Verdana", 0, 12));
355 String btn_title = MessageManager.getString("label.select_pdb_file");
356 btn_pdbFromFile.setText(btn_title + " ");
357 btn_pdbFromFile.addActionListener(new java.awt.event.ActionListener()
359 public void actionPerformed(ActionEvent e)
361 pdbFromFile_actionPerformed();
364 btn_pdbFromFile.addKeyListener(new KeyAdapter()
367 public void keyPressed(KeyEvent evt)
369 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
371 pdbFromFile_actionPerformed();
376 scrl_foundStructures.setPreferredSize(new Dimension(500, 300));
378 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
380 scrl_localPDB.setPreferredSize(new Dimension(500, 300));
382 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
384 cmb_filterOption.setFont(new java.awt.Font("Verdana", 0, 12));
385 chk_invertFilter.setFont(new java.awt.Font("Verdana", 0, 12));
386 chk_rememberSettings.setFont(new java.awt.Font("Verdana", 0, 12));
387 chk_rememberSettings.setVisible(false);
389 txt_search.setToolTipText(MessageManager
390 .getString("label.enter_pdb_id"));
391 cmb_filterOption.setToolTipText(MessageManager
392 .getString("info.select_filter_option"));
393 txt_search.getDocument().addDocumentListener(new DocumentListener()
396 public void insertUpdate(DocumentEvent e)
398 txt_search_ActionPerformed();
402 public void removeUpdate(DocumentEvent e)
404 txt_search_ActionPerformed();
408 public void changedUpdate(DocumentEvent e)
410 txt_search_ActionPerformed();
414 cmb_filterOption.addItemListener(this);
415 chk_invertFilter.addItemListener(this);
417 pnl_actions.add(chk_rememberSettings);
418 pnl_actions.add(btn_view);
419 pnl_actions.add(btn_cancel);
421 // pnl_filter.add(lbl_result);
422 pnl_main.add(cmb_filterOption);
423 pnl_main.add(lbl_loading);
424 pnl_main.add(chk_invertFilter);
425 lbl_loading.setVisible(false);
427 pnl_fileChooser.add(btn_pdbFromFile);
428 pnl_fileChooser.add(lbl_fromFileStatus);
429 pnl_fileChooserBL.add(fileChooserAssSeqPanel, BorderLayout.NORTH);
430 pnl_fileChooserBL.add(pnl_fileChooser, BorderLayout.CENTER);
432 pnl_idInput.add(txt_search);
433 pnl_idInput.add(lbl_pdbManualFetchStatus);
434 pnl_idInputBL.add(idInputAssSeqPanel, BorderLayout.NORTH);
435 pnl_idInputBL.add(pnl_idInput, BorderLayout.CENTER);
437 final String foundStructureSummary = MessageManager
438 .getString("label.found_structures_summary");
439 final String configureCols = MessageManager
440 .getString("label.configure_displayed_columns");
441 ChangeListener changeListener = new ChangeListener()
443 public void stateChanged(ChangeEvent changeEvent)
445 JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent
447 int index = sourceTabbedPane.getSelectedIndex();
448 if (sourceTabbedPane.getTitleAt(index).equals(configureCols))
450 btn_view.setEnabled(false);
451 btn_cancel.setEnabled(false);
452 previousWantedFields = PDBDocFieldPreferences
453 .getStructureSummaryFields().toArray(
454 new PDBRestClient.PDBDocField[0]);
456 if (sourceTabbedPane.getTitleAt(index)
457 .equals(foundStructureSummary))
459 btn_cancel.setEnabled(true);
460 if (wantedFieldsUpdated())
466 validateSelections();
471 pnl_filter.addChangeListener(changeListener);
472 pnl_filter.setPreferredSize(new Dimension(500, 300));
473 pnl_filter.add(foundStructureSummary, scrl_foundStructures);
474 pnl_filter.add(configureCols, pdbDocFieldPrefs);
476 pnl_locPDB.add(scrl_localPDB);
478 pnl_switchableViews.add(pnl_fileChooserBL, VIEWS_FROM_FILE);
479 pnl_switchableViews.add(pnl_idInputBL, VIEWS_ENTER_ID);
480 pnl_switchableViews.add(pnl_filter, VIEWS_FILTER);
481 pnl_switchableViews.add(pnl_locPDB, VIEWS_LOCAL_PDB);
483 this.setLayout(mainLayout);
484 this.add(pnl_main, java.awt.BorderLayout.NORTH);
485 this.add(pnl_switchableViews, java.awt.BorderLayout.CENTER);
486 this.add(pnl_actions, java.awt.BorderLayout.SOUTH);
488 mainFrame.setVisible(true);
489 mainFrame.setContentPane(this);
490 mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
491 Desktop.addInternalFrame(mainFrame, frameTitle, 800, 400);
494 public boolean wantedFieldsUpdated()
496 if (previousWantedFields == null)
501 return Arrays.equals(PDBDocFieldPreferences.getStructureSummaryFields()
502 .toArray(new PDBRestClient.PDBDocField[0]),
503 previousWantedFields) ? false : true;
509 * Event listener for the 'filter' combo-box and 'invert' check-box
511 public void itemStateChanged(ItemEvent e)
517 * This inner class provides the data model for the structure filter combo-box
522 public class FilterOption
526 private String value;
530 public FilterOption(String name, String value, String view)
537 public String getName()
542 public void setName(String name)
547 public String getValue()
552 public void setValue(String value)
557 public String getView()
562 public void setView(String view)
567 public String toString()
574 * This inner class provides the provides the data model for associate
575 * sequence combo-box - cmb_assSeq
580 public class AssociateSeqOptions
582 private SequenceI sequence;
586 public AssociateSeqOptions(SequenceI seq)
589 this.name = (seq.getName().length() >= 23) ? seq.getName().substring(
590 0, 23) : seq.getName();
593 public AssociateSeqOptions(String name, SequenceI seq)
599 public String toString()
604 public String getName()
609 public void setName(String name)
614 public SequenceI getSequence()
619 public void setSequence(SequenceI sequence)
621 this.sequence = sequence;
627 * This inner class holds the Layout and configuration of the panel which
628 * handles association of manually fetched structures to a unique sequence
629 * when more than one sequence selection is made
634 public class AssciateSeqPanel extends JPanel implements ItemListener
636 private JComboBox<AssociateSeqOptions> cmb_assSeq = new JComboBox<AssociateSeqOptions>();
638 private JLabel lbl_associateSeq = new JLabel();
640 public AssciateSeqPanel()
642 this.setLayout(new FlowLayout());
643 this.add(cmb_assSeq);
644 this.add(lbl_associateSeq);
645 cmb_assSeq.setToolTipText(MessageManager
646 .getString("info.associate_wit_sequence"));
647 cmb_assSeq.addItemListener(this);
650 public void loadCmbAssSeq()
652 populateCmbAssociateSeqOptions(cmb_assSeq, lbl_associateSeq);
655 public JComboBox<AssociateSeqOptions> getCmb_assSeq()
660 public void setCmb_assSeq(JComboBox<AssociateSeqOptions> cmb_assSeq)
662 this.cmb_assSeq = cmb_assSeq;
666 public void itemStateChanged(ItemEvent e)
668 if (e.getStateChange() == ItemEvent.SELECTED)
670 cmbAssSeqStateChanged();
675 public JComboBox<FilterOption> getCmbFilterOption()
677 return cmb_filterOption;
680 protected abstract void stateChanged(ItemEvent e);
682 protected abstract void updateCurrentView();
684 protected abstract void populateFilterComboBox();
686 protected abstract void ok_ActionPerformed();
688 protected abstract void pdbFromFile_actionPerformed();
690 protected abstract void txt_search_ActionPerformed();
692 public abstract void populateCmbAssociateSeqOptions(
693 JComboBox<AssociateSeqOptions> cmb_assSeq, JLabel lbl_associateSeq);
695 public abstract void cmbAssSeqStateChanged();
697 public abstract void tabRefresh();
699 public abstract void validateSelections();