Clover icon

Coverage Report

  1. Project Clover database Wed Nov 13 2024 16:21:17 GMT
  2. Package jalview.appletgui

File APopupMenu.java

 

Coverage histogram

../../img/srcFileCovDistChart0.png
59% of files have more coverage

Code metrics

164
529
49
1
1,506
1,165
139
0.26
10.8
49
2.84

Classes

Class Line # Actions
APopupMenu 79 529 139
0.00%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ 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
10    * of the License, or (at your option) any later version.
11    *
12    * Jalview is distributed in the hope that it will be useful, but
13    * WITHOUT ANY WARRANTY; without even the implied warranty
14    * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15    * PURPOSE. See the GNU General Public License for more details.
16    *
17    * You should have received a copy of the GNU General Public License
18    * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19    * The Jalview Authors are detailed in the 'AUTHORS' file.
20    */
21    package jalview.appletgui;
22   
23    import java.awt.CheckboxMenuItem;
24    import java.awt.Frame;
25    import java.awt.Menu;
26    import java.awt.MenuItem;
27    import java.awt.event.ActionEvent;
28    import java.awt.event.ActionListener;
29    import java.awt.event.ItemEvent;
30    import java.awt.event.ItemListener;
31    import java.util.ArrayList;
32    import java.util.Arrays;
33    import java.util.Collection;
34    import java.util.Collections;
35    import java.util.LinkedHashMap;
36    import java.util.List;
37    import java.util.Map;
38    import java.util.SortedMap;
39    import java.util.TreeMap;
40    import java.util.Vector;
41   
42    import jalview.analysis.AAFrequency;
43    import jalview.analysis.AlignmentAnnotationUtils;
44    import jalview.analysis.AlignmentUtils;
45    import jalview.analysis.Conservation;
46    import jalview.bin.JalviewLite;
47    import jalview.commands.ChangeCaseCommand;
48    import jalview.commands.EditCommand;
49    import jalview.commands.EditCommand.Action;
50    import jalview.datamodel.AlignmentAnnotation;
51    import jalview.datamodel.AlignmentI;
52    import jalview.datamodel.PDBEntry;
53    import jalview.datamodel.SequenceFeature;
54    import jalview.datamodel.SequenceGroup;
55    import jalview.datamodel.SequenceI;
56    import jalview.io.AppletFormatAdapter;
57    import jalview.io.DataSourceType;
58    import jalview.io.FileFormatI;
59    import jalview.io.FileFormats;
60    import jalview.io.SequenceAnnotationReport;
61    import jalview.renderer.ResidueShader;
62    import jalview.renderer.ResidueShaderI;
63    import jalview.schemes.Blosum62ColourScheme;
64    import jalview.schemes.BuriedColourScheme;
65    import jalview.schemes.ClustalxColourScheme;
66    import jalview.schemes.HelixColourScheme;
67    import jalview.schemes.HydrophobicColourScheme;
68    import jalview.schemes.JalviewColourScheme;
69    import jalview.schemes.NucleotideColourScheme;
70    import jalview.schemes.PIDColourScheme;
71    import jalview.schemes.PurinePyrimidineColourScheme;
72    import jalview.schemes.StrandColourScheme;
73    import jalview.schemes.TaylorColourScheme;
74    import jalview.schemes.TurnColourScheme;
75    import jalview.schemes.ZappoColourScheme;
76    import jalview.util.MessageManager;
77    import jalview.util.UrlLink;
78   
 
