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)
192 public void mouseReleased(MouseEvent e)
198 btn_view.setFont(new java.awt.Font("Verdana", 0, 12));
199 btn_view.setText(MessageManager.getString("action.view"));
200 btn_view.addActionListener(new java.awt.event.ActionListener()
202 public void actionPerformed(ActionEvent e)
204 ok_ActionPerformed();
207 btn_cancel.setFont(new java.awt.Font("Verdana", 0, 12));
208 btn_cancel.setText(MessageManager.getString("action.cancel"));
209 btn_cancel.addActionListener(new java.awt.event.ActionListener()
211 public void actionPerformed(ActionEvent e)
217 btn_pdbFromFile.setFont(new java.awt.Font("Verdana", 0, 12));
218 String btn_title = MessageManager.getString("label.select_pdb_file");
219 btn_pdbFromFile.setText(btn_title + " ");
220 btn_pdbFromFile.addActionListener(new java.awt.event.ActionListener()
222 public void actionPerformed(ActionEvent e)
224 pdbFromFile_actionPerformed();
228 scrl_foundStructures.setPreferredSize(new Dimension(500, 300));
230 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
232 scrl_localPDB.setPreferredSize(new Dimension(500, 300));
234 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
236 cmb_filterOption.setFont(new java.awt.Font("Verdana", 0, 12));
237 chk_invertFilter.setFont(new java.awt.Font("Verdana", 0, 12));
238 chk_rememberSettings.setFont(new java.awt.Font("Verdana", 0, 12));
241 txt_search.setToolTipText(MessageManager
242 .getString("label.enter_pdb_id"));
243 cmb_filterOption.setToolTipText(MessageManager
244 .getString("info.select_filter_option"));
245 txt_search.getDocument().addDocumentListener(new DocumentListener()
248 public void insertUpdate(DocumentEvent e)
250 txt_search_ActionPerformed();
254 public void removeUpdate(DocumentEvent e)
256 txt_search_ActionPerformed();
260 public void changedUpdate(DocumentEvent e)
262 txt_search_ActionPerformed();
266 cmb_filterOption.addItemListener(this);
267 chk_invertFilter.addItemListener(this);
269 pnl_actions.add(chk_rememberSettings);
270 pnl_actions.add(btn_view);
271 pnl_actions.add(btn_cancel);
273 // pnl_filter.add(lbl_result);
274 pnl_main.add(cmb_filterOption);
275 pnl_main.add(lbl_loading);
276 pnl_main.add(chk_invertFilter);
277 lbl_loading.setVisible(false);
280 pnl_fileChooser.add(btn_pdbFromFile);
281 pnl_fileChooser.add(lbl_fromFileStatus);
282 pnl_fileChooserBL.add(fileChooserAssSeqPanel, BorderLayout.NORTH);
283 pnl_fileChooserBL.add(pnl_fileChooser, BorderLayout.CENTER);
285 pnl_idInput.add(txt_search);
286 pnl_idInput.add(lbl_pdbManualFetchStatus);
287 pnl_idInputBL.add(idInputAssSeqPanel, BorderLayout.NORTH);
288 pnl_idInputBL.add(pnl_idInput, BorderLayout.CENTER);
290 final String foundStructureSummary = MessageManager
291 .getString("label.found_structures_summary");
293 ChangeListener changeListener = new ChangeListener()
295 public void stateChanged(ChangeEvent changeEvent)
297 JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent
299 int index = sourceTabbedPane.getSelectedIndex();
300 if (sourceTabbedPane.getTitleAt(index)
301 .equals(foundStructureSummary))
307 pnl_filter.addChangeListener(changeListener);
308 pnl_filter.setPreferredSize(new Dimension(500, 300));
309 pnl_filter.add(foundStructureSummary, scrl_foundStructures);
311 MessageManager.getString("label.configure_displayed_columns"),
314 pnl_locPDB.add(scrl_localPDB);
316 pnl_switchableViews.add(pnl_fileChooserBL, VIEWS_FROM_FILE);
317 pnl_switchableViews.add(pnl_idInputBL, VIEWS_ENTER_ID);
318 pnl_switchableViews.add(pnl_filter, VIEWS_FILTER);
319 pnl_switchableViews.add(pnl_locPDB, VIEWS_LOCAL_PDB);
321 this.setLayout(mainLayout);
322 this.add(pnl_main, java.awt.BorderLayout.NORTH);
323 this.add(pnl_switchableViews, java.awt.BorderLayout.CENTER);
324 this.add(pnl_actions, java.awt.BorderLayout.SOUTH);
326 mainFrame.setVisible(true);
327 mainFrame.setContentPane(this);
328 mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
329 Desktop.addInternalFrame(mainFrame, frameTitle, 800, 400);
335 * Event listener for the 'filter' combo-box and 'invert' check-box
337 public void itemStateChanged(ItemEvent e)
343 * This inner class provides the data model for the structure filter combo-box
348 public class FilterOption
352 private String value;
356 public FilterOption(String name, String value, String view)
363 public String getName()
368 public void setName(String name)
373 public String getValue()
378 public void setValue(String value)
383 public String getView()
388 public void setView(String view)
393 public String toString()
400 * This inner class provides the provides the data model for associate
401 * sequence combo-box - cmb_assSeq
406 public class AssociateSeqOptions
408 private SequenceI sequence;
411 public AssociateSeqOptions(SequenceI seq)
414 this.name = (seq.getName().length() >= 23) ? seq.getName().substring(
415 0, 23) : seq.getName();
418 public AssociateSeqOptions(String name, SequenceI seq)
424 public String toString()
429 public String getName()
434 public void setName(String name)
439 public SequenceI getSequence()
444 public void setSequence(SequenceI sequence)
446 this.sequence = sequence;
452 * This inner class holds the Layout and configuration of the panel which
453 * handles association of manually fetched structures to a unique sequence
454 * when more than one sequence selection is made
459 public class AssciateSeqPanel extends JPanel implements ItemListener
461 private JComboBox<AssociateSeqOptions> cmb_assSeq = new JComboBox<AssociateSeqOptions>();
463 private JLabel lbl_associateSeq = new JLabel();
465 public AssciateSeqPanel()
467 this.setLayout(new FlowLayout());
468 this.add(cmb_assSeq);
469 this.add(lbl_associateSeq);
470 cmb_assSeq.setToolTipText(MessageManager
471 .getString("info.associate_wit_sequence"));
472 cmb_assSeq.addItemListener(this);
475 public void loadCmbAssSeq()
477 populateCmbAssociateSeqOptions(cmb_assSeq, lbl_associateSeq);
480 public JComboBox<AssociateSeqOptions> getCmb_assSeq()
485 public void setCmb_assSeq(JComboBox<AssociateSeqOptions> cmb_assSeq)
487 this.cmb_assSeq = cmb_assSeq;
491 public void itemStateChanged(ItemEvent e)
493 if (e.getStateChange() == ItemEvent.SELECTED)
495 cmbAssSeqStateChanged();
500 public JComboBox<FilterOption> getCmbFilterOption()
502 return cmb_filterOption;
505 protected abstract void stateChanged(ItemEvent e);
507 protected abstract void updateCurrentView();
509 protected abstract void populateFilterComboBox();
511 protected abstract void ok_ActionPerformed();
513 protected abstract void pdbFromFile_actionPerformed();
515 protected abstract void txt_search_ActionPerformed();
517 public abstract void populateCmbAssociateSeqOptions(
518 JComboBox<AssociateSeqOptions> cmb_assSeq, JLabel lbl_associateSeq);
520 public abstract void cmbAssSeqStateChanged();
522 public abstract void tabRefresh();