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