79    public class APopupMenu extends java.awt.PopupMenu
80    implements ActionListener, ItemListener
81    {
82    Menu groupMenu = new Menu();
83   
84    MenuItem editGroupName = new MenuItem();
85   
86    CheckboxMenuItem noColour = new CheckboxMenuItem();
87   
88    protected CheckboxMenuItem clustalColour = new CheckboxMenuItem();
89   
90    protected CheckboxMenuItem zappoColour = new CheckboxMenuItem();
91   
92    protected CheckboxMenuItem taylorColour = new CheckboxMenuItem();
93   
94    protected CheckboxMenuItem hydrophobicityColour = new CheckboxMenuItem();
95   
96    protected CheckboxMenuItem helixColour = new CheckboxMenuItem();
97   
98    protected CheckboxMenuItem strandColour = new CheckboxMenuItem();
99   
100    protected CheckboxMenuItem turnColour = new CheckboxMenuItem();
101   
102    protected CheckboxMenuItem buriedColour = new CheckboxMenuItem();
103   
104    protected CheckboxMenuItem PIDColour = new CheckboxMenuItem();
105   
106    protected CheckboxMenuItem BLOSUM62Colour = new CheckboxMenuItem();
107   
108    CheckboxMenuItem nucleotideColour = new CheckboxMenuItem();
109   
110    CheckboxMenuItem purinePyrimidineColour = new CheckboxMenuItem();
111   
112    protected MenuItem userDefinedColour = new MenuItem();
113   
114    protected CheckboxMenuItem abovePIDColour = new CheckboxMenuItem();
115   
116    MenuItem modifyPID = new MenuItem();
117   
118    protected CheckboxMenuItem conservationColour = new CheckboxMenuItem();
119   
120    MenuItem modifyConservation = new MenuItem();
121   
122    MenuItem noColourmenuItem = new MenuItem();
123   
124    final AlignmentPanel ap;
125   
126    MenuItem unGroupMenuItem = new MenuItem();
127   
128    MenuItem createGroupMenuItem = new MenuItem();
129   
130    Menu colourMenu = new Menu();
131   
132    CheckboxMenuItem showBoxes = new CheckboxMenuItem();
133   
134    CheckboxMenuItem showText = new CheckboxMenuItem();
135   
136    CheckboxMenuItem showColourText = new CheckboxMenuItem();
137   
138    CheckboxMenuItem displayNonconserved = new CheckboxMenuItem();
139   
140    Menu seqShowAnnotationsMenu = new Menu(
141    MessageManager.getString("label.show_annotations"));
142   
143    Menu seqHideAnnotationsMenu = new Menu(
144    MessageManager.getString("label.hide_annotations"));
145   
146    MenuItem seqAddReferenceAnnotations = new MenuItem(
147    MessageManager.getString("label.add_reference_annotations"));
148   
149    Menu groupShowAnnotationsMenu = new Menu(
150    MessageManager.getString("label.show_annotations"));
151   
152    Menu groupHideAnnotationsMenu = new Menu(
153    MessageManager.getString("label.hide_annotations"));
154   
155    MenuItem groupAddReferenceAnnotations = new MenuItem(
156    MessageManager.getString("label.add_reference_annotations"));
157   
158    Menu editMenu = new Menu(MessageManager.getString("action.edit"));
159   
160    MenuItem copy = new MenuItem(MessageManager.getString("action.copy"));
161   
162    MenuItem cut = new MenuItem(MessageManager.getString("action.cut"));
163   
164    MenuItem toUpper = new MenuItem(
165    MessageManager.getString("label.to_upper_case"));
166   
167    MenuItem toLower = new MenuItem(
168    MessageManager.getString("label.to_lower_case"));
169   
170    MenuItem toggleCase = new MenuItem(
171    MessageManager.getString("label.toggle_case"));
172   
173    Menu outputmenu = new Menu();
174   
175    Menu seqMenu = new Menu();
176   
177    MenuItem pdb = new MenuItem();
178   
179    MenuItem hideSeqs = new MenuItem();
180   
181    MenuItem repGroup = new MenuItem();
182   
183    MenuItem sequenceName = new MenuItem(
184    MessageManager.getString("label.edit_name_description"));
185   
186    MenuItem sequenceFeature = new MenuItem(
187    MessageManager.getString("label.create_sequence_feature"));
188   
189    MenuItem editSequence = new MenuItem(
190    MessageManager.getString("label.edit_sequence"));
191   
192    MenuItem sequenceDetails = new MenuItem(
193    MessageManager.getString("label.sequence_details"));
194   
195    MenuItem selSeqDetails = new MenuItem(
196    MessageManager.getString("label.sequence_details"));
197   
198    MenuItem makeReferenceSeq = new MenuItem();
199   
200    SequenceI seq;
201   
202    MenuItem revealAll = new MenuItem();
203   
204    MenuItem revealSeq = new MenuItem();
205   
206    /**
207    * index of sequence to be revealed
208    */
209    int revealSeq_index = -1;
210   
211    Menu menu1 = new Menu();
212   
 
213  0 toggle public APopupMenu(AlignmentPanel apanel, final SequenceI seq,
214    List<String> links)
215    {
216    // /////////////////////////////////////////////////////////
217    // If this is activated from the sequence panel, the user may want to
218    // edit or annotate a particular residue. Therefore display the residue menu
219    //
220    // If from the IDPanel, we must display the sequence menu
221    // ////////////////////////////////////////////////////////
222   
223  0 this.ap = apanel;
224  0 this.seq = seq;
225   
226  0 try
227    {
228  0 jbInit();
229    } catch (Exception e)
230    {
231  0 e.printStackTrace();
232    }
233   
234  0 for (String ff : FileFormats.getInstance().getWritableFormats(true))
235    {
236  0 MenuItem item = new MenuItem(ff);
237   
238  0 item.addActionListener(this);
239  0 outputmenu.add(item);
240    }
241   
242  0 buildAnnotationSubmenus();
243   
244  0 SequenceGroup sg = ap.av.getSelectionGroup();
245  0 if (sg != null && sg.getSize() > 0)
246    {
247  0 if (sg.isNucleotide())
248    {
249  0 conservationColour.setEnabled(false);
250  0 clustalColour.setEnabled(false);
251  0 BLOSUM62Colour.setEnabled(false);
252  0 zappoColour.setEnabled(false);
253  0 taylorColour.setEnabled(false);
254  0 hydrophobicityColour.setEnabled(false);
255  0 helixColour.setEnabled(false);
256  0 strandColour.setEnabled(false);
257  0 turnColour.setEnabled(false);
258  0 buriedColour.setEnabled(false);
259    }
260    else
261    {
262  0 purinePyrimidineColour.setEnabled(false);
263  0 nucleotideColour.setEnabled(false);
264    }
265  0 editGroupName.setLabel(
266    MessageManager.formatMessage("label.name_param", new Object[]
267    { sg.getName() }));
268  0 showText.setState(sg.getDisplayText());
269  0 showColourText.setState(sg.getColourText());
270  0 showBoxes.setState(sg.getDisplayBoxes());
271  0 displayNonconserved.setState(sg.getShowNonconserved());
272  0 if (!ap.av.getAlignment().getGroups().contains(sg))
273    {
274  0 menu1.setLabel(MessageManager.getString("action.edit_new_group"));
275  0 groupMenu.remove(unGroupMenuItem);
276    }
277    else
278    {
279  0 menu1.setLabel(MessageManager.getString("action.edit_group"));
280  0 groupMenu.remove(createGroupMenuItem);
281  0 if (sg.cs != null)
282    {
283  0 abovePIDColour.setState(sg.cs.getThreshold() > 0);
284  0 conservationColour.setState(sg.cs.conservationApplied());
285  0 modifyPID.setEnabled(abovePIDColour.getState());
286  0 modifyConservation.setEnabled(conservationColour.getState());
287    }
288    }
289  0 setSelectedColour(sg.cs);
290    }
291    else
292    {
293  0 remove(hideSeqs);
294  0 remove(groupMenu);
295    }
296   
297  0 if (links != null && links.size() > 0)
298    {
299  0 addFeatureLinks(seq, links);
300    }
301   
302    // TODO: add group link menu entry here
303  0 if (seq != null)
304    {
305  0 seqMenu.setLabel(seq.getName());
306  0 if (seq == ap.av.getAlignment().getSeqrep())
307    {
308  0 makeReferenceSeq.setLabel(
309    MessageManager.getString("action.unmark_as_reference"));// Unmark
310    // representative");
311    }
312    else
313    {
314  0 makeReferenceSeq.setLabel(
315    MessageManager.getString("action.set_as_reference")); // );
316    }
317  0 repGroup.setLabel(MessageManager
318    .formatMessage("label.represent_group_with", new Object[]
319    { seq.getName() }));
320    }
321    else
322    {
323  0 remove(seqMenu);
324    }
325   
326  0 if (!ap.av.hasHiddenRows())
327    {
328  0 remove(revealAll);
329  0 remove(revealSeq);
330    }
331    else
332    {
333  0 final int index = ap.av.getAlignment().findIndex(seq);
334   
335  0 if (ap.av.adjustForHiddenSeqs(index)
336    - ap.av.adjustForHiddenSeqs(index - 1) > 1)
337    {
338  0 revealSeq_index = index;
339    }
340    else
341    {
342  0 remove(revealSeq);
343    }
344    }
345    }
346   
347    /**
348    * Select the menu item (if any) matching the current colour scheme. This
349    * works by matching the menu item name (not display text) to the canonical
350    * name of the colour scheme.
351    *
352    * @param cs
353    */
 
354  0 toggle protected void setSelectedColour(ResidueShaderI cs)
355    {
356  0 if (cs == null || cs.getColourScheme() == null)
357    {
358  0 noColour.setState(true);
359    }
360    else
361    {
362  0 String name = cs.getColourScheme().getSchemeName();
363  0 for (int i = 0; i < colourMenu.getItemCount(); i++)
364    {
365  0 MenuItem item = colourMenu.getItem(i);
366  0 if (item instanceof CheckboxMenuItem)
367    {
368  0 if (name.equals(item.getName()))
369    {
370  0 ((CheckboxMenuItem) item).setState(true);
371    }
372    }
373    }
374    }
375    }
376   
377    /**
378    * Adds a 'Link' menu item with a sub-menu item for each hyperlink provided.
379    *
380    * @param seq
381    * @param links
382    */
 
383  0 toggle void addFeatureLinks(final SequenceI seq, List<String> links)
384    {
385  0 Menu linkMenu = new Menu(MessageManager.getString("action.link"));
386  0 Map<String, List<String>> linkset = new LinkedHashMap<>();
387   
388  0 for (String link : links)
389    {
390  0 UrlLink urlLink = null;
391  0 try
392    {
393  0 urlLink = new UrlLink(link);
394    } catch (Exception foo)
395    {
396  0 jalview.bin.Console.errPrintln("Exception for URLLink '" + link
397    + "': " + foo.getMessage());
398  0 continue;
399    }
400   
401  0 if (!urlLink.isValid())
402    {
403  0 jalview.bin.Console.errPrintln(urlLink.getInvalidMessage());
404  0 continue;
405    }
406   
407  0 urlLink.createLinksFromSeq(seq, linkset);
408    }
409   
410  0 addshowLinks(linkMenu, linkset.values());
411   
412    // disable link menu if there are no valid entries
413  0 if (linkMenu.getItemCount() > 0)
414    {
415  0 linkMenu.setEnabled(true);
416    }
417    else
418    {
419  0 linkMenu.setEnabled(false);
420    }
421   
422  0 if (seq != null)
423    {
424  0 seqMenu.add(linkMenu);
425    }
426    else
427    {
428  0 add(linkMenu);
429    }
430   
431    }
432   
 
433  0 toggle private void addshowLinks(Menu linkMenu, Collection<List<String>> linkset)
434    {
435  0 for (List<String> linkstrset : linkset)
436    {
437    // split linkstr into label and url
438  0 addshowLink(linkMenu, linkstrset.get(1), linkstrset.get(3));
439    }
440    }
441   
442    /**
443    * Build menus for annotation types that may be shown or hidden, and for
444    * 'reference annotations' that may be added to the alignment.
445    */
 
446  0 toggle private void buildAnnotationSubmenus()
447    {
448    /*
449    * First for the currently selected sequence (if there is one):
450    */
451  0 final List<SequenceI> selectedSequence = (seq == null
452    ? Collections.<SequenceI> emptyList()
453    : Arrays.asList(seq));
454  0 buildAnnotationTypesMenus(seqShowAnnotationsMenu,
455    seqHideAnnotationsMenu, selectedSequence);
456  0 configureReferenceAnnotationsMenu(seqAddReferenceAnnotations,
457    selectedSequence);
458   
459    /*
460    * and repeat for the current selection group (if there is one):
461    */
462  0 final List<SequenceI> selectedGroup = (ap.av.getSelectionGroup() == null
463    ? Collections.<SequenceI> emptyList()
464    : ap.av.getSelectionGroup().getSequences());
465  0 buildAnnotationTypesMenus(groupShowAnnotationsMenu,
466    groupHideAnnotationsMenu, selectedGroup);
467  0 configureReferenceAnnotationsMenu(groupAddReferenceAnnotations,
468    selectedGroup);
469    }
470   
471    /**
472    * Determine whether or not to enable 'add reference annotations' menu item.
473    * It is enable if there are any annotations, on any of the selected
474    * sequences, which are not yet on the alignment (visible or not).
475    *
476    * @param menu
477    * @param forSequences
478    */
 
479  0 toggle private void configureReferenceAnnotationsMenu(MenuItem menuItem,
480    List<SequenceI> forSequences)
481    {
482  0 menuItem.setEnabled(false);
483   
484    /*
485    * Temporary store to hold distinct calcId / type pairs for the tooltip.
486    * Using TreeMap means calcIds are shown in alphabetical order.
487    */
488  0 SortedMap<String, String> tipEntries = new TreeMap<>();
489  0 final Map<SequenceI, List<AlignmentAnnotation>> candidates = new LinkedHashMap<>();
490  0 AlignmentI al = this.ap.av.getAlignment();
491  0 AlignmentUtils.findAddableReferenceAnnotations(forSequences, tipEntries,
492    candidates, al);
493  0 if (!candidates.isEmpty())
494    {
495  0 StringBuilder tooltip = new StringBuilder(64);
496  0 tooltip.append(MessageManager.getString("label.add_annotations_for"));
497   
498    /*
499    * Found annotations that could be added. Enable the menu item, and
500    * configure its action.
501    */
502  0 menuItem.setEnabled(true);
503   
504  0 menuItem.addActionListener(new ActionListener()
505    {
 
506  0 toggle @Override
507    public void actionPerformed(ActionEvent e)
508    {
509  0 addReferenceAnnotations_actionPerformed(candidates);
510    }
511    });
512    }
513    }
514   
515    /**
516    * Add annotations to the sequences and to the alignment.
517    *
518    * @param candidates
519    * a map whose keys are sequences on the alignment, and values a list
520    * of annotations to add to each sequence
521    */
 
522  0 toggle protected void addReferenceAnnotations_actionPerformed(
523    Map<SequenceI, List<AlignmentAnnotation>> candidates)
524    {
525  0 final SequenceGroup selectionGroup = this.ap.av.getSelectionGroup();
526  0 final AlignmentI alignment = this.ap.getAlignment();
527  0 AlignmentUtils.addReferenceAnnotations(candidates, alignment,
528    selectionGroup);
529  0 refresh();
530    }
531   
532    /**
533    * add a show URL menu item to the given linkMenu
534    *
535    * @param linkMenu
536    * @param target
537    * - menu label string
538    * @param url
539    * - url to open
540    */
 
541  0 toggle private void addshowLink(Menu linkMenu, final String target,
542    final String url)
543    {
544  0 addshowLink(linkMenu, target, target, url);
545    }
546   
547    /**
548    * add a show URL menu item to the given linkMenu
549    *
550    * @param linkMenu
551    * @param target
552    * - URL target window
553    * @param label
554    * - menu label string
555    * @param url
556    * - url to open
557    */
 
558  0 toggle private void addshowLink(Menu linkMenu, final String target,
559    final String label, final String url)
560    {
561  0 MenuItem item = new MenuItem(label);
562  0 item.addActionListener(new java.awt.event.ActionListener()
563    {
 
564  0 toggle @Override
565    public void actionPerformed(ActionEvent e)
566    {
567  0 ap.alignFrame.showURL(url, target);
568    }
569    });
570  0 linkMenu.add(item);
571    }
572   
573    /**
574    * Actions on selecting / unselecting a checkbox menu item
575    */
 
576  0 toggle @Override
577    public void itemStateChanged(ItemEvent evt)
578    {
579  0 Object source = evt.getSource();
580  0 if (source == noColour)
581    {
582  0 noColourmenuItem_actionPerformed();
583    }
584  0 else if (source == clustalColour)
585    {
586  0 clustalColour_actionPerformed();
587    }
588  0 else if (source == BLOSUM62Colour)
589    {
590  0 BLOSUM62Colour_actionPerformed();
591    }
592  0 else if (evt.getSource() == PIDColour)
593    {
594  0 PIDColour_actionPerformed();
595    }
596  0 else if (source == zappoColour)
597    {
598  0 zappoColour_actionPerformed();
599    }
600  0 else if (source == taylorColour)
601    {
602  0 taylorColour_actionPerformed();
603    }
604  0 else if (source == hydrophobicityColour)
605    {
606  0 hydrophobicityColour_actionPerformed();
607    }
608  0 else if (source == helixColour)
609    {
610  0 helixColour_actionPerformed();
611    }
612  0 else if (source == strandColour)
613    {
614  0 strandColour_actionPerformed();
615    }
616  0 else if (source == turnColour)
617    {
618  0 turnColour_actionPerformed();
619    }
620  0 else if (source == buriedColour)
621    {
622  0 buriedColour_actionPerformed();
623    }
624  0 else if (source == nucleotideColour)
625    {
626  0 nucleotideMenuItem_actionPerformed();
627    }
628  0 else if (source == purinePyrimidineColour)
629    {
630  0 purinePyrimidineColour_actionPerformed();
631    }
632  0 else if (source == abovePIDColour)
633    {
634  0 abovePIDColour_itemStateChanged();
635    }
636  0 else if (source == conservationColour)
637    {
638  0 conservationMenuItem_itemStateChanged();
639    }
640  0 else if (source == showColourText)
641    {
642  0 showColourText_itemStateChanged();
643    }
644  0 else if (source == showText)
645    {
646  0 showText_itemStateChanged();
647    }
648  0 else if (source == showBoxes)
649    {
650  0 showBoxes_itemStateChanged();
651    }
652  0 else if (source == displayNonconserved)
653    {
654  0 this.showNonconserved_itemStateChanged();
655    }
656    }
657   
658    /**
659    * Actions on clicking a menu item
660    */
 
661  0 toggle @Override
662    public void actionPerformed(ActionEvent evt)
663    {
664  0 Object source = evt.getSource();
665  0 if (source == userDefinedColour)
666    {
667  0 userDefinedColour_actionPerformed();
668    }
669  0 else if (source == modifyConservation)
670    {
671  0 conservationMenuItem_itemStateChanged();
672    }
673  0 else if (source == modifyPID)
674    {
675  0 abovePIDColour_itemStateChanged();
676    }
677  0 else if (source == unGroupMenuItem)
678    {
679  0 unGroupMenuItem_actionPerformed();
680    }
681   
682  0 else if (source == createGroupMenuItem)
683    {
684  0 createGroupMenuItem_actionPerformed();
685    }
686   
687  0 else if (source == sequenceName)
688    {
689  0 editName();
690    }
691  0 else if (source == makeReferenceSeq)
692    {
693  0 makeReferenceSeq_actionPerformed();
694    }
695  0 else if (source == sequenceDetails)
696    {
697  0 showSequenceDetails();
698    }
699  0 else if (source == selSeqDetails)
700    {
701  0 showSequenceSelectionDetails();
702    }
703  0 else if (source == pdb)
704    {
705  0 addPDB();
706    }
707  0 else if (source == hideSeqs)
708    {
709  0 hideSequences(false);
710    }
711  0 else if (source == repGroup)
712    {
713  0 hideSequences(true);
714    }
715  0 else if (source == revealSeq)
716    {
717  0 ap.av.showSequence(revealSeq_index);
718    }
719  0 else if (source == revealAll)
720    {
721  0 ap.av.showAllHiddenSeqs();
722    }
723   
724  0 else if (source == editGroupName)
725    {
726  0 EditNameDialog dialog = new EditNameDialog(getGroup().getName(),
727    getGroup().getDescription(), " Group Name",
728    "Group Description", ap.alignFrame,
729    "Edit Group Name / Description", 500, 100, true);
730   
731  0 if (dialog.accept)
732    {
733  0 getGroup().setName(dialog.getName().replace(' ', '_'));
734  0 getGroup().setDescription(dialog.getDescription());
735    }
736   
737    }
738  0 else if (source == copy)
739    {
740  0 ap.alignFrame.copy_actionPerformed();
741    }
742  0 else if (source == cut)
743    {
744  0 ap.alignFrame.cut_actionPerformed();
745    }
746  0 else if (source == editSequence)
747    {
748  0 SequenceGroup sg = ap.av.getSelectionGroup();
749   
750  0 if (sg != null)
751    {
752  0 if (seq == null)
753    {
754  0 seq = sg.getSequenceAt(0);
755    }
756   
757  0 EditNameDialog dialog = new EditNameDialog(
758    seq.getSequenceAsString(sg.getStartRes(),
759    sg.getEndRes() + 1),
760    null, "Edit Sequence ", null,
761   
762    ap.alignFrame, "Edit Sequence", 500, 100, true);
763   
764  0 if (dialog.accept)
765    {
766  0 EditCommand editCommand = new EditCommand(
767    MessageManager.getString("label.edit_sequences"),
768    Action.REPLACE,
769    dialog.getName().replace(' ', ap.av.getGapCharacter()),
770    sg.getSequencesAsArray(ap.av.getHiddenRepSequences()),
771    sg.getStartRes(), sg.getEndRes() + 1,
772    ap.av.getAlignment());
773   
774  0 ap.alignFrame.addHistoryItem(editCommand);
775   
776  0 ap.av.firePropertyChange("alignment", null,
777    ap.av.getAlignment().getSequences());
778    }
779    }
780    }
781  0 else if (source == toUpper || source == toLower || source == toggleCase)
782    {
783  0 SequenceGroup sg = ap.av.getSelectionGroup();
784  0 if (sg != null)
785    {
786  0 List<int[]> startEnd = ap.av.getVisibleRegionBoundaries(
787    sg.getStartRes(), sg.getEndRes() + 1);
788   
789  0 String description;
790  0 int caseChange;
791   
792  0 if (source == toggleCase)
793    {
794  0 description = "Toggle Case";
795  0 caseChange = ChangeCaseCommand.TOGGLE_CASE;
796    }
797  0 else if (source == toUpper)
798    {
799  0 description = "To Upper Case";
800  0 caseChange = ChangeCaseCommand.TO_UPPER;
801    }
802    else
803    {
804  0 description = "To Lower Case";
805  0 caseChange = ChangeCaseCommand.TO_LOWER;
806    }
807   
808  0 ChangeCaseCommand caseCommand = new ChangeCaseCommand(description,
809    sg.getSequencesAsArray(ap.av.getHiddenRepSequences()),
810    startEnd, caseChange);
811   
812  0 ap.alignFrame.addHistoryItem(caseCommand);
813   
814  0 ap.av.firePropertyChange("alignment", null,
815    ap.av.getAlignment().getSequences());
816   
817    }
818    }
819  0 else if (source == sequenceFeature)
820    {
821  0 SequenceGroup sg = ap.av.getSelectionGroup();
822  0 if (sg == null)
823    {
824  0 return;
825    }
826   
827  0 int gSize = sg.getSize();
828  0 List<SequenceI> seqs = new ArrayList<>();
829  0 List<SequenceFeature> features = new ArrayList<>();
830   
831  0 for (int i = 0; i < gSize; i++)
832    {
833  0 int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());
834  0 int end = sg.findEndRes(sg.getSequenceAt(i));
835  0 if (start <= end)
836    {
837  0 seqs.add(sg.getSequenceAt(i));
838  0 features.add(
839    new SequenceFeature(null, null, start, end, "Jalview"));
840    }
841    }
842   
843  0 if (!seqs.isEmpty())
844    {
845  0 if (ap.seqPanel.seqCanvas.getFeatureRenderer().amendFeatures(seqs,
846    features, true, ap))
847    {
848  0 ap.alignFrame.sequenceFeatures.setState(true);
849  0 ap.av.setShowSequenceFeatures(true);
850  0 ap.av.setSearchResults(null); // clear highlighting
851  0 ap.repaint(); // draw new/amended features
852    }
853    }
854    }
855    else
856    {
857  0 outputText(evt);
858    }
859   
860    }
861   
 
