Check for null colour
[jalview.git] / src / jalview / appletgui / APopupMenu.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 \r
20 package jalview.appletgui;\r
21 \r
22 import java.awt.*;\r
23 import java.awt.event.*;\r
24 import java.util.Vector;\r
25 \r
26 import jalview.analysis.*;\r
27 import jalview.datamodel.*;\r
28 import jalview.schemes.*;\r
29 \r
30 public class APopupMenu\r
31     extends java.awt.PopupMenu\r
32 {\r
33   Menu groupMenu = new Menu();\r
34   protected MenuItem clustalColour = new MenuItem();\r
35   protected MenuItem zappoColour = new MenuItem();\r
36   protected MenuItem taylorColour = new MenuItem();\r
37   protected MenuItem hydrophobicityColour = new MenuItem();\r
38   protected MenuItem helixColour = new MenuItem();\r
39   protected MenuItem strandColour = new MenuItem();\r
40   protected MenuItem turnColour = new MenuItem();\r
41   protected MenuItem buriedColour = new MenuItem();\r
42   protected CheckboxMenuItem abovePIDColour = new CheckboxMenuItem();\r
43   protected MenuItem userDefinedColour = new MenuItem();\r
44   protected MenuItem PIDColour = new MenuItem();\r
45   protected MenuItem BLOSUM62Colour = new MenuItem();\r
46   MenuItem noColourmenuItem = new MenuItem();\r
47   protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();\r
48 \r
49   AlignmentPanel ap;\r
50   MenuItem unGroupMenuItem = new MenuItem();\r
51   MenuItem nucleotideMenuItem = new MenuItem();\r
52   Menu colourMenu = new Menu();\r
53   CheckboxMenuItem showBoxes = new CheckboxMenuItem();\r
54   CheckboxMenuItem showText = new CheckboxMenuItem();\r
55   CheckboxMenuItem showColourText = new CheckboxMenuItem();\r
56 \r
57   public APopupMenu(AlignmentPanel ap, Sequence seq, Vector links)\r
58   {\r
59     ///////////////////////////////////////////////////////////\r
60     // If this is activated from the sequence panel, the user may want to\r
61     // edit or annotate a particular residue. Therefore display the residue menu\r
62     //\r
63     // If from the IDPanel, we must display the sequence menu\r
64     //////////////////////////////////////////////////////////\r
65 \r
66     this.ap = ap;\r
67 \r
68     try\r
69     {\r
70       jbInit();\r
71     }\r
72     catch (Exception e)\r
73     {\r
74       e.printStackTrace();\r
75     }\r
76 \r
77     SequenceGroup sg = ap.av.getSelectionGroup();\r
78     if (sg != null)\r
79     {\r
80       showText.setState(sg.getDisplayText());\r
81       showColourText.setState(sg.getColourText());\r
82       showBoxes.setState(sg.getDisplayBoxes());\r
83     }\r
84 \r
85     if (!ap.av.alignment.getGroups().contains(sg))\r
86     {\r
87       groupMenu.remove(unGroupMenuItem);\r
88     }\r
89 \r
90     if (seq != null && links!=null)\r
91     {\r
92       Menu linkMenu = new Menu("Link");\r
93       MenuItem item;\r
94       String link;\r
95       for(int i=0; i<links.size(); i++)\r
96       {\r
97         link = links.elementAt(i).toString();\r
98         final String target = link.substring(0, link.indexOf("|"));\r
99         item = new MenuItem(target);\r
100         final String url = link.substring(link.indexOf("|")+1, link.indexOf("$SEQUENCE_ID$"))\r
101                + seq.getName() +\r
102                link.substring(link.indexOf("$SEQUENCE_ID$") + 13);\r
103 \r
104            item.addActionListener(new java.awt.event.ActionListener()\r
105            {\r
106                public void actionPerformed(ActionEvent e)\r
107                {\r
108                   jalview.bin.JalviewLite.showURL(url, target);\r
109                }\r
110            });\r
111           linkMenu.add(item);\r
112       }\r
113       add(linkMenu);\r
114     }\r
115   }\r
116 \r
117   private void jbInit()\r
118       throws Exception\r
119   {\r
120     groupMenu.setLabel("Group");\r
121     groupMenu.setLabel("Define");\r
122 \r
123     unGroupMenuItem.setLabel("Remove Group");\r
124     unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
125     {\r
126       public void actionPerformed(ActionEvent e)\r
127       {\r
128         unGroupMenuItem_actionPerformed(e);\r
129       }\r
130     });\r
131 \r
132     nucleotideMenuItem.setLabel("Nucleotide");\r
133     nucleotideMenuItem.addActionListener(new ActionListener()\r
134     {\r
135       public void actionPerformed(ActionEvent e)\r
136       {\r
137         nucleotideMenuItem_actionPerformed(e);\r
138       }\r
139     });\r
140     conservationMenuItem.addItemListener(new ItemListener()\r
141     {\r
142       public void itemStateChanged(ItemEvent itemEvent)\r
143       {\r
144         conservationMenuItem_itemStateChanged(itemEvent);\r
145       }\r
146     });\r
147     abovePIDColour.addItemListener(new ItemListener()\r
148     {\r
149       public void itemStateChanged(ItemEvent itemEvent)\r
150       {\r
151         abovePIDColour_itemStateChanged(itemEvent);\r
152       }\r
153     });\r
154     colourMenu.setLabel("Group Colour");\r
155     showBoxes.setLabel("Boxes");\r
156     showBoxes.setState(true);\r
157     showBoxes.addItemListener(new ItemListener()\r
158     {\r
159       public void itemStateChanged(ItemEvent itemEvent)\r
160       {\r
161         showBoxes_itemStateChanged(itemEvent);\r
162       }\r
163     });\r
164 \r
165     showText.setLabel("Text");\r
166     showText.addItemListener(new ItemListener()\r
167     {\r
168       public void itemStateChanged(ItemEvent itemEvent)\r
169       {\r
170         showText_itemStateChanged(itemEvent);\r
171       }\r
172     });\r
173     showColourText.setLabel("Colour Text");\r
174     showColourText.addItemListener(new ItemListener()\r
175     {\r
176       public void itemStateChanged(ItemEvent itemEvent)\r
177       {\r
178         showColourText_itemStateChanged(itemEvent);\r
179       }\r
180     });\r
181 \r
182     add(groupMenu);\r
183     groupMenu.add(unGroupMenuItem);\r
184     groupMenu.add(colourMenu);\r
185     groupMenu.addSeparator();\r
186     groupMenu.add(showBoxes);\r
187     groupMenu.add(showText);\r
188     groupMenu.add(showColourText);\r
189     colourMenu.add(noColourmenuItem);\r
190     colourMenu.add(clustalColour);\r
191     colourMenu.add(BLOSUM62Colour);\r
192     colourMenu.add(PIDColour);\r
193     colourMenu.add(zappoColour);\r
194     colourMenu.add(taylorColour);\r
195     colourMenu.add(hydrophobicityColour);\r
196     colourMenu.add(helixColour);\r
197     colourMenu.add(strandColour);\r
198     colourMenu.add(turnColour);\r
199     colourMenu.add(buriedColour);\r
200     colourMenu.add(nucleotideMenuItem);\r
201     colourMenu.add(userDefinedColour);\r
202     colourMenu.addSeparator();\r
203     colourMenu.add(abovePIDColour);\r
204     colourMenu.add(conservationMenuItem);\r
205 \r
206     noColourmenuItem.setLabel("None");\r
207     noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
208     {\r
209       public void actionPerformed(ActionEvent e)\r
210       {\r
211         noColourmenuItem_actionPerformed(e);\r
212       }\r
213     });\r
214 \r
215     clustalColour.setLabel("Clustalx colours");\r
216     clustalColour.addActionListener(new java.awt.event.ActionListener()\r
217     {\r
218       public void actionPerformed(ActionEvent e)\r
219       {\r
220         clustalColour_actionPerformed(e);\r
221       }\r
222     });\r
223     zappoColour.setLabel("Zappo");\r
224     zappoColour.addActionListener(new java.awt.event.ActionListener()\r
225     {\r
226       public void actionPerformed(ActionEvent e)\r
227       {\r
228         zappoColour_actionPerformed(e);\r
229       }\r
230     });\r
231     taylorColour.setLabel("Taylor");\r
232     taylorColour.addActionListener(new java.awt.event.ActionListener()\r
233     {\r
234       public void actionPerformed(ActionEvent e)\r
235       {\r
236         taylorColour_actionPerformed(e);\r
237       }\r
238     });\r
239     hydrophobicityColour.setLabel("Hydrophobicity");\r
240     hydrophobicityColour.addActionListener(new java.awt.event.ActionListener()\r
241     {\r
242       public void actionPerformed(ActionEvent e)\r
243       {\r
244         hydrophobicityColour_actionPerformed(e);\r
245       }\r
246     });\r
247     helixColour.setLabel("Helix propensity");\r
248     helixColour.addActionListener(new java.awt.event.ActionListener()\r
249     {\r
250       public void actionPerformed(ActionEvent e)\r
251       {\r
252         helixColour_actionPerformed(e);\r
253       }\r
254     });\r
255     strandColour.setLabel("Strand propensity");\r
256     strandColour.addActionListener(new java.awt.event.ActionListener()\r
257     {\r
258       public void actionPerformed(ActionEvent e)\r
259       {\r
260         strandColour_actionPerformed(e);\r
261       }\r
262     });\r
263     turnColour.setLabel("Turn propensity");\r
264     turnColour.addActionListener(new java.awt.event.ActionListener()\r
265     {\r
266       public void actionPerformed(ActionEvent e)\r
267       {\r
268         turnColour_actionPerformed(e);\r
269       }\r
270     });\r
271     buriedColour.setLabel("Buried Index");\r
272     buriedColour.addActionListener(new java.awt.event.ActionListener()\r
273     {\r
274       public void actionPerformed(ActionEvent e)\r
275       {\r
276         buriedColour_actionPerformed(e);\r
277       }\r
278     });\r
279     abovePIDColour.setLabel("Above % Identity");\r
280 \r
281     userDefinedColour.setLabel("User Defined");\r
282     userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
283     {\r
284       public void actionPerformed(ActionEvent e)\r
285       {\r
286         userDefinedColour_actionPerformed(e);\r
287       }\r
288     });\r
289     PIDColour.setLabel("Percentage Identity");\r
290     PIDColour.addActionListener(new java.awt.event.ActionListener()\r
291     {\r
292       public void actionPerformed(ActionEvent e)\r
293       {\r
294         PIDColour_actionPerformed(e);\r
295       }\r
296     });\r
297     BLOSUM62Colour.setLabel("BLOSUM62");\r
298     BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
299     {\r
300       public void actionPerformed(ActionEvent e)\r
301       {\r
302         BLOSUM62Colour_actionPerformed(e);\r
303       }\r
304     });\r
305     conservationMenuItem.setLabel("Conservation");\r
306 \r
307   }\r
308 \r
309   void refresh()\r
310   {\r
311     SequenceGroup sg = getGroup();\r
312     if(sg!=null)\r
313     {\r
314       SuperGroup superG = ap.av.alignment.getSuperGroup(sg);\r
315 \r
316       if (superG != null)\r
317       {\r
318         superG.setSuperGroupProperties(sg);\r
319       }\r
320         }\r
321     ap.seqPanel.seqCanvas.repaint();\r
322   }\r
323 \r
324   protected void clustalColour_actionPerformed(ActionEvent e)\r
325   {\r
326     SequenceGroup sg = getGroup();\r
327     sg.cs = new ClustalxColourScheme(sg.sequences, ap.av.alignment.getWidth());\r
328     refresh();\r
329   }\r
330 \r
331   protected void zappoColour_actionPerformed(ActionEvent e)\r
332   {\r
333     getGroup().cs = new ZappoColourScheme();\r
334     refresh();\r
335   }\r
336 \r
337   protected void taylorColour_actionPerformed(ActionEvent e)\r
338   {\r
339     getGroup().cs = new TaylorColourScheme();\r
340     refresh();\r
341   }\r
342 \r
343   protected void hydrophobicityColour_actionPerformed(ActionEvent e)\r
344   {\r
345     getGroup().cs = new HydrophobicColourScheme();\r
346     refresh();\r
347   }\r
348 \r
349   protected void helixColour_actionPerformed(ActionEvent e)\r
350   {\r
351     getGroup().cs = new HelixColourScheme();\r
352     refresh();\r
353   }\r
354 \r
355   protected void strandColour_actionPerformed(ActionEvent e)\r
356   {\r
357     getGroup().cs = new StrandColourScheme();\r
358     refresh();\r
359   }\r
360 \r
361   protected void turnColour_actionPerformed(ActionEvent e)\r
362   {\r
363     getGroup().cs = new TurnColourScheme();\r
364     refresh();\r
365   }\r
366 \r
367   protected void buriedColour_actionPerformed(ActionEvent e)\r
368   {\r
369     getGroup().cs = new BuriedColourScheme();\r
370     refresh();\r
371   }\r
372 \r
373   public void nucleotideMenuItem_actionPerformed(ActionEvent e)\r
374   {\r
375     getGroup().cs = new NucleotideColourScheme();\r
376     refresh();\r
377   }\r
378 \r
379   protected void abovePIDColour_itemStateChanged(ItemEvent ie)\r
380   {\r
381     SequenceGroup sg = getGroup();\r
382     if(sg.cs==null)\r
383           return;\r
384 \r
385     if (abovePIDColour.getState())\r
386     {\r
387       sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
388                                                ap.av.alignment.getWidth()));\r
389       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs,\r
390           getGroup().getName());\r
391 \r
392       sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());\r
393 \r
394       SliderPanel.showPIDSlider();\r
395 \r
396     }\r
397     else // remove PIDColouring\r
398     {\r
399       sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
400     }\r
401 \r
402     refresh();\r
403 \r
404   }\r
405 \r
406   protected void userDefinedColour_actionPerformed(ActionEvent e)\r
407   {\r
408     new UserDefinedColours(ap, getGroup());\r
409   }\r
410 \r
411   protected void PIDColour_actionPerformed(ActionEvent e)\r
412   {\r
413     SequenceGroup sg = getGroup();\r
414     sg.cs = new PIDColourScheme();\r
415     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
416                                              ap.av.alignment.getWidth()));\r
417     refresh();\r
418   }\r
419 \r
420   protected void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
421   {\r
422     SequenceGroup sg = getGroup();\r
423 \r
424     sg.cs = new Blosum62ColourScheme();\r
425 \r
426     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
427                                              ap.av.alignment.getWidth()));\r
428 \r
429     refresh();\r
430   }\r
431 \r
432   protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
433   {\r
434     getGroup().cs = null;\r
435     refresh();\r
436   }\r
437 \r
438   protected void conservationMenuItem_itemStateChanged(ItemEvent ie)\r
439   {\r
440     SequenceGroup sg = getGroup();\r
441     if(sg.cs==null)\r
442           return;\r
443 \r
444     if (conservationMenuItem.getState())\r
445     {\r
446 \r
447       Conservation c = new Conservation("Group",\r
448                                         ResidueProperties.propHash, 3,\r
449                                         sg.sequences, 0,\r
450                                         ap.av.alignment.getWidth());\r
451 \r
452       c.calculate();\r
453       c.verdict(false, ap.av.ConsPercGaps);\r
454 \r
455       sg.cs.setConservation(c);\r
456 \r
457       SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());\r
458       SliderPanel.showConservationSlider();\r
459     }\r
460     else // remove ConservationColouring\r
461     {\r
462       sg.cs.setConservation(null);\r
463     }\r
464 \r
465     refresh();\r
466   }\r
467 \r
468   protected void analyze_actionPerformed(ActionEvent e)\r
469   {\r
470     CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
471     Frame frame = new Frame();\r
472     frame.add(cap);\r
473     jalview.bin.JalviewLite.addFrame(frame, "Analyze this - ", 400, 300);\r
474     SequenceGroup sg = getGroup();\r
475     StringBuffer sb = new StringBuffer();\r
476 \r
477     for (int i = 0; i < sg.sequences.size(); i++)\r
478     {\r
479       Sequence tmp = (Sequence) sg.sequences.elementAt(i);\r
480       sb.append(tmp.getSequence(sg.getStartRes(), sg.getEndRes() + 1));\r
481       sb.append("\n");\r
482     }\r
483 \r
484     sb.append("Something amazing will happen soon");\r
485     cap.setText(sb.toString());\r
486 \r
487   }\r
488 \r
489   SequenceGroup getGroup()\r
490   {\r
491     SequenceGroup sg = ap.av.getSelectionGroup();\r
492 \r
493     // this method won't add a new group if it already exists\r
494     if(sg!=null)\r
495       ap.av.alignment.addGroup(sg);\r
496 \r
497     return sg;\r
498   }\r
499 \r
500   void unGroupMenuItem_actionPerformed(ActionEvent e)\r
501   {\r
502     SequenceGroup sg = ap.av.getSelectionGroup();\r
503     ap.av.alignment.deleteGroup(sg);\r
504     ap.av.setSelectionGroup(null);\r
505     ap.repaint();\r
506   }\r
507 \r
508   public void showColourText_itemStateChanged(ItemEvent itemEvent)\r
509   {\r
510     getGroup().setColourText(showColourText.getState());\r
511     refresh();\r
512   }\r
513 \r
514   public void showText_itemStateChanged(ItemEvent itemEvent)\r
515   {\r
516     getGroup().setDisplayText(showText.getState());\r
517     refresh();\r
518   }\r
519 \r
520   public void showBoxes_itemStateChanged(ItemEvent itemEvent)\r
521   {\r
522     getGroup().setDisplayBoxes(showBoxes.getState());\r
523     refresh();\r
524   }\r
525 \r
526 }\r