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.MouseAdapter;
41 import java.awt.event.MouseEvent;
42 import java.util.Arrays;
44 import javax.swing.ImageIcon;
45 import javax.swing.JButton;
46 import javax.swing.JCheckBox;
47 import javax.swing.JComboBox;
48 import javax.swing.JFrame;
49 import javax.swing.JInternalFrame;
50 import javax.swing.JLabel;
51 import javax.swing.JPanel;
52 import javax.swing.JScrollPane;
53 import javax.swing.JTabbedPane;
54 import javax.swing.JTable;
55 import javax.swing.JTextField;
56 import javax.swing.event.ChangeEvent;
57 import javax.swing.event.ChangeListener;
58 import javax.swing.event.DocumentEvent;
59 import javax.swing.event.DocumentListener;
61 @SuppressWarnings("serial")
63 * GUI layout for structure chooser
67 public abstract class GStructureChooser extends JPanel implements
70 protected String frameTitle = MessageManager
71 .getString("label.structure_chooser");
73 protected JInternalFrame mainFrame = new JInternalFrame(frameTitle);
75 protected JComboBox<FilterOption> cmb_filterOption = new JComboBox<FilterOption>();
77 protected AlignmentPanel ap;
79 protected StringBuilder errorWarning = new StringBuilder();
81 protected JLabel lbl_result = new JLabel(
82 MessageManager.getString("label.select"));
84 protected JButton btn_view = new JButton();
86 protected JButton btn_cancel = new JButton();
88 protected JButton btn_pdbFromFile = new JButton();
90 protected JTextField txt_search = new JTextField(14);
92 private JPanel pnl_actions = new JPanel();
94 private JPanel pnl_main = new JPanel();
96 private JPanel pnl_idInput = new JPanel(new FlowLayout());
98 private JPanel pnl_fileChooser = new JPanel(new FlowLayout());
100 private JPanel pnl_idInputBL = new JPanel(new BorderLayout());
102 private JPanel pnl_fileChooserBL = new JPanel(new BorderLayout());
104 private JPanel pnl_locPDB = new JPanel(new BorderLayout());
106 protected JPanel pnl_switchableViews = new JPanel(new CardLayout());
108 protected CardLayout layout_switchableViews = (CardLayout) (pnl_switchableViews
111 private BorderLayout mainLayout = new BorderLayout();
113 protected JCheckBox chk_rememberSettings = new JCheckBox(
114 MessageManager.getString("label.dont_ask_me_again"));
116 protected JCheckBox chk_invertFilter = new JCheckBox(
117 MessageManager.getString("label.invert"));
119 protected ImageIcon loadingImage = new ImageIcon(getClass().getResource(
120 "/images/loading.gif"));
122 protected ImageIcon goodImage = new ImageIcon(getClass().getResource(
123 "/images/good.png"));
125 protected ImageIcon errorImage = new ImageIcon(getClass().getResource(
126 "/images/error.png"));
128 protected ImageIcon warningImage = new ImageIcon(getClass().getResource(
129 "/images/warning.gif"));
131 protected JLabel lbl_warning = new JLabel(warningImage);
133 protected JLabel lbl_loading = new JLabel(loadingImage);
135 protected JLabel lbl_pdbManualFetchStatus = new JLabel(errorImage);
137 protected JLabel lbl_fromFileStatus = new JLabel(errorImage);
140 protected AssciateSeqPanel idInputAssSeqPanel = new AssciateSeqPanel();
142 protected AssciateSeqPanel fileChooserAssSeqPanel = new AssciateSeqPanel();
144 protected static final String VIEWS_FILTER = "VIEWS_FILTER";
146 protected static final String VIEWS_FROM_FILE = "VIEWS_FROM_FILE";
148 protected static final String VIEWS_ENTER_ID = "VIEWS_ENTER_ID";
150 protected static final String VIEWS_LOCAL_PDB = "VIEWS_LOCAL_PDB";
152 protected JTable tbl_summary = new JTable()
154 public String getToolTipText(MouseEvent evt)
156 String toolTipText = null;
157 java.awt.Point pnt = evt.getPoint();
158 int rowIndex = rowAtPoint(pnt);
159 int colIndex = columnAtPoint(pnt);
163 toolTipText = getValueAt(rowIndex, colIndex).toString();
164 } catch (Exception e)
168 toolTipText = (toolTipText == null ? null : JvSwingUtils.wrapTooltip(
174 protected JScrollPane scrl_foundStructures = new JScrollPane(
177 protected JTable tbl_local_pdb = new JTable();
179 protected JScrollPane scrl_localPDB = new JScrollPane(tbl_local_pdb);
181 private JTabbedPane pnl_filter = new JTabbedPane();
183 private PDBDocFieldPreferences pdbDocFieldPrefs = new PDBDocFieldPreferences(
184 PreferenceSource.STRUCTURE_CHOOSER);
186 protected PDBDocField[] previousWantedFields;
187 public GStructureChooser()
192 mainFrame.setVisible(false);
193 mainFrame.invalidate();
195 } catch (Exception e)
202 * Initializes the GUI default properties
206 private void jbInit() throws Exception
208 tbl_summary.setAutoCreateRowSorter(true);
209 tbl_summary.getTableHeader().setReorderingAllowed(false);
210 tbl_local_pdb.setAutoCreateRowSorter(true);
211 tbl_local_pdb.getTableHeader().setReorderingAllowed(false);
212 tbl_local_pdb.addMouseListener(new MouseAdapter()
214 public void mouseClicked(MouseEvent e)
219 public void mouseReleased(MouseEvent e)
225 btn_view.setFont(new java.awt.Font("Verdana", 0, 12));
226 btn_view.setText(MessageManager.getString("action.view"));
227 btn_view.addActionListener(new java.awt.event.ActionListener()
229 public void actionPerformed(ActionEvent e)
231 ok_ActionPerformed();
234 btn_cancel.setFont(new java.awt.Font("Verdana", 0, 12));
235 btn_cancel.setText(MessageManager.getString("action.cancel"));
236 btn_cancel.addActionListener(new java.awt.event.ActionListener()
238 public void actionPerformed(ActionEvent e)
244 btn_pdbFromFile.setFont(new java.awt.Font("Verdana", 0, 12));
245 String btn_title = MessageManager.getString("label.select_pdb_file");
246 btn_pdbFromFile.setText(btn_title + " ");
247 btn_pdbFromFile.addActionListener(new java.awt.event.ActionListener()
249 public void actionPerformed(ActionEvent e)
251 pdbFromFile_actionPerformed();
255 scrl_foundStructures.setPreferredSize(new Dimension(500, 300));
257 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
259 scrl_localPDB.setPreferredSize(new Dimension(500, 300));
261 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
263 cmb_filterOption.setFont(new java.awt.Font("Verdana", 0, 12));
264 chk_invertFilter.setFont(new java.awt.Font("Verdana", 0, 12));
265 chk_rememberSettings.setFont(new java.awt.Font("Verdana", 0, 12));
266 chk_rememberSettings.setVisible(false);
268 txt_search.setToolTipText(MessageManager
269 .getString("label.enter_pdb_id"));
270 cmb_filterOption.setToolTipText(MessageManager
271 .getString("info.select_filter_option"));
272 txt_search.getDocument().addDocumentListener(new DocumentListener()
275 public void insertUpdate(DocumentEvent e)
277 txt_search_ActionPerformed();
281 public void removeUpdate(DocumentEvent e)
283 txt_search_ActionPerformed();
287 public void changedUpdate(DocumentEvent e)
289 txt_search_ActionPerformed();
293 cmb_filterOption.addItemListener(this);
294 chk_invertFilter.addItemListener(this);
296 pnl_actions.add(chk_rememberSettings);
297 pnl_actions.add(btn_view);
298 pnl_actions.add(btn_cancel);
300 // pnl_filter.add(lbl_result);
301 pnl_main.add(cmb_filterOption);
302 pnl_main.add(lbl_loading);
303 pnl_main.add(chk_invertFilter);
304 lbl_loading.setVisible(false);
307 pnl_fileChooser.add(btn_pdbFromFile);
308 pnl_fileChooser.add(lbl_fromFileStatus);
309 pnl_fileChooserBL.add(fileChooserAssSeqPanel, BorderLayout.NORTH);
310 pnl_fileChooserBL.add(pnl_fileChooser, BorderLayout.CENTER);
312 pnl_idInput.add(txt_search);
313 pnl_idInput.add(lbl_pdbManualFetchStatus);
314 pnl_idInputBL.add(idInputAssSeqPanel, BorderLayout.NORTH);
315 pnl_idInputBL.add(pnl_idInput, BorderLayout.CENTER);
317 final String foundStructureSummary = MessageManager
318 .getString("label.found_structures_summary");
319 final String configureCols = MessageManager
320 .getString("label.configure_displayed_columns");
321 ChangeListener changeListener = new ChangeListener()
323 public void stateChanged(ChangeEvent changeEvent)
325 JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent
327 btn_view.setEnabled(false);
328 int index = sourceTabbedPane.getSelectedIndex();
329 if (sourceTabbedPane.getTitleAt(index)
330 .equals(configureCols))
332 previousWantedFields = PDBDocFieldPreferences
333 .getStructureSummaryFields().toArray(
334 new PDBRestClient.PDBDocField[0]);
336 if (sourceTabbedPane.getTitleAt(index)
337 .equals(foundStructureSummary))
339 if (wantedFieldsUpdated())
345 validateSelections();
350 pnl_filter.addChangeListener(changeListener);
351 pnl_filter.setPreferredSize(new Dimension(500, 300));
352 pnl_filter.add(foundStructureSummary, scrl_foundStructures);
353 pnl_filter.add(configureCols, pdbDocFieldPrefs);
355 pnl_locPDB.add(scrl_localPDB);
357 pnl_switchableViews.add(pnl_fileChooserBL, VIEWS_FROM_FILE);
358 pnl_switchableViews.add(pnl_idInputBL, VIEWS_ENTER_ID);
359 pnl_switchableViews.add(pnl_filter, VIEWS_FILTER);
360 pnl_switchableViews.add(pnl_locPDB, VIEWS_LOCAL_PDB);
362 this.setLayout(mainLayout);
363 this.add(pnl_main, java.awt.BorderLayout.NORTH);
364 this.add(pnl_switchableViews, java.awt.BorderLayout.CENTER);
365 this.add(pnl_actions, java.awt.BorderLayout.SOUTH);
367 mainFrame.setVisible(true);
368 mainFrame.setContentPane(this);
369 mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
370 Desktop.addInternalFrame(mainFrame, frameTitle, 800, 400);
373 public boolean wantedFieldsUpdated()
375 if (previousWantedFields == null)
380 return Arrays.equals(PDBDocFieldPreferences.getStructureSummaryFields()
381 .toArray(new PDBRestClient.PDBDocField[0]),
382 previousWantedFields) ? false : true;
388 * Event listener for the 'filter' combo-box and 'invert' check-box
390 public void itemStateChanged(ItemEvent e)
396 * This inner class provides the data model for the structure filter combo-box
401 public class FilterOption
405 private String value;
409 public FilterOption(String name, String value, String view)
416 public String getName()
421 public void setName(String name)
426 public String getValue()
431 public void setValue(String value)
436 public String getView()
441 public void setView(String view)
446 public String toString()
453 * This inner class provides the provides the data model for associate
454 * sequence combo-box - cmb_assSeq
459 public class AssociateSeqOptions
461 private SequenceI sequence;
464 public AssociateSeqOptions(SequenceI seq)
467 this.name = (seq.getName().length() >= 23) ? seq.getName().substring(
468 0, 23) : seq.getName();
471 public AssociateSeqOptions(String name, SequenceI seq)
477 public String toString()
482 public String getName()
487 public void setName(String name)
492 public SequenceI getSequence()
497 public void setSequence(SequenceI sequence)
499 this.sequence = sequence;
505 * This inner class holds the Layout and configuration of the panel which
506 * handles association of manually fetched structures to a unique sequence
507 * when more than one sequence selection is made
512 public class AssciateSeqPanel extends JPanel implements ItemListener
514 private JComboBox<AssociateSeqOptions> cmb_assSeq = new JComboBox<AssociateSeqOptions>();
516 private JLabel lbl_associateSeq = new JLabel();
518 public AssciateSeqPanel()
520 this.setLayout(new FlowLayout());
521 this.add(cmb_assSeq);
522 this.add(lbl_associateSeq);
523 cmb_assSeq.setToolTipText(MessageManager
524 .getString("info.associate_wit_sequence"));
525 cmb_assSeq.addItemListener(this);
528 public void loadCmbAssSeq()
530 populateCmbAssociateSeqOptions(cmb_assSeq, lbl_associateSeq);
533 public JComboBox<AssociateSeqOptions> getCmb_assSeq()
538 public void setCmb_assSeq(JComboBox<AssociateSeqOptions> cmb_assSeq)
540 this.cmb_assSeq = cmb_assSeq;
544 public void itemStateChanged(ItemEvent e)
546 if (e.getStateChange() == ItemEvent.SELECTED)
548 cmbAssSeqStateChanged();
553 public JComboBox<FilterOption> getCmbFilterOption()
555 return cmb_filterOption;
558 protected abstract void stateChanged(ItemEvent e);
560 protected abstract void updateCurrentView();
562 protected abstract void populateFilterComboBox();
564 protected abstract void ok_ActionPerformed();
566 protected abstract void pdbFromFile_actionPerformed();
568 protected abstract void txt_search_ActionPerformed();
570 public abstract void populateCmbAssociateSeqOptions(
571 JComboBox<AssociateSeqOptions> cmb_assSeq, JLabel lbl_associateSeq);
573 public abstract void cmbAssSeqStateChanged();
575 public abstract void tabRefresh();
577 public abstract void validateSelections();