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