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