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;
30 import java.awt.BorderLayout;
31 import java.awt.CardLayout;
32 import java.awt.Dimension;
33 import java.awt.FlowLayout;
34 import java.awt.event.ActionEvent;
35 import java.awt.event.ItemEvent;
36 import java.awt.event.ItemListener;
37 import java.awt.event.MouseAdapter;
38 import java.awt.event.MouseEvent;
40 import javax.swing.ImageIcon;
41 import javax.swing.JButton;
42 import javax.swing.JCheckBox;
43 import javax.swing.JComboBox;
44 import javax.swing.JFrame;
45 import javax.swing.JInternalFrame;
46 import javax.swing.JLabel;
47 import javax.swing.JPanel;
48 import javax.swing.JScrollPane;
49 import javax.swing.JTabbedPane;
50 import javax.swing.JTable;
51 import javax.swing.JTextField;
52 import javax.swing.event.ChangeEvent;
53 import javax.swing.event.ChangeListener;
54 import javax.swing.event.DocumentEvent;
55 import javax.swing.event.DocumentListener;
57 @SuppressWarnings("serial")
59 * GUI layout for structure chooser
63 public abstract class GStructureChooser extends JPanel implements
66 protected String frameTitle = MessageManager
67 .getString("label.structure_chooser");
69 protected JInternalFrame mainFrame = new JInternalFrame(frameTitle);
71 protected JComboBox<FilterOption> cmb_filterOption = new JComboBox<FilterOption>();
73 protected AlignmentPanel ap;
75 protected StringBuilder errorWarning = new StringBuilder();
77 protected JLabel lbl_result = new JLabel(
78 MessageManager.getString("label.select"));
80 protected JButton btn_view = new JButton();
82 protected JButton btn_cancel = new JButton();
84 protected JButton btn_pdbFromFile = new JButton();
86 protected JTextField txt_search = new JTextField(14);
88 private JPanel pnl_actions = new JPanel();
90 private JPanel pnl_main = new JPanel();
92 private JPanel pnl_idInput = new JPanel(new FlowLayout());
94 private JPanel pnl_fileChooser = new JPanel(new FlowLayout());
96 private JPanel pnl_idInputBL = new JPanel(new BorderLayout());
98 private JPanel pnl_fileChooserBL = new JPanel(new BorderLayout());
100 private JPanel pnl_locPDB = new JPanel(new BorderLayout());
102 protected JPanel pnl_switchableViews = new JPanel(new CardLayout());
104 protected CardLayout layout_switchableViews = (CardLayout) (pnl_switchableViews
107 private BorderLayout mainLayout = new BorderLayout();
109 protected JCheckBox chk_rememberSettings = new JCheckBox(
110 MessageManager.getString("label.dont_ask_me_again"));
112 protected JCheckBox chk_invertFilter = new JCheckBox(
113 MessageManager.getString("label.invert"));
115 protected ImageIcon loadingImage = new ImageIcon(getClass().getResource(
116 "/images/loading.gif"));
118 protected ImageIcon goodImage = new ImageIcon(getClass().getResource(
119 "/images/good.png"));
121 protected ImageIcon errorImage = new ImageIcon(getClass().getResource(
122 "/images/error.png"));
124 protected ImageIcon warningImage = new ImageIcon(getClass().getResource(
125 "/images/warning.gif"));
127 protected JLabel lbl_warning = new JLabel(warningImage);
129 protected JLabel lbl_loading = new JLabel(loadingImage);
131 protected JLabel lbl_pdbManualFetchStatus = new JLabel(errorImage);
133 protected JLabel lbl_fromFileStatus = new JLabel(errorImage);
136 protected AssciateSeqPanel idInputAssSeqPanel = new AssciateSeqPanel();
138 protected AssciateSeqPanel fileChooserAssSeqPanel = new AssciateSeqPanel();
140 protected static final String VIEWS_FILTER = "VIEWS_FILTER";
142 protected static final String VIEWS_FROM_FILE = "VIEWS_FROM_FILE";
144 protected static final String VIEWS_ENTER_ID = "VIEWS_ENTER_ID";
146 protected static final String VIEWS_LOCAL_PDB = "VIEWS_LOCAL_PDB";
148 protected JTable tbl_summary = new JTable();
150 protected JScrollPane scrl_foundStructures = new JScrollPane(
153 protected JTable tbl_local_pdb = new JTable();
155 protected JScrollPane scrl_localPDB = new JScrollPane(tbl_local_pdb);
157 private JTabbedPane pnl_filter = new JTabbedPane();
159 private PDBDocFieldPreferences pdbDocFieldPrefs = new PDBDocFieldPreferences(
160 PreferenceSource.STRUCTURE_CHOOSER);
162 public GStructureChooser()
167 mainFrame.setVisible(false);
168 mainFrame.invalidate();
170 } catch (Exception e)
177 * Initializes the GUI default properties
181 private void jbInit() throws Exception
183 tbl_summary.setAutoCreateRowSorter(true);
184 tbl_local_pdb.setAutoCreateRowSorter(true);
185 tbl_local_pdb.addMouseListener(new MouseAdapter()
187 public void mouseClicked(MouseEvent e)
193 btn_view.setFont(new java.awt.Font("Verdana", 0, 12));
194 btn_view.setText(MessageManager.getString("action.view"));
195 btn_view.addActionListener(new java.awt.event.ActionListener()
197 public void actionPerformed(ActionEvent e)
199 ok_ActionPerformed();
202 btn_cancel.setFont(new java.awt.Font("Verdana", 0, 12));
203 btn_cancel.setText(MessageManager.getString("action.cancel"));
204 btn_cancel.addActionListener(new java.awt.event.ActionListener()
206 public void actionPerformed(ActionEvent e)
212 btn_pdbFromFile.setFont(new java.awt.Font("Verdana", 0, 12));
213 String btn_title = MessageManager.getString("label.select_pdb_file");
214 btn_pdbFromFile.setText(btn_title + " ");
215 btn_pdbFromFile.addActionListener(new java.awt.event.ActionListener()
217 public void actionPerformed(ActionEvent e)
219 pdbFromFile_actionPerformed();
223 scrl_foundStructures.setPreferredSize(new Dimension(500, 300));
225 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
227 scrl_localPDB.setPreferredSize(new Dimension(500, 300));
229 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
231 cmb_filterOption.setFont(new java.awt.Font("Verdana", 0, 12));
232 chk_invertFilter.setFont(new java.awt.Font("Verdana", 0, 12));
233 chk_rememberSettings.setFont(new java.awt.Font("Verdana", 0, 12));
236 txt_search.setToolTipText(MessageManager
237 .getString("label.enter_pdb_id"));
238 cmb_filterOption.setToolTipText(MessageManager
239 .getString("info.select_filter_option"));
240 txt_search.getDocument().addDocumentListener(new DocumentListener()
243 public void insertUpdate(DocumentEvent e)
245 txt_search_ActionPerformed();
249 public void removeUpdate(DocumentEvent e)
251 txt_search_ActionPerformed();
255 public void changedUpdate(DocumentEvent e)
257 txt_search_ActionPerformed();
261 cmb_filterOption.addItemListener(this);
262 chk_invertFilter.addItemListener(this);
264 pnl_actions.add(chk_rememberSettings);
265 pnl_actions.add(btn_view);
266 pnl_actions.add(btn_cancel);
268 // pnl_filter.add(lbl_result);
269 pnl_main.add(cmb_filterOption);
270 pnl_main.add(lbl_loading);
271 pnl_main.add(chk_invertFilter);
272 lbl_loading.setVisible(false);
275 pnl_fileChooser.add(btn_pdbFromFile);
276 pnl_fileChooser.add(lbl_fromFileStatus);
277 pnl_fileChooserBL.add(fileChooserAssSeqPanel, BorderLayout.NORTH);
278 pnl_fileChooserBL.add(pnl_fileChooser, BorderLayout.CENTER);
280 pnl_idInput.add(txt_search);
281 pnl_idInput.add(lbl_pdbManualFetchStatus);
282 pnl_idInputBL.add(idInputAssSeqPanel, BorderLayout.NORTH);
283 pnl_idInputBL.add(pnl_idInput, BorderLayout.CENTER);
285 final String foundStructureSummary = MessageManager
286 .getString("label.found_structures_summary");
288 ChangeListener changeListener = new ChangeListener()
290 public void stateChanged(ChangeEvent changeEvent)
292 JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent
294 int index = sourceTabbedPane.getSelectedIndex();
295 if (sourceTabbedPane.getTitleAt(index)
296 .equals(foundStructureSummary))
302 pnl_filter.addChangeListener(changeListener);
303 pnl_filter.setPreferredSize(new Dimension(500, 300));
304 pnl_filter.add(foundStructureSummary, scrl_foundStructures);
306 MessageManager.getString("label.configure_displayed_columns"),
309 pnl_locPDB.add(scrl_localPDB);
311 pnl_switchableViews.add(pnl_fileChooserBL, VIEWS_FROM_FILE);
312 pnl_switchableViews.add(pnl_idInputBL, VIEWS_ENTER_ID);
313 pnl_switchableViews.add(pnl_filter, VIEWS_FILTER);
314 pnl_switchableViews.add(pnl_locPDB, VIEWS_LOCAL_PDB);
316 this.setLayout(mainLayout);
317 this.add(pnl_main, java.awt.BorderLayout.NORTH);
318 this.add(pnl_switchableViews, java.awt.BorderLayout.CENTER);
319 this.add(pnl_actions, java.awt.BorderLayout.SOUTH);
321 mainFrame.setVisible(true);
322 mainFrame.setContentPane(this);
323 mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
324 Desktop.addInternalFrame(mainFrame, frameTitle, 800, 400);
330 * Event listener for the 'filter' combo-box and 'invert' check-box
332 public void itemStateChanged(ItemEvent e)
338 * This inner class provides the data model for the structure filter combo-box
343 public class FilterOption
347 private String value;
351 public FilterOption(String name, String value, String view)
358 public String getName()
363 public void setName(String name)
368 public String getValue()
373 public void setValue(String value)
378 public String getView()
383 public void setView(String view)
388 public String toString()
395 * This inner class provides the provides the data model for associate
396 * sequence combo-box - cmb_assSeq
401 public class AssociateSeqOptions
403 private SequenceI sequence;
406 public AssociateSeqOptions(SequenceI seq)
409 this.name = (seq.getName().length() >= 23) ? seq.getName().substring(
410 0, 23) : seq.getName();
413 public AssociateSeqOptions(String name, SequenceI seq)
419 public String toString()
424 public String getName()
429 public void setName(String name)
434 public SequenceI getSequence()
439 public void setSequence(SequenceI sequence)
441 this.sequence = sequence;
447 * This inner class holds the Layout and configuration of the panel which
448 * handles association of manually fetched structures to a unique sequence
449 * when more than one sequence selection is made
454 public class AssciateSeqPanel extends JPanel implements ItemListener
456 private JComboBox<AssociateSeqOptions> cmb_assSeq = new JComboBox<AssociateSeqOptions>();
458 private JLabel lbl_associateSeq = new JLabel();
460 public AssciateSeqPanel()
462 this.setLayout(new FlowLayout());
463 this.add(cmb_assSeq);
464 this.add(lbl_associateSeq);
465 cmb_assSeq.setToolTipText(MessageManager
466 .getString("info.associate_wit_sequence"));
467 cmb_assSeq.addItemListener(this);
470 public void loadCmbAssSeq()
472 populateCmbAssociateSeqOptions(cmb_assSeq, lbl_associateSeq);
475 public JComboBox<AssociateSeqOptions> getCmb_assSeq()
480 public void setCmb_assSeq(JComboBox<AssociateSeqOptions> cmb_assSeq)
482 this.cmb_assSeq = cmb_assSeq;
486 public void itemStateChanged(ItemEvent e)
488 if (e.getStateChange() == ItemEvent.SELECTED)
490 cmbAssSeqStateChanged();
495 public JComboBox<FilterOption> getCmbFilterOption()
497 return cmb_filterOption;
500 protected abstract void stateChanged(ItemEvent e);
502 protected abstract void updateCurrentView();
504 protected abstract void populateFilterComboBox();
506 protected abstract void ok_ActionPerformed();
508 protected abstract void pdbFromFile_actionPerformed();
510 protected abstract void txt_search_ActionPerformed();
512 public abstract void populateCmbAssociateSeqOptions(
513 JComboBox<AssociateSeqOptions> cmb_assSeq, JLabel lbl_associateSeq);
515 public abstract void cmbAssSeqStateChanged();
517 public abstract void tabRefresh();