1 /*******************************************************************************
2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
3 * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, 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/>.
17 *******************************************************************************/
20 import java.awt.Component;
21 import java.awt.event.ActionEvent;
22 import java.awt.event.ActionListener;
23 import java.awt.event.ItemEvent;
24 import java.awt.event.ItemListener;
25 import java.awt.event.MouseEvent;
26 import java.awt.event.MouseListener;
27 import java.util.List;
29 import javax.swing.JCheckBoxMenuItem;
30 import javax.swing.JMenu;
31 import javax.swing.JMenuItem;
32 import javax.swing.event.MenuEvent;
33 import javax.swing.event.MenuListener;
36 * this is an implementation of an abstract Jalview GUI class that provides a
37 * dialog/menu which allows the user to select/deselect specific views from a
38 * list of associated views.
40 * Includes patches related to JAL-641
45 public class ViewSelectionMenu extends JMenu
47 public interface ViewSetProvider
49 public AlignmentPanel[] getAllAlignmentPanels();
52 private ViewSetProvider _allviews;
54 private List<AlignmentPanel> _selectedviews;
56 private ItemListener _handler;
59 protected void finalize() throws Throwable
61 _selectedviews = null;
68 * create a new view selection menu. This menu has some standard entries
69 * (select all, invert selection), and a checkbox for every view. Mousing over
70 * a view entry will cause it to be raised/selected in the Desktop, allowing
71 * the user to easily identify which view is being referred to.
76 * all the views that might be selected
77 * @param selectedviews
78 * the list of selected views which will be updated when
79 * selection/deselections occur
81 * a handler called for each selection/deselection - use this to
82 * update any gui elements which need to reflect current
83 * selection/deselection state
85 public ViewSelectionMenu(String title, final ViewSetProvider allviews,
86 final List<AlignmentPanel> selectedviews,
87 final ItemListener handler)
90 this._allviews = allviews;
91 this._selectedviews = selectedviews;
92 this._handler = handler;
93 addMenuListener(new MenuListener()
97 public void menuSelected(MenuEvent e)
104 public void menuDeselected(MenuEvent e)
106 // TODO Auto-generated method stub
111 public void menuCanceled(MenuEvent e)
113 // TODO Auto-generated method stub
120 * view selection modifier flag - indicates if an action key is pressed when
121 * menu selection event occurred.
123 private boolean append = false;
125 * flag indicating if the itemStateChanged listener for view associated menu items is currently enabled
127 private boolean enabled = true;
128 private JMenuItem selectAll, invertSel;
129 private JCheckBoxMenuItem toggleview=null;
130 private void rebuild()
133 AlignmentPanel[] allviews = _allviews.getAllAlignmentPanels();
134 if (allviews == null)
139 if (allviews.length >= 2)
141 // ensure we update menu state to reflect external selection list state
142 append = append || _selectedviews.size()>1;
143 toggleview = new JCheckBoxMenuItem("Select many views",append);
144 toggleview.setToolTipText("When enabled, allows many views to be selected.");
145 toggleview.addItemListener(new ItemListener() {
148 public void itemStateChanged(ItemEvent arg0)
153 selectAll.setEnabled(append);
154 invertSel.setEnabled(append);
161 add(selectAll= new JMenuItem("Select all views"));
162 selectAll.addActionListener(new ActionListener()
166 public void actionPerformed(ActionEvent e)
168 for (Component c : getMenuComponents())
172 if (c instanceof JCheckBoxMenuItem)
174 if (toggleview!=c && !((JCheckBoxMenuItem) c).isSelected())
176 ((JCheckBoxMenuItem) c).doClick();
183 add(invertSel = new JMenuItem("Invert selection"));
184 invertSel.addActionListener(new ActionListener()
188 public void actionPerformed(ActionEvent e)
192 for (Component c : getMenuComponents())
194 if (toggleview!=c && c instanceof JCheckBoxMenuItem)
196 ((JCheckBoxMenuItem) c).doClick();
202 invertSel.setEnabled(append);
203 selectAll.setEnabled(append);
205 for (AlignmentPanel ap : allviews)
207 String nm = ((ap.getViewName() == null || ap.getViewName().length() == 0) ? ""
208 : ap.getViewName() + " for ")
209 + ap.alignFrame.getTitle();
210 final JCheckBoxMenuItem a = new JCheckBoxMenuItem(nm,
211 _selectedviews.contains(ap));
212 final AlignmentPanel p = ap;
213 a.addItemListener(new ItemListener()
216 public void itemStateChanged(ItemEvent e)
223 // toggle the inclusion state
224 if (_selectedviews.indexOf(p)==-1)
226 _selectedviews.add(p);
231 _selectedviews.remove(p);
232 a.setSelected(false);
235 _handler.itemStateChanged(e);
239 // Deselect everything and select this item only
240 _selectedviews.clear();
241 _selectedviews.add(p);
243 for (Component c : getMenuComponents())
245 if (c instanceof JCheckBoxMenuItem)
247 ((JCheckBoxMenuItem) c).setSelected(a == c);
251 // only fire event if we weren't selected before
252 _handler.itemStateChanged(e);
257 a.addMouseListener(new MouseListener()
261 public void mouseReleased(MouseEvent e)
263 // TODO Auto-generated method stub
268 public void mousePressed(MouseEvent e)
270 // TODO Auto-generated method stub
275 public void mouseExited(MouseEvent e)
279 p.setSelected(false);
280 } catch (Exception ex)
287 public void mouseEntered(MouseEvent e)
293 } catch (Exception ex)
300 public void mouseClicked(MouseEvent e)