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