Handle multiple url links
[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 instanceof ConservationColourScheme)\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         colourMenu.addSeparator();\r
343         colourMenu.add(abovePIDColour);\r
344         colourMenu.add(conservationMenuItem);\r
345         noColourmenuItem.setText("None");\r
346         noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
347             {\r
348                 public void actionPerformed(ActionEvent e)\r
349                 {\r
350                     noColourmenuItem_actionPerformed(e);\r
351                 }\r
352             });\r
353 \r
354         clustalColour.setText("Clustalx colours");\r
355         clustalColour.addActionListener(new java.awt.event.ActionListener()\r
356             {\r
357                 public void actionPerformed(ActionEvent e)\r
358                 {\r
359                     clustalColour_actionPerformed(e);\r
360                 }\r
361             });\r
362         zappoColour.setText("Zappo");\r
363         zappoColour.addActionListener(new java.awt.event.ActionListener()\r
364             {\r
365                 public void actionPerformed(ActionEvent e)\r
366                 {\r
367                     zappoColour_actionPerformed(e);\r
368                 }\r
369             });\r
370         taylorColour.setText("Taylor");\r
371         taylorColour.addActionListener(new java.awt.event.ActionListener()\r
372             {\r
373                 public void actionPerformed(ActionEvent e)\r
374                 {\r
375                     taylorColour_actionPerformed(e);\r
376                 }\r
377             });\r
378         hydrophobicityColour.setText("Hydrophobicity");\r
379         hydrophobicityColour.addActionListener(new java.awt.event.ActionListener()\r
380             {\r
381                 public void actionPerformed(ActionEvent e)\r
382                 {\r
383                     hydrophobicityColour_actionPerformed(e);\r
384                 }\r
385             });\r
386         helixColour.setText("Helix propensity");\r
387         helixColour.addActionListener(new java.awt.event.ActionListener()\r
388             {\r
389                 public void actionPerformed(ActionEvent e)\r
390                 {\r
391                     helixColour_actionPerformed(e);\r
392                 }\r
393             });\r
394         strandColour.setText("Strand propensity");\r
395         strandColour.addActionListener(new java.awt.event.ActionListener()\r
396             {\r
397                 public void actionPerformed(ActionEvent e)\r
398                 {\r
399                     strandColour_actionPerformed(e);\r
400                 }\r
401             });\r
402         turnColour.setText("Turn propensity");\r
403         turnColour.addActionListener(new java.awt.event.ActionListener()\r
404             {\r
405                 public void actionPerformed(ActionEvent e)\r
406                 {\r
407                     turnColour_actionPerformed(e);\r
408                 }\r
409             });\r
410         buriedColour.setText("Buried Index");\r
411         buriedColour.addActionListener(new java.awt.event.ActionListener()\r
412             {\r
413                 public void actionPerformed(ActionEvent e)\r
414                 {\r
415                     buriedColour_actionPerformed(e);\r
416                 }\r
417             });\r
418         abovePIDColour.setText("Above % Identity");\r
419         abovePIDColour.addActionListener(new java.awt.event.ActionListener()\r
420             {\r
421                 public void actionPerformed(ActionEvent e)\r
422                 {\r
423                     abovePIDColour_actionPerformed(e);\r
424                 }\r
425             });\r
426         userDefinedColour.setText("User Defined");\r
427         userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
428             {\r
429                 public void actionPerformed(ActionEvent e)\r
430                 {\r
431                     userDefinedColour_actionPerformed(e);\r
432                 }\r
433             });\r
434         PIDColour.setText("Percentage Identity");\r
435         PIDColour.addActionListener(new java.awt.event.ActionListener()\r
436             {\r
437                 public void actionPerformed(ActionEvent e)\r
438                 {\r
439                     PIDColour_actionPerformed(e);\r
440                 }\r
441             });\r
442         BLOSUM62Colour.setText("BLOSUM62");\r
443         BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
444             {\r
445                 public void actionPerformed(ActionEvent e)\r
446                 {\r
447                     BLOSUM62Colour_actionPerformed(e);\r
448                 }\r
449             });\r
450         conservationMenuItem.setText("Conservation");\r
451         conservationMenuItem.addActionListener(new java.awt.event.ActionListener()\r
452             {\r
453                 public void actionPerformed(ActionEvent e)\r
454                 {\r
455                     conservationMenuItem_actionPerformed(e);\r
456                 }\r
457             });\r
458     }\r
459 \r
460     /**\r
461      * DOCUMENT ME!\r
462      */\r
463     void refresh()\r
464     {\r
465         SequenceGroup sg = getGroup();\r
466         if(sg!=null)\r
467         {\r
468           SuperGroup superG = ap.av.alignment.getSuperGroup(sg);\r
469 \r
470           if (superG != null)\r
471           {\r
472             superG.setSuperGroupProperties(sg);\r
473           }\r
474         }\r
475         ap.seqPanel.repaint();\r
476     }\r
477 \r
478     /**\r
479      * DOCUMENT ME!\r
480      *\r
481      * @param e DOCUMENT ME!\r
482      */\r
483     protected void clustalColour_actionPerformed(ActionEvent e)\r
484     {\r
485         SequenceGroup sg = getGroup();\r
486         sg.cs = new ClustalxColourScheme(sg.sequences,\r
487                 ap.av.alignment.getWidth());\r
488         refresh();\r
489     }\r
490 \r
491     /**\r
492      * DOCUMENT ME!\r
493      *\r
494      * @param e DOCUMENT ME!\r
495      */\r
496     protected void zappoColour_actionPerformed(ActionEvent e)\r
497     {\r
498         getGroup().cs = new ZappoColourScheme();\r
499         refresh();\r
500     }\r
501 \r
502     /**\r
503      * DOCUMENT ME!\r
504      *\r
505      * @param e DOCUMENT ME!\r
506      */\r
507     protected void taylorColour_actionPerformed(ActionEvent e)\r
508     {\r
509         getGroup().cs = new TaylorColourScheme();\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 hydrophobicityColour_actionPerformed(ActionEvent e)\r
519     {\r
520         getGroup().cs = new HydrophobicColourScheme();\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 helixColour_actionPerformed(ActionEvent e)\r
530     {\r
531         getGroup().cs = new HelixColourScheme();\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 strandColour_actionPerformed(ActionEvent e)\r
541     {\r
542         getGroup().cs = new StrandColourScheme();\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 turnColour_actionPerformed(ActionEvent e)\r
552     {\r
553         getGroup().cs = new TurnColourScheme();\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 buriedColour_actionPerformed(ActionEvent e)\r
563     {\r
564         getGroup().cs = new BuriedColourScheme();\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     public void nucleotideMenuItem_actionPerformed(ActionEvent e)\r
574     {\r
575         getGroup().cs = new NucleotideColourScheme();\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 abovePIDColour_actionPerformed(ActionEvent e)\r
585     {\r
586         SequenceGroup sg = getGroup();\r
587 \r
588         if (abovePIDColour.isSelected())\r
589         {\r
590             sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
591                     ap.av.alignment.getWidth()));\r
592 \r
593             int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs,\r
594                     getGroup().getName());\r
595 \r
596             if (sg.cs instanceof ResidueColourScheme)\r
597             {\r
598                 ((ResidueColourScheme) sg.cs).setThreshold(threshold);\r
599             }\r
600             else if (sg.cs instanceof ScoreColourScheme)\r
601             {\r
602                 ((ScoreColourScheme) sg.cs).setThreshold(threshold);\r
603             }\r
604 \r
605             SliderPanel.showPIDSlider();\r
606         }\r
607         else // remove PIDColouring\r
608         {\r
609             ResidueColourScheme rcs = (ResidueColourScheme) sg.cs;\r
610             rcs.setThreshold(0);\r
611             sg.cs = rcs;\r
612         }\r
613 \r
614         refresh();\r
615     }\r
616 \r
617     /**\r
618      * DOCUMENT ME!\r
619      *\r
620      * @param e DOCUMENT ME!\r
621      */\r
622     protected void userDefinedColour_actionPerformed(ActionEvent e)\r
623     {\r
624         new UserDefinedColours(ap, getGroup());\r
625     }\r
626 \r
627     /**\r
628      * DOCUMENT ME!\r
629      *\r
630      * @param e DOCUMENT ME!\r
631      */\r
632     protected void PIDColour_actionPerformed(ActionEvent e)\r
633     {\r
634         SequenceGroup sg = getGroup();\r
635         sg.cs = new PIDColourScheme();\r
636         sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
637                 ap.av.alignment.getWidth()));\r
638         refresh();\r
639     }\r
640 \r
641     /**\r
642      * DOCUMENT ME!\r
643      *\r
644      * @param e DOCUMENT ME!\r
645      */\r
646     protected void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
647     {\r
648         SequenceGroup sg = getGroup();\r
649 \r
650         sg.cs = new Blosum62ColourScheme();\r
651 \r
652         sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
653                 ap.av.alignment.getWidth()));\r
654 \r
655         refresh();\r
656     }\r
657 \r
658     /**\r
659      * DOCUMENT ME!\r
660      *\r
661      * @param e DOCUMENT ME!\r
662      */\r
663     protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
664     {\r
665         getGroup().cs = null;\r
666         refresh();\r
667     }\r
668 \r
669     /**\r
670      * DOCUMENT ME!\r
671      *\r
672      * @param e DOCUMENT ME!\r
673      */\r
674     protected void conservationMenuItem_actionPerformed(ActionEvent e)\r
675     {\r
676         SequenceGroup sg = getGroup();\r
677 \r
678         if (conservationMenuItem.isSelected())\r
679         {\r
680             Conservation c = new Conservation("Group",\r
681                     ResidueProperties.propHash, 3, sg.sequences, 0,\r
682                     ap.av.alignment.getWidth());\r
683 \r
684             c.calculate();\r
685             c.verdict(false, ap.av.ConsPercGaps);\r
686 \r
687             ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);\r
688 \r
689             sg.cs = ccs;\r
690 \r
691             SliderPanel.setConservationSlider(ap, ccs, sg.getName());\r
692             SliderPanel.showConservationSlider();\r
693         }\r
694         else // remove ConservationColouring\r
695         {\r
696             ConservationColourScheme ccs = (ConservationColourScheme) sg.cs;\r
697             sg.cs = ccs.cs;\r
698         }\r
699 \r
700         refresh();\r
701     }\r
702 \r
703     /**\r
704      * DOCUMENT ME!\r
705      *\r
706      * @param e DOCUMENT ME!\r
707      */\r
708     protected void groupName_actionPerformed(ActionEvent e)\r
709     {\r
710         SequenceGroup sg = getGroup();\r
711         String reply = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
712                 "Enter new group name", "Edit group name",\r
713                 JOptionPane.QUESTION_MESSAGE);\r
714 \r
715         if (reply == null)\r
716         {\r
717             return;\r
718         }\r
719 \r
720         sg.setName(reply);\r
721         groupName.setText(reply);\r
722     }\r
723 \r
724     /**\r
725      * DOCUMENT ME!\r
726      *\r
727      * @param e DOCUMENT ME!\r
728      */\r
729     protected void analyze_actionPerformed(ActionEvent e)\r
730     {\r
731         CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
732         JInternalFrame frame = new JInternalFrame();\r
733         frame.setContentPane(cap);\r
734         Desktop.addInternalFrame(frame, "Analyze this - ", 400, 300);\r
735 \r
736         SequenceGroup sg = getGroup();\r
737         StringBuffer sb = new StringBuffer();\r
738 \r
739         for (int i = 0; i < sg.sequences.size(); i++)\r
740         {\r
741             Sequence tmp = (Sequence) sg.sequences.get(i);\r
742             sb.append(tmp.getSequence(sg.getStartRes(), sg.getEndRes() + 1));\r
743             sb.append("\n");\r
744         }\r
745 \r
746         sb.append("Something amazing will happen soon");\r
747         cap.setText(sb.toString());\r
748     }\r
749 \r
750     /**\r
751      * DOCUMENT ME!\r
752      *\r
753      * @return DOCUMENT ME!\r
754      */\r
755     SequenceGroup getGroup()\r
756     {\r
757         SequenceGroup sg = ap.av.getSelectionGroup();\r
758       // this method won't add a new group if it already exists\r
759         if(sg!=null)\r
760           ap.av.alignment.addGroup(sg);\r
761 \r
762         return sg;\r
763     }\r
764 \r
765     /**\r
766      * DOCUMENT ME!\r
767      *\r
768      * @param e DOCUMENT ME!\r
769      */\r
770     void sequenceName_actionPerformed(ActionEvent e)\r
771     {\r
772         String id = sequence.getName();\r
773         String s = (String) JOptionPane.showInternalInputDialog(ap,\r
774                 "Edit sequence name",\r
775                 "Edit sequence name (" + sequence.getName() + ")",\r
776                 JOptionPane.PLAIN_MESSAGE, null, null, id);\r
777 \r
778         if (s != null)\r
779         {\r
780             if (s.indexOf(" ") > -1)\r
781             {\r
782                 JOptionPane.showMessageDialog(ap,\r
783                     "Spaces have been converted to \"_\"",\r
784                     "No spaces allowed in Sequence Name",\r
785                     JOptionPane.WARNING_MESSAGE);\r
786             }\r
787 \r
788             s = s.replace(' ', '_');\r
789             sequence.setName(s);\r
790             ap.repaint();\r
791         }\r
792     }\r
793 \r
794     /**\r
795      * DOCUMENT ME!\r
796      *\r
797      * @param e DOCUMENT ME!\r
798      */\r
799     void unGroupMenuItem_actionPerformed(ActionEvent e)\r
800     {\r
801         SequenceGroup sg = ap.av.getSelectionGroup();\r
802         ap.av.alignment.deleteGroup(sg);\r
803         ap.av.setSelectionGroup(null);\r
804         refresh();\r
805     }\r
806 \r
807     /**\r
808      * DOCUMENT ME!\r
809      *\r
810      * @param e DOCUMENT ME!\r
811      */\r
812     void pdbMenuItem_actionPerformed(ActionEvent e)\r
813     {\r
814         if (sequence.getPDBId() == null)\r
815         {\r
816             return;\r
817         }\r
818 \r
819         try\r
820         {\r
821             EBIFetchClient ebi = new EBIFetchClient();\r
822             String[] result = ebi.fetchData("pdb:" + sequence.getPDBId(), null,\r
823                     null);\r
824 \r
825             PDBfile pdb = new PDBfile(result);\r
826 \r
827             rotCanvas rc = new rotCanvas(pdb, sequence, ap.av);\r
828             JInternalFrame frame = new JInternalFrame();\r
829             frame.setContentPane(rc);\r
830             Desktop.addInternalFrame(frame,\r
831                 sequence.getName() + " " + sequence.getPDBId(), 400, 400);\r
832         }\r
833         catch (Exception ex)\r
834         {\r
835             ex.printStackTrace();\r
836         }\r
837     }\r
838 \r
839     /**\r
840      * DOCUMENT ME!\r
841      *\r
842      * @param e DOCUMENT ME!\r
843      */\r
844     protected void outline_actionPerformed(ActionEvent e)\r
845     {\r
846         SequenceGroup sg = getGroup();\r
847         Color col = JColorChooser.showDialog(this, "Select Outline Colour",\r
848                 Color.BLUE);\r
849 \r
850         if (col != null)\r
851         {\r
852             sg.setOutlineColour(col);\r
853         }\r
854 \r
855         refresh();\r
856     }\r
857 \r
858     /**\r
859      * DOCUMENT ME!\r
860      *\r
861      * @param e DOCUMENT ME!\r
862      */\r
863     public void showBoxes_actionPerformed(ActionEvent e)\r
864     {\r
865         getGroup().setDisplayBoxes(showBoxes.isSelected());\r
866         refresh();\r
867     }\r
868 \r
869     /**\r
870      * DOCUMENT ME!\r
871      *\r
872      * @param e DOCUMENT ME!\r
873      */\r
874     public void showText_actionPerformed(ActionEvent e)\r
875     {\r
876         getGroup().setDisplayText(showText.isSelected());\r
877         refresh();\r
878     }\r
879 \r
880     /**\r
881      * DOCUMENT ME!\r
882      *\r
883      * @param e DOCUMENT ME!\r
884      */\r
885     public void showColourText_actionPerformed(ActionEvent e)\r
886     {\r
887         getGroup().setColourText(showColourText.isSelected());\r
888         refresh();\r
889     }\r
890 \r
891     public void showLink(String url)\r
892     {\r
893       try\r
894       {\r
895         jalview.util.BrowserLauncher.openURL(url);\r
896       }\r
897       catch (Exception ex)\r
898       {\r
899         JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
900             "Unixers: Couldn't find default web browser."\r
901            +"\nAdd the full path to your browser in Preferences.",\r
902            "Web browser not found", JOptionPane.WARNING_MESSAGE );\r
903 \r
904 \r
905         ex.printStackTrace();\r
906       }\r
907     }\r
908 }\r