/* * Jalview - A Sequence Alignment Editor and Viewer * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program 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 2 * of the License, or (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package jalview.appletgui; import java.awt.*; import java.awt.event.*; import java.util.Vector; import jalview.analysis.*; import jalview.datamodel.*; import jalview.schemes.*; public class APopupMenu extends java.awt.PopupMenu implements ActionListener, ItemListener { Menu groupMenu = new Menu(); protected MenuItem clustalColour = new MenuItem(); protected MenuItem zappoColour = new MenuItem(); protected MenuItem taylorColour = new MenuItem(); protected MenuItem hydrophobicityColour = new MenuItem(); protected MenuItem helixColour = new MenuItem(); protected MenuItem strandColour = new MenuItem(); protected MenuItem turnColour = new MenuItem(); protected MenuItem buriedColour = new MenuItem(); protected CheckboxMenuItem abovePIDColour = new CheckboxMenuItem(); protected MenuItem userDefinedColour = new MenuItem(); protected MenuItem PIDColour = new MenuItem(); protected MenuItem BLOSUM62Colour = new MenuItem(); MenuItem noColourmenuItem = new MenuItem(); protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem(); final AlignmentPanel ap; MenuItem unGroupMenuItem = new MenuItem(); MenuItem nucleotideMenuItem = new MenuItem(); Menu colourMenu = new Menu(); CheckboxMenuItem showBoxes = new CheckboxMenuItem(); CheckboxMenuItem showText = new CheckboxMenuItem(); CheckboxMenuItem showColourText = new CheckboxMenuItem(); Menu editMenu = new Menu("Edit"); MenuItem copy = new MenuItem("Copy (Jalview Only)"); MenuItem cut = new MenuItem("Cut (Jalview Only)"); MenuItem toUpper = new MenuItem("To Upper Case"); MenuItem toLower = new MenuItem("To Lower Case"); MenuItem toggleCase = new MenuItem("Toggle Case"); Menu outputmenu = new Menu(); Menu seqMenu = new Menu(); MenuItem pdb = new MenuItem(); MenuItem hideSeqs = new MenuItem(); MenuItem repGroup = new MenuItem(); Sequence seq; MenuItem revealAll = new MenuItem(); public APopupMenu(AlignmentPanel apanel, final Sequence seq, Vector links) { /////////////////////////////////////////////////////////// // If this is activated from the sequence panel, the user may want to // edit or annotate a particular residue. Therefore display the residue menu // // If from the IDPanel, we must display the sequence menu ////////////////////////////////////////////////////////// this.ap = apanel; this.seq = seq; try { jbInit(); } catch (Exception e) { e.printStackTrace(); } for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++) { MenuItem item = new MenuItem( jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i] ); item.addActionListener(this); outputmenu.add(item); } SequenceGroup sg = ap.av.getSelectionGroup(); if (sg != null && sg.getSize(false)>0) { showText.setState(sg.getDisplayText()); showColourText.setState(sg.getColourText()); showBoxes.setState(sg.getDisplayBoxes()); if (!ap.av.alignment.getGroups().contains(sg)) { groupMenu.remove(unGroupMenuItem); } } else { remove(hideSeqs); remove(groupMenu); } if (links!=null) { Menu linkMenu = new Menu("Link"); MenuItem item; String link; for(int i=0; i -1) { String id = seq.getName(); if (id.indexOf("|") > -1) id = id.substring(id.lastIndexOf("|") + 1); url = link.substring(link.indexOf("|") + 1, link.indexOf("$SEQUENCE_ID$")) + id + link.substring(link.indexOf("$SEQUENCE_ID$") + 13); } else url = link.substring(link.lastIndexOf("|")+1); System.out.println("add "+url +" "+target); item.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { ap.alignFrame.showURL(url, target); } }); linkMenu.add(item); } if(seq!=null) seqMenu.add(linkMenu); else add(linkMenu); } if(seq!=null) { seqMenu.setLabel(seq.getName()); repGroup.setLabel("Represent Group with " + seq.getName()); } else remove(seqMenu); if(!ap.av.hasHiddenRows) remove(revealAll); } public void itemStateChanged(ItemEvent evt) { if(evt.getSource()==abovePIDColour) abovePIDColour_itemStateChanged(); else if(evt.getSource()==showColourText) showColourText_itemStateChanged(); else if(evt.getSource()==showText) showText_itemStateChanged(); else if(evt.getSource()==showBoxes) showBoxes_itemStateChanged() ; } public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); if(source==clustalColour) clustalColour_actionPerformed(); else if(source==zappoColour) zappoColour_actionPerformed(); else if(source==taylorColour) taylorColour_actionPerformed(); else if(source==hydrophobicityColour) hydrophobicityColour_actionPerformed(); else if(source==helixColour) helixColour_actionPerformed(); else if(source==strandColour) strandColour_actionPerformed(); else if(source==clustalColour) turnColour_actionPerformed(); else if(source==buriedColour) buriedColour_actionPerformed(); else if(source==nucleotideMenuItem) nucleotideMenuItem_actionPerformed(); else if (source == userDefinedColour) userDefinedColour_actionPerformed(); else if (source == PIDColour) PIDColour_actionPerformed(); else if (source == BLOSUM62Colour) BLOSUM62Colour_actionPerformed(); else if (source == noColourmenuItem) noColourmenuItem_actionPerformed(); else if (source == conservationMenuItem) conservationMenuItem_itemStateChanged(); else if (source == unGroupMenuItem) unGroupMenuItem_actionPerformed(); else if(source == pdb) addPDB(); else if(source == hideSeqs) hideSequences(false); else if(source == repGroup) hideSequences(true); else if(source == revealAll) { ap.av.showAllHiddenSeqs(); } else if(source==copy) ap.alignFrame.copy_actionPerformed(); else if(source==cut) ap.alignFrame.cut_actionPerformed(); else if(source==toUpper || source==toLower || source==toggleCase) { SequenceGroup sg = ap.av.getSelectionGroup(); if (sg != null) { for (int g = 0; g < sg.getSize(true); g++) { if (source == toggleCase) ((SequenceI) sg.getSequences(true).elementAt(g)) .toggleCase(sg.getStartRes(), sg.getEndRes() + 1); else ((SequenceI) sg.getSequences(true).elementAt(g)) .changeCase(source == toUpper, sg.getStartRes(), sg.getEndRes() + 1); } ap.seqPanel.seqCanvas.repaint(); } } else outputText(evt); } void outputText(ActionEvent e) { CutAndPasteTransfer cap = new CutAndPasteTransfer(false, ap.alignFrame); Vector vseqs = new Vector(); String [] selection = ap.av.getViewAsString(true); SequenceI [] seqs = ap.av.getSelectionAsNewSequence(); if (selection != null) { for (int i = 0; i < selection.length; i++) { Sequence seq = new Sequence( seqs[i].getName(), selection[i], seqs[i].getStart(), seqs[i].getEnd()); seq.setDescription(seqs[i].getDescription()); vseqs.addElement( seq ); } } Frame frame = new Frame(); frame.add(cap); jalview.bin.JalviewLite.addFrame(frame, "Selection output - " + e.getActionCommand(), 600, 500); cap.setText(new jalview.io.AppletFormatAdapter().formatSequences( e.getActionCommand(), vseqs, ap.av.showJVSuffix)); } void addPDB() { CutAndPasteTransfer cap = new CutAndPasteTransfer(true, ap.alignFrame); cap.setText("Paste your PDB file here."); cap.setPDBImport(seq); Frame frame = new Frame(); frame.add(cap); jalview.bin.JalviewLite.addFrame(frame, "Paste PDB file ", 400, 300); } private void jbInit() throws Exception { groupMenu.setLabel("Group"); groupMenu.setLabel("Selection"); unGroupMenuItem.setLabel("Remove Group"); unGroupMenuItem.addActionListener(this); nucleotideMenuItem.setLabel("Nucleotide"); nucleotideMenuItem.addActionListener(this); conservationMenuItem.addItemListener(this); abovePIDColour.addItemListener(this); colourMenu.setLabel("Group Colour"); showBoxes.setLabel("Boxes"); showBoxes.setState(true); showBoxes.addItemListener(this); showText.setLabel("Text"); showText.addItemListener(this); showColourText.setLabel("Colour Text"); showColourText.addItemListener(this); outputmenu.setLabel("Output to Textbox..."); seqMenu.setLabel("Sequence"); pdb.setLabel("View PDB Structure"); hideSeqs.setLabel("Hide Sequences"); repGroup.setLabel("Represent Group with"); revealAll.setLabel("Reveal All"); add(groupMenu); this.add(seqMenu); this.add(hideSeqs); this.add(revealAll); groupMenu.add(editMenu); groupMenu.add(outputmenu); groupMenu.addSeparator(); groupMenu.add(unGroupMenuItem); groupMenu.add(colourMenu); groupMenu.add(showBoxes); groupMenu.add(showText); groupMenu.add(showColourText); colourMenu.add(noColourmenuItem); colourMenu.add(clustalColour); colourMenu.add(BLOSUM62Colour); colourMenu.add(PIDColour); colourMenu.add(zappoColour); colourMenu.add(taylorColour); colourMenu.add(hydrophobicityColour); colourMenu.add(helixColour); colourMenu.add(strandColour); colourMenu.add(turnColour); colourMenu.add(buriedColour); colourMenu.add(nucleotideMenuItem); colourMenu.add(userDefinedColour); colourMenu.addSeparator(); colourMenu.add(abovePIDColour); colourMenu.add(conservationMenuItem); noColourmenuItem.setLabel("None"); noColourmenuItem.addActionListener(this); clustalColour.setLabel("Clustalx colours"); clustalColour.addActionListener(this); zappoColour.setLabel("Zappo"); zappoColour.addActionListener(this); taylorColour.setLabel("Taylor"); taylorColour.addActionListener(this); hydrophobicityColour.setLabel("Hydrophobicity"); hydrophobicityColour.addActionListener(this); helixColour.setLabel("Helix propensity"); helixColour.addActionListener(this); strandColour.setLabel("Strand propensity"); strandColour.addActionListener(this); turnColour.setLabel("Turn propensity"); turnColour.addActionListener(this); buriedColour.setLabel("Buried Index"); buriedColour.addActionListener(this); abovePIDColour.setLabel("Above % Identity"); userDefinedColour.setLabel("User Defined"); userDefinedColour.addActionListener(this); PIDColour.setLabel("Percentage Identity"); PIDColour.addActionListener(this); BLOSUM62Colour.setLabel("BLOSUM62"); BLOSUM62Colour.addActionListener(this); conservationMenuItem.setLabel("Conservation"); editMenu.add(copy); copy.addActionListener(this); editMenu.add(cut); cut.addActionListener(this); editMenu.add(toUpper); toUpper.addActionListener(this); editMenu.add(toLower); toLower.addActionListener(this); editMenu.add(toggleCase); seqMenu.add(pdb); seqMenu.add(repGroup); toggleCase.addActionListener(this); pdb.addActionListener(this); hideSeqs.addActionListener(this); repGroup.addActionListener(this); revealAll.addActionListener(this); } void refresh() { ap.seqPanel.seqCanvas.repaint(); if(ap.overviewPanel!=null) ap.overviewPanel.updateOverviewImage(); } protected void clustalColour_actionPerformed() { SequenceGroup sg = getGroup(); sg.cs = new ClustalxColourScheme(sg.getSequences(true), ap.av.alignment.getWidth()); refresh(); } protected void zappoColour_actionPerformed() { getGroup().cs = new ZappoColourScheme(); refresh(); } protected void taylorColour_actionPerformed() { getGroup().cs = new TaylorColourScheme(); refresh(); } protected void hydrophobicityColour_actionPerformed() { getGroup().cs = new HydrophobicColourScheme(); refresh(); } protected void helixColour_actionPerformed() { getGroup().cs = new HelixColourScheme(); refresh(); } protected void strandColour_actionPerformed() { getGroup().cs = new StrandColourScheme(); refresh(); } protected void turnColour_actionPerformed() { getGroup().cs = new TurnColourScheme(); refresh(); } protected void buriedColour_actionPerformed() { getGroup().cs = new BuriedColourScheme(); refresh(); } public void nucleotideMenuItem_actionPerformed() { getGroup().cs = new NucleotideColourScheme(); refresh(); } protected void abovePIDColour_itemStateChanged() { SequenceGroup sg = getGroup(); if(sg.cs==null) return; if (abovePIDColour.getState()) { sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(true), 0, ap.av.alignment.getWidth())); int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup().getName()); sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus()); SliderPanel.showPIDSlider(); } else // remove PIDColouring { sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus()); } refresh(); } protected void userDefinedColour_actionPerformed() { new UserDefinedColours(ap, getGroup()); } protected void PIDColour_actionPerformed() { SequenceGroup sg = getGroup(); sg.cs = new PIDColourScheme(); sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(true), 0, ap.av.alignment.getWidth())); refresh(); } protected void BLOSUM62Colour_actionPerformed() { SequenceGroup sg = getGroup(); sg.cs = new Blosum62ColourScheme(); sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(true), 0, ap.av.alignment.getWidth())); refresh(); } protected void noColourmenuItem_actionPerformed() { getGroup().cs = null; refresh(); } protected void conservationMenuItem_itemStateChanged() { SequenceGroup sg = getGroup(); if(sg.cs==null) return; if (conservationMenuItem.getState()) { Conservation c = new Conservation("Group", ResidueProperties.propHash, 3, sg.getSequences(true), 0, ap.av.alignment.getWidth()); c.calculate(); c.verdict(false, ap.av.ConsPercGaps); sg.cs.setConservation(c); SliderPanel.setConservationSlider(ap, sg.cs, sg.getName()); SliderPanel.showConservationSlider(); } else // remove ConservationColouring { sg.cs.setConservation(null); } refresh(); } SequenceGroup getGroup() { SequenceGroup sg = ap.av.getSelectionGroup(); // this method won't add a new group if it already exists if(sg!=null) ap.av.alignment.addGroup(sg); return sg; } void unGroupMenuItem_actionPerformed() { SequenceGroup sg = ap.av.getSelectionGroup(); ap.av.alignment.deleteGroup(sg); ap.av.setSelectionGroup(null); ap.repaint(); } public void showColourText_itemStateChanged() { getGroup().setColourText(showColourText.getState()); refresh(); } public void showText_itemStateChanged() { getGroup().setDisplayText(showText.getState()); refresh(); } public void showBoxes_itemStateChanged() { getGroup().setDisplayBoxes(showBoxes.getState()); refresh(); } void hideSequences(boolean representGroup) { SequenceGroup sg = ap.av.getSelectionGroup(); if(sg==null || sg.getSize(false)<1) { ap.av.hideSequence(seq); return; } int index = 0; while(index < sg.getSize(false)) { if(representGroup && sg.getSequenceAt(index)!=seq) { seq.addHiddenSequence(sg.getSequenceAt(index)); ap.av.hideSequence(sg.getSequenceAt(index)); } else if(!representGroup) { ap.av.hideSequence(sg.getSequenceAt(index)); } index ++; } ap.av.setSelectionGroup(null); } }