Removed SuperGroup
[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 implements ActionListener, ItemListener\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   final 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 apanel, final 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 = apanel;\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         String id = seq.getName();\r
101         if(id.indexOf("|")>-1)\r
102              id = id.substring(id.lastIndexOf("|")+1);\r
103 \r
104         final String url = link.substring(link.indexOf("|")+1, link.indexOf("$SEQUENCE_ID$"))\r
105                + id +\r
106                link.substring(link.indexOf("$SEQUENCE_ID$") + 13);\r
107 \r
108            item.addActionListener(new java.awt.event.ActionListener()\r
109            {\r
110                public void actionPerformed(ActionEvent e)\r
111                {\r
112                   ap.alignFrame.showURL(url, target);\r
113                }\r
114            });\r
115           linkMenu.add(item);\r
116       }\r
117       add(linkMenu);\r
118 \r
119       item = new MenuItem("Show PDB Structure");\r
120       item.addActionListener(new java.awt.event.ActionListener()\r
121            {\r
122                public void actionPerformed(ActionEvent e)\r
123                {\r
124                   addPDB(seq);\r
125                }\r
126            });\r
127 \r
128       add(item);\r
129 \r
130 \r
131     }\r
132   }\r
133 \r
134   public void itemStateChanged(ItemEvent evt)\r
135   {\r
136     if(evt.getSource()==abovePIDColour)\r
137       abovePIDColour_itemStateChanged();\r
138     else if(evt.getSource()==showColourText)\r
139       showColourText_itemStateChanged();\r
140     else if(evt.getSource()==showText)\r
141       showText_itemStateChanged();\r
142     else if(evt.getSource()==showBoxes)\r
143        showBoxes_itemStateChanged()   ;\r
144   }\r
145 \r
146   public void actionPerformed(ActionEvent evt)\r
147   {\r
148     if(evt.getSource()==clustalColour)\r
149       clustalColour_actionPerformed();\r
150     else if(evt.getSource()==zappoColour)\r
151       zappoColour_actionPerformed();\r
152     else if(evt.getSource()==taylorColour)\r
153       taylorColour_actionPerformed();\r
154     else if(evt.getSource()==hydrophobicityColour)\r
155       hydrophobicityColour_actionPerformed();\r
156     else if(evt.getSource()==helixColour)\r
157       helixColour_actionPerformed();\r
158     else if(evt.getSource()==strandColour)\r
159       strandColour_actionPerformed();\r
160     else if(evt.getSource()==clustalColour)\r
161       turnColour_actionPerformed();\r
162     else if(evt.getSource()==buriedColour)\r
163       buriedColour_actionPerformed();\r
164     else if(evt.getSource()==nucleotideMenuItem)\r
165       nucleotideMenuItem_actionPerformed();\r
166 \r
167     else if(evt.getSource()==userDefinedColour)\r
168           userDefinedColour_actionPerformed();\r
169         else if(evt.getSource()==PIDColour)\r
170        PIDColour_actionPerformed();\r
171      else if(evt.getSource()==BLOSUM62Colour)\r
172       BLOSUM62Colour_actionPerformed();\r
173     else if(evt.getSource()==noColourmenuItem)\r
174       noColourmenuItem_actionPerformed();\r
175     else if(evt.getSource()==conservationMenuItem)\r
176         conservationMenuItem_itemStateChanged();\r
177       else if(evt.getSource()==unGroupMenuItem)\r
178       unGroupMenuItem_actionPerformed();\r
179 \r
180   }\r
181 \r
182   void addPDB(Sequence seq)\r
183   {\r
184     CutAndPasteTransfer cap = new CutAndPasteTransfer(true, ap.alignFrame.applet);\r
185     cap.setText("Paste your PDB file here.");\r
186     cap.setPDBImport(seq, ap.seqPanel.seqCanvas);\r
187     Frame frame = new Frame();\r
188     frame.add(cap);\r
189     jalview.bin.JalviewLite.addFrame(frame, "Paste PDB file ", 400, 300);\r
190   }\r
191 \r
192   private void jbInit()\r
193       throws Exception\r
194   {\r
195     groupMenu.setLabel("Group");\r
196     groupMenu.setLabel("Define");\r
197 \r
198     unGroupMenuItem.setLabel("Remove Group");\r
199     unGroupMenuItem.addActionListener(this);\r
200 \r
201     nucleotideMenuItem.setLabel("Nucleotide");\r
202     nucleotideMenuItem.addActionListener(this);\r
203     conservationMenuItem.addItemListener(this);\r
204     abovePIDColour.addItemListener(this);\r
205     colourMenu.setLabel("Group Colour");\r
206     showBoxes.setLabel("Boxes");\r
207     showBoxes.setState(true);\r
208     showBoxes.addItemListener(this);\r
209 \r
210     showText.setLabel("Text");\r
211     showText.addItemListener(this);\r
212     showColourText.setLabel("Colour Text");\r
213     showColourText.addItemListener(this);\r
214 \r
215     add(groupMenu);\r
216     groupMenu.add(unGroupMenuItem);\r
217     groupMenu.add(colourMenu);\r
218     groupMenu.addSeparator();\r
219     groupMenu.add(showBoxes);\r
220     groupMenu.add(showText);\r
221     groupMenu.add(showColourText);\r
222     colourMenu.add(noColourmenuItem);\r
223     colourMenu.add(clustalColour);\r
224     colourMenu.add(BLOSUM62Colour);\r
225     colourMenu.add(PIDColour);\r
226     colourMenu.add(zappoColour);\r
227     colourMenu.add(taylorColour);\r
228     colourMenu.add(hydrophobicityColour);\r
229     colourMenu.add(helixColour);\r
230     colourMenu.add(strandColour);\r
231     colourMenu.add(turnColour);\r
232     colourMenu.add(buriedColour);\r
233     colourMenu.add(nucleotideMenuItem);\r
234     colourMenu.add(userDefinedColour);\r
235     colourMenu.addSeparator();\r
236     colourMenu.add(abovePIDColour);\r
237     colourMenu.add(conservationMenuItem);\r
238 \r
239     noColourmenuItem.setLabel("None");\r
240     noColourmenuItem.addActionListener(this);\r
241 \r
242     clustalColour.setLabel("Clustalx colours");\r
243     clustalColour.addActionListener(this);\r
244     zappoColour.setLabel("Zappo");\r
245     zappoColour.addActionListener(this);\r
246     taylorColour.setLabel("Taylor");\r
247     taylorColour.addActionListener(this);\r
248     hydrophobicityColour.setLabel("Hydrophobicity");\r
249     hydrophobicityColour.addActionListener(this);\r
250     helixColour.setLabel("Helix propensity");\r
251     helixColour.addActionListener(this);\r
252     strandColour.setLabel("Strand propensity");\r
253     strandColour.addActionListener(this);\r
254     turnColour.setLabel("Turn propensity");\r
255     turnColour.addActionListener(this);\r
256     buriedColour.setLabel("Buried Index");\r
257     buriedColour.addActionListener(this);\r
258     abovePIDColour.setLabel("Above % Identity");\r
259 \r
260     userDefinedColour.setLabel("User Defined");\r
261     userDefinedColour.addActionListener(this);\r
262     PIDColour.setLabel("Percentage Identity");\r
263     PIDColour.addActionListener(this);\r
264     BLOSUM62Colour.setLabel("BLOSUM62");\r
265     BLOSUM62Colour.addActionListener(this);\r
266     conservationMenuItem.setLabel("Conservation");\r
267 \r
268   }\r
269 \r
270   void refresh()\r
271   {\r
272     ap.seqPanel.seqCanvas.repaint();\r
273     if(ap.overviewPanel!=null)\r
274       ap.overviewPanel.updateOverviewImage();\r
275   }\r
276 \r
277   protected void clustalColour_actionPerformed()\r
278   {\r
279     SequenceGroup sg = getGroup();\r
280     sg.cs = new ClustalxColourScheme(sg.sequences, ap.av.alignment.getWidth());\r
281     refresh();\r
282   }\r
283 \r
284   protected void zappoColour_actionPerformed()\r
285   {\r
286     getGroup().cs = new ZappoColourScheme();\r
287     refresh();\r
288   }\r
289 \r
290   protected void taylorColour_actionPerformed()\r
291   {\r
292     getGroup().cs = new TaylorColourScheme();\r
293     refresh();\r
294   }\r
295 \r
296   protected void hydrophobicityColour_actionPerformed()\r
297   {\r
298     getGroup().cs = new HydrophobicColourScheme();\r
299     refresh();\r
300   }\r
301 \r
302   protected void helixColour_actionPerformed()\r
303   {\r
304     getGroup().cs = new HelixColourScheme();\r
305     refresh();\r
306   }\r
307 \r
308   protected void strandColour_actionPerformed()\r
309   {\r
310     getGroup().cs = new StrandColourScheme();\r
311     refresh();\r
312   }\r
313 \r
314   protected void turnColour_actionPerformed()\r
315   {\r
316     getGroup().cs = new TurnColourScheme();\r
317     refresh();\r
318   }\r
319 \r
320   protected void buriedColour_actionPerformed()\r
321   {\r
322     getGroup().cs = new BuriedColourScheme();\r
323     refresh();\r
324   }\r
325 \r
326   public void nucleotideMenuItem_actionPerformed()\r
327   {\r
328     getGroup().cs = new NucleotideColourScheme();\r
329     refresh();\r
330   }\r
331 \r
332   protected void abovePIDColour_itemStateChanged()\r
333   {\r
334     SequenceGroup sg = getGroup();\r
335     if(sg.cs==null)\r
336           return;\r
337 \r
338     if (abovePIDColour.getState())\r
339     {\r
340       sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
341                                                ap.av.alignment.getWidth()));\r
342       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs,\r
343           getGroup().getName());\r
344 \r
345       sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());\r
346 \r
347       SliderPanel.showPIDSlider();\r
348 \r
349     }\r
350     else // remove PIDColouring\r
351     {\r
352       sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
353     }\r
354 \r
355     refresh();\r
356 \r
357   }\r
358 \r
359   protected void userDefinedColour_actionPerformed()\r
360   {\r
361     new UserDefinedColours(ap, getGroup());\r
362   }\r
363 \r
364   protected void PIDColour_actionPerformed()\r
365   {\r
366     SequenceGroup sg = getGroup();\r
367     sg.cs = new PIDColourScheme();\r
368     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
369                                              ap.av.alignment.getWidth()));\r
370     refresh();\r
371   }\r
372 \r
373   protected void BLOSUM62Colour_actionPerformed()\r
374   {\r
375     SequenceGroup sg = getGroup();\r
376 \r
377     sg.cs = new Blosum62ColourScheme();\r
378 \r
379     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
380                                              ap.av.alignment.getWidth()));\r
381 \r
382     refresh();\r
383   }\r
384 \r
385   protected void noColourmenuItem_actionPerformed()\r
386   {\r
387     getGroup().cs = null;\r
388     refresh();\r
389   }\r
390 \r
391   protected void conservationMenuItem_itemStateChanged()\r
392   {\r
393     SequenceGroup sg = getGroup();\r
394     if(sg.cs==null)\r
395           return;\r
396 \r
397     if (conservationMenuItem.getState())\r
398     {\r
399 \r
400       Conservation c = new Conservation("Group",\r
401                                         ResidueProperties.propHash, 3,\r
402                                         sg.sequences, 0,\r
403                                         ap.av.alignment.getWidth());\r
404 \r
405       c.calculate();\r
406       c.verdict(false, ap.av.ConsPercGaps);\r
407 \r
408       sg.cs.setConservation(c);\r
409 \r
410       SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());\r
411       SliderPanel.showConservationSlider();\r
412     }\r
413     else // remove ConservationColouring\r
414     {\r
415       sg.cs.setConservation(null);\r
416     }\r
417 \r
418     refresh();\r
419   }\r
420 \r
421 \r
422   SequenceGroup getGroup()\r
423   {\r
424     SequenceGroup sg = ap.av.getSelectionGroup();\r
425 \r
426     // this method won't add a new group if it already exists\r
427     if(sg!=null)\r
428       ap.av.alignment.addGroup(sg);\r
429 \r
430     return sg;\r
431   }\r
432 \r
433   void unGroupMenuItem_actionPerformed()\r
434   {\r
435     SequenceGroup sg = ap.av.getSelectionGroup();\r
436     ap.av.alignment.deleteGroup(sg);\r
437     ap.av.setSelectionGroup(null);\r
438     ap.repaint();\r
439   }\r
440 \r
441   public void showColourText_itemStateChanged()\r
442   {\r
443     getGroup().setColourText(showColourText.getState());\r
444     refresh();\r
445   }\r
446 \r
447   public void showText_itemStateChanged()\r
448   {\r
449     getGroup().setDisplayText(showText.getState());\r
450     refresh();\r
451   }\r
452 \r
453   public void showBoxes_itemStateChanged()\r
454   {\r
455     getGroup().setDisplayBoxes(showBoxes.getState());\r
456     refresh();\r
457   }\r
458 \r
459 }\r