862  0 toggle void outputText(ActionEvent e)
863    {
864  0 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, ap.alignFrame);
865   
866  0 Frame frame = new Frame();
867  0 frame.add(cap);
868  0 JalviewLite.addFrame(frame, MessageManager
869    .formatMessage("label.selection_output_command", new Object[]
870    { e.getActionCommand() }), 600, 500);
871    // JBPNote: getSelectionAsNewSequence behaviour has changed - this method
872    // now returns a full copy of sequence data
873    // TODO consider using getSequenceSelection instead here
874   
875  0 FileFormatI fileFormat = FileFormats.getInstance()
876    .forName(e.getActionCommand());
877  0 cap.setText(new AppletFormatAdapter().formatSequences(fileFormat,
878    ap.av.getShowJVSuffix(), ap, true));
879   
880    }
881   
 
882  0 toggle protected void showSequenceSelectionDetails()
883    {
884  0 createSequenceDetailsReport(ap.av.getSequenceSelection());
885    }
886   
 
887  0 toggle protected void showSequenceDetails()
888    {
889  0 createSequenceDetailsReport(new SequenceI[] { seq });
890    }
891   
 
892  0 toggle public void createSequenceDetailsReport(SequenceI[] sequences)
893    {
894   
895  0 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, ap.alignFrame);
896   
897  0 StringBuilder contents = new StringBuilder(128);
898  0 for (SequenceI seq : sequences)
899    {
900  0 contents.append(MessageManager
901    .formatMessage("label.annotation_for_displayid", new Object[]
902    { seq.getDisplayId(true) }));
903  0 new SequenceAnnotationReport(false).createSequenceAnnotationReport(
904    contents, seq, true, true, ap.seqPanel.seqCanvas.fr);
905  0 contents.append("</p>");
906    }
907  0 Frame frame = new Frame();
908  0 frame.add(cap);
909  0 jalview.bin.JalviewLite.addFrame(frame,
910  0 "Sequence Details for " + (sequences.length == 1
911    ? sequences[0].getDisplayId(true)
912    : "Selection"),
913    600, 500);
914  0 cap.setText(
915    MessageManager.formatMessage("label.html_content", new Object[]
916    { contents.toString() }));
917    }
918   
 
