Use textColourChooser
[jalview.git] / src / jalview / gui / PopupMenu.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2006 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 import jalview.datamodel.*;\r
25 import jalview.schemes.*;\r
26 import jalview.commands.ChangeCaseCommand;\r
27 \r
28 import java.awt.*;\r
29 import java.awt.event.*;\r
30 \r
31 import javax.swing.*;\r
32 \r
33 import java.util.Vector;\r
34 import jalview.io.FormatAdapter;\r
35 import javax.swing.event.ChangeListener;\r
36 import javax.swing.event.ChangeEvent;\r
37 \r
38 \r
39 /**\r
40  * DOCUMENT ME!\r
41  *\r
42  * @author $author$\r
43  * @version $Revision$\r
44  */\r
45 public class PopupMenu extends JPopupMenu\r
46 {\r
47     JMenu groupMenu = new JMenu();\r
48     JMenuItem groupName = new JMenuItem();\r
49     protected JRadioButtonMenuItem clustalColour = new JRadioButtonMenuItem();\r
50     protected JRadioButtonMenuItem zappoColour = new JRadioButtonMenuItem();\r
51     protected JRadioButtonMenuItem taylorColour = new JRadioButtonMenuItem();\r
52     protected JRadioButtonMenuItem hydrophobicityColour = new JRadioButtonMenuItem();\r
53     protected JRadioButtonMenuItem helixColour = new JRadioButtonMenuItem();\r
54     protected JRadioButtonMenuItem strandColour = new JRadioButtonMenuItem();\r
55     protected JRadioButtonMenuItem turnColour = new JRadioButtonMenuItem();\r
56     protected JRadioButtonMenuItem buriedColour = new JRadioButtonMenuItem();\r
57     protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();\r
58     protected JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem();\r
59     protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();\r
60     protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();\r
61     JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();\r
62     protected JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();\r
63     AlignmentPanel ap;\r
64     JMenu sequenceMenu = new JMenu();\r
65     JMenuItem sequenceName = new JMenuItem();\r
66     Sequence sequence;\r
67     JMenuItem unGroupMenuItem = new JMenuItem();\r
68     JMenuItem outline = new JMenuItem();\r
69     JRadioButtonMenuItem nucleotideMenuItem = new JRadioButtonMenuItem();\r
70     JMenu colourMenu = new JMenu();\r
71     JCheckBoxMenuItem showBoxes = new JCheckBoxMenuItem();\r
72     JCheckBoxMenuItem showText = new JCheckBoxMenuItem();\r
73     JCheckBoxMenuItem showColourText = new JCheckBoxMenuItem();\r
74   JMenu editMenu = new JMenu();\r
75   JMenuItem cut = new JMenuItem();\r
76   JMenuItem copy = new JMenuItem();\r
77   JMenuItem upperCase = new JMenuItem();\r
78   JMenuItem lowerCase = new JMenuItem();\r
79   JMenuItem toggle = new JMenuItem();\r
80   JMenu pdbMenu = new JMenu();\r
81   JMenuItem pdbFromFile = new JMenuItem();\r
82   JMenuItem enterPDB = new JMenuItem();\r
83   JMenuItem discoverPDB = new JMenuItem();\r
84   JMenu outputMenu = new JMenu();\r
85   JMenuItem sequenceFeature = new JMenuItem();\r
86   JMenuItem textColour = new JMenuItem();\r
87   JMenu jMenu1 = new JMenu();\r
88 \r
89   /**\r
90      * Creates a new PopupMenu object.\r
91      *\r
92      * @param ap DOCUMENT ME!\r
93      * @param seq DOCUMENT ME!\r
94      */\r
95     public PopupMenu(final AlignmentPanel ap, Sequence seq, Vector links)\r
96     {\r
97         ///////////////////////////////////////////////////////////\r
98         // If this is activated from the sequence panel, the user may want to\r
99         // edit or annotate a particular residue. Therefore display the residue menu\r
100         //\r
101         // If from the IDPanel, we must display the sequence menu\r
102         //////////////////////////////////////////////////////////\r
103         this.ap = ap;\r
104         sequence = seq;\r
105 \r
106         ButtonGroup colours = new ButtonGroup();\r
107         colours.add(noColourmenuItem);\r
108         colours.add(clustalColour);\r
109         colours.add(zappoColour);\r
110         colours.add(taylorColour);\r
111         colours.add(hydrophobicityColour);\r
112         colours.add(helixColour);\r
113         colours.add(strandColour);\r
114         colours.add(turnColour);\r
115         colours.add(buriedColour);\r
116         colours.add(abovePIDColour);\r
117         colours.add(userDefinedColour);\r
118         colours.add(PIDColour);\r
119         colours.add(BLOSUM62Colour);\r
120 \r
121         for (int i = 0; i < jalview.io.FormatAdapter.WRITEABLE_FORMATS.length; i++)\r
122         {\r
123           JMenuItem item = new JMenuItem( jalview.io.FormatAdapter.WRITEABLE_FORMATS[i] );\r
124 \r
125           item.addActionListener(new java.awt.event.ActionListener()\r
126           {\r
127             public void actionPerformed(ActionEvent e)\r
128             {\r
129               outputText_actionPerformed(e);\r
130             }\r
131           });\r
132 \r
133           outputMenu.add(item);\r
134         }\r
135 \r
136 \r
137         try\r
138         {\r
139             jbInit();\r
140         }\r
141         catch (Exception e)\r
142         {\r
143             e.printStackTrace();\r
144         }\r
145 \r
146 \r
147         if (seq != null)\r
148         {\r
149           sequenceMenu.setText(sequence.getName());\r
150 \r
151           JMenuItem menuItem;\r
152           if( seq.getDatasetSequence().getPDBId() != null)\r
153           {\r
154             java.util.Enumeration e = seq.getDatasetSequence().getPDBId().\r
155                 elements();\r
156 \r
157             while (e.hasMoreElements())\r
158             {\r
159               final PDBEntry pdb = (PDBEntry) e.nextElement();\r
160 \r
161               menuItem = new JMenuItem();\r
162               menuItem.setText("View PDB entry: " + pdb.getId());\r
163               menuItem.addActionListener(new java.awt.event.ActionListener()\r
164               {\r
165                 public void actionPerformed(ActionEvent e)\r
166                 {\r
167                   new PDBViewer(pdb, sequence, ap.seqPanel.seqCanvas);\r
168                 }\r
169               });\r
170               sequenceMenu.add(menuItem);\r
171             }\r
172           }\r
173 \r
174           menuItem = new JMenuItem("Hide Sequences");\r
175           menuItem.addActionListener(new java.awt.event.ActionListener()\r
176               {\r
177                 public void actionPerformed(ActionEvent e)\r
178                 {\r
179                   hideSequences(false);\r
180                 }\r
181               });\r
182           add(menuItem);\r
183 \r
184           if(ap.av.getSelectionGroup() !=null\r
185              && ap.av.getSelectionGroup().getSize(false)>1)\r
186           {\r
187             menuItem = new JMenuItem("Represent Group with " + seq.getName());\r
188             menuItem.addActionListener(new java.awt.event.ActionListener()\r
189             {\r
190               public void actionPerformed(ActionEvent e)\r
191               {\r
192                 hideSequences(true);\r
193               }\r
194             });\r
195             sequenceMenu.add(menuItem);\r
196           }\r
197 \r
198           if (ap.av.hasHiddenRows)\r
199           {\r
200             final int index = ap.av.alignment.findIndex(seq);\r
201 \r
202             if (ap.av.adjustForHiddenSeqs(index) -\r
203                 ap.av.adjustForHiddenSeqs(index - 1) > 1)\r
204             {\r
205               menuItem = new JMenuItem("Reveal Sequences");\r
206               menuItem.addActionListener(new ActionListener()\r
207               {\r
208                 public void actionPerformed(ActionEvent e)\r
209                 {\r
210                   ap.av.showSequence(index);\r
211                   if (ap.overviewPanel != null)\r
212                     ap.overviewPanel.updateOverviewImage();\r
213                 }\r
214               });\r
215               add(menuItem);\r
216             }\r
217 \r
218             menuItem = new JMenuItem("Reveal All");\r
219             menuItem.addActionListener(new ActionListener()\r
220                 {\r
221                   public void actionPerformed(ActionEvent e)\r
222                   {\r
223                     ap.av.showAllHiddenSeqs();\r
224                     if (ap.overviewPanel != null)\r
225                       ap.overviewPanel.updateOverviewImage();\r
226                     }\r
227                 });\r
228 \r
229             add(menuItem);\r
230           }\r
231 \r
232 \r
233         }\r
234 \r
235 \r
236 \r
237         SequenceGroup sg = ap.av.getSelectionGroup();\r
238 \r
239         if (sg != null)\r
240         {\r
241             groupName.setText(sg.getName());\r
242 \r
243             if (sg.cs instanceof ZappoColourScheme)\r
244             {\r
245                 zappoColour.setSelected(true);\r
246             }\r
247             else if (sg.cs instanceof TaylorColourScheme)\r
248             {\r
249                 taylorColour.setSelected(true);\r
250             }\r
251             else if (sg.cs instanceof PIDColourScheme)\r
252             {\r
253                 PIDColour.setSelected(true);\r
254             }\r
255             else if (sg.cs instanceof Blosum62ColourScheme)\r
256             {\r
257                 BLOSUM62Colour.setSelected(true);\r
258             }\r
259             else if (sg.cs instanceof UserColourScheme)\r
260             {\r
261                 userDefinedColour.setSelected(true);\r
262             }\r
263             else if (sg.cs instanceof HydrophobicColourScheme)\r
264             {\r
265                 hydrophobicityColour.setSelected(true);\r
266             }\r
267             else if (sg.cs instanceof HelixColourScheme)\r
268             {\r
269                 helixColour.setSelected(true);\r
270             }\r
271             else if (sg.cs instanceof StrandColourScheme)\r
272             {\r
273                 strandColour.setSelected(true);\r
274             }\r
275             else if (sg.cs instanceof TurnColourScheme)\r
276             {\r
277                 turnColour.setSelected(true);\r
278             }\r
279             else if (sg.cs instanceof BuriedColourScheme)\r
280             {\r
281                 buriedColour.setSelected(true);\r
282             }\r
283             else if (sg.cs instanceof ClustalxColourScheme)\r
284             {\r
285                 clustalColour.setSelected(true);\r
286             }\r
287             else\r
288             {\r
289                 noColourmenuItem.setSelected(true);\r
290             }\r
291 \r
292             if (sg.cs!=null && sg.cs.conservationApplied())\r
293             {\r
294                 conservationMenuItem.setSelected(true);\r
295             }\r
296 \r
297             showText.setSelected(sg.getDisplayText());\r
298             showColourText.setSelected(sg.getColourText());\r
299             showBoxes.setSelected(sg.getDisplayBoxes());\r
300         }\r
301         else\r
302         {\r
303           groupMenu.setVisible(false);\r
304           editMenu.setVisible(false);\r
305         }\r
306 \r
307         if (!ap.av.alignment.getGroups().contains(sg))\r
308         {\r
309             unGroupMenuItem.setVisible(false);\r
310         }\r
311 \r
312 \r
313         if (seq == null)\r
314         {\r
315             sequenceMenu.setVisible(false);\r
316             pdbMenu.setVisible(false);\r
317         }\r
318 \r
319         if(links != null && links.size()>0)\r
320         {\r
321           JMenu linkMenu = new JMenu("Link");\r
322           JMenuItem item;\r
323           for(int i=0; i<links.size(); i++)\r
324           {\r
325             String link = links.elementAt(i).toString();\r
326             final String label = link.substring(0, link.indexOf("|"));\r
327             item = new JMenuItem(label);\r
328             final String url;\r
329 \r
330             if (link.indexOf("$SEQUENCE_ID$") > -1)\r
331             {\r
332               String id = seq.getName();\r
333               if (id.indexOf("|") > -1)\r
334                 id = id.substring(id.lastIndexOf("|") + 1);\r
335 \r
336               url = link.substring(link.indexOf("|") + 1,\r
337                                    link.indexOf("$SEQUENCE_ID$"))\r
338                   + id +\r
339                   link.substring(link.indexOf("$SEQUENCE_ID$") + 13);\r
340             }\r
341             else\r
342               url = link.substring(link.lastIndexOf("|")+1);\r
343 \r
344 \r
345             item.addActionListener(new java.awt.event.ActionListener()\r
346             {\r
347                 public void actionPerformed(ActionEvent e)\r
348                 {\r
349                     showLink(url);\r
350                 }\r
351             });\r
352 \r
353             linkMenu.add(item);\r
354           }\r
355           if(sequence!=null)\r
356             sequenceMenu.add(linkMenu);\r
357           else\r
358             add(linkMenu);\r
359         }\r
360     }\r
361 \r
362 \r
363     /**\r
364      * DOCUMENT ME!\r
365      *\r
366      * @throws Exception DOCUMENT ME!\r
367      */\r
368     private void jbInit() throws Exception\r
369     {\r
370         groupMenu.setText("Group");\r
371         groupMenu.setText("Selection");\r
372         groupName.setText("Name");\r
373         groupName.addActionListener(new java.awt.event.ActionListener()\r
374             {\r
375                 public void actionPerformed(ActionEvent e)\r
376                 {\r
377                     groupName_actionPerformed(e);\r
378                 }\r
379             });\r
380         sequenceMenu.setText("Sequence");\r
381         sequenceName.setText("Edit Name/Description");\r
382         sequenceName.addActionListener(new java.awt.event.ActionListener()\r
383             {\r
384                 public void actionPerformed(ActionEvent e)\r
385                 {\r
386                     sequenceName_actionPerformed(e);\r
387                 }\r
388             });\r
389         PIDColour.setFocusPainted(false);\r
390         unGroupMenuItem.setText("Remove Group");\r
391         unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
392             {\r
393                 public void actionPerformed(ActionEvent e)\r
394                 {\r
395                     unGroupMenuItem_actionPerformed(e);\r
396                 }\r
397             });\r
398 \r
399         outline.setText("Border colour");\r
400         outline.addActionListener(new java.awt.event.ActionListener()\r
401             {\r
402                 public void actionPerformed(ActionEvent e)\r
403                 {\r
404                     outline_actionPerformed(e);\r
405                 }\r
406             });\r
407         nucleotideMenuItem.setText("Nucleotide");\r
408         nucleotideMenuItem.addActionListener(new ActionListener()\r
409             {\r
410                 public void actionPerformed(ActionEvent e)\r
411                 {\r
412                     nucleotideMenuItem_actionPerformed(e);\r
413                 }\r
414             });\r
415         colourMenu.setText("Group Colour");\r
416         showBoxes.setText("Boxes");\r
417         showBoxes.setState(true);\r
418         showBoxes.addActionListener(new ActionListener()\r
419             {\r
420                 public void actionPerformed(ActionEvent e)\r
421                 {\r
422                     showBoxes_actionPerformed(e);\r
423                 }\r
424             });\r
425         showText.setText("Text");\r
426         showText.setState(true);\r
427         showText.addActionListener(new ActionListener()\r
428             {\r
429                 public void actionPerformed(ActionEvent e)\r
430                 {\r
431                     showText_actionPerformed(e);\r
432                 }\r
433             });\r
434         showColourText.setText("Colour Text");\r
435         showColourText.addActionListener(new ActionListener()\r
436             {\r
437                 public void actionPerformed(ActionEvent e)\r
438                 {\r
439                     showColourText_actionPerformed(e);\r
440                 }\r
441             });\r
442     editMenu.setText("Edit");\r
443     cut.setText("Cut");\r
444     cut.addActionListener(new ActionListener()\r
445     {\r
446       public void actionPerformed(ActionEvent e)\r
447       {\r
448         cut_actionPerformed(e);\r
449       }\r
450     });\r
451     upperCase.setText("To Upper Case");\r
452     upperCase.addActionListener(new ActionListener()\r
453     {\r
454       public void actionPerformed(ActionEvent e)\r
455       {\r
456         changeCase(e);\r
457       }\r
458     });\r
459     copy.setText("Copy");\r
460     copy.addActionListener(new ActionListener()\r
461     {\r
462       public void actionPerformed(ActionEvent e)\r
463       {\r
464         copy_actionPerformed(e);\r
465       }\r
466     });\r
467     lowerCase.setText("To Lower Case");\r
468     lowerCase.addActionListener(new ActionListener()\r
469     {\r
470       public void actionPerformed(ActionEvent e)\r
471       {\r
472         changeCase(e);\r
473       }\r
474     });\r
475     toggle.setText("Toggle Case");\r
476     toggle.addActionListener(new ActionListener()\r
477     {\r
478       public void actionPerformed(ActionEvent e)\r
479       {\r
480         changeCase(e);\r
481       }\r
482     });\r
483     pdbMenu.setText("Associate Structure with Sequence");\r
484     pdbFromFile.setText("From File");\r
485     pdbFromFile.addActionListener(new ActionListener()\r
486     {\r
487       public void actionPerformed(ActionEvent e)\r
488       {\r
489         pdbFromFile_actionPerformed(e);\r
490       }\r
491     });\r
492     enterPDB.setText("Enter PDB Id");\r
493     enterPDB.addActionListener(new ActionListener()\r
494     {\r
495       public void actionPerformed(ActionEvent e)\r
496       {\r
497         enterPDB_actionPerformed(e);\r
498       }\r
499     });\r
500     discoverPDB.setText("Discover PDB ids");\r
501     discoverPDB.addActionListener(new ActionListener()\r
502     {\r
503       public void actionPerformed(ActionEvent e)\r
504       {\r
505         discoverPDB_actionPerformed(e);\r
506       }\r
507     });\r
508     outputMenu.setText("Output to Textbox...");\r
509     sequenceFeature.setText("Create Sequence Feature");\r
510     sequenceFeature.addActionListener(new ActionListener()\r
511     {\r
512       public void actionPerformed(ActionEvent e)\r
513       {\r
514         sequenceFeature_actionPerformed(e);\r
515       }\r
516     });\r
517     textColour.setText("Text Colour");\r
518     textColour.addActionListener(new ActionListener()\r
519     {\r
520       public void actionPerformed(ActionEvent e)\r
521       {\r
522         textColour_actionPerformed(e);\r
523       }\r
524     });\r
525     jMenu1.setText("Group");\r
526     add(groupMenu);\r
527 \r
528     add(sequenceMenu);\r
529     groupMenu.add(editMenu);\r
530     groupMenu.add(outputMenu);\r
531     groupMenu.add(sequenceFeature);\r
532     groupMenu.add(jMenu1);\r
533     sequenceMenu.add(sequenceName);\r
534     sequenceMenu.add(pdbMenu);\r
535     colourMenu.add(textColour);\r
536     colourMenu.add(noColourmenuItem);\r
537         colourMenu.add(clustalColour);\r
538         colourMenu.add(BLOSUM62Colour);\r
539         colourMenu.add(PIDColour);\r
540         colourMenu.add(zappoColour);\r
541         colourMenu.add(taylorColour);\r
542         colourMenu.add(hydrophobicityColour);\r
543         colourMenu.add(helixColour);\r
544         colourMenu.add(strandColour);\r
545         colourMenu.add(turnColour);\r
546         colourMenu.add(buriedColour);\r
547         colourMenu.add(nucleotideMenuItem);\r
548         colourMenu.add(userDefinedColour);\r
549 \r
550         if(jalview.gui.UserDefinedColours.getUserColourSchemes()!=null)\r
551         {\r
552           java.util.Enumeration userColours = jalview.gui.UserDefinedColours.\r
553               getUserColourSchemes().keys();\r
554 \r
555           while (userColours.hasMoreElements())\r
556           {\r
557             JMenuItem item = new JMenuItem(userColours.\r
558                 nextElement().toString());\r
559             item.addActionListener(new ActionListener()\r
560             {\r
561               public void actionPerformed(ActionEvent evt)\r
562               {\r
563                 userDefinedColour_actionPerformed(evt);\r
564               }\r
565             });\r
566             colourMenu.add(item);\r
567           }\r
568         }\r
569 \r
570 \r
571         colourMenu.addSeparator();\r
572         colourMenu.add(abovePIDColour);\r
573         colourMenu.add(conservationMenuItem);\r
574     editMenu.add(copy);\r
575     editMenu.add(cut);\r
576     editMenu.add(upperCase);\r
577     editMenu.add(lowerCase);\r
578     editMenu.add(toggle);\r
579     pdbMenu.add(pdbFromFile);\r
580     pdbMenu.add(enterPDB);\r
581     pdbMenu.add(discoverPDB);\r
582     jMenu1.add(groupName);\r
583     jMenu1.add(unGroupMenuItem);\r
584     jMenu1.add(colourMenu);\r
585     jMenu1.add(showBoxes);\r
586     jMenu1.add(showText);\r
587     jMenu1.add(showColourText);\r
588     jMenu1.add(outline);\r
589     noColourmenuItem.setText("None");\r
590         noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
591             {\r
592                 public void actionPerformed(ActionEvent e)\r
593                 {\r
594                     noColourmenuItem_actionPerformed(e);\r
595                 }\r
596             });\r
597 \r
598         clustalColour.setText("Clustalx colours");\r
599         clustalColour.addActionListener(new java.awt.event.ActionListener()\r
600             {\r
601                 public void actionPerformed(ActionEvent e)\r
602                 {\r
603                     clustalColour_actionPerformed(e);\r
604                 }\r
605             });\r
606         zappoColour.setText("Zappo");\r
607         zappoColour.addActionListener(new java.awt.event.ActionListener()\r
608             {\r
609                 public void actionPerformed(ActionEvent e)\r
610                 {\r
611                     zappoColour_actionPerformed(e);\r
612                 }\r
613             });\r
614         taylorColour.setText("Taylor");\r
615         taylorColour.addActionListener(new java.awt.event.ActionListener()\r
616             {\r
617                 public void actionPerformed(ActionEvent e)\r
618                 {\r
619                     taylorColour_actionPerformed(e);\r
620                 }\r
621             });\r
622         hydrophobicityColour.setText("Hydrophobicity");\r
623         hydrophobicityColour.addActionListener(new java.awt.event.ActionListener()\r
624             {\r
625                 public void actionPerformed(ActionEvent e)\r
626                 {\r
627                     hydrophobicityColour_actionPerformed(e);\r
628                 }\r
629             });\r
630         helixColour.setText("Helix propensity");\r
631         helixColour.addActionListener(new java.awt.event.ActionListener()\r
632             {\r
633                 public void actionPerformed(ActionEvent e)\r
634                 {\r
635                     helixColour_actionPerformed(e);\r
636                 }\r
637             });\r
638         strandColour.setText("Strand propensity");\r
639         strandColour.addActionListener(new java.awt.event.ActionListener()\r
640             {\r
641                 public void actionPerformed(ActionEvent e)\r
642                 {\r
643                     strandColour_actionPerformed(e);\r
644                 }\r
645             });\r
646         turnColour.setText("Turn propensity");\r
647         turnColour.addActionListener(new java.awt.event.ActionListener()\r
648             {\r
649                 public void actionPerformed(ActionEvent e)\r
650                 {\r
651                     turnColour_actionPerformed(e);\r
652                 }\r
653             });\r
654         buriedColour.setText("Buried Index");\r
655         buriedColour.addActionListener(new java.awt.event.ActionListener()\r
656             {\r
657                 public void actionPerformed(ActionEvent e)\r
658                 {\r
659                     buriedColour_actionPerformed(e);\r
660                 }\r
661             });\r
662         abovePIDColour.setText("Above % Identity");\r
663         abovePIDColour.addActionListener(new java.awt.event.ActionListener()\r
664             {\r
665                 public void actionPerformed(ActionEvent e)\r
666                 {\r
667                     abovePIDColour_actionPerformed(e);\r
668                 }\r
669             });\r
670         userDefinedColour.setText("User Defined...");\r
671         userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
672             {\r
673                 public void actionPerformed(ActionEvent e)\r
674                 {\r
675                     userDefinedColour_actionPerformed(e);\r
676                 }\r
677             });\r
678         PIDColour.setText("Percentage Identity");\r
679         PIDColour.addActionListener(new java.awt.event.ActionListener()\r
680             {\r
681                 public void actionPerformed(ActionEvent e)\r
682                 {\r
683                     PIDColour_actionPerformed(e);\r
684                 }\r
685             });\r
686         BLOSUM62Colour.setText("BLOSUM62");\r
687         BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
688             {\r
689                 public void actionPerformed(ActionEvent e)\r
690                 {\r
691                     BLOSUM62Colour_actionPerformed(e);\r
692                 }\r
693             });\r
694         conservationMenuItem.setText("Conservation");\r
695         conservationMenuItem.addActionListener(new java.awt.event.ActionListener()\r
696             {\r
697                 public void actionPerformed(ActionEvent e)\r
698                 {\r
699                     conservationMenuItem_actionPerformed(e);\r
700                 }\r
701             });\r
702     }\r
703 \r
704     /**\r
705      * DOCUMENT ME!\r
706      */\r
707     void refresh()\r
708     {\r
709         if (ap.overviewPanel != null)\r
710           ap.overviewPanel.updateOverviewImage();\r
711 \r
712         PaintRefresher.Refresh(this, ap.av.getSequenceSetId());\r
713     }\r
714 \r
715     /**\r
716      * DOCUMENT ME!\r
717      *\r
718      * @param e DOCUMENT ME!\r
719      */\r
720     protected void clustalColour_actionPerformed(ActionEvent e)\r
721     {\r
722         SequenceGroup sg = getGroup();\r
723         sg.cs = new ClustalxColourScheme(sg.getSequences(true),\r
724                 ap.av.alignment.getWidth());\r
725         refresh();\r
726     }\r
727 \r
728     /**\r
729      * DOCUMENT ME!\r
730      *\r
731      * @param e DOCUMENT ME!\r
732      */\r
733     protected void zappoColour_actionPerformed(ActionEvent e)\r
734     {\r
735         getGroup().cs = new ZappoColourScheme();\r
736         refresh();\r
737     }\r
738 \r
739     /**\r
740      * DOCUMENT ME!\r
741      *\r
742      * @param e DOCUMENT ME!\r
743      */\r
744     protected void taylorColour_actionPerformed(ActionEvent e)\r
745     {\r
746         getGroup().cs = new TaylorColourScheme();\r
747         refresh();\r
748     }\r
749 \r
750     /**\r
751      * DOCUMENT ME!\r
752      *\r
753      * @param e DOCUMENT ME!\r
754      */\r
755     protected void hydrophobicityColour_actionPerformed(ActionEvent e)\r
756     {\r
757         getGroup().cs = new HydrophobicColourScheme();\r
758         refresh();\r
759     }\r
760 \r
761     /**\r
762      * DOCUMENT ME!\r
763      *\r
764      * @param e DOCUMENT ME!\r
765      */\r
766     protected void helixColour_actionPerformed(ActionEvent e)\r
767     {\r
768         getGroup().cs = new HelixColourScheme();\r
769         refresh();\r
770     }\r
771 \r
772     /**\r
773      * DOCUMENT ME!\r
774      *\r
775      * @param e DOCUMENT ME!\r
776      */\r
777     protected void strandColour_actionPerformed(ActionEvent e)\r
778     {\r
779         getGroup().cs = new StrandColourScheme();\r
780         refresh();\r
781     }\r
782 \r
783     /**\r
784      * DOCUMENT ME!\r
785      *\r
786      * @param e DOCUMENT ME!\r
787      */\r
788     protected void turnColour_actionPerformed(ActionEvent e)\r
789     {\r
790         getGroup().cs = new TurnColourScheme();\r
791         refresh();\r
792     }\r
793 \r
794     /**\r
795      * DOCUMENT ME!\r
796      *\r
797      * @param e DOCUMENT ME!\r
798      */\r
799     protected void buriedColour_actionPerformed(ActionEvent e)\r
800     {\r
801         getGroup().cs = new BuriedColourScheme();\r
802         refresh();\r
803     }\r
804 \r
805     /**\r
806      * DOCUMENT ME!\r
807      *\r
808      * @param e DOCUMENT ME!\r
809      */\r
810     public void nucleotideMenuItem_actionPerformed(ActionEvent e)\r
811     {\r
812         getGroup().cs = new NucleotideColourScheme();\r
813         refresh();\r
814     }\r
815 \r
816     /**\r
817      * DOCUMENT ME!\r
818      *\r
819      * @param e DOCUMENT ME!\r
820      */\r
821     protected void abovePIDColour_actionPerformed(ActionEvent e)\r
822     {\r
823         SequenceGroup sg = getGroup();\r
824         if(sg.cs==null)\r
825           return;\r
826 \r
827         if (abovePIDColour.isSelected())\r
828         {\r
829           sg.cs.setConsensus(AAFrequency.calculate(\r
830               sg.getSequences(true), sg.getStartRes(),\r
831               sg.getEndRes() + 1));\r
832 \r
833             int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs,\r
834                     getGroup().getName());\r
835 \r
836            sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());\r
837 \r
838             SliderPanel.showPIDSlider();\r
839         }\r
840         else // remove PIDColouring\r
841         {\r
842             sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
843         }\r
844 \r
845         refresh();\r
846     }\r
847 \r
848     /**\r
849      * DOCUMENT ME!\r
850      *\r
851      * @param e DOCUMENT ME!\r
852      */\r
853     protected void userDefinedColour_actionPerformed(ActionEvent e)\r
854     {\r
855        SequenceGroup sg = getGroup();\r
856 \r
857        if (e.getActionCommand().equals("User Defined..."))\r
858          new UserDefinedColours(ap, sg);\r
859        else\r
860        {\r
861          UserColourScheme udc = (UserColourScheme) UserDefinedColours.\r
862              getUserColourSchemes().get(e.getActionCommand());\r
863 \r
864          sg.cs = udc;\r
865        }\r
866        refresh();\r
867      }\r
868     /**\r
869      * DOCUMENT ME!\r
870      *\r
871      * @param e DOCUMENT ME!\r
872      */\r
873     protected void PIDColour_actionPerformed(ActionEvent e)\r
874     {\r
875         SequenceGroup sg = getGroup();\r
876         sg.cs = new PIDColourScheme();\r
877         sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(true),\r
878                                                  sg.getStartRes(),\r
879                                                  sg.getEndRes() + 1));\r
880         refresh();\r
881     }\r
882 \r
883     /**\r
884      * DOCUMENT ME!\r
885      *\r
886      * @param e DOCUMENT ME!\r
887      */\r
888     protected void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
889     {\r
890         SequenceGroup sg = getGroup();\r
891 \r
892         sg.cs = new Blosum62ColourScheme();\r
893 \r
894         sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(true),\r
895                                                  sg.getStartRes(),\r
896                                                  sg.getEndRes() + 1));\r
897 \r
898         refresh();\r
899     }\r
900 \r
901     /**\r
902      * DOCUMENT ME!\r
903      *\r
904      * @param e DOCUMENT ME!\r
905      */\r
906     protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
907     {\r
908         getGroup().cs = null;\r
909         refresh();\r
910     }\r
911 \r
912     /**\r
913      * DOCUMENT ME!\r
914      *\r
915      * @param e DOCUMENT ME!\r
916      */\r
917     protected void conservationMenuItem_actionPerformed(ActionEvent e)\r
918     {\r
919         SequenceGroup sg = getGroup();\r
920         if(sg.cs==null)\r
921           return;\r
922 \r
923         if (conservationMenuItem.isSelected())\r
924         {\r
925             Conservation c = new Conservation("Group",\r
926                     ResidueProperties.propHash, 3,\r
927                     sg.getSequences(true),\r
928                     sg.getStartRes(),\r
929                     sg.getEndRes() + 1);\r
930 \r
931             c.calculate();\r
932             c.verdict(false, ap.av.ConsPercGaps);\r
933 \r
934             sg.cs.setConservation(c);\r
935 \r
936             SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());\r
937             SliderPanel.showConservationSlider();\r
938         }\r
939         else // remove ConservationColouring\r
940         {\r
941             sg.cs.setConservation(null);\r
942         }\r
943 \r
944         refresh();\r
945     }\r
946 \r
947     /**\r
948      * DOCUMENT ME!\r
949      *\r
950      * @param e DOCUMENT ME!\r
951      */\r
952     protected void groupName_actionPerformed(ActionEvent e)\r
953     {\r
954         SequenceGroup sg = getGroup();\r
955         String reply = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
956                 "Enter new group name", "Edit group name",\r
957                 JOptionPane.QUESTION_MESSAGE);\r
958 \r
959         if (reply == null)\r
960         {\r
961             return;\r
962         }\r
963 \r
964         sg.setName(reply);\r
965         groupName.setText(reply);\r
966     }\r
967 \r
968 \r
969     /**\r
970      * DOCUMENT ME!\r
971      *\r
972      * @return DOCUMENT ME!\r
973      */\r
974     SequenceGroup getGroup()\r
975     {\r
976         SequenceGroup sg = ap.av.getSelectionGroup();\r
977       // this method won't add a new group if it already exists\r
978         if(sg!=null)\r
979           ap.av.alignment.addGroup(sg);\r
980 \r
981         return sg;\r
982     }\r
983 \r
984     /**\r
985      * DOCUMENT ME!\r
986      *\r
987      * @param e DOCUMENT ME!\r
988      */\r
989     void sequenceName_actionPerformed(ActionEvent e)\r
990     {\r
991       JLabel idlabel = new JLabel(  "       Sequence Name ");\r
992       JLabel desclabel = new JLabel("Sequence Description ");\r
993       idlabel.setFont(new Font("Courier", Font.PLAIN, 12));\r
994       desclabel.setFont(new Font("Courier", Font.PLAIN, 12));\r
995       JTextField id = new JTextField(sequence.getName(), 40);\r
996       JTextField description = new JTextField(sequence.getDescription(), 40);\r
997       JPanel panel = new JPanel(new BorderLayout());\r
998       JPanel panel2 = new JPanel(new BorderLayout());\r
999       panel2.add(idlabel, BorderLayout.WEST);\r
1000       panel2.add(id, BorderLayout.CENTER);\r
1001       panel.add(panel2, BorderLayout.NORTH);\r
1002       panel2 = new JPanel(new BorderLayout());\r
1003       panel2.add(desclabel, BorderLayout.WEST);\r
1004       panel2.add(description, BorderLayout.CENTER);\r
1005       panel.add(panel2, BorderLayout.SOUTH);\r
1006 \r
1007 \r
1008        int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,\r
1009           panel, "Edit Sequence Name/Description",\r
1010           JOptionPane.OK_CANCEL_OPTION );\r
1011 \r
1012 \r
1013         if (reply != JOptionPane.OK_OPTION )\r
1014         {\r
1015             return;\r
1016         }\r
1017 \r
1018         String s = id.getText();\r
1019 \r
1020         if (s != null)\r
1021         {\r
1022             if (s.indexOf(" ") > -1)\r
1023             {\r
1024                 JOptionPane.showMessageDialog(ap,\r
1025                     "Spaces have been converted to \"_\"",\r
1026                     "No spaces allowed in Sequence Name",\r
1027                     JOptionPane.WARNING_MESSAGE);\r
1028             }\r
1029 \r
1030             s = s.replace(' ', '_');\r
1031             sequence.setName(s);\r
1032             ap.repaint();\r
1033         }\r
1034 \r
1035         sequence.setDescription(description.getText());\r
1036 \r
1037         ap.av.firePropertyChange("alignment", null,\r
1038                                   ap.av.getAlignment().getSequences());\r
1039 \r
1040     }\r
1041 \r
1042     /**\r
1043      * DOCUMENT ME!\r
1044      *\r
1045      * @param e DOCUMENT ME!\r
1046      */\r
1047     void unGroupMenuItem_actionPerformed(ActionEvent e)\r
1048     {\r
1049         SequenceGroup sg = ap.av.getSelectionGroup();\r
1050         ap.av.alignment.deleteGroup(sg);\r
1051         ap.av.setSelectionGroup(null);\r
1052         refresh();\r
1053     }\r
1054 \r
1055 \r
1056     /**\r
1057      * DOCUMENT ME!\r
1058      *\r
1059      * @param e DOCUMENT ME!\r
1060      */\r
1061     protected void outline_actionPerformed(ActionEvent e)\r
1062     {\r
1063         SequenceGroup sg = getGroup();\r
1064         Color col = JColorChooser.showDialog(this, "Select Outline Colour",\r
1065                 Color.BLUE);\r
1066 \r
1067         if (col != null)\r
1068         {\r
1069             sg.setOutlineColour(col);\r
1070         }\r
1071 \r
1072         refresh();\r
1073     }\r
1074 \r
1075     /**\r
1076      * DOCUMENT ME!\r
1077      *\r
1078      * @param e DOCUMENT ME!\r
1079      */\r
1080     public void showBoxes_actionPerformed(ActionEvent e)\r
1081     {\r
1082         getGroup().setDisplayBoxes(showBoxes.isSelected());\r
1083         refresh();\r
1084     }\r
1085 \r
1086     /**\r
1087      * DOCUMENT ME!\r
1088      *\r
1089      * @param e DOCUMENT ME!\r
1090      */\r
1091     public void showText_actionPerformed(ActionEvent e)\r
1092     {\r
1093         getGroup().setDisplayText(showText.isSelected());\r
1094         refresh();\r
1095     }\r
1096 \r
1097     /**\r
1098      * DOCUMENT ME!\r
1099      *\r
1100      * @param e DOCUMENT ME!\r
1101      */\r
1102     public void showColourText_actionPerformed(ActionEvent e)\r
1103     {\r
1104         getGroup().setColourText(showColourText.isSelected());\r
1105         refresh();\r
1106     }\r
1107 \r
1108     public void showLink(String url)\r
1109     {\r
1110       try\r
1111       {\r
1112         jalview.util.BrowserLauncher.openURL(url);\r
1113       }\r
1114       catch (Exception ex)\r
1115       {\r
1116         JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
1117             "Unixers: Couldn't find default web browser."\r
1118            +"\nAdd the full path to your browser in Preferences.",\r
1119            "Web browser not found", JOptionPane.WARNING_MESSAGE );\r
1120 \r
1121 \r
1122         ex.printStackTrace();\r
1123       }\r
1124     }\r
1125 \r
1126     void hideSequences(boolean representGroup)\r
1127     {\r
1128       SequenceGroup sg = ap.av.getSelectionGroup();\r
1129       if(sg==null || sg.getSize(false)<1)\r
1130       {\r
1131         ap.av.hideSequence(new SequenceI[]{sequence});\r
1132         return;\r
1133       }\r
1134 \r
1135       int gsize = sg.getSize(false);\r
1136       SequenceI [] hseqs;\r
1137 \r
1138       hseqs = new SequenceI[ representGroup ? gsize-1 : gsize ];\r
1139 \r
1140         int index = 0;\r
1141         for(int i=0; i<gsize; i++)\r
1142         {\r
1143           if(representGroup && sg.getSequenceAt(i)!=sequence)\r
1144           {\r
1145             sequence.addHiddenSequence(sg.getSequenceAt(i));\r
1146             hseqs[index++] = sg.getSequenceAt(i);\r
1147           }\r
1148           else if(!representGroup)\r
1149           {\r
1150             hseqs[index++] = sg.getSequenceAt(i);\r
1151           }\r
1152         }\r
1153 \r
1154         ap.av.hideSequence(hseqs);\r
1155 \r
1156         ap.av.setSelectionGroup(null);\r
1157     }\r
1158 \r
1159   public void copy_actionPerformed(ActionEvent e)\r
1160   {\r
1161     ap.alignFrame.copy_actionPerformed(null);\r
1162   }\r
1163 \r
1164   public void cut_actionPerformed(ActionEvent e)\r
1165   {\r
1166     ap.alignFrame.cut_actionPerformed(null);\r
1167   }\r
1168 \r
1169   void changeCase(ActionEvent e)\r
1170   {\r
1171     Object source = e.getSource();\r
1172     SequenceGroup sg = ap.av.getSelectionGroup();\r
1173     Vector regions = new Vector();\r
1174     if (sg != null)\r
1175     {\r
1176       int start = sg.getStartRes();\r
1177       int end = sg.getEndRes() + 1;\r
1178 \r
1179       do\r
1180       {\r
1181         if (ap.av.hasHiddenColumns)\r
1182         {\r
1183           if(start==0)\r
1184             start = ap.av.colSel.adjustForHiddenColumns(start);\r
1185 \r
1186           end = ap.av.colSel.getHiddenBoundaryRight(start);\r
1187           if (start == end)\r
1188             end = sg.getEndRes() + 1;\r
1189           if (end > sg.getEndRes())\r
1190             end = sg.getEndRes() + 1;\r
1191         }\r
1192 \r
1193         regions.addElement(new int[]\r
1194                            {start, end});\r
1195 \r
1196         if (ap.av.hasHiddenColumns)\r
1197         {\r
1198           start = ap.av.colSel.adjustForHiddenColumns(end);\r
1199           start = ap.av.colSel.getHiddenBoundaryLeft(start) + 1;\r
1200         }\r
1201       }\r
1202       while (end < sg.getEndRes());\r
1203 \r
1204       int[][] startEnd = new int[regions.size()][2];\r
1205       for (int i = 0; i < regions.size(); i++)\r
1206       {\r
1207         startEnd[i] = (int[]) regions.elementAt(i);\r
1208       }\r
1209 \r
1210 \r
1211       String description;\r
1212       int caseChange;\r
1213 \r
1214       if(source==toggle)\r
1215       {\r
1216         description = "Toggle Case";\r
1217         caseChange = ChangeCaseCommand.TOGGLE_CASE;\r
1218       }\r
1219       else if(source==upperCase)\r
1220       {\r
1221         description = "To Upper Case";\r
1222         caseChange = ChangeCaseCommand.TO_UPPER;\r
1223       }\r
1224       else\r
1225       {\r
1226         description = "To Lower Case";\r
1227         caseChange = ChangeCaseCommand.TO_LOWER;\r
1228       }\r
1229 \r
1230       ChangeCaseCommand caseCommand = new ChangeCaseCommand(\r
1231           description, sg.getSequencesAsArray(true), startEnd, caseChange\r
1232           );\r
1233 \r
1234       ap.alignFrame.addHistoryItem(caseCommand);\r
1235 \r
1236 \r
1237       ap.av.firePropertyChange("alignment", null,\r
1238                                 ap.av.getAlignment().getSequences());\r
1239 \r
1240     }\r
1241   }\r
1242 \r
1243   public void outputText_actionPerformed(ActionEvent e)\r
1244   {\r
1245     CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
1246     cap.setForInput(null);\r
1247     Desktop.addInternalFrame(cap,\r
1248                              "Alignment output - " + e.getActionCommand(), 600,\r
1249                              500);\r
1250 \r
1251     String [] omitHidden = null;\r
1252 \r
1253     if(ap.av.hasHiddenColumns)\r
1254     {\r
1255       System.out.println("PROMPT USER HERE");\r
1256       omitHidden = ap.av.getViewAsString(true);\r
1257     }\r
1258 \r
1259     cap.setText(new FormatAdapter().formatSequences(\r
1260         e.getActionCommand(),\r
1261         ap.av.getSelectionAsNewSequence(),\r
1262         omitHidden));\r
1263   }\r
1264 \r
1265 \r
1266   public void pdbFromFile_actionPerformed(ActionEvent e)\r
1267   {\r
1268      jalview.io.JalviewFileChooser chooser\r
1269          = new jalview.io.JalviewFileChooser(jalview.bin.Cache.\r
1270          getProperty(\r
1271              "LAST_DIRECTORY"));\r
1272      chooser.setFileView(new jalview.io.JalviewFileView());\r
1273      chooser.setDialogTitle("Select a PDB file");\r
1274      chooser.setToolTipText("Load a PDB file");\r
1275 \r
1276      int value = chooser.showOpenDialog(null);\r
1277 \r
1278      if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
1279      {\r
1280        PDBEntry entry = new PDBEntry();\r
1281        String choice = chooser.getSelectedFile().getPath();\r
1282        jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
1283        try\r
1284        {\r
1285          MCview.PDBfile pdbfile = new MCview.PDBfile(choice,\r
1286                                        jalview.io.AppletFormatAdapter.FILE);\r
1287 \r
1288          if (pdbfile.id == null)\r
1289          {\r
1290            String reply = JOptionPane.showInternalInputDialog(\r
1291                Desktop.desktop,\r
1292                "Couldn't find a PDB id in the file supplied."\r
1293                + "Please enter an Id to identify this structure.",\r
1294                "No PDB Id in File", JOptionPane.QUESTION_MESSAGE);\r
1295            if (reply == null)\r
1296              return;\r
1297 \r
1298            entry.setId(reply);\r
1299          }\r
1300          else\r
1301            entry.setId(pdbfile.id);\r
1302        }\r
1303        catch (java.io.IOException ex)\r
1304        {\r
1305          ex.printStackTrace();\r
1306        }\r
1307 \r
1308        entry.setFile(choice);\r
1309        sequence.getDatasetSequence().addPDBId(entry);\r
1310      }\r
1311 \r
1312   }\r
1313 \r
1314   public void enterPDB_actionPerformed(ActionEvent e)\r
1315   {\r
1316     String id = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
1317         "Enter PDB Id", "Enter PDB Id", JOptionPane.QUESTION_MESSAGE);\r
1318 \r
1319     if (id != null && id.length() > 0)\r
1320     {\r
1321       PDBEntry entry = new PDBEntry();\r
1322       entry.setId(id);\r
1323       sequence.getDatasetSequence()\r
1324           .addPDBId(entry);\r
1325     }\r
1326   }\r
1327 \r
1328   public void discoverPDB_actionPerformed(ActionEvent e)\r
1329   {\r
1330     new jalview.io.DBRefFetcher(\r
1331              ap.av.getAlignment(), ap.alignFrame).fetchDBRefs(false);\r
1332   }\r
1333 \r
1334   public void sequenceFeature_actionPerformed(ActionEvent e)\r
1335   {\r
1336     SequenceGroup sg = ap.av.getSelectionGroup();\r
1337     if(sg==null)\r
1338       return;\r
1339 \r
1340     int gSize= sg.getSize(false);\r
1341     SequenceI [] seqs = new SequenceI[gSize];\r
1342     SequenceFeature [] features = new SequenceFeature[gSize];\r
1343 \r
1344     for (int i = 0; i < gSize; i++)\r
1345     {\r
1346       seqs[i] = sg.getSequenceAt(i).getDatasetSequence();\r
1347       int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());\r
1348       int end = sg.findEndRes(sg.getSequenceAt(i));\r
1349       features[i] = new SequenceFeature(null,null, null,start,end,"Jalview");\r
1350     }\r
1351 \r
1352     if (ap.seqPanel.seqCanvas.getFeatureRenderer()\r
1353         .createNewFeatures(seqs, features))\r
1354     {\r
1355       ap.alignFrame.showSeqFeatures.setSelected(true);\r
1356       ap.av.setShowSequenceFeatures(true);\r
1357       ap.highlightSearchResults(null);\r
1358     }\r
1359   }\r
1360 \r
1361   public void textColour_actionPerformed(ActionEvent e)\r
1362   {\r
1363     SequenceGroup sg = getGroup();\r
1364     if (sg != null)\r
1365       new TextColourChooser().chooseColour(ap, sg);\r
1366   }\r
1367 }\r