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