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