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