919  0 toggle void editName()
920    {
921  0 EditNameDialog dialog = new EditNameDialog(seq.getName(),
922    seq.getDescription(), " Sequence Name",
923    "Sequence Description", ap.alignFrame,
924    "Edit Sequence Name / Description", 500, 100, true);
925   
926  0 if (dialog.accept)
927    {
928  0 seq.setName(dialog.getName());
929  0 seq.setDescription(dialog.getDescription());
930  0 ap.paintAlignment(false, false);
931    }
932    }
933   
 
934  0 toggle void addPDB()
935    {
936  0 Vector<PDBEntry> pdbs = seq.getAllPDBEntries();
937  0 if (pdbs != null && !pdbs.isEmpty())
938    {
939  0 PDBEntry entry = pdbs.firstElement();
940   
941  0 if (ap.av.applet.jmolAvailable)
942    {
943  0 new AppletJmol(entry, new SequenceI[] { seq }, null, ap,
944    DataSourceType.URL);
945    }
946    else
947    {
948  0 new mc_view.AppletPDBViewer(entry, new SequenceI[] { seq }, null,
949    ap, DataSourceType.URL);
950    }
951   
952    }
953    else
954    {
955  0 CutAndPasteTransfer cap = new CutAndPasteTransfer(true,
956    ap.alignFrame);
957  0 cap.setText(MessageManager.getString("label.paste_pdb_file"));
958  0 cap.setPDBImport(seq);
959  0 Frame frame = new Frame();
960  0 frame.add(cap);
961  0 JalviewLite.addFrame(frame, MessageManager.formatMessage(
962    "label.paste_pdb_file_for_sequence", new Object[]
963    { seq.getName() }), 400, 300);
964    }
965    }
966   
 
