dynamic alignmentPanel menu class
[jalview.git] / src / jalview / gui / ViewSelectionMenu.java
1 package jalview.gui;
2
3 import java.awt.Component;
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
6 import java.awt.event.ItemEvent;
7 import java.awt.event.ItemListener;
8 import java.awt.event.MouseEvent;
9 import java.awt.event.MouseListener;
10 import java.util.List;
11
12 import javax.swing.JCheckBoxMenuItem;
13 import javax.swing.JMenu;
14 import javax.swing.JMenuItem;
15 import javax.swing.event.MenuEvent;
16 import javax.swing.event.MenuListener;
17
18 /**
19  * this is an implementation of an abstract Jalview GUI class that provides a
20  * dialog/menu which allows the user to select/deselect specific views from a
21  * list of associated views.
22  * 
23  * @author JimP
24  * 
25  */
26 public class ViewSelectionMenu extends JMenu
27 {
28   public interface ViewSetProvider {
29     public AlignmentPanel[] getAllAlignmentPanels();
30   }
31   private ViewSetProvider _allviews;
32   private List<AlignmentPanel> _selectedviews;
33   private ItemListener _handler;
34   @Override
35   protected void finalize() throws Throwable
36   {
37     _selectedviews=null;
38     _handler=null;
39     _allviews=null;
40     super.finalize();
41   }
42   /**
43    * create a new view selection menu. This menu has some standard entries
44    * (select all, invert selection), and a checkbox for every view. Mousing over
45    * a view entry will cause it to be raised/selected in the Desktop, allowing
46    * the user to easily identify which view is being referred to.
47    * 
48    * @param title
49    *          Name of menu
50    * @param allviews
51    *          all the views that might be selected
52    * @param selectedviews
53    *          the list of selected views which will be updated when
54    *          selection/deselections occur
55    * @param handler
56    *          a handler called for each selection/deselection - use this to
57    *          update any gui elements which need to reflect current
58    *          selection/deselection state
59    */
60   public ViewSelectionMenu(String title,
61           final ViewSetProvider allviews,
62           final List<AlignmentPanel> selectedviews,
63           final ItemListener handler)
64   {
65     super(title);
66     this._allviews = allviews;
67     this._selectedviews = selectedviews;
68     this._handler=handler;
69     addMenuListener(new MenuListener()
70     {
71       
72       @Override
73       public void menuSelected(MenuEvent e)
74       {
75         rebuild();
76         
77       }
78       
79       @Override
80       public void menuDeselected(MenuEvent e)
81       {
82         // TODO Auto-generated method stub
83         
84       }
85       
86       @Override
87       public void menuCanceled(MenuEvent e)
88       {
89         // TODO Auto-generated method stub
90         
91       }
92     });
93   }
94   private void rebuild() {
95     removeAll();
96     AlignmentPanel[] allviews=_allviews.getAllAlignmentPanels();
97     if (allviews==null)
98     {
99       setVisible(false);
100       return;
101     }
102     if (allviews.length >= 2)
103     {
104       JMenuItem item;
105       add(item = new JMenuItem("Select all views"));
106       item.addActionListener(new ActionListener()
107       {
108
109         @Override
110         public void actionPerformed(ActionEvent e)
111         {
112           for (Component c : getMenuComponents())
113           {
114             if (c instanceof JCheckBoxMenuItem)
115             {
116               if (!((JCheckBoxMenuItem) c).isSelected())
117               {
118                 ((JCheckBoxMenuItem) c).doClick();
119               }
120             }
121           }
122         }
123       });
124       add(item = new JMenuItem("Invert selection"));
125       item.addActionListener(new ActionListener()
126       {
127
128         @Override
129         public void actionPerformed(ActionEvent e)
130         {
131           for (Component c : getMenuComponents())
132           {
133             if (c instanceof JCheckBoxMenuItem)
134             {
135               ((JCheckBoxMenuItem) c).doClick();
136             }
137           }
138         }
139       });
140
141     }
142     for (AlignmentPanel ap : allviews)
143     {
144       String nm = ((ap.getViewName() == null || ap.getViewName().length() == 0) ? ""
145               : ap.getViewName() + " for ")
146               + ap.alignFrame.getTitle();
147       JCheckBoxMenuItem a = new JCheckBoxMenuItem(nm,
148               _selectedviews.contains(ap));
149       final AlignmentPanel p = ap;
150       a.addItemListener(new ItemListener()
151       {
152         @Override
153         public void itemStateChanged(ItemEvent e)
154         {
155           if (e.getStateChange() == e.SELECTED)
156           {
157             _selectedviews.add(p);
158           }
159           else
160           {
161             _selectedviews.remove(p);
162           }
163           _handler.itemStateChanged(e);
164         }
165       });
166       a.addMouseListener(new MouseListener()
167       {
168
169         @Override
170         public void mouseReleased(MouseEvent e)
171         {
172           // TODO Auto-generated method stub
173
174         }
175
176         @Override
177         public void mousePressed(MouseEvent e)
178         {
179           // TODO Auto-generated method stub
180
181         }
182
183         @Override
184         public void mouseExited(MouseEvent e)
185         {
186           try
187           {
188             p.setSelected(false);
189           } catch (Exception ex)
190           {
191           }
192           ;
193         }
194
195         @Override
196         public void mouseEntered(MouseEvent e)
197         {
198
199           try
200           {
201             p.setSelected(true);
202           } catch (Exception ex)
203           {
204           }
205           ;
206         }
207
208         @Override
209         public void mouseClicked(MouseEvent e)
210         {
211         }
212       });
213       add(a);
214     }
215   }
216
217 }