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