after merge
[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   final 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 apanel, final 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 = apanel;\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         String id = seq.getName();\r
101         if(id.indexOf("|")>-1)\r
102              id = id.substring(id.lastIndexOf("|")+1);\r
103 \r
104         final String url = link.substring(link.indexOf("|")+1, link.indexOf("$SEQUENCE_ID$"))\r
105                + id +\r
106                link.substring(link.indexOf("$SEQUENCE_ID$") + 13);\r
107 \r
108            item.addActionListener(new java.awt.event.ActionListener()\r
109            {\r
110                public void actionPerformed(ActionEvent e)\r
111                {\r
112                   ap.alignFrame.showURL(url, target);\r
113                }\r
114            });\r
115           linkMenu.add(item);\r
116       }\r
117       add(linkMenu);\r
118 \r
119       item = new MenuItem("Show PDB Structure");\r
120       item.addActionListener(new java.awt.event.ActionListener()\r
121            {\r
122                public void actionPerformed(ActionEvent e)\r
123                {\r
124                   addPDB(seq);\r
125                }\r
126            });\r
127 \r
128       add(item);\r
129 \r
130 \r
131     }\r
132   }\r
133 \r
134   void addPDB(Sequence seq)\r
135   {\r
136     CutAndPasteTransfer cap = new CutAndPasteTransfer(true, ap.alignFrame.applet);\r
137     cap.setText("Paste your PDB file here.");\r
138     cap.setPDBImport(seq, ap.seqPanel.seqCanvas);\r
139     Frame frame = new Frame();\r
140     frame.add(cap);\r
141     jalview.bin.JalviewLite.addFrame(frame, "Paste PDB file ", 400, 300);\r
142   }\r
143 \r
144   private void jbInit()\r
145       throws Exception\r
146   {\r
147     groupMenu.setLabel("Group");\r
148     groupMenu.setLabel("Define");\r
149 \r
150     unGroupMenuItem.setLabel("Remove Group");\r
151     unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
152     {\r
153       public void actionPerformed(ActionEvent e)\r
154       {\r
155         unGroupMenuItem_actionPerformed(e);\r
156       }\r
157     });\r
158 \r
159     nucleotideMenuItem.setLabel("Nucleotide");\r
160     nucleotideMenuItem.addActionListener(new ActionListener()\r
161     {\r
162       public void actionPerformed(ActionEvent e)\r
163       {\r
164         nucleotideMenuItem_actionPerformed(e);\r
165       }\r
166     });\r
167     conservationMenuItem.addItemListener(new ItemListener()\r
168     {\r
169       public void itemStateChanged(ItemEvent itemEvent)\r
170       {\r
171         conservationMenuItem_itemStateChanged(itemEvent);\r
172       }\r
173     });\r
174     abovePIDColour.addItemListener(new ItemListener()\r
175     {\r
176       public void itemStateChanged(ItemEvent itemEvent)\r
177       {\r
178         abovePIDColour_itemStateChanged(itemEvent);\r
179       }\r
180     });\r
181     colourMenu.setLabel("Group Colour");\r
182     showBoxes.setLabel("Boxes");\r
183     showBoxes.setState(true);\r
184     showBoxes.addItemListener(new ItemListener()\r
185     {\r
186       public void itemStateChanged(ItemEvent itemEvent)\r
187       {\r
188         showBoxes_itemStateChanged(itemEvent);\r
189       }\r
190     });\r
191 \r
192     showText.setLabel("Text");\r
193     showText.addItemListener(new ItemListener()\r
194     {\r
195       public void itemStateChanged(ItemEvent itemEvent)\r
196       {\r
197         showText_itemStateChanged(itemEvent);\r
198       }\r
199     });\r
200     showColourText.setLabel("Colour Text");\r
201     showColourText.addItemListener(new ItemListener()\r
202     {\r
203       public void itemStateChanged(ItemEvent itemEvent)\r
204       {\r
205         showColourText_itemStateChanged(itemEvent);\r
206       }\r
207     });\r
208 \r
209     add(groupMenu);\r
210     groupMenu.add(unGroupMenuItem);\r
211     groupMenu.add(colourMenu);\r
212     groupMenu.addSeparator();\r
213     groupMenu.add(showBoxes);\r
214     groupMenu.add(showText);\r
215     groupMenu.add(showColourText);\r
216     colourMenu.add(noColourmenuItem);\r
217     colourMenu.add(clustalColour);\r
218     colourMenu.add(BLOSUM62Colour);\r
219     colourMenu.add(PIDColour);\r
220     colourMenu.add(zappoColour);\r
221     colourMenu.add(taylorColour);\r
222     colourMenu.add(hydrophobicityColour);\r
223     colourMenu.add(helixColour);\r
224     colourMenu.add(strandColour);\r
225     colourMenu.add(turnColour);\r
226     colourMenu.add(buriedColour);\r
227     colourMenu.add(nucleotideMenuItem);\r
228     colourMenu.add(userDefinedColour);\r
229     colourMenu.addSeparator();\r
230     colourMenu.add(abovePIDColour);\r
231     colourMenu.add(conservationMenuItem);\r
232 \r
233     noColourmenuItem.setLabel("None");\r
234     noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
235     {\r
236       public void actionPerformed(ActionEvent e)\r
237       {\r
238         noColourmenuItem_actionPerformed(e);\r
239       }\r
240     });\r
241 \r
242     clustalColour.setLabel("Clustalx colours");\r
243     clustalColour.addActionListener(new java.awt.event.ActionListener()\r
244     {\r
245       public void actionPerformed(ActionEvent e)\r
246       {\r
247         clustalColour_actionPerformed(e);\r
248       }\r
249     });\r
250     zappoColour.setLabel("Zappo");\r
251     zappoColour.addActionListener(new java.awt.event.ActionListener()\r
252     {\r
253       public void actionPerformed(ActionEvent e)\r
254       {\r
255         zappoColour_actionPerformed(e);\r
256       }\r
257     });\r
258     taylorColour.setLabel("Taylor");\r
259     taylorColour.addActionListener(new java.awt.event.ActionListener()\r
260     {\r
261       public void actionPerformed(ActionEvent e)\r
262       {\r
263         taylorColour_actionPerformed(e);\r
264       }\r
265     });\r
266     hydrophobicityColour.setLabel("Hydrophobicity");\r
267     hydrophobicityColour.addActionListener(new java.awt.event.ActionListener()\r
268     {\r
269       public void actionPerformed(ActionEvent e)\r
270       {\r
271         hydrophobicityColour_actionPerformed(e);\r
272       }\r
273     });\r
274     helixColour.setLabel("Helix propensity");\r
275     helixColour.addActionListener(new java.awt.event.ActionListener()\r
276     {\r
277       public void actionPerformed(ActionEvent e)\r
278       {\r
279         helixColour_actionPerformed(e);\r
280       }\r
281     });\r
282     strandColour.setLabel("Strand propensity");\r
283     strandColour.addActionListener(new java.awt.event.ActionListener()\r
284     {\r
285       public void actionPerformed(ActionEvent e)\r
286       {\r
287         strandColour_actionPerformed(e);\r
288       }\r
289     });\r
290     turnColour.setLabel("Turn propensity");\r
291     turnColour.addActionListener(new java.awt.event.ActionListener()\r
292     {\r
293       public void actionPerformed(ActionEvent e)\r
294       {\r
295         turnColour_actionPerformed(e);\r
296       }\r
297     });\r
298     buriedColour.setLabel("Buried Index");\r
299     buriedColour.addActionListener(new java.awt.event.ActionListener()\r
300     {\r
301       public void actionPerformed(ActionEvent e)\r
302       {\r
303         buriedColour_actionPerformed(e);\r
304       }\r
305     });\r
306     abovePIDColour.setLabel("Above % Identity");\r
307 \r
308     userDefinedColour.setLabel("User Defined");\r
309     userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
310     {\r
311       public void actionPerformed(ActionEvent e)\r
312       {\r
313         userDefinedColour_actionPerformed(e);\r
314       }\r
315     });\r
316     PIDColour.setLabel("Percentage Identity");\r
317     PIDColour.addActionListener(new java.awt.event.ActionListener()\r
318     {\r
319       public void actionPerformed(ActionEvent e)\r
320       {\r
321         PIDColour_actionPerformed(e);\r
322       }\r
323     });\r
324     BLOSUM62Colour.setLabel("BLOSUM62");\r
325     BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
326     {\r
327       public void actionPerformed(ActionEvent e)\r
328       {\r
329         BLOSUM62Colour_actionPerformed(e);\r
330       }\r
331     });\r
332     conservationMenuItem.setLabel("Conservation");\r
333 \r
334   }\r
335 \r
336   void refresh()\r
337   {\r
338     SequenceGroup sg = getGroup();\r
339     if(sg!=null)\r
340     {\r
341       SuperGroup superG = ap.av.alignment.getSuperGroup(sg);\r
342 \r
343       if (superG != null)\r
344       {\r
345         superG.setSuperGroupProperties(sg);\r
346       }\r
347         }\r
348     ap.seqPanel.seqCanvas.repaint();\r
349     if(ap.overviewPanel!=null)\r
350       ap.overviewPanel.updateOverviewImage();\r
351   }\r
352 \r
353   protected void clustalColour_actionPerformed(ActionEvent e)\r
354   {\r
355     SequenceGroup sg = getGroup();\r
356     sg.cs = new ClustalxColourScheme(sg.sequences, ap.av.alignment.getWidth());\r
357     refresh();\r
358   }\r
359 \r
360   protected void zappoColour_actionPerformed(ActionEvent e)\r
361   {\r
362     getGroup().cs = new ZappoColourScheme();\r
363     refresh();\r
364   }\r
365 \r
366   protected void taylorColour_actionPerformed(ActionEvent e)\r
367   {\r
368     getGroup().cs = new TaylorColourScheme();\r
369     refresh();\r
370   }\r
371 \r
372   protected void hydrophobicityColour_actionPerformed(ActionEvent e)\r
373   {\r
374     getGroup().cs = new HydrophobicColourScheme();\r
375     refresh();\r
376   }\r
377 \r
378   protected void helixColour_actionPerformed(ActionEvent e)\r
379   {\r
380     getGroup().cs = new HelixColourScheme();\r
381     refresh();\r
382   }\r
383 \r
384   protected void strandColour_actionPerformed(ActionEvent e)\r
385   {\r
386     getGroup().cs = new StrandColourScheme();\r
387     refresh();\r
388   }\r
389 \r
390   protected void turnColour_actionPerformed(ActionEvent e)\r
391   {\r
392     getGroup().cs = new TurnColourScheme();\r
393     refresh();\r
394   }\r
395 \r
396   protected void buriedColour_actionPerformed(ActionEvent e)\r
397   {\r
398     getGroup().cs = new BuriedColourScheme();\r
399     refresh();\r
400   }\r
401 \r
402   public void nucleotideMenuItem_actionPerformed(ActionEvent e)\r
403   {\r
404     getGroup().cs = new NucleotideColourScheme();\r
405     refresh();\r
406   }\r
407 \r
408   protected void abovePIDColour_itemStateChanged(ItemEvent ie)\r
409   {\r
410     SequenceGroup sg = getGroup();\r
411     if(sg.cs==null)\r
412           return;\r
413 \r
414     if (abovePIDColour.getState())\r
415     {\r
416       sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
417                                                ap.av.alignment.getWidth()));\r
418       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs,\r
419           getGroup().getName());\r
420 \r
421       sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());\r
422 \r
423       SliderPanel.showPIDSlider();\r
424 \r
425     }\r
426     else // remove PIDColouring\r
427     {\r
428       sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
429     }\r
430 \r
431     refresh();\r
432 \r
433   }\r
434 \r
435   protected void userDefinedColour_actionPerformed(ActionEvent e)\r
436   {\r
437     new UserDefinedColours(ap, getGroup());\r
438   }\r
439 \r
440   protected void PIDColour_actionPerformed(ActionEvent e)\r
441   {\r
442     SequenceGroup sg = getGroup();\r
443     sg.cs = new PIDColourScheme();\r
444     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
445                                              ap.av.alignment.getWidth()));\r
446     refresh();\r
447   }\r
448 \r
449   protected void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
450   {\r
451     SequenceGroup sg = getGroup();\r
452 \r
453     sg.cs = new Blosum62ColourScheme();\r
454 \r
455     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
456                                              ap.av.alignment.getWidth()));\r
457 \r
458     refresh();\r
459   }\r
460 \r
461   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
462   {\r
463     getGroup().cs = null;\r
464     refresh();\r
465   }\r
466 \r
467   protected void conservationMenuItem_itemStateChanged(ItemEvent ie)\r
468   {\r
469     SequenceGroup sg = getGroup();\r
470     if(sg.cs==null)\r
471           return;\r
472 \r
473     if (conservationMenuItem.getState())\r
474     {\r
475 \r
476       Conservation c = new Conservation("Group",\r
477                                         ResidueProperties.propHash, 3,\r
478                                         sg.sequences, 0,\r
479                                         ap.av.alignment.getWidth());\r
480 \r
481       c.calculate();\r
482       c.verdict(false, ap.av.ConsPercGaps);\r
483 \r
484       sg.cs.setConservation(c);\r
485 \r
486       SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());\r
487       SliderPanel.showConservationSlider();\r
488     }\r
489     else // remove ConservationColouring\r
490     {\r
491       sg.cs.setConservation(null);\r
492     }\r
493 \r
494     refresh();\r
495   }\r
496 \r
497 \r
498   SequenceGroup getGroup()\r
499   {\r
500     SequenceGroup sg = ap.av.getSelectionGroup();\r
501 \r
502     // this method won't add a new group if it already exists\r
503     if(sg!=null)\r
504       ap.av.alignment.addGroup(sg);\r
505 \r
506     return sg;\r
507   }\r
508 \r
509   void unGroupMenuItem_actionPerformed(ActionEvent e)\r
510   {\r
511     SequenceGroup sg = ap.av.getSelectionGroup();\r
512     ap.av.alignment.deleteGroup(sg);\r
513     ap.av.setSelectionGroup(null);\r
514     ap.repaint();\r
515   }\r
516 \r
517   public void showColourText_itemStateChanged(ItemEvent itemEvent)\r
518   {\r
519     getGroup().setColourText(showColourText.getState());\r
520     refresh();\r
521   }\r
522 \r
523   public void showText_itemStateChanged(ItemEvent itemEvent)\r
524   {\r
525     getGroup().setDisplayText(showText.getState());\r
526     refresh();\r
527   }\r
528 \r
529   public void showBoxes_itemStateChanged(ItemEvent itemEvent)\r
530   {\r
531     getGroup().setDisplayBoxes(showBoxes.getState());\r
532     refresh();\r
533   }\r
534 \r
535 }\r