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