c&p changed
[jalview.git] / src / jalview / gui / PopupMenu.java
1 package jalview.gui;\r
2 \r
3 import jalview.datamodel.*;\r
4 import jalview.analysis.*;\r
5 import jalview.schemes.*;\r
6 import java.awt.*;\r
7 import javax.swing.*;\r
8 import java.awt.event.*;\r
9 import jalview.io.*;\r
10 import MCview.*;\r
11 \r
12 public class PopupMenu extends JPopupMenu\r
13 {\r
14   JMenu groupMenu = new JMenu();\r
15   JMenuItem groupName = new JMenuItem();\r
16   protected JRadioButtonMenuItem clustalColour = new JRadioButtonMenuItem();\r
17   protected JRadioButtonMenuItem zappoColour = new JRadioButtonMenuItem();\r
18   protected JRadioButtonMenuItem taylorColour = new JRadioButtonMenuItem();\r
19   protected JRadioButtonMenuItem hydrophobicityColour = new JRadioButtonMenuItem();\r
20   protected JRadioButtonMenuItem helixColour = new JRadioButtonMenuItem();\r
21   protected JRadioButtonMenuItem strandColour = new JRadioButtonMenuItem();\r
22   protected JRadioButtonMenuItem turnColour = new JRadioButtonMenuItem();\r
23   protected JRadioButtonMenuItem buriedColour = new JRadioButtonMenuItem();\r
24   protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();\r
25   protected JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem();\r
26   protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();\r
27   protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();\r
28   JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();\r
29   protected JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();\r
30 \r
31 \r
32   AlignmentPanel ap;\r
33   JMenu sequenceMenu = new JMenu();\r
34   JMenuItem sequenceName = new JMenuItem();\r
35   Sequence sequence;\r
36   JMenuItem unGroupMenuItem = new JMenuItem();\r
37   JMenuItem pdbMenuItem = new JMenuItem();\r
38   JMenuItem outline = new JMenuItem();\r
39   JRadioButtonMenuItem nucleotideMenuItem = new JRadioButtonMenuItem();\r
40   JMenu colourMenu = new JMenu();\r
41   JCheckBoxMenuItem showBoxes = new JCheckBoxMenuItem();\r
42   JCheckBoxMenuItem showText = new JCheckBoxMenuItem();\r
43   JCheckBoxMenuItem showColourText = new JCheckBoxMenuItem();\r
44 \r
45   public PopupMenu(AlignmentPanel ap, Sequence seq)\r
46   {\r
47     ///////////////////////////////////////////////////////////\r
48     // If this is activated from the sequence panel, the user may want to\r
49     // edit or annotate a particular residue. Therefore display the residue menu\r
50     //\r
51     // If from the IDPanel, we must display the sequence menu\r
52     //////////////////////////////////////////////////////////\r
53 \r
54     this.ap = ap;\r
55     sequence = seq;\r
56 \r
57     ButtonGroup colours = new ButtonGroup();\r
58     colours.add(noColourmenuItem);\r
59     colours.add(clustalColour);\r
60     colours.add(zappoColour);\r
61     colours.add(taylorColour);\r
62     colours.add(hydrophobicityColour);\r
63     colours.add(helixColour);\r
64     colours.add(strandColour);\r
65     colours.add(turnColour);\r
66     colours.add(buriedColour);\r
67     colours.add(abovePIDColour);\r
68     colours.add(userDefinedColour);\r
69     colours.add(PIDColour);\r
70     colours.add(BLOSUM62Colour);\r
71 \r
72     try\r
73     {     jbInit();   }\r
74     catch(Exception e)\r
75     {    e.printStackTrace();    }\r
76 \r
77     SequenceGroup sg = ap.av.getSelectionGroup();\r
78     if(sg!=null)\r
79     {\r
80       groupName.setText(sg.getName());\r
81       if(sg.cs instanceof ZappoColourScheme)\r
82         zappoColour.setSelected(true);\r
83       else if(sg.cs instanceof TaylorColourScheme)\r
84         taylorColour.setSelected(true);\r
85       else if (sg.cs instanceof PIDColourScheme)\r
86         PIDColour.setSelected(true);\r
87       else if (sg.cs instanceof Blosum62ColourScheme)\r
88         BLOSUM62Colour.setSelected(true);\r
89       else if (sg.cs instanceof UserColourScheme)\r
90         userDefinedColour.setSelected(true);\r
91       else if (sg.cs instanceof HydrophobicColourScheme)\r
92         hydrophobicityColour.setSelected(true);\r
93       else if (sg.cs instanceof HelixColourScheme)\r
94         helixColour.setSelected(true);\r
95       else if (sg.cs instanceof StrandColourScheme)\r
96         strandColour.setSelected(true);\r
97       else if (sg.cs instanceof TurnColourScheme)\r
98         turnColour.setSelected(true);\r
99       else if (sg.cs instanceof BuriedColourScheme)\r
100         buriedColour.setSelected(true);\r
101       else if (sg.cs instanceof ClustalxColourScheme)\r
102         clustalColour.setSelected(true);\r
103       else\r
104         noColourmenuItem.setSelected(true);\r
105 \r
106       if (sg.cs instanceof ConservationColourScheme)\r
107         conservationMenuItem.setSelected(true);\r
108 \r
109       showText.setSelected(sg.getDisplayText());\r
110       showColourText.setSelected(sg.getColourText());\r
111       showBoxes.setSelected(sg.getDisplayBoxes());\r
112     }\r
113 \r
114     if( !ap.av.alignment.getGroups().contains(sg))\r
115       unGroupMenuItem.setVisible(false);\r
116     else\r
117       groupMenu.insertSeparator(3);\r
118 \r
119     if(seq==null)\r
120        sequenceMenu.setVisible(false);\r
121 \r
122   }\r
123   private void jbInit() throws Exception\r
124   {\r
125     groupMenu.setText("Group");\r
126     groupMenu.setText("Define");\r
127     groupName.setText("Name");\r
128     groupName.addActionListener(new java.awt.event.ActionListener()\r
129     {\r
130       public void actionPerformed(ActionEvent e)\r
131       {\r
132         groupName_actionPerformed(e);\r
133       }\r
134     });\r
135     sequenceMenu.setText("Sequence");\r
136     sequenceName.setText("Edit name");\r
137     sequenceName.addActionListener(new java.awt.event.ActionListener()\r
138     {\r
139       public void actionPerformed(ActionEvent e)\r
140       {\r
141         sequenceName_actionPerformed(e);\r
142       }\r
143     });\r
144     PIDColour.setFocusPainted(false);\r
145     unGroupMenuItem.setText("Remove Group");\r
146     unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
147     {\r
148       public void actionPerformed(ActionEvent e)\r
149       {\r
150         unGroupMenuItem_actionPerformed(e);\r
151       }\r
152     });\r
153     pdbMenuItem.setText("View PDB structure");\r
154     pdbMenuItem.addActionListener(new java.awt.event.ActionListener()\r
155     {\r
156       public void actionPerformed(ActionEvent e)\r
157       {\r
158         pdbMenuItem_actionPerformed(e);\r
159       }\r
160     });\r
161     outline.setText("Border colour");\r
162     outline.addActionListener(new java.awt.event.ActionListener()\r
163     {\r
164       public void actionPerformed(ActionEvent e)\r
165       {\r
166         outline_actionPerformed(e);\r
167       }\r
168     });\r
169     nucleotideMenuItem.setText("Nucleotide");\r
170     nucleotideMenuItem.addActionListener(new ActionListener()\r
171     {\r
172       public void actionPerformed(ActionEvent e)\r
173       {\r
174         nucleotideMenuItem_actionPerformed(e);\r
175       }\r
176     });\r
177     colourMenu.setText("Group Colour");\r
178     showBoxes.setText("Boxes");\r
179     showBoxes.setState(true);\r
180     showBoxes.addActionListener(new ActionListener()\r
181     {\r
182       public void actionPerformed(ActionEvent e)\r
183       {\r
184         showBoxes_actionPerformed(e);\r
185       }\r
186     });\r
187     showText.setText("Text");\r
188     showText.setState(true);\r
189     showText.addActionListener(new ActionListener()\r
190     {\r
191       public void actionPerformed(ActionEvent e)\r
192       {\r
193         showText_actionPerformed(e);\r
194       }\r
195     });\r
196     showColourText.setText("Colour Text");\r
197     showColourText.addActionListener(new ActionListener()\r
198     {\r
199       public void actionPerformed(ActionEvent e)\r
200       {\r
201         showColourText_actionPerformed(e);\r
202       }\r
203     });\r
204     add(groupMenu);\r
205     add(sequenceMenu);\r
206     groupMenu.add(groupName);\r
207     groupMenu.addSeparator();\r
208     groupMenu.add(unGroupMenuItem);\r
209     groupMenu.add(colourMenu);\r
210     groupMenu.addSeparator();\r
211     groupMenu.add(showBoxes);\r
212     groupMenu.add(showText);\r
213     groupMenu.add(showColourText);\r
214     groupMenu.addSeparator();\r
215     groupMenu.add(outline);\r
216     sequenceMenu.add(sequenceName);\r
217     sequenceMenu.add(pdbMenuItem);\r
218     colourMenu.add(noColourmenuItem);\r
219     colourMenu.add(clustalColour);\r
220     colourMenu.add(BLOSUM62Colour);\r
221     colourMenu.add(PIDColour);\r
222     colourMenu.add(zappoColour);\r
223     colourMenu.add(taylorColour);\r
224     colourMenu.add(hydrophobicityColour);\r
225     colourMenu.add(helixColour);\r
226     colourMenu.add(strandColour);\r
227     colourMenu.add(turnColour);\r
228     colourMenu.add(buriedColour);\r
229     colourMenu.add(nucleotideMenuItem);\r
230     colourMenu.add(userDefinedColour);\r
231     colourMenu.addSeparator();\r
232     colourMenu.add(abovePIDColour);\r
233     colourMenu.add(conservationMenuItem);\r
234     noColourmenuItem.setText("None");\r
235     noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
236     {\r
237       public void actionPerformed(ActionEvent e)\r
238       {\r
239         noColourmenuItem_actionPerformed(e);\r
240       }\r
241     });\r
242 \r
243     clustalColour.setText("Clustalx colours");\r
244     clustalColour.addActionListener(new java.awt.event.ActionListener()\r
245     {\r
246       public void actionPerformed(ActionEvent e)\r
247       {\r
248         clustalColour_actionPerformed(e);\r
249       }\r
250     });\r
251     zappoColour.setText("Zappo");\r
252     zappoColour.addActionListener(new java.awt.event.ActionListener()\r
253     {\r
254       public void actionPerformed(ActionEvent e)\r
255       {\r
256         zappoColour_actionPerformed(e);\r
257       }\r
258     });\r
259     taylorColour.setText("Taylor");\r
260     taylorColour.addActionListener(new java.awt.event.ActionListener()\r
261     {\r
262       public void actionPerformed(ActionEvent e)\r
263       {\r
264         taylorColour_actionPerformed(e);\r
265       }\r
266     });\r
267     hydrophobicityColour.setText("Hydrophobicity");\r
268     hydrophobicityColour.addActionListener(new java.awt.event.ActionListener()\r
269     {\r
270       public void actionPerformed(ActionEvent e)\r
271       {\r
272         hydrophobicityColour_actionPerformed(e);\r
273       }\r
274     });\r
275     helixColour.setText("Helix propensity");\r
276     helixColour.addActionListener(new java.awt.event.ActionListener()\r
277     {\r
278       public void actionPerformed(ActionEvent e)\r
279       {\r
280         helixColour_actionPerformed(e);\r
281       }\r
282     });\r
283     strandColour.setText("Strand propensity");\r
284     strandColour.addActionListener(new java.awt.event.ActionListener()\r
285     {\r
286       public void actionPerformed(ActionEvent e)\r
287       {\r
288         strandColour_actionPerformed(e);\r
289       }\r
290     });\r
291     turnColour.setText("Turn propensity");\r
292     turnColour.addActionListener(new java.awt.event.ActionListener()\r
293     {\r
294       public void actionPerformed(ActionEvent e)\r
295       {\r
296         turnColour_actionPerformed(e);\r
297       }\r
298     });\r
299     buriedColour.setText("Buried Index");\r
300     buriedColour.addActionListener(new java.awt.event.ActionListener()\r
301     {\r
302       public void actionPerformed(ActionEvent e)\r
303       {\r
304         buriedColour_actionPerformed(e);\r
305       }\r
306     });\r
307     abovePIDColour.setText("Above % Identity");\r
308     abovePIDColour.addActionListener(new java.awt.event.ActionListener()\r
309     {\r
310       public void actionPerformed(ActionEvent e)\r
311       {\r
312         abovePIDColour_actionPerformed(e);\r
313       }\r
314     });\r
315     userDefinedColour.setText("User Defined");\r
316     userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
317     {\r
318       public void actionPerformed(ActionEvent e)\r
319       {\r
320         userDefinedColour_actionPerformed(e);\r
321       }\r
322     });\r
323     PIDColour.setText("Percentage Identity");\r
324     PIDColour.addActionListener(new java.awt.event.ActionListener()\r
325     {\r
326       public void actionPerformed(ActionEvent e)\r
327       {\r
328         PIDColour_actionPerformed(e);\r
329       }\r
330     });\r
331     BLOSUM62Colour.setText("BLOSUM62");\r
332     BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
333     {\r
334       public void actionPerformed(ActionEvent e)\r
335       {\r
336         BLOSUM62Colour_actionPerformed(e);\r
337       }\r
338     });\r
339     conservationMenuItem.setText("Conservation");\r
340    conservationMenuItem.addActionListener(new java.awt.event.ActionListener()\r
341    {\r
342      public void actionPerformed(ActionEvent e)\r
343      {\r
344        conservationMenuItem_actionPerformed(e);\r
345      }\r
346    });\r
347 \r
348 \r
349 \r
350   }\r
351 \r
352   void refresh()\r
353   {\r
354     SequenceGroup sg = getGroup();\r
355     SuperGroup superG = ap.av.alignment.getSuperGroup( sg );\r
356     if( superG !=null)\r
357       superG.setSuperGroupProperties( sg );\r
358 \r
359     ap.seqPanel.repaint();\r
360   }\r
361 \r
362   protected void clustalColour_actionPerformed(ActionEvent e)\r
363   {\r
364     SequenceGroup sg = getGroup();\r
365     sg.cs = new ClustalxColourScheme(sg.sequences, ap.av.alignment.getWidth());\r
366     refresh();\r
367   }\r
368 \r
369   protected void zappoColour_actionPerformed(ActionEvent e)\r
370   {\r
371     getGroup().cs = new ZappoColourScheme();\r
372     refresh();\r
373   }\r
374 \r
375   protected void taylorColour_actionPerformed(ActionEvent e)\r
376   {\r
377     getGroup().cs = new TaylorColourScheme();\r
378     refresh();\r
379   }\r
380 \r
381 \r
382   protected void hydrophobicityColour_actionPerformed(ActionEvent e)\r
383   {\r
384     getGroup().cs = new HydrophobicColourScheme();\r
385     refresh();\r
386   }\r
387 \r
388   protected void helixColour_actionPerformed(ActionEvent e)\r
389   {\r
390     getGroup().cs = new HelixColourScheme();\r
391     refresh();\r
392   }\r
393 \r
394   protected void strandColour_actionPerformed(ActionEvent e)\r
395   {\r
396     getGroup().cs = new StrandColourScheme();\r
397     refresh();\r
398   }\r
399 \r
400   protected void turnColour_actionPerformed(ActionEvent e)\r
401   {\r
402     getGroup().cs = new TurnColourScheme();\r
403     refresh();\r
404   }\r
405 \r
406   protected void buriedColour_actionPerformed(ActionEvent e)\r
407   {\r
408     getGroup().cs = new BuriedColourScheme();\r
409     refresh();\r
410   }\r
411 \r
412   public void nucleotideMenuItem_actionPerformed(ActionEvent e)\r
413   {\r
414     getGroup().cs = new NucleotideColourScheme();\r
415     refresh();\r
416   }\r
417 \r
418 \r
419 \r
420   protected void abovePIDColour_actionPerformed(ActionEvent e)\r
421   {\r
422     SequenceGroup sg = getGroup();\r
423     if (abovePIDColour.isSelected())\r
424     {\r
425       sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
426                                                ap.av.alignment.getWidth()));\r
427       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup().getName());\r
428       if (sg.cs instanceof ResidueColourScheme)\r
429         ( (ResidueColourScheme)sg. cs).setThreshold(threshold);\r
430       else if (sg.cs instanceof ScoreColourScheme)\r
431         ( (ScoreColourScheme) sg.cs).setThreshold(threshold);\r
432 \r
433       SliderPanel.showPIDSlider();\r
434 \r
435 \r
436     }\r
437     else // remove PIDColouring\r
438     {\r
439       ResidueColourScheme rcs = (ResidueColourScheme) sg.cs;\r
440       rcs.setThreshold(0);\r
441       sg.cs = rcs;\r
442     }\r
443 \r
444     refresh();\r
445 \r
446   }\r
447 \r
448 \r
449   protected void userDefinedColour_actionPerformed(ActionEvent e)\r
450   {\r
451     new UserDefinedColours( ap, getGroup());\r
452   }\r
453 \r
454   protected void PIDColour_actionPerformed(ActionEvent e)\r
455   {\r
456     SequenceGroup sg = getGroup();\r
457     sg.cs = new PIDColourScheme();\r
458     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
459                                                ap.av.alignment.getWidth()));\r
460     refresh();\r
461   }\r
462 \r
463   protected void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
464   {\r
465     SequenceGroup sg = getGroup();\r
466 \r
467     sg.cs = new Blosum62ColourScheme();\r
468 \r
469     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
470                                                ap.av.alignment.getWidth()));\r
471 \r
472     refresh();\r
473   }\r
474 \r
475 \r
476   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
477   {\r
478     getGroup().cs = null;\r
479     refresh();\r
480   }\r
481 \r
482   protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
483   {\r
484     SequenceGroup sg = getGroup();\r
485 \r
486     if(conservationMenuItem.isSelected())\r
487     {\r
488 \r
489         Conservation c = new Conservation("Group",\r
490                                           ResidueProperties.propHash, 3,\r
491                                           sg.sequences, 0,\r
492                                           ap.av.alignment.getWidth());\r
493 \r
494         c.calculate();\r
495         c.verdict(false, ap.av.ConsPercGaps);\r
496         ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);\r
497 \r
498 \r
499       sg.cs = ccs;\r
500 \r
501       SliderPanel.setConservationSlider(ap, ccs, sg.getName());\r
502       SliderPanel.showConservationSlider();\r
503     }\r
504     else // remove ConservationColouring\r
505     {\r
506         ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;\r
507         sg.cs = ccs.cs;\r
508     }\r
509 \r
510      refresh();\r
511   }\r
512 \r
513 \r
514   protected void groupName_actionPerformed(ActionEvent e)\r
515   {\r
516     SequenceGroup sg = getGroup();\r
517     String reply = JOptionPane.showInternalInputDialog(Desktop.desktop, "Enter new group name", "Edit group name", JOptionPane.QUESTION_MESSAGE);\r
518     if(reply==null)\r
519       return;\r
520 \r
521     sg.setName(reply);\r
522     groupName.setText(reply);\r
523   }\r
524 \r
525 \r
526   protected void analyze_actionPerformed(ActionEvent e)\r
527   {\r
528      CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
529      JInternalFrame frame = new JInternalFrame();\r
530      frame.setContentPane(cap);\r
531      Desktop.addInternalFrame(frame, "Analyze this - ", 400, 300);\r
532      SequenceGroup sg = getGroup();\r
533      StringBuffer sb = new StringBuffer();\r
534 \r
535      for(int i=0; i<sg.sequences.size(); i++)\r
536      {\r
537        Sequence tmp = (Sequence)sg.sequences.get(i);\r
538        sb.append(  tmp.getSequence(sg.getStartRes(), sg.getEndRes()+1));\r
539        sb.append("\n");\r
540      }\r
541 \r
542      sb.append("Something amazing will happen soon");\r
543      cap.setText( sb.toString() );\r
544 \r
545   }\r
546 \r
547   SequenceGroup getGroup()\r
548   {\r
549     SequenceGroup sg = ap.av.getSelectionGroup();\r
550 \r
551     // this method won't add a new group if it already exists\r
552     ap.av.alignment.addGroup(sg);\r
553 \r
554     return sg;\r
555   }\r
556 \r
557   void sequenceName_actionPerformed(ActionEvent e)\r
558   {\r
559     String id = sequence.getName();\r
560     String s = (String)JOptionPane.showInternalInputDialog(\r
561                 ap,\r
562                 "Edit sequence name",\r
563                 "Edit sequence name ("+sequence.getName()+")",\r
564                 JOptionPane.PLAIN_MESSAGE,\r
565                 null,\r
566                 null,\r
567                 id);\r
568 \r
569     if(s!=null)\r
570     {\r
571       sequence.setName(s);\r
572       ap.repaint();\r
573     }\r
574 \r
575   }\r
576 \r
577   void unGroupMenuItem_actionPerformed(ActionEvent e)\r
578   {\r
579      SequenceGroup sg = ap.av.getSelectionGroup();\r
580      ap.av.alignment.deleteGroup(sg);\r
581      ap.av.setSelectionGroup(null);\r
582      ap.repaint();\r
583   }\r
584 \r
585   void pdbMenuItem_actionPerformed(ActionEvent e)\r
586   {\r
587     if(sequence.getPDBId()==null)\r
588       return;\r
589 \r
590     try\r
591     {\r
592       EBIFetchClient ebi = new EBIFetchClient();\r
593       String[] result = ebi.fetchData("pdb:" + sequence.getPDBId(), null, null);\r
594 \r
595       PDBfile pdb = new PDBfile(result);\r
596 \r
597       rotCanvas rc = new rotCanvas(pdb, sequence, ap.av);\r
598       JInternalFrame frame = new JInternalFrame();\r
599       frame.setContentPane(rc);\r
600       Desktop.addInternalFrame(frame,sequence.getName()+" "+ sequence.getPDBId(), 400, 400);\r
601     }\r
602     catch (Exception ex)\r
603     {\r
604       ex.printStackTrace();\r
605     }\r
606   }\r
607 \r
608   protected void outline_actionPerformed(ActionEvent e)\r
609   {\r
610     SequenceGroup sg = getGroup();\r
611     Color col = JColorChooser.showDialog(this, "Select Outline Colour", Color.BLUE);\r
612     if(col!=null)\r
613       sg.setOutlineColour(col);\r
614     ap.repaint();\r
615   }\r
616 \r
617   public void showBoxes_actionPerformed(ActionEvent e)\r
618   {\r
619     getGroup().setDisplayBoxes(showBoxes.isSelected());\r
620     refresh();\r
621   }\r
622 \r
623   public void showText_actionPerformed(ActionEvent e)\r
624   {\r
625     getGroup().setDisplayText(showText.isSelected());\r
626     refresh();\r
627   }\r
628 \r
629   public void showColourText_actionPerformed(ActionEvent e)\r
630   {\r
631     getGroup().setColourText(showColourText.isSelected());\r
632     refresh();\r
633   }\r
634 \r
635 }\r