Conservation and PID colouring methods updated, also remove group added
[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 javax.swing.*;\r
7 import java.awt.event.*;\r
8 \r
9 \r
10 public class PopupMenu extends JPopupMenu\r
11 {\r
12   JMenu groupMenu = new JMenu();\r
13   JMenuItem copyGroup = new JMenuItem();\r
14   JMenuItem moveGroup = new JMenuItem();\r
15   JMenuItem deleteSequences = new JMenuItem();\r
16   JMenuItem analyze = new JMenuItem();\r
17   JMenu defineMenu = new JMenu();\r
18   JMenuItem groupName = new JMenuItem();\r
19   JMenuItem groupAnnotation = new JMenuItem();\r
20   protected JRadioButtonMenuItem clustalColour = new JRadioButtonMenuItem();\r
21   protected JRadioButtonMenuItem zappoColour = new JRadioButtonMenuItem();\r
22   protected JRadioButtonMenuItem taylorColour = new JRadioButtonMenuItem();\r
23   protected JRadioButtonMenuItem hydrophobicityColour = new JRadioButtonMenuItem();\r
24   protected JRadioButtonMenuItem helixColour = new JRadioButtonMenuItem();\r
25   protected JRadioButtonMenuItem strandColour = new JRadioButtonMenuItem();\r
26   protected JRadioButtonMenuItem turnColour = new JRadioButtonMenuItem();\r
27   protected JRadioButtonMenuItem buriedColour = new JRadioButtonMenuItem();\r
28   protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();\r
29   protected JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem();\r
30   protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();\r
31   protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();\r
32   JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();\r
33   protected JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();\r
34 \r
35 \r
36   AlignmentPanel ap;\r
37   JMenu sequenceMenu = new JMenu();\r
38   JMenuItem sequenceName = new JMenuItem();\r
39   JMenu residueMenu = new JMenu();\r
40   JMenuItem annotateResidue = new JMenuItem();\r
41 \r
42   SequenceI sequence;\r
43   JMenuItem unGroupMenuItem = new JMenuItem();\r
44 \r
45   public PopupMenu(AlignmentPanel ap, SequenceI 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.getRubberbandGroup();\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 \r
110 \r
111     if(seq!=null)\r
112     {\r
113       residueMenu.setVisible(false);\r
114       sequenceName.setText( sequence.getName() );\r
115     }\r
116     else\r
117       sequenceMenu.setVisible(false);\r
118 \r
119   }\r
120   private void jbInit() throws Exception\r
121   {\r
122     groupMenu.setText("Group");\r
123     copyGroup.setText("Copy region to new Alignment");\r
124     copyGroup.addActionListener(new java.awt.event.ActionListener()\r
125     {\r
126       public void actionPerformed(ActionEvent e)\r
127       {\r
128         copyGroup_actionPerformed(e);\r
129       }\r
130     });\r
131     moveGroup.setText("Move sequences to new Alignment");\r
132     moveGroup.addActionListener(new java.awt.event.ActionListener()\r
133     {\r
134       public void actionPerformed(ActionEvent e)\r
135       {\r
136         moveGroup_actionPerformed(e);\r
137       }\r
138     });\r
139     deleteSequences.setText("Delete sequences");\r
140     deleteSequences.addActionListener(new java.awt.event.ActionListener()\r
141     {\r
142       public void actionPerformed(ActionEvent e)\r
143       {\r
144         deleteSequences_actionPerformed(e);\r
145       }\r
146     });\r
147     analyze.setText("Analyze");\r
148     analyze.addActionListener(new java.awt.event.ActionListener()\r
149     {\r
150       public void actionPerformed(ActionEvent e)\r
151       {\r
152         analyze_actionPerformed(e);\r
153       }\r
154     });\r
155     defineMenu.setText("Define");\r
156     groupName.setText("Name");\r
157     groupName.addActionListener(new java.awt.event.ActionListener()\r
158     {\r
159       public void actionPerformed(ActionEvent e)\r
160       {\r
161         groupName_actionPerformed(e);\r
162       }\r
163     });\r
164     groupAnnotation.setText("Annotation");\r
165     groupAnnotation.addActionListener(new java.awt.event.ActionListener()\r
166     {\r
167       public void actionPerformed(ActionEvent e)\r
168       {\r
169         groupAnnotation_actionPerformed(e);\r
170       }\r
171     });\r
172     sequenceMenu.setText("Sequence");\r
173     sequenceName.setText("sequenceName");\r
174     sequenceName.addActionListener(new java.awt.event.ActionListener()\r
175     {\r
176       public void actionPerformed(ActionEvent e)\r
177       {\r
178         sequenceName_actionPerformed(e);\r
179       }\r
180     });\r
181     residueMenu.setText("Residue");\r
182     annotateResidue.setText("annotate residue???");\r
183     PIDColour.setFocusPainted(false);\r
184     unGroupMenuItem.setText("Remove Group");\r
185     unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
186     {\r
187       public void actionPerformed(ActionEvent e)\r
188       {\r
189         unGroupMenuItem_actionPerformed(e);\r
190       }\r
191     });\r
192     add(groupMenu);\r
193     this.add(sequenceMenu);\r
194     this.add(residueMenu);\r
195     groupMenu.add(defineMenu);\r
196     groupMenu.add(unGroupMenuItem);\r
197     groupMenu.addSeparator();\r
198     groupMenu.add(copyGroup);\r
199     groupMenu.add(moveGroup);\r
200     groupMenu.add(deleteSequences);\r
201     groupMenu.addSeparator();\r
202     groupMenu.add(analyze);\r
203     defineMenu.add(groupName);\r
204     defineMenu.add(groupAnnotation);\r
205     defineMenu.addSeparator();\r
206     defineMenu.add(noColourmenuItem);\r
207     defineMenu.add(clustalColour);\r
208     defineMenu.add(zappoColour);\r
209     defineMenu.add(taylorColour);\r
210     defineMenu.add(hydrophobicityColour);\r
211     defineMenu.add(helixColour);\r
212     defineMenu.add(strandColour);\r
213     defineMenu.add(turnColour);\r
214     defineMenu.add(buriedColour);\r
215     defineMenu.add(userDefinedColour);\r
216     defineMenu.add(PIDColour);\r
217     defineMenu.add(BLOSUM62Colour);\r
218     defineMenu.addSeparator();\r
219     defineMenu.add(abovePIDColour);\r
220     defineMenu.add(conservationMenuItem);\r
221 \r
222     sequenceMenu.add(sequenceName);\r
223     residueMenu.add(annotateResidue);\r
224 \r
225     noColourmenuItem.setText("None");\r
226     noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
227     {\r
228       public void actionPerformed(ActionEvent e)\r
229       {\r
230         noColourmenuItem_actionPerformed(e);\r
231       }\r
232     });\r
233 \r
234     clustalColour.setText("Clustalx colours");\r
235     clustalColour.addActionListener(new java.awt.event.ActionListener()\r
236     {\r
237       public void actionPerformed(ActionEvent e)\r
238       {\r
239         clustalColour_actionPerformed(e);\r
240       }\r
241     });\r
242     zappoColour.setText("Zappo colour scheme");\r
243     zappoColour.addActionListener(new java.awt.event.ActionListener()\r
244     {\r
245       public void actionPerformed(ActionEvent e)\r
246       {\r
247         zappoColour_actionPerformed(e);\r
248       }\r
249     });\r
250     taylorColour.setText("Taylor colour scheme");\r
251     taylorColour.addActionListener(new java.awt.event.ActionListener()\r
252     {\r
253       public void actionPerformed(ActionEvent e)\r
254       {\r
255         taylorColour_actionPerformed(e);\r
256       }\r
257     });\r
258     hydrophobicityColour.setText("By hydrophobicity");\r
259     hydrophobicityColour.addActionListener(new java.awt.event.ActionListener()\r
260     {\r
261       public void actionPerformed(ActionEvent e)\r
262       {\r
263         hydrophobicityColour_actionPerformed(e);\r
264       }\r
265     });\r
266     helixColour.setText("Helix propensity");\r
267     helixColour.addActionListener(new java.awt.event.ActionListener()\r
268     {\r
269       public void actionPerformed(ActionEvent e)\r
270       {\r
271         helixColour_actionPerformed(e);\r
272       }\r
273     });\r
274     strandColour.setText("Strand propensity");\r
275     strandColour.addActionListener(new java.awt.event.ActionListener()\r
276     {\r
277       public void actionPerformed(ActionEvent e)\r
278       {\r
279         strandColour_actionPerformed(e);\r
280       }\r
281     });\r
282     turnColour.setText("Turn propensity");\r
283     turnColour.addActionListener(new java.awt.event.ActionListener()\r
284     {\r
285       public void actionPerformed(ActionEvent e)\r
286       {\r
287         turnColour_actionPerformed(e);\r
288       }\r
289     });\r
290     buriedColour.setText("Buried index");\r
291     buriedColour.addActionListener(new java.awt.event.ActionListener()\r
292     {\r
293       public void actionPerformed(ActionEvent e)\r
294       {\r
295         buriedColour_actionPerformed(e);\r
296       }\r
297     });\r
298     abovePIDColour.setText("Above PID threshold only");\r
299     abovePIDColour.addActionListener(new java.awt.event.ActionListener()\r
300     {\r
301       public void actionPerformed(ActionEvent e)\r
302       {\r
303         abovePIDColour_actionPerformed(e);\r
304       }\r
305     });\r
306     userDefinedColour.setText("User defined colours");\r
307     userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
308     {\r
309       public void actionPerformed(ActionEvent e)\r
310       {\r
311         userDefinedColour_actionPerformed(e);\r
312       }\r
313     });\r
314     PIDColour.setText("Percentage Identity");\r
315     PIDColour.addActionListener(new java.awt.event.ActionListener()\r
316     {\r
317       public void actionPerformed(ActionEvent e)\r
318       {\r
319         PIDColour_actionPerformed(e);\r
320       }\r
321     });\r
322     BLOSUM62Colour.setText("BLOSUM62 score");\r
323     BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
324     {\r
325       public void actionPerformed(ActionEvent e)\r
326       {\r
327         BLOSUM62Colour_actionPerformed(e);\r
328       }\r
329     });\r
330     conservationMenuItem.setText("By conservation");\r
331    conservationMenuItem.addActionListener(new java.awt.event.ActionListener()\r
332    {\r
333      public void actionPerformed(ActionEvent e)\r
334      {\r
335        conservationMenuItem_actionPerformed(e);\r
336      }\r
337    });\r
338 \r
339 \r
340 \r
341   }\r
342 \r
343   void refresh()\r
344   {\r
345     SequenceGroup sg = getGroup();\r
346     SuperGroup superG = ap.av.alignment.getSuperGroup( sg );\r
347     if( superG !=null)\r
348       superG.setSuperGroupProperties( sg );\r
349 \r
350     ap.seqPanel.seqCanvas.paintFlag=true;\r
351     ap.seqPanel.repaint();\r
352   }\r
353 \r
354   protected void clustalColour_actionPerformed(ActionEvent e)\r
355   {\r
356     SequenceGroup sg = getGroup();\r
357     sg.cs = new ClustalxColourScheme(sg.sequences, ap.av.alignment.getWidth());\r
358     refresh();\r
359   }\r
360 \r
361   protected void zappoColour_actionPerformed(ActionEvent e)\r
362   {\r
363     getGroup().cs = new ZappoColourScheme();\r
364     refresh();\r
365   }\r
366 \r
367   protected void taylorColour_actionPerformed(ActionEvent e)\r
368   {\r
369     getGroup().cs = new TaylorColourScheme();\r
370     refresh();\r
371   }\r
372 \r
373 \r
374   protected void hydrophobicityColour_actionPerformed(ActionEvent e)\r
375   {\r
376     getGroup().cs = new HydrophobicColourScheme();\r
377     refresh();\r
378   }\r
379 \r
380   protected void helixColour_actionPerformed(ActionEvent e)\r
381   {\r
382     getGroup().cs = new HelixColourScheme();\r
383     refresh();\r
384   }\r
385 \r
386   protected void strandColour_actionPerformed(ActionEvent e)\r
387   {\r
388     getGroup().cs = new StrandColourScheme();\r
389     refresh();\r
390   }\r
391 \r
392   protected void turnColour_actionPerformed(ActionEvent e)\r
393   {\r
394     getGroup().cs = new TurnColourScheme();\r
395     refresh();\r
396   }\r
397 \r
398   protected void buriedColour_actionPerformed(ActionEvent e)\r
399   {\r
400     getGroup().cs = new BuriedColourScheme();\r
401     refresh();\r
402   }\r
403 \r
404 \r
405   protected void abovePIDColour_actionPerformed(ActionEvent e)\r
406   {\r
407     Desktop.setPIDSliderSource(ap, getGroup().cs, getGroup().getName());\r
408   }\r
409 \r
410 \r
411   protected void userDefinedColour_actionPerformed(ActionEvent e)\r
412   {\r
413     JInternalFrame frame = new JInternalFrame();\r
414     UserDefinedColours chooser = new UserDefinedColours( frame, ap, getGroup());\r
415     frame.setContentPane(chooser);\r
416     Desktop.addInternalFrame(frame,"User defined colours ("+getGroup().getName()+")", 450,540 );\r
417     frame.setResizable(false);\r
418     frame.setIconifiable(false);\r
419     frame.setMaximizable(false);\r
420 \r
421   }\r
422 \r
423   protected void PIDColour_actionPerformed(ActionEvent e)\r
424   {\r
425 \r
426   }\r
427 \r
428   protected void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
429   {\r
430     getGroup().cs = new Blosum62ColourScheme(ap.av);\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, 100);\r
455         ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);\r
456 \r
457 \r
458       sg.cs = ccs;\r
459 \r
460       Desktop.setConservationSliderSource(ap, ccs, sg.getName());\r
461     }\r
462     else // remove ConservationColouring\r
463     {\r
464         ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;\r
465         sg.cs = ccs.cs;\r
466     }\r
467 \r
468      refresh();\r
469   }\r
470 \r
471   protected void groupAnnotation_actionPerformed(ActionEvent e)\r
472   {\r
473 \r
474   }\r
475 \r
476   protected void groupName_actionPerformed(ActionEvent e)\r
477   {\r
478     SequenceGroup sg = getGroup();\r
479     String reply = JOptionPane.showInternalInputDialog(Desktop.desktop, "Enter new group name", "Edit group name", JOptionPane.QUESTION_MESSAGE);\r
480     if(reply==null)\r
481       return;\r
482 \r
483     sg.setName(reply);\r
484     groupName.setText(reply);\r
485   }\r
486 \r
487   protected void copyGroup_actionPerformed(ActionEvent e)\r
488   {\r
489     SequenceGroup sg = ap.av.getRubberbandGroup();\r
490 \r
491     SequenceI[] s = new Sequence[sg.sequences.size()];\r
492      for (int i=0; i < sg.sequences.size(); i++)\r
493      {\r
494        s[i] = new Sequence( sg.getSequenceAt(i));\r
495        s[i].setSequence( s[i].getSequence(sg.getStartRes(), sg.getEndRes()+1) );\r
496      }\r
497      AlignFrame af = new AlignFrame(new Alignment(s));\r
498      int newHeight = s.length * af.viewport.getCharHeight() + 200;\r
499      if (newHeight > 500)\r
500        newHeight = 500;\r
501      Desktop.addInternalFrame(af, "Copied sequences", 700, newHeight);\r
502    }\r
503 \r
504   protected  void moveGroup_actionPerformed(ActionEvent e)\r
505   {\r
506     SequenceGroup sg = ap.av.getRubberbandGroup();\r
507 \r
508     SequenceI[] s = new Sequence[sg.sequences.size()];\r
509 \r
510      for (int i=0; i < sg.sequences.size(); i++)\r
511        s[i] = new Sequence( sg.getSequenceAt(i));\r
512 \r
513      AlignFrame af = new AlignFrame(new Alignment(s));\r
514      int newHeight = s.length * af.viewport.getCharHeight() + 200;\r
515      if(newHeight>500)\r
516        newHeight=500;\r
517      Desktop.addInternalFrame(af, "Copied sequences", 700,newHeight);\r
518 \r
519 \r
520      for (int i=0; i < sg.sequences.size(); i++)\r
521        ap.av.alignment.deleteSequence(sg.getSequenceAt(i));\r
522 \r
523 \r
524      ap.av.resetSeqLimits(ap.seqPanel.seqCanvas.getHeight());\r
525      ap.RefreshPanels();\r
526 \r
527 \r
528   }\r
529 \r
530   protected void deleteSequences_actionPerformed(ActionEvent e)\r
531   {\r
532     SequenceGroup sg = ap.av.getRubberbandGroup();\r
533     for (int i=0;i < sg.sequences.size(); i++)\r
534             ap.av.getAlignment().deleteSequence(sg.getSequenceAt(i));\r
535 \r
536     ap.av.alignment.deleteGroup(sg);\r
537     ap.av.resetSeqLimits(ap.seqPanel.seqCanvas.getHeight());\r
538     ap.RefreshPanels();\r
539 \r
540   }\r
541 \r
542   protected void analyze_actionPerformed(ActionEvent e)\r
543   {\r
544      CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
545      JInternalFrame frame = new JInternalFrame();\r
546      cap.formatForOutput();\r
547      frame.setContentPane(cap);\r
548      Desktop.addInternalFrame(frame, "Analyze this - ", 400, 300);\r
549      SequenceGroup sg = getGroup();\r
550      StringBuffer sb = new StringBuffer();\r
551 \r
552      for(int i=0; i<sg.sequences.size(); i++)\r
553      {\r
554        Sequence tmp = (Sequence)sg.sequences.get(i);\r
555        sb.append(  tmp.getSequence(sg.getStartRes(), sg.getEndRes()+1));\r
556        sb.append("\n");\r
557      }\r
558 \r
559      sb.append("Something amazing will happen soon");\r
560      cap.setText( sb.toString() );\r
561 \r
562   }\r
563 \r
564   SequenceGroup getGroup()\r
565   {\r
566     SequenceGroup sg = ap.av.getRubberbandGroup();\r
567 \r
568     // this method won't add a new group if it already exists\r
569     ap.av.alignment.addGroup(sg);\r
570     return sg;\r
571   }\r
572 \r
573   void sequenceName_actionPerformed(ActionEvent e)\r
574   {\r
575     String id = sequence.getName();\r
576     String s = (String)JOptionPane.showInternalInputDialog(\r
577                 ap,\r
578                 "Edit sequence name",\r
579                 "Edit sequence name",\r
580                 JOptionPane.PLAIN_MESSAGE,\r
581                 null,\r
582                 null,\r
583                 id);\r
584 \r
585     if(s!=null)\r
586     {\r
587       sequence.setName(s);\r
588       ap.RefreshPanels();\r
589     }\r
590 \r
591   }\r
592 \r
593   void unGroupMenuItem_actionPerformed(ActionEvent e)\r
594   {\r
595      SequenceGroup sg = ap.av.getRubberbandGroup();\r
596      ap.av.alignment.deleteGroup(sg);\r
597      ap.av.setRubberbandGroup(null);\r
598      ap.RefreshPanels();\r
599   }\r
600 }\r