e2865a89e124b7caf20c6d0ba874bddf743ec05d
[jalview.git] / src / jalview / gui / PopupMenu.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
3  * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
4  * 
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  * 
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  * 
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
18  */
19 package jalview.gui;
20
21 import java.util.*;
22
23 import java.awt.*;
24 import java.awt.event.*;
25 import javax.swing.*;
26
27 import MCview.*;
28 import jalview.analysis.*;
29 import jalview.commands.*;
30 import jalview.datamodel.*;
31 import jalview.io.*;
32 import jalview.schemes.*;
33 import jalview.util.UrlLink;
34
35 /**
36  * DOCUMENT ME!
37  * 
38  * @author $author$
39  * @version $Revision$
40  */
41 public class PopupMenu extends JPopupMenu
42 {
43   JMenu groupMenu = new JMenu();
44
45   JMenuItem groupName = new JMenuItem();
46
47   protected JRadioButtonMenuItem clustalColour = new JRadioButtonMenuItem();
48
49   protected JRadioButtonMenuItem zappoColour = new JRadioButtonMenuItem();
50
51   protected JRadioButtonMenuItem taylorColour = new JRadioButtonMenuItem();
52
53   protected JRadioButtonMenuItem hydrophobicityColour = new JRadioButtonMenuItem();
54
55   protected JRadioButtonMenuItem helixColour = new JRadioButtonMenuItem();
56
57   protected JRadioButtonMenuItem strandColour = new JRadioButtonMenuItem();
58
59   protected JRadioButtonMenuItem turnColour = new JRadioButtonMenuItem();
60
61   protected JRadioButtonMenuItem buriedColour = new JRadioButtonMenuItem();
62
63   protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();
64
65   protected JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem();
66
67   protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();
68
69   protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();
70
71   JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();
72
73   protected JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();
74
75   AlignmentPanel ap;
76
77   JMenu sequenceMenu = new JMenu();
78
79   JMenuItem sequenceName = new JMenuItem();
80
81   Sequence sequence;
82
83   JMenuItem unGroupMenuItem = new JMenuItem();
84
85   JMenuItem outline = new JMenuItem();
86
87   JRadioButtonMenuItem nucleotideMenuItem = new JRadioButtonMenuItem();
88
89   JMenu colourMenu = new JMenu();
90
91   JCheckBoxMenuItem showBoxes = new JCheckBoxMenuItem();
92
93   JCheckBoxMenuItem showText = new JCheckBoxMenuItem();
94
95   JCheckBoxMenuItem showColourText = new JCheckBoxMenuItem();
96
97   JCheckBoxMenuItem displayNonconserved = new JCheckBoxMenuItem();
98
99   JMenu editMenu = new JMenu();
100
101   JMenuItem cut = new JMenuItem();
102
103   JMenuItem copy = new JMenuItem();
104
105   JMenuItem upperCase = new JMenuItem();
106
107   JMenuItem lowerCase = new JMenuItem();
108
109   JMenuItem toggle = new JMenuItem();
110
111   JMenu pdbMenu = new JMenu();
112
113   JMenuItem pdbFromFile = new JMenuItem();
114
115   JMenuItem enterPDB = new JMenuItem();
116
117   JMenuItem discoverPDB = new JMenuItem();
118
119   JMenu outputMenu = new JMenu();
120
121   JMenuItem sequenceFeature = new JMenuItem();
122
123   JMenuItem textColour = new JMenuItem();
124
125   JMenu jMenu1 = new JMenu();
126
127   JMenu structureMenu = new JMenu();
128
129   JMenu viewStructureMenu = new JMenu();
130
131   // JMenu colStructureMenu = new JMenu();
132   JMenuItem editSequence = new JMenuItem();
133
134   // JMenuItem annotationMenuItem = new JMenuItem();
135
136   /**
137    * Creates a new PopupMenu object.
138    * 
139    * @param ap
140    *                DOCUMENT ME!
141    * @param seq
142    *                DOCUMENT ME!
143    */
144   public PopupMenu(final AlignmentPanel ap, Sequence seq, Vector links)
145   {
146     // /////////////////////////////////////////////////////////
147     // If this is activated from the sequence panel, the user may want to
148     // edit or annotate a particular residue. Therefore display the residue menu
149     //
150     // If from the IDPanel, we must display the sequence menu
151     // ////////////////////////////////////////////////////////
152     this.ap = ap;
153     sequence = seq;
154
155     ButtonGroup colours = new ButtonGroup();
156     colours.add(noColourmenuItem);
157     colours.add(clustalColour);
158     colours.add(zappoColour);
159     colours.add(taylorColour);
160     colours.add(hydrophobicityColour);
161     colours.add(helixColour);
162     colours.add(strandColour);
163     colours.add(turnColour);
164     colours.add(buriedColour);
165     colours.add(abovePIDColour);
166     colours.add(userDefinedColour);
167     colours.add(PIDColour);
168     colours.add(BLOSUM62Colour);
169
170     for (int i = 0; i < jalview.io.FormatAdapter.WRITEABLE_FORMATS.length; i++)
171     {
172       JMenuItem item = new JMenuItem(
173               jalview.io.FormatAdapter.WRITEABLE_FORMATS[i]);
174
175       item.addActionListener(new java.awt.event.ActionListener()
176       {
177         public void actionPerformed(ActionEvent e)
178         {
179           outputText_actionPerformed(e);
180         }
181       });
182
183       outputMenu.add(item);
184     }
185
186     try
187     {
188       jbInit();
189     } catch (Exception e)
190     {
191       e.printStackTrace();
192     }
193
194     if (seq != null)
195     {
196       sequenceMenu.setText(sequence.getName());
197
198       JMenuItem menuItem;
199       if (seq.getDatasetSequence().getPDBId() != null
200               && seq.getDatasetSequence().getPDBId().size() > 0)
201       {
202         java.util.Enumeration e = seq.getDatasetSequence().getPDBId()
203                 .elements();
204
205         while (e.hasMoreElements())
206         {
207           final PDBEntry pdb = (PDBEntry) e.nextElement();
208
209           menuItem = new JMenuItem();
210           menuItem.setText(pdb.getId());
211           menuItem.addActionListener(new java.awt.event.ActionListener()
212           {
213             public void actionPerformed(ActionEvent e)
214             {
215               Vector seqs = new Vector();
216               for (int i = 0; i < ap.av.alignment.getHeight(); i++)
217               {
218                 Vector pdbs = ap.av.alignment.getSequenceAt(i)
219                         .getDatasetSequence().getPDBId();
220                 if (pdbs == null)
221                   continue;
222
223                 for (int p = 0; p < pdbs.size(); p++)
224                 {
225                   PDBEntry p1 = (PDBEntry) pdbs.elementAt(p);
226                   if (p1.getId().equals(pdb.getId()))
227                   {
228                     if (!seqs.contains(ap.av.alignment.getSequenceAt(i)))
229                       seqs.addElement(ap.av.alignment.getSequenceAt(i));
230
231                     continue;
232                   }
233                 }
234               }
235
236               SequenceI[] seqs2 = new SequenceI[seqs.size()];
237               seqs.toArray(seqs2);
238
239               new AppJmol(pdb, seqs2, null, ap);
240               // new PDBViewer(pdb, seqs2, null, ap, AppletFormatAdapter.FILE);
241             }
242           });
243           viewStructureMenu.add(menuItem);
244
245           /*
246            * menuItem = new JMenuItem(); menuItem.setText(pdb.getId());
247            * menuItem.addActionListener(new java.awt.event.ActionListener() {
248            * public void actionPerformed(ActionEvent e) {
249            * colourByStructure(pdb.getId()); } });
250            * colStructureMenu.add(menuItem);
251            */
252         }
253       }
254       else
255       {
256         structureMenu.remove(viewStructureMenu);
257         // structureMenu.remove(colStructureMenu);
258       }
259
260       menuItem = new JMenuItem("Hide Sequences");
261       menuItem.addActionListener(new java.awt.event.ActionListener()
262       {
263         public void actionPerformed(ActionEvent e)
264         {
265           hideSequences(false);
266         }
267       });
268       add(menuItem);
269
270       if (ap.av.getSelectionGroup() != null
271               && ap.av.getSelectionGroup().getSize() > 1)
272       {
273         menuItem = new JMenuItem("Represent Group with " + seq.getName());
274         menuItem.addActionListener(new java.awt.event.ActionListener()
275         {
276           public void actionPerformed(ActionEvent e)
277           {
278             hideSequences(true);
279           }
280         });
281         sequenceMenu.add(menuItem);
282       }
283
284       if (ap.av.hasHiddenRows)
285       {
286         final int index = ap.av.alignment.findIndex(seq);
287
288         if (ap.av.adjustForHiddenSeqs(index)
289                 - ap.av.adjustForHiddenSeqs(index - 1) > 1)
290         {
291           menuItem = new JMenuItem("Reveal Sequences");
292           menuItem.addActionListener(new ActionListener()
293           {
294             public void actionPerformed(ActionEvent e)
295             {
296               ap.av.showSequence(index);
297               if (ap.overviewPanel != null)
298               {
299                 ap.overviewPanel.updateOverviewImage();
300               }
301             }
302           });
303           add(menuItem);
304         }
305
306         menuItem = new JMenuItem("Reveal All");
307         menuItem.addActionListener(new ActionListener()
308         {
309           public void actionPerformed(ActionEvent e)
310           {
311             ap.av.showAllHiddenSeqs();
312             if (ap.overviewPanel != null)
313             {
314               ap.overviewPanel.updateOverviewImage();
315             }
316           }
317         });
318
319         add(menuItem);
320       }
321
322     }
323
324     SequenceGroup sg = ap.av.getSelectionGroup();
325
326     if (sg != null)
327     {
328       groupName.setText(sg.getName());
329
330       if (sg.cs instanceof ZappoColourScheme)
331       {
332         zappoColour.setSelected(true);
333       }
334       else if (sg.cs instanceof TaylorColourScheme)
335       {
336         taylorColour.setSelected(true);
337       }
338       else if (sg.cs instanceof PIDColourScheme)
339       {
340         PIDColour.setSelected(true);
341       }
342       else if (sg.cs instanceof Blosum62ColourScheme)
343       {
344         BLOSUM62Colour.setSelected(true);
345       }
346       else if (sg.cs instanceof UserColourScheme)
347       {
348         userDefinedColour.setSelected(true);
349       }
350       else if (sg.cs instanceof HydrophobicColourScheme)
351       {
352         hydrophobicityColour.setSelected(true);
353       }
354       else if (sg.cs instanceof HelixColourScheme)
355       {
356         helixColour.setSelected(true);
357       }
358       else if (sg.cs instanceof StrandColourScheme)
359       {
360         strandColour.setSelected(true);
361       }
362       else if (sg.cs instanceof TurnColourScheme)
363       {
364         turnColour.setSelected(true);
365       }
366       else if (sg.cs instanceof BuriedColourScheme)
367       {
368         buriedColour.setSelected(true);
369       }
370       else if (sg.cs instanceof ClustalxColourScheme)
371       {
372         clustalColour.setSelected(true);
373       }
374       else
375       {
376         noColourmenuItem.setSelected(true);
377       }
378
379       if (sg.cs != null && sg.cs.conservationApplied())
380       {
381         conservationMenuItem.setSelected(true);
382       }
383       displayNonconserved.setSelected(sg.getShowunconserved());
384       showText.setSelected(sg.getDisplayText());
385       showColourText.setSelected(sg.getColourText());
386       showBoxes.setSelected(sg.getDisplayBoxes());
387     }
388     else
389     {
390       groupMenu.setVisible(false);
391       editMenu.setVisible(false);
392     }
393
394     if (!ap.av.alignment.getGroups().contains(sg))
395     {
396       unGroupMenuItem.setVisible(false);
397     }
398
399     if (seq == null)
400     {
401       sequenceMenu.setVisible(false);
402       structureMenu.setVisible(false);
403     }
404
405     if (links != null && links.size() > 0)
406     {
407       JMenu linkMenu = new JMenu("Link");
408       Vector linkset = new Vector();
409       for (int i = 0; i < links.size(); i++)
410       {
411         String link = links.elementAt(i).toString();
412         UrlLink urlLink = null;
413         try
414         {
415           urlLink = new UrlLink(link);
416         } catch (Exception foo)
417         {
418           jalview.bin.Cache.log.error("Exception for URLLink '" + link
419                   + "'", foo);
420           continue;
421         }
422         ;
423         if (!urlLink.isValid())
424         {
425           jalview.bin.Cache.log.error(urlLink.getInvalidMessage());
426           continue;
427         }
428         final String label = urlLink.getLabel();
429         if (urlLink.isDynamic())
430         {
431
432           // collect matching db-refs
433           DBRefEntry[] dbr = jalview.util.DBRefUtils.selectRefs(seq
434                   .getDBRef(), new String[]
435           { urlLink.getTarget() });
436           // collect id string too
437           String id = seq.getName();
438           String descr = seq.getDescription();
439           if (descr!=null && descr.length()<1)
440           {
441             descr = null;
442           }
443
444           if (dbr != null)
445           {
446             for (int r = 0; r < dbr.length; r++)
447             {
448               if (id != null && dbr[r].getAccessionId().equals(id))
449               {
450                 // suppress duplicate link creation for the bare sequence ID
451                 // string with this link
452                 id = null;
453               }
454               // create Bare ID link for this RUL
455               String[] urls = urlLink.makeUrls(dbr[r].getAccessionId(),
456                       true);
457               if (urls != null)
458               {
459                 for (int u = 0; u < urls.length; u += 2)
460                 {
461                   if (!linkset.contains(urls[u]+"|"+urls[u+1]))
462                   {
463                     linkset.addElement(urls[u]+"|"+urls[u+1]);
464                     addshowLink(linkMenu, label + "|" + urls[u], urls[u + 1]);
465                   }
466                 }
467               }
468             }
469           }
470           if (id != null)
471           {
472             // create Bare ID link for this RUL
473             String[] urls = urlLink.makeUrls(id, true);
474             if (urls != null)
475             {
476               for (int u = 0; u < urls.length; u += 2)
477               {
478                 if (!linkset.contains(urls[u]+"|"+urls[u+1]))
479                 {
480                   linkset.addElement(urls[u]+"|"+urls[u+1]);
481                   addshowLink(linkMenu, label, urls[u + 1]);
482                 }
483               }
484             }
485           }
486           // Create urls from description but only for URL links which are regex links
487           if (descr != null && urlLink.getRegexReplace()!=null)
488           {
489             // create link for this URL from description where regex matches
490             String[] urls = urlLink.makeUrls(descr, true);
491             if (urls != null)
492             {
493               for (int u = 0; u < urls.length; u += 2)
494               {
495                 if (!linkset.contains(urls[u]+"|"+urls[u+1]))
496                 {
497                   linkset.addElement(urls[u]+"|"+urls[u+1]);
498                   addshowLink(linkMenu, label, urls[u + 1]);
499                 }
500               }
501             }
502           }
503         }
504         else
505         {
506           if (!linkset.contains(label+"|"+urlLink.getUrl_prefix()))
507           {
508             linkset.addElement(label+"|"+urlLink.getUrl_prefix());
509             // Add a non-dynamic link
510             addshowLink(linkMenu, label, urlLink.getUrl_prefix());
511           }
512         }
513       }
514       if (sequence != null)
515       {
516         sequenceMenu.add(linkMenu);
517       }
518       else
519       {
520         add(linkMenu);
521       }
522     }
523   }
524
525   /**
526    * add a show URL menu item to the given linkMenu
527    * 
528    * @param linkMenu
529    * @param label -
530    *                menu label string
531    * @param url -
532    *                url to open
533    */
534   private void addshowLink(JMenu linkMenu, String label, final String url)
535   {
536     JMenuItem item = new JMenuItem(label);
537     item.setToolTipText("open URL: " + url);
538     item.addActionListener(new java.awt.event.ActionListener()
539     {
540       public void actionPerformed(ActionEvent e)
541       {
542         new Thread(new Runnable()
543         {
544
545           public void run()
546           {
547             showLink(url);
548           }
549
550         }).start();
551       }
552     });
553
554     linkMenu.add(item);
555   }
556
557   /**
558    * DOCUMENT ME!
559    * 
560    * @throws Exception
561    *                 DOCUMENT ME!
562    */
563   private void jbInit() throws Exception
564   {
565     groupMenu.setText("Group");
566     groupMenu.setText("Selection");
567     groupName.setText("Name");
568     groupName.addActionListener(new java.awt.event.ActionListener()
569     {
570       public void actionPerformed(ActionEvent e)
571       {
572         groupName_actionPerformed();
573       }
574     });
575     sequenceMenu.setText("Sequence");
576     sequenceName.setText("Edit Name/Description");
577     sequenceName.addActionListener(new java.awt.event.ActionListener()
578     {
579       public void actionPerformed(ActionEvent e)
580       {
581         sequenceName_actionPerformed();
582       }
583     });
584     PIDColour.setFocusPainted(false);
585     unGroupMenuItem.setText("Remove Group");
586     unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
587     {
588       public void actionPerformed(ActionEvent e)
589       {
590         unGroupMenuItem_actionPerformed();
591       }
592     });
593
594     outline.setText("Border colour");
595     outline.addActionListener(new java.awt.event.ActionListener()
596     {
597       public void actionPerformed(ActionEvent e)
598       {
599         outline_actionPerformed();
600       }
601     });
602     nucleotideMenuItem.setText("Nucleotide");
603     nucleotideMenuItem.addActionListener(new ActionListener()
604     {
605       public void actionPerformed(ActionEvent e)
606       {
607         nucleotideMenuItem_actionPerformed();
608       }
609     });
610     colourMenu.setText("Group Colour");
611     showBoxes.setText("Boxes");
612     showBoxes.setState(true);
613     showBoxes.addActionListener(new ActionListener()
614     {
615       public void actionPerformed(ActionEvent e)
616       {
617         showBoxes_actionPerformed();
618       }
619     });
620     showText.setText("Text");
621     showText.setState(true);
622     showText.addActionListener(new ActionListener()
623     {
624       public void actionPerformed(ActionEvent e)
625       {
626         showText_actionPerformed();
627       }
628     });
629     showColourText.setText("Colour Text");
630     showColourText.addActionListener(new ActionListener()
631     {
632       public void actionPerformed(ActionEvent e)
633       {
634         showColourText_actionPerformed();
635       }
636     });
637     displayNonconserved.setText("Show Nonconserved");
638     displayNonconserved.setState(true);
639     displayNonconserved.addActionListener(new ActionListener()
640     {
641       public void actionPerformed(ActionEvent e)
642       {
643         showNonconserved_actionPerformed();
644       }
645     });
646     editMenu.setText("Edit");
647     cut.setText("Cut");
648     cut.addActionListener(new ActionListener()
649     {
650       public void actionPerformed(ActionEvent e)
651       {
652         cut_actionPerformed();
653       }
654     });
655     upperCase.setText("To Upper Case");
656     upperCase.addActionListener(new ActionListener()
657     {
658       public void actionPerformed(ActionEvent e)
659       {
660         changeCase(e);
661       }
662     });
663     copy.setText("Copy");
664     copy.addActionListener(new ActionListener()
665     {
666       public void actionPerformed(ActionEvent e)
667       {
668         copy_actionPerformed();
669       }
670     });
671     lowerCase.setText("To Lower Case");
672     lowerCase.addActionListener(new ActionListener()
673     {
674       public void actionPerformed(ActionEvent e)
675       {
676         changeCase(e);
677       }
678     });
679     toggle.setText("Toggle Case");
680     toggle.addActionListener(new ActionListener()
681     {
682       public void actionPerformed(ActionEvent e)
683       {
684         changeCase(e);
685       }
686     });
687     pdbMenu.setText("Associate Structure with Sequence");
688     pdbFromFile.setText("From File");
689     pdbFromFile.addActionListener(new ActionListener()
690     {
691       public void actionPerformed(ActionEvent e)
692       {
693         pdbFromFile_actionPerformed();
694       }
695     });
696     enterPDB.setText("Enter PDB Id");
697     enterPDB.addActionListener(new ActionListener()
698     {
699       public void actionPerformed(ActionEvent e)
700       {
701         enterPDB_actionPerformed();
702       }
703     });
704     discoverPDB.setText("Discover PDB ids");
705     discoverPDB.addActionListener(new ActionListener()
706     {
707       public void actionPerformed(ActionEvent e)
708       {
709         discoverPDB_actionPerformed();
710       }
711     });
712     outputMenu.setText("Output to Textbox...");
713     sequenceFeature.setText("Create Sequence Feature");
714     sequenceFeature.addActionListener(new ActionListener()
715     {
716       public void actionPerformed(ActionEvent e)
717       {
718         sequenceFeature_actionPerformed();
719       }
720     });
721     textColour.setText("Text Colour");
722     textColour.addActionListener(new ActionListener()
723     {
724       public void actionPerformed(ActionEvent e)
725       {
726         textColour_actionPerformed();
727       }
728     });
729     jMenu1.setText("Group");
730     structureMenu.setText("Structure");
731     viewStructureMenu.setText("View Structure");
732     // colStructureMenu.setText("Colour By Structure");
733     editSequence.setText("Edit Sequence...");
734     editSequence.addActionListener(new ActionListener()
735     {
736       public void actionPerformed(ActionEvent actionEvent)
737       {
738         editSequence_actionPerformed(actionEvent);
739       }
740     });
741     /*
742      * annotationMenuItem.setText("By Annotation");
743      * annotationMenuItem.addActionListener(new ActionListener() { public void
744      * actionPerformed(ActionEvent actionEvent) {
745      * annotationMenuItem_actionPerformed(actionEvent); } });
746      */
747
748     add(groupMenu);
749
750     add(sequenceMenu);
751     this.add(structureMenu);
752     groupMenu.add(editMenu);
753     groupMenu.add(outputMenu);
754     groupMenu.add(sequenceFeature);
755     groupMenu.add(jMenu1);
756     sequenceMenu.add(sequenceName);
757     colourMenu.add(textColour);
758     colourMenu.add(noColourmenuItem);
759     colourMenu.add(clustalColour);
760     colourMenu.add(BLOSUM62Colour);
761     colourMenu.add(PIDColour);
762     colourMenu.add(zappoColour);
763     colourMenu.add(taylorColour);
764     colourMenu.add(hydrophobicityColour);
765     colourMenu.add(helixColour);
766     colourMenu.add(strandColour);
767     colourMenu.add(turnColour);
768     colourMenu.add(buriedColour);
769     colourMenu.add(nucleotideMenuItem);
770     colourMenu.add(userDefinedColour);
771
772     if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
773     {
774       java.util.Enumeration userColours = jalview.gui.UserDefinedColours
775               .getUserColourSchemes().keys();
776
777       while (userColours.hasMoreElements())
778       {
779         JMenuItem item = new JMenuItem(userColours.nextElement().toString());
780         item.addActionListener(new ActionListener()
781         {
782           public void actionPerformed(ActionEvent evt)
783           {
784             userDefinedColour_actionPerformed(evt);
785           }
786         });
787         colourMenu.add(item);
788       }
789     }
790
791     colourMenu.addSeparator();
792     colourMenu.add(abovePIDColour);
793     colourMenu.add(conservationMenuItem);
794     // colourMenu.add(annotationMenuItem);
795     editMenu.add(copy);
796     editMenu.add(cut);
797     editMenu.add(editSequence);
798     editMenu.add(upperCase);
799     editMenu.add(lowerCase);
800     editMenu.add(toggle);
801     pdbMenu.add(pdbFromFile);
802     pdbMenu.add(enterPDB);
803     pdbMenu.add(discoverPDB);
804     jMenu1.add(groupName);
805     jMenu1.add(unGroupMenuItem);
806     jMenu1.add(colourMenu);
807     jMenu1.add(showBoxes);
808     jMenu1.add(showText);
809     jMenu1.add(showColourText);
810     jMenu1.add(outline);
811     jMenu1.add(displayNonconserved);
812     structureMenu.add(pdbMenu);
813     structureMenu.add(viewStructureMenu);
814     // structureMenu.add(colStructureMenu);
815     noColourmenuItem.setText("None");
816     noColourmenuItem.addActionListener(new java.awt.event.ActionListener()
817     {
818       public void actionPerformed(ActionEvent e)
819       {
820         noColourmenuItem_actionPerformed();
821       }
822     });
823
824     clustalColour.setText("Clustalx colours");
825     clustalColour.addActionListener(new java.awt.event.ActionListener()
826     {
827       public void actionPerformed(ActionEvent e)
828       {
829         clustalColour_actionPerformed();
830       }
831     });
832     zappoColour.setText("Zappo");
833     zappoColour.addActionListener(new java.awt.event.ActionListener()
834     {
835       public void actionPerformed(ActionEvent e)
836       {
837         zappoColour_actionPerformed();
838       }
839     });
840     taylorColour.setText("Taylor");
841     taylorColour.addActionListener(new java.awt.event.ActionListener()
842     {
843       public void actionPerformed(ActionEvent e)
844       {
845         taylorColour_actionPerformed();
846       }
847     });
848     hydrophobicityColour.setText("Hydrophobicity");
849     hydrophobicityColour
850             .addActionListener(new java.awt.event.ActionListener()
851             {
852               public void actionPerformed(ActionEvent e)
853               {
854                 hydrophobicityColour_actionPerformed();
855               }
856             });
857     helixColour.setText("Helix propensity");
858     helixColour.addActionListener(new java.awt.event.ActionListener()
859     {
860       public void actionPerformed(ActionEvent e)
861       {
862         helixColour_actionPerformed();
863       }
864     });
865     strandColour.setText("Strand propensity");
866     strandColour.addActionListener(new java.awt.event.ActionListener()
867     {
868       public void actionPerformed(ActionEvent e)
869       {
870         strandColour_actionPerformed();
871       }
872     });
873     turnColour.setText("Turn propensity");
874     turnColour.addActionListener(new java.awt.event.ActionListener()
875     {
876       public void actionPerformed(ActionEvent e)
877       {
878         turnColour_actionPerformed();
879       }
880     });
881     buriedColour.setText("Buried Index");
882     buriedColour.addActionListener(new java.awt.event.ActionListener()
883     {
884       public void actionPerformed(ActionEvent e)
885       {
886         buriedColour_actionPerformed();
887       }
888     });
889     abovePIDColour.setText("Above % Identity");
890     abovePIDColour.addActionListener(new java.awt.event.ActionListener()
891     {
892       public void actionPerformed(ActionEvent e)
893       {
894         abovePIDColour_actionPerformed();
895       }
896     });
897     userDefinedColour.setText("User Defined...");
898     userDefinedColour.addActionListener(new java.awt.event.ActionListener()
899     {
900       public void actionPerformed(ActionEvent e)
901       {
902         userDefinedColour_actionPerformed(e);
903       }
904     });
905     PIDColour.setText("Percentage Identity");
906     PIDColour.addActionListener(new java.awt.event.ActionListener()
907     {
908       public void actionPerformed(ActionEvent e)
909       {
910         PIDColour_actionPerformed();
911       }
912     });
913     BLOSUM62Colour.setText("BLOSUM62");
914     BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()
915     {
916       public void actionPerformed(ActionEvent e)
917       {
918         BLOSUM62Colour_actionPerformed();
919       }
920     });
921     conservationMenuItem.setText("Conservation");
922     conservationMenuItem
923             .addActionListener(new java.awt.event.ActionListener()
924             {
925               public void actionPerformed(ActionEvent e)
926               {
927                 conservationMenuItem_actionPerformed();
928               }
929             });
930   }
931
932   protected void showNonconserved_actionPerformed()
933   {
934     getGroup().setShowunconserved(displayNonconserved.isSelected());
935     refresh();
936   }
937
938   /**
939    * call to refresh view after settings change
940    */
941   void refresh()
942   {
943     ap.paintAlignment(true);
944
945     PaintRefresher.Refresh(this, ap.av.getSequenceSetId());
946   }
947
948   /**
949    * DOCUMENT ME!
950    * 
951    * @param e
952    *                DOCUMENT ME!
953    */
954   protected void clustalColour_actionPerformed()
955   {
956     SequenceGroup sg = getGroup();
957     sg.cs = new ClustalxColourScheme(sg
958             .getSequences(ap.av.hiddenRepSequences), ap.av.alignment
959             .getWidth());
960     refresh();
961   }
962
963   /**
964    * DOCUMENT ME!
965    * 
966    * @param e
967    *                DOCUMENT ME!
968    */
969   protected void zappoColour_actionPerformed()
970   {
971     getGroup().cs = new ZappoColourScheme();
972     refresh();
973   }
974
975   /**
976    * DOCUMENT ME!
977    * 
978    * @param e
979    *                DOCUMENT ME!
980    */
981   protected void taylorColour_actionPerformed()
982   {
983     getGroup().cs = new TaylorColourScheme();
984     refresh();
985   }
986
987   /**
988    * DOCUMENT ME!
989    * 
990    * @param e
991    *                DOCUMENT ME!
992    */
993   protected void hydrophobicityColour_actionPerformed()
994   {
995     getGroup().cs = new HydrophobicColourScheme();
996     refresh();
997   }
998
999   /**
1000    * DOCUMENT ME!
1001    * 
1002    * @param e
1003    *                DOCUMENT ME!
1004    */
1005   protected void helixColour_actionPerformed()
1006   {
1007     getGroup().cs = new HelixColourScheme();
1008     refresh();
1009   }
1010
1011   /**
1012    * DOCUMENT ME!
1013    * 
1014    * @param e
1015    *                DOCUMENT ME!
1016    */
1017   protected void strandColour_actionPerformed()
1018   {
1019     getGroup().cs = new StrandColourScheme();
1020     refresh();
1021   }
1022
1023   /**
1024    * DOCUMENT ME!
1025    * 
1026    * @param e
1027    *                DOCUMENT ME!
1028    */
1029   protected void turnColour_actionPerformed()
1030   {
1031     getGroup().cs = new TurnColourScheme();
1032     refresh();
1033   }
1034
1035   /**
1036    * DOCUMENT ME!
1037    * 
1038    * @param e
1039    *                DOCUMENT ME!
1040    */
1041   protected void buriedColour_actionPerformed()
1042   {
1043     getGroup().cs = new BuriedColourScheme();
1044     refresh();
1045   }
1046
1047   /**
1048    * DOCUMENT ME!
1049    * 
1050    * @param e
1051    *                DOCUMENT ME!
1052    */
1053   public void nucleotideMenuItem_actionPerformed()
1054   {
1055     getGroup().cs = new NucleotideColourScheme();
1056     refresh();
1057   }
1058
1059   /**
1060    * DOCUMENT ME!
1061    * 
1062    * @param e
1063    *                DOCUMENT ME!
1064    */
1065   protected void abovePIDColour_actionPerformed()
1066   {
1067     SequenceGroup sg = getGroup();
1068     if (sg.cs == null)
1069     {
1070       return;
1071     }
1072
1073     if (abovePIDColour.isSelected())
1074     {
1075       sg.cs.setConsensus(AAFrequency.calculate(sg
1076               .getSequences(ap.av.hiddenRepSequences), sg.getStartRes(), sg
1077               .getEndRes() + 1));
1078
1079       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup()
1080               .getName());
1081
1082       sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());
1083
1084       SliderPanel.showPIDSlider();
1085     }
1086     else
1087     // remove PIDColouring
1088     {
1089       sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());
1090     }
1091
1092     refresh();
1093   }
1094
1095   /**
1096    * DOCUMENT ME!
1097    * 
1098    * @param e
1099    *                DOCUMENT ME!
1100    */
1101   protected void userDefinedColour_actionPerformed(ActionEvent e)
1102   {
1103     SequenceGroup sg = getGroup();
1104
1105     if (e.getActionCommand().equals("User Defined..."))
1106     {
1107       new UserDefinedColours(ap, sg);
1108     }
1109     else
1110     {
1111       UserColourScheme udc = (UserColourScheme) UserDefinedColours
1112               .getUserColourSchemes().get(e.getActionCommand());
1113
1114       sg.cs = udc;
1115     }
1116     refresh();
1117   }
1118
1119   /**
1120    * DOCUMENT ME!
1121    * 
1122    * @param e
1123    *                DOCUMENT ME!
1124    */
1125   protected void PIDColour_actionPerformed()
1126   {
1127     SequenceGroup sg = getGroup();
1128     sg.cs = new PIDColourScheme();
1129     sg.cs.setConsensus(AAFrequency.calculate(sg
1130             .getSequences(ap.av.hiddenRepSequences), sg.getStartRes(), sg
1131             .getEndRes() + 1));
1132     refresh();
1133   }
1134
1135   /**
1136    * DOCUMENT ME!
1137    * 
1138    * @param e
1139    *                DOCUMENT ME!
1140    */
1141   protected void BLOSUM62Colour_actionPerformed()
1142   {
1143     SequenceGroup sg = getGroup();
1144
1145     sg.cs = new Blosum62ColourScheme();
1146
1147     sg.cs.setConsensus(AAFrequency.calculate(sg
1148             .getSequences(ap.av.hiddenRepSequences), sg.getStartRes(), sg
1149             .getEndRes() + 1));
1150
1151     refresh();
1152   }
1153
1154   /**
1155    * DOCUMENT ME!
1156    * 
1157    * @param e
1158    *                DOCUMENT ME!
1159    */
1160   protected void noColourmenuItem_actionPerformed()
1161   {
1162     getGroup().cs = null;
1163     refresh();
1164   }
1165
1166   /**
1167    * DOCUMENT ME!
1168    * 
1169    * @param e
1170    *                DOCUMENT ME!
1171    */
1172   protected void conservationMenuItem_actionPerformed()
1173   {
1174     SequenceGroup sg = getGroup();
1175     if (sg.cs == null)
1176     {
1177       return;
1178     }
1179
1180     if (conservationMenuItem.isSelected())
1181     {
1182       Conservation c = new Conservation("Group",
1183               ResidueProperties.propHash, 3, sg
1184                       .getSequences(ap.av.hiddenRepSequences), sg
1185                       .getStartRes(), sg.getEndRes() + 1);
1186
1187       c.calculate();
1188       c.verdict(false, ap.av.ConsPercGaps);
1189
1190       sg.cs.setConservation(c);
1191
1192       SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());
1193       SliderPanel.showConservationSlider();
1194     }
1195     else
1196     // remove ConservationColouring
1197     {
1198       sg.cs.setConservation(null);
1199     }
1200
1201     refresh();
1202   }
1203
1204   public void annotationMenuItem_actionPerformed(ActionEvent actionEvent)
1205   {
1206     SequenceGroup sg = getGroup();
1207     if (sg == null)
1208     {
1209       return;
1210     }
1211
1212     AnnotationColourGradient acg = new AnnotationColourGradient(sequence
1213             .getAnnotation()[0], null,
1214             AnnotationColourGradient.NO_THRESHOLD);
1215
1216     acg.predefinedColours = true;
1217     sg.cs = acg;
1218
1219     refresh();
1220   }
1221
1222   /**
1223    * DOCUMENT ME!
1224    * 
1225    * @param e
1226    *                DOCUMENT ME!
1227    */
1228   protected void groupName_actionPerformed()
1229   {
1230
1231     SequenceGroup sg = getGroup();
1232     EditNameDialog dialog = new EditNameDialog(sg.getName(), sg
1233             .getDescription(), "       Group Name ", "Group Description ",
1234             "Edit Group Name/Description");
1235
1236     if (!dialog.accept)
1237     {
1238       return;
1239     }
1240
1241     sg.setName(dialog.getName());
1242     sg.setDescription(dialog.getDescription());
1243   }
1244
1245   /**
1246    * DOCUMENT ME!
1247    * 
1248    * @return DOCUMENT ME!
1249    */
1250   SequenceGroup getGroup()
1251   {
1252     SequenceGroup sg = ap.av.getSelectionGroup();
1253     // this method won't add a new group if it already exists
1254     if (sg != null)
1255     {
1256       ap.av.alignment.addGroup(sg);
1257     }
1258
1259     return sg;
1260   }
1261
1262   /**
1263    * DOCUMENT ME!
1264    * 
1265    * @param e
1266    *                DOCUMENT ME!
1267    */
1268   void sequenceName_actionPerformed()
1269   {
1270     EditNameDialog dialog = new EditNameDialog(sequence.getName(), sequence
1271             .getDescription(), "       Sequence Name ",
1272             "Sequence Description ", "Edit Sequence Name/Description");
1273
1274     if (!dialog.accept)
1275     {
1276       return;
1277     }
1278
1279     if (dialog.getName() != null)
1280     {
1281       if (dialog.getName().indexOf(" ") > -1)
1282       {
1283         JOptionPane.showMessageDialog(ap,
1284                 "Spaces have been converted to \"_\"",
1285                 "No spaces allowed in Sequence Name",
1286                 JOptionPane.WARNING_MESSAGE);
1287       }
1288
1289       sequence.setName(dialog.getName().replace(' ', '_'));
1290       ap.paintAlignment(false);
1291     }
1292
1293     sequence.setDescription(dialog.getDescription());
1294
1295     ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
1296             .getSequences());
1297
1298   }
1299
1300   /**
1301    * DOCUMENT ME!
1302    * 
1303    * @param e
1304    *                DOCUMENT ME!
1305    */
1306   void unGroupMenuItem_actionPerformed()
1307   {
1308     SequenceGroup sg = ap.av.getSelectionGroup();
1309     ap.av.alignment.deleteGroup(sg);
1310     ap.av.setSelectionGroup(null);
1311     refresh();
1312   }
1313
1314   /**
1315    * DOCUMENT ME!
1316    * 
1317    * @param e
1318    *                DOCUMENT ME!
1319    */
1320   protected void outline_actionPerformed()
1321   {
1322     SequenceGroup sg = getGroup();
1323     Color col = JColorChooser.showDialog(this, "Select Outline Colour",
1324             Color.BLUE);
1325
1326     if (col != null)
1327     {
1328       sg.setOutlineColour(col);
1329     }
1330
1331     refresh();
1332   }
1333
1334   /**
1335    * DOCUMENT ME!
1336    * 
1337    * @param e
1338    *                DOCUMENT ME!
1339    */
1340   public void showBoxes_actionPerformed()
1341   {
1342     getGroup().setDisplayBoxes(showBoxes.isSelected());
1343     refresh();
1344   }
1345
1346   /**
1347    * DOCUMENT ME!
1348    * 
1349    * @param e
1350    *                DOCUMENT ME!
1351    */
1352   public void showText_actionPerformed()
1353   {
1354     getGroup().setDisplayText(showText.isSelected());
1355     refresh();
1356   }
1357
1358   /**
1359    * DOCUMENT ME!
1360    * 
1361    * @param e
1362    *                DOCUMENT ME!
1363    */
1364   public void showColourText_actionPerformed()
1365   {
1366     getGroup().setColourText(showColourText.isSelected());
1367     refresh();
1368   }
1369
1370   public void showLink(String url)
1371   {
1372     try
1373     {
1374       jalview.util.BrowserLauncher.openURL(url);
1375     } catch (Exception ex)
1376     {
1377       JOptionPane
1378               .showInternalMessageDialog(
1379                       Desktop.desktop,
1380                       "Unixers: Couldn't find default web browser."
1381                               + "\nAdd the full path to your browser in Preferences.",
1382                       "Web browser not found", JOptionPane.WARNING_MESSAGE);
1383
1384       ex.printStackTrace();
1385     }
1386   }
1387
1388   void hideSequences(boolean representGroup)
1389   {
1390     SequenceGroup sg = ap.av.getSelectionGroup();
1391     if (sg == null || sg.getSize() < 1)
1392     {
1393       ap.av.hideSequence(new SequenceI[]
1394       { sequence });
1395       return;
1396     }
1397
1398     ap.av.setSelectionGroup(null);
1399
1400     if (representGroup)
1401     {
1402       ap.av.hideRepSequences(sequence, sg);
1403
1404       return;
1405     }
1406
1407     int gsize = sg.getSize();
1408     SequenceI[] hseqs;
1409
1410     hseqs = new SequenceI[gsize];
1411
1412     int index = 0;
1413     for (int i = 0; i < gsize; i++)
1414     {
1415       hseqs[index++] = sg.getSequenceAt(i);
1416     }
1417
1418     ap.av.hideSequence(hseqs);
1419     ap.av.sendSelection();
1420   }
1421
1422   public void copy_actionPerformed()
1423   {
1424     ap.alignFrame.copy_actionPerformed(null);
1425   }
1426
1427   public void cut_actionPerformed()
1428   {
1429     ap.alignFrame.cut_actionPerformed(null);
1430   }
1431
1432   void changeCase(ActionEvent e)
1433   {
1434     Object source = e.getSource();
1435     SequenceGroup sg = ap.av.getSelectionGroup();
1436
1437     if (sg != null)
1438     {
1439       int[][] startEnd = ap.av.getVisibleRegionBoundaries(sg.getStartRes(),
1440               sg.getEndRes() + 1);
1441
1442       String description;
1443       int caseChange;
1444
1445       if (source == toggle)
1446       {
1447         description = "Toggle Case";
1448         caseChange = ChangeCaseCommand.TOGGLE_CASE;
1449       }
1450       else if (source == upperCase)
1451       {
1452         description = "To Upper Case";
1453         caseChange = ChangeCaseCommand.TO_UPPER;
1454       }
1455       else
1456       {
1457         description = "To Lower Case";
1458         caseChange = ChangeCaseCommand.TO_LOWER;
1459       }
1460
1461       ChangeCaseCommand caseCommand = new ChangeCaseCommand(description, sg
1462               .getSequencesAsArray(ap.av.hiddenRepSequences), startEnd,
1463               caseChange);
1464
1465       ap.alignFrame.addHistoryItem(caseCommand);
1466
1467       ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
1468               .getSequences());
1469
1470     }
1471   }
1472
1473   public void outputText_actionPerformed(ActionEvent e)
1474   {
1475     CutAndPasteTransfer cap = new CutAndPasteTransfer();
1476     cap.setForInput(null);
1477     Desktop.addInternalFrame(cap, "Alignment output - "
1478             + e.getActionCommand(), 600, 500);
1479
1480     String[] omitHidden = null;
1481
1482     System.out.println("PROMPT USER HERE"); // TODO: decide if a prompt happens
1483                                             // or we simply trust the user wants
1484                                             // wysiwig behaviour
1485     SequenceGroup sg = ap.av.getSelectionGroup();
1486     ColumnSelection csel = new ColumnSelection(ap.av.getColumnSelection());
1487     omitHidden = ap.av.getViewAsString(true);
1488     Alignment oal = new Alignment(ap.av.getSequenceSelection());
1489     AlignmentAnnotation[] nala = ap.av.alignment.getAlignmentAnnotation();
1490     for (int i = 0; i < nala.length; i++)
1491     {
1492       AlignmentAnnotation na = nala[i];
1493       oal.addAnnotation(na);
1494     }
1495     cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
1496             oal, omitHidden, csel, sg));
1497     oal = null;
1498   }
1499
1500   public void pdbFromFile_actionPerformed()
1501   {
1502     jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
1503             jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
1504     chooser.setFileView(new jalview.io.JalviewFileView());
1505     chooser.setDialogTitle("Select a PDB file");
1506     chooser.setToolTipText("Load a PDB file");
1507
1508     int value = chooser.showOpenDialog(null);
1509
1510     if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
1511     {
1512       PDBEntry entry = new PDBEntry();
1513       String choice = chooser.getSelectedFile().getPath();
1514       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
1515       try
1516       {
1517         MCview.PDBfile pdbfile = new MCview.PDBfile(choice,
1518                 jalview.io.AppletFormatAdapter.FILE);
1519
1520         if (pdbfile.id == null)
1521         {
1522           String reply = JOptionPane
1523                   .showInternalInputDialog(
1524                           Desktop.desktop,
1525                           "Couldn't find a PDB id in the file supplied."
1526                                   + "Please enter an Id to identify this structure.",
1527                           "No PDB Id in File", JOptionPane.QUESTION_MESSAGE);
1528           if (reply == null)
1529           {
1530             return;
1531           }
1532
1533           entry.setId(reply);
1534         }
1535         else
1536         {
1537           entry.setId(pdbfile.id);
1538         }
1539       } catch (java.io.IOException ex)
1540       {
1541         ex.printStackTrace();
1542       }
1543
1544       entry.setFile(choice);
1545       sequence.getDatasetSequence().addPDBId(entry);
1546     }
1547
1548   }
1549
1550   public void enterPDB_actionPerformed()
1551   {
1552     String id = JOptionPane.showInternalInputDialog(Desktop.desktop,
1553             "Enter PDB Id", "Enter PDB Id", JOptionPane.QUESTION_MESSAGE);
1554
1555     if (id != null && id.length() > 0)
1556     {
1557       PDBEntry entry = new PDBEntry();
1558       entry.setId(id.toUpperCase());
1559       sequence.getDatasetSequence().addPDBId(entry);
1560     }
1561   }
1562
1563   public void discoverPDB_actionPerformed()
1564   {
1565
1566     final SequenceI[] sequences = ((ap.av.selectionGroup == null) ? new Sequence[]
1567     { sequence }
1568             : ap.av.selectionGroup.getSequencesInOrder(ap.av.alignment));
1569     Thread discpdb = new Thread(new Runnable()
1570     {
1571       public void run()
1572       {
1573
1574         new jalview.ws.DBRefFetcher(sequences, ap.alignFrame)
1575                 .fetchDBRefs(false);
1576       }
1577
1578     });
1579     discpdb.start();
1580   }
1581
1582   public void sequenceFeature_actionPerformed()
1583   {
1584     SequenceGroup sg = ap.av.getSelectionGroup();
1585     if (sg == null)
1586     {
1587       return;
1588     }
1589
1590     int gSize = sg.getSize();
1591     SequenceI[] seqs = new SequenceI[gSize];
1592     SequenceFeature[] features = new SequenceFeature[gSize];
1593
1594     for (int i = 0; i < gSize; i++)
1595     {
1596       seqs[i] = sg.getSequenceAt(i).getDatasetSequence();
1597       int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());
1598       int end = sg.findEndRes(sg.getSequenceAt(i));
1599       features[i] = new SequenceFeature(null, null, null, start, end,
1600               "Jalview");
1601     }
1602
1603     if (ap.seqPanel.seqCanvas.getFeatureRenderer().amendFeatures(seqs,
1604             features, true, ap))
1605     {
1606       ap.alignFrame.setShowSeqFeatures(true);
1607       ap.highlightSearchResults(null);
1608     }
1609   }
1610
1611   public void textColour_actionPerformed()
1612   {
1613     SequenceGroup sg = getGroup();
1614     if (sg != null)
1615     {
1616       new TextColourChooser().chooseColour(ap, sg);
1617     }
1618   }
1619
1620   public void colourByStructure(String pdbid)
1621   {
1622     Annotation[] anots = jalview.structure.StructureSelectionManager
1623             .getStructureSelectionManager().colourSequenceFromStructure(
1624                     sequence, pdbid);
1625
1626     AlignmentAnnotation an = new AlignmentAnnotation("Structure",
1627             "Coloured by " + pdbid, anots);
1628
1629     ap.av.alignment.addAnnotation(an);
1630     an.createSequenceMapping(sequence, 0, true);
1631     // an.adjustForAlignment();
1632     ap.av.alignment.setAnnotationIndex(an, 0);
1633
1634     ap.adjustAnnotationHeight();
1635
1636     sequence.addAlignmentAnnotation(an);
1637
1638   }
1639
1640   public void editSequence_actionPerformed(ActionEvent actionEvent)
1641   {
1642     SequenceGroup sg = ap.av.getSelectionGroup();
1643
1644     if (sg != null)
1645     {
1646       if (sequence == null)
1647         sequence = (Sequence) sg.getSequenceAt(0);
1648
1649       EditNameDialog dialog = new EditNameDialog(sequence
1650               .getSequenceAsString(sg.getStartRes(), sg.getEndRes() + 1),
1651               null, "Edit Sequence ", null, "Edit Sequence");
1652
1653       if (dialog.accept)
1654       {
1655         EditCommand editCommand = new EditCommand("Edit Sequences",
1656                 EditCommand.REPLACE, dialog.getName().replace(' ',
1657                         ap.av.getGapCharacter()), sg
1658                         .getSequencesAsArray(ap.av.hiddenRepSequences), sg
1659                         .getStartRes(), sg.getEndRes() + 1, ap.av.alignment);
1660
1661         ap.alignFrame.addHistoryItem(editCommand);
1662
1663         ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
1664                 .getSequences());
1665       }
1666     }
1667   }
1668
1669 }