dont add null group
[jalview.git] / src / jalview / appletgui / APopupMenu.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 \r
20 package jalview.appletgui;\r
21 \r
22 import java.awt.*;\r
23 import java.awt.event.*;\r
24 \r
25 import jalview.analysis.*;\r
26 import jalview.datamodel.*;\r
27 import jalview.schemes.*;\r
28 \r
29 public class APopupMenu\r
30     extends java.awt.PopupMenu\r
31 {\r
32   Menu groupMenu = new Menu();\r
33   protected MenuItem clustalColour = new MenuItem();\r
34   protected MenuItem zappoColour = new MenuItem();\r
35   protected MenuItem taylorColour = new MenuItem();\r
36   protected MenuItem hydrophobicityColour = new MenuItem();\r
37   protected MenuItem helixColour = new MenuItem();\r
38   protected MenuItem strandColour = new MenuItem();\r
39   protected MenuItem turnColour = new MenuItem();\r
40   protected MenuItem buriedColour = new MenuItem();\r
41   protected CheckboxMenuItem abovePIDColour = new CheckboxMenuItem();\r
42   protected MenuItem userDefinedColour = new MenuItem();\r
43   protected MenuItem PIDColour = new MenuItem();\r
44   protected MenuItem BLOSUM62Colour = new MenuItem();\r
45   MenuItem noColourmenuItem = new MenuItem();\r
46   protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();\r
47 \r
48   AlignmentPanel ap;\r
49   Menu sequenceMenu = new Menu();\r
50   MenuItem sequenceName = new MenuItem();\r
51   Sequence sequence;\r
52   MenuItem unGroupMenuItem = new MenuItem();\r
53   MenuItem nucleotideMenuItem = new MenuItem();\r
54   Menu colourMenu = new Menu();\r
55   CheckboxMenuItem showBoxes = new CheckboxMenuItem();\r
56   CheckboxMenuItem showText = new CheckboxMenuItem();\r
57   CheckboxMenuItem showColourText = new CheckboxMenuItem();\r
58 \r
59   public APopupMenu(AlignmentPanel ap, Sequence seq)\r
60   {\r
61     ///////////////////////////////////////////////////////////\r
62     // If this is activated from the sequence panel, the user may want to\r
63     // edit or annotate a particular residue. Therefore display the residue menu\r
64     //\r
65     // If from the IDPanel, we must display the sequence menu\r
66     //////////////////////////////////////////////////////////\r
67 \r
68     this.ap = ap;\r
69     sequence = seq;\r
70 \r
71     try\r
72     {\r
73       jbInit();\r
74     }\r
75     catch (Exception e)\r
76     {\r
77       e.printStackTrace();\r
78     }\r
79 \r
80     SequenceGroup sg = ap.av.getSelectionGroup();\r
81     if (sg != null)\r
82     {\r
83       showText.setState(sg.getDisplayText());\r
84       showColourText.setState(sg.getColourText());\r
85       showBoxes.setState(sg.getDisplayBoxes());\r
86     }\r
87 \r
88     if (!ap.av.alignment.getGroups().contains(sg))\r
89     {\r
90       groupMenu.remove(unGroupMenuItem);\r
91     }\r
92 \r
93     if (seq == null)\r
94     {\r
95       remove(sequenceMenu);\r
96     }\r
97 \r
98   }\r
99 \r
100   private void jbInit()\r
101       throws Exception\r
102   {\r
103     groupMenu.setLabel("Group");\r
104     groupMenu.setLabel("Define");\r
105 \r
106     sequenceMenu.setLabel("Sequence");\r
107     sequenceName.setLabel("Edit name");\r
108     unGroupMenuItem.setLabel("Remove Group");\r
109     unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
110     {\r
111       public void actionPerformed(ActionEvent e)\r
112       {\r
113         unGroupMenuItem_actionPerformed(e);\r
114       }\r
115     });\r
116 \r
117     nucleotideMenuItem.setLabel("Nucleotide");\r
118     nucleotideMenuItem.addActionListener(new ActionListener()\r
119     {\r
120       public void actionPerformed(ActionEvent e)\r
121       {\r
122         nucleotideMenuItem_actionPerformed(e);\r
123       }\r
124     });\r
125     conservationMenuItem.addItemListener(new ItemListener()\r
126     {\r
127       public void itemStateChanged(ItemEvent itemEvent)\r
128       {\r
129         conservationMenuItem_itemStateChanged(itemEvent);\r
130       }\r
131     });\r
132     abovePIDColour.addItemListener(new ItemListener()\r
133     {\r
134       public void itemStateChanged(ItemEvent itemEvent)\r
135       {\r
136         abovePIDColour_itemStateChanged(itemEvent);\r
137       }\r
138     });\r
139     colourMenu.setLabel("Group Colour");\r
140     showBoxes.setLabel("Boxes");\r
141     showBoxes.setState(true);\r
142     showBoxes.addItemListener(new ItemListener()\r
143     {\r
144       public void itemStateChanged(ItemEvent itemEvent)\r
145       {\r
146         showBoxes_itemStateChanged(itemEvent);\r
147       }\r
148     });\r
149 \r
150     showText.setLabel("Text");\r
151     showText.addItemListener(new ItemListener()\r
152     {\r
153       public void itemStateChanged(ItemEvent itemEvent)\r
154       {\r
155         showText_itemStateChanged(itemEvent);\r
156       }\r
157     });\r
158     showColourText.setLabel("Colour Text");\r
159     showColourText.addItemListener(new ItemListener()\r
160     {\r
161       public void itemStateChanged(ItemEvent itemEvent)\r
162       {\r
163         showColourText_itemStateChanged(itemEvent);\r
164       }\r
165     });\r
166 \r
167     add(groupMenu);\r
168     this.add(sequenceMenu);\r
169     groupMenu.add(unGroupMenuItem);\r
170     groupMenu.add(colourMenu);\r
171     groupMenu.addSeparator();\r
172     groupMenu.add(showBoxes);\r
173     groupMenu.add(showText);\r
174     groupMenu.add(showColourText);\r
175     sequenceMenu.add(sequenceName);\r
176     colourMenu.add(noColourmenuItem);\r
177     colourMenu.add(clustalColour);\r
178     colourMenu.add(BLOSUM62Colour);\r
179     colourMenu.add(PIDColour);\r
180     colourMenu.add(zappoColour);\r
181     colourMenu.add(taylorColour);\r
182     colourMenu.add(hydrophobicityColour);\r
183     colourMenu.add(helixColour);\r
184     colourMenu.add(strandColour);\r
185     colourMenu.add(turnColour);\r
186     colourMenu.add(buriedColour);\r
187     colourMenu.add(nucleotideMenuItem);\r
188     colourMenu.add(userDefinedColour);\r
189     colourMenu.addSeparator();\r
190     colourMenu.add(abovePIDColour);\r
191     colourMenu.add(conservationMenuItem);\r
192 \r
193     noColourmenuItem.setLabel("None");\r
194     noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
195     {\r
196       public void actionPerformed(ActionEvent e)\r
197       {\r
198         noColourmenuItem_actionPerformed(e);\r
199       }\r
200     });\r
201 \r
202     clustalColour.setLabel("Clustalx colours");\r
203     clustalColour.addActionListener(new java.awt.event.ActionListener()\r
204     {\r
205       public void actionPerformed(ActionEvent e)\r
206       {\r
207         clustalColour_actionPerformed(e);\r
208       }\r
209     });\r
210     zappoColour.setLabel("Zappo");\r
211     zappoColour.addActionListener(new java.awt.event.ActionListener()\r
212     {\r
213       public void actionPerformed(ActionEvent e)\r
214       {\r
215         zappoColour_actionPerformed(e);\r
216       }\r
217     });\r
218     taylorColour.setLabel("Taylor");\r
219     taylorColour.addActionListener(new java.awt.event.ActionListener()\r
220     {\r
221       public void actionPerformed(ActionEvent e)\r
222       {\r
223         taylorColour_actionPerformed(e);\r
224       }\r
225     });\r
226     hydrophobicityColour.setLabel("Hydrophobicity");\r
227     hydrophobicityColour.addActionListener(new java.awt.event.ActionListener()\r
228     {\r
229       public void actionPerformed(ActionEvent e)\r
230       {\r
231         hydrophobicityColour_actionPerformed(e);\r
232       }\r
233     });\r
234     helixColour.setLabel("Helix propensity");\r
235     helixColour.addActionListener(new java.awt.event.ActionListener()\r
236     {\r
237       public void actionPerformed(ActionEvent e)\r
238       {\r
239         helixColour_actionPerformed(e);\r
240       }\r
241     });\r
242     strandColour.setLabel("Strand propensity");\r
243     strandColour.addActionListener(new java.awt.event.ActionListener()\r
244     {\r
245       public void actionPerformed(ActionEvent e)\r
246       {\r
247         strandColour_actionPerformed(e);\r
248       }\r
249     });\r
250     turnColour.setLabel("Turn propensity");\r
251     turnColour.addActionListener(new java.awt.event.ActionListener()\r
252     {\r
253       public void actionPerformed(ActionEvent e)\r
254       {\r
255         turnColour_actionPerformed(e);\r
256       }\r
257     });\r
258     buriedColour.setLabel("Buried Index");\r
259     buriedColour.addActionListener(new java.awt.event.ActionListener()\r
260     {\r
261       public void actionPerformed(ActionEvent e)\r
262       {\r
263         buriedColour_actionPerformed(e);\r
264       }\r
265     });\r
266     abovePIDColour.setLabel("Above % Identity");\r
267 \r
268     userDefinedColour.setLabel("User Defined");\r
269     userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
270     {\r
271       public void actionPerformed(ActionEvent e)\r
272       {\r
273         userDefinedColour_actionPerformed(e);\r
274       }\r
275     });\r
276     PIDColour.setLabel("Percentage Identity");\r
277     PIDColour.addActionListener(new java.awt.event.ActionListener()\r
278     {\r
279       public void actionPerformed(ActionEvent e)\r
280       {\r
281         PIDColour_actionPerformed(e);\r
282       }\r
283     });\r
284     BLOSUM62Colour.setLabel("BLOSUM62");\r
285     BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
286     {\r
287       public void actionPerformed(ActionEvent e)\r
288       {\r
289         BLOSUM62Colour_actionPerformed(e);\r
290       }\r
291     });\r
292     conservationMenuItem.setLabel("Conservation");\r
293 \r
294   }\r
295 \r
296   void refresh()\r
297   {\r
298     SequenceGroup sg = getGroup();\r
299     if(sg!=null)\r
300     {\r
301       SuperGroup superG = ap.av.alignment.getSuperGroup(sg);\r
302 \r
303       if (superG != null)\r
304       {\r
305         superG.setSuperGroupProperties(sg);\r
306       }\r
307         }\r
308     ap.seqPanel.seqCanvas.repaint();\r
309   }\r
310 \r
311   protected void clustalColour_actionPerformed(ActionEvent e)\r
312   {\r
313     SequenceGroup sg = getGroup();\r
314     sg.cs = new ClustalxColourScheme(sg.sequences, ap.av.alignment.getWidth());\r
315     refresh();\r
316   }\r
317 \r
318   protected void zappoColour_actionPerformed(ActionEvent e)\r
319   {\r
320     getGroup().cs = new ZappoColourScheme();\r
321     refresh();\r
322   }\r
323 \r
324   protected void taylorColour_actionPerformed(ActionEvent e)\r
325   {\r
326     getGroup().cs = new TaylorColourScheme();\r
327     refresh();\r
328   }\r
329 \r
330   protected void hydrophobicityColour_actionPerformed(ActionEvent e)\r
331   {\r
332     getGroup().cs = new HydrophobicColourScheme();\r
333     refresh();\r
334   }\r
335 \r
336   protected void helixColour_actionPerformed(ActionEvent e)\r
337   {\r
338     getGroup().cs = new HelixColourScheme();\r
339     refresh();\r
340   }\r
341 \r
342   protected void strandColour_actionPerformed(ActionEvent e)\r
343   {\r
344     getGroup().cs = new StrandColourScheme();\r
345     refresh();\r
346   }\r
347 \r
348   protected void turnColour_actionPerformed(ActionEvent e)\r
349   {\r
350     getGroup().cs = new TurnColourScheme();\r
351     refresh();\r
352   }\r
353 \r
354   protected void buriedColour_actionPerformed(ActionEvent e)\r
355   {\r
356     getGroup().cs = new BuriedColourScheme();\r
357     refresh();\r
358   }\r
359 \r
360   public void nucleotideMenuItem_actionPerformed(ActionEvent e)\r
361   {\r
362     getGroup().cs = new NucleotideColourScheme();\r
363     refresh();\r
364   }\r
365 \r
366   protected void abovePIDColour_itemStateChanged(ItemEvent ie)\r
367   {\r
368     SequenceGroup sg = getGroup();\r
369     if (abovePIDColour.getState())\r
370     {\r
371       sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
372                                                ap.av.alignment.getWidth()));\r
373       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs,\r
374           getGroup().getName());\r
375       if (sg.cs instanceof ResidueColourScheme)\r
376       {\r
377         ( (ResidueColourScheme) sg.cs).setThreshold(threshold);\r
378       }\r
379       else if (sg.cs instanceof ScoreColourScheme)\r
380       {\r
381         ( (ScoreColourScheme) sg.cs).setThreshold(threshold);\r
382       }\r
383 \r
384       SliderPanel.showPIDSlider();\r
385 \r
386     }\r
387     else // remove PIDColouring\r
388     {\r
389       ResidueColourScheme rcs = (ResidueColourScheme) sg.cs;\r
390       rcs.setThreshold(0);\r
391       sg.cs = rcs;\r
392     }\r
393 \r
394     refresh();\r
395 \r
396   }\r
397 \r
398   protected void userDefinedColour_actionPerformed(ActionEvent e)\r
399   {\r
400     new UserDefinedColours(ap, getGroup());\r
401   }\r
402 \r
403   protected void PIDColour_actionPerformed(ActionEvent e)\r
404   {\r
405     SequenceGroup sg = getGroup();\r
406     sg.cs = new PIDColourScheme();\r
407     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
408                                              ap.av.alignment.getWidth()));\r
409     refresh();\r
410   }\r
411 \r
412   protected void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
413   {\r
414     SequenceGroup sg = getGroup();\r
415 \r
416     sg.cs = new Blosum62ColourScheme();\r
417 \r
418     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
419                                              ap.av.alignment.getWidth()));\r
420 \r
421     refresh();\r
422   }\r
423 \r
424   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
425   {\r
426     getGroup().cs = null;\r
427     refresh();\r
428   }\r
429 \r
430   protected void conservationMenuItem_itemStateChanged(ItemEvent ie)\r
431   {\r
432     SequenceGroup sg = getGroup();\r
433 \r
434     if (conservationMenuItem.getState())\r
435     {\r
436 \r
437       Conservation c = new Conservation("Group",\r
438                                         ResidueProperties.propHash, 3,\r
439                                         sg.sequences, 0,\r
440                                         ap.av.alignment.getWidth());\r
441 \r
442       c.calculate();\r
443       c.verdict(false, ap.av.ConsPercGaps);\r
444       ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);\r
445 \r
446       sg.cs = ccs;\r
447 \r
448       SliderPanel.setConservationSlider(ap, ccs, sg.getName());\r
449       SliderPanel.showConservationSlider();\r
450     }\r
451     else // remove ConservationColouring\r
452     {\r
453       ConservationColourScheme ccs = (ConservationColourScheme) sg.cs;\r
454       sg.cs = ccs.cs;\r
455     }\r
456 \r
457     refresh();\r
458   }\r
459 \r
460   protected void analyze_actionPerformed(ActionEvent e)\r
461   {\r
462     CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
463     Frame frame = new Frame();\r
464     frame.add(cap);\r
465     jalview.bin.JalviewLite.addFrame(frame, "Analyze this - ", 400, 300);\r
466     SequenceGroup sg = getGroup();\r
467     StringBuffer sb = new StringBuffer();\r
468 \r
469     for (int i = 0; i < sg.sequences.size(); i++)\r
470     {\r
471       Sequence tmp = (Sequence) sg.sequences.elementAt(i);\r
472       sb.append(tmp.getSequence(sg.getStartRes(), sg.getEndRes() + 1));\r
473       sb.append("\n");\r
474     }\r
475 \r
476     sb.append("Something amazing will happen soon");\r
477     cap.setText(sb.toString());\r
478 \r
479   }\r
480 \r
481   SequenceGroup getGroup()\r
482   {\r
483     SequenceGroup sg = ap.av.getSelectionGroup();\r
484 \r
485     // this method won't add a new group if it already exists\r
486     if(sg!=null)\r
487       ap.av.alignment.addGroup(sg);\r
488 \r
489     return sg;\r
490   }\r
491 \r
492   void unGroupMenuItem_actionPerformed(ActionEvent e)\r
493   {\r
494     SequenceGroup sg = ap.av.getSelectionGroup();\r
495     ap.av.alignment.deleteGroup(sg);\r
496     ap.av.setSelectionGroup(null);\r
497     ap.repaint();\r
498   }\r
499 \r
500   public void showColourText_itemStateChanged(ItemEvent itemEvent)\r
501   {\r
502     getGroup().setColourText(showColourText.getState());\r
503     refresh();\r
504   }\r
505 \r
506   public void showText_itemStateChanged(ItemEvent itemEvent)\r
507   {\r
508     getGroup().setDisplayText(showText.getState());\r
509     refresh();\r
510   }\r
511 \r
512   public void showBoxes_itemStateChanged(ItemEvent itemEvent)\r
513   {\r
514     getGroup().setDisplayBoxes(showBoxes.getState());\r
515     refresh();\r
516   }\r
517 \r
518 }\r