967  0 toggle private void jbInit() throws Exception
968    {
969  0 groupMenu.setLabel(MessageManager.getString("label.selection"));
970  0 sequenceFeature.addActionListener(this);
971   
972  0 editGroupName.addActionListener(this);
973  0 unGroupMenuItem
974    .setLabel(MessageManager.getString("action.remove_group"));
975  0 unGroupMenuItem.addActionListener(this);
976   
977  0 createGroupMenuItem
978    .setLabel(MessageManager.getString("action.create_group"));
979  0 createGroupMenuItem.addActionListener(this);
980   
981  0 modifyPID.setEnabled(abovePIDColour.getState());
982  0 modifyConservation.setEnabled(conservationColour.getState());
983  0 colourMenu.setLabel(MessageManager.getString("label.group_colour"));
984  0 showBoxes.setLabel(MessageManager.getString("action.boxes"));
985  0 showBoxes.setState(true);
986  0 showBoxes.addItemListener(this);
987  0 sequenceName.addActionListener(this);
988  0 sequenceDetails.addActionListener(this);
989  0 selSeqDetails.addActionListener(this);
990  0 displayNonconserved
991    .setLabel(MessageManager.getString("label.show_non_conserved"));
992  0 displayNonconserved.setState(false);
993  0 displayNonconserved.addItemListener(this);
994  0 showText.setLabel(MessageManager.getString("action.text"));
995  0 showText.addItemListener(this);
996  0 showColourText.setLabel(MessageManager.getString("label.colour_text"));
997  0 showColourText.addItemListener(this);
998  0 outputmenu.setLabel(MessageManager.getString("label.out_to_textbox"));
999  0 seqMenu.setLabel(MessageManager.getString("label.sequence"));
1000  0 pdb.setLabel(MessageManager.getString("label.view_pdb_structure"));
1001  0 hideSeqs.setLabel(MessageManager.getString("action.hide_sequences"));
1002  0 repGroup.setLabel(MessageManager
1003    .formatMessage("label.represent_group_with", new Object[]
1004    { "" }));
1005  0 revealAll.setLabel(MessageManager.getString("action.reveal_all"));
1006  0 revealSeq.setLabel(MessageManager.getString("action.reveal_sequences"));
1007  0 menu1.setLabel(MessageManager.getString("label.group:"));
1008  0 add(groupMenu);
1009  0 this.add(seqMenu);
1010  0 this.add(hideSeqs);
1011  0 this.add(revealSeq);
1012  0 this.add(revealAll);
1013    // groupMenu.add(selSeqDetails);
1014  0 groupMenu.add(groupShowAnnotationsMenu);
1015  0 groupMenu.add(groupHideAnnotationsMenu);
1016  0 groupMenu.add(groupAddReferenceAnnotations);
1017  0 groupMenu.add(editMenu);
1018  0 groupMenu.add(outputmenu);
1019  0 groupMenu.add(sequenceFeature);
1020  0 groupMenu.add(createGroupMenuItem);
1021  0 groupMenu.add(unGroupMenuItem);
1022  0 groupMenu.add(menu1);
1023   
1024  0 colourMenu.add(noColour);
1025  0 colourMenu.add(clustalColour);
1026  0 colourMenu.add(BLOSUM62Colour);
1027  0 colourMenu.add(PIDColour);
1028  0 colourMenu.add(zappoColour);
1029  0 colourMenu.add(taylorColour);
1030  0 colourMenu.add(hydrophobicityColour);
1031  0 colourMenu.add(helixColour);
1032  0 colourMenu.add(strandColour);
1033  0 colourMenu.add(turnColour);
1034  0 colourMenu.add(buriedColour);
1035  0 colourMenu.add(nucleotideColour);
1036  0 colourMenu.add(purinePyrimidineColour);
1037  0 colourMenu.add(userDefinedColour);
1038  0 colourMenu.addSeparator();
1039  0 colourMenu.add(conservationColour);
1040  0 colourMenu.add(modifyConservation);
1041  0 colourMenu.add(abovePIDColour);
1042  0 colourMenu.add(modifyPID);
1043   
1044  0 noColour.setLabel(MessageManager.getString("label.none"));
1045  0 noColour.addItemListener(this);
1046   
1047    /*
1048    * setName allows setSelectedColour to do its thing
1049    */
1050  0 clustalColour.setLabel(
1051    MessageManager.getString("label.colourScheme_clustal"));
1052  0 clustalColour.setName(JalviewColourScheme.Clustal.toString());
1053  0 clustalColour.addItemListener(this);
1054  0 BLOSUM62Colour.setLabel(
1055    MessageManager.getString("label.colourScheme_blosum62"));
1056  0 BLOSUM62Colour.setName(JalviewColourScheme.Blosum62.toString());
1057  0 BLOSUM62Colour.addItemListener(this);
1058  0 PIDColour.setLabel(
1059    MessageManager.getString("label.colourScheme_%identity"));
1060  0 PIDColour.setName(JalviewColourScheme.PID.toString());
1061  0 PIDColour.addItemListener(this);
1062  0 zappoColour
1063    .setLabel(MessageManager.getString("label.colourScheme_zappo"));
1064  0 zappoColour.setName(JalviewColourScheme.Zappo.toString());
1065  0 zappoColour.addItemListener(this);
1066  0 taylorColour.setLabel(
1067    MessageManager.getString("label.colourScheme_taylor"));
1068  0 taylorColour.setName(JalviewColourScheme.Taylor.toString());
1069  0 taylorColour.addItemListener(this);
1070  0 hydrophobicityColour.setLabel(
1071    MessageManager.getString("label.colourScheme_hydrophobic"));
1072  0 hydrophobicityColour
1073    .setName(JalviewColourScheme.Hydrophobic.toString());
1074  0 hydrophobicityColour.addItemListener(this);
1075  0 helixColour.setLabel(
1076    MessageManager.getString("label.colourScheme_helixpropensity"));
1077  0 helixColour.setName(JalviewColourScheme.Helix.toString());
1078  0 helixColour.addItemListener(this);
1079  0 strandColour.setLabel(MessageManager
1080    .getString("label.colourScheme_strandpropensity"));
1081  0 strandColour.setName(JalviewColourScheme.Strand.toString());
1082  0 strandColour.addItemListener(this);
1083  0 turnColour.setLabel(
1084    MessageManager.getString("label.colourScheme_turnpropensity"));
1085  0 turnColour.setName(JalviewColourScheme.Turn.toString());
1086  0 turnColour.addItemListener(this);
1087  0 buriedColour.setLabel(
1088    MessageManager.getString("label.colourScheme_buriedindex"));
1089  0 buriedColour.setName(JalviewColourScheme.Buried.toString());
1090  0 buriedColour.addItemListener(this);
1091  0 nucleotideColour.setLabel(
1092    MessageManager.getString("label.colourScheme_nucleotide"));
1093  0 nucleotideColour.setName(JalviewColourScheme.Nucleotide.toString());
1094  0 nucleotideColour.addItemListener(this);
1095  0 purinePyrimidineColour.setLabel(MessageManager
1096    .getString("label.colourScheme_purine/pyrimidine"));
1097  0 purinePyrimidineColour
1098    .setName(JalviewColourScheme.PurinePyrimidine.toString());
1099  0 purinePyrimidineColour.addItemListener(this);
1100   
1101  0 userDefinedColour
1102    .setLabel(MessageManager.getString("action.user_defined"));
1103  0 userDefinedColour.addActionListener(this);
1104   
1105  0 abovePIDColour.setLabel(
1106    MessageManager.getString("label.above_identity_threshold"));
1107  0 abovePIDColour.addItemListener(this);
1108  0 modifyPID.setLabel(
1109    MessageManager.getString("label.modify_identity_threshold"));
1110  0 modifyPID.addActionListener(this);
1111  0 conservationColour
1112    .setLabel(MessageManager.getString("action.by_conservation"));
1113  0 conservationColour.addItemListener(this);
1114  0 modifyConservation.setLabel(MessageManager
1115    .getString("label.modify_conservation_threshold"));
1116  0 modifyConservation.addActionListener(this);
1117   
1118  0 PIDColour.addActionListener(this);
1119  0 BLOSUM62Colour.addActionListener(this);
1120   
1121  0 editMenu.add(copy);
1122  0 copy.addActionListener(this);
1123  0 editMenu.add(cut);
1124  0 cut.addActionListener(this);
1125   
1126  0 editMenu.add(editSequence);
1127  0 editSequence.addActionListener(this);
1128   
1129  0 editMenu.add(toUpper);
1130  0 toUpper.addActionListener(this);
1131  0 editMenu.add(toLower);
1132  0 toLower.addActionListener(this);
1133  0 editMenu.add(toggleCase);
1134  0 seqMenu.add(seqShowAnnotationsMenu);
1135  0 seqMenu.add(seqHideAnnotationsMenu);
1136  0 seqMenu.add(seqAddReferenceAnnotations);
1137  0 seqMenu.add(sequenceName);
1138  0 seqMenu.add(makeReferenceSeq);
1139    // seqMenu.add(sequenceDetails);
1140   
1141  0 if (!ap.av.applet.useXtrnalSviewer)
1142    {
1143  0 seqMenu.add(pdb);
1144    }
1145  0 seqMenu.add(repGroup);
1146  0 menu1.add(editGroupName);
1147  0 menu1.add(colourMenu);
1148  0 menu1.add(showBoxes);
1149  0 menu1.add(showText);
1150  0 menu1.add(showColourText);
1151  0 menu1.add(displayNonconserved);
1152  0 toggleCase.addActionListener(this);
1153  0 pdb.addActionListener(this);
1154  0 hideSeqs.addActionListener(this);
1155  0 repGroup.addActionListener(this);
1156  0 revealAll.addActionListener(this);
1157  0 revealSeq.addActionListener(this);
1158  0 makeReferenceSeq.addActionListener(this);
1159    }
1160   
 
