Reduced jar size by 20%
[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     SequenceGroup sg = getGroup();\r
273     if(sg!=null)\r
274     {\r
275       SuperGroup superG = ap.av.alignment.getSuperGroup(sg);\r
276 \r
277       if (superG != null)\r
278       {\r
279         superG.setSuperGroupProperties(sg);\r
280       }\r
281         }\r
282     ap.seqPanel.seqCanvas.repaint();\r
283     if(ap.overviewPanel!=null)\r
284       ap.overviewPanel.updateOverviewImage();\r
285   }\r
286 \r
287   protected void clustalColour_actionPerformed()\r
288   {\r
289     SequenceGroup sg = getGroup();\r
290     sg.cs = new ClustalxColourScheme(sg.sequences, ap.av.alignment.getWidth());\r
291     refresh();\r
292   }\r
293 \r
294   protected void zappoColour_actionPerformed()\r
295   {\r
296     getGroup().cs = new ZappoColourScheme();\r
297     refresh();\r
298   }\r
299 \r
300   protected void taylorColour_actionPerformed()\r
301   {\r
302     getGroup().cs = new TaylorColourScheme();\r
303     refresh();\r
304   }\r
305 \r
306   protected void hydrophobicityColour_actionPerformed()\r
307   {\r
308     getGroup().cs = new HydrophobicColourScheme();\r
309     refresh();\r
310   }\r
311 \r
312   protected void helixColour_actionPerformed()\r
313   {\r
314     getGroup().cs = new HelixColourScheme();\r
315     refresh();\r
316   }\r
317 \r
318   protected void strandColour_actionPerformed()\r
319   {\r
320     getGroup().cs = new StrandColourScheme();\r
321     refresh();\r
322   }\r
323 \r
324   protected void turnColour_actionPerformed()\r
325   {\r
326     getGroup().cs = new TurnColourScheme();\r
327     refresh();\r
328   }\r
329 \r
330   protected void buriedColour_actionPerformed()\r
331   {\r
332     getGroup().cs = new BuriedColourScheme();\r
333     refresh();\r
334   }\r
335 \r
336   public void nucleotideMenuItem_actionPerformed()\r
337   {\r
338     getGroup().cs = new NucleotideColourScheme();\r
339     refresh();\r
340   }\r
341 \r
342   protected void abovePIDColour_itemStateChanged()\r
343   {\r
344     SequenceGroup sg = getGroup();\r
345     if(sg.cs==null)\r
346           return;\r
347 \r
348     if (abovePIDColour.getState())\r
349     {\r
350       sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
351                                                ap.av.alignment.getWidth()));\r
352       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs,\r
353           getGroup().getName());\r
354 \r
355       sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());\r
356 \r
357       SliderPanel.showPIDSlider();\r
358 \r
359     }\r
360     else // remove PIDColouring\r
361     {\r
362       sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
363     }\r
364 \r
365     refresh();\r
366 \r
367   }\r
368 \r
369   protected void userDefinedColour_actionPerformed()\r
370   {\r
371     new UserDefinedColours(ap, getGroup());\r
372   }\r
373 \r
374   protected void PIDColour_actionPerformed()\r
375   {\r
376     SequenceGroup sg = getGroup();\r
377     sg.cs = new PIDColourScheme();\r
378     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
379                                              ap.av.alignment.getWidth()));\r
380     refresh();\r
381   }\r
382 \r
383   protected void BLOSUM62Colour_actionPerformed()\r
384   {\r
385     SequenceGroup sg = getGroup();\r
386 \r
387     sg.cs = new Blosum62ColourScheme();\r
388 \r
389     sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
390                                              ap.av.alignment.getWidth()));\r
391 \r
392     refresh();\r
393   }\r
394 \r
395   protected void noColourmenuItem_actionPerformed()\r
396   {\r
397     getGroup().cs = null;\r
398     refresh();\r
399   }\r
400 \r
401   protected void conservationMenuItem_itemStateChanged()\r
402   {\r
403     SequenceGroup sg = getGroup();\r
404     if(sg.cs==null)\r
405           return;\r
406 \r
407     if (conservationMenuItem.getState())\r
408     {\r
409 \r
410       Conservation c = new Conservation("Group",\r
411                                         ResidueProperties.propHash, 3,\r
412                                         sg.sequences, 0,\r
413                                         ap.av.alignment.getWidth());\r
414 \r
415       c.calculate();\r
416       c.verdict(false, ap.av.ConsPercGaps);\r
417 \r
418       sg.cs.setConservation(c);\r
419 \r
420       SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());\r
421       SliderPanel.showConservationSlider();\r
422     }\r
423     else // remove ConservationColouring\r
424     {\r
425       sg.cs.setConservation(null);\r
426     }\r
427 \r
428     refresh();\r
429   }\r
430 \r
431 \r
432   SequenceGroup getGroup()\r
433   {\r
434     SequenceGroup sg = ap.av.getSelectionGroup();\r
435 \r
436     // this method won't add a new group if it already exists\r
437     if(sg!=null)\r
438       ap.av.alignment.addGroup(sg);\r
439 \r
440     return sg;\r
441   }\r
442 \r
443   void unGroupMenuItem_actionPerformed()\r
444   {\r
445     SequenceGroup sg = ap.av.getSelectionGroup();\r
446     ap.av.alignment.deleteGroup(sg);\r
447     ap.av.setSelectionGroup(null);\r
448     ap.repaint();\r
449   }\r
450 \r
451   public void showColourText_itemStateChanged()\r
452   {\r
453     getGroup().setColourText(showColourText.getState());\r
454     refresh();\r
455   }\r
456 \r
457   public void showText_itemStateChanged()\r
458   {\r
459     getGroup().setDisplayText(showText.getState());\r
460     refresh();\r
461   }\r
462 \r
463   public void showBoxes_itemStateChanged()\r
464   {\r
465     getGroup().setDisplayBoxes(showBoxes.getState());\r
466     refresh();\r
467   }\r
468 \r
469 }\r