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