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.jbgui.PDBDocFieldPreferences.PreferenceSource;
28 import jalview.util.MessageManager;
29 import jalview.ws.dbsources.PDBRestClient;
30 import jalview.ws.dbsources.PDBRestClient.PDBDocField;
32 import java.awt.BorderLayout;
33 import java.awt.CardLayout;
34 import java.awt.Dimension;
35 import java.awt.FlowLayout;
36 import java.awt.event.ActionEvent;
37 import java.awt.event.ItemEvent;
38 import java.awt.event.ItemListener;
39 import java.awt.event.MouseAdapter;
40 import java.awt.event.MouseEvent;
41 import java.util.Arrays;
43 import javax.swing.ImageIcon;
44 import javax.swing.JButton;
45 import javax.swing.JCheckBox;
46 import javax.swing.JComboBox;
47 import javax.swing.JFrame;
48 import javax.swing.JInternalFrame;
49 import javax.swing.JLabel;
50 import javax.swing.JPanel;
51 import javax.swing.JScrollPane;
52 import javax.swing.JTabbedPane;
53 import javax.swing.JTable;
54 import javax.swing.JTextField;
55 import javax.swing.event.ChangeEvent;
56 import javax.swing.event.ChangeListener;
57 import javax.swing.event.DocumentEvent;
58 import javax.swing.event.DocumentListener;
60 @SuppressWarnings("serial")
62 * GUI layout for structure chooser
66 public abstract class GStructureChooser extends JPanel implements
69 protected String frameTitle = MessageManager
70 .getString("label.structure_chooser");
72 protected JInternalFrame mainFrame = new JInternalFrame(frameTitle);
74 protected JComboBox<FilterOption> cmb_filterOption = new JComboBox<FilterOption>();
76 protected AlignmentPanel ap;
78 protected StringBuilder errorWarning = new StringBuilder();
80 protected JLabel lbl_result = new JLabel(
81 MessageManager.getString("label.select"));
83 protected JButton btn_view = new JButton();
85 protected JButton btn_cancel = new JButton();
87 protected JButton btn_pdbFromFile = new JButton();
89 protected JTextField txt_search = new JTextField(14);
91 private JPanel pnl_actions = new JPanel();
93 private JPanel pnl_main = new JPanel();
95 private JPanel pnl_idInput = new JPanel(new FlowLayout());
97 private JPanel pnl_fileChooser = new JPanel(new FlowLayout());
99 private JPanel pnl_idInputBL = new JPanel(new BorderLayout());
101 private JPanel pnl_fileChooserBL = new JPanel(new BorderLayout());
103 private JPanel pnl_locPDB = new JPanel(new BorderLayout());
105 protected JPanel pnl_switchableViews = new JPanel(new CardLayout());
107 protected CardLayout layout_switchableViews = (CardLayout) (pnl_switchableViews
110 private BorderLayout mainLayout = new BorderLayout();
112 protected JCheckBox chk_rememberSettings = new JCheckBox(
113 MessageManager.getString("label.dont_ask_me_again"));
115 protected JCheckBox chk_invertFilter = new JCheckBox(
116 MessageManager.getString("label.invert"));
118 protected ImageIcon loadingImage = new ImageIcon(getClass().getResource(
119 "/images/loading.gif"));
121 protected ImageIcon goodImage = new ImageIcon(getClass().getResource(
122 "/images/good.png"));
124 protected ImageIcon errorImage = new ImageIcon(getClass().getResource(
125 "/images/error.png"));
127 protected ImageIcon warningImage = new ImageIcon(getClass().getResource(
128 "/images/warning.gif"));
130 protected JLabel lbl_warning = new JLabel(warningImage);
132 protected JLabel lbl_loading = new JLabel(loadingImage);
134 protected JLabel lbl_pdbManualFetchStatus = new JLabel(errorImage);
136 protected JLabel lbl_fromFileStatus = new JLabel(errorImage);
139 protected AssciateSeqPanel idInputAssSeqPanel = new AssciateSeqPanel();
141 protected AssciateSeqPanel fileChooserAssSeqPanel = new AssciateSeqPanel();
143 protected static final String VIEWS_FILTER = "VIEWS_FILTER";
145 protected static final String VIEWS_FROM_FILE = "VIEWS_FROM_FILE";
147 protected static final String VIEWS_ENTER_ID = "VIEWS_ENTER_ID";
149 protected static final String VIEWS_LOCAL_PDB = "VIEWS_LOCAL_PDB";
151 protected JTable tbl_summary = new JTable();
153 protected JScrollPane scrl_foundStructures = new JScrollPane(
156 protected JTable tbl_local_pdb = new JTable();
158 protected JScrollPane scrl_localPDB = new JScrollPane(tbl_local_pdb);
160 private JTabbedPane pnl_filter = new JTabbedPane();
162 private PDBDocFieldPreferences pdbDocFieldPrefs = new PDBDocFieldPreferences(
163 PreferenceSource.STRUCTURE_CHOOSER);
165 protected PDBDocField[] previousWantedFields;
166 public GStructureChooser()
171 mainFrame.setVisible(false);
172 mainFrame.invalidate();
174 } catch (Exception e)
181 * Initializes the GUI default properties
185 private void jbInit() throws Exception
187 tbl_summary.setAutoCreateRowSorter(true);
188 tbl_summary.getTableHeader().setReorderingAllowed(false);
189 tbl_local_pdb.setAutoCreateRowSorter(true);
190 tbl_local_pdb.getTableHeader().setReorderingAllowed(false);
191 tbl_local_pdb.addMouseListener(new MouseAdapter()
193 public void mouseClicked(MouseEvent e)
198 public void mouseReleased(MouseEvent e)
204 btn_view.setFont(new java.awt.Font("Verdana", 0, 12));
205 btn_view.setText(MessageManager.getString("action.view"));
206 btn_view.addActionListener(new java.awt.event.ActionListener()
208 public void actionPerformed(ActionEvent e)
210 ok_ActionPerformed();
213 btn_cancel.setFont(new java.awt.Font("Verdana", 0, 12));
214 btn_cancel.setText(MessageManager.getString("action.cancel"));
215 btn_cancel.addActionListener(new java.awt.event.ActionListener()
217 public void actionPerformed(ActionEvent e)
223 btn_pdbFromFile.setFont(new java.awt.Font("Verdana", 0, 12));
224 String btn_title = MessageManager.getString("label.select_pdb_file");
225 btn_pdbFromFile.setText(btn_title + " ");
226 btn_pdbFromFile.addActionListener(new java.awt.event.ActionListener()
228 public void actionPerformed(ActionEvent e)
230 pdbFromFile_actionPerformed();
234 scrl_foundStructures.setPreferredSize(new Dimension(500, 300));
236 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
238 scrl_localPDB.setPreferredSize(new Dimension(500, 300));
240 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
242 cmb_filterOption.setFont(new java.awt.Font("Verdana", 0, 12));
243 chk_invertFilter.setFont(new java.awt.Font("Verdana", 0, 12));
244 chk_rememberSettings.setFont(new java.awt.Font("Verdana", 0, 12));
245 chk_rememberSettings.setVisible(false);
247 txt_search.setToolTipText(MessageManager
248 .getString("label.enter_pdb_id"));
249 cmb_filterOption.setToolTipText(MessageManager
250 .getString("info.select_filter_option"));
251 txt_search.getDocument().addDocumentListener(new DocumentListener()
254 public void insertUpdate(DocumentEvent e)
256 txt_search_ActionPerformed();
260 public void removeUpdate(DocumentEvent e)
262 txt_search_ActionPerformed();
266 public void changedUpdate(DocumentEvent e)
268 txt_search_ActionPerformed();
272 cmb_filterOption.addItemListener(this);
273 chk_invertFilter.addItemListener(this);
275 pnl_actions.add(chk_rememberSettings);
276 pnl_actions.add(btn_view);
277 pnl_actions.add(btn_cancel);
279 // pnl_filter.add(lbl_result);
280 pnl_main.add(cmb_filterOption);
281 pnl_main.add(lbl_loading);
282 pnl_main.add(chk_invertFilter);
283 lbl_loading.setVisible(false);
286 pnl_fileChooser.add(btn_pdbFromFile);
287 pnl_fileChooser.add(lbl_fromFileStatus);
288 pnl_fileChooserBL.add(fileChooserAssSeqPanel, BorderLayout.NORTH);
289 pnl_fileChooserBL.add(pnl_fileChooser, BorderLayout.CENTER);
291 pnl_idInput.add(txt_search);
292 pnl_idInput.add(lbl_pdbManualFetchStatus);
293 pnl_idInputBL.add(idInputAssSeqPanel, BorderLayout.NORTH);
294 pnl_idInputBL.add(pnl_idInput, BorderLayout.CENTER);
296 final String foundStructureSummary = MessageManager
297 .getString("label.found_structures_summary");
298 final String configureCols = MessageManager
299 .getString("label.configure_displayed_columns");
300 ChangeListener changeListener = new ChangeListener()
302 public void stateChanged(ChangeEvent changeEvent)
304 JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent
306 btn_view.setEnabled(false);
307 int index = sourceTabbedPane.getSelectedIndex();
308 if (sourceTabbedPane.getTitleAt(index)
309 .equals(configureCols))
311 previousWantedFields = PDBDocFieldPreferences
312 .getStructureSummaryFields().toArray(
313 new PDBRestClient.PDBDocField[0]);
315 if (sourceTabbedPane.getTitleAt(index)
316 .equals(foundStructureSummary))
318 if (wantedFieldsUpdated())
324 validateSelections();
329 pnl_filter.addChangeListener(changeListener);
330 pnl_filter.setPreferredSize(new Dimension(500, 300));
331 pnl_filter.add(foundStructureSummary, scrl_foundStructures);
332 pnl_filter.add(configureCols, pdbDocFieldPrefs);
334 pnl_locPDB.add(scrl_localPDB);
336 pnl_switchableViews.add(pnl_fileChooserBL, VIEWS_FROM_FILE);
337 pnl_switchableViews.add(pnl_idInputBL, VIEWS_ENTER_ID);
338 pnl_switchableViews.add(pnl_filter, VIEWS_FILTER);
339 pnl_switchableViews.add(pnl_locPDB, VIEWS_LOCAL_PDB);
341 this.setLayout(mainLayout);
342 this.add(pnl_main, java.awt.BorderLayout.NORTH);
343 this.add(pnl_switchableViews, java.awt.BorderLayout.CENTER);
344 this.add(pnl_actions, java.awt.BorderLayout.SOUTH);
346 mainFrame.setVisible(true);
347 mainFrame.setContentPane(this);
348 mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
349 Desktop.addInternalFrame(mainFrame, frameTitle, 800, 400);
352 public boolean wantedFieldsUpdated()
354 if (previousWantedFields == null)
359 return Arrays.equals(PDBDocFieldPreferences.getStructureSummaryFields()
360 .toArray(new PDBRestClient.PDBDocField[0]),
361 previousWantedFields) ? false : true;
367 * Event listener for the 'filter' combo-box and 'invert' check-box
369 public void itemStateChanged(ItemEvent e)
375 * This inner class provides the data model for the structure filter combo-box
380 public class FilterOption
384 private String value;
388 public FilterOption(String name, String value, String view)
395 public String getName()
400 public void setName(String name)
405 public String getValue()
410 public void setValue(String value)
415 public String getView()
420 public void setView(String view)
425 public String toString()
432 * This inner class provides the provides the data model for associate
433 * sequence combo-box - cmb_assSeq
438 public class AssociateSeqOptions
440 private SequenceI sequence;
443 public AssociateSeqOptions(SequenceI seq)
446 this.name = (seq.getName().length() >= 23) ? seq.getName().substring(
447 0, 23) : seq.getName();
450 public AssociateSeqOptions(String name, SequenceI seq)
456 public String toString()
461 public String getName()
466 public void setName(String name)
471 public SequenceI getSequence()
476 public void setSequence(SequenceI sequence)
478 this.sequence = sequence;
484 * This inner class holds the Layout and configuration of the panel which
485 * handles association of manually fetched structures to a unique sequence
486 * when more than one sequence selection is made
491 public class AssciateSeqPanel extends JPanel implements ItemListener
493 private JComboBox<AssociateSeqOptions> cmb_assSeq = new JComboBox<AssociateSeqOptions>();
495 private JLabel lbl_associateSeq = new JLabel();
497 public AssciateSeqPanel()
499 this.setLayout(new FlowLayout());
500 this.add(cmb_assSeq);
501 this.add(lbl_associateSeq);
502 cmb_assSeq.setToolTipText(MessageManager
503 .getString("info.associate_wit_sequence"));
504 cmb_assSeq.addItemListener(this);
507 public void loadCmbAssSeq()
509 populateCmbAssociateSeqOptions(cmb_assSeq, lbl_associateSeq);
512 public JComboBox<AssociateSeqOptions> getCmb_assSeq()
517 public void setCmb_assSeq(JComboBox<AssociateSeqOptions> cmb_assSeq)
519 this.cmb_assSeq = cmb_assSeq;
523 public void itemStateChanged(ItemEvent e)
525 if (e.getStateChange() == ItemEvent.SELECTED)
527 cmbAssSeqStateChanged();
532 public JComboBox<FilterOption> getCmbFilterOption()
534 return cmb_filterOption;
537 protected abstract void stateChanged(ItemEvent e);
539 protected abstract void updateCurrentView();
541 protected abstract void populateFilterComboBox();
543 protected abstract void ok_ActionPerformed();
545 protected abstract void pdbFromFile_actionPerformed();
547 protected abstract void txt_search_ActionPerformed();
549 public abstract void populateCmbAssociateSeqOptions(
550 JComboBox<AssociateSeqOptions> cmb_assSeq, JLabel lbl_associateSeq);
552 public abstract void cmbAssSeqStateChanged();
554 public abstract void tabRefresh();
556 public abstract void validateSelections();