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