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