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