1161  0 toggle void refresh()
1162    {
1163  0 ap.paintAlignment(true, true);
1164    }
1165   
 
1166  0 toggle protected void clustalColour_actionPerformed()
1167    {
1168  0 SequenceGroup sg = getGroup();
1169  0 sg.cs = new ResidueShader(
1170    new ClustalxColourScheme(sg, ap.av.getHiddenRepSequences()));
1171  0 refresh();
1172    }
1173   
 
1174  0 toggle protected void zappoColour_actionPerformed()
1175    {
1176  0 getGroup().cs = new ResidueShader(new ZappoColourScheme());
1177  0 refresh();
1178    }
1179   
 
1180  0 toggle protected void taylorColour_actionPerformed()
1181    {
1182  0 getGroup().cs = new ResidueShader(new TaylorColourScheme());
1183  0 refresh();
1184    }
1185   
 
1186  0 toggle protected void hydrophobicityColour_actionPerformed()
1187    {
1188  0 getGroup().cs = new ResidueShader(new HydrophobicColourScheme());
1189  0 refresh();
1190    }
1191   
 
1192  0 toggle protected void helixColour_actionPerformed()
1193    {
1194  0 getGroup().cs = new ResidueShader(new HelixColourScheme());
1195  0 refresh();
1196    }
1197   
 
