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