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