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