2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
3 * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
11 * Jalview is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
23 import java.awt.event.*;
28 import jalview.analysis.*;
29 import jalview.commands.*;
30 import jalview.datamodel.*;
32 import jalview.schemes.*;
33 import jalview.util.GroupUrlLink;
34 import jalview.util.GroupUrlLink.UrlStringTooLongException;
35 import jalview.util.UrlLink;
41 * @version $Revision: 1.118 $
43 public class PopupMenu extends JPopupMenu
45 JMenu groupMenu = new JMenu();
47 JMenuItem groupName = new JMenuItem();
49 protected JRadioButtonMenuItem clustalColour = new JRadioButtonMenuItem();
51 protected JRadioButtonMenuItem zappoColour = new JRadioButtonMenuItem();
53 protected JRadioButtonMenuItem taylorColour = new JRadioButtonMenuItem();
55 protected JRadioButtonMenuItem hydrophobicityColour = new JRadioButtonMenuItem();
57 protected JRadioButtonMenuItem helixColour = new JRadioButtonMenuItem();
59 protected JRadioButtonMenuItem strandColour = new JRadioButtonMenuItem();
61 protected JRadioButtonMenuItem turnColour = new JRadioButtonMenuItem();
63 protected JRadioButtonMenuItem buriedColour = new JRadioButtonMenuItem();
65 protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();
67 protected JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem();
69 protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();
71 protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();
73 protected JRadioButtonMenuItem purinePyrimidineColour = new JRadioButtonMenuItem();
75 //protected JRadioButtonMenuItem covariationColour = new JRadioButtonMenuItem();
77 JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();
79 protected JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();
83 JMenu sequenceMenu = new JMenu();
85 JMenuItem sequenceName = new JMenuItem();
89 JMenuItem unGroupMenuItem = new JMenuItem();
91 JMenuItem outline = new JMenuItem();
93 JRadioButtonMenuItem nucleotideMenuItem = new JRadioButtonMenuItem();
95 JMenu colourMenu = new JMenu();
97 JCheckBoxMenuItem showBoxes = new JCheckBoxMenuItem();
99 JCheckBoxMenuItem showText = new JCheckBoxMenuItem();
101 JCheckBoxMenuItem showColourText = new JCheckBoxMenuItem();
103 JCheckBoxMenuItem displayNonconserved = new JCheckBoxMenuItem();
105 JMenu editMenu = new JMenu();
107 JMenuItem cut = new JMenuItem();
109 JMenuItem copy = new JMenuItem();
111 JMenuItem upperCase = new JMenuItem();
113 JMenuItem lowerCase = new JMenuItem();
115 JMenuItem toggle = new JMenuItem();
117 JMenu pdbMenu = new JMenu();
119 JMenuItem pdbFromFile = new JMenuItem();
121 JMenuItem enterPDB = new JMenuItem();
123 JMenuItem discoverPDB = new JMenuItem();
125 JMenu outputMenu = new JMenu();
127 JMenuItem sequenceFeature = new JMenuItem();
129 JMenuItem textColour = new JMenuItem();
131 JMenu jMenu1 = new JMenu();
133 JMenu structureMenu = new JMenu();
135 JMenu viewStructureMenu = new JMenu();
137 // JMenu colStructureMenu = new JMenu();
138 JMenuItem editSequence = new JMenuItem();
140 // JMenuItem annotationMenuItem = new JMenuItem();
142 JMenu groupLinksMenu;
145 * Creates a new PopupMenu object.
152 public PopupMenu(final AlignmentPanel ap, Sequence seq, Vector links)
154 this(ap, seq, links, null);
164 public PopupMenu(final AlignmentPanel ap, final Sequence seq, final Vector links,
165 final Vector groupLinks)
167 // /////////////////////////////////////////////////////////
168 // If this is activated from the sequence panel, the user may want to
169 // edit or annotate a particular residue. Therefore display the residue menu
171 // If from the IDPanel, we must display the sequence menu
172 // ////////////////////////////////////////////////////////
176 ButtonGroup colours = new ButtonGroup();
177 colours.add(noColourmenuItem);
178 colours.add(clustalColour);
179 colours.add(zappoColour);
180 colours.add(taylorColour);
181 colours.add(hydrophobicityColour);
182 colours.add(helixColour);
183 colours.add(strandColour);
184 colours.add(turnColour);
185 colours.add(buriedColour);
186 colours.add(abovePIDColour);
187 colours.add(userDefinedColour);
188 colours.add(PIDColour);
189 colours.add(BLOSUM62Colour);
190 colours.add(purinePyrimidineColour);
191 //colours.add(covariationColour);
193 for (int i = 0; i < jalview.io.FormatAdapter.WRITEABLE_FORMATS.length; i++)
195 JMenuItem item = new JMenuItem(
196 jalview.io.FormatAdapter.WRITEABLE_FORMATS[i]);
198 item.addActionListener(new java.awt.event.ActionListener()
200 public void actionPerformed(ActionEvent e)
202 outputText_actionPerformed(e);
206 outputMenu.add(item);
212 } catch (Exception e)
219 sequenceMenu.setText(sequence.getName());
222 if (seq.getDatasetSequence().getPDBId() != null
223 && seq.getDatasetSequence().getPDBId().size() > 0)
225 java.util.Enumeration e = seq.getDatasetSequence().getPDBId()
228 while (e.hasMoreElements())
230 final PDBEntry pdb = (PDBEntry) e.nextElement();
232 menuItem = new JMenuItem();
233 menuItem.setText(pdb.getId());
234 menuItem.addActionListener(new java.awt.event.ActionListener()
236 public void actionPerformed(ActionEvent e)
238 // TODO re JAL-860: optionally open dialog or provide a menu entry allowing user to open just one structure per sequence
239 new AppJmol(pdb, ap.av.collateForPDB(new PDBEntry[] { pdb })[0], null, ap);
240 // new PDBViewer(pdb, seqs2, null, ap, AppletFormatAdapter.FILE);
244 viewStructureMenu.add(menuItem);
247 * menuItem = new JMenuItem(); menuItem.setText(pdb.getId());
248 * menuItem.addActionListener(new java.awt.event.ActionListener() {
249 * public void actionPerformed(ActionEvent e) {
250 * colourByStructure(pdb.getId()); } });
251 * colStructureMenu.add(menuItem);
257 if(ap.av.alignment.isNucleotide()==false){
258 structureMenu.remove(viewStructureMenu);
260 // structureMenu.remove(colStructureMenu);
263 if(ap.av.alignment.isNucleotide()==true){
264 AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();
265 String rnastruc=new String();
266 for(int i=0; i<aa.length;i++){
267 if(aa[i]._rnasecstr != null){
268 rnastruc=aa[i].getRNAStruc();
272 //TODO: make rnastrucF a bit more nice
273 final String rnastrucF=rnastruc;
274 menuItem = new JMenuItem();
275 menuItem.setText("RNA structure");
276 menuItem.addActionListener(new java.awt.event.ActionListener()
278 public void actionPerformed(ActionEvent e)
280 System.out.println("Call Varna "+seq.getSequenceAsString()+" "+seq.getName());
281 //TODO: VARNA does'nt print gaps in the sequence
282 new AppVarna(seq.getSequenceAsString(),rnastrucF,seq.getName());
285 viewStructureMenu.add(menuItem);
288 menuItem = new JMenuItem("Hide Sequences");
289 menuItem.addActionListener(new java.awt.event.ActionListener()
291 public void actionPerformed(ActionEvent e)
293 hideSequences(false);
298 if (ap.av.getSelectionGroup() != null
299 && ap.av.getSelectionGroup().getSize() > 1)
301 menuItem = new JMenuItem("Represent Group with " + seq.getName());
302 menuItem.addActionListener(new java.awt.event.ActionListener()
304 public void actionPerformed(ActionEvent e)
309 sequenceMenu.add(menuItem);
312 if (ap.av.hasHiddenRows)
314 final int index = ap.av.alignment.findIndex(seq);
316 if (ap.av.adjustForHiddenSeqs(index)
317 - ap.av.adjustForHiddenSeqs(index - 1) > 1)
319 menuItem = new JMenuItem("Reveal Sequences");
320 menuItem.addActionListener(new ActionListener()
322 public void actionPerformed(ActionEvent e)
324 ap.av.showSequence(index);
325 if (ap.overviewPanel != null)
327 ap.overviewPanel.updateOverviewImage();
334 menuItem = new JMenuItem("Reveal All");
335 menuItem.addActionListener(new ActionListener()
337 public void actionPerformed(ActionEvent e)
339 ap.av.showAllHiddenSeqs();
340 if (ap.overviewPanel != null)
342 ap.overviewPanel.updateOverviewImage();
352 SequenceGroup sg = ap.av.getSelectionGroup();
356 groupName.setText("Name: "+sg.getName());
357 groupName.setText("Edit name and description of current group.");
359 if (sg.cs instanceof ZappoColourScheme)
361 zappoColour.setSelected(true);
363 else if (sg.cs instanceof TaylorColourScheme)
365 taylorColour.setSelected(true);
367 else if (sg.cs instanceof PIDColourScheme)
369 PIDColour.setSelected(true);
371 else if (sg.cs instanceof Blosum62ColourScheme)
373 BLOSUM62Colour.setSelected(true);
375 else if (sg.cs instanceof UserColourScheme)
377 userDefinedColour.setSelected(true);
379 else if (sg.cs instanceof HydrophobicColourScheme)
381 hydrophobicityColour.setSelected(true);
383 else if (sg.cs instanceof HelixColourScheme)
385 helixColour.setSelected(true);
387 else if (sg.cs instanceof StrandColourScheme)
389 strandColour.setSelected(true);
391 else if (sg.cs instanceof TurnColourScheme)
393 turnColour.setSelected(true);
395 else if (sg.cs instanceof BuriedColourScheme)
397 buriedColour.setSelected(true);
399 else if (sg.cs instanceof ClustalxColourScheme)
401 clustalColour.setSelected(true);
403 else if (sg.cs instanceof PurinePyrimidineColourScheme)
405 purinePyrimidineColour.setSelected(true);
407 /* else if (sg.cs instanceof CovariationColourScheme)
409 covariationColour.setSelected(true);
413 noColourmenuItem.setSelected(true);
416 if (sg.cs != null && sg.cs.conservationApplied())
418 conservationMenuItem.setSelected(true);
420 displayNonconserved.setSelected(sg.getShowNonconserved());
421 showText.setSelected(sg.getDisplayText());
422 showColourText.setSelected(sg.getColourText());
423 showBoxes.setSelected(sg.getDisplayBoxes());
424 // add any groupURLs to the groupURL submenu and make it visible
425 if (groupLinks != null && groupLinks.size() > 0)
427 buildGroupURLMenu(sg, groupLinks);
429 // Add a 'show all structures' for the current selection
430 Hashtable<String, PDBEntry> pdbe=new Hashtable<String,PDBEntry>();
431 for (SequenceI sq: ap.av.getSequenceSelection())
433 Vector<PDBEntry> pes = (Vector<PDBEntry>) sq.getDatasetSequence().getPDBId();
435 for (PDBEntry pe: pes)
437 pdbe.put(pe.getId(), pe);
443 final PDBEntry[] pe = pdbe.values().toArray(new PDBEntry[pdbe.size()]);
444 final JMenuItem gpdbview;
445 structureMenu.add(gpdbview=new JMenuItem("View "+pdbe.size()+" structures."));
446 gpdbview.setToolTipText("Open a new Jmol view with all structures associated with the current selection and superimpose them using the alignment.");
447 gpdbview.addActionListener(new ActionListener()
451 public void actionPerformed(ActionEvent e)
453 new AppJmol(ap, pe, ap.av.collateForPDB(pe));
460 groupMenu.setVisible(false);
461 editMenu.setVisible(false);
464 if (!ap.av.alignment.getGroups().contains(sg))
466 unGroupMenuItem.setVisible(false);
471 sequenceMenu.setVisible(false);
472 structureMenu.setVisible(false);
475 if (links != null && links.size() > 0)
478 JMenu linkMenu = new JMenu("Link");
479 Vector linkset = new Vector();
480 for (int i = 0; i < links.size(); i++)
482 String link = links.elementAt(i).toString();
483 UrlLink urlLink = null;
486 urlLink = new UrlLink(link);
487 } catch (Exception foo)
489 jalview.bin.Cache.log.error("Exception for URLLink '" + link
494 if (!urlLink.isValid())
496 jalview.bin.Cache.log.error(urlLink.getInvalidMessage());
499 final String label = urlLink.getLabel();
500 if (urlLink.isDynamic())
503 // collect matching db-refs
504 DBRefEntry[] dbr = jalview.util.DBRefUtils.selectRefs(
505 seq.getDBRef(), new String[]
506 { urlLink.getTarget() });
507 // collect id string too
508 String id = seq.getName();
509 String descr = seq.getDescription();
510 if (descr != null && descr.length() < 1)
517 for (int r = 0; r < dbr.length; r++)
519 if (id != null && dbr[r].getAccessionId().equals(id))
521 // suppress duplicate link creation for the bare sequence ID
522 // string with this link
525 // create Bare ID link for this RUL
526 String[] urls = urlLink.makeUrls(dbr[r].getAccessionId(),
530 for (int u = 0; u < urls.length; u += 2)
532 if (!linkset.contains(urls[u] + "|" + urls[u + 1]))
534 linkset.addElement(urls[u] + "|" + urls[u + 1]);
535 addshowLink(linkMenu, label + "|" + urls[u],
544 // create Bare ID link for this RUL
545 String[] urls = urlLink.makeUrls(id, true);
548 for (int u = 0; u < urls.length; u += 2)
550 if (!linkset.contains(urls[u] + "|" + urls[u + 1]))
552 linkset.addElement(urls[u] + "|" + urls[u + 1]);
553 addshowLink(linkMenu, label, urls[u + 1]);
558 // Create urls from description but only for URL links which are regex
560 if (descr != null && urlLink.getRegexReplace() != null)
562 // create link for this URL from description where regex matches
563 String[] urls = urlLink.makeUrls(descr, true);
566 for (int u = 0; u < urls.length; u += 2)
568 if (!linkset.contains(urls[u] + "|" + urls[u + 1]))
570 linkset.addElement(urls[u] + "|" + urls[u + 1]);
571 addshowLink(linkMenu, label, urls[u + 1]);
579 if (!linkset.contains(label + "|" + urlLink.getUrl_prefix()))
581 linkset.addElement(label + "|" + urlLink.getUrl_prefix());
582 // Add a non-dynamic link
583 addshowLink(linkMenu, label, urlLink.getUrl_prefix());
587 if (sequence != null)
589 sequenceMenu.add(linkMenu);
598 private void buildGroupURLMenu(SequenceGroup sg, Vector groupLinks)
601 // TODO: usability: thread off the generation of group url content so root
603 // sequence only URLs
604 // ID/regex match URLs
605 groupLinksMenu = new JMenu("Group Link");
606 JMenu[] linkMenus = new JMenu[]
607 { null, new JMenu("IDS"), new JMenu("Sequences"),
608 new JMenu("IDS and Sequences") }; // three types of url that might be
610 SequenceI[] seqs = ap.av.getSelectionAsNewSequence();
611 String[][] idandseqs = GroupUrlLink.formStrings(seqs);
612 Hashtable commonDbrefs = new Hashtable();
613 for (int sq = 0; sq < seqs.length; sq++)
616 int start = seqs[sq].findPosition(sg.getStartRes()), end = seqs[sq]
617 .findPosition(sg.getEndRes());
618 // just collect ids from dataset sequence
619 // TODO: check if IDs collected from selecton group intersects with the
620 // current selection, too
621 SequenceI sqi = seqs[sq];
622 while (sqi.getDatasetSequence() != null)
624 sqi = sqi.getDatasetSequence();
626 DBRefEntry[] dbr = sqi.getDBRef();
627 if (dbr != null && dbr.length > 0)
629 for (int d = 0; d < dbr.length; d++)
631 String src = dbr[d].getSource(); // jalview.util.DBRefUtils.getCanonicalName(dbr[d].getSource()).toUpperCase();
632 Object[] sarray = (Object[]) commonDbrefs.get(src);
635 sarray = new Object[2];
636 sarray[0] = new int[]
638 sarray[1] = new String[seqs.length];
640 commonDbrefs.put(src, sarray);
643 if (((String[]) sarray[1])[sq] == null)
646 || (dbr[d].getMap().locateMappedRange(start, end) != null))
648 ((String[]) sarray[1])[sq] = dbr[d].getAccessionId();
649 ((int[]) sarray[0])[0]++;
655 // now create group links for all distinct ID/sequence sets.
656 boolean addMenu = false; // indicates if there are any group links to give
658 for (int i = 0; i < groupLinks.size(); i++)
660 String link = groupLinks.elementAt(i).toString();
661 GroupUrlLink urlLink = null;
664 urlLink = new GroupUrlLink(link);
665 } catch (Exception foo)
667 jalview.bin.Cache.log.error("Exception for GroupURLLink '" + link
672 if (!urlLink.isValid())
674 jalview.bin.Cache.log.error(urlLink.getInvalidMessage());
677 final String label = urlLink.getLabel();
678 boolean usingNames = false;
679 // Now see which parts of the group apply for this URL
680 String ltarget = urlLink.getTarget(); // jalview.util.DBRefUtils.getCanonicalName(urlLink.getTarget());
681 Object[] idset = (Object[]) commonDbrefs.get(ltarget.toUpperCase());
682 String[] seqstr, ids; // input to makeUrl
685 int numinput = ((int[]) idset[0])[0];
686 String[] allids = ((String[]) idset[1]);
687 seqstr = new String[numinput];
688 ids = new String[numinput];
689 for (int sq = 0, idcount = 0; sq < seqs.length; sq++)
691 if (allids[sq] != null)
693 ids[idcount] = allids[sq];
694 seqstr[idcount++] = idandseqs[1][sq];
700 // just use the id/seq set
701 seqstr = idandseqs[1];
705 // and try and make the groupURL!
707 Object[] urlset = null;
710 urlset = urlLink.makeUrlStubs(ids, seqstr,
711 "FromJalview" + System.currentTimeMillis(), false);
712 } catch (UrlStringTooLongException e)
717 int type = urlLink.getGroupURLType() & 3;
718 // System.out.println(urlLink.getGroupURLType()
719 // +" "+((String[])urlset[3])[0]);
720 // first two bits ofurlLink type bitfield are sequenceids and sequences
721 // TODO: FUTURE: ensure the groupURL menu structure can be generalised
722 addshowLink(linkMenus[type], label
723 + (((type & 1) == 1) ? ("("
724 + (usingNames ? "Names" : ltarget) + ")") : ""),
731 groupLinksMenu = new JMenu("Group Links");
732 for (int m = 0; m < linkMenus.length; m++)
734 if (linkMenus[m] != null
735 && linkMenus[m].getMenuComponentCount() > 0)
737 groupLinksMenu.add(linkMenus[m]);
741 groupMenu.add(groupLinksMenu);
746 * add a show URL menu item to the given linkMenu
750 * - menu label string
754 private void addshowLink(JMenu linkMenu, String label, final String url)
756 JMenuItem item = new JMenuItem(label);
757 item.setToolTipText("open URL: " + url);
758 item.addActionListener(new java.awt.event.ActionListener()
760 public void actionPerformed(ActionEvent e)
762 new Thread(new Runnable()
778 * add a late bound groupURL item to the given linkMenu
782 * - menu label string
783 * @param urlgenerator
784 * GroupURLLink used to generate URL
786 * Object array returned from the makeUrlStubs function.
788 private void addshowLink(JMenu linkMenu, String label,
789 final GroupUrlLink urlgenerator, final Object[] urlstub)
791 JMenuItem item = new JMenuItem(label);
792 item.setToolTipText("open URL (" + urlgenerator.getUrl_prefix()
793 + "..) (" + urlgenerator.getNumberInvolved(urlstub) + " seqs)"); // TODO:
802 item.addActionListener(new java.awt.event.ActionListener()
804 public void actionPerformed(ActionEvent e)
806 new Thread(new Runnable()
813 showLink(urlgenerator.constructFrom(urlstub));
814 } catch (UrlStringTooLongException e)
832 private void jbInit() throws Exception
834 groupMenu.setText("Group");
835 groupMenu.setText("Selection");
836 groupName.setText("Name");
837 groupName.addActionListener(new java.awt.event.ActionListener()
839 public void actionPerformed(ActionEvent e)
841 groupName_actionPerformed();
844 sequenceMenu.setText("Sequence");
845 sequenceName.setText("Edit Name/Description");
846 sequenceName.addActionListener(new java.awt.event.ActionListener()
848 public void actionPerformed(ActionEvent e)
850 sequenceName_actionPerformed();
853 PIDColour.setFocusPainted(false);
854 unGroupMenuItem.setText("Remove Group");
855 unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
857 public void actionPerformed(ActionEvent e)
859 unGroupMenuItem_actionPerformed();
863 outline.setText("Border colour");
864 outline.addActionListener(new java.awt.event.ActionListener()
866 public void actionPerformed(ActionEvent e)
868 outline_actionPerformed();
871 nucleotideMenuItem.setText("Nucleotide");
872 nucleotideMenuItem.addActionListener(new ActionListener()
874 public void actionPerformed(ActionEvent e)
876 nucleotideMenuItem_actionPerformed();
879 colourMenu.setText("Group Colour");
880 showBoxes.setText("Boxes");
881 showBoxes.setState(true);
882 showBoxes.addActionListener(new ActionListener()
884 public void actionPerformed(ActionEvent e)
886 showBoxes_actionPerformed();
889 showText.setText("Text");
890 showText.setState(true);
891 showText.addActionListener(new ActionListener()
893 public void actionPerformed(ActionEvent e)
895 showText_actionPerformed();
898 showColourText.setText("Colour Text");
899 showColourText.addActionListener(new ActionListener()
901 public void actionPerformed(ActionEvent e)
903 showColourText_actionPerformed();
906 displayNonconserved.setText("Show Nonconserved");
907 displayNonconserved.setState(true);
908 displayNonconserved.addActionListener(new ActionListener()
910 public void actionPerformed(ActionEvent e)
912 showNonconserved_actionPerformed();
915 editMenu.setText("Edit");
917 cut.addActionListener(new ActionListener()
919 public void actionPerformed(ActionEvent e)
921 cut_actionPerformed();
924 upperCase.setText("To Upper Case");
925 upperCase.addActionListener(new ActionListener()
927 public void actionPerformed(ActionEvent e)
932 copy.setText("Copy");
933 copy.addActionListener(new ActionListener()
935 public void actionPerformed(ActionEvent e)
937 copy_actionPerformed();
940 lowerCase.setText("To Lower Case");
941 lowerCase.addActionListener(new ActionListener()
943 public void actionPerformed(ActionEvent e)
948 toggle.setText("Toggle Case");
949 toggle.addActionListener(new ActionListener()
951 public void actionPerformed(ActionEvent e)
956 pdbMenu.setText("Associate Structure with Sequence");
957 pdbFromFile.setText("From File");
958 pdbFromFile.addActionListener(new ActionListener()
960 public void actionPerformed(ActionEvent e)
962 pdbFromFile_actionPerformed();
965 enterPDB.setText("Enter PDB Id");
966 enterPDB.addActionListener(new ActionListener()
968 public void actionPerformed(ActionEvent e)
970 enterPDB_actionPerformed();
973 discoverPDB.setText("Discover PDB ids");
974 discoverPDB.addActionListener(new ActionListener()
976 public void actionPerformed(ActionEvent e)
978 discoverPDB_actionPerformed();
981 outputMenu.setText("Output to Textbox...");
982 sequenceFeature.setText("Create Sequence Feature");
983 sequenceFeature.addActionListener(new ActionListener()
985 public void actionPerformed(ActionEvent e)
987 sequenceFeature_actionPerformed();
990 textColour.setText("Text Colour");
991 textColour.addActionListener(new ActionListener()
993 public void actionPerformed(ActionEvent e)
995 textColour_actionPerformed();
998 jMenu1.setText("Group");
999 structureMenu.setText("Structure");
1000 viewStructureMenu.setText("View Structure");
1001 // colStructureMenu.setText("Colour By Structure");
1002 editSequence.setText("Edit Sequence...");
1003 editSequence.addActionListener(new ActionListener()
1005 public void actionPerformed(ActionEvent actionEvent)
1007 editSequence_actionPerformed(actionEvent);
1011 * annotationMenuItem.setText("By Annotation");
1012 * annotationMenuItem.addActionListener(new ActionListener() { public void
1013 * actionPerformed(ActionEvent actionEvent) {
1014 * annotationMenuItem_actionPerformed(actionEvent); } });
1020 this.add(structureMenu);
1021 groupMenu.add(editMenu);
1022 groupMenu.add(outputMenu);
1023 groupMenu.add(sequenceFeature);
1024 groupMenu.add(jMenu1);
1025 sequenceMenu.add(sequenceName);
1026 colourMenu.add(textColour);
1027 colourMenu.add(noColourmenuItem);
1028 colourMenu.add(clustalColour);
1029 colourMenu.add(BLOSUM62Colour);
1030 colourMenu.add(PIDColour);
1031 colourMenu.add(zappoColour);
1032 colourMenu.add(taylorColour);
1033 colourMenu.add(hydrophobicityColour);
1034 colourMenu.add(helixColour);
1035 colourMenu.add(strandColour);
1036 colourMenu.add(turnColour);
1037 colourMenu.add(buriedColour);
1038 colourMenu.add(nucleotideMenuItem);
1039 colourMenu.add(purinePyrimidineColour);
1040 //colourMenu.add(covariationColour);
1041 colourMenu.add(userDefinedColour);
1043 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
1045 java.util.Enumeration userColours = jalview.gui.UserDefinedColours
1046 .getUserColourSchemes().keys();
1048 while (userColours.hasMoreElements())
1050 JMenuItem item = new JMenuItem(userColours.nextElement().toString());
1051 item.addActionListener(new ActionListener()
1053 public void actionPerformed(ActionEvent evt)
1055 userDefinedColour_actionPerformed(evt);
1058 colourMenu.add(item);
1062 colourMenu.addSeparator();
1063 colourMenu.add(abovePIDColour);
1064 colourMenu.add(conservationMenuItem);
1065 // colourMenu.add(annotationMenuItem);
1068 editMenu.add(editSequence);
1069 editMenu.add(upperCase);
1070 editMenu.add(lowerCase);
1071 editMenu.add(toggle);
1072 pdbMenu.add(pdbFromFile);
1073 pdbMenu.add(enterPDB);
1074 pdbMenu.add(discoverPDB);
1075 jMenu1.add(groupName);
1076 jMenu1.add(unGroupMenuItem);
1077 jMenu1.add(colourMenu);
1078 jMenu1.add(showBoxes);
1079 jMenu1.add(showText);
1080 jMenu1.add(showColourText);
1081 jMenu1.add(outline);
1082 jMenu1.add(displayNonconserved);
1083 structureMenu.add(pdbMenu);
1084 structureMenu.add(viewStructureMenu);
1085 // structureMenu.add(colStructureMenu);
1086 noColourmenuItem.setText("None");
1087 noColourmenuItem.addActionListener(new java.awt.event.ActionListener()
1089 public void actionPerformed(ActionEvent e)
1091 noColourmenuItem_actionPerformed();
1095 clustalColour.setText("Clustalx colours");
1096 clustalColour.addActionListener(new java.awt.event.ActionListener()
1098 public void actionPerformed(ActionEvent e)
1100 clustalColour_actionPerformed();
1103 zappoColour.setText("Zappo");
1104 zappoColour.addActionListener(new java.awt.event.ActionListener()
1106 public void actionPerformed(ActionEvent e)
1108 zappoColour_actionPerformed();
1111 taylorColour.setText("Taylor");
1112 taylorColour.addActionListener(new java.awt.event.ActionListener()
1114 public void actionPerformed(ActionEvent e)
1116 taylorColour_actionPerformed();
1119 hydrophobicityColour.setText("Hydrophobicity");
1120 hydrophobicityColour
1121 .addActionListener(new java.awt.event.ActionListener()
1123 public void actionPerformed(ActionEvent e)
1125 hydrophobicityColour_actionPerformed();
1128 helixColour.setText("Helix propensity");
1129 helixColour.addActionListener(new java.awt.event.ActionListener()
1131 public void actionPerformed(ActionEvent e)
1133 helixColour_actionPerformed();
1136 strandColour.setText("Strand propensity");
1137 strandColour.addActionListener(new java.awt.event.ActionListener()
1139 public void actionPerformed(ActionEvent e)
1141 strandColour_actionPerformed();
1144 turnColour.setText("Turn propensity");
1145 turnColour.addActionListener(new java.awt.event.ActionListener()
1147 public void actionPerformed(ActionEvent e)
1149 turnColour_actionPerformed();
1152 buriedColour.setText("Buried Index");
1153 buriedColour.addActionListener(new java.awt.event.ActionListener()
1155 public void actionPerformed(ActionEvent e)
1157 buriedColour_actionPerformed();
1160 abovePIDColour.setText("Above % Identity");
1161 abovePIDColour.addActionListener(new java.awt.event.ActionListener()
1163 public void actionPerformed(ActionEvent e)
1165 abovePIDColour_actionPerformed();
1168 userDefinedColour.setText("User Defined...");
1169 userDefinedColour.addActionListener(new java.awt.event.ActionListener()
1171 public void actionPerformed(ActionEvent e)
1173 userDefinedColour_actionPerformed(e);
1176 PIDColour.setText("Percentage Identity");
1177 PIDColour.addActionListener(new java.awt.event.ActionListener()
1179 public void actionPerformed(ActionEvent e)
1181 PIDColour_actionPerformed();
1184 BLOSUM62Colour.setText("BLOSUM62");
1185 BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()
1187 public void actionPerformed(ActionEvent e)
1189 BLOSUM62Colour_actionPerformed();
1192 purinePyrimidineColour.setText("Purine/Pyrimidine");
1193 purinePyrimidineColour.addActionListener(new java.awt.event.ActionListener()
1195 public void actionPerformed(ActionEvent e)
1197 purinePyrimidineColour_actionPerformed();
1201 covariationColour.addActionListener(new java.awt.event.ActionListener()
1203 public void actionPerformed(ActionEvent e)
1205 covariationColour_actionPerformed();
1209 conservationMenuItem.setText("Conservation");
1210 conservationMenuItem
1211 .addActionListener(new java.awt.event.ActionListener()
1213 public void actionPerformed(ActionEvent e)
1215 conservationMenuItem_actionPerformed();
1220 protected void showNonconserved_actionPerformed()
1222 getGroup().setShowNonconserved(displayNonconserved.isSelected());
1227 * call to refresh view after settings change
1231 ap.updateAnnotation();
1232 ap.paintAlignment(true);
1234 PaintRefresher.Refresh(this, ap.av.getSequenceSetId());
1243 protected void clustalColour_actionPerformed()
1245 SequenceGroup sg = getGroup();
1246 sg.cs = new ClustalxColourScheme(
1247 sg.getSequences(ap.av.hiddenRepSequences),
1248 ap.av.alignment.getWidth());
1258 protected void zappoColour_actionPerformed()
1260 getGroup().cs = new ZappoColourScheme();
1270 protected void taylorColour_actionPerformed()
1272 getGroup().cs = new TaylorColourScheme();
1282 protected void hydrophobicityColour_actionPerformed()
1284 getGroup().cs = new HydrophobicColourScheme();
1294 protected void helixColour_actionPerformed()
1296 getGroup().cs = new HelixColourScheme();
1306 protected void strandColour_actionPerformed()
1308 getGroup().cs = new StrandColourScheme();
1318 protected void turnColour_actionPerformed()
1320 getGroup().cs = new TurnColourScheme();
1330 protected void buriedColour_actionPerformed()
1332 getGroup().cs = new BuriedColourScheme();
1342 public void nucleotideMenuItem_actionPerformed()
1344 getGroup().cs = new NucleotideColourScheme();
1348 protected void purinePyrimidineColour_actionPerformed()
1350 getGroup().cs = new PurinePyrimidineColourScheme();
1354 protected void covariationColour_actionPerformed()
1356 getGroup().cs = new CovariationColourScheme(sequence.getAnnotation()[0]);
1366 protected void abovePIDColour_actionPerformed()
1368 SequenceGroup sg = getGroup();
1374 if (abovePIDColour.isSelected())
1376 sg.cs.setConsensus(AAFrequency.calculate(
1377 sg.getSequences(ap.av.hiddenRepSequences), sg.getStartRes(),
1378 sg.getEndRes() + 1));
1380 int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup()
1383 sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());
1385 SliderPanel.showPIDSlider();
1388 // remove PIDColouring
1390 sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());
1402 protected void userDefinedColour_actionPerformed(ActionEvent e)
1404 SequenceGroup sg = getGroup();
1406 if (e.getActionCommand().equals("User Defined..."))
1408 new UserDefinedColours(ap, sg);
1412 UserColourScheme udc = (UserColourScheme) UserDefinedColours
1413 .getUserColourSchemes().get(e.getActionCommand());
1426 protected void PIDColour_actionPerformed()
1428 SequenceGroup sg = getGroup();
1429 sg.cs = new PIDColourScheme();
1430 sg.cs.setConsensus(AAFrequency.calculate(
1431 sg.getSequences(ap.av.hiddenRepSequences), sg.getStartRes(),
1432 sg.getEndRes() + 1));
1442 protected void BLOSUM62Colour_actionPerformed()
1444 SequenceGroup sg = getGroup();
1446 sg.cs = new Blosum62ColourScheme();
1448 sg.cs.setConsensus(AAFrequency.calculate(
1449 sg.getSequences(ap.av.hiddenRepSequences), sg.getStartRes(),
1450 sg.getEndRes() + 1));
1461 protected void noColourmenuItem_actionPerformed()
1463 getGroup().cs = null;
1473 protected void conservationMenuItem_actionPerformed()
1475 SequenceGroup sg = getGroup();
1481 if (conservationMenuItem.isSelected())
1483 Conservation c = new Conservation("Group",
1484 ResidueProperties.propHash, 3,
1485 sg.getSequences(ap.av.hiddenRepSequences), sg.getStartRes(),
1486 sg.getEndRes() + 1);
1489 c.verdict(false, ap.av.ConsPercGaps);
1491 sg.cs.setConservation(c);
1493 SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());
1494 SliderPanel.showConservationSlider();
1497 // remove ConservationColouring
1499 sg.cs.setConservation(null);
1505 public void annotationMenuItem_actionPerformed(ActionEvent actionEvent)
1507 SequenceGroup sg = getGroup();
1513 AnnotationColourGradient acg = new AnnotationColourGradient(
1514 sequence.getAnnotation()[0], null,
1515 AnnotationColourGradient.NO_THRESHOLD);
1517 acg.predefinedColours = true;
1529 protected void groupName_actionPerformed()
1532 SequenceGroup sg = getGroup();
1533 EditNameDialog dialog = new EditNameDialog(sg.getName(),
1534 sg.getDescription(), " Group Name ",
1535 "Group Description ", "Edit Group Name/Description",
1543 sg.setName(dialog.getName());
1544 sg.setDescription(dialog.getDescription());
1549 * Get selection group - adding it to the alignment if necessary.
1551 * @return sequence group to operate on
1553 SequenceGroup getGroup()
1555 SequenceGroup sg = ap.av.getSelectionGroup();
1556 // this method won't add a new group if it already exists
1559 ap.av.alignment.addGroup(sg);
1571 void sequenceName_actionPerformed()
1573 EditNameDialog dialog = new EditNameDialog(sequence.getName(),
1574 sequence.getDescription(), " Sequence Name ",
1575 "Sequence Description ", "Edit Sequence Name/Description",
1583 if (dialog.getName() != null)
1585 if (dialog.getName().indexOf(" ") > -1)
1587 JOptionPane.showMessageDialog(ap,
1588 "Spaces have been converted to \"_\"",
1589 "No spaces allowed in Sequence Name",
1590 JOptionPane.WARNING_MESSAGE);
1593 sequence.setName(dialog.getName().replace(' ', '_'));
1594 ap.paintAlignment(false);
1597 sequence.setDescription(dialog.getDescription());
1599 ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
1610 void unGroupMenuItem_actionPerformed()
1612 SequenceGroup sg = ap.av.getSelectionGroup();
1613 ap.av.alignment.deleteGroup(sg);
1614 ap.av.setSelectionGroup(null);
1624 protected void outline_actionPerformed()
1626 SequenceGroup sg = getGroup();
1627 Color col = JColorChooser.showDialog(this, "Select Outline Colour",
1632 sg.setOutlineColour(col);
1644 public void showBoxes_actionPerformed()
1646 getGroup().setDisplayBoxes(showBoxes.isSelected());
1656 public void showText_actionPerformed()
1658 getGroup().setDisplayText(showText.isSelected());
1668 public void showColourText_actionPerformed()
1670 getGroup().setColourText(showColourText.isSelected());
1674 public void showLink(String url)
1678 jalview.util.BrowserLauncher.openURL(url);
1679 } catch (Exception ex)
1682 .showInternalMessageDialog(
1684 "Unixers: Couldn't find default web browser."
1685 + "\nAdd the full path to your browser in Preferences.",
1686 "Web browser not found", JOptionPane.WARNING_MESSAGE);
1688 ex.printStackTrace();
1692 void hideSequences(boolean representGroup)
1694 SequenceGroup sg = ap.av.getSelectionGroup();
1695 if (sg == null || sg.getSize() < 1)
1697 ap.av.hideSequence(new SequenceI[]
1702 ap.av.setSelectionGroup(null);
1706 ap.av.hideRepSequences(sequence, sg);
1711 int gsize = sg.getSize();
1714 hseqs = new SequenceI[gsize];
1717 for (int i = 0; i < gsize; i++)
1719 hseqs[index++] = sg.getSequenceAt(i);
1722 ap.av.hideSequence(hseqs);
1723 // refresh(); TODO: ? needed ?
1724 ap.av.sendSelection();
1727 public void copy_actionPerformed()
1729 ap.alignFrame.copy_actionPerformed(null);
1732 public void cut_actionPerformed()
1734 ap.alignFrame.cut_actionPerformed(null);
1737 void changeCase(ActionEvent e)
1739 Object source = e.getSource();
1740 SequenceGroup sg = ap.av.getSelectionGroup();
1744 int[][] startEnd = ap.av.getVisibleRegionBoundaries(sg.getStartRes(),
1745 sg.getEndRes() + 1);
1750 if (source == toggle)
1752 description = "Toggle Case";
1753 caseChange = ChangeCaseCommand.TOGGLE_CASE;
1755 else if (source == upperCase)
1757 description = "To Upper Case";
1758 caseChange = ChangeCaseCommand.TO_UPPER;
1762 description = "To Lower Case";
1763 caseChange = ChangeCaseCommand.TO_LOWER;
1766 ChangeCaseCommand caseCommand = new ChangeCaseCommand(description,
1767 sg.getSequencesAsArray(ap.av.hiddenRepSequences), startEnd,
1770 ap.alignFrame.addHistoryItem(caseCommand);
1772 ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
1778 public void outputText_actionPerformed(ActionEvent e)
1780 CutAndPasteTransfer cap = new CutAndPasteTransfer();
1781 cap.setForInput(null);
1782 Desktop.addInternalFrame(cap,
1783 "Alignment output - " + e.getActionCommand(), 600, 500);
1785 String[] omitHidden = null;
1787 System.out.println("PROMPT USER HERE"); // TODO: decide if a prompt happens
1788 // or we simply trust the user wants
1789 // wysiwig behaviour
1790 SequenceGroup sg = ap.av.getSelectionGroup();
1791 ColumnSelection csel = new ColumnSelection(ap.av.getColumnSelection());
1792 omitHidden = ap.av.getViewAsString(true);
1793 Alignment oal = new Alignment(ap.av.getSequenceSelection());
1794 AlignmentAnnotation[] nala = ap.av.alignment.getAlignmentAnnotation();
1797 for (int i = 0; i < nala.length; i++)
1799 AlignmentAnnotation na = nala[i];
1800 oal.addAnnotation(na);
1803 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
1804 oal, omitHidden, csel, sg));
1808 public void pdbFromFile_actionPerformed()
1810 jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
1811 jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
1812 chooser.setFileView(new jalview.io.JalviewFileView());
1813 chooser.setDialogTitle("Select a PDB file for "+sequence.getDisplayId(false));
1814 chooser.setToolTipText("Load a PDB file and associate it with sequence '"+sequence.getDisplayId(false)+"'");
1816 int value = chooser.showOpenDialog(null);
1818 if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
1820 String choice = chooser.getSelectedFile().getPath();
1821 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
1822 new AssociatePdbFileWithSeq().associatePdbWithSeq(choice, jalview.io.AppletFormatAdapter.FILE, sequence, true);
1827 public void enterPDB_actionPerformed()
1829 String id = JOptionPane.showInternalInputDialog(Desktop.desktop,
1830 "Enter PDB Id", "Enter PDB Id", JOptionPane.QUESTION_MESSAGE);
1832 if (id != null && id.length() > 0)
1834 PDBEntry entry = new PDBEntry();
1835 entry.setId(id.toUpperCase());
1836 sequence.getDatasetSequence().addPDBId(entry);
1840 public void discoverPDB_actionPerformed()
1843 final SequenceI[] sequences = ((ap.av.selectionGroup == null) ? new Sequence[]
1845 : ap.av.selectionGroup.getSequencesInOrder(ap.av.alignment));
1846 Thread discpdb = new Thread(new Runnable()
1851 new jalview.ws.DBRefFetcher(sequences, ap.alignFrame)
1852 .fetchDBRefs(false);
1859 public void sequenceFeature_actionPerformed()
1861 SequenceGroup sg = ap.av.getSelectionGroup();
1867 int rsize = 0, gSize = sg.getSize();
1868 SequenceI[] rseqs, seqs = new SequenceI[gSize];
1869 SequenceFeature[] tfeatures, features = new SequenceFeature[gSize];
1871 for (int i = 0; i < gSize; i++)
1873 int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());
1874 int end = sg.findEndRes(sg.getSequenceAt(i));
1877 seqs[rsize] = sg.getSequenceAt(i).getDatasetSequence();
1878 features[rsize] = new SequenceFeature(null, null, null, start, end,
1883 rseqs = new SequenceI[rsize];
1884 tfeatures = new SequenceFeature[rsize];
1885 System.arraycopy(seqs, 0, rseqs, 0, rsize);
1886 System.arraycopy(features, 0, tfeatures, 0, rsize);
1887 features = tfeatures;
1889 if (ap.seqPanel.seqCanvas.getFeatureRenderer().amendFeatures(seqs,
1890 features, true, ap))
1892 ap.alignFrame.setShowSeqFeatures(true);
1893 ap.highlightSearchResults(null);
1897 public void textColour_actionPerformed()
1899 SequenceGroup sg = getGroup();
1902 new TextColourChooser().chooseColour(ap, sg);
1906 public void colourByStructure(String pdbid)
1908 Annotation[] anots = ap.av.getStructureSelectionManager().colourSequenceFromStructure(
1911 AlignmentAnnotation an = new AlignmentAnnotation("Structure",
1912 "Coloured by " + pdbid, anots);
1914 ap.av.alignment.addAnnotation(an);
1915 an.createSequenceMapping(sequence, 0, true);
1916 // an.adjustForAlignment();
1917 ap.av.alignment.setAnnotationIndex(an, 0);
1919 ap.adjustAnnotationHeight();
1921 sequence.addAlignmentAnnotation(an);
1925 public void editSequence_actionPerformed(ActionEvent actionEvent)
1927 SequenceGroup sg = ap.av.getSelectionGroup();
1931 if (sequence == null)
1932 sequence = (Sequence) sg.getSequenceAt(0);
1934 EditNameDialog dialog = new EditNameDialog(
1935 sequence.getSequenceAsString(sg.getStartRes(),
1936 sg.getEndRes() + 1), null, "Edit Sequence ", null,
1937 "Edit Sequence", ap.alignFrame);
1941 EditCommand editCommand = new EditCommand("Edit Sequences",
1942 EditCommand.REPLACE, dialog.getName().replace(' ',
1943 ap.av.getGapCharacter()),
1944 sg.getSequencesAsArray(ap.av.hiddenRepSequences),
1945 sg.getStartRes(), sg.getEndRes() + 1, ap.av.alignment);
1947 ap.alignFrame.addHistoryItem(editCommand);
1949 ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()