2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Softwarechang
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
19 package jalview.gui;
\r
21 import java.beans.*;
\r
26 import java.awt.datatransfer.*;
\r
27 import java.awt.event.*;
\r
28 import java.awt.print.*;
\r
29 import javax.swing.*;
\r
31 import jalview.analysis.*;
\r
32 import jalview.datamodel.*;
\r
33 import jalview.io.*;
\r
34 import jalview.jbgui.*;
\r
35 import jalview.schemes.*;
\r
36 import jalview.ws.*;
\r
37 import java.awt.dnd.*;
\r
44 * @version $Revision$
\r
46 public class AlignFrame
\r
47 extends GAlignFrame implements ClipboardOwner, DropTargetListener
\r
49 /** DOCUMENT ME!! */
\r
50 public static final int NEW_WINDOW_WIDTH = 700;
\r
52 /** DOCUMENT ME!! */
\r
53 public static final int NEW_WINDOW_HEIGHT = 500;
\r
54 AlignmentPanel alignPanel;
\r
55 AlignViewport viewport;
\r
57 Vector viewports = new Vector();
\r
58 Vector alignPanels = new Vector();
\r
60 /** DOCUMENT ME!! */
\r
61 public String currentFileFormat = null;
\r
62 Stack historyList = new Stack();
\r
63 Stack redoList = new Stack();
\r
64 private int treeCount = 0;
\r
68 * Creates a new AlignFrame object.
\r
70 * @param al DOCUMENT ME!
\r
72 public AlignFrame(AlignmentI al)
\r
74 viewport = new AlignViewport(al);
\r
75 viewports.add(viewport);
\r
77 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
\r
79 if(viewport.vconsensus==null)
\r
81 //Out of memory calculating consensus.
\r
82 BLOSUM62Colour.setEnabled(false);
\r
83 PIDColour.setEnabled(false);
\r
84 conservationMenuItem.setEnabled(false);
\r
85 modifyConservation.setEnabled(false);
\r
86 abovePIDThreshold.setEnabled(false);
\r
87 modifyPID.setEnabled(false);
\r
90 alignPanel = new AlignmentPanel(this, viewport);
\r
91 alignPanels.add(alignPanel);
\r
93 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
\r
95 if(sortby.equals("Id"))
\r
96 sortIDMenuItem_actionPerformed(null);
\r
97 else if(sortby.equals("Pairwise Identity"))
\r
98 sortPairwiseMenuItem_actionPerformed(null);
\r
100 // remove(tabbedPane);
\r
101 getContentPane().add(alignPanel, BorderLayout.CENTER);
\r
105 // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
\r
108 /////////////////////////
\r
109 if(al.getDataset()==null)
\r
111 al.setDataset(null);
\r
113 // AlignViewport ds = new AlignViewport(al.getDataset(), true);
\r
114 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
115 // tabbedPane.add("Dataset", dap);
\r
116 // viewports.add(ds);
\r
117 // alignPanels.add(dap);
\r
118 /////////////////////////
\r
121 viewport.addPropertyChangeListener(new PropertyChangeListener()
\r
123 public void propertyChange(PropertyChangeEvent evt)
\r
125 if (evt.getPropertyName().equals("alignment"))
\r
127 alignmentChanged();
\r
133 if (Desktop.desktop != null)
\r
135 addServiceListeners();
\r
136 setGUINucleotide(al.isNucleotide());
\r
140 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
141 private void addServiceListeners()
\r
143 final java.beans.PropertyChangeListener thisListener;
\r
144 // Do this once to get current state
\r
145 BuildWebServiceMenu();
\r
146 Desktop.discoverer.addPropertyChangeListener(
\r
147 thisListener = new java.beans.PropertyChangeListener()
\r
149 public void propertyChange(PropertyChangeEvent evt)
\r
151 // System.out.println("Discoverer property change.");
\r
152 if (evt.getPropertyName().equals("services"))
\r
154 // System.out.println("Rebuilding web service menu");
\r
155 BuildWebServiceMenu();
\r
159 addInternalFrameListener(new javax.swing.event.
\r
160 InternalFrameAdapter()
\r
162 public void internalFrameClosed(
\r
163 javax.swing.event.InternalFrameEvent evt)
\r
165 // System.out.println("deregistering discoverer listener");
\r
166 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
167 closeMenuItem_actionPerformed(null);
\r
174 public void setGUINucleotide(boolean nucleotide)
\r
176 showTranslation.setVisible( nucleotide );
\r
177 sequenceFeatures.setVisible(!nucleotide );
\r
178 featureSettings.setVisible( !nucleotide );
\r
179 conservationMenuItem.setVisible( !nucleotide );
\r
180 modifyConservation.setVisible( !nucleotide );
\r
182 //Deal with separators
\r
183 //Remember AlignFrame always starts as protein
\r
186 viewMenu.remove(viewMenu.getItemCount()-2);
\r
190 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
196 Added so Castor Mapping file can obtain Jalview Version
\r
198 public String getVersion()
\r
200 return jalview.bin.Cache.getProperty("VERSION");
\r
204 public void fetchSequence_actionPerformed(ActionEvent e)
\r
206 new SequenceFetcher(this);
\r
213 * @param e DOCUMENT ME!
\r
215 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
217 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
222 "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",
\r
227 "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"
\r
228 }, currentFileFormat);
\r
230 chooser.setAcceptAllFileFilterUsed(false);
\r
231 chooser.setFileView(new JalviewFileView());
\r
232 chooser.setDialogTitle("Save Alignment to file");
\r
233 chooser.setToolTipText("Save");
\r
235 int value = chooser.showSaveDialog(this);
\r
237 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
239 currentFileFormat = chooser.getSelectedFormat();
\r
241 if (currentFileFormat == null)
\r
243 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
244 "You must select a file format before saving!",
\r
245 "File format not specified",
\r
246 JOptionPane.WARNING_MESSAGE);
\r
247 value = chooser.showSaveDialog(this);
\r
251 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
252 currentFileFormat);
\r
254 String choice = chooser.getSelectedFile().getPath();
\r
255 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
257 saveAlignment(choice, currentFileFormat);
\r
261 public boolean saveAlignment(String file, String format)
\r
263 if (format.equalsIgnoreCase("Jalview"))
\r
265 String shortName = title;
\r
267 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
269 shortName = shortName.substring(shortName.lastIndexOf(
\r
270 java.io.File.separatorChar) + 1);
\r
273 Jalview2XML.SaveAlignment(this, file, shortName);
\r
275 // USE Jalview2XML to save this file
\r
280 String output = new FormatAdapter().formatSequences(format,
\r
281 viewport.getAlignment().
\r
283 if (output == null)
\r
290 java.io.PrintWriter out = new java.io.PrintWriter(
\r
291 new java.io.FileWriter(file));
\r
297 catch (Exception ex)
\r
299 ex.printStackTrace();
\r
308 * @param e DOCUMENT ME!
\r
310 protected void outputText_actionPerformed(ActionEvent e)
\r
312 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
313 Desktop.addInternalFrame(cap,
\r
314 "Alignment output - " + e.getActionCommand(), 600,
\r
316 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
317 viewport.getAlignment().
\r
324 * @param e DOCUMENT ME!
\r
326 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
328 new HTMLOutput(viewport,
\r
329 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
330 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
333 public void createImageMap(File file, String image)
\r
335 alignPanel.makePNGImageMap(file, image);
\r
341 * @param e DOCUMENT ME!
\r
343 public void createPNG(File f)
\r
345 alignPanel.makePNG(f);
\r
351 * @param e DOCUMENT ME!
\r
353 public void createEPS(File f)
\r
355 alignPanel.makeEPS(f);
\r
361 * @param e DOCUMENT ME!
\r
363 public void printMenuItem_actionPerformed(ActionEvent e)
\r
365 //Putting in a thread avoids Swing painting problems
\r
366 PrintThread thread = new PrintThread();
\r
373 * @param e DOCUMENT ME!
\r
375 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
379 PaintRefresher.components.remove(viewport.alignment);
\r
380 this.setClosed(true);
\r
382 catch (Exception ex)
\r
390 void updateEditMenuBar()
\r
392 if (historyList.size() > 0)
\r
394 undoMenuItem.setEnabled(true);
\r
396 HistoryItem hi = (HistoryItem) historyList.peek();
\r
397 undoMenuItem.setText("Undo " + hi.getDescription());
\r
401 undoMenuItem.setEnabled(false);
\r
402 undoMenuItem.setText("Undo");
\r
405 if (redoList.size() > 0)
\r
407 redoMenuItem.setEnabled(true);
\r
409 HistoryItem hi = (HistoryItem) redoList.peek();
\r
410 redoMenuItem.setText("Redo " + hi.getDescription());
\r
414 redoMenuItem.setEnabled(false);
\r
415 redoMenuItem.setText("Redo");
\r
422 * @param hi DOCUMENT ME!
\r
424 public void addHistoryItem(HistoryItem hi)
\r
426 historyList.push(hi);
\r
427 updateEditMenuBar();
\r
433 * @param e DOCUMENT ME!
\r
435 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
437 HistoryItem hi = (HistoryItem) historyList.pop();
\r
438 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
439 HistoryItem.HIDE));
\r
440 restoreHistoryItem(hi);
\r
441 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
447 * @param e DOCUMENT ME!
\r
449 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
451 HistoryItem hi = (HistoryItem) redoList.pop();
\r
452 restoreHistoryItem(hi);
\r
453 updateEditMenuBar();
\r
454 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
457 // used by undo and redo
\r
458 void restoreHistoryItem(HistoryItem hi)
\r
460 if (hi.getType() == HistoryItem.SORT)
\r
462 for (int i = 0; i < hi.getSequences().size(); i++)
\r
464 viewport.alignment.getSequences().setElementAt(hi.getSequences()
\r
471 for (int i = 0; i < hi.getSequences().size(); i++)
\r
473 SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);
\r
475 if (restore.getLength() == 0)
\r
477 restore.setSequence(hi.getHidden().elementAt(i).toString());
\r
478 viewport.alignment.getSequences().insertElementAt(restore,
\r
479 hi.getAlignIndex(i));
\r
483 restore.setSequence(hi.getHidden().elementAt(i).toString());
\r
487 if (hi.getType() == HistoryItem.PASTE)
\r
489 for (int i = viewport.alignment.getHeight() - 1;
\r
490 i > (hi.getSequences().size() - 1); i--)
\r
492 viewport.alignment.deleteSequence(i);
\r
497 updateEditMenuBar();
\r
499 viewport.firePropertyChange("alignment", null,
\r
500 viewport.getAlignment().getSequences());
\r
506 * @param up DOCUMENT ME!
\r
508 public void moveSelectedSequences(boolean up)
\r
510 SequenceGroup sg = viewport.getSelectionGroup();
\r
519 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
521 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
523 if (!sg.sequences.contains(seq))
\r
528 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
530 if (sg.sequences.contains(temp))
\r
535 viewport.alignment.getSequences().setElementAt(temp, i);
\r
536 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
541 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
543 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
545 if (!sg.sequences.contains(seq))
\r
550 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
552 if (sg.sequences.contains(temp))
\r
557 viewport.alignment.getSequences().setElementAt(temp, i);
\r
558 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
562 alignPanel.repaint();
\r
565 public void lostOwnership(Clipboard clipboard, Transferable contents)
\r
567 Desktop.jalviewClipboard = null;
\r
574 * @param e DOCUMENT ME!
\r
576 protected void copy_actionPerformed(ActionEvent e)
\r
578 if (viewport.getSelectionGroup() == null)
\r
583 SequenceGroup sg = viewport.getSelectionGroup();
\r
585 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
587 Hashtable orderedSeqs = new Hashtable();
\r
588 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
590 for (int i = 0; i < sg.getSize(); i++)
\r
592 SequenceI seq = sg.getSequenceAt(i);
\r
593 int index = viewport.alignment.findIndex(seq);
\r
594 orderedSeqs.put(index + "", seq);
\r
597 int index = 0, startRes, endRes;
\r
600 for (int i = 0; i < sg.getSize(); i++)
\r
602 SequenceI seq = null;
\r
604 while (seq == null)
\r
606 if (orderedSeqs.containsKey(index + ""))
\r
608 seq = (SequenceI) orderedSeqs.get(index + "");
\r
620 //Returns residue following index if gap
\r
621 startRes = seq.findPosition(sg.getStartRes());
\r
624 //Need to find the residue preceeding index if gap
\r
627 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
629 ch = seq.getCharAt(j);
\r
630 if (!jalview.util.Comparison.isGap( (ch)))
\r
638 endRes += seq.getStart() - 1;
\r
641 seqs[i] = new Sequence(seq.getName(),
\r
642 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
645 seqs[i].setDescription(seq.getDescription());
\r
646 seqs[i].setDBRef(seq.getDBRef());
\r
647 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
648 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
652 FastaFile ff = new FastaFile();
\r
653 ff.addJVSuffix( viewport.showJVSuffix );
\r
654 c.setContents(new StringSelection( ff.print(seqs)), this);
\r
655 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
661 * @param e DOCUMENT ME!
\r
663 protected void pasteNew_actionPerformed(ActionEvent e)
\r
671 * @param e DOCUMENT ME!
\r
673 protected void pasteThis_actionPerformed(ActionEvent e)
\r
675 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
676 HistoryItem.PASTE));
\r
683 * @param newAlignment DOCUMENT ME!
\r
685 void paste(boolean newAlignment)
\r
689 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
690 Transferable contents = c.getContents(this);
\r
692 if (contents == null)
\r
697 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
701 String format = IdentifyFile.Identify(str, "Paste");
\r
702 SequenceI[] sequences;
\r
704 if(Desktop.jalviewClipboard!=null)
\r
706 // The clipboard was filled from within Jalview, we must use the sequences
\r
707 // And dataset from the copied alignment
\r
708 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
712 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
718 Alignment alignment = new Alignment(sequences);
\r
720 if(Desktop.jalviewClipboard!=null)
\r
721 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
723 alignment.setDataset( null );
\r
726 AlignFrame af = new AlignFrame(alignment);
\r
727 String newtitle = new String("Copied sequences");
\r
729 if (title.startsWith("Copied sequences"))
\r
735 newtitle = newtitle.concat("- from " + title);
\r
738 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
739 NEW_WINDOW_HEIGHT);
\r
744 for (int i = 0; i < sequences.length; i++)
\r
746 Sequence newseq = new Sequence(sequences[i].getName(),
\r
747 sequences[i].getSequence(), sequences[i].getStart(),
\r
748 sequences[i].getEnd());
\r
749 viewport.alignment.addSequence(newseq);
\r
750 if(sequences[i].getDatasetSequence()==null)
\r
752 ////////////////////////////
\r
753 //Datset needs extension;
\r
754 /////////////////////////////
\r
755 Sequence ds = new Sequence(sequences[i].getName(),
\r
756 AlignSeq.extractGaps("-. ", sequences[i].getSequence()),
\r
757 sequences[i].getStart(),
\r
758 sequences[i].getEnd());
\r
759 newseq.setDatasetSequence(ds);
\r
760 viewport.alignment.getDataset().addSequence(ds);
\r
763 newseq.setDatasetSequence(sequences[i].getDatasetSequence());
\r
766 viewport.setEndSeq(viewport.alignment.getHeight());
\r
767 viewport.alignment.getWidth();
\r
768 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
771 catch (Exception ex)
\r
773 // could be anything being pasted in here
\r
782 * @param e DOCUMENT ME!
\r
784 protected void cut_actionPerformed(ActionEvent e)
\r
786 copy_actionPerformed(null);
\r
787 delete_actionPerformed(null);
\r
793 * @param e DOCUMENT ME!
\r
795 protected void delete_actionPerformed(ActionEvent e)
\r
798 if (viewport.getSelectionGroup() == null)
\r
803 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
804 HistoryItem.HIDE));
\r
806 SequenceGroup sg = viewport.getSelectionGroup();
\r
807 boolean allSequences = false;
\r
808 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
810 allSequences = true;
\r
813 for (int i = 0; i < sg.sequences.size(); i++)
\r
815 SequenceI seq = sg.getSequenceAt(i);
\r
816 int index = viewport.getAlignment().findIndex(seq);
\r
817 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
819 // If the cut affects all sequences, remove highlighted columns
\r
822 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
823 sg.getEndRes() + 1);
\r
826 if (seq.getSequence().length() < 1)
\r
828 viewport.getAlignment().deleteSequence(seq);
\r
832 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
836 viewport.setSelectionGroup(null);
\r
837 viewport.alignment.deleteGroup(sg);
\r
839 viewport.firePropertyChange("alignment", null,
\r
840 viewport.getAlignment().getSequences());
\r
844 if (viewport.getAlignment().getHeight() < 1)
\r
848 this.setClosed(true);
\r
850 catch (Exception ex)
\r
859 * @param e DOCUMENT ME!
\r
861 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
863 viewport.alignment.deleteAllGroups();
\r
864 viewport.setSelectionGroup(null);
\r
865 alignPanel.repaint();
\r
871 * @param e DOCUMENT ME!
\r
873 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
875 SequenceGroup sg = new SequenceGroup();
\r
877 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
880 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
883 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
884 viewport.setSelectionGroup(sg);
\r
885 PaintRefresher.Refresh(null, viewport.alignment);
\r
891 * @param e DOCUMENT ME!
\r
893 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
895 viewport.setSelectionGroup(null);
\r
896 viewport.getColumnSelection().clear();
\r
897 viewport.setSelectionGroup(null);
\r
898 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
899 alignPanel.annotationPanel.activeRes = null;
\r
900 PaintRefresher.Refresh(null, viewport.alignment);
\r
906 * @param e DOCUMENT ME!
\r
908 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
910 SequenceGroup sg = viewport.getSelectionGroup();
\r
914 selectAllSequenceMenuItem_actionPerformed(null);
\r
919 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
922 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
925 PaintRefresher.Refresh(null, viewport.alignment);
\r
931 * @param e DOCUMENT ME!
\r
933 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
935 ColumnSelection colSel = viewport.getColumnSelection();
\r
937 if (colSel.size() > 0)
\r
939 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
940 HistoryItem.HIDE));
\r
942 int min = colSel.getMin();
\r
943 viewport.getAlignment().trimLeft(min);
\r
944 colSel.compensateForEdit(0, min);
\r
946 if (viewport.getSelectionGroup() != null)
\r
948 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
951 Vector groups = viewport.alignment.getGroups();
\r
953 for (int i = 0; i < groups.size(); i++)
\r
955 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
957 if (!sg.adjustForRemoveLeft(min))
\r
959 viewport.alignment.deleteGroup(sg);
\r
963 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
970 * @param e DOCUMENT ME!
\r
972 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
974 ColumnSelection colSel = viewport.getColumnSelection();
\r
976 if (colSel.size() > 0)
\r
978 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
979 HistoryItem.HIDE));
\r
981 int max = colSel.getMax();
\r
982 viewport.getAlignment().trimRight(max);
\r
984 if (viewport.getSelectionGroup() != null)
\r
986 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
989 Vector groups = viewport.alignment.getGroups();
\r
991 for (int i = 0; i < groups.size(); i++)
\r
993 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
995 if (!sg.adjustForRemoveRight(max))
\r
997 viewport.alignment.deleteGroup(sg);
\r
1001 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1008 * @param e DOCUMENT ME!
\r
1010 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1012 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1013 viewport.alignment, HistoryItem.HIDE));
\r
1015 //This is to maintain viewport position on first residue
\r
1016 //of first sequence
\r
1017 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1018 int startRes = seq.findPosition(viewport.startRes);
\r
1020 viewport.getAlignment().removeGaps();
\r
1022 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1024 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1030 * @param e DOCUMENT ME!
\r
1032 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1034 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1035 HistoryItem.HIDE));
\r
1037 //This is to maintain viewport position on first residue
\r
1038 //of first sequence
\r
1039 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1040 int startRes = seq.findPosition(viewport.startRes);
\r
1043 SequenceI current;
\r
1046 Vector seqs = null;
\r
1049 int end = viewport.alignment.getWidth();
\r
1051 if (viewport.getSelectionGroup() != null
\r
1052 && viewport.getSelectionGroup().sequences != null
\r
1053 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1055 seqs = viewport.getSelectionGroup().sequences;
\r
1056 start = viewport.getSelectionGroup().getStartRes();
\r
1057 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1061 seqs = viewport.alignment.getSequences();
\r
1064 for (int i = 0; i < seqs.size(); i++)
\r
1066 current = (SequenceI) seqs.elementAt(i);
\r
1067 jSize = current.getLength();
\r
1069 // Removing a range is much quicker than removing gaps
\r
1070 // one by one for long sequences
\r
1072 int rangeStart=-1, rangeEnd=-1;
\r
1076 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1078 if(rangeStart==-1)
\r
1093 current.deleteChars(rangeStart, rangeEnd);
\r
1094 j-=rangeEnd-rangeStart;
\r
1095 jSize-=rangeEnd-rangeStart;
\r
1103 while (j < end && j < jSize);
\r
1106 current.deleteChars(rangeStart, rangeEnd);
\r
1110 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1112 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1115 public void alignmentChanged()
\r
1117 if(viewport.vconsensus!=null)
\r
1119 viewport.updateConsensus();
\r
1120 viewport.updateConservation();
\r
1122 resetAllColourSchemes();
\r
1123 if(alignPanel.overviewPanel!=null)
\r
1124 alignPanel.overviewPanel.updateOverviewImage();
\r
1126 alignPanel.repaint();
\r
1129 void resetAllColourSchemes()
\r
1131 ColourSchemeI cs = viewport.globalColourScheme;
\r
1134 if (cs instanceof ClustalxColourScheme)
\r
1136 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1137 resetClustalX(viewport.alignment.getSequences(),
\r
1138 viewport.alignment.getWidth());
\r
1141 cs.setConsensus(viewport.vconsensus);
\r
1142 if (cs.conservationApplied())
\r
1144 Alignment al = (Alignment) viewport.alignment;
\r
1145 Conservation c = new Conservation("All",
\r
1146 ResidueProperties.propHash, 3,
\r
1147 al.getSequences(), 0,
\r
1148 al.getWidth() - 1);
\r
1150 c.verdict(false, viewport.ConsPercGaps);
\r
1152 cs.setConservation(c);
\r
1156 int s, sSize = viewport.alignment.getGroups().size();
\r
1157 for(s=0; s<sSize; s++)
\r
1159 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1160 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1162 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1164 sg.recalcConservation();
\r
1171 * @param e DOCUMENT ME!
\r
1173 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1175 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1176 HistoryItem.HIDE));
\r
1177 if (viewport.getAlignment().padGaps())
\r
1178 alignmentChanged();
\r
1184 * @param e DOCUMENT ME!
\r
1186 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1188 JInternalFrame frame = new JInternalFrame();
\r
1189 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1190 frame.setContentPane(finder);
\r
1191 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1192 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1198 * @param e DOCUMENT ME!
\r
1200 public void font_actionPerformed(ActionEvent e)
\r
1202 new FontChooser(alignPanel);
\r
1205 public void smoothFont_actionPerformed(ActionEvent e)
\r
1207 viewport.antiAlias = smoothFont.isSelected();
\r
1208 alignPanel.annotationPanel.image = null;
\r
1209 alignPanel.repaint();
\r
1216 * @param e DOCUMENT ME!
\r
1218 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1220 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1222 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1223 alignPanel.repaint();
\r
1230 * @param e DOCUMENT ME!
\r
1232 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1234 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1235 alignPanel.repaint();
\r
1241 * @param e DOCUMENT ME!
\r
1243 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1245 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1246 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1247 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1248 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1249 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1250 alignPanel.repaint();
\r
1256 * @param e DOCUMENT ME!
\r
1258 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1260 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1261 alignPanel.repaint();
\r
1267 * @param e DOCUMENT ME!
\r
1269 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1271 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1272 alignPanel.repaint();
\r
1278 * @param e DOCUMENT ME!
\r
1280 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1282 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1283 alignPanel.repaint();
\r
1289 * @param e DOCUMENT ME!
\r
1291 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1293 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1294 alignPanel.repaint();
\r
1300 * @param e DOCUMENT ME!
\r
1302 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1304 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1305 alignPanel.repaint();
\r
1311 * @param e DOCUMENT ME!
\r
1313 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1315 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1316 alignPanel.repaint();
\r
1322 * @param evt DOCUMENT ME!
\r
1324 public void sequenceFeatures_actionPerformed(ActionEvent evt)
\r
1326 viewport.showSequenceFeatures(sequenceFeatures.isSelected());
\r
1328 if (viewport.showSequenceFeatures)
\r
1330 new SequenceFeatureFetcher(viewport.
\r
1335 featureSettings.setEnabled(true);
\r
1337 alignPanel.repaint();
\r
1343 * @param e DOCUMENT ME!
\r
1345 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1347 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1348 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1354 * @param e DOCUMENT ME!
\r
1356 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1358 if (alignPanel.overviewPanel != null)
\r
1363 JInternalFrame frame = new JInternalFrame();
\r
1364 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1365 frame.setContentPane(overview);
\r
1366 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1367 frame.getWidth(), frame.getHeight());
\r
1369 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1370 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1372 public void internalFrameClosed(
\r
1373 javax.swing.event.InternalFrameEvent evt)
\r
1375 alignPanel.setOverviewPanel(null);
\r
1380 alignPanel.setOverviewPanel(overview);
\r
1386 * @param e DOCUMENT ME!
\r
1388 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1390 changeColour(null);
\r
1396 * @param e DOCUMENT ME!
\r
1398 public void clustalColour_actionPerformed(ActionEvent e)
\r
1400 changeColour(new ClustalxColourScheme(
\r
1401 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1407 * @param e DOCUMENT ME!
\r
1409 public void zappoColour_actionPerformed(ActionEvent e)
\r
1411 changeColour(new ZappoColourScheme());
\r
1417 * @param e DOCUMENT ME!
\r
1419 public void taylorColour_actionPerformed(ActionEvent e)
\r
1421 changeColour(new TaylorColourScheme());
\r
1427 * @param e DOCUMENT ME!
\r
1429 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1431 changeColour(new HydrophobicColourScheme());
\r
1437 * @param e DOCUMENT ME!
\r
1439 public void helixColour_actionPerformed(ActionEvent e)
\r
1441 changeColour(new HelixColourScheme());
\r
1447 * @param e DOCUMENT ME!
\r
1449 public void strandColour_actionPerformed(ActionEvent e)
\r
1451 changeColour(new StrandColourScheme());
\r
1457 * @param e DOCUMENT ME!
\r
1459 public void turnColour_actionPerformed(ActionEvent e)
\r
1461 changeColour(new TurnColourScheme());
\r
1467 * @param e DOCUMENT ME!
\r
1469 public void buriedColour_actionPerformed(ActionEvent e)
\r
1471 changeColour(new BuriedColourScheme());
\r
1477 * @param e DOCUMENT ME!
\r
1479 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1481 changeColour(new NucleotideColourScheme());
\r
1484 public void annotationColour_actionPerformed(ActionEvent e)
\r
1486 new AnnotationColourChooser(viewport, alignPanel);
\r
1493 * @param e DOCUMENT ME!
\r
1495 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1497 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1503 * @param cs DOCUMENT ME!
\r
1505 void changeColour(ColourSchemeI cs)
\r
1507 int threshold = 0;
\r
1511 if (viewport.getAbovePIDThreshold())
\r
1513 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1516 cs.setThreshold(threshold,
\r
1517 viewport.getIgnoreGapsConsensus());
\r
1519 viewport.setGlobalColourScheme(cs);
\r
1523 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1526 if (viewport.getConservationSelected())
\r
1529 Alignment al = (Alignment) viewport.alignment;
\r
1530 Conservation c = new Conservation("All",
\r
1531 ResidueProperties.propHash, 3,
\r
1532 al.getSequences(), 0,
\r
1533 al.getWidth() - 1);
\r
1536 c.verdict(false, viewport.ConsPercGaps);
\r
1538 cs.setConservation(c);
\r
1540 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1545 cs.setConservation(null);
\r
1548 cs.setConsensus(viewport.vconsensus);
\r
1551 viewport.setGlobalColourScheme(cs);
\r
1553 if (viewport.getColourAppliesToAllGroups())
\r
1555 Vector groups = viewport.alignment.getGroups();
\r
1557 for (int i = 0; i < groups.size(); i++)
\r
1559 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1567 if (cs instanceof ClustalxColourScheme)
\r
1569 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1571 else if (cs instanceof UserColourScheme)
\r
1573 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1579 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1581 catch (Exception ex)
\r
1586 if (viewport.getAbovePIDThreshold()
\r
1587 || cs instanceof PIDColourScheme
\r
1588 || cs instanceof Blosum62ColourScheme)
\r
1590 sg.cs.setThreshold(threshold,
\r
1591 viewport.getIgnoreGapsConsensus());
\r
1593 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1597 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1600 if (viewport.getConservationSelected())
\r
1602 Conservation c = new Conservation("Group",
\r
1603 ResidueProperties.propHash, 3,
\r
1605 viewport.alignment.getWidth() - 1);
\r
1607 c.verdict(false, viewport.ConsPercGaps);
\r
1608 sg.cs.setConservation(c);
\r
1611 sg.cs.setConservation(null);
\r
1615 if (alignPanel.getOverviewPanel() != null)
\r
1617 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1620 alignPanel.repaint();
\r
1626 * @param e DOCUMENT ME!
\r
1628 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1630 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1632 SliderPanel.setPIDSliderSource(alignPanel,
\r
1633 viewport.getGlobalColourScheme(),
\r
1635 SliderPanel.showPIDSlider();
\r
1642 * @param e DOCUMENT ME!
\r
1644 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1646 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1648 SliderPanel.setConservationSlider(alignPanel,
\r
1649 viewport.globalColourScheme,
\r
1651 SliderPanel.showConservationSlider();
\r
1658 * @param e DOCUMENT ME!
\r
1660 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1662 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1664 viewport.setAbovePIDThreshold(false);
\r
1665 abovePIDThreshold.setSelected(false);
\r
1667 changeColour(viewport.getGlobalColourScheme());
\r
1669 modifyConservation_actionPerformed(null);
\r
1675 * @param e DOCUMENT ME!
\r
1677 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1679 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1681 conservationMenuItem.setSelected(false);
\r
1682 viewport.setConservationSelected(false);
\r
1684 changeColour(viewport.getGlobalColourScheme());
\r
1686 modifyPID_actionPerformed(null);
\r
1692 * @param e DOCUMENT ME!
\r
1694 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1696 if (e.getActionCommand().equals("User Defined..."))
\r
1698 new UserDefinedColours(alignPanel, null);
\r
1702 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1703 getUserColourSchemes().get(e.getActionCommand());
\r
1705 changeColour(udc);
\r
1709 public void updateUserColourMenu()
\r
1712 Component[] menuItems = colourMenu.getMenuComponents();
\r
1713 int i, iSize = menuItems.length;
\r
1714 for (i = 0; i < iSize; i++)
\r
1716 if (menuItems[i].getName() != null &&
\r
1717 menuItems[i].getName().equals("USER_DEFINED"))
\r
1719 colourMenu.remove(menuItems[i]);
\r
1723 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1725 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1726 getUserColourSchemes().keys();
\r
1728 while (userColours.hasMoreElements())
\r
1730 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1731 nextElement().toString());
\r
1732 radioItem.setName("USER_DEFINED");
\r
1733 radioItem.addMouseListener(new MouseAdapter()
\r
1735 public void mousePressed(MouseEvent evt)
\r
1737 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1739 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1741 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1742 "Remove from default list?",
\r
1743 "Remove user defined colour",
\r
1744 JOptionPane.YES_NO_OPTION);
\r
1745 if(option == JOptionPane.YES_OPTION)
\r
1747 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1748 colourMenu.remove(radioItem);
\r
1751 radioItem.addActionListener(new ActionListener()
\r
1753 public void actionPerformed(ActionEvent evt)
\r
1755 userDefinedColour_actionPerformed(evt);
\r
1761 radioItem.addActionListener(new ActionListener()
\r
1763 public void actionPerformed(ActionEvent evt)
\r
1765 userDefinedColour_actionPerformed(evt);
\r
1769 colourMenu.insert(radioItem, 15);
\r
1770 colours.add(radioItem);
\r
1778 * @param e DOCUMENT ME!
\r
1780 public void PIDColour_actionPerformed(ActionEvent e)
\r
1782 changeColour(new PIDColourScheme());
\r
1788 * @param e DOCUMENT ME!
\r
1790 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1792 changeColour(new Blosum62ColourScheme());
\r
1798 * @param e DOCUMENT ME!
\r
1800 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1802 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1803 HistoryItem.SORT));
\r
1804 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1805 viewport.getAlignment().getSequenceAt(0));
\r
1806 alignPanel.repaint();
\r
1812 * @param e DOCUMENT ME!
\r
1814 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1816 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1817 HistoryItem.SORT));
\r
1818 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1819 alignPanel.repaint();
\r
1825 * @param e DOCUMENT ME!
\r
1827 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1829 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1830 HistoryItem.SORT));
\r
1832 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1833 alignPanel.repaint();
\r
1839 * @param e DOCUMENT ME!
\r
1841 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1843 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1844 JInternalFrame frame = new JInternalFrame();
\r
1845 frame.setContentPane(sp);
\r
1846 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1853 * @param e DOCUMENT ME!
\r
1855 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1857 if ( (viewport.getSelectionGroup() == null) ||
\r
1858 (viewport.getSelectionGroup().getSize() < 2))
\r
1860 JOptionPane.showInternalMessageDialog(this,
\r
1861 "You must select at least 2 sequences.",
\r
1862 "Invalid Selection",
\r
1863 JOptionPane.WARNING_MESSAGE);
\r
1867 JInternalFrame frame = new JInternalFrame();
\r
1868 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1869 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1876 * @param e DOCUMENT ME!
\r
1878 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1880 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1881 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1882 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1883 (viewport.getAlignment().getHeight() < 4))
\r
1885 JOptionPane.showInternalMessageDialog(this,
\r
1886 "Principal component analysis must take\n" +
\r
1887 "at least 4 input sequences.",
\r
1888 "Sequence selection insufficient",
\r
1889 JOptionPane.WARNING_MESSAGE);
\r
1894 new PCAPanel(viewport);
\r
1900 * @param e DOCUMENT ME!
\r
1902 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1904 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1910 * @param e DOCUMENT ME!
\r
1912 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1914 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1920 * @param e DOCUMENT ME!
\r
1922 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1924 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1930 * @param e DOCUMENT ME!
\r
1932 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1934 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1940 * @param type DOCUMENT ME!
\r
1941 * @param pwType DOCUMENT ME!
\r
1942 * @param title DOCUMENT ME!
\r
1944 void NewTreePanel(String type, String pwType, String title)
\r
1946 final TreePanel tp;
\r
1948 if ( (viewport.getSelectionGroup() != null) &&
\r
1949 (viewport.getSelectionGroup().getSize() > 3))
\r
1952 SequenceGroup sg = viewport.getSelectionGroup();
\r
1954 /* Decide if the selection is a column region */
\r
1955 while (s < sg.sequences.size())
\r
1957 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
1960 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1961 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
1962 "Try using the Pad function in the edit menu,\n" +
\r
1963 "or one of the multiple sequence alignment web services.",
\r
1964 "Sequences in selection are not aligned",
\r
1965 JOptionPane.WARNING_MESSAGE);
\r
1971 title = title + " on region";
\r
1972 tp = new TreePanel(viewport,
\r
1973 viewport.getSelectionGroup().sequences, type, pwType,
\r
1974 sg.getStartRes(), sg.getEndRes());
\r
1978 //are the sequences aligned?
\r
1979 if (!viewport.alignment.isAligned())
\r
1981 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1982 "The sequences must be aligned before creating a tree.\n" +
\r
1983 "Try using the Pad function in the edit menu,\n" +
\r
1984 "or one of the multiple sequence alignment web services.",
\r
1985 "Sequences not aligned",
\r
1986 JOptionPane.WARNING_MESSAGE);
\r
1991 tp = new TreePanel(viewport,
\r
1992 viewport.getAlignment().getSequences(), type, pwType,
\r
1994 viewport.alignment.getWidth());
\r
1997 addTreeMenuItem(tp, title);
\r
1998 viewport.setCurrentTree(tp.getTree());
\r
2000 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2006 * @param title DOCUMENT ME!
\r
2007 * @param order DOCUMENT ME!
\r
2009 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2011 final JMenuItem item = new JMenuItem("by " + title);
\r
2013 item.addActionListener(new java.awt.event.ActionListener()
\r
2015 public void actionPerformed(ActionEvent e)
\r
2017 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2018 HistoryItem.SORT));
\r
2020 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2021 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2022 alignPanel.repaint();
\r
2028 * Maintain the Order by->Displayed Tree menu.
\r
2029 * Creates a new menu item for a TreePanel with an appropriate
\r
2030 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2031 * to remove the menu item when the treePanel is closed, and adjust
\r
2032 * the tree leaf to sequence mapping when the alignment is modified.
\r
2033 * @param treePanel Displayed tree window.
\r
2034 * @param title SortBy menu item title.
\r
2036 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2038 final JMenuItem item = new JMenuItem(title);
\r
2042 if (treeCount == 1)
\r
2044 sort.add(sortByTreeMenu);
\r
2047 sortByTreeMenu.add(item);
\r
2048 item.addActionListener(new java.awt.event.ActionListener()
\r
2050 public void actionPerformed(ActionEvent e)
\r
2052 addHistoryItem(new HistoryItem("Tree Sort",
\r
2053 viewport.alignment, HistoryItem.SORT));
\r
2054 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2055 treePanel.getTree());
\r
2056 alignPanel.repaint();
\r
2060 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2061 InternalFrameAdapter()
\r
2063 public void internalFrameClosed(
\r
2064 javax.swing.event.InternalFrameEvent evt)
\r
2067 sortByTreeMenu.remove(item);
\r
2069 if (treeCount == 0)
\r
2071 sort.remove(sortByTreeMenu);
\r
2079 * Work out whether the whole set of sequences
\r
2080 * or just the selected set will be submitted for multiple alignment.
\r
2083 private SequenceI[] gatherSequencesForAlignment()
\r
2085 // Now, check we have enough sequences
\r
2086 SequenceI[] msa = null;
\r
2088 if ( (viewport.getSelectionGroup() != null) &&
\r
2089 (viewport.getSelectionGroup().getSize() > 1))
\r
2091 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2092 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2094 msa = new SequenceI[sz = seqs.getSize()];
\r
2096 for (int i = 0; i < sz; i++)
\r
2098 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2103 Vector seqs = viewport.getAlignment().getSequences();
\r
2105 if (seqs.size() > 1)
\r
2107 msa = new SequenceI[seqs.size()];
\r
2109 for (int i = 0; i < seqs.size(); i++)
\r
2111 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2119 * Decides what is submitted to a secondary structure prediction service,
\r
2120 * the currently selected sequence, or the currently selected alignment
\r
2121 * (where the first sequence in the set is the one that the prediction
\r
2124 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2126 SequenceI seq = null;
\r
2127 SequenceI[] msa = null;
\r
2129 if ( (viewport.getSelectionGroup() != null) &&
\r
2130 (viewport.getSelectionGroup().getSize() > 0))
\r
2132 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2133 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2135 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2137 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2142 msa = new SequenceI[sz = seqs.getSize()];
\r
2144 for (int i = 0; i < sz; i++)
\r
2146 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2152 Vector seqs = viewport.getAlignment().getSequences();
\r
2154 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2156 seq = (SequenceI) seqs.elementAt(0);
\r
2160 msa = new SequenceI[seqs.size()];
\r
2162 for (int i = 0; i < seqs.size(); i++)
\r
2164 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2176 return new SequenceI[]
\r
2186 * @param e DOCUMENT ME!
\r
2188 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2190 // Pick the tree file
\r
2191 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2193 "LAST_DIRECTORY"));
\r
2194 chooser.setFileView(new JalviewFileView());
\r
2195 chooser.setDialogTitle("Select a newick-like tree file");
\r
2196 chooser.setToolTipText("Load a tree file");
\r
2198 int value = chooser.showOpenDialog(null);
\r
2200 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2202 String choice = chooser.getSelectedFile().getPath();
\r
2203 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2207 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2209 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2211 catch (Exception ex)
\r
2213 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2214 "Problem reading tree file",
\r
2216 JOptionPane.WARNING_MESSAGE);
\r
2217 ex.printStackTrace();
\r
2223 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2225 return ShowNewickTree(nf,title,600,500,4,5);
\r
2230 * @param nf DOCUMENT ME!
\r
2231 * @param title DOCUMENT ME!
\r
2233 * @return DOCUMENT ME!
\r
2235 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2237 TreePanel tp = null;
\r
2243 if (nf.getTree() != null)
\r
2245 tp = new TreePanel(viewport,
\r
2246 viewport.getAlignment().getSequences(), nf,
\r
2253 tp.setLocation(x,y);
\r
2256 Desktop.addInternalFrame(tp, title, w, h);
\r
2257 addTreeMenuItem(tp, title);
\r
2260 catch (Exception ex)
\r
2262 ex.printStackTrace();
\r
2273 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2274 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2275 printJob.setPrintable(alignPanel, pf);
\r
2277 if (printJob.printDialog())
\r
2283 catch (Exception PrintException)
\r
2285 PrintException.printStackTrace();
\r
2292 * Generates menu items and listener event actions for web service clients
\r
2295 public void BuildWebServiceMenu()
\r
2297 if ( (Discoverer.services != null)
\r
2298 && (Discoverer.services.size() > 0))
\r
2300 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2301 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2302 Vector wsmenu = new Vector();
\r
2303 if (msaws != null)
\r
2305 // Add any Multiple Sequence Alignment Services
\r
2306 final JMenu msawsmenu = new JMenu("Alignment");
\r
2307 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2309 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2311 final JMenuItem method = new JMenuItem(sh.getName());
\r
2312 method.addActionListener(new ActionListener()
\r
2314 public void actionPerformed(ActionEvent e)
\r
2316 SequenceI[] msa = gatherSequencesForAlignment();
\r
2317 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2318 false, true, viewport.getAlignment().getDataset());
\r
2323 msawsmenu.add(method);
\r
2324 // Deal with services that we know accept partial alignments.
\r
2325 if (sh.getName().indexOf("lustal") > -1)
\r
2327 // We know that ClustalWS can accept partial alignments for refinement.
\r
2328 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2329 methodR.addActionListener(new ActionListener()
\r
2331 public void actionPerformed(ActionEvent e)
\r
2333 SequenceI[] msa = gatherSequencesForAlignment();
\r
2334 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2335 true, true, viewport.getAlignment().getDataset());
\r
2340 msawsmenu.add(methodR);
\r
2344 wsmenu.add(msawsmenu);
\r
2346 if (secstrpr != null)
\r
2348 // Add any secondary structure prediction services
\r
2349 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2350 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2352 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2354 final JMenuItem method = new JMenuItem(sh.getName());
\r
2355 method.addActionListener(new ActionListener()
\r
2357 public void actionPerformed(ActionEvent e)
\r
2359 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2360 if (msa.length == 1)
\r
2362 // Single Sequence prediction
\r
2363 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2367 if (msa.length > 1)
\r
2369 // Single Sequence prediction
\r
2370 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2376 secstrmenu.add(method);
\r
2378 wsmenu.add(secstrmenu);
\r
2380 this.webService.removeAll();
\r
2381 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2383 webService.add( (JMenu) wsmenu.get(i));
\r
2388 this.webService.removeAll();
\r
2389 this.webService.add(this.webServiceNoServices);
\r
2391 // TODO: add in rediscovery function
\r
2392 // TODO: reduce code redundancy.
\r
2393 // TODO: group services by location as well as function.
\r
2396 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2398 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2399 getProperty("LAST_DIRECTORY"));
\r
2401 chooser.setFileView(new JalviewFileView());
\r
2402 chooser.setDialogTitle("Export to Vamsas file");
\r
2403 chooser.setToolTipText("Export");
\r
2405 int value = chooser.showSaveDialog(this);
\r
2407 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2409 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2410 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2411 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2415 public void featureSettings_actionPerformed(ActionEvent e)
\r
2417 new FeatureSettings(viewport, alignPanel);
\r
2422 public void showTranslation_actionPerformed(ActionEvent e)
\r
2424 int s, sSize = viewport.alignment.getHeight();
\r
2425 SequenceI [] newSeq = new SequenceI[sSize];
\r
2428 StringBuffer protein;
\r
2430 for(s=0; s<sSize; s++)
\r
2432 protein = new StringBuffer();
\r
2433 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2434 resSize = seq.length();
\r
2435 for(res = 0; res < resSize; res+=3)
\r
2437 String codon = seq.substring(res, res+3);
\r
2438 codon = codon.replace('U', 'T');
\r
2439 String aa = ResidueProperties.codonTranslate(codon);
\r
2441 protein.append(viewport.getGapCharacter());
\r
2442 else if(aa.equals("STOP"))
\r
2443 protein.append("X");
\r
2445 protein.append( aa );
\r
2447 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2451 AlignmentI al = new Alignment(newSeq);
\r
2452 al.setDataset(null);
\r
2455 ////////////////////////////////
\r
2456 // Copy annotations across
\r
2457 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2458 = viewport.alignment.getAlignmentAnnotation();
\r
2460 for (int i = 0; i < annotations.length; i++)
\r
2463 if (annotations[i].label.equals("Quality") ||
\r
2464 annotations[i].label.equals("Conservation") ||
\r
2465 annotations[i].label.equals("Consensus"))
\r
2471 aSize = viewport.alignment.getWidth()/3;
\r
2472 jalview.datamodel.Annotation [] anots =
\r
2473 new jalview.datamodel.Annotation[aSize];
\r
2475 for(a=0; a<viewport.alignment.getWidth(); a++)
\r
2477 if( annotations[i].annotations[a]==null
\r
2478 || annotations[i].annotations[a]==null)
\r
2481 anots[a/3] = new Annotation(
\r
2482 annotations[i].annotations[a].displayCharacter,
\r
2483 annotations[i].annotations[a].description,
\r
2484 annotations[i].annotations[a].secondaryStructure,
\r
2485 annotations[i].annotations[a].value,
\r
2486 annotations[i].annotations[a].colour);
\r
2489 jalview.datamodel.AlignmentAnnotation aa
\r
2490 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2491 annotations[i].description, anots );
\r
2492 al.addAnnotation(aa);
\r
2496 AlignFrame af = new AlignFrame(al);
\r
2497 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2499 NEW_WINDOW_HEIGHT);
\r
2502 // AlignViewport newViewport = new AlignViewport(al);
\r
2503 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2504 // tabbedPane.add("Protein", ap);
\r
2505 // viewports.add(newViewport);
\r
2506 // alignPanels.add(ap);
\r
2509 /////////////////////////
\r
2511 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2512 // ds.setDataset(true);
\r
2513 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2514 // tabbedPane.add("Dataset", dap);
\r
2515 // viewports.add(ds);
\r
2516 // alignPanels.add(dap);
\r
2517 /////////////////////////
\r
2522 /*public void tabSelected()
\r
2524 int index = tabbedPane.getSelectedIndex();
\r
2525 viewport = (AlignViewport)viewports.elementAt(index);
\r
2526 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2532 * @param String DOCUMENT ME!
\r
2534 public boolean parseGroupsFile(String file)
\r
2536 AnnotationReader ar = new AnnotationReader();
\r
2538 if (ar.readGroupsFile(alignPanel.seqPanel.seqCanvas.getFeatureRenderer(),
\r
2539 viewport.alignment, file))
\r
2541 viewport.showSequenceFeatures = true;
\r
2542 alignPanel.repaint();
\r
2549 public void dragEnter(DropTargetDragEvent evt)
\r
2552 public void dragExit(DropTargetEvent evt)
\r
2555 public void dragOver(DropTargetDragEvent evt)
\r
2558 public void dropActionChanged(DropTargetDragEvent evt)
\r
2561 public void drop(DropTargetDropEvent evt)
\r
2563 Transferable t = evt.getTransferable();
\r
2564 java.util.List files = null;
\r
2568 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2569 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2571 //Works on Windows and MacOSX
\r
2572 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2573 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2575 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2577 // This is used by Unix drag system
\r
2578 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2579 String data = (String) t.getTransferData(uriListFlavor);
\r
2580 files = new java.util.ArrayList(1);
\r
2581 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2584 st.hasMoreTokens(); )
\r
2586 String s = st.nextToken();
\r
2587 if (s.startsWith("#"))
\r
2589 // the line is a comment (as per the RFC 2483)
\r
2593 java.net.URI uri = new java.net.URI(s);
\r
2594 java.io.File file = new java.io.File(uri);
\r
2599 catch (Exception e)
\r
2601 e.printStackTrace();
\r
2604 if (files != null)
\r
2606 AnnotationReader ar = new AnnotationReader();
\r
2609 for (int i = 0; i < files.size(); i++)
\r
2611 String file = files.get(i).toString();
\r
2612 if(! ar.readAnnotationFile(viewport.alignment, file) )
\r
2613 parseGroupsFile(file);
\r
2620 alignPanel.annotationPanel.adjustPanelHeight();
\r
2621 alignPanel.annotationScroller.validate();
\r
2622 alignPanel.repaint();
\r
2624 catch (Exception ex)
\r
2626 ex.printStackTrace();
\r