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