X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FPopupMenu.java;h=78c159257dda91e618202bc33c82dff99af1a652;hb=refs%2Fheads%2Ffeatures%2FJAL-1264_showHideAnnotations;hp=67bc00f3be024780d53242348bdb3036484d6a05;hpb=b2f9a8d7bce642ff4011bc6d49e02bb0569fbb11;p=jalview.git diff --git a/src/jalview/gui/PopupMenu.java b/src/jalview/gui/PopupMenu.java index 67bc00f..78c1592 100644 --- a/src/jalview/gui/PopupMenu.java +++ b/src/jalview/gui/PopupMenu.java @@ -1,40 +1,82 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1) + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2) * Copyright (C) 2014 The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with Jalview. If not, see . + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.gui; -import java.util.*; - -import java.awt.*; -import java.awt.event.*; - -import javax.swing.*; - -import jalview.analysis.*; -import jalview.commands.*; -import jalview.datamodel.*; -import jalview.io.*; -import jalview.schemes.*; +import jalview.analysis.AAFrequency; +import jalview.analysis.Conservation; +import jalview.commands.ChangeCaseCommand; +import jalview.commands.EditCommand; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.Annotation; +import jalview.datamodel.DBRefEntry; +import jalview.datamodel.PDBEntry; +import jalview.datamodel.Sequence; +import jalview.datamodel.SequenceFeature; +import jalview.datamodel.SequenceGroup; +import jalview.datamodel.SequenceI; +import jalview.io.FormatAdapter; +import jalview.io.SequenceAnnotationReport; +import jalview.renderer.AnnotationRenderer; +import jalview.schemes.AnnotationColourGradient; +import jalview.schemes.Blosum62ColourScheme; +import jalview.schemes.BuriedColourScheme; +import jalview.schemes.ClustalxColourScheme; +import jalview.schemes.HelixColourScheme; +import jalview.schemes.HydrophobicColourScheme; +import jalview.schemes.NucleotideColourScheme; +import jalview.schemes.PIDColourScheme; +import jalview.schemes.PurinePyrimidineColourScheme; +import jalview.schemes.ResidueProperties; +import jalview.schemes.StrandColourScheme; +import jalview.schemes.TaylorColourScheme; +import jalview.schemes.TurnColourScheme; +import jalview.schemes.UserColourScheme; +import jalview.schemes.ZappoColourScheme; import jalview.util.GroupUrlLink; import jalview.util.GroupUrlLink.UrlStringTooLongException; -import jalview.util.MessageManager; +import jalview.util.MessageManager; import jalview.util.UrlLink; +import java.awt.Color; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.BitSet; +import java.util.Collection; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; +import java.util.Vector; + +import javax.swing.ButtonGroup; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JColorChooser; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPopupMenu; +import javax.swing.JRadioButtonMenuItem; + /** * DOCUMENT ME! * @@ -43,6 +85,10 @@ import jalview.util.UrlLink; */ public class PopupMenu extends JPopupMenu { + private static final String ALL_ANNOTATIONS = "All"; + + private static final String COMMA = ","; + JMenu groupMenu = new JMenu(); JMenuItem groupName = new JMenuItem(); @@ -73,6 +119,8 @@ public class PopupMenu extends JPopupMenu protected JRadioButtonMenuItem purinePyrimidineColour = new JRadioButtonMenuItem(); + protected JRadioButtonMenuItem RNAInteractionColour = new JRadioButtonMenuItem(); + // protected JRadioButtonMenuItem covariationColour = new // JRadioButtonMenuItem(); @@ -90,8 +138,12 @@ public class PopupMenu extends JPopupMenu JMenuItem sequenceSelDetails = new JMenuItem(); + JMenuItem chooseAnnotations = new JMenuItem(); + SequenceI sequence; + JMenuItem createGroupMenuItem = new JMenuItem(); + JMenuItem unGroupMenuItem = new JMenuItem(); JMenuItem outline = new JMenuItem(); @@ -124,12 +176,24 @@ public class PopupMenu extends JPopupMenu JMenuItem pdbFromFile = new JMenuItem(); + // JBPNote: Commented these out - Should add these services via the web + // services menu system. + // JMenuItem ContraFold = new JMenuItem(); + + // JMenuItem RNAFold = new JMenuItem(); + JMenuItem enterPDB = new JMenuItem(); JMenuItem discoverPDB = new JMenuItem(); JMenu outputMenu = new JMenu(); + JMenu showAnnotationsMenu = new JMenu(); + + JMenu hideAnnotationsMenu = new JMenu(); + + JMenuItem addDatasequenceAnnotations = new JMenuItem(); + JMenuItem sequenceFeature = new JMenuItem(); JMenuItem textColour = new JMenuItem(); @@ -194,6 +258,7 @@ public class PopupMenu extends JPopupMenu colours.add(PIDColour); colours.add(BLOSUM62Colour); colours.add(purinePyrimidineColour); + colours.add(RNAInteractionColour); // colours.add(covariationColour); for (int i = 0; i < jalview.io.FormatAdapter.WRITEABLE_FORMATS.length; i++) @@ -203,6 +268,7 @@ public class PopupMenu extends JPopupMenu item.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { outputText_actionPerformed(e); @@ -212,6 +278,11 @@ public class PopupMenu extends JPopupMenu outputMenu.add(item); } + /* + * Build menus for annotation types that may be shown or hidden. + */ + buildAnnotationTypesMenus(); + try { jbInit(); @@ -237,17 +308,19 @@ public class PopupMenu extends JPopupMenu menuItem = new JMenuItem(); menuItem.setText(pdb.getId()); - menuItem.addActionListener(new java.awt.event.ActionListener() + menuItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - // TODO re JAL-860: optionally open dialog or provide a menu entry - // allowing user to open just one structure per sequence - new AppJmol(pdb, ap.av.collateForPDB(new PDBEntry[] - { pdb })[0], null, ap); - // new PDBViewer(pdb, seqs2, null, ap, AppletFormatAdapter.FILE); + @Override + public void actionPerformed(ActionEvent e) { + // TODO re JAL-860: optionally open dialog or provide a menu entry + // allowing user to open just one structure per sequence + // new AppJmol(pdb, ap.av.collateForPDB(new PDBEntry[] + // { pdb })[0], null, ap); + new StructureViewer(ap.getStructureSelectionManager()) + .viewStructures(pdb, + ap.av.collateForPDB(new PDBEntry[] + { pdb })[0], null, ap); } - }); viewStructureMenu.add(menuItem); @@ -280,13 +353,28 @@ public class PopupMenu extends JPopupMenu final String rnastruc = aa[i].getRNAStruc(); final String structureLine = aa[i].label; menuItem = new JMenuItem(); - menuItem.setText(MessageManager.formatMessage("label.2d_rna_structure_line", new String[]{structureLine})); + menuItem.setText(MessageManager.formatMessage( + "label.2d_rna_structure_line", new String[] + { structureLine })); menuItem.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { + // System.out.println("1:"+structureLine); + System.out.println("1:sname" + seq.getName()); + System.out.println("2:seq" + seq); + + // System.out.println("3:"+seq.getSequenceAsString()); + System.out.println("3:strucseq" + rnastruc); + // System.out.println("4:struc"+seq.getRNA()); + System.out.println("5:name" + seq.getName()); + System.out.println("6:ap" + ap); new AppVarna(structureLine, seq, seq.getSequenceAsString(), rnastruc, seq.getName(), ap); + // new AppVarna(seq.getName(),seq,rnastruc,seq.getRNA(), + // seq.getName(), ap); + System.out.println("end"); } }); viewStructureMenu.add(menuItem); @@ -306,12 +394,16 @@ public class PopupMenu extends JPopupMenu // TODO: make rnastrucF a bit more nice menuItem = new JMenuItem(); - menuItem.setText(MessageManager.formatMessage("label.2d_rna_sequence_name", new String[]{seq.getName()})); + menuItem.setText(MessageManager.formatMessage( + "label.2d_rna_sequence_name", new String[] + { seq.getName() })); menuItem.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { // TODO: VARNA does'nt print gaps in the sequence + new AppVarna(seq.getName() + " structure", seq, seq .getSequenceAsString(), rnastruc, seq.getName(), ap); @@ -324,9 +416,11 @@ public class PopupMenu extends JPopupMenu } - menuItem = new JMenuItem(MessageManager.getString("action.hide_sequences")); + menuItem = new JMenuItem( + MessageManager.getString("action.hide_sequences")); menuItem.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { hideSequences(false); @@ -337,9 +431,12 @@ public class PopupMenu extends JPopupMenu if (ap.av.getSelectionGroup() != null && ap.av.getSelectionGroup().getSize() > 1) { - menuItem = new JMenuItem(MessageManager.formatMessage("label.represent_group_with", new String[]{seq.getName()})); + menuItem = new JMenuItem(MessageManager.formatMessage( + "label.represent_group_with", new String[] + { seq.getName() })); menuItem.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { hideSequences(true); @@ -355,9 +452,11 @@ public class PopupMenu extends JPopupMenu if (ap.av.adjustForHiddenSeqs(index) - ap.av.adjustForHiddenSeqs(index - 1) > 1) { - menuItem = new JMenuItem(MessageManager.getString("action.reveal_sequences")); + menuItem = new JMenuItem( + MessageManager.getString("action.reveal_sequences")); menuItem.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { ap.av.showSequence(index); @@ -375,9 +474,11 @@ public class PopupMenu extends JPopupMenu if (ap.av.hasHiddenRows()) { { - menuItem = new JMenuItem(MessageManager.getString("action.reveal_all")); + menuItem = new JMenuItem( + MessageManager.getString("action.reveal_all")); menuItem.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { ap.av.showAllHiddenSeqs(); @@ -394,12 +495,16 @@ public class PopupMenu extends JPopupMenu } SequenceGroup sg = ap.av.getSelectionGroup(); - boolean isDefinedGroup = (sg!=null) ? ap.av.getAlignment().getGroups().contains(sg) : false; + boolean isDefinedGroup = (sg != null) ? ap.av.getAlignment() + .getGroups().contains(sg) : false; if (sg != null && sg.getSize() > 0) - { - groupName.setText(MessageManager.formatMessage("label.name_param", new String[]{sg.getName()})); - groupName.setText(MessageManager.getString("label.edit_name_and_description_current_group")); + { + groupName.setText(MessageManager.formatMessage("label.name_param", + new String[] + { sg.getName() })); + groupName.setText(MessageManager + .getString("label.edit_name_and_description_current_group")); if (sg.cs instanceof ZappoColourScheme) { @@ -449,6 +554,7 @@ public class PopupMenu extends JPopupMenu { purinePyrimidineColour.setSelected(true); } + /* * else if (sg.cs instanceof CovariationColourScheme) { * covariationColour.setSelected(true); } @@ -472,15 +578,14 @@ public class PopupMenu extends JPopupMenu buildGroupURLMenu(sg, groupLinks); } // Add a 'show all structures' for the current selection - Hashtable pdbe = new Hashtable(),reppdb=new Hashtable(); + Hashtable pdbe = new Hashtable(), reppdb = new Hashtable(); SequenceI sqass = null; for (SequenceI sq : ap.av.getSequenceSelection()) { - Vector pes = (Vector) sq.getDatasetSequence() - .getPDBId(); - if (pes != null) + Vector pes = sq.getDatasetSequence().getPDBId(); + if (pes != null && pes.size() > 0) { - reppdb.put(pes.get(0).getId(),pes.get(0)); + reppdb.put(pes.get(0).getId(), pes.get(0)); for (PDBEntry pe : pes) { pdbe.put(pe.getId(), pe); @@ -494,38 +599,50 @@ public class PopupMenu extends JPopupMenu if (pdbe.size() > 0) { final PDBEntry[] pe = pdbe.values().toArray( - new PDBEntry[pdbe.size()]),pr = reppdb.values().toArray( - new PDBEntry[reppdb.size()]); - final JMenuItem gpdbview,rpdbview; + new PDBEntry[pdbe.size()]), pr = reppdb.values().toArray( + new PDBEntry[reppdb.size()]); + final JMenuItem gpdbview, rpdbview; if (pdbe.size() == 1) { - structureMenu.add(gpdbview = new JMenuItem(MessageManager.formatMessage("label.view_structure_for", new String[]{sqass.getDisplayId(false)}))); + structureMenu.add(gpdbview = new JMenuItem(MessageManager + .formatMessage("label.view_structure_for", new String[] + { sqass.getDisplayId(false) }))); } else { - structureMenu.add(gpdbview = new JMenuItem(MessageManager.formatMessage("label.view_all_structures", new String[]{new Integer(pdbe.size()).toString()}))); + structureMenu.add(gpdbview = new JMenuItem(MessageManager + .formatMessage("label.view_all_structures", new String[] + { new Integer(pdbe.size()).toString() }))); } - gpdbview.setToolTipText(MessageManager.getString("label.open_new_jmol_view_with_all_structures_associated_current_selection_superimpose_using_alignment")); + gpdbview.setToolTipText(MessageManager + .getString("label.open_new_jmol_view_with_all_structures_associated_current_selection_superimpose_using_alignment")); gpdbview.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - new AppJmol(ap, pe, ap.av.collateForPDB(pe)); + new StructureViewer(ap.getStructureSelectionManager()) + .viewStructures(ap, pe, ap.av.collateForPDB(pe)); } }); - if (reppdb.size()>1 && reppdb.size() 1 && reppdb.size() < pdbe.size()) { - structureMenu.add(rpdbview = new JMenuItem(MessageManager.formatMessage("label.view_all_representative_structures", new String[]{new Integer(reppdb.size()).toString()}))); - rpdbview.setToolTipText(MessageManager.getString("label.open_new_jmol_view_with_all_representative_structures_associated_current_selection_superimpose_using_alignment")); + structureMenu.add(rpdbview = new JMenuItem(MessageManager + .formatMessage( + "label.view_all_representative_structures", + new String[] + { new Integer(reppdb.size()).toString() }))); + rpdbview.setToolTipText(MessageManager + .getString("label.open_new_jmol_view_with_all_representative_structures_associated_current_selection_superimpose_using_alignment")); rpdbview.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - new AppJmol(ap, pr, ap.av.collateForPDB(pr)); + new StructureViewer(ap.getStructureSelectionManager()) + .viewStructures(ap, pr, ap.av.collateForPDB(pr)); } }); } @@ -541,11 +658,13 @@ public class PopupMenu extends JPopupMenu { createGroupMenuItem.setVisible(true); unGroupMenuItem.setVisible(false); - jMenu1.setText(MessageManager.getString("action.edit_new_group")); - } else { + jMenu1.setText(MessageManager.getString("action.edit_new_group")); + } + else + { createGroupMenuItem.setVisible(false); unGroupMenuItem.setVisible(true); - jMenu1.setText(MessageManager.getString("action.edit_group")); + jMenu1.setText(MessageManager.getString("action.edit_group")); } if (seq == null) @@ -557,7 +676,7 @@ public class PopupMenu extends JPopupMenu if (links != null && links.size() > 0) { - JMenu linkMenu = new JMenu(MessageManager.getString("action.link")); + JMenu linkMenu = new JMenu(MessageManager.getString("action.link")); Vector linkset = new Vector(); for (int i = 0; i < links.size(); i++) { @@ -677,6 +796,307 @@ public class PopupMenu extends JPopupMenu } } + /** + * Add annotation types to a 'Show annotations' or 'Hide annotations' menu. + * "All" is added first, followed by a separator. Then add any annotation + * types associated with the current selection. + *

+ * Some annotation rows are always rendered together - these can be identified + * by a common graphGroup property > -1. Only one of each group will be marked + * as visible (to avoid duplication of the display). For such groups we add a + * composite type name, e.g. + *

+ * IUPredWS (Long), IUPredWS (Short) + */ + protected void buildAnnotationTypesMenus() + { + final SequenceGroup selectionGroup = ap.av.getSelectionGroup(); + if (selectionGroup == null) + { + // this menu option is only for a selection + return; + } + + showAnnotationsMenu.removeAll(); + hideAnnotationsMenu.removeAll(); + final List all = Arrays.asList(ALL_ANNOTATIONS); + addAnnotationTypeToShowHide(showAnnotationsMenu, "", all, true, true); + addAnnotationTypeToShowHide(hideAnnotationsMenu, "", all, true, false); + showAnnotationsMenu.addSeparator(); + hideAnnotationsMenu.addSeparator(); + + final AlignmentAnnotation[] annotations = ap.getAlignment() + .getAlignmentAnnotation(); + BitSet visibleGraphGroups = PopupMenu + .getVisibleLineGraphGroups(annotations); + + /* + * Find shown/hidden annotations types, distinguished by source (calcId), + * and grouped by graphGroup. + */ + Map>> shownTypes = new HashMap>>(); + Map>> hiddenTypes = new HashMap>>(); + PopupMenu.getAnnotationTypesForShowHide(shownTypes, hiddenTypes, + visibleGraphGroups, annotations, selectionGroup); + + for (String calcId : hiddenTypes.keySet()) + { + for (List type : hiddenTypes.get(calcId)) + { + addAnnotationTypeToShowHide(showAnnotationsMenu, calcId, type, + false, true); + } + } + + for (String calcId : shownTypes.keySet()) + { + for (List type : shownTypes.get(calcId)) + { + addAnnotationTypeToShowHide(hideAnnotationsMenu, calcId, type, + false, false); + } + } + } + + /** + * Helper method to populate lists of annotation types for the Show/Hide + * Annotations menus. If sequenceGroup is not null, this is restricted to + * annotations which are associated with sequences in the selection group. + *

+ * If an annotation row is currently visible, its type (label) is added (once + * only per type), to the shownTypes list. If it is currently hidden, it is + * added to the hiddenTypesList. + *

+ * For rows that belong to a line graph group, so are always rendered + * together: + *

    + *
  • Treat all rows in the group as visible, if at least one of them is
  • + *
  • Build a comma-separated label with all the types that belong to the + * group
  • + *
+ * + * @param shownTypes + * a map, keyed by calcId (annotation source), whose entries are the + * lists of annotation types found for the calcId; each annotation + * type in turn may be a list (in the case of grouped annotations) + * @param hiddenTypes + * a map, similar to shownTypes, but for hidden annotation types + * @param visibleGraphGroups + * a lookup keyed by graphGroup identifier + * @param annotations + * the annotations on the alignment to scan + * @param sequenceGroup + * the sequence group to restrict search to + */ + public static void getAnnotationTypesForShowHide( + Map>> shownTypes, + Map>> hiddenTypes, + BitSet visibleGraphGroups, AlignmentAnnotation[] annotations, + SequenceGroup sequenceGroup) + { + /* + * Build a lookup, by calcId (annotation source), of all annotation types in + * each graph group. + */ + Map>> groupLabels = new HashMap>>(); + + // trackers for which calcId!label combinations we have dealt with + List addedToShown = new ArrayList(); + List addedToHidden = new ArrayList(); + + for (AlignmentAnnotation aa : annotations) + { + + if (sequenceGroup == null + || (aa.sequenceRef != null && sequenceGroup.getSequences() + .contains(aa.sequenceRef))) + { + String calcId = aa.getCalcId(); + + /* + * Build a 'composite label' for types in line graph groups. + */ + final List labelAsList = new ArrayList(); + final String displayLabel = aa.label; + labelAsList.add(displayLabel); + if (aa.graph == AlignmentAnnotation.LINE_GRAPH + && aa.graphGroup > -1) + { + if (!groupLabels.containsKey(calcId)) + { + groupLabels.put(calcId, new HashMap>()); + } + Map> groupLabelsForCalcId = groupLabels + .get(calcId); + if (groupLabelsForCalcId.containsKey(aa.graphGroup)) + { + if (!groupLabelsForCalcId.get(aa.graphGroup).contains( + displayLabel)) + { + groupLabelsForCalcId.get(aa.graphGroup).add(displayLabel); + } + } + else + { + groupLabelsForCalcId.put(aa.graphGroup, labelAsList); + } + } + else + /* + * 'Simple case' - not a grouped annotation type - list of one label + * only + */ + { + String rememberAs = calcId + "!" + displayLabel; + if (aa.visible && !addedToShown.contains(rememberAs)) + { + if (!shownTypes.containsKey(calcId)) + { + shownTypes.put(calcId, new ArrayList>()); + } + shownTypes.get(calcId).add(labelAsList); + addedToShown.add(rememberAs); + } + else + { + if (!aa.visible && !addedToHidden.contains(rememberAs)) + { + if (!hiddenTypes.containsKey(calcId)) + { + hiddenTypes.put(calcId, new ArrayList>()); + } + hiddenTypes.get(calcId).add(labelAsList); + addedToHidden.add(rememberAs); + } + } + } + } + } + /* + * finally add the 'composite group labels' to the appropriate lists, + * depending on whether the group is identified as visible or hidden + */ + for (String calcId : groupLabels.keySet()) + { + for (int group : groupLabels.get(calcId).keySet()) + { + final List groupLabel = groupLabels.get(calcId).get(group); + if (visibleGraphGroups.get(group)) + { + if (!shownTypes.containsKey(calcId)) + { + shownTypes.put(calcId, new ArrayList>()); + } + shownTypes.get(calcId).add(groupLabel); + } + else + { + if (!hiddenTypes.containsKey(calcId)) + { + hiddenTypes.put(calcId, new ArrayList>()); + } + hiddenTypes.get(calcId).add(groupLabel); + } + } + } + } + + /** + * Returns a BitSet (possibly empty) of those graphGroups for line graph + * annotations, which have at least one member annotation row marked visible. + * The logic is that only one row in the group is marked visible, but when it + * is drawn, so are all the other rows in the same group. + *

+ * This lookup set allows us to check whether rows marked not visible are in + * fact shown. + * + * @see AnnotationRenderer#drawComponent + * @param annotations + * @return + */ + public static BitSet getVisibleLineGraphGroups( + AlignmentAnnotation[] annotations) + { + // todo move to a utility class + BitSet result = new BitSet(); + for (AlignmentAnnotation ann : annotations) + { + if (ann.graph == AlignmentAnnotation.LINE_GRAPH && ann.visible) + { + int gg = ann.graphGroup; + if (gg > -1) + { + result.set(gg); + } + } + } + return result; + } + + /** + * Add one annotation type to the 'Show Annotations' or 'Hide Annotations' + * menus. + * + * @param showOrHideMenu + * the menu to add to + * @param calcId + * @param types + * the label to add + * @param allTypes + * if true this is a special label meaning 'All' + * @param actionIsShow + * if true, the select menu item action is to show the annotation + * type, else hide + */ + protected void addAnnotationTypeToShowHide(JMenu showOrHideMenu, + String calcId, final List types, final boolean allTypes, + final boolean actionIsShow) + { + String label = types.toString(); // [a, b, c] + label = label.substring(1, label.length() - 1); + final JMenuItem item = new JMenuItem(label); + item.setToolTipText(calcId); + item.addActionListener(new java.awt.event.ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + showHideAnnotation_actionPerformed(types, allTypes, actionIsShow); + } + }); + showOrHideMenu.add(item); + } + + /** + * Action on selecting a list of annotation type (or the 'all types' values) + * to show or hide for the selection. + * + * @param types + * @param anyType + * @param doShow + */ + protected void showHideAnnotation_actionPerformed( + Collection types, boolean anyType, boolean doShow) + { + for (AlignmentAnnotation aa : ap.getAlignment() + .getAlignmentAnnotation()) + { + // TODO: select by calcId (source of annotation) as well as label + // e.g. by refactoring of buildAnnotationTypeMenus to as + // to construct the actionPerformed methods as the calcId/labels are found + if (anyType || types.contains(aa.label)) + { + if ((aa.sequenceRef != null) + && ap.av.getSelectionGroup().getSequences() + .contains(aa.sequenceRef)) + { + aa.visible = doShow; + } + } + } + refresh(); + } + private void buildGroupURLMenu(SequenceGroup sg, Vector groupLinks) { @@ -684,11 +1104,18 @@ public class PopupMenu extends JPopupMenu // menu appears asap // sequence only URLs // ID/regex match URLs - groupLinksMenu = new JMenu(MessageManager.getString("action.group_link")); + groupLinksMenu = new JMenu( + MessageManager.getString("action.group_link")); JMenu[] linkMenus = new JMenu[] - { null, new JMenu(MessageManager.getString("action.ids")), new JMenu(MessageManager.getString("action.sequences")), - new JMenu(MessageManager.getString("action.ids_sequences")) }; // three types of url that might be - // created. + { null, new JMenu(MessageManager.getString("action.ids")), + new JMenu(MessageManager.getString("action.sequences")), + new JMenu(MessageManager.getString("action.ids_sequences")) }; // three + // types + // of url + // that + // might + // be + // created. SequenceI[] seqs = ap.av.getSelectionAsNewSequence(); String[][] idandseqs = GroupUrlLink.formStrings(seqs); Hashtable commonDbrefs = new Hashtable(); @@ -810,7 +1237,8 @@ public class PopupMenu extends JPopupMenu } if (addMenu) { - groupLinksMenu = new JMenu(MessageManager.getString("action.group_link")); + groupLinksMenu = new JMenu( + MessageManager.getString("action.group_link")); for (int m = 0; m < linkMenus.length; m++) { if (linkMenus[m] != null @@ -836,14 +1264,18 @@ public class PopupMenu extends JPopupMenu private void addshowLink(JMenu linkMenu, String label, final String url) { JMenuItem item = new JMenuItem(label); - item.setToolTipText(MessageManager.formatMessage("label.open_url_param", new String[]{url})); + item.setToolTipText(MessageManager.formatMessage( + "label.open_url_param", new String[] + { url })); item.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { new Thread(new Runnable() { + @Override public void run() { showLink(url); @@ -871,15 +1303,21 @@ public class PopupMenu extends JPopupMenu final GroupUrlLink urlgenerator, final Object[] urlstub) { JMenuItem item = new JMenuItem(label); - item.setToolTipText(MessageManager.formatMessage("label.open_url_seqs_param", new Object[]{urlgenerator.getUrl_prefix(),urlgenerator.getNumberInvolved(urlstub)})); - // TODO: put in info about what is being sent. + item.setToolTipText(MessageManager.formatMessage( + "label.open_url_seqs_param", + new Object[] + { urlgenerator.getUrl_prefix(), + urlgenerator.getNumberInvolved(urlstub) })); + // TODO: put in info about what is being sent. item.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { new Thread(new Runnable() { + @Override public void run() { try @@ -905,202 +1343,279 @@ public class PopupMenu extends JPopupMenu */ private void jbInit() throws Exception { - groupMenu.setText(MessageManager.getString("label.group")); - groupMenu.setText(MessageManager.getString("label.selection")); - groupName.setText(MessageManager.getString("label.name")); + groupMenu.setText(MessageManager.getString("label.group")); + groupMenu.setText(MessageManager.getString("label.selection")); + groupName.setText(MessageManager.getString("label.name")); groupName.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { groupName_actionPerformed(); } }); - sequenceMenu.setText(MessageManager.getString("label.sequence")); - sequenceName.setText(MessageManager.getString("label.edit_name_description")); + sequenceMenu.setText(MessageManager.getString("label.sequence")); + sequenceName.setText(MessageManager + .getString("label.edit_name_description")); sequenceName.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { sequenceName_actionPerformed(); } }); - sequenceDetails.setText(MessageManager.getString("label.sequence_details") + "..."); + chooseAnnotations.setText(MessageManager + .getString("label.choose_annotations") + "..."); + chooseAnnotations.addActionListener(new java.awt.event.ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + chooseAnnotations_actionPerformed(e); + } + }); + sequenceDetails.setText(MessageManager + .getString("label.sequence_details") + "..."); sequenceDetails.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { sequenceDetails_actionPerformed(); } }); - sequenceSelDetails.setText(MessageManager.getString("label.sequence_details") + "..."); + sequenceSelDetails.setText(MessageManager + .getString("label.sequence_details") + "..."); sequenceSelDetails .addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { sequenceSelectionDetails_actionPerformed(); } }); PIDColour.setFocusPainted(false); - unGroupMenuItem.setText(MessageManager.getString("action.remove_group")); + unGroupMenuItem + .setText(MessageManager.getString("action.remove_group")); unGroupMenuItem.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { unGroupMenuItem_actionPerformed(); } }); - createGroupMenuItem.setText(MessageManager.getString("action.create_group")); - createGroupMenuItem.addActionListener(new java.awt.event.ActionListener() - { - public void actionPerformed(ActionEvent e) - { - createGroupMenuItem_actionPerformed(); - } - }); + createGroupMenuItem.setText(MessageManager + .getString("action.create_group")); + createGroupMenuItem + .addActionListener(new java.awt.event.ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + createGroupMenuItem_actionPerformed(); + } + }); - outline.setText(MessageManager.getString("action.border_colour")); + outline.setText(MessageManager.getString("action.border_colour")); outline.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { outline_actionPerformed(); } }); - nucleotideMenuItem.setText(MessageManager.getString("label.nucleotide")); + nucleotideMenuItem + .setText(MessageManager.getString("label.nucleotide")); nucleotideMenuItem.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { nucleotideMenuItem_actionPerformed(); } }); - colourMenu.setText(MessageManager.getString("label.group_colour")); - showBoxes.setText(MessageManager.getString("action.boxes")); + colourMenu.setText(MessageManager.getString("label.group_colour")); + showBoxes.setText(MessageManager.getString("action.boxes")); showBoxes.setState(true); showBoxes.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { showBoxes_actionPerformed(); } }); - showText.setText(MessageManager.getString("action.text")); + showText.setText(MessageManager.getString("action.text")); showText.setState(true); showText.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { showText_actionPerformed(); } }); - showColourText.setText(MessageManager.getString("label.colour_text")); + showColourText.setText(MessageManager.getString("label.colour_text")); showColourText.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { showColourText_actionPerformed(); } }); - displayNonconserved.setText(MessageManager.getString("label.show_non_conversed")); + displayNonconserved.setText(MessageManager + .getString("label.show_non_conversed")); displayNonconserved.setState(true); displayNonconserved.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { showNonconserved_actionPerformed(); } }); - editMenu.setText(MessageManager.getString("action.edit")); - cut.setText(MessageManager.getString("action.cut")); + editMenu.setText(MessageManager.getString("action.edit")); + cut.setText(MessageManager.getString("action.cut")); cut.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { cut_actionPerformed(); } }); - upperCase.setText(MessageManager.getString("label.to_upper_case")); + upperCase.setText(MessageManager.getString("label.to_upper_case")); upperCase.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { changeCase(e); } }); - copy.setText(MessageManager.getString("action.copy")); + copy.setText(MessageManager.getString("action.copy")); copy.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { copy_actionPerformed(); } }); - lowerCase.setText(MessageManager.getString("label.to_lower_case")); + lowerCase.setText(MessageManager.getString("label.to_lower_case")); lowerCase.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { changeCase(e); } }); - toggle.setText(MessageManager.getString("label.toggle_case")); + toggle.setText(MessageManager.getString("label.toggle_case")); toggle.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { changeCase(e); } }); - pdbMenu.setText(MessageManager.getString("label.associate_structure_with_sequence")); - pdbFromFile.setText(MessageManager.getString("label.from_file")); + pdbMenu.setText(MessageManager + .getString("label.associate_structure_with_sequence")); + pdbFromFile.setText(MessageManager.getString("label.from_file")); pdbFromFile.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { pdbFromFile_actionPerformed(); } }); - enterPDB.setText(MessageManager.getString("label.enter_pdb_id")); + // RNAFold.setText("From RNA Fold with predict2D"); + // RNAFold.addActionListener(new ActionListener() + // { + // public void actionPerformed(ActionEvent e) + // { + // try { + // RNAFold_actionPerformed(); + // } catch (Exception e1) { + // // TODO Auto-generated catch block + // e1.printStackTrace(); + // } + // } + // }); + // ContraFold.setText("From Contra Fold with predict2D"); + // ContraFold.addActionListener(new ActionListener() + // { + // public void actionPerformed(ActionEvent e) + // { + // try { + // ContraFold_actionPerformed(); + // } catch (Exception e1) { + // // TODO Auto-generated catch block + // e1.printStackTrace(); + // } + // } + // }); + enterPDB.setText(MessageManager.getString("label.enter_pdb_id")); enterPDB.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { enterPDB_actionPerformed(); } }); - discoverPDB.setText(MessageManager.getString("label.discover_pdb_ids")); + discoverPDB.setText(MessageManager.getString("label.discover_pdb_ids")); discoverPDB.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { discoverPDB_actionPerformed(); } }); - outputMenu.setText(MessageManager.getString("label.out_to_textbox") + "..."); - sequenceFeature.setText(MessageManager.getString("label.create_sequence_feature")); + outputMenu.setText(MessageManager.getString("label.out_to_textbox") + + "..."); + showAnnotationsMenu.setText(MessageManager + .getString("label.show_annotations")); + hideAnnotationsMenu.setText(MessageManager + .getString("label.hide_annotations")); + configureReferenceAnnotationsMenu(); + sequenceFeature.setText(MessageManager + .getString("label.create_sequence_feature")); sequenceFeature.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { sequenceFeature_actionPerformed(); } }); - textColour.setText(MessageManager.getString("label.text_colour")); + textColour.setText(MessageManager.getString("label.text_colour")); textColour.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { textColour_actionPerformed(); } }); - jMenu1.setText(MessageManager.getString("label.group")); - structureMenu.setText(MessageManager.getString("label.structure")); - viewStructureMenu.setText(MessageManager.getString("label.view_structure")); + jMenu1.setText(MessageManager.getString("label.group")); + structureMenu.setText(MessageManager.getString("label.structure")); + viewStructureMenu.setText(MessageManager + .getString("label.view_structure")); // colStructureMenu.setText("Colour By Structure"); - editSequence.setText(MessageManager.getString("label.edit_sequence") + "..."); + editSequence.setText(MessageManager.getString("label.edit_sequence") + + "..."); editSequence.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent actionEvent) { editSequence_actionPerformed(actionEvent); @@ -1117,6 +1632,10 @@ public class PopupMenu extends JPopupMenu add(groupMenu); add(sequenceMenu); this.add(structureMenu); + // groupMenu.add(chooseAnnotations); + groupMenu.add(showAnnotationsMenu); + groupMenu.add(hideAnnotationsMenu); + groupMenu.add(addDatasequenceAnnotations); groupMenu.add(editMenu); groupMenu.add(outputMenu); groupMenu.add(sequenceFeature); @@ -1140,6 +1659,8 @@ public class PopupMenu extends JPopupMenu colourMenu.add(nucleotideMenuItem); if (ap.getAlignment().isNucleotide()) { + // JBPNote - commented since the colourscheme isn't functional + // colourMenu.add(RNAInteractionColour); colourMenu.add(purinePyrimidineColour); } // colourMenu.add(covariationColour); @@ -1155,6 +1676,7 @@ public class PopupMenu extends JPopupMenu JMenuItem item = new JMenuItem(userColours.nextElement().toString()); item.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent evt) { userDefinedColour_actionPerformed(evt); @@ -1175,6 +1697,10 @@ public class PopupMenu extends JPopupMenu editMenu.add(lowerCase); editMenu.add(toggle); pdbMenu.add(pdbFromFile); + // JBPNote: These shouldn't be added here - should appear in a generic + // 'apply web service to this sequence menu' + // pdbMenu.add(RNAFold); + // pdbMenu.add(ContraFold); pdbMenu.add(enterPDB); pdbMenu.add(discoverPDB); jMenu1.add(groupName); @@ -1187,131 +1713,155 @@ public class PopupMenu extends JPopupMenu structureMenu.add(pdbMenu); structureMenu.add(viewStructureMenu); // structureMenu.add(colStructureMenu); - noColourmenuItem.setText(MessageManager.getString("label.none")); + noColourmenuItem.setText(MessageManager.getString("label.none")); noColourmenuItem.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { noColourmenuItem_actionPerformed(); } }); - clustalColour.setText(MessageManager.getString("label.clustalx_colours")); + clustalColour.setText(MessageManager + .getString("label.clustalx_colours")); clustalColour.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { clustalColour_actionPerformed(); } }); - zappoColour.setText(MessageManager.getString("label.zappo")); + zappoColour.setText(MessageManager.getString("label.zappo")); zappoColour.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { zappoColour_actionPerformed(); } }); - taylorColour.setText(MessageManager.getString("label.taylor")); + taylorColour.setText(MessageManager.getString("label.taylor")); taylorColour.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { taylorColour_actionPerformed(); } }); - hydrophobicityColour.setText(MessageManager.getString("label.hydrophobicity")); + hydrophobicityColour.setText(MessageManager + .getString("label.hydrophobicity")); hydrophobicityColour .addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { hydrophobicityColour_actionPerformed(); } }); - helixColour.setText(MessageManager.getString("label.helix_propensity")); + helixColour.setText(MessageManager.getString("label.helix_propensity")); helixColour.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { helixColour_actionPerformed(); } }); - strandColour.setText(MessageManager.getString("label.strand_propensity")); + strandColour.setText(MessageManager + .getString("label.strand_propensity")); strandColour.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { strandColour_actionPerformed(); } }); - turnColour.setText(MessageManager.getString("label.turn_propensity")); + turnColour.setText(MessageManager.getString("label.turn_propensity")); turnColour.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { turnColour_actionPerformed(); } }); - buriedColour.setText(MessageManager.getString("label.buried_index")); + buriedColour.setText(MessageManager.getString("label.buried_index")); buriedColour.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { buriedColour_actionPerformed(); } }); - abovePIDColour.setText(MessageManager.getString("label.above_identity_percentage")); + abovePIDColour.setText(MessageManager + .getString("label.above_identity_percentage")); abovePIDColour.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { abovePIDColour_actionPerformed(); } }); - userDefinedColour.setText(MessageManager.getString("action.user_defined")); + userDefinedColour.setText(MessageManager + .getString("action.user_defined")); userDefinedColour.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { userDefinedColour_actionPerformed(e); } }); - PIDColour.setText(MessageManager.getString("label.percentage_identity")); + PIDColour + .setText(MessageManager.getString("label.percentage_identity")); PIDColour.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { PIDColour_actionPerformed(); } }); - BLOSUM62Colour.setText(MessageManager.getString("label.blosum62")); + BLOSUM62Colour.setText(MessageManager.getString("label.blosum62")); BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { BLOSUM62Colour_actionPerformed(); } }); - purinePyrimidineColour.setText(MessageManager.getString("label.purine_pyrimidine")); + purinePyrimidineColour.setText(MessageManager + .getString("label.purine_pyrimidine")); purinePyrimidineColour .addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { purinePyrimidineColour_actionPerformed(); } }); + /* * covariationColour.addActionListener(new java.awt.event.ActionListener() { * public void actionPerformed(ActionEvent e) { * covariationColour_actionPerformed(); } }); */ - conservationMenuItem.setText(MessageManager.getString("label.conservation")); + conservationMenuItem.setText(MessageManager + .getString("label.conservation")); conservationMenuItem .addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { conservationMenuItem_actionPerformed(); @@ -1319,6 +1869,138 @@ public class PopupMenu extends JPopupMenu }); } + /** + * Check for any annotations on the underlying dataset sequences (for the + * current selection group) which are not on the alignment. If any are found, + * enable the option to add them to the alignment. The criteria for 'on the + * alignment' is finding an annotation that matches on + * sequenceRef.datasetSequence, calcId and label. + */ + protected void configureReferenceAnnotationsMenu() + { + addDatasequenceAnnotations.setText(MessageManager + .getString("label.add_reference_annotations")); + addDatasequenceAnnotations.setEnabled(false); + + /* + * Temporary store so we can write distinct calcId / type pairs on the + * tooltip. + */ + Map tipEntries = new HashMap(); + StringBuilder tooltip = new StringBuilder(64); + tooltip.append(MessageManager.getString("label.add_annotations_for")); + + // this menu option only applies for a Selection + if (this.ap.av.getSelectionGroup() == null) + { + return; + } + + /* + * For each sequence selected in the alignment, make a list of any + * annotations on the underlying dataset sequence which are not already on + * the sequence in the alignment. + * + * Build a map of { alignmentSequence, } + */ + final Map> candidates = new HashMap>(); + for (SequenceI seq : this.ap.av.getSelectionGroup().getSequences()) + { + SequenceI dataset = seq.getDatasetSequence(); + if (dataset == null) + { + continue; + } + AlignmentAnnotation[] datasetAnnotations = dataset.getAnnotation(); + if (datasetAnnotations == null) + { + continue; + } + final List result = new ArrayList(); + for (AlignmentAnnotation dsann : datasetAnnotations) + { + /* + * If the sequence has no annotation that matches this one, then add + * this one to the results list. + */ + if (seq.getAlignmentAnnotations(dsann.getCalcId(), dsann.label) + .isEmpty()) + { + result.add(dsann); + tipEntries.put(dsann.getCalcId(), dsann.label); + } + } + /* + * Save any addable annotations for this sequence + */ + if (!result.isEmpty()) + { + candidates.put(seq, result); + } + } + if (!candidates.isEmpty()) + { + /* + * Found annotations that could be added. Enable the menu item, and + * configure its tooltip and action. + */ + addDatasequenceAnnotations.setEnabled(true); + for (String calcId : tipEntries.keySet()) + { + tooltip.append("
" + calcId + "/" + tipEntries.get(calcId)); + } + String tooltipText = JvSwingUtils.wrapTooltip(true, + tooltip.toString()); + addDatasequenceAnnotations.setToolTipText(tooltipText); + + addDatasequenceAnnotations.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + addReferenceAnnotations_actionPerformed(candidates); + } + }); + } + } + + /** + * Add annotations to the sequences and to the alignment. + * + * @param candidates + * a map whose keys are sequences on the alignment, and values a list + * of annotations to add to each sequence + */ + protected void addReferenceAnnotations_actionPerformed( + Map> candidates) + { + for (SequenceI seq : candidates.keySet()) + { + for (AlignmentAnnotation ann : candidates.get(seq)) + { + AlignmentAnnotation copyAnn = new AlignmentAnnotation(ann); + int startRes = 0; + int endRes = ann.annotations.length; + final SequenceGroup selectionGroup = this.ap.av.getSelectionGroup(); + if (selectionGroup != null) + { + startRes = selectionGroup.getStartRes(); + endRes = selectionGroup.getEndRes(); + } + copyAnn.restrict(startRes, endRes); + + // add to the sequence (sets correct copyAnn.datasetSequence) + seq.addAlignmentAnnotation(copyAnn); + // adjust for gaps + copyAnn.adjustForAlignment(); + // add to the alignment and set visible + this.ap.getAlignment().addAnnotation(copyAnn); + copyAnn.visible = true; + } + } + refresh(); + } + protected void sequenceSelectionDetails_actionPerformed() { createSequenceDetailsReport(ap.av.getSequenceSelection()); @@ -1336,8 +2018,12 @@ public class PopupMenu extends JPopupMenu StringBuffer contents = new StringBuffer(); for (SequenceI seq : sequences) { - contents.append("

" + MessageManager.formatMessage("label.create_sequence_details_report_annotation_for", new String[]{seq.getDisplayId(true)}) - + "

"); + contents.append("

" + + MessageManager + .formatMessage( + "label.create_sequence_details_report_annotation_for", + new String[] + { seq.getDisplayId(true) }) + "

"); new SequenceAnnotationReport(null) .createSequenceAnnotationReport( contents, @@ -1351,8 +2037,11 @@ public class PopupMenu extends JPopupMenu } cap.setText("" + contents.toString() + ""); - Desktop.instance.addInternalFrame(cap, MessageManager.formatMessage("label.sequece_details_for", (sequences.length == 1 ? new String[]{sequences[0].getDisplayId(true)}: new String[]{MessageManager.getString("label.selection")})) - ,500, 400); + Desktop.instance.addInternalFrame(cap, MessageManager.formatMessage( + "label.sequece_details_for", + (sequences.length == 1 ? new String[] + { sequences[0].getDisplayId(true) } : new String[] + { MessageManager.getString("label.selection") })), 500, 400); } @@ -1538,7 +2227,7 @@ public class PopupMenu extends JPopupMenu { SequenceGroup sg = getGroup(); - if (e.getSource().equals(userDefinedColour)) + if (e.getSource().equals(userDefinedColour)) { new UserDefinedColours(ap, sg); } @@ -1553,6 +2242,18 @@ public class PopupMenu extends JPopupMenu } /** + * Open a panel where the user can choose which types of sequence annotation + * to show or hide. + * + * @param e + */ + protected void chooseAnnotations_actionPerformed(ActionEvent e) + { + // todo correct way to guard against opening a duplicate panel? + new AnnotationChooser(ap); + } + + /** * DOCUMENT ME! * * @param e @@ -1615,7 +2316,7 @@ public class PopupMenu extends JPopupMenu if (conservationMenuItem.isSelected()) { - // JBPNote: Conservation name shouldn't be i18n translated + // JBPNote: Conservation name shouldn't be i18n translated Conservation c = new Conservation("Group", ResidueProperties.propHash, 3, sg.getSequences(ap.av .getHiddenRepSequences()), sg.getStartRes(), @@ -1667,8 +2368,10 @@ public class PopupMenu extends JPopupMenu SequenceGroup sg = getGroup(); EditNameDialog dialog = new EditNameDialog(sg.getName(), - sg.getDescription(), " " + MessageManager.getString("label.group_name") + " ", - MessageManager.getString("label.group_description") + " ", MessageManager.getString("label.edit_group_name_description"), + sg.getDescription(), " " + + MessageManager.getString("label.group_name") + " ", + MessageManager.getString("label.group_description") + " ", + MessageManager.getString("label.edit_group_name_description"), ap.alignFrame); if (!dialog.accept) @@ -1707,8 +2410,12 @@ public class PopupMenu extends JPopupMenu void sequenceName_actionPerformed() { EditNameDialog dialog = new EditNameDialog(sequence.getName(), - sequence.getDescription(), " " + MessageManager.getString("label.sequence_name") + " ", - MessageManager.getString("label.sequence_description") + " ", MessageManager.getString("label.edit_sequence_name_description"), + sequence.getDescription(), + " " + MessageManager.getString("label.sequence_name") + + " ", + MessageManager.getString("label.sequence_description") + " ", + MessageManager + .getString("label.edit_sequence_name_description"), ap.alignFrame); if (!dialog.accept) @@ -1720,10 +2427,14 @@ public class PopupMenu extends JPopupMenu { if (dialog.getName().indexOf(" ") > -1) { - JOptionPane.showMessageDialog(ap, - MessageManager.getString("label.spaces_converted_to_backslashes"), - MessageManager.getString("label.no_spaces_allowed_sequence_name"), - JOptionPane.WARNING_MESSAGE); + JOptionPane + .showMessageDialog( + ap, + MessageManager + .getString("label.spaces_converted_to_backslashes"), + MessageManager + .getString("label.no_spaces_allowed_sequence_name"), + JOptionPane.WARNING_MESSAGE); } sequence.setName(dialog.getName().replace(' ', '_')); @@ -1750,9 +2461,11 @@ public class PopupMenu extends JPopupMenu ap.av.setSelectionGroup(null); refresh(); } + void createGroupMenuItem_actionPerformed() { - getGroup(); // implicitly creates group - note - should apply defaults / use standard alignment window logic for this + getGroup(); // implicitly creates group - note - should apply defaults / use + // standard alignment window logic for this refresh(); } @@ -1765,7 +2478,8 @@ public class PopupMenu extends JPopupMenu protected void outline_actionPerformed() { SequenceGroup sg = getGroup(); - Color col = JColorChooser.showDialog(this, MessageManager.getString("label.select_outline_colour"), + Color col = JColorChooser.showDialog(this, + MessageManager.getString("label.select_outline_colour"), Color.BLUE); if (col != null) @@ -1819,11 +2533,10 @@ public class PopupMenu extends JPopupMenu jalview.util.BrowserLauncher.openURL(url); } catch (Exception ex) { - JOptionPane - .showInternalMessageDialog( - Desktop.desktop, - MessageManager.getString("label.web_browser_not_found_unix"), - MessageManager.getString("label.web_browser_not_found"), JOptionPane.WARNING_MESSAGE); + JOptionPane.showInternalMessageDialog(Desktop.desktop, + MessageManager.getString("label.web_browser_not_found_unix"), + MessageManager.getString("label.web_browser_not_found"), + JOptionPane.WARNING_MESSAGE); ex.printStackTrace(); } @@ -1889,17 +2602,17 @@ public class PopupMenu extends JPopupMenu if (source == toggle) { - description = MessageManager.getString("label.toggle_case"); + description = MessageManager.getString("label.toggle_case"); caseChange = ChangeCaseCommand.TOGGLE_CASE; } else if (source == upperCase) { - description = MessageManager.getString("label.to_upper_case"); + description = MessageManager.getString("label.to_upper_case"); caseChange = ChangeCaseCommand.TO_UPPER; } else { - description = MessageManager.getString("label.to_lower_case"); + description = MessageManager.getString("label.to_lower_case"); caseChange = ChangeCaseCommand.TO_LOWER; } @@ -1919,31 +2632,18 @@ public class PopupMenu extends JPopupMenu { CutAndPasteTransfer cap = new CutAndPasteTransfer(); cap.setForInput(null); - Desktop.addInternalFrame(cap, - MessageManager.formatMessage("label.alignment_output_command", new String[]{e.getActionCommand()}), 600, 500); + Desktop.addInternalFrame(cap, MessageManager.formatMessage( + "label.alignment_output_command", new String[] + { e.getActionCommand() }), 600, 500); String[] omitHidden = null; System.out.println("PROMPT USER HERE"); // TODO: decide if a prompt happens // or we simply trust the user wants // wysiwig behaviour - SequenceGroup sg = ap.av.getSelectionGroup(); - ColumnSelection csel = new ColumnSelection(ap.av.getColumnSelection()); - omitHidden = ap.av.getViewAsString(true); - Alignment oal = new Alignment(ap.av.getSequenceSelection()); - AlignmentAnnotation[] nala = ap.av.getAlignment() - .getAlignmentAnnotation(); - if (nala != null) - { - for (int i = 0; i < nala.length; i++) - { - AlignmentAnnotation na = nala[i]; - oal.addAnnotation(na); - } - } + cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(), - oal, omitHidden, csel, sg)); - oal = null; + ap.av, true)); } public void pdbFromFile_actionPerformed() @@ -1951,8 +2651,12 @@ public class PopupMenu extends JPopupMenu jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser( jalview.bin.Cache.getProperty("LAST_DIRECTORY")); chooser.setFileView(new jalview.io.JalviewFileView()); - chooser.setDialogTitle(MessageManager.formatMessage("label.select_pdb_file_for", new String[]{sequence.getDisplayId(false)})); - chooser.setToolTipText(MessageManager.formatMessage("label.load_pdb_file_associate_with_sequence", new String[]{new Integer(sequence.getDisplayId(false)).toString()})); + chooser.setDialogTitle(MessageManager.formatMessage( + "label.select_pdb_file_for", new String[] + { sequence.getDisplayId(false) })); + chooser.setToolTipText(MessageManager.formatMessage( + "label.load_pdb_file_associate_with_sequence", new String[] + { sequence.getDisplayId(false) })); int value = chooser.showOpenDialog(null); @@ -1966,10 +2670,24 @@ public class PopupMenu extends JPopupMenu } + // JBNote: commented out - these won't be instantiated here...! + // public void RNAFold_actionPerformed() throws Exception + // { + // Predict2D P2D = new Predict2D(); + // P2D.getStructure2DFromRNAFold("toto"); + // } + // + // public void ContraFold_actionPerformed() throws Exception + // { + // Predict2D P2D = new Predict2D(); + // P2D.getStructure2DFromContraFold("toto"); + // } public void enterPDB_actionPerformed() { String id = JOptionPane.showInternalInputDialog(Desktop.desktop, - MessageManager.getString("label.enter_pdb_id"), MessageManager.getString("label.enter_pdb_id"), JOptionPane.QUESTION_MESSAGE); + MessageManager.getString("label.enter_pdb_id"), + MessageManager.getString("label.enter_pdb_id"), + JOptionPane.QUESTION_MESSAGE); if (id != null && id.length() > 0) { @@ -1987,6 +2705,7 @@ public class PopupMenu extends JPopupMenu : ap.av.getSequenceSelection()); Thread discpdb = new Thread(new Runnable() { + @Override public void run() { @@ -2071,16 +2790,19 @@ public class PopupMenu extends JPopupMenu if (sg != null) { if (sequence == null) - sequence = (Sequence) sg.getSequenceAt(0); + sequence = sg.getSequenceAt(0); EditNameDialog dialog = new EditNameDialog( sequence.getSequenceAsString(sg.getStartRes(), - sg.getEndRes() + 1), null, MessageManager.getString("label.edit_sequence"), null, - MessageManager.getString("label.edit_sequence"), ap.alignFrame); + sg.getEndRes() + 1), null, + MessageManager.getString("label.edit_sequence"), null, + MessageManager.getString("label.edit_sequence"), + ap.alignFrame); if (dialog.accept) { - EditCommand editCommand = new EditCommand(MessageManager.getString("label.edit_sequences"), + EditCommand editCommand = new EditCommand( + MessageManager.getString("label.edit_sequences"), EditCommand.REPLACE, dialog.getName().replace(' ', ap.av.getGapCharacter()), sg.getSequencesAsArray(ap.av.getHiddenRepSequences()),