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