1198  0 toggle protected void strandColour_actionPerformed()
1199    {
1200  0 getGroup().cs = new ResidueShader(new StrandColourScheme());
1201  0 refresh();
1202    }
1203   
 
1204  0 toggle protected void turnColour_actionPerformed()
1205    {
1206  0 getGroup().cs = new ResidueShader(new TurnColourScheme());
1207  0 refresh();
1208    }
1209   
 
1210  0 toggle protected void buriedColour_actionPerformed()
1211    {
1212  0 getGroup().cs = new ResidueShader(new BuriedColourScheme());
1213  0 refresh();
1214    }
1215   
 
1216  0 toggle public void nucleotideMenuItem_actionPerformed()
1217    {
1218  0 getGroup().cs = new ResidueShader(new NucleotideColourScheme());
1219  0 refresh();
1220    }
1221   
 
1222  0 toggle public void purinePyrimidineColour_actionPerformed()
1223    {
1224  0 getGroup().cs = new ResidueShader(new PurinePyrimidineColourScheme());
1225  0 refresh();
1226    }
1227   
 
1228  0 toggle protected void abovePIDColour_itemStateChanged()
1229    {
1230  0 SequenceGroup sg = getGroup();
1231  0 if (sg.cs == null)
1232    {
1233  0 return;
1234    }
1235   
1236  0 if (abovePIDColour.getState())
1237    {
1238  0 sg.cs.setConsensus(AAFrequency.calculate(
1239    sg.getSequences(ap.av.getHiddenRepSequences()), 0,
1240    ap.av.getAlignment().getWidth()));
1241  0 int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs,
1242    getGroup().getName());
1243   
1244  0 sg.cs.setThreshold(threshold, ap.av.isIgnoreGapsConsensus());
1245   
1246  0 SliderPanel.showPIDSlider();
1247   
1248    }
1249    else
1250    // remove PIDColouring
1251    {
1252  0 SliderPanel.hidePIDSlider();
1253  0 sg.cs.setThreshold(0, ap.av.isIgnoreGapsConsensus());
1254    }
1255  0 modifyPID.setEnabled(abovePIDColour.getState());
1256  0 refresh();
1257    }
1258   
 
1259  0 toggle protected void userDefinedColour_actionPerformed()
1260    {
1261  0 new UserDefinedColours(ap, getGroup());
1262    }
1263   
 
1264  0 toggle protected void PIDColour_actionPerformed()
1265    {
1266  0 SequenceGroup sg = getGroup();
1267  0 sg.cs = new ResidueShader(new PIDColourScheme());
1268  0 sg.cs.setConsensus(AAFrequency.calculate(
1269    sg.getSequences(ap.av.getHiddenRepSequences()), 0,
1270    ap.av.getAlignment().getWidth()));
1271  0 refresh();
1272    }
1273   
 
1274  0 toggle protected void BLOSUM62Colour_actionPerformed()
1275    {
1276  0 SequenceGroup sg = getGroup();
1277   
1278  0 sg.cs = new ResidueShader(new Blosum62ColourScheme());
1279   
1280  0 sg.cs.setConsensus(AAFrequency.calculate(
1281    sg.getSequences(ap.av.getHiddenRepSequences()), 0,
1282    ap.av.getAlignment().getWidth()));
1283   
1284  0 refresh();
1285    }
1286   
 
1287  0 toggle protected void noColourmenuItem_actionPerformed()
1288    {
1289  0 getGroup().cs = null;
1290  0 refresh();
1291    }
1292   
 
1293  0 toggle protected void conservationMenuItem_itemStateChanged()
1294    {
1295  0 SequenceGroup sg = getGroup();
1296  0 if (sg.cs == null)
1297    {
1298  0 return;
1299    }
1300   
1301  0 if (conservationColour.getState())
1302    {
1303  0 Conservation conservation = Conservation.calculateConservation(
1304    "Group", sg.getSequences(ap.av.getHiddenRepSequences()), 0,
1305    ap.av.getAlignment().getWidth(), false,
1306    ap.av.getConsPercGaps(), false);
1307  0 sg.getGroupColourScheme().setConservation(conservation);
1308  0 SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());
1309  0 SliderPanel.showConservationSlider();
1310    }
1311    else
1312    // remove ConservationColouring
1313    {
1314  0 SliderPanel.hideConservationSlider();
1315  0 sg.cs.setConservation(null);
1316    }
1317  0 modifyConservation.setEnabled(conservationColour.getState());
1318  0 refresh();
1319    }
1320   
 
