Case shifter
[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   Menu editMenu = new Menu("Edit");\r
57   MenuItem copy = new MenuItem("Copy (Jalview Only)");\r
58   MenuItem cut = new MenuItem("Cut (Jalview Only)");\r
59   MenuItem toUpper = new MenuItem("To Upper Case");\r
60   MenuItem toLower = new MenuItem("To Lower Case");\r
61 \r
62   public APopupMenu(AlignmentPanel apanel, final Sequence seq, Vector links)\r
63   {\r
64     ///////////////////////////////////////////////////////////\r
65     // If this is activated from the sequence panel, the user may want to\r
66     // edit or annotate a particular residue. Therefore display the residue menu\r
67     //\r
68     // If from the IDPanel, we must display the sequence menu\r
69     //////////////////////////////////////////////////////////\r
70 \r
71     this.ap = apanel;\r
72 \r
73     try\r
74     {\r
75       jbInit();\r
76     }\r
77     catch (Exception e)\r
78     {\r
79       e.printStackTrace();\r
80     }\r
81 \r
82     SequenceGroup sg = ap.av.getSelectionGroup();\r
83     if (sg != null)\r
84     {\r
85       showText.setState(sg.getDisplayText());\r
86       showColourText.setState(sg.getColourText());\r
87       showBoxes.setState(sg.getDisplayBoxes());\r
88     }\r
89 \r
90     if (!ap.av.alignment.getGroups().contains(sg))\r
91     {\r
92       groupMenu.remove(unGroupMenuItem);\r
93     }\r
94 \r
95     if (seq != null && links!=null)\r
96     {\r
97       Menu linkMenu = new Menu("Link");\r
98       MenuItem item;\r
99       String link;\r
100       for(int i=0; i<links.size(); i++)\r
101       {\r
102         link = links.elementAt(i).toString();\r
103         final String target = link.substring(0, link.indexOf("|"));\r
104         item = new MenuItem(target);\r
105         String id = seq.getName();\r
106         if(id.indexOf("|")>-1)\r
107              id = id.substring(id.lastIndexOf("|")+1);\r
108 \r
109         final String url = link.substring(link.indexOf("|")+1, link.indexOf("$SEQUENCE_ID$"))\r
110                + id +\r
111                link.substring(link.indexOf("$SEQUENCE_ID$") + 13);\r
112 \r
113            item.addActionListener(new java.awt.event.ActionListener()\r
114            {\r
115                public void actionPerformed(ActionEvent e)\r
116                {\r
117                   ap.alignFrame.showURL(url, target);\r
118                }\r
119            });\r
120           linkMenu.add(item);\r
121       }\r
122       add(linkMenu);\r
123 \r
124       item = new MenuItem("Show PDB Structure");\r
125       item.addActionListener(new java.awt.event.ActionListener()\r
126            {\r
127                public void actionPerformed(ActionEvent e)\r
128                {\r
129                   addPDB(seq);\r
130                }\r
131            });\r
132 \r
133       add(item);\r
134 \r
135 \r
136     }\r
137   }\r
138 \r
139   public void itemStateChanged(ItemEvent evt)\r
140   {\r
141     if(evt.getSource()==abovePIDColour)\r
142       abovePIDColour_itemStateChanged();\r
143     else if(evt.getSource()==showColourText)\r
144       showColourText_itemStateChanged();\r
145     else if(evt.getSource()==showText)\r
146       showText_itemStateChanged();\r
147     else if(evt.getSource()==showBoxes)\r
148        showBoxes_itemStateChanged()   ;\r
149   }\r
150 \r
151   public void actionPerformed(ActionEvent evt)\r
152   {\r
153     Object source = evt.getSource();\r
154     if(source==clustalColour)\r
155       clustalColour_actionPerformed();\r
156     else if(source==zappoColour)\r
157       zappoColour_actionPerformed();\r
158     else if(source==taylorColour)\r
159       taylorColour_actionPerformed();\r
160     else if(source==hydrophobicityColour)\r
161       hydrophobicityColour_actionPerformed();\r
162     else if(source==helixColour)\r
163       helixColour_actionPerformed();\r
164     else if(source==strandColour)\r
165       strandColour_actionPerformed();\r
166     else if(source==clustalColour)\r
167       turnColour_actionPerformed();\r
168     else if(source==buriedColour)\r
169       buriedColour_actionPerformed();\r
170     else if(source==nucleotideMenuItem)\r
171       nucleotideMenuItem_actionPerformed();\r
172 \r
173     else if(source==userDefinedColour)\r
174           userDefinedColour_actionPerformed();\r
175         else if(source==PIDColour)\r
176        PIDColour_actionPerformed();\r
177      else if(source==BLOSUM62Colour)\r
178       BLOSUM62Colour_actionPerformed();\r
179     else if(source==noColourmenuItem)\r
180       noColourmenuItem_actionPerformed();\r
181     else if(source==conservationMenuItem)\r
182         conservationMenuItem_itemStateChanged();\r
183       else if(source==unGroupMenuItem)\r
184       unGroupMenuItem_actionPerformed();\r
185 \r
186     else if(source==copy)\r
187       ap.alignFrame.copy_actionPerformed();\r
188     else if(source==cut)\r
189       ap.alignFrame.cut_actionPerformed();\r
190     else if(source==toUpper)\r
191     {\r
192       SequenceGroup sg = ap.av.getSelectionGroup();\r
193       if (sg != null)\r
194       {\r
195         for (int g = 0; g < sg.getSize(); g++)\r
196         {\r
197           sg.getSequenceAt(g).changeCase(true, sg.getStartRes(),\r
198                                          sg.getEndRes() + 1);\r
199         }\r
200         ap.seqPanel.seqCanvas.repaint();\r
201       }\r
202     }\r
203     else if(source==toLower)\r
204     {\r
205       SequenceGroup sg = ap.av.getSelectionGroup();\r
206       if (sg != null)\r
207       {\r
208         for (int g = 0; g < sg.getSize(); g++)\r
209         {\r
210           sg.getSequenceAt(g).changeCase(false, sg.getStartRes(),\r
211                                          sg.getEndRes() + 1);\r
212         }\r
213         ap.seqPanel.seqCanvas.repaint();\r
214       }\r
215     }\r
216 \r
217   }\r
218 \r
219   void addPDB(Sequence seq)\r
220   {\r
221     CutAndPasteTransfer cap = new CutAndPasteTransfer(true, ap.alignFrame);\r
222     cap.setText("Paste your PDB file here.");\r
223     cap.setPDBImport(seq);\r
224     Frame frame = new Frame();\r
225     frame.add(cap);\r
226     jalview.bin.JalviewLite.addFrame(frame, "Paste PDB file ", 400, 300);\r
227   }\r
228 \r
229   private void jbInit()\r
230       throws Exception\r
231   {\r
232     groupMenu.setLabel("Group");\r
233     groupMenu.setLabel("Define");\r
234 \r
235     unGroupMenuItem.setLabel("Remove Group");\r
236     unGroupMenuItem.addActionListener(this);\r
237 \r
238     nucleotideMenuItem.setLabel("Nucleotide");\r
239     nucleotideMenuItem.addActionListener(this);\r
240     conservationMenuItem.addItemListener(this);\r
241     abovePIDColour.addItemListener(this);\r
242     colourMenu.setLabel("Group Colour");\r
243     showBoxes.setLabel("Boxes");\r
244     showBoxes.setState(true);\r
245     showBoxes.addItemListener(this);\r
246 \r
247     showText.setLabel("Text");\r
248     showText.addItemListener(this);\r
249     showColourText.setLabel("Colour Text");\r
250     showColourText.addItemListener(this);\r
251 \r
252     add(groupMenu);\r
253     groupMenu.add(unGroupMenuItem);\r
254     groupMenu.add(colourMenu);\r
255     groupMenu.addSeparator();\r
256     groupMenu.add(showBoxes);\r
257     groupMenu.add(showText);\r
258     groupMenu.add(showColourText);\r
259     colourMenu.add(noColourmenuItem);\r
260     colourMenu.add(clustalColour);\r
261     colourMenu.add(BLOSUM62Colour);\r
262     colourMenu.add(PIDColour);\r
263     colourMenu.add(zappoColour);\r
264     colourMenu.add(taylorColour);\r
265     colourMenu.add(hydrophobicityColour);\r
266     colourMenu.add(helixColour);\r
267     colourMenu.add(strandColour);\r
268     colourMenu.add(turnColour);\r
269     colourMenu.add(buriedColour);\r
270     colourMenu.add(nucleotideMenuItem);\r
271     colourMenu.add(userDefinedColour);\r
272     colourMenu.addSeparator();\r
273     colourMenu.add(abovePIDColour);\r
274     colourMenu.add(conservationMenuItem);\r
275 \r
276     noColourmenuItem.setLabel("None");\r
277     noColourmenuItem.addActionListener(this);\r
278 \r
279     clustalColour.setLabel("Clustalx colours");\r
280     clustalColour.addActionListener(this);\r
281     zappoColour.setLabel("Zappo");\r
282     zappoColour.addActionListener(this);\r
283     taylorColour.setLabel("Taylor");\r
284     taylorColour.addActionListener(this);\r
285     hydrophobicityColour.setLabel("Hydrophobicity");\r
286     hydrophobicityColour.addActionListener(this);\r
287     helixColour.setLabel("Helix propensity");\r
288     helixColour.addActionListener(this);\r
289     strandColour.setLabel("Strand propensity");\r
290     strandColour.addActionListener(this);\r
291     turnColour.setLabel("Turn propensity");\r
292     turnColour.addActionListener(this);\r
293     buriedColour.setLabel("Buried Index");\r
294     buriedColour.addActionListener(this);\r
295     abovePIDColour.setLabel("Above % Identity");\r
296 \r
297     userDefinedColour.setLabel("User Defined");\r
298     userDefinedColour.addActionListener(this);\r
299     PIDColour.setLabel("Percentage Identity");\r
300     PIDColour.addActionListener(this);\r
301     BLOSUM62Colour.setLabel("BLOSUM62");\r
302     BLOSUM62Colour.addActionListener(this);\r
303     conservationMenuItem.setLabel("Conservation");\r
304 \r
305     add(editMenu);\r
306     editMenu.add(copy);\r
307     copy.addActionListener(this);\r
308     editMenu.add(cut);\r
309     cut.addActionListener(this);\r
310     editMenu.add(toUpper);\r
311     toUpper.addActionListener(this);\r
312     editMenu.add(toLower);\r
313     toLower.addActionListener(this);\r
314 \r
315   }\r
316 \r
317   void refresh()\r
318   {\r
319     ap.seqPanel.seqCanvas.repaint();\r
320     if(ap.overviewPanel!=null)\r
321       ap.overviewPanel.updateOverviewImage();\r
322   }\r
323 \r
324   protected void clustalColour_actionPerformed()\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()\r
332   {\r
333     getGroup().cs = new ZappoColourScheme();\r
334     refresh();\r
335   }\r
336 \r
337   protected void taylorColour_actionPerformed()\r
338   {\r
339     getGroup().cs = new TaylorColourScheme();\r
340     refresh();\r
341   }\r
342 \r
343   protected void hydrophobicityColour_actionPerformed()\r
344   {\r
345     getGroup().cs = new HydrophobicColourScheme();\r
346     refresh();\r
347   }\r
348 \r
349   protected void helixColour_actionPerformed()\r
350   {\r
351     getGroup().cs = new HelixColourScheme();\r
352     refresh();\r
353   }\r
354 \r
355   protected void strandColour_actionPerformed()\r
356   {\r
357     getGroup().cs = new StrandColourScheme();\r
358     refresh();\r
359   }\r
360 \r
361   protected void turnColour_actionPerformed()\r
362   {\r
363     getGroup().cs = new TurnColourScheme();\r
364     refresh();\r
365   }\r
366 \r
367   protected void buriedColour_actionPerformed()\r
368   {\r
369     getGroup().cs = new BuriedColourScheme();\r
370     refresh();\r
371   }\r
372 \r
373   public void nucleotideMenuItem_actionPerformed()\r
374   {\r
375     getGroup().cs = new NucleotideColourScheme();\r
376     refresh();\r
377   }\r
378 \r
379   protected void abovePIDColour_itemStateChanged()\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()\r
407   {\r
408     new UserDefinedColours(ap, getGroup());\r
409   }\r
410 \r
411   protected void PIDColour_actionPerformed()\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()\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()\r
433   {\r
434     getGroup().cs = null;\r
435     refresh();\r
436   }\r
437 \r
438   protected void conservationMenuItem_itemStateChanged()\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 \r
469   SequenceGroup getGroup()\r
470   {\r
471     SequenceGroup sg = ap.av.getSelectionGroup();\r
472 \r
473     // this method won't add a new group if it already exists\r
474     if(sg!=null)\r
475       ap.av.alignment.addGroup(sg);\r
476 \r
477     return sg;\r
478   }\r
479 \r
480   void unGroupMenuItem_actionPerformed()\r
481   {\r
482     SequenceGroup sg = ap.av.getSelectionGroup();\r
483     ap.av.alignment.deleteGroup(sg);\r
484     ap.av.setSelectionGroup(null);\r
485     ap.repaint();\r
486   }\r
487 \r
488   public void showColourText_itemStateChanged()\r
489   {\r
490     getGroup().setColourText(showColourText.getState());\r
491     refresh();\r
492   }\r
493 \r
494   public void showText_itemStateChanged()\r
495   {\r
496     getGroup().setDisplayText(showText.getState());\r
497     refresh();\r
498   }\r
499 \r
500   public void showBoxes_itemStateChanged()\r
501   {\r
502     getGroup().setDisplayBoxes(showBoxes.getState());\r
503     refresh();\r
504   }\r
505 \r
506 }\r