update annotation when group state is changed
[jalview.git] / src / jalview / gui / PopupMenu.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
3  * Copyright (C) 2009 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.updateAnnotation();
944     ap.paintAlignment(true);
945
946     PaintRefresher.Refresh(this, ap.av.getSequenceSetId());
947   }
948
949   /**
950    * DOCUMENT ME!
951    * 
952    * @param e
953    *                DOCUMENT ME!
954    */
955   protected void clustalColour_actionPerformed()
956   {
957     SequenceGroup sg = getGroup();
958     sg.cs = new ClustalxColourScheme(sg
959             .getSequences(ap.av.hiddenRepSequences), ap.av.alignment
960             .getWidth());
961     refresh();
962   }
963
964   /**
965    * DOCUMENT ME!
966    * 
967    * @param e
968    *                DOCUMENT ME!
969    */
970   protected void zappoColour_actionPerformed()
971   {
972     getGroup().cs = new ZappoColourScheme();
973     refresh();
974   }
975
976   /**
977    * DOCUMENT ME!
978    * 
979    * @param e
980    *                DOCUMENT ME!
981    */
982   protected void taylorColour_actionPerformed()
983   {
984     getGroup().cs = new TaylorColourScheme();
985     refresh();
986   }
987
988   /**
989    * DOCUMENT ME!
990    * 
991    * @param e
992    *                DOCUMENT ME!
993    */
994   protected void hydrophobicityColour_actionPerformed()
995   {
996     getGroup().cs = new HydrophobicColourScheme();
997     refresh();
998   }
999
1000   /**
1001    * DOCUMENT ME!
1002    * 
1003    * @param e
1004    *                DOCUMENT ME!
1005    */
1006   protected void helixColour_actionPerformed()
1007   {
1008     getGroup().cs = new HelixColourScheme();
1009     refresh();
1010   }
1011
1012   /**
1013    * DOCUMENT ME!
1014    * 
1015    * @param e
1016    *                DOCUMENT ME!
1017    */
1018   protected void strandColour_actionPerformed()
1019   {
1020     getGroup().cs = new StrandColourScheme();
1021     refresh();
1022   }
1023
1024   /**
1025    * DOCUMENT ME!
1026    * 
1027    * @param e
1028    *                DOCUMENT ME!
1029    */
1030   protected void turnColour_actionPerformed()
1031   {
1032     getGroup().cs = new TurnColourScheme();
1033     refresh();
1034   }
1035
1036   /**
1037    * DOCUMENT ME!
1038    * 
1039    * @param e
1040    *                DOCUMENT ME!
1041    */
1042   protected void buriedColour_actionPerformed()
1043   {
1044     getGroup().cs = new BuriedColourScheme();
1045     refresh();
1046   }
1047
1048   /**
1049    * DOCUMENT ME!
1050    * 
1051    * @param e
1052    *                DOCUMENT ME!
1053    */
1054   public void nucleotideMenuItem_actionPerformed()
1055   {
1056     getGroup().cs = new NucleotideColourScheme();
1057     refresh();
1058   }
1059
1060   /**
1061    * DOCUMENT ME!
1062    * 
1063    * @param e
1064    *                DOCUMENT ME!
1065    */
1066   protected void abovePIDColour_actionPerformed()
1067   {
1068     SequenceGroup sg = getGroup();
1069     if (sg.cs == null)
1070     {
1071       return;
1072     }
1073
1074     if (abovePIDColour.isSelected())
1075     {
1076       sg.cs.setConsensus(AAFrequency.calculate(sg
1077               .getSequences(ap.av.hiddenRepSequences), sg.getStartRes(), sg
1078               .getEndRes() + 1));
1079
1080       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup()
1081               .getName());
1082
1083       sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());
1084
1085       SliderPanel.showPIDSlider();
1086     }
1087     else
1088     // remove PIDColouring
1089     {
1090       sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());
1091     }
1092
1093     refresh();
1094   }
1095
1096   /**
1097    * DOCUMENT ME!
1098    * 
1099    * @param e
1100    *                DOCUMENT ME!
1101    */
1102   protected void userDefinedColour_actionPerformed(ActionEvent e)
1103   {
1104     SequenceGroup sg = getGroup();
1105
1106     if (e.getActionCommand().equals("User Defined..."))
1107     {
1108       new UserDefinedColours(ap, sg);
1109     }
1110     else
1111     {
1112       UserColourScheme udc = (UserColourScheme) UserDefinedColours
1113               .getUserColourSchemes().get(e.getActionCommand());
1114
1115       sg.cs = udc;
1116     }
1117     refresh();
1118   }
1119
1120   /**
1121    * DOCUMENT ME!
1122    * 
1123    * @param e
1124    *                DOCUMENT ME!
1125    */
1126   protected void PIDColour_actionPerformed()
1127   {
1128     SequenceGroup sg = getGroup();
1129     sg.cs = new PIDColourScheme();
1130     sg.cs.setConsensus(AAFrequency.calculate(sg
1131             .getSequences(ap.av.hiddenRepSequences), sg.getStartRes(), sg
1132             .getEndRes() + 1));
1133     refresh();
1134   }
1135
1136   /**
1137    * DOCUMENT ME!
1138    * 
1139    * @param e
1140    *                DOCUMENT ME!
1141    */
1142   protected void BLOSUM62Colour_actionPerformed()
1143   {
1144     SequenceGroup sg = getGroup();
1145
1146     sg.cs = new Blosum62ColourScheme();
1147
1148     sg.cs.setConsensus(AAFrequency.calculate(sg
1149             .getSequences(ap.av.hiddenRepSequences), sg.getStartRes(), sg
1150             .getEndRes() + 1));
1151
1152     refresh();
1153   }
1154
1155   /**
1156    * DOCUMENT ME!
1157    * 
1158    * @param e
1159    *                DOCUMENT ME!
1160    */
1161   protected void noColourmenuItem_actionPerformed()
1162   {
1163     getGroup().cs = null;
1164     refresh();
1165   }
1166
1167   /**
1168    * DOCUMENT ME!
1169    * 
1170    * @param e
1171    *                DOCUMENT ME!
1172    */
1173   protected void conservationMenuItem_actionPerformed()
1174   {
1175     SequenceGroup sg = getGroup();
1176     if (sg.cs == null)
1177     {
1178       return;
1179     }
1180
1181     if (conservationMenuItem.isSelected())
1182     {
1183       Conservation c = new Conservation("Group",
1184               ResidueProperties.propHash, 3, sg
1185                       .getSequences(ap.av.hiddenRepSequences), sg
1186                       .getStartRes(), sg.getEndRes() + 1);
1187
1188       c.calculate();
1189       c.verdict(false, ap.av.ConsPercGaps);
1190
1191       sg.cs.setConservation(c);
1192
1193       SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());
1194       SliderPanel.showConservationSlider();
1195     }
1196     else
1197     // remove ConservationColouring
1198     {
1199       sg.cs.setConservation(null);
1200     }
1201
1202     refresh();
1203   }
1204
1205   public void annotationMenuItem_actionPerformed(ActionEvent actionEvent)
1206   {
1207     SequenceGroup sg = getGroup();
1208     if (sg == null)
1209     {
1210       return;
1211     }
1212
1213     AnnotationColourGradient acg = new AnnotationColourGradient(sequence
1214             .getAnnotation()[0], null,
1215             AnnotationColourGradient.NO_THRESHOLD);
1216
1217     acg.predefinedColours = true;
1218     sg.cs = acg;
1219
1220     refresh();
1221   }
1222
1223   /**
1224    * DOCUMENT ME!
1225    * 
1226    * @param e
1227    *                DOCUMENT ME!
1228    */
1229   protected void groupName_actionPerformed()
1230   {
1231
1232     SequenceGroup sg = getGroup();
1233     EditNameDialog dialog = new EditNameDialog(sg.getName(), sg
1234             .getDescription(), "       Group Name ", "Group Description ",
1235             "Edit Group Name/Description");
1236
1237     if (!dialog.accept)
1238     {
1239       return;
1240     }
1241
1242     sg.setName(dialog.getName());
1243     sg.setDescription(dialog.getDescription());
1244   }
1245
1246   /**
1247    * DOCUMENT ME!
1248    * 
1249    * @return DOCUMENT ME!
1250    */
1251   SequenceGroup getGroup()
1252   {
1253     SequenceGroup sg = ap.av.getSelectionGroup();
1254     // this method won't add a new group if it already exists
1255     if (sg != null)
1256     {
1257       ap.av.alignment.addGroup(sg);
1258     }
1259
1260     return sg;
1261   }
1262
1263   /**
1264    * DOCUMENT ME!
1265    * 
1266    * @param e
1267    *                DOCUMENT ME!
1268    */
1269   void sequenceName_actionPerformed()
1270   {
1271     EditNameDialog dialog = new EditNameDialog(sequence.getName(), sequence
1272             .getDescription(), "       Sequence Name ",
1273             "Sequence Description ", "Edit Sequence Name/Description");
1274
1275     if (!dialog.accept)
1276     {
1277       return;
1278     }
1279
1280     if (dialog.getName() != null)
1281     {
1282       if (dialog.getName().indexOf(" ") > -1)
1283       {
1284         JOptionPane.showMessageDialog(ap,
1285                 "Spaces have been converted to \"_\"",
1286                 "No spaces allowed in Sequence Name",
1287                 JOptionPane.WARNING_MESSAGE);
1288       }
1289
1290       sequence.setName(dialog.getName().replace(' ', '_'));
1291       ap.paintAlignment(false);
1292     }
1293
1294     sequence.setDescription(dialog.getDescription());
1295
1296     ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
1297             .getSequences());
1298
1299   }
1300
1301   /**
1302    * DOCUMENT ME!
1303    * 
1304    * @param e
1305    *                DOCUMENT ME!
1306    */
1307   void unGroupMenuItem_actionPerformed()
1308   {
1309     SequenceGroup sg = ap.av.getSelectionGroup();
1310     ap.av.alignment.deleteGroup(sg);
1311     ap.av.setSelectionGroup(null);
1312     refresh();
1313   }
1314
1315   /**
1316    * DOCUMENT ME!
1317    * 
1318    * @param e
1319    *                DOCUMENT ME!
1320    */
1321   protected void outline_actionPerformed()
1322   {
1323     SequenceGroup sg = getGroup();
1324     Color col = JColorChooser.showDialog(this, "Select Outline Colour",
1325             Color.BLUE);
1326
1327     if (col != null)
1328     {
1329       sg.setOutlineColour(col);
1330     }
1331
1332     refresh();
1333   }
1334
1335   /**
1336    * DOCUMENT ME!
1337    * 
1338    * @param e
1339    *                DOCUMENT ME!
1340    */
1341   public void showBoxes_actionPerformed()
1342   {
1343     getGroup().setDisplayBoxes(showBoxes.isSelected());
1344     refresh();
1345   }
1346
1347   /**
1348    * DOCUMENT ME!
1349    * 
1350    * @param e
1351    *                DOCUMENT ME!
1352    */
1353   public void showText_actionPerformed()
1354   {
1355     getGroup().setDisplayText(showText.isSelected());
1356     refresh();
1357   }
1358
1359   /**
1360    * DOCUMENT ME!
1361    * 
1362    * @param e
1363    *                DOCUMENT ME!
1364    */
1365   public void showColourText_actionPerformed()
1366   {
1367     getGroup().setColourText(showColourText.isSelected());
1368     refresh();
1369   }
1370
1371   public void showLink(String url)
1372   {
1373     try
1374     {
1375       jalview.util.BrowserLauncher.openURL(url);
1376     } catch (Exception ex)
1377     {
1378       JOptionPane
1379               .showInternalMessageDialog(
1380                       Desktop.desktop,
1381                       "Unixers: Couldn't find default web browser."
1382                               + "\nAdd the full path to your browser in Preferences.",
1383                       "Web browser not found", JOptionPane.WARNING_MESSAGE);
1384
1385       ex.printStackTrace();
1386     }
1387   }
1388
1389   void hideSequences(boolean representGroup)
1390   {
1391     SequenceGroup sg = ap.av.getSelectionGroup();
1392     if (sg == null || sg.getSize() < 1)
1393     {
1394       ap.av.hideSequence(new SequenceI[]
1395       { sequence });
1396       return;
1397     }
1398
1399     ap.av.setSelectionGroup(null);
1400
1401     if (representGroup)
1402     {
1403       ap.av.hideRepSequences(sequence, sg);
1404
1405       return;
1406     }
1407
1408     int gsize = sg.getSize();
1409     SequenceI[] hseqs;
1410
1411     hseqs = new SequenceI[gsize];
1412
1413     int index = 0;
1414     for (int i = 0; i < gsize; i++)
1415     {
1416       hseqs[index++] = sg.getSequenceAt(i);
1417     }
1418
1419     ap.av.hideSequence(hseqs);
1420     ap.av.sendSelection();
1421   }
1422
1423   public void copy_actionPerformed()
1424   {
1425     ap.alignFrame.copy_actionPerformed(null);
1426   }
1427
1428   public void cut_actionPerformed()
1429   {
1430     ap.alignFrame.cut_actionPerformed(null);
1431   }
1432
1433   void changeCase(ActionEvent e)
1434   {
1435     Object source = e.getSource();
1436     SequenceGroup sg = ap.av.getSelectionGroup();
1437
1438     if (sg != null)
1439     {
1440       int[][] startEnd = ap.av.getVisibleRegionBoundaries(sg.getStartRes(),
1441               sg.getEndRes() + 1);
1442
1443       String description;
1444       int caseChange;
1445
1446       if (source == toggle)
1447       {
1448         description = "Toggle Case";
1449         caseChange = ChangeCaseCommand.TOGGLE_CASE;
1450       }
1451       else if (source == upperCase)
1452       {
1453         description = "To Upper Case";
1454         caseChange = ChangeCaseCommand.TO_UPPER;
1455       }
1456       else
1457       {
1458         description = "To Lower Case";
1459         caseChange = ChangeCaseCommand.TO_LOWER;
1460       }
1461
1462       ChangeCaseCommand caseCommand = new ChangeCaseCommand(description, sg
1463               .getSequencesAsArray(ap.av.hiddenRepSequences), startEnd,
1464               caseChange);
1465
1466       ap.alignFrame.addHistoryItem(caseCommand);
1467
1468       ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
1469               .getSequences());
1470
1471     }
1472   }
1473
1474   public void outputText_actionPerformed(ActionEvent e)
1475   {
1476     CutAndPasteTransfer cap = new CutAndPasteTransfer();
1477     cap.setForInput(null);
1478     Desktop.addInternalFrame(cap, "Alignment output - "
1479             + e.getActionCommand(), 600, 500);
1480
1481     String[] omitHidden = null;
1482
1483     System.out.println("PROMPT USER HERE"); // TODO: decide if a prompt happens
1484                                             // or we simply trust the user wants
1485                                             // wysiwig behaviour
1486     SequenceGroup sg = ap.av.getSelectionGroup();
1487     ColumnSelection csel = new ColumnSelection(ap.av.getColumnSelection());
1488     omitHidden = ap.av.getViewAsString(true);
1489     Alignment oal = new Alignment(ap.av.getSequenceSelection());
1490     AlignmentAnnotation[] nala = ap.av.alignment.getAlignmentAnnotation();
1491     for (int i = 0; i < nala.length; i++)
1492     {
1493       AlignmentAnnotation na = nala[i];
1494       oal.addAnnotation(na);
1495     }
1496     cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
1497             oal, omitHidden, csel, sg));
1498     oal = null;
1499   }
1500
1501   public void pdbFromFile_actionPerformed()
1502   {
1503     jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
1504             jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
1505     chooser.setFileView(new jalview.io.JalviewFileView());
1506     chooser.setDialogTitle("Select a PDB file");
1507     chooser.setToolTipText("Load a PDB file");
1508
1509     int value = chooser.showOpenDialog(null);
1510
1511     if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
1512     {
1513       PDBEntry entry = new PDBEntry();
1514       String choice = chooser.getSelectedFile().getPath();
1515       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
1516       try
1517       {
1518         MCview.PDBfile pdbfile = new MCview.PDBfile(choice,
1519                 jalview.io.AppletFormatAdapter.FILE);
1520
1521         if (pdbfile.id == null)
1522         {
1523           String reply = JOptionPane
1524                   .showInternalInputDialog(
1525                           Desktop.desktop,
1526                           "Couldn't find a PDB id in the file supplied."
1527                                   + "Please enter an Id to identify this structure.",
1528                           "No PDB Id in File", JOptionPane.QUESTION_MESSAGE);
1529           if (reply == null)
1530           {
1531             return;
1532           }
1533
1534           entry.setId(reply);
1535         }
1536         else
1537         {
1538           entry.setId(pdbfile.id);
1539         }
1540       } catch (java.io.IOException ex)
1541       {
1542         ex.printStackTrace();
1543       }
1544
1545       entry.setFile(choice);
1546       sequence.getDatasetSequence().addPDBId(entry);
1547     }
1548
1549   }
1550
1551   public void enterPDB_actionPerformed()
1552   {
1553     String id = JOptionPane.showInternalInputDialog(Desktop.desktop,
1554             "Enter PDB Id", "Enter PDB Id", JOptionPane.QUESTION_MESSAGE);
1555
1556     if (id != null && id.length() > 0)
1557     {
1558       PDBEntry entry = new PDBEntry();
1559       entry.setId(id.toUpperCase());
1560       sequence.getDatasetSequence().addPDBId(entry);
1561     }
1562   }
1563
1564   public void discoverPDB_actionPerformed()
1565   {
1566
1567     final SequenceI[] sequences = ((ap.av.selectionGroup == null) ? new Sequence[]
1568     { sequence }
1569             : ap.av.selectionGroup.getSequencesInOrder(ap.av.alignment));
1570     Thread discpdb = new Thread(new Runnable()
1571     {
1572       public void run()
1573       {
1574
1575         new jalview.ws.DBRefFetcher(sequences, ap.alignFrame)
1576                 .fetchDBRefs(false);
1577       }
1578
1579     });
1580     discpdb.start();
1581   }
1582
1583   public void sequenceFeature_actionPerformed()
1584   {
1585     SequenceGroup sg = ap.av.getSelectionGroup();
1586     if (sg == null)
1587     {
1588       return;
1589     }
1590
1591     int gSize = sg.getSize();
1592     SequenceI[] seqs = new SequenceI[gSize];
1593     SequenceFeature[] features = new SequenceFeature[gSize];
1594
1595     for (int i = 0; i < gSize; i++)
1596     {
1597       seqs[i] = sg.getSequenceAt(i).getDatasetSequence();
1598       int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());
1599       int end = sg.findEndRes(sg.getSequenceAt(i));
1600       features[i] = new SequenceFeature(null, null, null, start, end,
1601               "Jalview");
1602     }
1603
1604     if (ap.seqPanel.seqCanvas.getFeatureRenderer().amendFeatures(seqs,
1605             features, true, ap))
1606     {
1607       ap.alignFrame.setShowSeqFeatures(true);
1608       ap.highlightSearchResults(null);
1609     }
1610   }
1611
1612   public void textColour_actionPerformed()
1613   {
1614     SequenceGroup sg = getGroup();
1615     if (sg != null)
1616     {
1617       new TextColourChooser().chooseColour(ap, sg);
1618     }
1619   }
1620
1621   public void colourByStructure(String pdbid)
1622   {
1623     Annotation[] anots = jalview.structure.StructureSelectionManager
1624             .getStructureSelectionManager().colourSequenceFromStructure(
1625                     sequence, pdbid);
1626
1627     AlignmentAnnotation an = new AlignmentAnnotation("Structure",
1628             "Coloured by " + pdbid, anots);
1629
1630     ap.av.alignment.addAnnotation(an);
1631     an.createSequenceMapping(sequence, 0, true);
1632     // an.adjustForAlignment();
1633     ap.av.alignment.setAnnotationIndex(an, 0);
1634
1635     ap.adjustAnnotationHeight();
1636
1637     sequence.addAlignmentAnnotation(an);
1638
1639   }
1640
1641   public void editSequence_actionPerformed(ActionEvent actionEvent)
1642   {
1643     SequenceGroup sg = ap.av.getSelectionGroup();
1644
1645     if (sg != null)
1646     {
1647       if (sequence == null)
1648         sequence = (Sequence) sg.getSequenceAt(0);
1649
1650       EditNameDialog dialog = new EditNameDialog(sequence
1651               .getSequenceAsString(sg.getStartRes(), sg.getEndRes() + 1),
1652               null, "Edit Sequence ", null, "Edit Sequence");
1653
1654       if (dialog.accept)
1655       {
1656         EditCommand editCommand = new EditCommand("Edit Sequences",
1657                 EditCommand.REPLACE, dialog.getName().replace(' ',
1658                         ap.av.getGapCharacter()), sg
1659                         .getSequencesAsArray(ap.av.hiddenRepSequences), sg
1660                         .getStartRes(), sg.getEndRes() + 1, ap.av.alignment);
1661
1662         ap.alignFrame.addHistoryItem(editCommand);
1663
1664         ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
1665                 .getSequences());
1666       }
1667     }
1668   }
1669
1670 }