2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
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 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 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 import jalview.util.MessageManager;
23 import java.awt.Component;
24 import java.awt.event.ActionEvent;
25 import java.awt.event.ActionListener;
26 import java.awt.event.ItemEvent;
27 import java.awt.event.ItemListener;
28 import java.awt.event.MouseEvent;
29 import java.awt.event.MouseListener;
30 import java.util.List;
32 import javax.swing.JCheckBoxMenuItem;
33 import javax.swing.JMenu;
34 import javax.swing.JMenuItem;
35 import javax.swing.event.MenuEvent;
36 import javax.swing.event.MenuListener;
39 * this is an implementation of an abstract Jalview GUI class that provides a
40 * dialog/menu which allows the user to select/deselect specific views from a
41 * list of associated views.
43 * Includes patches related to JAL-641
48 public class ViewSelectionMenu extends JMenu
50 public interface ViewSetProvider
52 public AlignmentPanel[] getAllAlignmentPanels();
55 private ViewSetProvider _allviews;
57 private List<AlignmentPanel> _selectedviews;
59 private ItemListener _handler;
62 protected void finalize() throws Throwable
64 _selectedviews = null;
71 * create a new view selection menu. This menu has some standard entries
72 * (select all, invert selection), and a checkbox for every view. Mousing over
73 * a view entry will cause it to be raised/selected in the Desktop, allowing
74 * the user to easily identify which view is being referred to.
79 * all the views that might be selected
80 * @param selectedviews
81 * the list of selected views which will be updated when
82 * selection/deselections occur
84 * a handler called for each selection/deselection - use this to
85 * update any gui elements which need to reflect current
86 * selection/deselection state
88 public ViewSelectionMenu(String title, final ViewSetProvider allviews,
89 final List<AlignmentPanel> selectedviews,
90 final ItemListener handler)
93 this._allviews = allviews;
94 this._selectedviews = selectedviews;
95 this._handler = handler;
96 addMenuListener(new MenuListener()
100 public void menuSelected(MenuEvent e)
107 public void menuDeselected(MenuEvent e)
109 // TODO Auto-generated method stub
114 public void menuCanceled(MenuEvent e)
116 // TODO Auto-generated method stub
123 * view selection modifier flag - indicates if an action key is pressed when
124 * menu selection event occurred.
126 private boolean append = false;
129 * flag indicating if the itemStateChanged listener for view associated menu
130 * items is currently enabled
132 private boolean enabled = true;
134 private JMenuItem selectAll, invertSel;
136 private JCheckBoxMenuItem toggleview = null;
138 private void rebuild()
141 AlignmentPanel[] allviews = _allviews.getAllAlignmentPanels();
142 if (allviews == null)
147 if (allviews.length >= 2)
149 // ensure we update menu state to reflect external selection list state
150 append = append || _selectedviews.size() > 1;
151 toggleview = new JCheckBoxMenuItem("Select many views", append);
153 .setToolTipText(MessageManager.getString("label.toggle_enabled_views"));
154 toggleview.addItemListener(new ItemListener()
158 public void itemStateChanged(ItemEvent arg0)
163 selectAll.setEnabled(append);
164 invertSel.setEnabled(append);
171 add(selectAll = new JMenuItem(MessageManager.getString("label.select_all_views")));
172 selectAll.addActionListener(new ActionListener()
176 public void actionPerformed(ActionEvent e)
178 for (Component c : getMenuComponents())
182 if (c instanceof JCheckBoxMenuItem)
184 if (toggleview != c && !((JCheckBoxMenuItem) c).isSelected())
186 ((JCheckBoxMenuItem) c).doClick();
193 add(invertSel = new JMenuItem(MessageManager.getString("label.invert_selection")));
194 invertSel.addActionListener(new ActionListener()
198 public void actionPerformed(ActionEvent e)
202 for (Component c : getMenuComponents())
204 if (toggleview != c && c instanceof JCheckBoxMenuItem)
206 ((JCheckBoxMenuItem) c).doClick();
212 invertSel.setEnabled(append);
213 selectAll.setEnabled(append);
215 for (AlignmentPanel ap : allviews)
217 String nm = ((ap.getViewName() == null || ap.getViewName().length() == 0) ? ""
218 : ap.getViewName() + " for ")
219 + ap.alignFrame.getTitle();
220 final JCheckBoxMenuItem a = new JCheckBoxMenuItem(nm,
221 _selectedviews.contains(ap));
222 final AlignmentPanel p = ap;
223 a.addItemListener(new ItemListener()
226 public void itemStateChanged(ItemEvent e)
233 // toggle the inclusion state
234 if (_selectedviews.indexOf(p) == -1)
236 _selectedviews.add(p);
241 _selectedviews.remove(p);
242 a.setSelected(false);
245 _handler.itemStateChanged(e);
249 // Deselect everything and select this item only
250 _selectedviews.clear();
251 _selectedviews.add(p);
253 for (Component c : getMenuComponents())
255 if (c instanceof JCheckBoxMenuItem)
257 ((JCheckBoxMenuItem) c).setSelected(a == c);
261 // only fire event if we weren't selected before
262 _handler.itemStateChanged(e);
267 a.addMouseListener(new MouseListener()
271 public void mouseReleased(MouseEvent e)
273 // TODO Auto-generated method stub
278 public void mousePressed(MouseEvent e)
280 // TODO Auto-generated method stub
285 public void mouseExited(MouseEvent e)
289 p.setSelected(false);
290 } catch (Exception ex)
297 public void mouseEntered(MouseEvent e)
303 } catch (Exception ex)
310 public void mouseClicked(MouseEvent e)