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