2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
3 * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
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 of the License, or (at your option) any later version.
11 * Jalview is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
21 import java.awt.Component;
22 import java.awt.event.ActionEvent;
23 import java.awt.event.ActionListener;
24 import java.awt.event.ItemEvent;
25 import java.awt.event.ItemListener;
26 import java.awt.event.MouseEvent;
27 import java.awt.event.MouseListener;
28 import java.util.List;
30 import javax.swing.JCheckBoxMenuItem;
31 import javax.swing.JMenu;
32 import javax.swing.JMenuItem;
33 import javax.swing.event.MenuEvent;
34 import javax.swing.event.MenuListener;
37 * this is an implementation of an abstract Jalview GUI class that provides a
38 * dialog/menu which allows the user to select/deselect specific views from a
39 * list of associated views.
41 * Includes patches related to JAL-641
46 public class ViewSelectionMenu extends JMenu
48 public interface ViewSetProvider
50 public AlignmentPanel[] getAllAlignmentPanels();
53 private ViewSetProvider _allviews;
55 private List<AlignmentPanel> _selectedviews;
57 private ItemListener _handler;
60 protected void finalize() throws Throwable
62 _selectedviews = null;
69 * create a new view selection menu. This menu has some standard entries
70 * (select all, invert selection), and a checkbox for every view. Mousing over
71 * a view entry will cause it to be raised/selected in the Desktop, allowing
72 * the user to easily identify which view is being referred to.
77 * all the views that might be selected
78 * @param selectedviews
79 * the list of selected views which will be updated when
80 * selection/deselections occur
82 * a handler called for each selection/deselection - use this to
83 * update any gui elements which need to reflect current
84 * selection/deselection state
86 public ViewSelectionMenu(String title, final ViewSetProvider allviews,
87 final List<AlignmentPanel> selectedviews,
88 final ItemListener handler)
91 this._allviews = allviews;
92 this._selectedviews = selectedviews;
93 this._handler = handler;
94 addMenuListener(new MenuListener()
98 public void menuSelected(MenuEvent e)
105 public void menuDeselected(MenuEvent e)
107 // TODO Auto-generated method stub
112 public void menuCanceled(MenuEvent e)
114 // TODO Auto-generated method stub
121 * view selection modifier flag - indicates if an action key is pressed when
122 * menu selection event occurred.
124 private boolean append = false;
127 * flag indicating if the itemStateChanged listener for view associated menu
128 * items is currently enabled
130 private boolean enabled = true;
132 private JMenuItem selectAll, invertSel;
134 private JCheckBoxMenuItem toggleview = null;
136 private void rebuild()
139 AlignmentPanel[] allviews = _allviews.getAllAlignmentPanels();
140 if (allviews == null)
145 if (allviews.length >= 2)
147 // ensure we update menu state to reflect external selection list state
148 append = append || _selectedviews.size() > 1;
149 toggleview = new JCheckBoxMenuItem("Select many views", append);
151 .setToolTipText("When enabled, allows many views to be selected.");
152 toggleview.addItemListener(new ItemListener()
156 public void itemStateChanged(ItemEvent arg0)
161 selectAll.setEnabled(append);
162 invertSel.setEnabled(append);
169 add(selectAll = new JMenuItem("Select all views"));
170 selectAll.addActionListener(new ActionListener()
174 public void actionPerformed(ActionEvent e)
176 for (Component c : getMenuComponents())
180 if (c instanceof JCheckBoxMenuItem)
182 if (toggleview != c && !((JCheckBoxMenuItem) c).isSelected())
184 ((JCheckBoxMenuItem) c).doClick();
191 add(invertSel = new JMenuItem("Invert selection"));
192 invertSel.addActionListener(new ActionListener()
196 public void actionPerformed(ActionEvent e)
200 for (Component c : getMenuComponents())
202 if (toggleview != c && c instanceof JCheckBoxMenuItem)
204 ((JCheckBoxMenuItem) c).doClick();
210 invertSel.setEnabled(append);
211 selectAll.setEnabled(append);
213 for (AlignmentPanel ap : allviews)
215 String nm = ((ap.getViewName() == null || ap.getViewName().length() == 0) ? ""
216 : ap.getViewName() + " for ")
217 + ap.alignFrame.getTitle();
218 final JCheckBoxMenuItem a = new JCheckBoxMenuItem(nm,
219 _selectedviews.contains(ap));
220 final AlignmentPanel p = ap;
221 a.addItemListener(new ItemListener()
224 public void itemStateChanged(ItemEvent e)
231 // toggle the inclusion state
232 if (_selectedviews.indexOf(p) == -1)
234 _selectedviews.add(p);
239 _selectedviews.remove(p);
240 a.setSelected(false);
243 _handler.itemStateChanged(e);
247 // Deselect everything and select this item only
248 _selectedviews.clear();
249 _selectedviews.add(p);
251 for (Component c : getMenuComponents())
253 if (c instanceof JCheckBoxMenuItem)
255 ((JCheckBoxMenuItem) c).setSelected(a == c);
259 // only fire event if we weren't selected before
260 _handler.itemStateChanged(e);
265 a.addMouseListener(new MouseListener()
269 public void mouseReleased(MouseEvent e)
271 // TODO Auto-generated method stub
276 public void mousePressed(MouseEvent e)
278 // TODO Auto-generated method stub
283 public void mouseExited(MouseEvent e)
287 p.setSelected(false);
288 } catch (Exception ex)
295 public void mouseEntered(MouseEvent e)
301 } catch (Exception ex)
308 public void mouseClicked(MouseEvent e)