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)
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 chk_invertFilter.requestFocus();
250 btn_view.requestFocus();
258 tbl_local_pdb.setAutoCreateRowSorter(true);
259 tbl_local_pdb.getTableHeader().setReorderingAllowed(false);
260 tbl_local_pdb.addMouseListener(new MouseAdapter()
262 public void mouseClicked(MouseEvent e)
264 validateSelections();
267 public void mouseReleased(MouseEvent e)
269 validateSelections();
272 tbl_local_pdb.addKeyListener(new KeyAdapter()
275 public void keyPressed(KeyEvent evt)
277 validateSelections();
278 switch (evt.getKeyCode())
280 case KeyEvent.VK_ESCAPE: // escape key
283 case KeyEvent.VK_ENTER: // enter key
284 if (btn_view.isEnabled())
286 ok_ActionPerformed();
289 case KeyEvent.VK_TAB: // tab key
290 if (evt.isShiftDown())
292 cmb_filterOption.requestFocus();
296 btn_view.requestFocus();
304 btn_view.setFont(new java.awt.Font("Verdana", 0, 12));
305 btn_view.setText(MessageManager.getString("action.view"));
306 btn_view.addActionListener(new java.awt.event.ActionListener()
308 public void actionPerformed(ActionEvent e)
310 ok_ActionPerformed();
313 btn_view.addKeyListener(new KeyAdapter()
316 public void keyPressed(KeyEvent evt)
318 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
320 ok_ActionPerformed();
325 btn_cancel.setFont(new java.awt.Font("Verdana", 0, 12));
326 btn_cancel.setText(MessageManager.getString("action.cancel"));
327 btn_cancel.addActionListener(new java.awt.event.ActionListener()
329 public void actionPerformed(ActionEvent e)
334 btn_cancel.addKeyListener(new KeyAdapter()
337 public void keyPressed(KeyEvent evt)
339 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
346 btn_pdbFromFile.setFont(new java.awt.Font("Verdana", 0, 12));
347 String btn_title = MessageManager.getString("label.select_pdb_file");
348 btn_pdbFromFile.setText(btn_title + " ");
349 btn_pdbFromFile.addActionListener(new java.awt.event.ActionListener()
351 public void actionPerformed(ActionEvent e)
353 pdbFromFile_actionPerformed();
356 btn_pdbFromFile.addKeyListener(new KeyAdapter()
359 public void keyPressed(KeyEvent evt)
361 if (evt.getKeyCode() == KeyEvent.VK_ENTER)
363 pdbFromFile_actionPerformed();
368 scrl_foundStructures.setPreferredSize(new Dimension(500, 300));
370 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
372 scrl_localPDB.setPreferredSize(new Dimension(500, 300));
374 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
376 cmb_filterOption.setFont(new java.awt.Font("Verdana", 0, 12));
377 chk_invertFilter.setFont(new java.awt.Font("Verdana", 0, 12));
378 chk_rememberSettings.setFont(new java.awt.Font("Verdana", 0, 12));
379 chk_rememberSettings.setVisible(false);
381 txt_search.setToolTipText(MessageManager
382 .getString("label.enter_pdb_id"));
383 cmb_filterOption.setToolTipText(MessageManager
384 .getString("info.select_filter_option"));
385 txt_search.getDocument().addDocumentListener(new DocumentListener()
388 public void insertUpdate(DocumentEvent e)
390 txt_search_ActionPerformed();
394 public void removeUpdate(DocumentEvent e)
396 txt_search_ActionPerformed();
400 public void changedUpdate(DocumentEvent e)
402 txt_search_ActionPerformed();
406 cmb_filterOption.addItemListener(this);
407 chk_invertFilter.addItemListener(this);
409 pnl_actions.add(chk_rememberSettings);
410 pnl_actions.add(btn_view);
411 pnl_actions.add(btn_cancel);
413 // pnl_filter.add(lbl_result);
414 pnl_main.add(cmb_filterOption);
415 pnl_main.add(lbl_loading);
416 pnl_main.add(chk_invertFilter);
417 lbl_loading.setVisible(false);
419 pnl_fileChooser.add(btn_pdbFromFile);
420 pnl_fileChooser.add(lbl_fromFileStatus);
421 pnl_fileChooserBL.add(fileChooserAssSeqPanel, BorderLayout.NORTH);
422 pnl_fileChooserBL.add(pnl_fileChooser, BorderLayout.CENTER);
424 pnl_idInput.add(txt_search);
425 pnl_idInput.add(lbl_pdbManualFetchStatus);
426 pnl_idInputBL.add(idInputAssSeqPanel, BorderLayout.NORTH);
427 pnl_idInputBL.add(pnl_idInput, BorderLayout.CENTER);
429 final String foundStructureSummary = MessageManager
430 .getString("label.found_structures_summary");
431 final String configureCols = MessageManager
432 .getString("label.configure_displayed_columns");
433 ChangeListener changeListener = new ChangeListener()
435 public void stateChanged(ChangeEvent changeEvent)
437 JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent
439 int index = sourceTabbedPane.getSelectedIndex();
440 if (sourceTabbedPane.getTitleAt(index).equals(configureCols))
442 btn_view.setEnabled(false);
443 btn_cancel.setEnabled(false);
444 previousWantedFields = PDBDocFieldPreferences
445 .getStructureSummaryFields().toArray(
446 new PDBRestClient.PDBDocField[0]);
448 if (sourceTabbedPane.getTitleAt(index)
449 .equals(foundStructureSummary))
451 btn_cancel.setEnabled(true);
452 if (wantedFieldsUpdated())
458 validateSelections();
463 pnl_filter.addChangeListener(changeListener);
464 pnl_filter.setPreferredSize(new Dimension(500, 300));
465 pnl_filter.add(foundStructureSummary, scrl_foundStructures);
466 pnl_filter.add(configureCols, pdbDocFieldPrefs);
468 pnl_locPDB.add(scrl_localPDB);
470 pnl_switchableViews.add(pnl_fileChooserBL, VIEWS_FROM_FILE);
471 pnl_switchableViews.add(pnl_idInputBL, VIEWS_ENTER_ID);
472 pnl_switchableViews.add(pnl_filter, VIEWS_FILTER);
473 pnl_switchableViews.add(pnl_locPDB, VIEWS_LOCAL_PDB);
475 this.setLayout(mainLayout);
476 this.add(pnl_main, java.awt.BorderLayout.NORTH);
477 this.add(pnl_switchableViews, java.awt.BorderLayout.CENTER);
478 this.add(pnl_actions, java.awt.BorderLayout.SOUTH);
480 mainFrame.setVisible(true);
481 mainFrame.setContentPane(this);
482 mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
483 Desktop.addInternalFrame(mainFrame, frameTitle, 800, 400);
486 public boolean wantedFieldsUpdated()
488 if (previousWantedFields == null)
493 return Arrays.equals(PDBDocFieldPreferences.getStructureSummaryFields()
494 .toArray(new PDBRestClient.PDBDocField[0]),
495 previousWantedFields) ? false : true;
501 * Event listener for the 'filter' combo-box and 'invert' check-box
503 public void itemStateChanged(ItemEvent e)
509 * This inner class provides the data model for the structure filter combo-box
514 public class FilterOption
518 private String value;
522 public FilterOption(String name, String value, String view)
529 public String getName()
534 public void setName(String name)
539 public String getValue()
544 public void setValue(String value)
549 public String getView()
554 public void setView(String view)
559 public String toString()
566 * This inner class provides the provides the data model for associate
567 * sequence combo-box - cmb_assSeq
572 public class AssociateSeqOptions
574 private SequenceI sequence;
578 public AssociateSeqOptions(SequenceI seq)
581 this.name = (seq.getName().length() >= 23) ? seq.getName().substring(
582 0, 23) : seq.getName();
585 public AssociateSeqOptions(String name, SequenceI seq)
591 public String toString()
596 public String getName()
601 public void setName(String name)
606 public SequenceI getSequence()
611 public void setSequence(SequenceI sequence)
613 this.sequence = sequence;
619 * This inner class holds the Layout and configuration of the panel which
620 * handles association of manually fetched structures to a unique sequence
621 * when more than one sequence selection is made
626 public class AssciateSeqPanel extends JPanel implements ItemListener
628 private JComboBox<AssociateSeqOptions> cmb_assSeq = new JComboBox<AssociateSeqOptions>();
630 private JLabel lbl_associateSeq = new JLabel();
632 public AssciateSeqPanel()
634 this.setLayout(new FlowLayout());
635 this.add(cmb_assSeq);
636 this.add(lbl_associateSeq);
637 cmb_assSeq.setToolTipText(MessageManager
638 .getString("info.associate_wit_sequence"));
639 cmb_assSeq.addItemListener(this);
642 public void loadCmbAssSeq()
644 populateCmbAssociateSeqOptions(cmb_assSeq, lbl_associateSeq);
647 public JComboBox<AssociateSeqOptions> getCmb_assSeq()
652 public void setCmb_assSeq(JComboBox<AssociateSeqOptions> cmb_assSeq)
654 this.cmb_assSeq = cmb_assSeq;
658 public void itemStateChanged(ItemEvent e)
660 if (e.getStateChange() == ItemEvent.SELECTED)
662 cmbAssSeqStateChanged();
667 public JComboBox<FilterOption> getCmbFilterOption()
669 return cmb_filterOption;
672 protected abstract void stateChanged(ItemEvent e);
674 protected abstract void updateCurrentView();
676 protected abstract void populateFilterComboBox();
678 protected abstract void ok_ActionPerformed();
680 protected abstract void pdbFromFile_actionPerformed();
682 protected abstract void txt_search_ActionPerformed();
684 public abstract void populateCmbAssociateSeqOptions(
685 JComboBox<AssociateSeqOptions> cmb_assSeq, JLabel lbl_associateSeq);
687 public abstract void cmbAssSeqStateChanged();
689 public abstract void tabRefresh();
691 public abstract void validateSelections();