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