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