showUnconserved view and group setting
[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
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                   addshowLink(linkMenu, label + "|" + urls[u], urls[u + 1]);
462                 }
463               }
464             }
465           }
466           if (id != null)
467           {
468             // create Bare ID link for this RUL
469             String[] urls = urlLink.makeUrls(id, true);
470             if (urls != null)
471             {
472               for (int u = 0; u < urls.length; u += 2)
473               {
474                 addshowLink(linkMenu, label, urls[u + 1]);
475               }
476             }
477           }
478           // Create urls from description but only for URL links which are regex links
479           if (descr != null && urlLink.getRegexReplace()!=null)
480           {
481             // create link for this URL from description where regex matches
482             String[] urls = urlLink.makeUrls(descr, true);
483             if (urls != null)
484             {
485               for (int u = 0; u < urls.length; u += 2)
486               {
487                 addshowLink(linkMenu, label, urls[u + 1]);
488               }
489             }
490           }
491         }
492         else
493         {
494           // Add a non-dynamic link
495           addshowLink(linkMenu, label, urlLink.getUrl_prefix());
496         }
497       }
498       if (sequence != null)
499       {
500         sequenceMenu.add(linkMenu);
501       }
502       else
503       {
504         add(linkMenu);
505       }
506     }
507   }
508
509   /**
510    * add a show URL menu item to the given linkMenu
511    * 
512    * @param linkMenu
513    * @param label -
514    *                menu label string
515    * @param url -
516    *                url to open
517    */
518   private void addshowLink(JMenu linkMenu, String label, final String url)
519   {
520     JMenuItem item = new JMenuItem(label);
521     item.setToolTipText("open URL: " + url);
522     item.addActionListener(new java.awt.event.ActionListener()
523     {
524       public void actionPerformed(ActionEvent e)
525       {
526         new Thread(new Runnable()
527         {
528
529           public void run()
530           {
531             showLink(url);
532           }
533
534         }).start();
535       }
536     });
537
538     linkMenu.add(item);
539   }
540
541   /**
542    * DOCUMENT ME!
543    * 
544    * @throws Exception
545    *                 DOCUMENT ME!
546    */
547   private void jbInit() throws Exception
548   {
549     groupMenu.setText("Group");
550     groupMenu.setText("Selection");
551     groupName.setText("Name");
552     groupName.addActionListener(new java.awt.event.ActionListener()
553     {
554       public void actionPerformed(ActionEvent e)
555       {
556         groupName_actionPerformed();
557       }
558     });
559     sequenceMenu.setText("Sequence");
560     sequenceName.setText("Edit Name/Description");
561     sequenceName.addActionListener(new java.awt.event.ActionListener()
562     {
563       public void actionPerformed(ActionEvent e)
564       {
565         sequenceName_actionPerformed();
566       }
567     });
568     PIDColour.setFocusPainted(false);
569     unGroupMenuItem.setText("Remove Group");
570     unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
571     {
572       public void actionPerformed(ActionEvent e)
573       {
574         unGroupMenuItem_actionPerformed();
575       }
576     });
577
578     outline.setText("Border colour");
579     outline.addActionListener(new java.awt.event.ActionListener()
580     {
581       public void actionPerformed(ActionEvent e)
582       {
583         outline_actionPerformed();
584       }
585     });
586     nucleotideMenuItem.setText("Nucleotide");
587     nucleotideMenuItem.addActionListener(new ActionListener()
588     {
589       public void actionPerformed(ActionEvent e)
590       {
591         nucleotideMenuItem_actionPerformed();
592       }
593     });
594     colourMenu.setText("Group Colour");
595     showBoxes.setText("Boxes");
596     showBoxes.setState(true);
597     showBoxes.addActionListener(new ActionListener()
598     {
599       public void actionPerformed(ActionEvent e)
600       {
601         showBoxes_actionPerformed();
602       }
603     });
604     showText.setText("Text");
605     showText.setState(true);
606     showText.addActionListener(new ActionListener()
607     {
608       public void actionPerformed(ActionEvent e)
609       {
610         showText_actionPerformed();
611       }
612     });
613     showColourText.setText("Colour Text");
614     showColourText.addActionListener(new ActionListener()
615     {
616       public void actionPerformed(ActionEvent e)
617       {
618         showColourText_actionPerformed();
619       }
620     });
621     displayNonconserved.setText("Show Nonconserved");
622     displayNonconserved.setState(true);
623     displayNonconserved.addActionListener(new ActionListener()
624     {
625       public void actionPerformed(ActionEvent e)
626       {
627         showNonconserved_actionPerformed();
628       }
629     });
630     editMenu.setText("Edit");
631     cut.setText("Cut");
632     cut.addActionListener(new ActionListener()
633     {
634       public void actionPerformed(ActionEvent e)
635       {
636         cut_actionPerformed();
637       }
638     });
639     upperCase.setText("To Upper Case");
640     upperCase.addActionListener(new ActionListener()
641     {
642       public void actionPerformed(ActionEvent e)
643       {
644         changeCase(e);
645       }
646     });
647     copy.setText("Copy");
648     copy.addActionListener(new ActionListener()
649     {
650       public void actionPerformed(ActionEvent e)
651       {
652         copy_actionPerformed();
653       }
654     });
655     lowerCase.setText("To Lower Case");
656     lowerCase.addActionListener(new ActionListener()
657     {
658       public void actionPerformed(ActionEvent e)
659       {
660         changeCase(e);
661       }
662     });
663     toggle.setText("Toggle Case");
664     toggle.addActionListener(new ActionListener()
665     {
666       public void actionPerformed(ActionEvent e)
667       {
668         changeCase(e);
669       }
670     });
671     pdbMenu.setText("Associate Structure with Sequence");
672     pdbFromFile.setText("From File");
673     pdbFromFile.addActionListener(new ActionListener()
674     {
675       public void actionPerformed(ActionEvent e)
676       {
677         pdbFromFile_actionPerformed();
678       }
679     });
680     enterPDB.setText("Enter PDB Id");
681     enterPDB.addActionListener(new ActionListener()
682     {
683       public void actionPerformed(ActionEvent e)
684       {
685         enterPDB_actionPerformed();
686       }
687     });
688     discoverPDB.setText("Discover PDB ids");
689     discoverPDB.addActionListener(new ActionListener()
690     {
691       public void actionPerformed(ActionEvent e)
692       {
693         discoverPDB_actionPerformed();
694       }
695     });
696     outputMenu.setText("Output to Textbox...");
697     sequenceFeature.setText("Create Sequence Feature");
698     sequenceFeature.addActionListener(new ActionListener()
699     {
700       public void actionPerformed(ActionEvent e)
701       {
702         sequenceFeature_actionPerformed();
703       }
704     });
705     textColour.setText("Text Colour");
706     textColour.addActionListener(new ActionListener()
707     {
708       public void actionPerformed(ActionEvent e)
709       {
710         textColour_actionPerformed();
711       }
712     });
713     jMenu1.setText("Group");
714     structureMenu.setText("Structure");
715     viewStructureMenu.setText("View Structure");
716     // colStructureMenu.setText("Colour By Structure");
717     editSequence.setText("Edit Sequence...");
718     editSequence.addActionListener(new ActionListener()
719     {
720       public void actionPerformed(ActionEvent actionEvent)
721       {
722         editSequence_actionPerformed(actionEvent);
723       }
724     });
725     /*
726      * annotationMenuItem.setText("By Annotation");
727      * annotationMenuItem.addActionListener(new ActionListener() { public void
728      * actionPerformed(ActionEvent actionEvent) {
729      * annotationMenuItem_actionPerformed(actionEvent); } });
730      */
731
732     add(groupMenu);
733
734     add(sequenceMenu);
735     this.add(structureMenu);
736     groupMenu.add(editMenu);
737     groupMenu.add(outputMenu);
738     groupMenu.add(sequenceFeature);
739     groupMenu.add(jMenu1);
740     sequenceMenu.add(sequenceName);
741     colourMenu.add(textColour);
742     colourMenu.add(noColourmenuItem);
743     colourMenu.add(clustalColour);
744     colourMenu.add(BLOSUM62Colour);
745     colourMenu.add(PIDColour);
746     colourMenu.add(zappoColour);
747     colourMenu.add(taylorColour);
748     colourMenu.add(hydrophobicityColour);
749     colourMenu.add(helixColour);
750     colourMenu.add(strandColour);
751     colourMenu.add(turnColour);
752     colourMenu.add(buriedColour);
753     colourMenu.add(nucleotideMenuItem);
754     colourMenu.add(userDefinedColour);
755
756     if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
757     {
758       java.util.Enumeration userColours = jalview.gui.UserDefinedColours
759               .getUserColourSchemes().keys();
760
761       while (userColours.hasMoreElements())
762       {
763         JMenuItem item = new JMenuItem(userColours.nextElement().toString());
764         item.addActionListener(new ActionListener()
765         {
766           public void actionPerformed(ActionEvent evt)
767           {
768             userDefinedColour_actionPerformed(evt);
769           }
770         });
771         colourMenu.add(item);
772       }
773     }
774
775     colourMenu.addSeparator();
776     colourMenu.add(abovePIDColour);
777     colourMenu.add(conservationMenuItem);
778     // colourMenu.add(annotationMenuItem);
779     editMenu.add(copy);
780     editMenu.add(cut);
781     editMenu.add(editSequence);
782     editMenu.add(upperCase);
783     editMenu.add(lowerCase);
784     editMenu.add(toggle);
785     pdbMenu.add(pdbFromFile);
786     pdbMenu.add(enterPDB);
787     pdbMenu.add(discoverPDB);
788     jMenu1.add(groupName);
789     jMenu1.add(unGroupMenuItem);
790     jMenu1.add(colourMenu);
791     jMenu1.add(showBoxes);
792     jMenu1.add(showText);
793     jMenu1.add(showColourText);
794     jMenu1.add(outline);
795     jMenu1.add(displayNonconserved);
796     structureMenu.add(pdbMenu);
797     structureMenu.add(viewStructureMenu);
798     // structureMenu.add(colStructureMenu);
799     noColourmenuItem.setText("None");
800     noColourmenuItem.addActionListener(new java.awt.event.ActionListener()
801     {
802       public void actionPerformed(ActionEvent e)
803       {
804         noColourmenuItem_actionPerformed();
805       }
806     });
807
808     clustalColour.setText("Clustalx colours");
809     clustalColour.addActionListener(new java.awt.event.ActionListener()
810     {
811       public void actionPerformed(ActionEvent e)
812       {
813         clustalColour_actionPerformed();
814       }
815     });
816     zappoColour.setText("Zappo");
817     zappoColour.addActionListener(new java.awt.event.ActionListener()
818     {
819       public void actionPerformed(ActionEvent e)
820       {
821         zappoColour_actionPerformed();
822       }
823     });
824     taylorColour.setText("Taylor");
825     taylorColour.addActionListener(new java.awt.event.ActionListener()
826     {
827       public void actionPerformed(ActionEvent e)
828       {
829         taylorColour_actionPerformed();
830       }
831     });
832     hydrophobicityColour.setText("Hydrophobicity");
833     hydrophobicityColour
834             .addActionListener(new java.awt.event.ActionListener()
835             {
836               public void actionPerformed(ActionEvent e)
837               {
838                 hydrophobicityColour_actionPerformed();
839               }
840             });
841     helixColour.setText("Helix propensity");
842     helixColour.addActionListener(new java.awt.event.ActionListener()
843     {
844       public void actionPerformed(ActionEvent e)
845       {
846         helixColour_actionPerformed();
847       }
848     });
849     strandColour.setText("Strand propensity");
850     strandColour.addActionListener(new java.awt.event.ActionListener()
851     {
852       public void actionPerformed(ActionEvent e)
853       {
854         strandColour_actionPerformed();
855       }
856     });
857     turnColour.setText("Turn propensity");
858     turnColour.addActionListener(new java.awt.event.ActionListener()
859     {
860       public void actionPerformed(ActionEvent e)
861       {
862         turnColour_actionPerformed();
863       }
864     });
865     buriedColour.setText("Buried Index");
866     buriedColour.addActionListener(new java.awt.event.ActionListener()
867     {
868       public void actionPerformed(ActionEvent e)
869       {
870         buriedColour_actionPerformed();
871       }
872     });
873     abovePIDColour.setText("Above % Identity");
874     abovePIDColour.addActionListener(new java.awt.event.ActionListener()
875     {
876       public void actionPerformed(ActionEvent e)
877       {
878         abovePIDColour_actionPerformed();
879       }
880     });
881     userDefinedColour.setText("User Defined...");
882     userDefinedColour.addActionListener(new java.awt.event.ActionListener()
883     {
884       public void actionPerformed(ActionEvent e)
885       {
886         userDefinedColour_actionPerformed(e);
887       }
888     });
889     PIDColour.setText("Percentage Identity");
890     PIDColour.addActionListener(new java.awt.event.ActionListener()
891     {
892       public void actionPerformed(ActionEvent e)
893       {
894         PIDColour_actionPerformed();
895       }
896     });
897     BLOSUM62Colour.setText("BLOSUM62");
898     BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()
899     {
900       public void actionPerformed(ActionEvent e)
901       {
902         BLOSUM62Colour_actionPerformed();
903       }
904     });
905     conservationMenuItem.setText("Conservation");
906     conservationMenuItem
907             .addActionListener(new java.awt.event.ActionListener()
908             {
909               public void actionPerformed(ActionEvent e)
910               {
911                 conservationMenuItem_actionPerformed();
912               }
913             });
914   }
915
916   protected void showNonconserved_actionPerformed()
917   {
918     getGroup().setShowunconserved(displayNonconserved.isSelected());
919     refresh();
920   }
921
922   /**
923    * call to refresh view after settings change
924    */
925   void refresh()
926   {
927     ap.paintAlignment(true);
928
929     PaintRefresher.Refresh(this, ap.av.getSequenceSetId());
930   }
931
932   /**
933    * DOCUMENT ME!
934    * 
935    * @param e
936    *                DOCUMENT ME!
937    */
938   protected void clustalColour_actionPerformed()
939   {
940     SequenceGroup sg = getGroup();
941     sg.cs = new ClustalxColourScheme(sg
942             .getSequences(ap.av.hiddenRepSequences), ap.av.alignment
943             .getWidth());
944     refresh();
945   }
946
947   /**
948    * DOCUMENT ME!
949    * 
950    * @param e
951    *                DOCUMENT ME!
952    */
953   protected void zappoColour_actionPerformed()
954   {
955     getGroup().cs = new ZappoColourScheme();
956     refresh();
957   }
958
959   /**
960    * DOCUMENT ME!
961    * 
962    * @param e
963    *                DOCUMENT ME!
964    */
965   protected void taylorColour_actionPerformed()
966   {
967     getGroup().cs = new TaylorColourScheme();
968     refresh();
969   }
970
971   /**
972    * DOCUMENT ME!
973    * 
974    * @param e
975    *                DOCUMENT ME!
976    */
977   protected void hydrophobicityColour_actionPerformed()
978   {
979     getGroup().cs = new HydrophobicColourScheme();
980     refresh();
981   }
982
983   /**
984    * DOCUMENT ME!
985    * 
986    * @param e
987    *                DOCUMENT ME!
988    */
989   protected void helixColour_actionPerformed()
990   {
991     getGroup().cs = new HelixColourScheme();
992     refresh();
993   }
994
995   /**
996    * DOCUMENT ME!
997    * 
998    * @param e
999    *                DOCUMENT ME!
1000    */
1001   protected void strandColour_actionPerformed()
1002   {
1003     getGroup().cs = new StrandColourScheme();
1004     refresh();
1005   }
1006
1007   /**
1008    * DOCUMENT ME!
1009    * 
1010    * @param e
1011    *                DOCUMENT ME!
1012    */
1013   protected void turnColour_actionPerformed()
1014   {
1015     getGroup().cs = new TurnColourScheme();
1016     refresh();
1017   }
1018
1019   /**
1020    * DOCUMENT ME!
1021    * 
1022    * @param e
1023    *                DOCUMENT ME!
1024    */
1025   protected void buriedColour_actionPerformed()
1026   {
1027     getGroup().cs = new BuriedColourScheme();
1028     refresh();
1029   }
1030
1031   /**
1032    * DOCUMENT ME!
1033    * 
1034    * @param e
1035    *                DOCUMENT ME!
1036    */
1037   public void nucleotideMenuItem_actionPerformed()
1038   {
1039     getGroup().cs = new NucleotideColourScheme();
1040     refresh();
1041   }
1042
1043   /**
1044    * DOCUMENT ME!
1045    * 
1046    * @param e
1047    *                DOCUMENT ME!
1048    */
1049   protected void abovePIDColour_actionPerformed()
1050   {
1051     SequenceGroup sg = getGroup();
1052     if (sg.cs == null)
1053     {
1054       return;
1055     }
1056
1057     if (abovePIDColour.isSelected())
1058     {
1059       sg.cs.setConsensus(AAFrequency.calculate(sg
1060               .getSequences(ap.av.hiddenRepSequences), sg.getStartRes(), sg
1061               .getEndRes() + 1));
1062
1063       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup()
1064               .getName());
1065
1066       sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());
1067
1068       SliderPanel.showPIDSlider();
1069     }
1070     else
1071     // remove PIDColouring
1072     {
1073       sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());
1074     }
1075
1076     refresh();
1077   }
1078
1079   /**
1080    * DOCUMENT ME!
1081    * 
1082    * @param e
1083    *                DOCUMENT ME!
1084    */
1085   protected void userDefinedColour_actionPerformed(ActionEvent e)
1086   {
1087     SequenceGroup sg = getGroup();
1088
1089     if (e.getActionCommand().equals("User Defined..."))
1090     {
1091       new UserDefinedColours(ap, sg);
1092     }
1093     else
1094     {
1095       UserColourScheme udc = (UserColourScheme) UserDefinedColours
1096               .getUserColourSchemes().get(e.getActionCommand());
1097
1098       sg.cs = udc;
1099     }
1100     refresh();
1101   }
1102
1103   /**
1104    * DOCUMENT ME!
1105    * 
1106    * @param e
1107    *                DOCUMENT ME!
1108    */
1109   protected void PIDColour_actionPerformed()
1110   {
1111     SequenceGroup sg = getGroup();
1112     sg.cs = new PIDColourScheme();
1113     sg.cs.setConsensus(AAFrequency.calculate(sg
1114             .getSequences(ap.av.hiddenRepSequences), sg.getStartRes(), sg
1115             .getEndRes() + 1));
1116     refresh();
1117   }
1118
1119   /**
1120    * DOCUMENT ME!
1121    * 
1122    * @param e
1123    *                DOCUMENT ME!
1124    */
1125   protected void BLOSUM62Colour_actionPerformed()
1126   {
1127     SequenceGroup sg = getGroup();
1128
1129     sg.cs = new Blosum62ColourScheme();
1130
1131     sg.cs.setConsensus(AAFrequency.calculate(sg
1132             .getSequences(ap.av.hiddenRepSequences), sg.getStartRes(), sg
1133             .getEndRes() + 1));
1134
1135     refresh();
1136   }
1137
1138   /**
1139    * DOCUMENT ME!
1140    * 
1141    * @param e
1142    *                DOCUMENT ME!
1143    */
1144   protected void noColourmenuItem_actionPerformed()
1145   {
1146     getGroup().cs = null;
1147     refresh();
1148   }
1149
1150   /**
1151    * DOCUMENT ME!
1152    * 
1153    * @param e
1154    *                DOCUMENT ME!
1155    */
1156   protected void conservationMenuItem_actionPerformed()
1157   {
1158     SequenceGroup sg = getGroup();
1159     if (sg.cs == null)
1160     {
1161       return;
1162     }
1163
1164     if (conservationMenuItem.isSelected())
1165     {
1166       Conservation c = new Conservation("Group",
1167               ResidueProperties.propHash, 3, sg
1168                       .getSequences(ap.av.hiddenRepSequences), sg
1169                       .getStartRes(), sg.getEndRes() + 1);
1170
1171       c.calculate();
1172       c.verdict(false, ap.av.ConsPercGaps);
1173
1174       sg.cs.setConservation(c);
1175
1176       SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());
1177       SliderPanel.showConservationSlider();
1178     }
1179     else
1180     // remove ConservationColouring
1181     {
1182       sg.cs.setConservation(null);
1183     }
1184
1185     refresh();
1186   }
1187
1188   public void annotationMenuItem_actionPerformed(ActionEvent actionEvent)
1189   {
1190     SequenceGroup sg = getGroup();
1191     if (sg == null)
1192     {
1193       return;
1194     }
1195
1196     AnnotationColourGradient acg = new AnnotationColourGradient(sequence
1197             .getAnnotation()[0], null,
1198             AnnotationColourGradient.NO_THRESHOLD);
1199
1200     acg.predefinedColours = true;
1201     sg.cs = acg;
1202
1203     refresh();
1204   }
1205
1206   /**
1207    * DOCUMENT ME!
1208    * 
1209    * @param e
1210    *                DOCUMENT ME!
1211    */
1212   protected void groupName_actionPerformed()
1213   {
1214
1215     SequenceGroup sg = getGroup();
1216     EditNameDialog dialog = new EditNameDialog(sg.getName(), sg
1217             .getDescription(), "       Group Name ", "Group Description ",
1218             "Edit Group Name/Description");
1219
1220     if (!dialog.accept)
1221     {
1222       return;
1223     }
1224
1225     sg.setName(dialog.getName());
1226     sg.setDescription(dialog.getDescription());
1227   }
1228
1229   /**
1230    * DOCUMENT ME!
1231    * 
1232    * @return DOCUMENT ME!
1233    */
1234   SequenceGroup getGroup()
1235   {
1236     SequenceGroup sg = ap.av.getSelectionGroup();
1237     // this method won't add a new group if it already exists
1238     if (sg != null)
1239     {
1240       ap.av.alignment.addGroup(sg);
1241     }
1242
1243     return sg;
1244   }
1245
1246   /**
1247    * DOCUMENT ME!
1248    * 
1249    * @param e
1250    *                DOCUMENT ME!
1251    */
1252   void sequenceName_actionPerformed()
1253   {
1254     EditNameDialog dialog = new EditNameDialog(sequence.getName(), sequence
1255             .getDescription(), "       Sequence Name ",
1256             "Sequence Description ", "Edit Sequence Name/Description");
1257
1258     if (!dialog.accept)
1259     {
1260       return;
1261     }
1262
1263     if (dialog.getName() != null)
1264     {
1265       if (dialog.getName().indexOf(" ") > -1)
1266       {
1267         JOptionPane.showMessageDialog(ap,
1268                 "Spaces have been converted to \"_\"",
1269                 "No spaces allowed in Sequence Name",
1270                 JOptionPane.WARNING_MESSAGE);
1271       }
1272
1273       sequence.setName(dialog.getName().replace(' ', '_'));
1274       ap.paintAlignment(false);
1275     }
1276
1277     sequence.setDescription(dialog.getDescription());
1278
1279     ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
1280             .getSequences());
1281
1282   }
1283
1284   /**
1285    * DOCUMENT ME!
1286    * 
1287    * @param e
1288    *                DOCUMENT ME!
1289    */
1290   void unGroupMenuItem_actionPerformed()
1291   {
1292     SequenceGroup sg = ap.av.getSelectionGroup();
1293     ap.av.alignment.deleteGroup(sg);
1294     ap.av.setSelectionGroup(null);
1295     refresh();
1296   }
1297
1298   /**
1299    * DOCUMENT ME!
1300    * 
1301    * @param e
1302    *                DOCUMENT ME!
1303    */
1304   protected void outline_actionPerformed()
1305   {
1306     SequenceGroup sg = getGroup();
1307     Color col = JColorChooser.showDialog(this, "Select Outline Colour",
1308             Color.BLUE);
1309
1310     if (col != null)
1311     {
1312       sg.setOutlineColour(col);
1313     }
1314
1315     refresh();
1316   }
1317
1318   /**
1319    * DOCUMENT ME!
1320    * 
1321    * @param e
1322    *                DOCUMENT ME!
1323    */
1324   public void showBoxes_actionPerformed()
1325   {
1326     getGroup().setDisplayBoxes(showBoxes.isSelected());
1327     refresh();
1328   }
1329
1330   /**
1331    * DOCUMENT ME!
1332    * 
1333    * @param e
1334    *                DOCUMENT ME!
1335    */
1336   public void showText_actionPerformed()
1337   {
1338     getGroup().setDisplayText(showText.isSelected());
1339     refresh();
1340   }
1341
1342   /**
1343    * DOCUMENT ME!
1344    * 
1345    * @param e
1346    *                DOCUMENT ME!
1347    */
1348   public void showColourText_actionPerformed()
1349   {
1350     getGroup().setColourText(showColourText.isSelected());
1351     refresh();
1352   }
1353
1354   public void showLink(String url)
1355   {
1356     try
1357     {
1358       jalview.util.BrowserLauncher.openURL(url);
1359     } catch (Exception ex)
1360     {
1361       JOptionPane
1362               .showInternalMessageDialog(
1363                       Desktop.desktop,
1364                       "Unixers: Couldn't find default web browser."
1365                               + "\nAdd the full path to your browser in Preferences.",
1366                       "Web browser not found", JOptionPane.WARNING_MESSAGE);
1367
1368       ex.printStackTrace();
1369     }
1370   }
1371
1372   void hideSequences(boolean representGroup)
1373   {
1374     SequenceGroup sg = ap.av.getSelectionGroup();
1375     if (sg == null || sg.getSize() < 1)
1376     {
1377       ap.av.hideSequence(new SequenceI[]
1378       { sequence });
1379       return;
1380     }
1381
1382     ap.av.setSelectionGroup(null);
1383
1384     if (representGroup)
1385     {
1386       ap.av.hideRepSequences(sequence, sg);
1387
1388       return;
1389     }
1390
1391     int gsize = sg.getSize();
1392     SequenceI[] hseqs;
1393
1394     hseqs = new SequenceI[gsize];
1395
1396     int index = 0;
1397     for (int i = 0; i < gsize; i++)
1398     {
1399       hseqs[index++] = sg.getSequenceAt(i);
1400     }
1401
1402     ap.av.hideSequence(hseqs);
1403     ap.av.sendSelection();
1404   }
1405
1406   public void copy_actionPerformed()
1407   {
1408     ap.alignFrame.copy_actionPerformed(null);
1409   }
1410
1411   public void cut_actionPerformed()
1412   {
1413     ap.alignFrame.cut_actionPerformed(null);
1414   }
1415
1416   void changeCase(ActionEvent e)
1417   {
1418     Object source = e.getSource();
1419     SequenceGroup sg = ap.av.getSelectionGroup();
1420
1421     if (sg != null)
1422     {
1423       int[][] startEnd = ap.av.getVisibleRegionBoundaries(sg.getStartRes(),
1424               sg.getEndRes() + 1);
1425
1426       String description;
1427       int caseChange;
1428
1429       if (source == toggle)
1430       {
1431         description = "Toggle Case";
1432         caseChange = ChangeCaseCommand.TOGGLE_CASE;
1433       }
1434       else if (source == upperCase)
1435       {
1436         description = "To Upper Case";
1437         caseChange = ChangeCaseCommand.TO_UPPER;
1438       }
1439       else
1440       {
1441         description = "To Lower Case";
1442         caseChange = ChangeCaseCommand.TO_LOWER;
1443       }
1444
1445       ChangeCaseCommand caseCommand = new ChangeCaseCommand(description, sg
1446               .getSequencesAsArray(ap.av.hiddenRepSequences), startEnd,
1447               caseChange);
1448
1449       ap.alignFrame.addHistoryItem(caseCommand);
1450
1451       ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
1452               .getSequences());
1453
1454     }
1455   }
1456
1457   public void outputText_actionPerformed(ActionEvent e)
1458   {
1459     CutAndPasteTransfer cap = new CutAndPasteTransfer();
1460     cap.setForInput(null);
1461     Desktop.addInternalFrame(cap, "Alignment output - "
1462             + e.getActionCommand(), 600, 500);
1463
1464     String[] omitHidden = null;
1465
1466     System.out.println("PROMPT USER HERE"); // TODO: decide if a prompt happens
1467                                             // or we simply trust the user wants
1468                                             // wysiwig behaviour
1469     SequenceGroup sg = ap.av.getSelectionGroup();
1470     ColumnSelection csel = new ColumnSelection(ap.av.getColumnSelection());
1471     omitHidden = ap.av.getViewAsString(true);
1472     Alignment oal = new Alignment(ap.av.getSequenceSelection());
1473     AlignmentAnnotation[] nala = ap.av.alignment.getAlignmentAnnotation();
1474     for (int i = 0; i < nala.length; i++)
1475     {
1476       AlignmentAnnotation na = nala[i];
1477       oal.addAnnotation(na);
1478     }
1479     cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
1480             oal, omitHidden, csel, sg));
1481     oal = null;
1482   }
1483
1484   public void pdbFromFile_actionPerformed()
1485   {
1486     jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
1487             jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
1488     chooser.setFileView(new jalview.io.JalviewFileView());
1489     chooser.setDialogTitle("Select a PDB file");
1490     chooser.setToolTipText("Load a PDB file");
1491
1492     int value = chooser.showOpenDialog(null);
1493
1494     if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
1495     {
1496       PDBEntry entry = new PDBEntry();
1497       String choice = chooser.getSelectedFile().getPath();
1498       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
1499       try
1500       {
1501         MCview.PDBfile pdbfile = new MCview.PDBfile(choice,
1502                 jalview.io.AppletFormatAdapter.FILE);
1503
1504         if (pdbfile.id == null)
1505         {
1506           String reply = JOptionPane
1507                   .showInternalInputDialog(
1508                           Desktop.desktop,
1509                           "Couldn't find a PDB id in the file supplied."
1510                                   + "Please enter an Id to identify this structure.",
1511                           "No PDB Id in File", JOptionPane.QUESTION_MESSAGE);
1512           if (reply == null)
1513           {
1514             return;
1515           }
1516
1517           entry.setId(reply);
1518         }
1519         else
1520         {
1521           entry.setId(pdbfile.id);
1522         }
1523       } catch (java.io.IOException ex)
1524       {
1525         ex.printStackTrace();
1526       }
1527
1528       entry.setFile(choice);
1529       sequence.getDatasetSequence().addPDBId(entry);
1530     }
1531
1532   }
1533
1534   public void enterPDB_actionPerformed()
1535   {
1536     String id = JOptionPane.showInternalInputDialog(Desktop.desktop,
1537             "Enter PDB Id", "Enter PDB Id", JOptionPane.QUESTION_MESSAGE);
1538
1539     if (id != null && id.length() > 0)
1540     {
1541       PDBEntry entry = new PDBEntry();
1542       entry.setId(id.toUpperCase());
1543       sequence.getDatasetSequence().addPDBId(entry);
1544     }
1545   }
1546
1547   public void discoverPDB_actionPerformed()
1548   {
1549
1550     final SequenceI[] sequences = ((ap.av.selectionGroup == null) ? new Sequence[]
1551     { sequence }
1552             : ap.av.selectionGroup.getSequencesInOrder(ap.av.alignment));
1553     Thread discpdb = new Thread(new Runnable()
1554     {
1555       public void run()
1556       {
1557
1558         new jalview.ws.DBRefFetcher(sequences, ap.alignFrame)
1559                 .fetchDBRefs(false);
1560       }
1561
1562     });
1563     discpdb.start();
1564   }
1565
1566   public void sequenceFeature_actionPerformed()
1567   {
1568     SequenceGroup sg = ap.av.getSelectionGroup();
1569     if (sg == null)
1570     {
1571       return;
1572     }
1573
1574     int gSize = sg.getSize();
1575     SequenceI[] seqs = new SequenceI[gSize];
1576     SequenceFeature[] features = new SequenceFeature[gSize];
1577
1578     for (int i = 0; i < gSize; i++)
1579     {
1580       seqs[i] = sg.getSequenceAt(i).getDatasetSequence();
1581       int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());
1582       int end = sg.findEndRes(sg.getSequenceAt(i));
1583       features[i] = new SequenceFeature(null, null, null, start, end,
1584               "Jalview");
1585     }
1586
1587     if (ap.seqPanel.seqCanvas.getFeatureRenderer().amendFeatures(seqs,
1588             features, true, ap))
1589     {
1590       ap.alignFrame.setShowSeqFeatures(true);
1591       ap.highlightSearchResults(null);
1592     }
1593   }
1594
1595   public void textColour_actionPerformed()
1596   {
1597     SequenceGroup sg = getGroup();
1598     if (sg != null)
1599     {
1600       new TextColourChooser().chooseColour(ap, sg);
1601     }
1602   }
1603
1604   public void colourByStructure(String pdbid)
1605   {
1606     Annotation[] anots = jalview.structure.StructureSelectionManager
1607             .getStructureSelectionManager().colourSequenceFromStructure(
1608                     sequence, pdbid);
1609
1610     AlignmentAnnotation an = new AlignmentAnnotation("Structure",
1611             "Coloured by " + pdbid, anots);
1612
1613     ap.av.alignment.addAnnotation(an);
1614     an.createSequenceMapping(sequence, 0, true);
1615     // an.adjustForAlignment();
1616     ap.av.alignment.setAnnotationIndex(an, 0);
1617
1618     ap.adjustAnnotationHeight();
1619
1620     sequence.addAlignmentAnnotation(an);
1621
1622   }
1623
1624   public void editSequence_actionPerformed(ActionEvent actionEvent)
1625   {
1626     SequenceGroup sg = ap.av.getSelectionGroup();
1627
1628     if (sg != null)
1629     {
1630       if (sequence == null)
1631         sequence = (Sequence) sg.getSequenceAt(0);
1632
1633       EditNameDialog dialog = new EditNameDialog(sequence
1634               .getSequenceAsString(sg.getStartRes(), sg.getEndRes() + 1),
1635               null, "Edit Sequence ", null, "Edit Sequence");
1636
1637       if (dialog.accept)
1638       {
1639         EditCommand editCommand = new EditCommand("Edit Sequences",
1640                 EditCommand.REPLACE, dialog.getName().replace(' ',
1641                         ap.av.getGapCharacter()), sg
1642                         .getSequencesAsArray(ap.av.hiddenRepSequences), sg
1643                         .getStartRes(), sg.getEndRes() + 1, ap.av.alignment);
1644
1645         ap.alignFrame.addHistoryItem(editCommand);
1646
1647         ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
1648                 .getSequences());
1649       }
1650     }
1651   }
1652
1653 }