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();
273 //TODO: make rnastrucF a bit more nice
274 final String rnastrucF=rnastruc;
275 menuItem = new JMenuItem();
276 menuItem.setText("RNA structure");
277 menuItem.addActionListener(new java.awt.event.ActionListener()
279 public void actionPerformed(ActionEvent e)
281 System.out.println("Call Varna "+seq.getSequenceAsString()+" "+seq.getName());
282 //TODO: VARNA does'nt print gaps in the sequence
283 new AppVarna(seq.getSequenceAsString(),rnastrucF,seq.getName());
286 viewStructureMenu.add(menuItem);
289 menuItem = new JMenuItem("Hide Sequences");
290 menuItem.addActionListener(new java.awt.event.ActionListener()
292 public void actionPerformed(ActionEvent e)
294 hideSequences(false);
299 if (ap.av.getSelectionGroup() != null
300 && ap.av.getSelectionGroup().getSize() > 1)
302 menuItem = new JMenuItem("Represent Group with " + seq.getName());
303 menuItem.addActionListener(new java.awt.event.ActionListener()
305 public void actionPerformed(ActionEvent e)
310 sequenceMenu.add(menuItem);
313 if (ap.av.hasHiddenRows)
315 final int index = ap.av.alignment.findIndex(seq);
317 if (ap.av.adjustForHiddenSeqs(index)
318 - ap.av.adjustForHiddenSeqs(index - 1) > 1)
320 menuItem = new JMenuItem("Reveal Sequences");
321 menuItem.addActionListener(new ActionListener()
323 public void actionPerformed(ActionEvent e)
325 ap.av.showSequence(index);
326 if (ap.overviewPanel != null)
328 ap.overviewPanel.updateOverviewImage();
335 menuItem = new JMenuItem("Reveal All");
336 menuItem.addActionListener(new ActionListener()
338 public void actionPerformed(ActionEvent e)
340 ap.av.showAllHiddenSeqs();
341 if (ap.overviewPanel != null)
343 ap.overviewPanel.updateOverviewImage();
353 SequenceGroup sg = ap.av.getSelectionGroup();
357 groupName.setText("Name: "+sg.getName());
358 groupName.setText("Edit name and description of current group.");
360 if (sg.cs instanceof ZappoColourScheme)
362 zappoColour.setSelected(true);
364 else if (sg.cs instanceof TaylorColourScheme)
366 taylorColour.setSelected(true);
368 else if (sg.cs instanceof PIDColourScheme)
370 PIDColour.setSelected(true);
372 else if (sg.cs instanceof Blosum62ColourScheme)
374 BLOSUM62Colour.setSelected(true);
376 else if (sg.cs instanceof UserColourScheme)
378 userDefinedColour.setSelected(true);
380 else if (sg.cs instanceof HydrophobicColourScheme)
382 hydrophobicityColour.setSelected(true);
384 else if (sg.cs instanceof HelixColourScheme)
386 helixColour.setSelected(true);
388 else if (sg.cs instanceof StrandColourScheme)
390 strandColour.setSelected(true);
392 else if (sg.cs instanceof TurnColourScheme)
394 turnColour.setSelected(true);
396 else if (sg.cs instanceof BuriedColourScheme)
398 buriedColour.setSelected(true);
400 else if (sg.cs instanceof ClustalxColourScheme)
402 clustalColour.setSelected(true);
404 else if (sg.cs instanceof PurinePyrimidineColourScheme)
406 purinePyrimidineColour.setSelected(true);
408 /* else if (sg.cs instanceof CovariationColourScheme)
410 covariationColour.setSelected(true);
414 noColourmenuItem.setSelected(true);
417 if (sg.cs != null && sg.cs.conservationApplied())
419 conservationMenuItem.setSelected(true);
421 displayNonconserved.setSelected(sg.getShowNonconserved());
422 showText.setSelected(sg.getDisplayText());
423 showColourText.setSelected(sg.getColourText());
424 showBoxes.setSelected(sg.getDisplayBoxes());
425 // add any groupURLs to the groupURL submenu and make it visible
426 if (groupLinks != null && groupLinks.size() > 0)
428 buildGroupURLMenu(sg, groupLinks);
430 // Add a 'show all structures' for the current selection
431 Hashtable<String, PDBEntry> pdbe=new Hashtable<String,PDBEntry>();
432 for (SequenceI sq: ap.av.getSequenceSelection())
434 Vector<PDBEntry> pes = (Vector<PDBEntry>) sq.getDatasetSequence().getPDBId();
436 for (PDBEntry pe: pes)
438 pdbe.put(pe.getId(), pe);
444 final PDBEntry[] pe = pdbe.values().toArray(new PDBEntry[pdbe.size()]);
445 final JMenuItem gpdbview;
446 structureMenu.add(gpdbview=new JMenuItem("View "+pdbe.size()+" structures."));
447 gpdbview.setToolTipText("Open a new Jmol view with all structures associated with the current selection and superimpose them using the alignment.");
448 gpdbview.addActionListener(new ActionListener()
452 public void actionPerformed(ActionEvent e)
454 new AppJmol(ap, pe, ap.av.collateForPDB(pe));
461 groupMenu.setVisible(false);
462 editMenu.setVisible(false);
465 if (!ap.av.alignment.getGroups().contains(sg))
467 unGroupMenuItem.setVisible(false);
472 sequenceMenu.setVisible(false);
473 structureMenu.setVisible(false);
476 if (links != null && links.size() > 0)
479 JMenu linkMenu = new JMenu("Link");
480 Vector linkset = new Vector();
481 for (int i = 0; i < links.size(); i++)
483 String link = links.elementAt(i).toString();
484 UrlLink urlLink = null;
487 urlLink = new UrlLink(link);
488 } catch (Exception foo)
490 jalview.bin.Cache.log.error("Exception for URLLink '" + link
495 if (!urlLink.isValid())
497 jalview.bin.Cache.log.error(urlLink.getInvalidMessage());
500 final String label = urlLink.getLabel();
501 if (urlLink.isDynamic())
504 // collect matching db-refs
505 DBRefEntry[] dbr = jalview.util.DBRefUtils.selectRefs(
506 seq.getDBRef(), new String[]
507 { urlLink.getTarget() });
508 // collect id string too
509 String id = seq.getName();
510 String descr = seq.getDescription();
511 if (descr != null && descr.length() < 1)
518 for (int r = 0; r < dbr.length; r++)
520 if (id != null && dbr[r].getAccessionId().equals(id))
522 // suppress duplicate link creation for the bare sequence ID
523 // string with this link
526 // create Bare ID link for this RUL
527 String[] urls = urlLink.makeUrls(dbr[r].getAccessionId(),
531 for (int u = 0; u < urls.length; u += 2)
533 if (!linkset.contains(urls[u] + "|" + urls[u + 1]))
535 linkset.addElement(urls[u] + "|" + urls[u + 1]);
536 addshowLink(linkMenu, label + "|" + urls[u],
545 // create Bare ID link for this RUL
546 String[] urls = urlLink.makeUrls(id, true);
549 for (int u = 0; u < urls.length; u += 2)
551 if (!linkset.contains(urls[u] + "|" + urls[u + 1]))
553 linkset.addElement(urls[u] + "|" + urls[u + 1]);
554 addshowLink(linkMenu, label, urls[u + 1]);
559 // Create urls from description but only for URL links which are regex
561 if (descr != null && urlLink.getRegexReplace() != null)
563 // create link for this URL from description where regex matches
564 String[] urls = urlLink.makeUrls(descr, true);
567 for (int u = 0; u < urls.length; u += 2)
569 if (!linkset.contains(urls[u] + "|" + urls[u + 1]))
571 linkset.addElement(urls[u] + "|" + urls[u + 1]);
572 addshowLink(linkMenu, label, urls[u + 1]);
580 if (!linkset.contains(label + "|" + urlLink.getUrl_prefix()))
582 linkset.addElement(label + "|" + urlLink.getUrl_prefix());
583 // Add a non-dynamic link
584 addshowLink(linkMenu, label, urlLink.getUrl_prefix());
588 if (sequence != null)
590 sequenceMenu.add(linkMenu);
599 private void buildGroupURLMenu(SequenceGroup sg, Vector groupLinks)
602 // TODO: usability: thread off the generation of group url content so root
604 // sequence only URLs
605 // ID/regex match URLs
606 groupLinksMenu = new JMenu("Group Link");
607 JMenu[] linkMenus = new JMenu[]
608 { null, new JMenu("IDS"), new JMenu("Sequences"),
609 new JMenu("IDS and Sequences") }; // three types of url that might be
611 SequenceI[] seqs = ap.av.getSelectionAsNewSequence();
612 String[][] idandseqs = GroupUrlLink.formStrings(seqs);
613 Hashtable commonDbrefs = new Hashtable();
614 for (int sq = 0; sq < seqs.length; sq++)
617 int start = seqs[sq].findPosition(sg.getStartRes()), end = seqs[sq]
618 .findPosition(sg.getEndRes());
619 // just collect ids from dataset sequence
620 // TODO: check if IDs collected from selecton group intersects with the
621 // current selection, too
622 SequenceI sqi = seqs[sq];
623 while (sqi.getDatasetSequence() != null)
625 sqi = sqi.getDatasetSequence();
627 DBRefEntry[] dbr = sqi.getDBRef();
628 if (dbr != null && dbr.length > 0)
630 for (int d = 0; d < dbr.length; d++)
632 String src = dbr[d].getSource(); // jalview.util.DBRefUtils.getCanonicalName(dbr[d].getSource()).toUpperCase();
633 Object[] sarray = (Object[]) commonDbrefs.get(src);
636 sarray = new Object[2];
637 sarray[0] = new int[]
639 sarray[1] = new String[seqs.length];
641 commonDbrefs.put(src, sarray);
644 if (((String[]) sarray[1])[sq] == null)
647 || (dbr[d].getMap().locateMappedRange(start, end) != null))
649 ((String[]) sarray[1])[sq] = dbr[d].getAccessionId();
650 ((int[]) sarray[0])[0]++;
656 // now create group links for all distinct ID/sequence sets.
657 boolean addMenu = false; // indicates if there are any group links to give
659 for (int i = 0; i < groupLinks.size(); i++)
661 String link = groupLinks.elementAt(i).toString();
662 GroupUrlLink urlLink = null;
665 urlLink = new GroupUrlLink(link);
666 } catch (Exception foo)
668 jalview.bin.Cache.log.error("Exception for GroupURLLink '" + link
673 if (!urlLink.isValid())
675 jalview.bin.Cache.log.error(urlLink.getInvalidMessage());
678 final String label = urlLink.getLabel();
679 boolean usingNames = false;
680 // Now see which parts of the group apply for this URL
681 String ltarget = urlLink.getTarget(); // jalview.util.DBRefUtils.getCanonicalName(urlLink.getTarget());
682 Object[] idset = (Object[]) commonDbrefs.get(ltarget.toUpperCase());
683 String[] seqstr, ids; // input to makeUrl
686 int numinput = ((int[]) idset[0])[0];
687 String[] allids = ((String[]) idset[1]);
688 seqstr = new String[numinput];
689 ids = new String[numinput];
690 for (int sq = 0, idcount = 0; sq < seqs.length; sq++)
692 if (allids[sq] != null)
694 ids[idcount] = allids[sq];
695 seqstr[idcount++] = idandseqs[1][sq];
701 // just use the id/seq set
702 seqstr = idandseqs[1];
706 // and try and make the groupURL!
708 Object[] urlset = null;
711 urlset = urlLink.makeUrlStubs(ids, seqstr,
712 "FromJalview" + System.currentTimeMillis(), false);
713 } catch (UrlStringTooLongException e)
718 int type = urlLink.getGroupURLType() & 3;
719 // System.out.println(urlLink.getGroupURLType()
720 // +" "+((String[])urlset[3])[0]);
721 // first two bits ofurlLink type bitfield are sequenceids and sequences
722 // TODO: FUTURE: ensure the groupURL menu structure can be generalised
723 addshowLink(linkMenus[type], label
724 + (((type & 1) == 1) ? ("("
725 + (usingNames ? "Names" : ltarget) + ")") : ""),
732 groupLinksMenu = new JMenu("Group Links");
733 for (int m = 0; m < linkMenus.length; m++)
735 if (linkMenus[m] != null
736 && linkMenus[m].getMenuComponentCount() > 0)
738 groupLinksMenu.add(linkMenus[m]);
742 groupMenu.add(groupLinksMenu);
747 * add a show URL menu item to the given linkMenu
751 * - menu label string
755 private void addshowLink(JMenu linkMenu, String label, final String url)
757 JMenuItem item = new JMenuItem(label);
758 item.setToolTipText("open URL: " + url);
759 item.addActionListener(new java.awt.event.ActionListener()
761 public void actionPerformed(ActionEvent e)
763 new Thread(new Runnable()
779 * add a late bound groupURL item to the given linkMenu
783 * - menu label string
784 * @param urlgenerator
785 * GroupURLLink used to generate URL
787 * Object array returned from the makeUrlStubs function.
789 private void addshowLink(JMenu linkMenu, String label,
790 final GroupUrlLink urlgenerator, final Object[] urlstub)
792 JMenuItem item = new JMenuItem(label);
793 item.setToolTipText("open URL (" + urlgenerator.getUrl_prefix()
794 + "..) (" + urlgenerator.getNumberInvolved(urlstub) + " seqs)"); // TODO:
803 item.addActionListener(new java.awt.event.ActionListener()
805 public void actionPerformed(ActionEvent e)
807 new Thread(new Runnable()
814 showLink(urlgenerator.constructFrom(urlstub));
815 } catch (UrlStringTooLongException e)
833 private void jbInit() throws Exception
835 groupMenu.setText("Group");
836 groupMenu.setText("Selection");
837 groupName.setText("Name");
838 groupName.addActionListener(new java.awt.event.ActionListener()
840 public void actionPerformed(ActionEvent e)
842 groupName_actionPerformed();
845 sequenceMenu.setText("Sequence");
846 sequenceName.setText("Edit Name/Description");
847 sequenceName.addActionListener(new java.awt.event.ActionListener()
849 public void actionPerformed(ActionEvent e)
851 sequenceName_actionPerformed();
854 PIDColour.setFocusPainted(false);
855 unGroupMenuItem.setText("Remove Group");
856 unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
858 public void actionPerformed(ActionEvent e)
860 unGroupMenuItem_actionPerformed();
864 outline.setText("Border colour");
865 outline.addActionListener(new java.awt.event.ActionListener()
867 public void actionPerformed(ActionEvent e)
869 outline_actionPerformed();
872 nucleotideMenuItem.setText("Nucleotide");
873 nucleotideMenuItem.addActionListener(new ActionListener()
875 public void actionPerformed(ActionEvent e)
877 nucleotideMenuItem_actionPerformed();
880 colourMenu.setText("Group Colour");
881 showBoxes.setText("Boxes");
882 showBoxes.setState(true);
883 showBoxes.addActionListener(new ActionListener()
885 public void actionPerformed(ActionEvent e)
887 showBoxes_actionPerformed();
890 showText.setText("Text");
891 showText.setState(true);
892 showText.addActionListener(new ActionListener()
894 public void actionPerformed(ActionEvent e)
896 showText_actionPerformed();
899 showColourText.setText("Colour Text");
900 showColourText.addActionListener(new ActionListener()
902 public void actionPerformed(ActionEvent e)
904 showColourText_actionPerformed();
907 displayNonconserved.setText("Show Nonconserved");
908 displayNonconserved.setState(true);
909 displayNonconserved.addActionListener(new ActionListener()
911 public void actionPerformed(ActionEvent e)
913 showNonconserved_actionPerformed();
916 editMenu.setText("Edit");
918 cut.addActionListener(new ActionListener()
920 public void actionPerformed(ActionEvent e)
922 cut_actionPerformed();
925 upperCase.setText("To Upper Case");
926 upperCase.addActionListener(new ActionListener()
928 public void actionPerformed(ActionEvent e)
933 copy.setText("Copy");
934 copy.addActionListener(new ActionListener()
936 public void actionPerformed(ActionEvent e)
938 copy_actionPerformed();
941 lowerCase.setText("To Lower Case");
942 lowerCase.addActionListener(new ActionListener()
944 public void actionPerformed(ActionEvent e)
949 toggle.setText("Toggle Case");
950 toggle.addActionListener(new ActionListener()
952 public void actionPerformed(ActionEvent e)
957 pdbMenu.setText("Associate Structure with Sequence");
958 pdbFromFile.setText("From File");
959 pdbFromFile.addActionListener(new ActionListener()
961 public void actionPerformed(ActionEvent e)
963 pdbFromFile_actionPerformed();
966 enterPDB.setText("Enter PDB Id");
967 enterPDB.addActionListener(new ActionListener()
969 public void actionPerformed(ActionEvent e)
971 enterPDB_actionPerformed();
974 discoverPDB.setText("Discover PDB ids");
975 discoverPDB.addActionListener(new ActionListener()
977 public void actionPerformed(ActionEvent e)
979 discoverPDB_actionPerformed();
982 outputMenu.setText("Output to Textbox...");
983 sequenceFeature.setText("Create Sequence Feature");
984 sequenceFeature.addActionListener(new ActionListener()
986 public void actionPerformed(ActionEvent e)
988 sequenceFeature_actionPerformed();
991 textColour.setText("Text Colour");
992 textColour.addActionListener(new ActionListener()
994 public void actionPerformed(ActionEvent e)
996 textColour_actionPerformed();
999 jMenu1.setText("Group");
1000 structureMenu.setText("Structure");
1001 viewStructureMenu.setText("View Structure");
1002 // colStructureMenu.setText("Colour By Structure");
1003 editSequence.setText("Edit Sequence...");
1004 editSequence.addActionListener(new ActionListener()
1006 public void actionPerformed(ActionEvent actionEvent)
1008 editSequence_actionPerformed(actionEvent);
1012 * annotationMenuItem.setText("By Annotation");
1013 * annotationMenuItem.addActionListener(new ActionListener() { public void
1014 * actionPerformed(ActionEvent actionEvent) {
1015 * annotationMenuItem_actionPerformed(actionEvent); } });
1021 this.add(structureMenu);
1022 groupMenu.add(editMenu);
1023 groupMenu.add(outputMenu);
1024 groupMenu.add(sequenceFeature);
1025 groupMenu.add(jMenu1);
1026 sequenceMenu.add(sequenceName);
1027 colourMenu.add(textColour);
1028 colourMenu.add(noColourmenuItem);
1029 colourMenu.add(clustalColour);
1030 colourMenu.add(BLOSUM62Colour);
1031 colourMenu.add(PIDColour);
1032 colourMenu.add(zappoColour);
1033 colourMenu.add(taylorColour);
1034 colourMenu.add(hydrophobicityColour);
1035 colourMenu.add(helixColour);
1036 colourMenu.add(strandColour);
1037 colourMenu.add(turnColour);
1038 colourMenu.add(buriedColour);
1039 colourMenu.add(nucleotideMenuItem);
1040 colourMenu.add(purinePyrimidineColour);
1041 //colourMenu.add(covariationColour);
1042 colourMenu.add(userDefinedColour);
1044 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
1046 java.util.Enumeration userColours = jalview.gui.UserDefinedColours
1047 .getUserColourSchemes().keys();
1049 while (userColours.hasMoreElements())
1051 JMenuItem item = new JMenuItem(userColours.nextElement().toString());
1052 item.addActionListener(new ActionListener()
1054 public void actionPerformed(ActionEvent evt)
1056 userDefinedColour_actionPerformed(evt);
1059 colourMenu.add(item);
1063 colourMenu.addSeparator();
1064 colourMenu.add(abovePIDColour);
1065 colourMenu.add(conservationMenuItem);
1066 // colourMenu.add(annotationMenuItem);
1069 editMenu.add(editSequence);
1070 editMenu.add(upperCase);
1071 editMenu.add(lowerCase);
1072 editMenu.add(toggle);
1073 pdbMenu.add(pdbFromFile);
1074 pdbMenu.add(enterPDB);
1075 pdbMenu.add(discoverPDB);
1076 jMenu1.add(groupName);
1077 jMenu1.add(unGroupMenuItem);
1078 jMenu1.add(colourMenu);
1079 jMenu1.add(showBoxes);
1080 jMenu1.add(showText);
1081 jMenu1.add(showColourText);
1082 jMenu1.add(outline);
1083 jMenu1.add(displayNonconserved);
1084 structureMenu.add(pdbMenu);
1085 structureMenu.add(viewStructureMenu);
1086 // structureMenu.add(colStructureMenu);
1087 noColourmenuItem.setText("None");
1088 noColourmenuItem.addActionListener(new java.awt.event.ActionListener()
1090 public void actionPerformed(ActionEvent e)
1092 noColourmenuItem_actionPerformed();
1096 clustalColour.setText("Clustalx colours");
1097 clustalColour.addActionListener(new java.awt.event.ActionListener()
1099 public void actionPerformed(ActionEvent e)
1101 clustalColour_actionPerformed();
1104 zappoColour.setText("Zappo");
1105 zappoColour.addActionListener(new java.awt.event.ActionListener()
1107 public void actionPerformed(ActionEvent e)
1109 zappoColour_actionPerformed();
1112 taylorColour.setText("Taylor");
1113 taylorColour.addActionListener(new java.awt.event.ActionListener()
1115 public void actionPerformed(ActionEvent e)
1117 taylorColour_actionPerformed();
1120 hydrophobicityColour.setText("Hydrophobicity");
1121 hydrophobicityColour
1122 .addActionListener(new java.awt.event.ActionListener()
1124 public void actionPerformed(ActionEvent e)
1126 hydrophobicityColour_actionPerformed();
1129 helixColour.setText("Helix propensity");
1130 helixColour.addActionListener(new java.awt.event.ActionListener()
1132 public void actionPerformed(ActionEvent e)
1134 helixColour_actionPerformed();
1137 strandColour.setText("Strand propensity");
1138 strandColour.addActionListener(new java.awt.event.ActionListener()
1140 public void actionPerformed(ActionEvent e)
1142 strandColour_actionPerformed();
1145 turnColour.setText("Turn propensity");
1146 turnColour.addActionListener(new java.awt.event.ActionListener()
1148 public void actionPerformed(ActionEvent e)
1150 turnColour_actionPerformed();
1153 buriedColour.setText("Buried Index");
1154 buriedColour.addActionListener(new java.awt.event.ActionListener()
1156 public void actionPerformed(ActionEvent e)
1158 buriedColour_actionPerformed();
1161 abovePIDColour.setText("Above % Identity");
1162 abovePIDColour.addActionListener(new java.awt.event.ActionListener()
1164 public void actionPerformed(ActionEvent e)
1166 abovePIDColour_actionPerformed();
1169 userDefinedColour.setText("User Defined...");
1170 userDefinedColour.addActionListener(new java.awt.event.ActionListener()
1172 public void actionPerformed(ActionEvent e)
1174 userDefinedColour_actionPerformed(e);
1177 PIDColour.setText("Percentage Identity");
1178 PIDColour.addActionListener(new java.awt.event.ActionListener()
1180 public void actionPerformed(ActionEvent e)
1182 PIDColour_actionPerformed();
1185 BLOSUM62Colour.setText("BLOSUM62");
1186 BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()
1188 public void actionPerformed(ActionEvent e)
1190 BLOSUM62Colour_actionPerformed();
1193 purinePyrimidineColour.setText("Purine/Pyrimidine");
1194 purinePyrimidineColour.addActionListener(new java.awt.event.ActionListener()
1196 public void actionPerformed(ActionEvent e)
1198 purinePyrimidineColour_actionPerformed();
1202 covariationColour.addActionListener(new java.awt.event.ActionListener()
1204 public void actionPerformed(ActionEvent e)
1206 covariationColour_actionPerformed();
1210 conservationMenuItem.setText("Conservation");
1211 conservationMenuItem
1212 .addActionListener(new java.awt.event.ActionListener()
1214 public void actionPerformed(ActionEvent e)
1216 conservationMenuItem_actionPerformed();
1221 protected void showNonconserved_actionPerformed()
1223 getGroup().setShowNonconserved(displayNonconserved.isSelected());
1228 * call to refresh view after settings change
1232 ap.updateAnnotation();
1233 ap.paintAlignment(true);
1235 PaintRefresher.Refresh(this, ap.av.getSequenceSetId());
1244 protected void clustalColour_actionPerformed()
1246 SequenceGroup sg = getGroup();
1247 sg.cs = new ClustalxColourScheme(
1248 sg.getSequences(ap.av.hiddenRepSequences),
1249 ap.av.alignment.getWidth());
1259 protected void zappoColour_actionPerformed()
1261 getGroup().cs = new ZappoColourScheme();
1271 protected void taylorColour_actionPerformed()
1273 getGroup().cs = new TaylorColourScheme();
1283 protected void hydrophobicityColour_actionPerformed()
1285 getGroup().cs = new HydrophobicColourScheme();
1295 protected void helixColour_actionPerformed()
1297 getGroup().cs = new HelixColourScheme();
1307 protected void strandColour_actionPerformed()
1309 getGroup().cs = new StrandColourScheme();
1319 protected void turnColour_actionPerformed()
1321 getGroup().cs = new TurnColourScheme();
1331 protected void buriedColour_actionPerformed()
1333 getGroup().cs = new BuriedColourScheme();
1343 public void nucleotideMenuItem_actionPerformed()
1345 getGroup().cs = new NucleotideColourScheme();
1349 protected void purinePyrimidineColour_actionPerformed()
1351 getGroup().cs = new PurinePyrimidineColourScheme();
1355 protected void covariationColour_actionPerformed()
1357 getGroup().cs = new CovariationColourScheme(sequence.getAnnotation()[0]);
1367 protected void abovePIDColour_actionPerformed()
1369 SequenceGroup sg = getGroup();
1375 if (abovePIDColour.isSelected())
1377 sg.cs.setConsensus(AAFrequency.calculate(
1378 sg.getSequences(ap.av.hiddenRepSequences), sg.getStartRes(),
1379 sg.getEndRes() + 1));
1381 int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup()
1384 sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());
1386 SliderPanel.showPIDSlider();
1389 // remove PIDColouring
1391 sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());
1403 protected void userDefinedColour_actionPerformed(ActionEvent e)
1405 SequenceGroup sg = getGroup();
1407 if (e.getActionCommand().equals("User Defined..."))
1409 new UserDefinedColours(ap, sg);
1413 UserColourScheme udc = (UserColourScheme) UserDefinedColours
1414 .getUserColourSchemes().get(e.getActionCommand());
1427 protected void PIDColour_actionPerformed()
1429 SequenceGroup sg = getGroup();
1430 sg.cs = new PIDColourScheme();
1431 sg.cs.setConsensus(AAFrequency.calculate(
1432 sg.getSequences(ap.av.hiddenRepSequences), sg.getStartRes(),
1433 sg.getEndRes() + 1));
1443 protected void BLOSUM62Colour_actionPerformed()
1445 SequenceGroup sg = getGroup();
1447 sg.cs = new Blosum62ColourScheme();
1449 sg.cs.setConsensus(AAFrequency.calculate(
1450 sg.getSequences(ap.av.hiddenRepSequences), sg.getStartRes(),
1451 sg.getEndRes() + 1));
1462 protected void noColourmenuItem_actionPerformed()
1464 getGroup().cs = null;
1474 protected void conservationMenuItem_actionPerformed()
1476 SequenceGroup sg = getGroup();
1482 if (conservationMenuItem.isSelected())
1484 Conservation c = new Conservation("Group",
1485 ResidueProperties.propHash, 3,
1486 sg.getSequences(ap.av.hiddenRepSequences), sg.getStartRes(),
1487 sg.getEndRes() + 1);
1490 c.verdict(false, ap.av.ConsPercGaps);
1492 sg.cs.setConservation(c);
1494 SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());
1495 SliderPanel.showConservationSlider();
1498 // remove ConservationColouring
1500 sg.cs.setConservation(null);
1506 public void annotationMenuItem_actionPerformed(ActionEvent actionEvent)
1508 SequenceGroup sg = getGroup();
1514 AnnotationColourGradient acg = new AnnotationColourGradient(
1515 sequence.getAnnotation()[0], null,
1516 AnnotationColourGradient.NO_THRESHOLD);
1518 acg.predefinedColours = true;
1530 protected void groupName_actionPerformed()
1533 SequenceGroup sg = getGroup();
1534 EditNameDialog dialog = new EditNameDialog(sg.getName(),
1535 sg.getDescription(), " Group Name ",
1536 "Group Description ", "Edit Group Name/Description",
1544 sg.setName(dialog.getName());
1545 sg.setDescription(dialog.getDescription());
1550 * Get selection group - adding it to the alignment if necessary.
1552 * @return sequence group to operate on
1554 SequenceGroup getGroup()
1556 SequenceGroup sg = ap.av.getSelectionGroup();
1557 // this method won't add a new group if it already exists
1560 ap.av.alignment.addGroup(sg);
1572 void sequenceName_actionPerformed()
1574 EditNameDialog dialog = new EditNameDialog(sequence.getName(),
1575 sequence.getDescription(), " Sequence Name ",
1576 "Sequence Description ", "Edit Sequence Name/Description",
1584 if (dialog.getName() != null)
1586 if (dialog.getName().indexOf(" ") > -1)
1588 JOptionPane.showMessageDialog(ap,
1589 "Spaces have been converted to \"_\"",
1590 "No spaces allowed in Sequence Name",
1591 JOptionPane.WARNING_MESSAGE);
1594 sequence.setName(dialog.getName().replace(' ', '_'));
1595 ap.paintAlignment(false);
1598 sequence.setDescription(dialog.getDescription());
1600 ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
1611 void unGroupMenuItem_actionPerformed()
1613 SequenceGroup sg = ap.av.getSelectionGroup();
1614 ap.av.alignment.deleteGroup(sg);
1615 ap.av.setSelectionGroup(null);
1625 protected void outline_actionPerformed()
1627 SequenceGroup sg = getGroup();
1628 Color col = JColorChooser.showDialog(this, "Select Outline Colour",
1633 sg.setOutlineColour(col);
1645 public void showBoxes_actionPerformed()
1647 getGroup().setDisplayBoxes(showBoxes.isSelected());
1657 public void showText_actionPerformed()
1659 getGroup().setDisplayText(showText.isSelected());
1669 public void showColourText_actionPerformed()
1671 getGroup().setColourText(showColourText.isSelected());
1675 public void showLink(String url)
1679 jalview.util.BrowserLauncher.openURL(url);
1680 } catch (Exception ex)
1683 .showInternalMessageDialog(
1685 "Unixers: Couldn't find default web browser."
1686 + "\nAdd the full path to your browser in Preferences.",
1687 "Web browser not found", JOptionPane.WARNING_MESSAGE);
1689 ex.printStackTrace();
1693 void hideSequences(boolean representGroup)
1695 SequenceGroup sg = ap.av.getSelectionGroup();
1696 if (sg == null || sg.getSize() < 1)
1698 ap.av.hideSequence(new SequenceI[]
1703 ap.av.setSelectionGroup(null);
1707 ap.av.hideRepSequences(sequence, sg);
1712 int gsize = sg.getSize();
1715 hseqs = new SequenceI[gsize];
1718 for (int i = 0; i < gsize; i++)
1720 hseqs[index++] = sg.getSequenceAt(i);
1723 ap.av.hideSequence(hseqs);
1724 // refresh(); TODO: ? needed ?
1725 ap.av.sendSelection();
1728 public void copy_actionPerformed()
1730 ap.alignFrame.copy_actionPerformed(null);
1733 public void cut_actionPerformed()
1735 ap.alignFrame.cut_actionPerformed(null);
1738 void changeCase(ActionEvent e)
1740 Object source = e.getSource();
1741 SequenceGroup sg = ap.av.getSelectionGroup();
1745 int[][] startEnd = ap.av.getVisibleRegionBoundaries(sg.getStartRes(),
1746 sg.getEndRes() + 1);
1751 if (source == toggle)
1753 description = "Toggle Case";
1754 caseChange = ChangeCaseCommand.TOGGLE_CASE;
1756 else if (source == upperCase)
1758 description = "To Upper Case";
1759 caseChange = ChangeCaseCommand.TO_UPPER;
1763 description = "To Lower Case";
1764 caseChange = ChangeCaseCommand.TO_LOWER;
1767 ChangeCaseCommand caseCommand = new ChangeCaseCommand(description,
1768 sg.getSequencesAsArray(ap.av.hiddenRepSequences), startEnd,
1771 ap.alignFrame.addHistoryItem(caseCommand);
1773 ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
1779 public void outputText_actionPerformed(ActionEvent e)
1781 CutAndPasteTransfer cap = new CutAndPasteTransfer();
1782 cap.setForInput(null);
1783 Desktop.addInternalFrame(cap,
1784 "Alignment output - " + e.getActionCommand(), 600, 500);
1786 String[] omitHidden = null;
1788 System.out.println("PROMPT USER HERE"); // TODO: decide if a prompt happens
1789 // or we simply trust the user wants
1790 // wysiwig behaviour
1791 SequenceGroup sg = ap.av.getSelectionGroup();
1792 ColumnSelection csel = new ColumnSelection(ap.av.getColumnSelection());
1793 omitHidden = ap.av.getViewAsString(true);
1794 Alignment oal = new Alignment(ap.av.getSequenceSelection());
1795 AlignmentAnnotation[] nala = ap.av.alignment.getAlignmentAnnotation();
1798 for (int i = 0; i < nala.length; i++)
1800 AlignmentAnnotation na = nala[i];
1801 oal.addAnnotation(na);
1804 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
1805 oal, omitHidden, csel, sg));
1809 public void pdbFromFile_actionPerformed()
1811 jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
1812 jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
1813 chooser.setFileView(new jalview.io.JalviewFileView());
1814 chooser.setDialogTitle("Select a PDB file for "+sequence.getDisplayId(false));
1815 chooser.setToolTipText("Load a PDB file and associate it with sequence '"+sequence.getDisplayId(false)+"'");
1817 int value = chooser.showOpenDialog(null);
1819 if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
1821 String choice = chooser.getSelectedFile().getPath();
1822 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
1823 new AssociatePdbFileWithSeq().associatePdbWithSeq(choice, jalview.io.AppletFormatAdapter.FILE, sequence, true);
1828 public void enterPDB_actionPerformed()
1830 String id = JOptionPane.showInternalInputDialog(Desktop.desktop,
1831 "Enter PDB Id", "Enter PDB Id", JOptionPane.QUESTION_MESSAGE);
1833 if (id != null && id.length() > 0)
1835 PDBEntry entry = new PDBEntry();
1836 entry.setId(id.toUpperCase());
1837 sequence.getDatasetSequence().addPDBId(entry);
1841 public void discoverPDB_actionPerformed()
1844 final SequenceI[] sequences = ((ap.av.selectionGroup == null) ? new Sequence[]
1846 : ap.av.selectionGroup.getSequencesInOrder(ap.av.alignment));
1847 Thread discpdb = new Thread(new Runnable()
1852 new jalview.ws.DBRefFetcher(sequences, ap.alignFrame)
1853 .fetchDBRefs(false);
1860 public void sequenceFeature_actionPerformed()
1862 SequenceGroup sg = ap.av.getSelectionGroup();
1868 int rsize = 0, gSize = sg.getSize();
1869 SequenceI[] rseqs, seqs = new SequenceI[gSize];
1870 SequenceFeature[] tfeatures, features = new SequenceFeature[gSize];
1872 for (int i = 0; i < gSize; i++)
1874 int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());
1875 int end = sg.findEndRes(sg.getSequenceAt(i));
1878 seqs[rsize] = sg.getSequenceAt(i).getDatasetSequence();
1879 features[rsize] = new SequenceFeature(null, null, null, start, end,
1884 rseqs = new SequenceI[rsize];
1885 tfeatures = new SequenceFeature[rsize];
1886 System.arraycopy(seqs, 0, rseqs, 0, rsize);
1887 System.arraycopy(features, 0, tfeatures, 0, rsize);
1888 features = tfeatures;
1890 if (ap.seqPanel.seqCanvas.getFeatureRenderer().amendFeatures(seqs,
1891 features, true, ap))
1893 ap.alignFrame.setShowSeqFeatures(true);
1894 ap.highlightSearchResults(null);
1898 public void textColour_actionPerformed()
1900 SequenceGroup sg = getGroup();
1903 new TextColourChooser().chooseColour(ap, sg);
1907 public void colourByStructure(String pdbid)
1909 Annotation[] anots = ap.av.getStructureSelectionManager().colourSequenceFromStructure(
1912 AlignmentAnnotation an = new AlignmentAnnotation("Structure",
1913 "Coloured by " + pdbid, anots);
1915 ap.av.alignment.addAnnotation(an);
1916 an.createSequenceMapping(sequence, 0, true);
1917 // an.adjustForAlignment();
1918 ap.av.alignment.setAnnotationIndex(an, 0);
1920 ap.adjustAnnotationHeight();
1922 sequence.addAlignmentAnnotation(an);
1926 public void editSequence_actionPerformed(ActionEvent actionEvent)
1928 SequenceGroup sg = ap.av.getSelectionGroup();
1932 if (sequence == null)
1933 sequence = (Sequence) sg.getSequenceAt(0);
1935 EditNameDialog dialog = new EditNameDialog(
1936 sequence.getSequenceAsString(sg.getStartRes(),
1937 sg.getEndRes() + 1), null, "Edit Sequence ", null,
1938 "Edit Sequence", ap.alignFrame);
1942 EditCommand editCommand = new EditCommand("Edit Sequences",
1943 EditCommand.REPLACE, dialog.getName().replace(' ',
1944 ap.av.getGapCharacter()),
1945 sg.getSequencesAsArray(ap.av.hiddenRepSequences),
1946 sg.getStartRes(), sg.getEndRes() + 1, ap.av.alignment);
1948 ap.alignFrame.addHistoryItem(editCommand);
1950 ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()