56a3794e41346a750178a1460ddeb8fbef0b44f7
[jalview.git] / src / jalview / appletgui / APopupMenu.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
3  * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
4  * 
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  * 
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  * 
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
18  */
19 package jalview.appletgui;
20
21 import java.util.*;
22
23 import java.awt.*;
24 import java.awt.event.*;
25
26 import jalview.analysis.*;
27 import jalview.commands.*;
28 import jalview.datamodel.*;
29 import jalview.schemes.*;
30 import jalview.util.UrlLink;
31 import jalview.io.AppletFormatAdapter;
32
33 public class APopupMenu extends java.awt.PopupMenu implements
34         ActionListener, ItemListener
35 {
36   Menu groupMenu = new Menu();
37
38   MenuItem editGroupName = new MenuItem();
39
40   protected MenuItem clustalColour = new MenuItem();
41
42   protected MenuItem zappoColour = new MenuItem();
43
44   protected MenuItem taylorColour = new MenuItem();
45
46   protected MenuItem hydrophobicityColour = new MenuItem();
47
48   protected MenuItem helixColour = new MenuItem();
49
50   protected MenuItem strandColour = new MenuItem();
51
52   protected MenuItem turnColour = new MenuItem();
53
54   protected MenuItem buriedColour = new MenuItem();
55
56   protected CheckboxMenuItem abovePIDColour = new CheckboxMenuItem();
57
58   protected MenuItem userDefinedColour = new MenuItem();
59
60   protected MenuItem PIDColour = new MenuItem();
61
62   protected MenuItem BLOSUM62Colour = new MenuItem();
63
64   MenuItem noColourmenuItem = new MenuItem();
65
66   protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();
67
68   final AlignmentPanel ap;
69
70   MenuItem unGroupMenuItem = new MenuItem();
71
72   MenuItem nucleotideMenuItem = new MenuItem();
73
74   Menu colourMenu = new Menu();
75
76   CheckboxMenuItem showBoxes = new CheckboxMenuItem();
77
78   CheckboxMenuItem showText = new CheckboxMenuItem();
79
80   CheckboxMenuItem showColourText = new CheckboxMenuItem();
81
82   CheckboxMenuItem displayNonconserved = new CheckboxMenuItem();
83
84   Menu editMenu = new Menu("Edit");
85
86   MenuItem copy = new MenuItem("Copy (Jalview Only)");
87
88   MenuItem cut = new MenuItem("Cut (Jalview Only)");
89
90   MenuItem toUpper = new MenuItem("To Upper Case");
91
92   MenuItem toLower = new MenuItem("To Lower Case");
93
94   MenuItem toggleCase = new MenuItem("Toggle Case");
95
96   Menu outputmenu = new Menu();
97
98   Menu seqMenu = new Menu();
99
100   MenuItem pdb = new MenuItem();
101
102   MenuItem hideSeqs = new MenuItem();
103
104   MenuItem repGroup = new MenuItem();
105
106   MenuItem sequenceName = new MenuItem("Edit Name/Description");
107
108   MenuItem sequenceFeature = new MenuItem("Create Sequence Feature");
109
110   MenuItem editSequence = new MenuItem("Edit Sequence");
111
112   Sequence seq;
113
114   MenuItem revealAll = new MenuItem();
115
116   Menu menu1 = new Menu();
117
118   public APopupMenu(AlignmentPanel apanel, final Sequence seq, Vector links)
119   {
120     // /////////////////////////////////////////////////////////
121     // If this is activated from the sequence panel, the user may want to
122     // edit or annotate a particular residue. Therefore display the residue menu
123     //
124     // If from the IDPanel, we must display the sequence menu
125     // ////////////////////////////////////////////////////////
126
127     this.ap = apanel;
128     this.seq = seq;
129
130     try
131     {
132       jbInit();
133     } catch (Exception e)
134     {
135       e.printStackTrace();
136     }
137
138     for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)
139     {
140       MenuItem item = new MenuItem(
141               jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);
142
143       item.addActionListener(this);
144       outputmenu.add(item);
145     }
146
147     SequenceGroup sg = ap.av.getSelectionGroup();
148
149     if (sg != null && sg.getSize() > 0)
150     {
151       editGroupName.setLabel(sg.getName());
152       showText.setState(sg.getDisplayText());
153       showColourText.setState(sg.getColourText());
154       showBoxes.setState(sg.getDisplayBoxes());
155       displayNonconserved.setState(sg.getShowunconserved());
156       if (!ap.av.alignment.getGroups().contains(sg))
157       {
158         groupMenu.remove(unGroupMenuItem);
159       }
160
161     }
162     else
163     {
164       remove(hideSeqs);
165       remove(groupMenu);
166     }
167
168     if (links != null && links.size() > 0)
169     {
170       Menu linkMenu = new Menu("Link");
171       String link;
172       for (int i = 0; i < links.size(); i++)
173       {
174         link = links.elementAt(i).toString();
175         UrlLink urlLink = new UrlLink(link);
176         if (!urlLink.isValid())
177         {
178           System.err.println(urlLink.getInvalidMessage());
179           continue;
180         }
181         final String target = urlLink.getTarget(); // link.substring(0,
182         // link.indexOf("|"));
183         final String label = urlLink.getLabel();
184         if (urlLink.isDynamic())
185         {
186
187           // collect matching db-refs
188           DBRefEntry[] dbr = jalview.util.DBRefUtils.selectRefs(seq
189                   .getDBRef(), new String[]
190           { target });
191           // collect id string too
192           String id = seq.getName();
193           String descr = seq.getDescription();
194           if (descr != null && descr.length() < 1)
195           {
196             descr = null;
197           }
198           if (dbr != null)
199           {
200             for (int r = 0; r < dbr.length; r++)
201             {
202               if (id != null && dbr[r].getAccessionId().equals(id))
203               {
204                 // suppress duplicate link creation for the bare sequence ID
205                 // string with this link
206                 id = null;
207               }
208               // create Bare ID link for this RUL
209               String[] urls = urlLink.makeUrls(dbr[r].getAccessionId(),
210                       true);
211               if (urls != null)
212               {
213                 for (int u = 0; u < urls.length; u += 2)
214                 {
215                   addshowLink(linkMenu, label + "|" + urls[u], urls[u + 1]);
216                 }
217               }
218             }
219           }
220           if (id != null)
221           {
222             // create Bare ID link for this RUL
223             String[] urls = urlLink.makeUrls(id, true);
224             if (urls != null)
225             {
226               for (int u = 0; u < urls.length; u += 2)
227               {
228                 addshowLink(linkMenu, label, urls[u + 1]);
229               }
230             }
231             // addshowLink(linkMenu, target, url_pref + id + url_suff);
232           }
233           // Now construct URLs from description but only try to do it for regex
234           // URL links
235           if (descr != null && urlLink.getRegexReplace() != null)
236           {
237             // create link for this URL from description only if regex matches
238             String[] urls = urlLink.makeUrls(descr, true);
239             if (urls != null)
240             {
241               for (int u = 0; u < urls.length; u += 2)
242               {
243                 addshowLink(linkMenu, label, urls[u + 1]);
244               }
245             }
246           }
247         }
248         else
249         {
250           addshowLink(linkMenu, target, urlLink.getUrl_prefix()); // link.substring(link.lastIndexOf("|")+1));
251         }
252         /*
253          * final String url;
254          * 
255          * if (link.indexOf("$SEQUENCE_ID$") > -1) { // Substitute SEQUENCE_ID
256          * string and any matching database reference accessions String url_pref
257          * = link.substring(link.indexOf("|") + 1,
258          * link.indexOf("$SEQUENCE_ID$"));
259          * 
260          * String url_suff = link.substring(link.indexOf("$SEQUENCE_ID$") + 13);
261          * // collect matching db-refs DBRefEntry[] dbr =
262          * jalview.util.DBRefUtils.selectRefs(seq.getDBRef(), new
263          * String[]{target}); // collect id string too String id =
264          * seq.getName(); if (id.indexOf("|") > -1) { id =
265          * id.substring(id.lastIndexOf("|") + 1); } if (dbr!=null) { for (int
266          * r=0;r<dbr.length; r++) { if (dbr[r].getAccessionId().equals(id)) { //
267          * suppress duplicate link creation for the bare sequence ID string with
268          * this link id = null; } addshowLink(linkMenu,
269          * dbr[r].getSource()+"|"+dbr[r].getAccessionId(), target,
270          * url_pref+dbr[r].getAccessionId()+url_suff); } } if (id!=null) { //
271          * create Bare ID link for this RUL addshowLink(linkMenu, target,
272          * url_pref + id + url_suff); } } else { addshowLink(linkMenu, target,
273          * link.substring(link.lastIndexOf("|")+1)); }
274          */
275       }
276       if (linkMenu.getItemCount() > 0)
277       {
278         if (seq != null)
279         {
280           seqMenu.add(linkMenu);
281         }
282         else
283         {
284           add(linkMenu);
285         }
286       }
287     }
288     if (seq != null)
289     {
290       seqMenu.setLabel(seq.getName());
291       repGroup.setLabel("Represent Group with " + seq.getName());
292     }
293     else
294     {
295       remove(seqMenu);
296     }
297
298     if (!ap.av.hasHiddenRows)
299     {
300       remove(revealAll);
301     }
302   }
303
304   /**
305    * add a show URL menu item to the given linkMenu
306    * 
307    * @param linkMenu
308    * @param target
309    *          - menu label string
310    * @param url
311    *          - url to open
312    */
313   private void addshowLink(Menu linkMenu, final String target,
314           final String url)
315   {
316     addshowLink(linkMenu, target, target, url);
317   }
318
319   /**
320    * add a show URL menu item to the given linkMenu
321    * 
322    * @param linkMenu
323    * @param target
324    *          - URL target window
325    * @param label
326    *          - menu label string
327    * @param url
328    *          - url to open
329    */
330   private void addshowLink(Menu linkMenu, final String target,
331           final String label, final String url)
332   {
333     MenuItem item = new MenuItem(label);
334     item.addActionListener(new java.awt.event.ActionListener()
335     {
336       public void actionPerformed(ActionEvent e)
337       {
338         ap.alignFrame.showURL(url, target);
339       }
340     });
341     linkMenu.add(item);
342   }
343
344   public void itemStateChanged(ItemEvent evt)
345   {
346     if (evt.getSource() == abovePIDColour)
347     {
348       abovePIDColour_itemStateChanged();
349     }
350     else if (evt.getSource() == showColourText)
351     {
352       showColourText_itemStateChanged();
353     }
354     else if (evt.getSource() == showText)
355     {
356       showText_itemStateChanged();
357     }
358     else if (evt.getSource() == showBoxes)
359     {
360       showBoxes_itemStateChanged();
361     }
362     else if (evt.getSource() == displayNonconserved)
363     {
364       this.showNonconserved_itemStateChanged();
365     }
366   }
367
368   public void actionPerformed(ActionEvent evt)
369   {
370     Object source = evt.getSource();
371     if (source == clustalColour)
372     {
373       clustalColour_actionPerformed();
374     }
375     else if (source == zappoColour)
376     {
377       zappoColour_actionPerformed();
378     }
379     else if (source == taylorColour)
380     {
381       taylorColour_actionPerformed();
382     }
383     else if (source == hydrophobicityColour)
384     {
385       hydrophobicityColour_actionPerformed();
386     }
387     else if (source == helixColour)
388     {
389       helixColour_actionPerformed();
390     }
391     else if (source == strandColour)
392     {
393       strandColour_actionPerformed();
394     }
395     else if (source == turnColour)
396     {
397       turnColour_actionPerformed();
398     }
399     else if (source == buriedColour)
400     {
401       buriedColour_actionPerformed();
402     }
403     else if (source == nucleotideMenuItem)
404     {
405       nucleotideMenuItem_actionPerformed();
406     }
407
408     else if (source == userDefinedColour)
409     {
410       userDefinedColour_actionPerformed();
411     }
412     else if (source == PIDColour)
413     {
414       PIDColour_actionPerformed();
415     }
416     else if (source == BLOSUM62Colour)
417     {
418       BLOSUM62Colour_actionPerformed();
419     }
420     else if (source == noColourmenuItem)
421     {
422       noColourmenuItem_actionPerformed();
423     }
424     else if (source == conservationMenuItem)
425     {
426       conservationMenuItem_itemStateChanged();
427     }
428     else if (source == unGroupMenuItem)
429     {
430       unGroupMenuItem_actionPerformed();
431     }
432
433     else if (source == sequenceName)
434     {
435       editName();
436     }
437     else if (source == pdb)
438     {
439       addPDB();
440     }
441     else if (source == hideSeqs)
442     {
443       hideSequences(false);
444     }
445     else if (source == repGroup)
446     {
447       hideSequences(true);
448     }
449     else if (source == revealAll)
450     {
451       ap.av.showAllHiddenSeqs();
452     }
453
454     else if (source == editGroupName)
455     {
456       EditNameDialog dialog = new EditNameDialog(getGroup().getName(),
457               getGroup().getDescription(), "       Group Name",
458               "Group Description", ap.alignFrame,
459               "Edit Group Name / Description", 500, 100, true);
460
461       if (dialog.accept)
462       {
463         getGroup().setName(dialog.getName().replace(' ', '_'));
464         getGroup().setDescription(dialog.getDescription());
465       }
466
467     }
468     else if (source == copy)
469     {
470       ap.alignFrame.copy_actionPerformed();
471     }
472     else if (source == cut)
473     {
474       ap.alignFrame.cut_actionPerformed();
475     }
476     else if (source == editSequence)
477     {
478       SequenceGroup sg = ap.av.getSelectionGroup();
479
480       if (sg != null)
481       {
482         if (seq == null)
483           seq = (Sequence) sg.getSequenceAt(0);
484
485         EditNameDialog dialog = new EditNameDialog(seq.getSequenceAsString(
486                 sg.getStartRes(), sg.getEndRes() + 1), null,
487                 "Edit Sequence ", null,
488
489                 ap.alignFrame, "Edit Sequence", 500, 100, true);
490
491         if (dialog.accept)
492         {
493           EditCommand editCommand = new EditCommand("Edit Sequences",
494                   EditCommand.REPLACE, dialog.getName().replace(' ',
495                           ap.av.getGapCharacter()), sg
496                           .getSequencesAsArray(ap.av.hiddenRepSequences),
497                   sg.getStartRes(), sg.getEndRes() + 1, ap.av.alignment);
498
499           ap.alignFrame.addHistoryItem(editCommand);
500
501           ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
502                   .getSequences());
503         }
504       }
505     }
506     else if (source == toUpper || source == toLower || source == toggleCase)
507     {
508       SequenceGroup sg = ap.av.getSelectionGroup();
509       Vector regions = new Vector();
510       if (sg != null)
511       {
512         int start = sg.getStartRes();
513         int end = sg.getEndRes() + 1;
514
515         do
516         {
517           if (ap.av.hasHiddenColumns)
518           {
519             if (start == 0)
520             {
521               start = ap.av.colSel.adjustForHiddenColumns(start);
522             }
523
524             end = ap.av.colSel.getHiddenBoundaryRight(start);
525             if (start == end)
526             {
527               end = sg.getEndRes() + 1;
528             }
529             if (end > sg.getEndRes())
530             {
531               end = sg.getEndRes() + 1;
532             }
533           }
534
535           regions.addElement(new int[]
536           { start, end });
537
538           if (ap.av.hasHiddenColumns)
539           {
540             start = ap.av.colSel.adjustForHiddenColumns(end);
541             start = ap.av.colSel.getHiddenBoundaryLeft(start) + 1;
542           }
543         } while (end < sg.getEndRes());
544
545         int[][] startEnd = new int[regions.size()][2];
546         for (int i = 0; i < regions.size(); i++)
547         {
548           startEnd[i] = (int[]) regions.elementAt(i);
549         }
550
551         String description;
552         int caseChange;
553
554         if (source == toggleCase)
555         {
556           description = "Toggle Case";
557           caseChange = ChangeCaseCommand.TOGGLE_CASE;
558         }
559         else if (source == toUpper)
560         {
561           description = "To Upper Case";
562           caseChange = ChangeCaseCommand.TO_UPPER;
563         }
564         else
565         {
566           description = "To Lower Case";
567           caseChange = ChangeCaseCommand.TO_LOWER;
568         }
569
570         ChangeCaseCommand caseCommand = new ChangeCaseCommand(description,
571                 sg.getSequencesAsArray(ap.av.hiddenRepSequences), startEnd,
572                 caseChange);
573
574         ap.alignFrame.addHistoryItem(caseCommand);
575
576         ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
577                 .getSequences());
578
579       }
580     }
581     else if (source == sequenceFeature)
582     {
583       SequenceGroup sg = ap.av.getSelectionGroup();
584       if (sg == null)
585       {
586         return;
587       }
588
589       
590       int rsize=0,gSize = sg.getSize();
591       SequenceI[] rseqs,seqs = new SequenceI[gSize];
592       SequenceFeature[] tfeatures,features = new SequenceFeature[gSize];
593       
594       for (int i = 0; i < gSize; i++)
595       {
596         int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());
597         int end = sg.findEndRes(sg.getSequenceAt(i));
598         if (start<=end)
599         {
600           seqs[rsize] = sg.getSequenceAt(i);
601           features[rsize] = new SequenceFeature(null, null, null, start, end,
602                 "Jalview");
603           rsize++;
604         }
605       }
606       rseqs = new SequenceI[rsize];
607       tfeatures = new SequenceFeature[rsize];
608       System.arraycopy(seqs,0,rseqs, 0, rsize);
609       System.arraycopy(features, 0, tfeatures, 0, rsize);
610       features = tfeatures;
611       seqs = rseqs;
612
613       if (ap.seqPanel.seqCanvas.getFeatureRenderer().amendFeatures(seqs,
614               features, true, ap))
615       {
616         ap.alignFrame.sequenceFeatures.setState(true);
617         ap.av.showSequenceFeatures(true);
618         ap.highlightSearchResults(null);
619       }
620     }
621     else
622     {
623       outputText(evt);
624     }
625
626   }
627
628   void outputText(ActionEvent e)
629   {
630     CutAndPasteTransfer cap = new CutAndPasteTransfer(true, ap.alignFrame);
631
632     Frame frame = new Frame();
633     frame.add(cap);
634     jalview.bin.JalviewLite.addFrame(frame, "Selection output - "
635             + e.getActionCommand(), 600, 500);
636
637     cap.setText(new jalview.io.AppletFormatAdapter().formatSequences(e
638             .getActionCommand(), new Alignment(ap.av
639             .getSelectionAsNewSequence()), ap.av.showJVSuffix));
640
641   }
642
643   void editName()
644   {
645     EditNameDialog dialog = new EditNameDialog(seq.getName(), seq
646             .getDescription(), "       Sequence Name",
647             "Sequence Description", ap.alignFrame,
648             "Edit Sequence Name / Description", 500, 100, true);
649
650     if (dialog.accept)
651     {
652       seq.setName(dialog.getName());
653       seq.setDescription(dialog.getDescription());
654       ap.paintAlignment(false);
655     }
656   }
657
658   void addPDB()
659   {
660     if (seq.getPDBId() != null)
661     {
662       PDBEntry entry = (PDBEntry) seq.getPDBId().firstElement();
663
664       if (ap.av.applet.jmolAvailable)
665         new jalview.appletgui.AppletJmol(entry, new Sequence[]
666         { seq }, null, ap, AppletFormatAdapter.URL);
667       else
668         new MCview.AppletPDBViewer(entry, new Sequence[]
669         { seq }, null, ap, AppletFormatAdapter.URL);
670
671     }
672     else
673     {
674       CutAndPasteTransfer cap = new CutAndPasteTransfer(true, ap.alignFrame);
675       cap.setText("Paste your PDB file here.");
676       cap.setPDBImport(seq);
677       Frame frame = new Frame();
678       frame.add(cap);
679       jalview.bin.JalviewLite.addFrame(frame, "Paste PDB file ", 400, 300);
680     }
681   }
682
683   private void jbInit() throws Exception
684   {
685     groupMenu.setLabel("Group");
686     groupMenu.setLabel("Selection");
687     sequenceFeature.addActionListener(this);
688
689     editGroupName.addActionListener(this);
690     unGroupMenuItem.setLabel("Remove Group");
691     unGroupMenuItem.addActionListener(this);
692
693     nucleotideMenuItem.setLabel("Nucleotide");
694     nucleotideMenuItem.addActionListener(this);
695     conservationMenuItem.addItemListener(this);
696     abovePIDColour.addItemListener(this);
697     colourMenu.setLabel("Group Colour");
698     showBoxes.setLabel("Boxes");
699     showBoxes.setState(true);
700     showBoxes.addItemListener(this);
701     sequenceName.addActionListener(this);
702     displayNonconserved.setLabel("Show Nonconserved");
703     displayNonconserved.setState(false);
704     displayNonconserved.addItemListener(this);
705     showText.setLabel("Text");
706     showText.addItemListener(this);
707     showColourText.setLabel("Colour Text");
708     showColourText.addItemListener(this);
709     outputmenu.setLabel("Output to Textbox...");
710     seqMenu.setLabel("Sequence");
711     pdb.setLabel("View PDB Structure");
712     hideSeqs.setLabel("Hide Sequences");
713     repGroup.setLabel("Represent Group with");
714     revealAll.setLabel("Reveal All");
715     menu1.setLabel("Group");
716     add(groupMenu);
717     this.add(seqMenu);
718     this.add(hideSeqs);
719     this.add(revealAll);
720     groupMenu.add(editGroupName);
721     groupMenu.add(editMenu);
722     groupMenu.add(outputmenu);
723     groupMenu.add(sequenceFeature);
724     groupMenu.add(menu1);
725
726     colourMenu.add(noColourmenuItem);
727     colourMenu.add(clustalColour);
728     colourMenu.add(BLOSUM62Colour);
729     colourMenu.add(PIDColour);
730     colourMenu.add(zappoColour);
731     colourMenu.add(taylorColour);
732     colourMenu.add(hydrophobicityColour);
733     colourMenu.add(helixColour);
734     colourMenu.add(strandColour);
735     colourMenu.add(turnColour);
736     colourMenu.add(buriedColour);
737     colourMenu.add(nucleotideMenuItem);
738     colourMenu.add(userDefinedColour);
739     colourMenu.addSeparator();
740     colourMenu.add(abovePIDColour);
741     colourMenu.add(conservationMenuItem);
742
743     noColourmenuItem.setLabel("None");
744     noColourmenuItem.addActionListener(this);
745
746     clustalColour.setLabel("Clustalx colours");
747     clustalColour.addActionListener(this);
748     zappoColour.setLabel("Zappo");
749     zappoColour.addActionListener(this);
750     taylorColour.setLabel("Taylor");
751     taylorColour.addActionListener(this);
752     hydrophobicityColour.setLabel("Hydrophobicity");
753     hydrophobicityColour.addActionListener(this);
754     helixColour.setLabel("Helix propensity");
755     helixColour.addActionListener(this);
756     strandColour.setLabel("Strand propensity");
757     strandColour.addActionListener(this);
758     turnColour.setLabel("Turn propensity");
759     turnColour.addActionListener(this);
760     buriedColour.setLabel("Buried Index");
761     buriedColour.addActionListener(this);
762     abovePIDColour.setLabel("Above % Identity");
763
764     userDefinedColour.setLabel("User Defined");
765     userDefinedColour.addActionListener(this);
766     PIDColour.setLabel("Percentage Identity");
767     PIDColour.addActionListener(this);
768     BLOSUM62Colour.setLabel("BLOSUM62");
769     BLOSUM62Colour.addActionListener(this);
770     conservationMenuItem.setLabel("Conservation");
771
772     editMenu.add(copy);
773     copy.addActionListener(this);
774     editMenu.add(cut);
775     cut.addActionListener(this);
776
777     editMenu.add(editSequence);
778     editSequence.addActionListener(this);
779
780     editMenu.add(toUpper);
781     toUpper.addActionListener(this);
782     editMenu.add(toLower);
783     toLower.addActionListener(this);
784     editMenu.add(toggleCase);
785     seqMenu.add(sequenceName);
786     seqMenu.add(pdb);
787     seqMenu.add(repGroup);
788     menu1.add(unGroupMenuItem);
789     menu1.add(colourMenu);
790     menu1.add(showBoxes);
791     menu1.add(showText);
792     menu1.add(showColourText);
793     menu1.add(displayNonconserved);
794     toggleCase.addActionListener(this);
795     pdb.addActionListener(this);
796     hideSeqs.addActionListener(this);
797     repGroup.addActionListener(this);
798     revealAll.addActionListener(this);
799   }
800
801   void refresh()
802   {
803     ap.paintAlignment(true);
804   }
805
806   protected void clustalColour_actionPerformed()
807   {
808     SequenceGroup sg = getGroup();
809     sg.cs = new ClustalxColourScheme(sg
810             .getSequences(ap.av.hiddenRepSequences), ap.av.alignment
811             .getWidth());
812     refresh();
813   }
814
815   protected void zappoColour_actionPerformed()
816   {
817     getGroup().cs = new ZappoColourScheme();
818     refresh();
819   }
820
821   protected void taylorColour_actionPerformed()
822   {
823     getGroup().cs = new TaylorColourScheme();
824     refresh();
825   }
826
827   protected void hydrophobicityColour_actionPerformed()
828   {
829     getGroup().cs = new HydrophobicColourScheme();
830     refresh();
831   }
832
833   protected void helixColour_actionPerformed()
834   {
835     getGroup().cs = new HelixColourScheme();
836     refresh();
837   }
838
839   protected void strandColour_actionPerformed()
840   {
841     getGroup().cs = new StrandColourScheme();
842     refresh();
843   }
844
845   protected void turnColour_actionPerformed()
846   {
847     getGroup().cs = new TurnColourScheme();
848     refresh();
849   }
850
851   protected void buriedColour_actionPerformed()
852   {
853     getGroup().cs = new BuriedColourScheme();
854     refresh();
855   }
856
857   public void nucleotideMenuItem_actionPerformed()
858   {
859     getGroup().cs = new NucleotideColourScheme();
860     refresh();
861   }
862
863   protected void abovePIDColour_itemStateChanged()
864   {
865     SequenceGroup sg = getGroup();
866     if (sg.cs == null)
867     {
868       return;
869     }
870
871     if (abovePIDColour.getState())
872     {
873       sg.cs.setConsensus(AAFrequency.calculate(sg
874               .getSequences(ap.av.hiddenRepSequences), 0, ap.av.alignment
875               .getWidth()));
876       int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup()
877               .getName());
878
879       sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());
880
881       SliderPanel.showPIDSlider();
882
883     }
884     else
885     // remove PIDColouring
886     {
887       sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());
888     }
889
890     refresh();
891
892   }
893
894   protected void userDefinedColour_actionPerformed()
895   {
896     new UserDefinedColours(ap, getGroup());
897   }
898
899   protected void PIDColour_actionPerformed()
900   {
901     SequenceGroup sg = getGroup();
902     sg.cs = new PIDColourScheme();
903     sg.cs.setConsensus(AAFrequency.calculate(sg
904             .getSequences(ap.av.hiddenRepSequences), 0, ap.av.alignment
905             .getWidth()));
906     refresh();
907   }
908
909   protected void BLOSUM62Colour_actionPerformed()
910   {
911     SequenceGroup sg = getGroup();
912
913     sg.cs = new Blosum62ColourScheme();
914
915     sg.cs.setConsensus(AAFrequency.calculate(sg
916             .getSequences(ap.av.hiddenRepSequences), 0, ap.av.alignment
917             .getWidth()));
918
919     refresh();
920   }
921
922   protected void noColourmenuItem_actionPerformed()
923   {
924     getGroup().cs = null;
925     refresh();
926   }
927
928   protected void conservationMenuItem_itemStateChanged()
929   {
930     SequenceGroup sg = getGroup();
931     if (sg.cs == null)
932     {
933       return;
934     }
935
936     if (conservationMenuItem.getState())
937     {
938
939       Conservation c = new Conservation("Group",
940               ResidueProperties.propHash, 3, sg
941                       .getSequences(ap.av.hiddenRepSequences), 0,
942               ap.av.alignment.getWidth());
943
944       c.calculate();
945       c.verdict(false, ap.av.ConsPercGaps);
946
947       sg.cs.setConservation(c);
948
949       SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());
950       SliderPanel.showConservationSlider();
951     }
952     else
953     // remove ConservationColouring
954     {
955       sg.cs.setConservation(null);
956     }
957
958     refresh();
959   }
960
961   SequenceGroup getGroup()
962   {
963     SequenceGroup sg = ap.av.getSelectionGroup();
964
965     // this method won't add a new group if it already exists
966     if (sg != null)
967     {
968       ap.av.alignment.addGroup(sg);
969     }
970
971     return sg;
972   }
973
974   void unGroupMenuItem_actionPerformed()
975   {
976     SequenceGroup sg = ap.av.getSelectionGroup();
977     ap.av.alignment.deleteGroup(sg);
978     ap.av.setSelectionGroup(null);
979     ap.paintAlignment(true);
980   }
981
982   public void showColourText_itemStateChanged()
983   {
984     getGroup().setColourText(showColourText.getState());
985     refresh();
986   }
987
988   public void showText_itemStateChanged()
989   {
990     getGroup().setDisplayText(showText.getState());
991     refresh();
992   }
993
994   public void showNonconserved_itemStateChanged()
995   {
996     getGroup().setShowunconserved(this.displayNonconserved.getState());
997     refresh();
998   }
999
1000   public void showBoxes_itemStateChanged()
1001   {
1002     getGroup().setDisplayBoxes(showBoxes.getState());
1003     refresh();
1004   }
1005
1006   void hideSequences(boolean representGroup)
1007   {
1008     SequenceGroup sg = ap.av.getSelectionGroup();
1009     if (sg == null || sg.getSize() < 1)
1010     {
1011       ap.av.hideSequence(new SequenceI[]
1012       { seq });
1013       return;
1014     }
1015
1016     ap.av.setSelectionGroup(null);
1017
1018     if (representGroup)
1019     {
1020       ap.av.hideRepSequences(seq, sg);
1021
1022       return;
1023     }
1024
1025     int gsize = sg.getSize();
1026     SequenceI[] hseqs;
1027
1028     hseqs = new SequenceI[gsize];
1029
1030     int index = 0;
1031     for (int i = 0; i < gsize; i++)
1032     {
1033       hseqs[index++] = sg.getSequenceAt(i);
1034     }
1035
1036     ap.av.hideSequence(hseqs);
1037   }
1038
1039 }