1321  0 toggle SequenceGroup getGroup()
1322    {
1323  0 SequenceGroup sg = ap.av.getSelectionGroup();
1324   
1325    // this method won't add a new group if it already exists
1326  0 if (sg != null)
1327    {
1328  0 ap.av.getAlignment().addGroup(sg);
1329    }
1330   
1331  0 return sg;
1332    }
1333   
 
1334  0 toggle void unGroupMenuItem_actionPerformed()
1335    {
1336  0 SequenceGroup sg = ap.av.getSelectionGroup();
1337  0 ap.av.getAlignment().deleteGroup(sg);
1338  0 ap.av.setSelectionGroup(null);
1339  0 ap.paintAlignment(true, true);
1340    }
1341   
 
1342  0 toggle void createGroupMenuItem_actionPerformed()
1343    {
1344  0 getGroup(); // implicitly create group
1345  0 refresh();
1346    }
1347   
 
1348  0 toggle public void showColourText_itemStateChanged()
1349    {
1350  0 getGroup().setColourText(showColourText.getState());
1351  0 refresh();
1352    }
1353   
 
1354  0 toggle public void showText_itemStateChanged()
1355    {
1356  0 getGroup().setDisplayText(showText.getState());
1357  0 refresh();
1358    }
1359   
 
1360  0 toggle public void makeReferenceSeq_actionPerformed()
1361    {
1362  0 if (!ap.av.getAlignment().hasSeqrep())
1363    {
1364    // initialise the display flags so the user sees something happen
1365  0 ap.av.setDisplayReferenceSeq(true);
1366  0 ap.av.setColourByReferenceSeq(true);
1367  0 ap.av.getAlignment().setSeqrep(seq);
1368    }
1369    else
1370    {
1371  0 if (ap.av.getAlignment().getSeqrep() == seq)
1372    {
1373  0 ap.av.getAlignment().setSeqrep(null);
1374    }
1375    else
1376    {
1377  0 ap.av.getAlignment().setSeqrep(seq);
1378    }
1379    }
1380  0 refresh();
1381    }
1382   
 
1383  0 toggle public void showNonconserved_itemStateChanged()
1384    {
1385  0 getGroup().setShowNonconserved(this.displayNonconserved.getState());
1386  0 refresh();
1387    }
1388   
 
1389  0 toggle public void showBoxes_itemStateChanged()
1390    {
1391  0 getGroup().setDisplayBoxes(showBoxes.getState());
1392  0 refresh();
1393    }
1394   
 
1395  0 toggle void hideSequences(boolean representGroup)
1396    {
1397  0 ap.av.hideSequences(seq, representGroup);
1398    }
1399   
1400    /**
1401    * Add annotation types to 'Show annotations' and/or 'Hide annotations' menus.
1402    * "All" is added first, followed by a separator. Then add any annotation
1403    * types associated with the current selection. Separate menus are built for
1404    * the selected sequence group (if any), and the selected sequence.
1405    * <p>
1406    * Some annotation rows are always rendered together - these can be identified
1407    * by a common graphGroup property > -1. Only one of each group will be marked
1408    * as visible (to avoid duplication of the display). For such groups we add a
1409    * composite type name, e.g.
1410    * <p>
1411    * IUPredWS (Long), IUPredWS (Short)
1412    *
1413    * @param seq
1414    */
 
1415  0 toggle protected void buildAnnotationTypesMenus(Menu showMenu, Menu hideMenu,
1416    List<SequenceI> forSequences)
1417    {
1418  0 showMenu.removeAll();
1419  0 hideMenu.removeAll();
1420   
1421  0 final List<String> all = Arrays
1422    .asList(new String[]
1423    { MessageManager.getString("label.all") });
1424  0 addAnnotationTypeToShowHide(showMenu, forSequences, "", all, true,
1425    true);
1426  0 addAnnotationTypeToShowHide(hideMenu, forSequences, "", all, true,
1427    false);
1428  0 showMenu.addSeparator();
1429  0 hideMenu.addSeparator();
1430   
1431  0 final AlignmentAnnotation[] annotations = ap.getAlignment()
1432    .getAlignmentAnnotation();
1433   
1434    /*
1435    * Find shown/hidden annotations types, distinguished by source (calcId),
1436    * and grouped by graphGroup. Using LinkedHashMap means we will retrieve in
1437    * the insertion order, which is the order of the annotations on the
1438    * alignment.
1439    */
1440  0 Map<String, List<List<String>>> shownTypes = new LinkedHashMap<>();
1441  0 Map<String, List<List<String>>> hiddenTypes = new LinkedHashMap<>();
1442  0 AlignmentAnnotationUtils.getShownHiddenTypes(shownTypes, hiddenTypes,
1443    AlignmentAnnotationUtils.asList(annotations), forSequences);
1444   
1445  0 for (String calcId : hiddenTypes.keySet())
1446    {
1447  0 for (List<String> type : hiddenTypes.get(calcId))
1448    {
1449  0 addAnnotationTypeToShowHide(showMenu, forSequences, calcId, type,
1450    false, true);
1451    }
1452    }
1453    // grey out 'show annotations' if none are hidden
1454  0 showMenu.setEnabled(!hiddenTypes.isEmpty());
1455   
1456  0 for (String calcId : shownTypes.keySet())
1457    {
1458  0 for (List<String> type : shownTypes.get(calcId))
1459    {
1460  0 addAnnotationTypeToShowHide(hideMenu, forSequences, calcId, type,
1461    false, false);
1462    }
1463    }
1464    // grey out 'hide annotations' if none are shown
1465  0 hideMenu.setEnabled(!shownTypes.isEmpty());
1466    }
1467   
1468    /**
1469    * Add one annotation type to the 'Show Annotations' or 'Hide Annotations'
1470    * menus.
1471    *
1472    * @param showOrHideMenu
1473    * the menu to add to
1474    * @param forSequences
1475    * the sequences whose annotations may be shown or hidden
1476    * @param calcId
1477    * @param types
1478    * the label to add
1479    * @param allTypes
1480    * if true this is a special label meaning 'All'
1481    * @param actionIsShow
1482    * if true, the select menu item action is to show the annotation
1483    * type, else hide
1484    */
 
1485  0 toggle protected void addAnnotationTypeToShowHide(Menu showOrHideMenu,
1486    final List<SequenceI> forSequences, String calcId,
1487    final List<String> types, final boolean allTypes,
1488    final boolean actionIsShow)
1489    {
1490  0 String label = types.toString(); // [a, b, c]
1491  0 label = label.substring(1, label.length() - 1);
1492  0 final MenuItem item = new MenuItem(label);
1493  0 item.addActionListener(new java.awt.event.ActionListener()
1494    {
 
1495  0 toggle @Override
1496    public void actionPerformed(ActionEvent e)
1497    {
1498  0 AlignmentUtils.showOrHideSequenceAnnotations(ap.getAlignment(),
1499    types, forSequences, allTypes, actionIsShow);
1500  0 refresh();
1501    }
1502    });
1503  0 showOrHideMenu.add(item);
1504    }
1505   
1506    }