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