Check for null colour
[jalview.git] / src / jalview / gui / PopupMenu.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 package jalview.gui;\r
20 \r
21 import MCview.*;\r
22 \r
23 import jalview.analysis.*;\r
24 \r
25 import jalview.datamodel.*;\r
26 \r
27 import jalview.io.*;\r
28 \r
29 import jalview.schemes.*;\r
30 \r
31 import java.awt.*;\r
32 import java.awt.event.*;\r
33 \r
34 import javax.swing.*;\r
35 \r
36 \r
37 /**\r
38  * DOCUMENT ME!\r
39  *\r
40  * @author $author$\r
41  * @version $Revision$\r
42  */\r
43 public class PopupMenu extends JPopupMenu\r
44 {\r
45     JMenu groupMenu = new JMenu();\r
46     JMenuItem groupName = new JMenuItem();\r
47     protected JRadioButtonMenuItem clustalColour = new JRadioButtonMenuItem();\r
48     protected JRadioButtonMenuItem zappoColour = new JRadioButtonMenuItem();\r
49     protected JRadioButtonMenuItem taylorColour = new JRadioButtonMenuItem();\r
50     protected JRadioButtonMenuItem hydrophobicityColour = new JRadioButtonMenuItem();\r
51     protected JRadioButtonMenuItem helixColour = new JRadioButtonMenuItem();\r
52     protected JRadioButtonMenuItem strandColour = new JRadioButtonMenuItem();\r
53     protected JRadioButtonMenuItem turnColour = new JRadioButtonMenuItem();\r
54     protected JRadioButtonMenuItem buriedColour = new JRadioButtonMenuItem();\r
55     protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();\r
56     protected JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem();\r
57     protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();\r
58     protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();\r
59     JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();\r
60     protected JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();\r
61     AlignmentPanel ap;\r
62     JMenu sequenceMenu = new JMenu();\r
63     JMenuItem sequenceName = new JMenuItem();\r
64     Sequence sequence;\r
65     JMenuItem unGroupMenuItem = new JMenuItem();\r
66     JMenuItem pdbMenuItem = new JMenuItem();\r
67     JMenuItem outline = new JMenuItem();\r
68     JRadioButtonMenuItem nucleotideMenuItem = new JRadioButtonMenuItem();\r
69     JMenu colourMenu = new JMenu();\r
70     JCheckBoxMenuItem showBoxes = new JCheckBoxMenuItem();\r
71     JCheckBoxMenuItem showText = new JCheckBoxMenuItem();\r
72     JCheckBoxMenuItem showColourText = new JCheckBoxMenuItem();\r
73 \r
74     /**\r
75      * Creates a new PopupMenu object.\r
76      *\r
77      * @param ap DOCUMENT ME!\r
78      * @param seq DOCUMENT ME!\r
79      */\r
80     public PopupMenu(AlignmentPanel ap, Sequence seq)\r
81     {\r
82         ///////////////////////////////////////////////////////////\r
83         // If this is activated from the sequence panel, the user may want to\r
84         // edit or annotate a particular residue. Therefore display the residue menu\r
85         //\r
86         // If from the IDPanel, we must display the sequence menu\r
87         //////////////////////////////////////////////////////////\r
88         this.ap = ap;\r
89         sequence = seq;\r
90 \r
91         ButtonGroup colours = new ButtonGroup();\r
92         colours.add(noColourmenuItem);\r
93         colours.add(clustalColour);\r
94         colours.add(zappoColour);\r
95         colours.add(taylorColour);\r
96         colours.add(hydrophobicityColour);\r
97         colours.add(helixColour);\r
98         colours.add(strandColour);\r
99         colours.add(turnColour);\r
100         colours.add(buriedColour);\r
101         colours.add(abovePIDColour);\r
102         colours.add(userDefinedColour);\r
103         colours.add(PIDColour);\r
104         colours.add(BLOSUM62Colour);\r
105 \r
106         try\r
107         {\r
108             jbInit();\r
109         }\r
110         catch (Exception e)\r
111         {\r
112             e.printStackTrace();\r
113         }\r
114 \r
115         if ((seq == null) || (seq.getPDBId() == null))\r
116         {\r
117             pdbMenuItem.setVisible(false);\r
118         }\r
119 \r
120         SequenceGroup sg = ap.av.getSelectionGroup();\r
121 \r
122         if (sg != null)\r
123         {\r
124             groupName.setText(sg.getName());\r
125 \r
126             if (sg.cs instanceof ZappoColourScheme)\r
127             {\r
128                 zappoColour.setSelected(true);\r
129             }\r
130             else if (sg.cs instanceof TaylorColourScheme)\r
131             {\r
132                 taylorColour.setSelected(true);\r
133             }\r
134             else if (sg.cs instanceof PIDColourScheme)\r
135             {\r
136                 PIDColour.setSelected(true);\r
137             }\r
138             else if (sg.cs instanceof Blosum62ColourScheme)\r
139             {\r
140                 BLOSUM62Colour.setSelected(true);\r
141             }\r
142             else if (sg.cs instanceof UserColourScheme)\r
143             {\r
144                 userDefinedColour.setSelected(true);\r
145             }\r
146             else if (sg.cs instanceof HydrophobicColourScheme)\r
147             {\r
148                 hydrophobicityColour.setSelected(true);\r
149             }\r
150             else if (sg.cs instanceof HelixColourScheme)\r
151             {\r
152                 helixColour.setSelected(true);\r
153             }\r
154             else if (sg.cs instanceof StrandColourScheme)\r
155             {\r
156                 strandColour.setSelected(true);\r
157             }\r
158             else if (sg.cs instanceof TurnColourScheme)\r
159             {\r
160                 turnColour.setSelected(true);\r
161             }\r
162             else if (sg.cs instanceof BuriedColourScheme)\r
163             {\r
164                 buriedColour.setSelected(true);\r
165             }\r
166             else if (sg.cs instanceof ClustalxColourScheme)\r
167             {\r
168                 clustalColour.setSelected(true);\r
169             }\r
170             else\r
171             {\r
172                 noColourmenuItem.setSelected(true);\r
173             }\r
174 \r
175             if (sg.cs!=null && sg.cs.conservationApplied())\r
176             {\r
177                 conservationMenuItem.setSelected(true);\r
178             }\r
179 \r
180             showText.setSelected(sg.getDisplayText());\r
181             showColourText.setSelected(sg.getColourText());\r
182             showBoxes.setSelected(sg.getDisplayBoxes());\r
183         }\r
184 \r
185         if (!ap.av.alignment.getGroups().contains(sg))\r
186         {\r
187             unGroupMenuItem.setVisible(false);\r
188         }\r
189         else\r
190         {\r
191             groupMenu.insertSeparator(3);\r
192         }\r
193 \r
194         if (seq == null)\r
195         {\r
196             sequenceMenu.setVisible(false);\r
197         }\r
198         else\r
199         {\r
200           java.util.Vector links = Preferences.sequenceURLLinks;\r
201 \r
202           JMenu linkMenu = new JMenu("Link");\r
203           JMenuItem item;\r
204           for(int i=0; i<links.size(); i++)\r
205           {\r
206             String link = links.elementAt(i).toString();\r
207 \r
208             item = new JMenuItem(link.substring(0, link.indexOf("|")));\r
209 \r
210             final String url = link.substring(link.indexOf("|")+1, link.indexOf("$SEQUENCE_ID$"))\r
211                 + sequence.getName() +\r
212                 link.substring(link.indexOf("$SEQUENCE_ID$") + 13);\r
213 \r
214 \r
215             item.addActionListener(new java.awt.event.ActionListener()\r
216             {\r
217                 public void actionPerformed(ActionEvent e)\r
218                 {\r
219                     showLink(url);\r
220                 }\r
221             });\r
222 \r
223             linkMenu.add(item);\r
224           }\r
225           add(linkMenu);\r
226         }\r
227     }\r
228 \r
229     /**\r
230      * DOCUMENT ME!\r
231      *\r
232      * @throws Exception DOCUMENT ME!\r
233      */\r
234     private void jbInit() throws Exception\r
235     {\r
236         groupMenu.setText("Group");\r
237         groupMenu.setText("Define");\r
238         groupName.setText("Name");\r
239         groupName.addActionListener(new java.awt.event.ActionListener()\r
240             {\r
241                 public void actionPerformed(ActionEvent e)\r
242                 {\r
243                     groupName_actionPerformed(e);\r
244                 }\r
245             });\r
246         sequenceMenu.setText("Sequence");\r
247         sequenceName.setText("Edit name");\r
248         sequenceName.addActionListener(new java.awt.event.ActionListener()\r
249             {\r
250                 public void actionPerformed(ActionEvent e)\r
251                 {\r
252                     sequenceName_actionPerformed(e);\r
253                 }\r
254             });\r
255         PIDColour.setFocusPainted(false);\r
256         unGroupMenuItem.setText("Remove Group");\r
257         unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
258             {\r
259                 public void actionPerformed(ActionEvent e)\r
260                 {\r
261                     unGroupMenuItem_actionPerformed(e);\r
262                 }\r
263             });\r
264         pdbMenuItem.setText("View PDB structure");\r
265         pdbMenuItem.addActionListener(new java.awt.event.ActionListener()\r
266             {\r
267                 public void actionPerformed(ActionEvent e)\r
268                 {\r
269                     pdbMenuItem_actionPerformed(e);\r
270                 }\r
271             });\r
272         outline.setText("Border colour");\r
273         outline.addActionListener(new java.awt.event.ActionListener()\r
274             {\r
275                 public void actionPerformed(ActionEvent e)\r
276                 {\r
277                     outline_actionPerformed(e);\r
278                 }\r
279             });\r
280         nucleotideMenuItem.setText("Nucleotide");\r
281         nucleotideMenuItem.addActionListener(new ActionListener()\r
282             {\r
283                 public void actionPerformed(ActionEvent e)\r
284                 {\r
285                     nucleotideMenuItem_actionPerformed(e);\r
286                 }\r
287             });\r
288         colourMenu.setText("Group Colour");\r
289         showBoxes.setText("Boxes");\r
290         showBoxes.setState(true);\r
291         showBoxes.addActionListener(new ActionListener()\r
292             {\r
293                 public void actionPerformed(ActionEvent e)\r
294                 {\r
295                     showBoxes_actionPerformed(e);\r
296                 }\r
297             });\r
298         showText.setText("Text");\r
299         showText.setState(true);\r
300         showText.addActionListener(new ActionListener()\r
301             {\r
302                 public void actionPerformed(ActionEvent e)\r
303                 {\r
304                     showText_actionPerformed(e);\r
305                 }\r
306             });\r
307         showColourText.setText("Colour Text");\r
308         showColourText.addActionListener(new ActionListener()\r
309             {\r
310                 public void actionPerformed(ActionEvent e)\r
311                 {\r
312                     showColourText_actionPerformed(e);\r
313                 }\r
314             });\r
315         add(groupMenu);\r
316         add(sequenceMenu);\r
317         groupMenu.add(groupName);\r
318         groupMenu.addSeparator();\r
319         groupMenu.add(unGroupMenuItem);\r
320         groupMenu.add(colourMenu);\r
321         groupMenu.addSeparator();\r
322         groupMenu.add(showBoxes);\r
323         groupMenu.add(showText);\r
324         groupMenu.add(showColourText);\r
325         groupMenu.addSeparator();\r
326         groupMenu.add(outline);\r
327         sequenceMenu.add(sequenceName);\r
328         sequenceMenu.add(pdbMenuItem);\r
329         colourMenu.add(noColourmenuItem);\r
330         colourMenu.add(clustalColour);\r
331         colourMenu.add(BLOSUM62Colour);\r
332         colourMenu.add(PIDColour);\r
333         colourMenu.add(zappoColour);\r
334         colourMenu.add(taylorColour);\r
335         colourMenu.add(hydrophobicityColour);\r
336         colourMenu.add(helixColour);\r
337         colourMenu.add(strandColour);\r
338         colourMenu.add(turnColour);\r
339         colourMenu.add(buriedColour);\r
340         colourMenu.add(nucleotideMenuItem);\r
341         colourMenu.add(userDefinedColour);\r
342 \r
343         if(jalview.gui.UserDefinedColours.getUserColourSchemes()!=null)\r
344         {\r
345           java.util.Enumeration userColours = jalview.gui.UserDefinedColours.\r
346               getUserColourSchemes().keys();\r
347 \r
348           while (userColours.hasMoreElements())\r
349           {\r
350             JMenuItem item = new JMenuItem(userColours.\r
351                 nextElement().toString());\r
352             item.addActionListener(new ActionListener()\r
353             {\r
354               public void actionPerformed(ActionEvent evt)\r
355               {\r
356                 userDefinedColour_actionPerformed(evt);\r
357               }\r
358             });\r
359             colourMenu.add(item);\r
360           }\r
361         }\r
362 \r
363 \r
364         colourMenu.addSeparator();\r
365         colourMenu.add(abovePIDColour);\r
366         colourMenu.add(conservationMenuItem);\r
367         noColourmenuItem.setText("None");\r
368         noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
369             {\r
370                 public void actionPerformed(ActionEvent e)\r
371                 {\r
372                     noColourmenuItem_actionPerformed(e);\r
373                 }\r
374             });\r
375 \r
376         clustalColour.setText("Clustalx colours");\r
377         clustalColour.addActionListener(new java.awt.event.ActionListener()\r
378             {\r
379                 public void actionPerformed(ActionEvent e)\r
380                 {\r
381                     clustalColour_actionPerformed(e);\r
382                 }\r
383             });\r
384         zappoColour.setText("Zappo");\r
385         zappoColour.addActionListener(new java.awt.event.ActionListener()\r
386             {\r
387                 public void actionPerformed(ActionEvent e)\r
388                 {\r
389                     zappoColour_actionPerformed(e);\r
390                 }\r
391             });\r
392         taylorColour.setText("Taylor");\r
393         taylorColour.addActionListener(new java.awt.event.ActionListener()\r
394             {\r
395                 public void actionPerformed(ActionEvent e)\r
396                 {\r
397                     taylorColour_actionPerformed(e);\r
398                 }\r
399             });\r
400         hydrophobicityColour.setText("Hydrophobicity");\r
401         hydrophobicityColour.addActionListener(new java.awt.event.ActionListener()\r
402             {\r
403                 public void actionPerformed(ActionEvent e)\r
404                 {\r
405                     hydrophobicityColour_actionPerformed(e);\r
406                 }\r
407             });\r
408         helixColour.setText("Helix propensity");\r
409         helixColour.addActionListener(new java.awt.event.ActionListener()\r
410             {\r
411                 public void actionPerformed(ActionEvent e)\r
412                 {\r
413                     helixColour_actionPerformed(e);\r
414                 }\r
415             });\r
416         strandColour.setText("Strand propensity");\r
417         strandColour.addActionListener(new java.awt.event.ActionListener()\r
418             {\r
419                 public void actionPerformed(ActionEvent e)\r
420                 {\r
421                     strandColour_actionPerformed(e);\r
422                 }\r
423             });\r
424         turnColour.setText("Turn propensity");\r
425         turnColour.addActionListener(new java.awt.event.ActionListener()\r
426             {\r
427                 public void actionPerformed(ActionEvent e)\r
428                 {\r
429                     turnColour_actionPerformed(e);\r
430                 }\r
431             });\r
432         buriedColour.setText("Buried Index");\r
433         buriedColour.addActionListener(new java.awt.event.ActionListener()\r
434             {\r
435                 public void actionPerformed(ActionEvent e)\r
436                 {\r
437                     buriedColour_actionPerformed(e);\r
438                 }\r
439             });\r
440         abovePIDColour.setText("Above % Identity");\r
441         abovePIDColour.addActionListener(new java.awt.event.ActionListener()\r
442             {\r
443                 public void actionPerformed(ActionEvent e)\r
444                 {\r
445                     abovePIDColour_actionPerformed(e);\r
446                 }\r
447             });\r
448         userDefinedColour.setText("User Defined...");\r
449         userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
450             {\r
451                 public void actionPerformed(ActionEvent e)\r
452                 {\r
453                     userDefinedColour_actionPerformed(e);\r
454                 }\r
455             });\r
456         PIDColour.setText("Percentage Identity");\r
457         PIDColour.addActionListener(new java.awt.event.ActionListener()\r
458             {\r
459                 public void actionPerformed(ActionEvent e)\r
460                 {\r
461                     PIDColour_actionPerformed(e);\r
462                 }\r
463             });\r
464         BLOSUM62Colour.setText("BLOSUM62");\r
465         BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
466             {\r
467                 public void actionPerformed(ActionEvent e)\r
468                 {\r
469                     BLOSUM62Colour_actionPerformed(e);\r
470                 }\r
471             });\r
472         conservationMenuItem.setText("Conservation");\r
473         conservationMenuItem.addActionListener(new java.awt.event.ActionListener()\r
474             {\r
475                 public void actionPerformed(ActionEvent e)\r
476                 {\r
477                     conservationMenuItem_actionPerformed(e);\r
478                 }\r
479             });\r
480     }\r
481 \r
482     /**\r
483      * DOCUMENT ME!\r
484      */\r
485     void refresh()\r
486     {\r
487         SequenceGroup sg = getGroup();\r
488         if(sg!=null)\r
489         {\r
490           SuperGroup superG = ap.av.alignment.getSuperGroup(sg);\r
491 \r
492           if (superG != null)\r
493           {\r
494             superG.setSuperGroupProperties(sg);\r
495           }\r
496         }\r
497         ap.seqPanel.repaint();\r
498     }\r
499 \r
500     /**\r
501      * DOCUMENT ME!\r
502      *\r
503      * @param e DOCUMENT ME!\r
504      */\r
505     protected void clustalColour_actionPerformed(ActionEvent e)\r
506     {\r
507         SequenceGroup sg = getGroup();\r
508         sg.cs = new ClustalxColourScheme(sg.sequences,\r
509                 ap.av.alignment.getWidth());\r
510         refresh();\r
511     }\r
512 \r
513     /**\r
514      * DOCUMENT ME!\r
515      *\r
516      * @param e DOCUMENT ME!\r
517      */\r
518     protected void zappoColour_actionPerformed(ActionEvent e)\r
519     {\r
520         getGroup().cs = new ZappoColourScheme();\r
521         refresh();\r
522     }\r
523 \r
524     /**\r
525      * DOCUMENT ME!\r
526      *\r
527      * @param e DOCUMENT ME!\r
528      */\r
529     protected void taylorColour_actionPerformed(ActionEvent e)\r
530     {\r
531         getGroup().cs = new TaylorColourScheme();\r
532         refresh();\r
533     }\r
534 \r
535     /**\r
536      * DOCUMENT ME!\r
537      *\r
538      * @param e DOCUMENT ME!\r
539      */\r
540     protected void hydrophobicityColour_actionPerformed(ActionEvent e)\r
541     {\r
542         getGroup().cs = new HydrophobicColourScheme();\r
543         refresh();\r
544     }\r
545 \r
546     /**\r
547      * DOCUMENT ME!\r
548      *\r
549      * @param e DOCUMENT ME!\r
550      */\r
551     protected void helixColour_actionPerformed(ActionEvent e)\r
552     {\r
553         getGroup().cs = new HelixColourScheme();\r
554         refresh();\r
555     }\r
556 \r
557     /**\r
558      * DOCUMENT ME!\r
559      *\r
560      * @param e DOCUMENT ME!\r
561      */\r
562     protected void strandColour_actionPerformed(ActionEvent e)\r
563     {\r
564         getGroup().cs = new StrandColourScheme();\r
565         refresh();\r
566     }\r
567 \r
568     /**\r
569      * DOCUMENT ME!\r
570      *\r
571      * @param e DOCUMENT ME!\r
572      */\r
573     protected void turnColour_actionPerformed(ActionEvent e)\r
574     {\r
575         getGroup().cs = new TurnColourScheme();\r
576         refresh();\r
577     }\r
578 \r
579     /**\r
580      * DOCUMENT ME!\r
581      *\r
582      * @param e DOCUMENT ME!\r
583      */\r
584     protected void buriedColour_actionPerformed(ActionEvent e)\r
585     {\r
586         getGroup().cs = new BuriedColourScheme();\r
587         refresh();\r
588     }\r
589 \r
590     /**\r
591      * DOCUMENT ME!\r
592      *\r
593      * @param e DOCUMENT ME!\r
594      */\r
595     public void nucleotideMenuItem_actionPerformed(ActionEvent e)\r
596     {\r
597         getGroup().cs = new NucleotideColourScheme();\r
598         refresh();\r
599     }\r
600 \r
601     /**\r
602      * DOCUMENT ME!\r
603      *\r
604      * @param e DOCUMENT ME!\r
605      */\r
606     protected void abovePIDColour_actionPerformed(ActionEvent e)\r
607     {\r
608         SequenceGroup sg = getGroup();\r
609         if(sg.cs==null)\r
610           return;\r
611 \r
612         if (abovePIDColour.isSelected())\r
613         {\r
614             sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
615                     ap.av.alignment.getWidth()));\r
616 \r
617             int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs,\r
618                     getGroup().getName());\r
619 \r
620            sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());\r
621 \r
622             SliderPanel.showPIDSlider();\r
623         }\r
624         else // remove PIDColouring\r
625         {\r
626             sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
627         }\r
628 \r
629         refresh();\r
630     }\r
631 \r
632     /**\r
633      * DOCUMENT ME!\r
634      *\r
635      * @param e DOCUMENT ME!\r
636      */\r
637     protected void userDefinedColour_actionPerformed(ActionEvent e)\r
638     {\r
639        SequenceGroup sg = getGroup();\r
640 \r
641        if (e.getActionCommand().equals("User Defined..."))\r
642          new UserDefinedColours(ap, sg);\r
643        else\r
644        {\r
645          UserColourScheme udc = (UserColourScheme) UserDefinedColours.\r
646              getUserColourSchemes().get(e.getActionCommand());\r
647 \r
648          sg.cs = udc;\r
649        }\r
650      }\r
651     /**\r
652      * DOCUMENT ME!\r
653      *\r
654      * @param e DOCUMENT ME!\r
655      */\r
656     protected void PIDColour_actionPerformed(ActionEvent e)\r
657     {\r
658         SequenceGroup sg = getGroup();\r
659         sg.cs = new PIDColourScheme();\r
660         sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
661                 ap.av.alignment.getWidth()));\r
662         refresh();\r
663     }\r
664 \r
665     /**\r
666      * DOCUMENT ME!\r
667      *\r
668      * @param e DOCUMENT ME!\r
669      */\r
670     protected void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
671     {\r
672         SequenceGroup sg = getGroup();\r
673 \r
674         sg.cs = new Blosum62ColourScheme();\r
675 \r
676         sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
677                 ap.av.alignment.getWidth()));\r
678 \r
679         refresh();\r
680     }\r
681 \r
682     /**\r
683      * DOCUMENT ME!\r
684      *\r
685      * @param e DOCUMENT ME!\r
686      */\r
687     protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
688     {\r
689         getGroup().cs = null;\r
690         refresh();\r
691     }\r
692 \r
693     /**\r
694      * DOCUMENT ME!\r
695      *\r
696      * @param e DOCUMENT ME!\r
697      */\r
698     protected void conservationMenuItem_actionPerformed(ActionEvent e)\r
699     {\r
700         SequenceGroup sg = getGroup();\r
701         if(sg.cs==null)\r
702           return;\r
703 \r
704         if (conservationMenuItem.isSelected())\r
705         {\r
706             Conservation c = new Conservation("Group",\r
707                     ResidueProperties.propHash, 3, sg.sequences, 0,\r
708                     ap.av.alignment.getWidth());\r
709 \r
710             c.calculate();\r
711             c.verdict(false, ap.av.ConsPercGaps);\r
712 \r
713             sg.cs.setConservation(c);\r
714 \r
715             SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());\r
716             SliderPanel.showConservationSlider();\r
717         }\r
718         else // remove ConservationColouring\r
719         {\r
720             sg.cs.setConservation(null);\r
721         }\r
722 \r
723         refresh();\r
724     }\r
725 \r
726     /**\r
727      * DOCUMENT ME!\r
728      *\r
729      * @param e DOCUMENT ME!\r
730      */\r
731     protected void groupName_actionPerformed(ActionEvent e)\r
732     {\r
733         SequenceGroup sg = getGroup();\r
734         String reply = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
735                 "Enter new group name", "Edit group name",\r
736                 JOptionPane.QUESTION_MESSAGE);\r
737 \r
738         if (reply == null)\r
739         {\r
740             return;\r
741         }\r
742 \r
743         sg.setName(reply);\r
744         groupName.setText(reply);\r
745     }\r
746 \r
747     /**\r
748      * DOCUMENT ME!\r
749      *\r
750      * @param e DOCUMENT ME!\r
751      */\r
752     protected void analyze_actionPerformed(ActionEvent e)\r
753     {\r
754         CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
755         JInternalFrame frame = new JInternalFrame();\r
756         frame.setContentPane(cap);\r
757         Desktop.addInternalFrame(frame, "Analyze this - ", 400, 300);\r
758 \r
759         SequenceGroup sg = getGroup();\r
760         StringBuffer sb = new StringBuffer();\r
761 \r
762         for (int i = 0; i < sg.sequences.size(); i++)\r
763         {\r
764             Sequence tmp = (Sequence) sg.sequences.get(i);\r
765             sb.append(tmp.getSequence(sg.getStartRes(), sg.getEndRes() + 1));\r
766             sb.append("\n");\r
767         }\r
768 \r
769         sb.append("Something amazing will happen soon");\r
770         cap.setText(sb.toString());\r
771     }\r
772 \r
773     /**\r
774      * DOCUMENT ME!\r
775      *\r
776      * @return DOCUMENT ME!\r
777      */\r
778     SequenceGroup getGroup()\r
779     {\r
780         SequenceGroup sg = ap.av.getSelectionGroup();\r
781       // this method won't add a new group if it already exists\r
782         if(sg!=null)\r
783           ap.av.alignment.addGroup(sg);\r
784 \r
785         return sg;\r
786     }\r
787 \r
788     /**\r
789      * DOCUMENT ME!\r
790      *\r
791      * @param e DOCUMENT ME!\r
792      */\r
793     void sequenceName_actionPerformed(ActionEvent e)\r
794     {\r
795         String id = sequence.getName();\r
796         String s = (String) JOptionPane.showInternalInputDialog(ap,\r
797                 "Edit sequence name",\r
798                 "Edit sequence name (" + sequence.getName() + ")",\r
799                 JOptionPane.PLAIN_MESSAGE, null, null, id);\r
800 \r
801         if (s != null)\r
802         {\r
803             if (s.indexOf(" ") > -1)\r
804             {\r
805                 JOptionPane.showMessageDialog(ap,\r
806                     "Spaces have been converted to \"_\"",\r
807                     "No spaces allowed in Sequence Name",\r
808                     JOptionPane.WARNING_MESSAGE);\r
809             }\r
810 \r
811             s = s.replace(' ', '_');\r
812             sequence.setName(s);\r
813             ap.repaint();\r
814         }\r
815     }\r
816 \r
817     /**\r
818      * DOCUMENT ME!\r
819      *\r
820      * @param e DOCUMENT ME!\r
821      */\r
822     void unGroupMenuItem_actionPerformed(ActionEvent e)\r
823     {\r
824         SequenceGroup sg = ap.av.getSelectionGroup();\r
825         ap.av.alignment.deleteGroup(sg);\r
826         ap.av.setSelectionGroup(null);\r
827         refresh();\r
828     }\r
829 \r
830     /**\r
831      * DOCUMENT ME!\r
832      *\r
833      * @param e DOCUMENT ME!\r
834      */\r
835     void pdbMenuItem_actionPerformed(ActionEvent e)\r
836     {\r
837         if (sequence.getPDBId() == null)\r
838         {\r
839             return;\r
840         }\r
841 \r
842         try\r
843         {\r
844             EBIFetchClient ebi = new EBIFetchClient();\r
845             String[] result = ebi.fetchData("pdb:" + sequence.getPDBId(), null,\r
846                     null);\r
847 \r
848             PDBfile pdb = new PDBfile(result);\r
849 \r
850             rotCanvas rc = new rotCanvas(pdb, sequence, ap.av);\r
851             JInternalFrame frame = new JInternalFrame();\r
852             frame.setContentPane(rc);\r
853             Desktop.addInternalFrame(frame,\r
854                 sequence.getName() + " " + sequence.getPDBId(), 400, 400);\r
855         }\r
856         catch (Exception ex)\r
857         {\r
858             ex.printStackTrace();\r
859         }\r
860     }\r
861 \r
862     /**\r
863      * DOCUMENT ME!\r
864      *\r
865      * @param e DOCUMENT ME!\r
866      */\r
867     protected void outline_actionPerformed(ActionEvent e)\r
868     {\r
869         SequenceGroup sg = getGroup();\r
870         Color col = JColorChooser.showDialog(this, "Select Outline Colour",\r
871                 Color.BLUE);\r
872 \r
873         if (col != null)\r
874         {\r
875             sg.setOutlineColour(col);\r
876         }\r
877 \r
878         refresh();\r
879     }\r
880 \r
881     /**\r
882      * DOCUMENT ME!\r
883      *\r
884      * @param e DOCUMENT ME!\r
885      */\r
886     public void showBoxes_actionPerformed(ActionEvent e)\r
887     {\r
888         getGroup().setDisplayBoxes(showBoxes.isSelected());\r
889         refresh();\r
890     }\r
891 \r
892     /**\r
893      * DOCUMENT ME!\r
894      *\r
895      * @param e DOCUMENT ME!\r
896      */\r
897     public void showText_actionPerformed(ActionEvent e)\r
898     {\r
899         getGroup().setDisplayText(showText.isSelected());\r
900         refresh();\r
901     }\r
902 \r
903     /**\r
904      * DOCUMENT ME!\r
905      *\r
906      * @param e DOCUMENT ME!\r
907      */\r
908     public void showColourText_actionPerformed(ActionEvent e)\r
909     {\r
910         getGroup().setColourText(showColourText.isSelected());\r
911         refresh();\r
912     }\r
913 \r
914     public void showLink(String url)\r
915     {\r
916       try\r
917       {\r
918         jalview.util.BrowserLauncher.openURL(url);\r
919       }\r
920       catch (Exception ex)\r
921       {\r
922         JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
923             "Unixers: Couldn't find default web browser."\r
924            +"\nAdd the full path to your browser in Preferences.",\r
925            "Web browser not found", JOptionPane.WARNING_MESSAGE );\r
926 \r
927 \r
928         ex.printStackTrace();\r
929       }\r
930     }\r
931 }\r