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 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 /** DOCUMENT ME!! */
\r
58 public String currentFileFormat = null;
\r
59 Stack historyList = new Stack();
\r
60 Stack redoList = new Stack();
\r
61 private int treeCount = 0;
\r
65 * Creates a new AlignFrame object.
\r
67 * @param al DOCUMENT ME!
\r
69 public AlignFrame(AlignmentI al)
\r
71 viewport = new AlignViewport(al);
\r
73 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
\r
75 if(viewport.vconsensus==null)
\r
77 //Out of memory calculating consensus.
\r
78 BLOSUM62Colour.setEnabled(false);
\r
79 PIDColour.setEnabled(false);
\r
80 conservationMenuItem.setEnabled(false);
\r
81 modifyConservation.setEnabled(false);
\r
82 abovePIDThreshold.setEnabled(false);
\r
83 modifyPID.setEnabled(false);
\r
86 alignPanel = new AlignmentPanel(this, viewport);
\r
88 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
\r
90 if(sortby.equals("Id"))
\r
91 sortIDMenuItem_actionPerformed(null);
\r
92 else if(sortby.equals("Pairwise Identity"))
\r
93 sortPairwiseMenuItem_actionPerformed(null);
\r
95 // remove(tabbedPane);
\r
96 getContentPane().add(alignPanel, BorderLayout.CENTER);
\r
100 // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
\r
103 /////////////////////////
\r
104 if(al.getDataset()==null)
\r
106 al.setDataset(null);
\r
108 // AlignViewport ds = new AlignViewport(al.getDataset(), true);
\r
109 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
110 // tabbedPane.add("Dataset", dap);
\r
111 // viewports.add(ds);
\r
112 // alignPanels.add(dap);
\r
113 /////////////////////////
\r
116 viewport.addPropertyChangeListener(new PropertyChangeListener()
\r
118 public void propertyChange(PropertyChangeEvent evt)
\r
120 if (evt.getPropertyName().equals("alignment"))
\r
122 alignmentChanged();
\r
128 if (Desktop.desktop != null)
\r
130 addServiceListeners();
\r
131 setGUINucleotide(al.isNucleotide());
\r
135 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
136 private void addServiceListeners()
\r
138 final java.beans.PropertyChangeListener thisListener;
\r
139 // Do this once to get current state
\r
140 BuildWebServiceMenu();
\r
141 Desktop.discoverer.addPropertyChangeListener(
\r
142 thisListener = new java.beans.PropertyChangeListener()
\r
144 public void propertyChange(PropertyChangeEvent evt)
\r
146 // System.out.println("Discoverer property change.");
\r
147 if (evt.getPropertyName().equals("services"))
\r
149 // System.out.println("Rebuilding web service menu");
\r
150 BuildWebServiceMenu();
\r
154 addInternalFrameListener(new javax.swing.event.
\r
155 InternalFrameAdapter()
\r
157 public void internalFrameClosed(
\r
158 javax.swing.event.InternalFrameEvent evt)
\r
160 // System.out.println("deregistering discoverer listener");
\r
161 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
162 closeMenuItem_actionPerformed(null);
\r
169 public void setGUINucleotide(boolean nucleotide)
\r
171 showTranslation.setVisible( nucleotide );
\r
172 //sequenceFeatures.setVisible(!nucleotide );
\r
173 //featureSettings.setVisible( !nucleotide );
\r
174 conservationMenuItem.setVisible( !nucleotide );
\r
175 modifyConservation.setVisible( !nucleotide );
\r
177 //Remember AlignFrame always starts as protein
\r
180 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
186 Added so Castor Mapping file can obtain Jalview Version
\r
188 public String getVersion()
\r
190 return jalview.bin.Cache.getProperty("VERSION");
\r
193 public FeatureRenderer getFeatureRenderer()
\r
195 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
\r
199 public void fetchSequence_actionPerformed(ActionEvent e)
\r
201 new SequenceFetcher(this);
\r
204 public void addFromFile_actionPerformed(ActionEvent e)
\r
206 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
\r
209 public void addFromText_actionPerformed(ActionEvent e)
\r
211 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
\r
214 public void addFromURL_actionPerformed(ActionEvent e)
\r
216 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
\r
222 * @param e DOCUMENT ME!
\r
224 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
226 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
227 getProperty( "LAST_DIRECTORY"),
\r
229 { "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc","jar" },
\r
231 { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview" },
\r
236 chooser.setFileView(new JalviewFileView());
\r
237 chooser.setDialogTitle("Save Alignment to file");
\r
238 chooser.setToolTipText("Save");
\r
240 int value = chooser.showSaveDialog(this);
\r
242 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
244 currentFileFormat = chooser.getSelectedFormat();
\r
246 if (currentFileFormat == null)
\r
248 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
249 "You must select a file format before saving!",
\r
250 "File format not specified",
\r
251 JOptionPane.WARNING_MESSAGE);
\r
252 value = chooser.showSaveDialog(this);
\r
256 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
257 currentFileFormat);
\r
259 String choice = chooser.getSelectedFile().getPath();
\r
260 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
262 saveAlignment(choice, currentFileFormat);
\r
266 public boolean saveAlignment(String file, String format)
\r
268 if (format.equalsIgnoreCase("Jalview"))
\r
270 String shortName = title;
\r
272 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
274 shortName = shortName.substring(shortName.lastIndexOf(
\r
275 java.io.File.separatorChar) + 1);
\r
278 new Jalview2XML().SaveAlignment(this, file, shortName);
\r
280 // USE Jalview2XML to save this file
\r
285 String output = new FormatAdapter().formatSequences(format,
\r
286 viewport.getAlignment().
\r
288 if (output == null)
\r
295 java.io.PrintWriter out = new java.io.PrintWriter(
\r
296 new java.io.FileWriter(file));
\r
300 this.setTitle(file);
\r
303 catch (Exception ex)
\r
305 ex.printStackTrace();
\r
314 * @param e DOCUMENT ME!
\r
316 protected void outputText_actionPerformed(ActionEvent e)
\r
318 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
319 Desktop.addInternalFrame(cap,
\r
320 "Alignment output - " + e.getActionCommand(), 600,
\r
322 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
323 viewport.getAlignment().
\r
330 * @param e DOCUMENT ME!
\r
332 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
334 new HTMLOutput(viewport,
\r
335 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
336 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
339 public void createImageMap(File file, String image)
\r
341 alignPanel.makePNGImageMap(file, image);
\r
347 * @param e DOCUMENT ME!
\r
349 public void createPNG(File f)
\r
351 alignPanel.makePNG(f);
\r
357 * @param e DOCUMENT ME!
\r
359 public void createEPS(File f)
\r
361 alignPanel.makeEPS(f);
\r
367 * @param e DOCUMENT ME!
\r
369 public void printMenuItem_actionPerformed(ActionEvent e)
\r
371 //Putting in a thread avoids Swing painting problems
\r
372 PrintThread thread = new PrintThread();
\r
376 public void exportFeatures_actionPerformed(ActionEvent e)
\r
378 new AnnotationExporter().exportFeatures(alignPanel);
\r
381 public void exportAnnotations_actionPerformed(ActionEvent e)
\r
383 new AnnotationExporter().exportAnnotations(
\r
385 viewport.alignment.getAlignmentAnnotation()
\r
390 public void associatedData_actionPerformed(ActionEvent e)
\r
392 // Pick the tree file
\r
393 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
395 "LAST_DIRECTORY"));
\r
396 chooser.setFileView(new JalviewFileView());
\r
397 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
398 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
400 int value = chooser.showOpenDialog(null);
\r
402 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
404 String choice = chooser.getSelectedFile().getPath();
\r
405 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
406 loadJalviewDataFile(choice);
\r
414 * @param e DOCUMENT ME!
\r
416 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
420 PaintRefresher.components.remove(viewport.alignment);
\r
421 this.setClosed(true);
\r
423 catch (Exception ex)
\r
431 void updateEditMenuBar()
\r
433 if (historyList.size() > 0)
\r
435 undoMenuItem.setEnabled(true);
\r
437 HistoryItem hi = (HistoryItem) historyList.peek();
\r
438 undoMenuItem.setText("Undo " + hi.getDescription());
\r
442 undoMenuItem.setEnabled(false);
\r
443 undoMenuItem.setText("Undo");
\r
446 if (redoList.size() > 0)
\r
448 redoMenuItem.setEnabled(true);
\r
450 HistoryItem hi = (HistoryItem) redoList.peek();
\r
451 redoMenuItem.setText("Redo " + hi.getDescription());
\r
455 redoMenuItem.setEnabled(false);
\r
456 redoMenuItem.setText("Redo");
\r
463 * @param hi DOCUMENT ME!
\r
465 public void addHistoryItem(HistoryItem hi)
\r
467 historyList.push(hi);
\r
468 updateEditMenuBar();
\r
474 * @param e DOCUMENT ME!
\r
476 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
478 HistoryItem hi = (HistoryItem) historyList.pop();
\r
479 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
480 HistoryItem.HIDE));
\r
481 restoreHistoryItem(hi);
\r
482 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
488 * @param e DOCUMENT ME!
\r
490 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
492 HistoryItem hi = (HistoryItem) redoList.pop();
\r
493 restoreHistoryItem(hi);
\r
494 updateEditMenuBar();
\r
495 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
498 // used by undo and redo
\r
499 void restoreHistoryItem(HistoryItem hi)
\r
504 updateEditMenuBar();
\r
506 viewport.firePropertyChange("alignment", null,
\r
507 viewport.getAlignment().getSequences());
\r
513 * @param up DOCUMENT ME!
\r
515 public void moveSelectedSequences(boolean up)
\r
517 SequenceGroup sg = viewport.getSelectionGroup();
\r
526 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
528 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
530 if (!sg.sequences.contains(seq))
\r
535 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
537 if (sg.sequences.contains(temp))
\r
542 viewport.alignment.getSequences().setElementAt(temp, i);
\r
543 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
548 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
550 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
552 if (!sg.sequences.contains(seq))
\r
557 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
559 if (sg.sequences.contains(temp))
\r
564 viewport.alignment.getSequences().setElementAt(temp, i);
\r
565 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
569 alignPanel.repaint();
\r
577 * @param e DOCUMENT ME!
\r
579 protected void copy_actionPerformed(ActionEvent e)
\r
581 if (viewport.getSelectionGroup() == null)
\r
586 SequenceGroup sg = viewport.getSelectionGroup();
\r
588 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
590 Hashtable orderedSeqs = new Hashtable();
\r
591 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
593 for (int i = 0; i < sg.getSize(); i++)
\r
595 SequenceI seq = sg.getSequenceAt(i);
\r
596 int index = viewport.alignment.findIndex(seq);
\r
597 orderedSeqs.put(index + "", seq);
\r
600 int index = 0, startRes, endRes;
\r
603 for (int i = 0; i < sg.getSize(); i++)
\r
605 SequenceI seq = null;
\r
607 while (seq == null)
\r
609 if (orderedSeqs.containsKey(index + ""))
\r
611 seq = (SequenceI) orderedSeqs.get(index + "");
\r
623 //Returns residue following index if gap
\r
624 startRes = seq.findPosition(sg.getStartRes());
\r
627 //Need to find the residue preceeding index if gap
\r
630 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
632 ch = seq.getCharAt(j);
\r
633 if (!jalview.util.Comparison.isGap( (ch)))
\r
641 endRes += seq.getStart() - 1;
\r
644 seqs[i] = new Sequence(seq.getName(),
\r
645 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
648 seqs[i].setDescription(seq.getDescription());
\r
649 seqs[i].setDBRef(seq.getDBRef());
\r
650 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
651 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
652 if(seq.getAnnotation()!=null)
\r
654 for(int a=0; a<seq.getAnnotation().length; a++)
\r
655 seqs[i].addAlignmentAnnotation(seq.getAnnotation()[a]);
\r
659 FastaFile ff = new FastaFile();
\r
660 ff.addJVSuffix( viewport.showJVSuffix );
\r
661 c.setContents(new StringSelection( ff.print(seqs)), Desktop.instance);
\r
662 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
668 * @param e DOCUMENT ME!
\r
670 protected void pasteNew_actionPerformed(ActionEvent e)
\r
678 * @param e DOCUMENT ME!
\r
680 protected void pasteThis_actionPerformed(ActionEvent e)
\r
682 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
683 HistoryItem.PASTE));
\r
690 * @param newAlignment DOCUMENT ME!
\r
692 void paste(boolean newAlignment)
\r
696 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
697 Transferable contents = c.getContents(this);
\r
699 if (contents == null)
\r
704 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
708 String format = new IdentifyFile().Identify(str, "Paste");
\r
709 SequenceI[] sequences;
\r
711 if(Desktop.jalviewClipboard!=null)
\r
713 // The clipboard was filled from within Jalview, we must use the sequences
\r
714 // And dataset from the copied alignment
\r
715 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
719 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
722 AlignmentI alignment = null;
\r
726 alignment = new Alignment(sequences);
\r
728 if(Desktop.jalviewClipboard!=null)
\r
729 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
731 alignment.setDataset( null );
\r
735 alignment = viewport.getAlignment();
\r
738 for (int i = 0; i < sequences.length; i++)
\r
741 Sequence newseq = new Sequence(sequences[i].getName(),
\r
742 sequences[i].getSequence(), sequences[i].getStart(),
\r
743 sequences[i].getEnd());
\r
745 alignment.addSequence(newseq);
\r
747 viewport.setEndSeq(alignment.getHeight());
\r
748 alignment.getWidth();
\r
749 viewport.firePropertyChange("alignment", null, alignment.getSequences());
\r
752 // Add any annotations attached to sequences
\r
753 for (int i = 0; i < sequences.length; i++)
\r
755 if (sequences[i].getAnnotation() != null)
\r
757 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
\r
759 AlignmentAnnotation newAnnot =
\r
760 new AlignmentAnnotation(
\r
761 sequences[i].getAnnotation()[a].label,
\r
762 sequences[i].getAnnotation()[a].description,
\r
763 sequences[i].getAnnotation()[a].annotations,
\r
764 sequences[i].getAnnotation()[a].graphMin,
\r
765 sequences[i].getAnnotation()[a].graphMax,
\r
766 sequences[i].getAnnotation()[a].graph);
\r
768 sequences[i].getAnnotation()[a] = newAnnot;
\r
769 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
\r
771 newAnnot.sequenceRef = sequences[i];
\r
772 newAnnot.adjustForAlignment();
\r
773 alignment.addAnnotation(newAnnot);
\r
774 alignment.setAnnotationIndex(newAnnot, a);
\r
777 alignPanel.annotationPanel.adjustPanelHeight();
\r
783 AlignFrame af = new AlignFrame(alignment);
\r
784 String newtitle = new String("Copied sequences");
\r
787 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
788 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
789 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
792 if (title.startsWith("Copied sequences"))
\r
798 newtitle = newtitle.concat("- from " + title);
\r
801 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
802 NEW_WINDOW_HEIGHT);
\r
808 catch (Exception ex)
\r
810 ex.printStackTrace();
\r
811 System.out.println("Exception whilst pasting: "+ex);
\r
812 // could be anything being pasted in here
\r
821 * @param e DOCUMENT ME!
\r
823 protected void cut_actionPerformed(ActionEvent e)
\r
825 copy_actionPerformed(null);
\r
826 delete_actionPerformed(null);
\r
832 * @param e DOCUMENT ME!
\r
834 protected void delete_actionPerformed(ActionEvent e)
\r
837 if (viewport.getSelectionGroup() == null)
\r
843 SequenceGroup sg = viewport.getSelectionGroup();
\r
847 //Jalview no longer allows deletion of residues.
\r
848 //Check here whether any residues are in selection area
\r
849 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
851 for (int i = 0; i < sg.sequences.size(); i++)
\r
853 SequenceI seq = sg.getSequenceAt(i);
\r
854 int j = sg.getStartRes();
\r
857 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
859 JOptionPane.showInternalMessageDialog(
\r
860 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
861 + "Try hiding columns instead.",
\r
862 "Deletion of residues not permitted",
\r
863 JOptionPane.WARNING_MESSAGE);
\r
868 }while(j<=sg.getEndRes());
\r
873 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
874 HistoryItem.HIDE));
\r
877 for (int i = 0; i < sg.sequences.size(); i++)
\r
879 SequenceI seq = sg.getSequenceAt(i);
\r
880 int index = viewport.getAlignment().findIndex(seq);
\r
882 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
884 // If the cut affects all sequences, remove highlighted columns
\r
885 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
887 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
888 sg.getEndRes() + 1);
\r
891 if (seq.getSequence().length() < 1)
\r
893 viewport.getAlignment().deleteSequence(seq);
\r
897 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
901 viewport.setSelectionGroup(null);
\r
902 viewport.alignment.deleteGroup(sg);
\r
904 viewport.firePropertyChange("alignment", null,
\r
905 viewport.getAlignment().getSequences());
\r
909 if (viewport.getAlignment().getHeight() < 1)
\r
913 this.setClosed(true);
\r
915 catch (Exception ex)
\r
924 * @param e DOCUMENT ME!
\r
926 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
928 viewport.alignment.deleteAllGroups();
\r
929 viewport.setSelectionGroup(null);
\r
930 alignPanel.repaint();
\r
936 * @param e DOCUMENT ME!
\r
938 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
940 SequenceGroup sg = new SequenceGroup();
\r
942 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
945 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
948 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
949 viewport.setSelectionGroup(sg);
\r
950 PaintRefresher.Refresh(null, viewport.alignment);
\r
956 * @param e DOCUMENT ME!
\r
958 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
960 if(viewport.cursorMode)
\r
962 alignPanel.seqPanel.keyboardNo1 = null;
\r
963 alignPanel.seqPanel.keyboardNo2 = null;
\r
965 viewport.setSelectionGroup(null);
\r
966 viewport.getColumnSelection().clear();
\r
967 viewport.setSelectionGroup(null);
\r
968 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
969 alignPanel.idPanel.idCanvas.searchResults = null;
\r
970 PaintRefresher.Refresh(null, viewport.alignment);
\r
976 * @param e DOCUMENT ME!
\r
978 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
980 SequenceGroup sg = viewport.getSelectionGroup();
\r
984 selectAllSequenceMenuItem_actionPerformed(null);
\r
989 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
992 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
995 PaintRefresher.Refresh(null, viewport.alignment);
\r
1001 * @param e DOCUMENT ME!
\r
1003 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
1005 ColumnSelection colSel = viewport.getColumnSelection();
\r
1007 if (colSel.size() > 0)
\r
1009 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
1010 HistoryItem.HIDE));
\r
1012 int min = colSel.getMin();
\r
1013 viewport.getAlignment().trimLeft(min);
\r
1014 colSel.compensateForEdit(0, min);
\r
1016 if (viewport.getSelectionGroup() != null)
\r
1018 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
1021 Vector groups = viewport.alignment.getGroups();
\r
1023 for (int i = 0; i < groups.size(); i++)
\r
1025 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1027 if (!sg.adjustForRemoveLeft(min))
\r
1029 viewport.alignment.deleteGroup(sg);
\r
1033 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1040 * @param e DOCUMENT ME!
\r
1042 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1044 ColumnSelection colSel = viewport.getColumnSelection();
\r
1046 if (colSel.size() > 0)
\r
1048 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1049 HistoryItem.HIDE));
\r
1051 int max = colSel.getMax();
\r
1052 viewport.getAlignment().trimRight(max);
\r
1054 if (viewport.getSelectionGroup() != null)
\r
1056 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1059 Vector groups = viewport.alignment.getGroups();
\r
1061 for (int i = 0; i < groups.size(); i++)
\r
1063 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1065 if (!sg.adjustForRemoveRight(max))
\r
1067 viewport.alignment.deleteGroup(sg);
\r
1071 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1078 * @param e DOCUMENT ME!
\r
1080 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1082 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1083 viewport.alignment, HistoryItem.HIDE));
\r
1085 //This is to maintain viewport position on first residue
\r
1086 //of first sequence
\r
1087 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1088 int startRes = seq.findPosition(viewport.startRes);
\r
1090 viewport.getAlignment().removeGaps();
\r
1092 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1094 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1100 * @param e DOCUMENT ME!
\r
1102 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1104 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1105 HistoryItem.HIDE));
\r
1107 //This is to maintain viewport position on first residue
\r
1108 //of first sequence
\r
1109 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1110 int startRes = seq.findPosition(viewport.startRes);
\r
1113 SequenceI current;
\r
1116 Vector seqs = null;
\r
1119 int end = viewport.alignment.getWidth();
\r
1121 if (viewport.getSelectionGroup() != null
\r
1122 && viewport.getSelectionGroup().sequences != null
\r
1123 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1125 seqs = viewport.getSelectionGroup().sequences;
\r
1126 start = viewport.getSelectionGroup().getStartRes();
\r
1127 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1131 seqs = viewport.alignment.getSequences();
\r
1134 for (int i = 0; i < seqs.size(); i++)
\r
1136 current = (SequenceI) seqs.elementAt(i);
\r
1137 jSize = current.getLength();
\r
1139 // Removing a range is much quicker than removing gaps
\r
1140 // one by one for long sequences
\r
1142 int rangeStart=-1, rangeEnd=-1;
\r
1146 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1148 if(rangeStart==-1)
\r
1163 current.deleteChars(rangeStart, rangeEnd);
\r
1164 j-=rangeEnd-rangeStart;
\r
1165 jSize-=rangeEnd-rangeStart;
\r
1173 while (j < end && j < jSize);
\r
1176 current.deleteChars(rangeStart, rangeEnd);
\r
1180 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1182 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1185 public void alignmentChanged()
\r
1187 if(viewport.padGaps)
\r
1188 viewport.getAlignment().padGaps();
\r
1190 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1192 viewport.updateConsensus();
\r
1193 viewport.updateConservation();
\r
1195 resetAllColourSchemes();
\r
1196 if(alignPanel.overviewPanel!=null)
\r
1197 alignPanel.overviewPanel.updateOverviewImage();
\r
1199 viewport.alignment.adjustSequenceAnnotations();
\r
1201 alignPanel.repaint();
\r
1204 void resetAllColourSchemes()
\r
1206 ColourSchemeI cs = viewport.globalColourScheme;
\r
1209 if (cs instanceof ClustalxColourScheme)
\r
1211 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1212 resetClustalX(viewport.alignment.getSequences(),
\r
1213 viewport.alignment.getWidth());
\r
1216 cs.setConsensus(viewport.vconsensus);
\r
1217 if (cs.conservationApplied())
\r
1219 Alignment al = (Alignment) viewport.alignment;
\r
1220 Conservation c = new Conservation("All",
\r
1221 ResidueProperties.propHash, 3,
\r
1222 al.getSequences(), 0,
\r
1223 al.getWidth() - 1);
\r
1225 c.verdict(false, viewport.ConsPercGaps);
\r
1227 cs.setConservation(c);
\r
1231 int s, sSize = viewport.alignment.getGroups().size();
\r
1232 for(s=0; s<sSize; s++)
\r
1234 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1235 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1237 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1239 sg.recalcConservation();
\r
1246 * @param e DOCUMENT ME!
\r
1248 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1250 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1251 HistoryItem.HIDE));
\r
1253 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1255 // if (viewport.padGaps)
\r
1256 alignmentChanged();
\r
1262 * @param e DOCUMENT ME!
\r
1264 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1266 JInternalFrame frame = new JInternalFrame();
\r
1267 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1268 frame.setContentPane(finder);
\r
1269 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1270 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1276 * @param e DOCUMENT ME!
\r
1278 public void font_actionPerformed(ActionEvent e)
\r
1280 new FontChooser(alignPanel);
\r
1283 public void smoothFont_actionPerformed(ActionEvent e)
\r
1285 viewport.antiAlias = smoothFont.isSelected();
\r
1286 alignPanel.annotationPanel.image = null;
\r
1287 alignPanel.repaint();
\r
1294 * @param e DOCUMENT ME!
\r
1296 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1298 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1300 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1301 alignPanel.repaint();
\r
1308 * @param e DOCUMENT ME!
\r
1310 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1312 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1313 alignPanel.repaint();
\r
1319 * @param e DOCUMENT ME!
\r
1321 public void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1323 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1324 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1325 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1326 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1327 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1328 alignPanel.repaint();
\r
1334 * @param e DOCUMENT ME!
\r
1336 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1338 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1339 alignPanel.repaint();
\r
1345 * @param e DOCUMENT ME!
\r
1347 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1349 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1350 alignPanel.repaint();
\r
1356 * @param e DOCUMENT ME!
\r
1358 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1360 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1361 alignPanel.repaint();
\r
1367 * @param e DOCUMENT ME!
\r
1369 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1371 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1372 alignPanel.repaint();
\r
1378 * @param e DOCUMENT ME!
\r
1380 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1382 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1383 alignPanel.repaint();
\r
1389 * @param e DOCUMENT ME!
\r
1391 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1393 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1394 alignPanel.repaint();
\r
1397 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1399 new DasSequenceFeatureFetcher(viewport.
\r
1402 viewport.setShowSequenceFeatures(true);
\r
1403 showSeqFeatures.setSelected(true);
\r
1407 public void featureSettings_actionPerformed(ActionEvent e)
\r
1409 new FeatureSettings(viewport, alignPanel);
\r
1415 * @param evt DOCUMENT ME!
\r
1417 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1419 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1420 alignPanel.repaint();
\r
1421 if (alignPanel.getOverviewPanel() != null)
\r
1423 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1430 * @param e DOCUMENT ME!
\r
1432 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1434 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1435 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1441 * @param e DOCUMENT ME!
\r
1443 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1445 if (alignPanel.overviewPanel != null)
\r
1450 JInternalFrame frame = new JInternalFrame();
\r
1451 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1452 frame.setContentPane(overview);
\r
1453 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1454 frame.getWidth(), frame.getHeight());
\r
1456 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1457 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1459 public void internalFrameClosed(
\r
1460 javax.swing.event.InternalFrameEvent evt)
\r
1462 alignPanel.setOverviewPanel(null);
\r
1467 alignPanel.setOverviewPanel(overview);
\r
1473 * @param e DOCUMENT ME!
\r
1475 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1477 changeColour(null);
\r
1483 * @param e DOCUMENT ME!
\r
1485 public void clustalColour_actionPerformed(ActionEvent e)
\r
1487 changeColour(new ClustalxColourScheme(
\r
1488 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1494 * @param e DOCUMENT ME!
\r
1496 public void zappoColour_actionPerformed(ActionEvent e)
\r
1498 changeColour(new ZappoColourScheme());
\r
1504 * @param e DOCUMENT ME!
\r
1506 public void taylorColour_actionPerformed(ActionEvent e)
\r
1508 changeColour(new TaylorColourScheme());
\r
1514 * @param e DOCUMENT ME!
\r
1516 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1518 changeColour(new HydrophobicColourScheme());
\r
1524 * @param e DOCUMENT ME!
\r
1526 public void helixColour_actionPerformed(ActionEvent e)
\r
1528 changeColour(new HelixColourScheme());
\r
1534 * @param e DOCUMENT ME!
\r
1536 public void strandColour_actionPerformed(ActionEvent e)
\r
1538 changeColour(new StrandColourScheme());
\r
1544 * @param e DOCUMENT ME!
\r
1546 public void turnColour_actionPerformed(ActionEvent e)
\r
1548 changeColour(new TurnColourScheme());
\r
1554 * @param e DOCUMENT ME!
\r
1556 public void buriedColour_actionPerformed(ActionEvent e)
\r
1558 changeColour(new BuriedColourScheme());
\r
1564 * @param e DOCUMENT ME!
\r
1566 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1568 changeColour(new NucleotideColourScheme());
\r
1571 public void annotationColour_actionPerformed(ActionEvent e)
\r
1573 new AnnotationColourChooser(viewport, alignPanel);
\r
1580 * @param e DOCUMENT ME!
\r
1582 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1584 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1590 * @param cs DOCUMENT ME!
\r
1592 void changeColour(ColourSchemeI cs)
\r
1594 int threshold = 0;
\r
1598 if (viewport.getAbovePIDThreshold())
\r
1600 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1603 cs.setThreshold(threshold,
\r
1604 viewport.getIgnoreGapsConsensus());
\r
1606 viewport.setGlobalColourScheme(cs);
\r
1610 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1613 if (viewport.getConservationSelected())
\r
1616 Alignment al = (Alignment) viewport.alignment;
\r
1617 Conservation c = new Conservation("All",
\r
1618 ResidueProperties.propHash, 3,
\r
1619 al.getSequences(), 0,
\r
1620 al.getWidth() - 1);
\r
1623 c.verdict(false, viewport.ConsPercGaps);
\r
1625 cs.setConservation(c);
\r
1627 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1632 cs.setConservation(null);
\r
1635 cs.setConsensus(viewport.vconsensus);
\r
1638 viewport.setGlobalColourScheme(cs);
\r
1640 if (viewport.getColourAppliesToAllGroups())
\r
1642 Vector groups = viewport.alignment.getGroups();
\r
1644 for (int i = 0; i < groups.size(); i++)
\r
1646 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1654 if (cs instanceof ClustalxColourScheme)
\r
1656 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1658 else if (cs instanceof UserColourScheme)
\r
1660 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1666 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1668 catch (Exception ex)
\r
1673 if (viewport.getAbovePIDThreshold()
\r
1674 || cs instanceof PIDColourScheme
\r
1675 || cs instanceof Blosum62ColourScheme)
\r
1677 sg.cs.setThreshold(threshold,
\r
1678 viewport.getIgnoreGapsConsensus());
\r
1680 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1684 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1687 if (viewport.getConservationSelected())
\r
1689 Conservation c = new Conservation("Group",
\r
1690 ResidueProperties.propHash, 3,
\r
1692 viewport.alignment.getWidth() - 1);
\r
1694 c.verdict(false, viewport.ConsPercGaps);
\r
1695 sg.cs.setConservation(c);
\r
1698 sg.cs.setConservation(null);
\r
1702 if (alignPanel.getOverviewPanel() != null)
\r
1704 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1707 alignPanel.repaint();
\r
1713 * @param e DOCUMENT ME!
\r
1715 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1717 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1719 SliderPanel.setPIDSliderSource(alignPanel,
\r
1720 viewport.getGlobalColourScheme(),
\r
1722 SliderPanel.showPIDSlider();
\r
1729 * @param e DOCUMENT ME!
\r
1731 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1733 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1735 SliderPanel.setConservationSlider(alignPanel,
\r
1736 viewport.globalColourScheme,
\r
1738 SliderPanel.showConservationSlider();
\r
1745 * @param e DOCUMENT ME!
\r
1747 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1749 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1751 viewport.setAbovePIDThreshold(false);
\r
1752 abovePIDThreshold.setSelected(false);
\r
1754 changeColour(viewport.getGlobalColourScheme());
\r
1756 modifyConservation_actionPerformed(null);
\r
1762 * @param e DOCUMENT ME!
\r
1764 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1766 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1768 conservationMenuItem.setSelected(false);
\r
1769 viewport.setConservationSelected(false);
\r
1771 changeColour(viewport.getGlobalColourScheme());
\r
1773 modifyPID_actionPerformed(null);
\r
1779 * @param e DOCUMENT ME!
\r
1781 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1783 if (e.getActionCommand().equals("User Defined..."))
\r
1785 new UserDefinedColours(alignPanel, null);
\r
1789 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1790 getUserColourSchemes().get(e.getActionCommand());
\r
1792 changeColour(udc);
\r
1796 public void updateUserColourMenu()
\r
1799 Component[] menuItems = colourMenu.getMenuComponents();
\r
1800 int i, iSize = menuItems.length;
\r
1801 for (i = 0; i < iSize; i++)
\r
1803 if (menuItems[i].getName() != null &&
\r
1804 menuItems[i].getName().equals("USER_DEFINED"))
\r
1806 colourMenu.remove(menuItems[i]);
\r
1810 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1812 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1813 getUserColourSchemes().keys();
\r
1815 while (userColours.hasMoreElements())
\r
1817 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1818 nextElement().toString());
\r
1819 radioItem.setName("USER_DEFINED");
\r
1820 radioItem.addMouseListener(new MouseAdapter()
\r
1822 public void mousePressed(MouseEvent evt)
\r
1824 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1826 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1828 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1829 "Remove from default list?",
\r
1830 "Remove user defined colour",
\r
1831 JOptionPane.YES_NO_OPTION);
\r
1832 if(option == JOptionPane.YES_OPTION)
\r
1834 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1835 colourMenu.remove(radioItem);
\r
1838 radioItem.addActionListener(new ActionListener()
\r
1840 public void actionPerformed(ActionEvent evt)
\r
1842 userDefinedColour_actionPerformed(evt);
\r
1848 radioItem.addActionListener(new ActionListener()
\r
1850 public void actionPerformed(ActionEvent evt)
\r
1852 userDefinedColour_actionPerformed(evt);
\r
1856 colourMenu.insert(radioItem, 15);
\r
1857 colours.add(radioItem);
\r
1865 * @param e DOCUMENT ME!
\r
1867 public void PIDColour_actionPerformed(ActionEvent e)
\r
1869 changeColour(new PIDColourScheme());
\r
1875 * @param e DOCUMENT ME!
\r
1877 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1879 changeColour(new Blosum62ColourScheme());
\r
1885 * @param e DOCUMENT ME!
\r
1887 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1889 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1890 HistoryItem.SORT));
\r
1891 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1892 viewport.getAlignment().getSequenceAt(0));
\r
1893 alignPanel.repaint();
\r
1899 * @param e DOCUMENT ME!
\r
1901 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1903 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1904 HistoryItem.SORT));
\r
1905 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1906 alignPanel.repaint();
\r
1912 * @param e DOCUMENT ME!
\r
1914 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1916 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1917 HistoryItem.SORT));
\r
1919 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1920 alignPanel.repaint();
\r
1926 * @param e DOCUMENT ME!
\r
1928 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1930 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1931 JInternalFrame frame = new JInternalFrame();
\r
1932 frame.setContentPane(sp);
\r
1933 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1940 * @param e DOCUMENT ME!
\r
1942 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1944 if ( (viewport.getSelectionGroup() == null) ||
\r
1945 (viewport.getSelectionGroup().getSize() < 2))
\r
1947 JOptionPane.showInternalMessageDialog(this,
\r
1948 "You must select at least 2 sequences.",
\r
1949 "Invalid Selection",
\r
1950 JOptionPane.WARNING_MESSAGE);
\r
1954 JInternalFrame frame = new JInternalFrame();
\r
1955 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1956 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1963 * @param e DOCUMENT ME!
\r
1965 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1967 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1968 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1969 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1970 (viewport.getAlignment().getHeight() < 4))
\r
1972 JOptionPane.showInternalMessageDialog(this,
\r
1973 "Principal component analysis must take\n" +
\r
1974 "at least 4 input sequences.",
\r
1975 "Sequence selection insufficient",
\r
1976 JOptionPane.WARNING_MESSAGE);
\r
1981 new PCAPanel(viewport);
\r
1985 public void autoCalculate_actionPerformed(ActionEvent e)
\r
1987 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
1988 if(viewport.autoCalculateConsensus)
\r
1990 alignmentChanged();
\r
1998 * @param e DOCUMENT ME!
\r
2000 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
2002 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2008 * @param e DOCUMENT ME!
\r
2010 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2012 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2018 * @param e DOCUMENT ME!
\r
2020 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2022 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2028 * @param e DOCUMENT ME!
\r
2030 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2032 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2038 * @param type DOCUMENT ME!
\r
2039 * @param pwType DOCUMENT ME!
\r
2040 * @param title DOCUMENT ME!
\r
2042 void NewTreePanel(String type, String pwType, String title)
\r
2046 if ( (viewport.getSelectionGroup() != null) &&
\r
2047 (viewport.getSelectionGroup().getSize() > 3))
\r
2050 SequenceGroup sg = viewport.getSelectionGroup();
\r
2052 /* Decide if the selection is a column region */
\r
2053 while (s < sg.sequences.size())
\r
2055 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
2058 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2059 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2060 "Try using the Pad function in the edit menu,\n" +
\r
2061 "or one of the multiple sequence alignment web services.",
\r
2062 "Sequences in selection are not aligned",
\r
2063 JOptionPane.WARNING_MESSAGE);
\r
2069 title = title + " on region";
\r
2070 tp = new TreePanel(viewport,
\r
2071 viewport.getSelectionGroup().sequences, type, pwType,
\r
2072 sg.getStartRes(), sg.getEndRes());
\r
2076 //are the sequences aligned?
\r
2077 if (!viewport.alignment.isAligned())
\r
2079 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2080 "The sequences must be aligned before creating a tree.\n" +
\r
2081 "Try using the Pad function in the edit menu,\n" +
\r
2082 "or one of the multiple sequence alignment web services.",
\r
2083 "Sequences not aligned",
\r
2084 JOptionPane.WARNING_MESSAGE);
\r
2089 tp = new TreePanel(viewport,
\r
2090 viewport.getAlignment().getSequences(), type, pwType,
\r
2092 viewport.alignment.getWidth());
\r
2095 addTreeMenuItem(tp, title);
\r
2097 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2103 * @param title DOCUMENT ME!
\r
2104 * @param order DOCUMENT ME!
\r
2106 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2108 final JMenuItem item = new JMenuItem("by " + title);
\r
2110 item.addActionListener(new java.awt.event.ActionListener()
\r
2112 public void actionPerformed(ActionEvent e)
\r
2114 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2115 HistoryItem.SORT));
\r
2117 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2118 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2119 alignPanel.repaint();
\r
2125 * Maintain the Order by->Displayed Tree menu.
\r
2126 * Creates a new menu item for a TreePanel with an appropriate
\r
2127 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2128 * to remove the menu item when the treePanel is closed, and adjust
\r
2129 * the tree leaf to sequence mapping when the alignment is modified.
\r
2130 * @param treePanel Displayed tree window.
\r
2131 * @param title SortBy menu item title.
\r
2133 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2135 final JMenuItem item = new JMenuItem(title);
\r
2139 if (treeCount == 1)
\r
2141 sort.add(sortByTreeMenu);
\r
2144 sortByTreeMenu.add(item);
\r
2145 item.addActionListener(new java.awt.event.ActionListener()
\r
2147 public void actionPerformed(ActionEvent e)
\r
2149 addHistoryItem(new HistoryItem("Tree Sort",
\r
2150 viewport.alignment, HistoryItem.SORT));
\r
2151 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2152 treePanel.getTree());
\r
2153 alignPanel.repaint();
\r
2157 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2158 InternalFrameAdapter()
\r
2160 public void internalFrameClosed(
\r
2161 javax.swing.event.InternalFrameEvent evt)
\r
2164 sortByTreeMenu.remove(item);
\r
2166 if (treeCount == 0)
\r
2168 sort.remove(sortByTreeMenu);
\r
2176 * Work out whether the whole set of sequences
\r
2177 * or just the selected set will be submitted for multiple alignment.
\r
2180 private SequenceI[] gatherSequencesForAlignment()
\r
2182 // Now, check we have enough sequences
\r
2183 SequenceI[] msa = null;
\r
2185 if ( (viewport.getSelectionGroup() != null) &&
\r
2186 (viewport.getSelectionGroup().getSize() > 1))
\r
2188 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2189 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2191 msa = new SequenceI[sz = seqs.getSize()];
\r
2193 for (int i = 0; i < sz; i++)
\r
2195 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2200 Vector seqs = viewport.getAlignment().getSequences();
\r
2202 if (seqs.size() > 1)
\r
2204 msa = new SequenceI[seqs.size()];
\r
2206 for (int i = 0; i < seqs.size(); i++)
\r
2208 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2216 * Decides what is submitted to a secondary structure prediction service,
\r
2217 * the currently selected sequence, or the currently selected alignment
\r
2218 * (where the first sequence in the set is the one that the prediction
\r
2221 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2223 SequenceI seq = null;
\r
2224 SequenceI[] msa = null;
\r
2226 if ( (viewport.getSelectionGroup() != null) &&
\r
2227 (viewport.getSelectionGroup().getSize() > 0))
\r
2229 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2230 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2232 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2234 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2239 msa = new SequenceI[sz = seqs.getSize()];
\r
2241 for (int i = 0; i < sz; i++)
\r
2243 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2249 Vector seqs = viewport.getAlignment().getSequences();
\r
2251 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2253 seq = (SequenceI) seqs.elementAt(0);
\r
2257 msa = new SequenceI[seqs.size()];
\r
2259 for (int i = 0; i < seqs.size(); i++)
\r
2261 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2273 return new SequenceI[]
\r
2283 * @param e DOCUMENT ME!
\r
2285 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2287 // Pick the tree file
\r
2288 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2290 "LAST_DIRECTORY"));
\r
2291 chooser.setFileView(new JalviewFileView());
\r
2292 chooser.setDialogTitle("Select a newick-like tree file");
\r
2293 chooser.setToolTipText("Load a tree file");
\r
2295 int value = chooser.showOpenDialog(null);
\r
2297 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2299 String choice = chooser.getSelectedFile().getPath();
\r
2300 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2304 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2306 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2308 catch (Exception ex)
\r
2310 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2311 "Problem reading tree file",
\r
2313 JOptionPane.WARNING_MESSAGE);
\r
2314 ex.printStackTrace();
\r
2320 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2322 return ShowNewickTree(nf,title,600,500,4,5);
\r
2327 * @param nf DOCUMENT ME!
\r
2328 * @param title DOCUMENT ME!
\r
2330 * @return DOCUMENT ME!
\r
2332 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2334 TreePanel tp = null;
\r
2340 if (nf.getTree() != null)
\r
2342 tp = new TreePanel(viewport,
\r
2343 viewport.getAlignment().getSequences(), nf,
\r
2350 tp.setLocation(x,y);
\r
2353 Desktop.addInternalFrame(tp, title, w, h);
\r
2354 addTreeMenuItem(tp, title);
\r
2357 catch (Exception ex)
\r
2359 ex.printStackTrace();
\r
2370 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2371 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2372 printJob.setPrintable(alignPanel, pf);
\r
2374 if (printJob.printDialog())
\r
2380 catch (Exception PrintException)
\r
2382 PrintException.printStackTrace();
\r
2389 * Generates menu items and listener event actions for web service clients
\r
2392 public void BuildWebServiceMenu()
\r
2394 if ( (Discoverer.services != null)
\r
2395 && (Discoverer.services.size() > 0))
\r
2397 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2398 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2399 Vector wsmenu = new Vector();
\r
2400 if (msaws != null)
\r
2402 // Add any Multiple Sequence Alignment Services
\r
2403 final JMenu msawsmenu = new JMenu("Alignment");
\r
2404 final AlignFrame af = this;
\r
2405 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2407 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2409 final JMenuItem method = new JMenuItem(sh.getName());
\r
2410 method.addActionListener(new ActionListener()
\r
2412 public void actionPerformed(ActionEvent e)
\r
2414 SequenceI[] msa = gatherSequencesForAlignment();
\r
2415 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2416 false, true, viewport.getAlignment().getDataset(), af);
\r
2421 msawsmenu.add(method);
\r
2422 // Deal with services that we know accept partial alignments.
\r
2423 if (sh.getName().indexOf("lustal") > -1)
\r
2425 // We know that ClustalWS can accept partial alignments for refinement.
\r
2426 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2427 methodR.addActionListener(new ActionListener()
\r
2429 public void actionPerformed(ActionEvent e)
\r
2431 SequenceI[] msa = gatherSequencesForAlignment();
\r
2432 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2433 true, true, viewport.getAlignment().getDataset(), af);
\r
2438 msawsmenu.add(methodR);
\r
2442 wsmenu.add(msawsmenu);
\r
2444 if (secstrpr != null)
\r
2446 // Add any secondary structure prediction services
\r
2447 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2448 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2450 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2452 final JMenuItem method = new JMenuItem(sh.getName());
\r
2453 method.addActionListener(new ActionListener()
\r
2455 public void actionPerformed(ActionEvent e)
\r
2457 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2458 if (msa.length == 1)
\r
2460 // Single Sequence prediction
\r
2461 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2465 if (msa.length > 1)
\r
2467 // Single Sequence prediction
\r
2468 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2474 secstrmenu.add(method);
\r
2476 wsmenu.add(secstrmenu);
\r
2478 this.webService.removeAll();
\r
2479 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2481 webService.add( (JMenu) wsmenu.get(i));
\r
2486 this.webService.removeAll();
\r
2487 this.webService.add(this.webServiceNoServices);
\r
2489 // TODO: add in rediscovery function
\r
2490 // TODO: reduce code redundancy.
\r
2491 // TODO: group services by location as well as function.
\r
2494 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2496 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2497 getProperty("LAST_DIRECTORY"));
\r
2499 chooser.setFileView(new JalviewFileView());
\r
2500 chooser.setDialogTitle("Export to Vamsas file");
\r
2501 chooser.setToolTipText("Export");
\r
2503 int value = chooser.showSaveDialog(this);
\r
2505 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2507 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2508 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2509 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2517 public void showTranslation_actionPerformed(ActionEvent e)
\r
2519 int s, sSize = viewport.alignment.getHeight();
\r
2520 SequenceI [] newSeq = new SequenceI[sSize];
\r
2523 StringBuffer protein;
\r
2525 for(s=0; s<sSize; s++)
\r
2527 protein = new StringBuffer();
\r
2528 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2529 resSize = seq.length();
\r
2530 resSize -= resSize%3;
\r
2532 for(res = 0; res < resSize; res+=3)
\r
2534 String codon = seq.substring(res, res+3);
\r
2535 codon = codon.replace('U', 'T');
\r
2536 String aa = ResidueProperties.codonTranslate(codon);
\r
2538 protein.append(viewport.getGapCharacter());
\r
2539 else if(aa.equals("STOP"))
\r
2540 protein.append("X");
\r
2542 protein.append( aa );
\r
2544 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2548 AlignmentI al = new Alignment(newSeq);
\r
2549 al.setDataset(null);
\r
2552 ////////////////////////////////
\r
2553 // Copy annotations across
\r
2554 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2555 = viewport.alignment.getAlignmentAnnotation();
\r
2557 if(annotations!=null)
\r
2559 for (int i = 0; i < annotations.length; i++)
\r
2561 if (annotations[i].label.equals("Quality") ||
\r
2562 annotations[i].label.equals("Conservation") ||
\r
2563 annotations[i].label.equals("Consensus"))
\r
2568 aSize = viewport.alignment.getWidth() / 3;
\r
2569 jalview.datamodel.Annotation[] anots =
\r
2570 new jalview.datamodel.Annotation[aSize];
\r
2572 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2574 if (annotations[i].annotations[a] == null
\r
2575 || annotations[i].annotations[a] == null)
\r
2578 anots[a / 3] = new Annotation(
\r
2579 annotations[i].annotations[a].displayCharacter,
\r
2580 annotations[i].annotations[a].description,
\r
2581 annotations[i].annotations[a].secondaryStructure,
\r
2582 annotations[i].annotations[a].value,
\r
2583 annotations[i].annotations[a].colour);
\r
2586 jalview.datamodel.AlignmentAnnotation aa
\r
2587 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2588 annotations[i].description, anots);
\r
2589 al.addAnnotation(aa);
\r
2593 AlignFrame af = new AlignFrame(al);
\r
2594 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2596 NEW_WINDOW_HEIGHT);
\r
2599 // AlignViewport newViewport = new AlignViewport(al);
\r
2600 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2601 // tabbedPane.add("Protein", ap);
\r
2602 // viewports.add(newViewport);
\r
2603 // alignPanels.add(ap);
\r
2606 /////////////////////////
\r
2608 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2609 // ds.setDataset(true);
\r
2610 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2611 // tabbedPane.add("Dataset", dap);
\r
2612 // viewports.add(ds);
\r
2613 // alignPanels.add(dap);
\r
2614 /////////////////////////
\r
2619 /*public void tabSelected()
\r
2621 int index = tabbedPane.getSelectedIndex();
\r
2622 viewport = (AlignViewport)viewports.elementAt(index);
\r
2623 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2629 * @param String DOCUMENT ME!
\r
2631 public boolean parseFeaturesFile(String file, String type)
\r
2633 boolean featuresFile = false;
\r
2635 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment,
\r
2636 alignPanel.seqPanel.seqCanvas.
\r
2637 getFeatureRenderer().featureColours);
\r
2639 catch(Exception ex)
\r
2641 ex.printStackTrace();
\r
2646 viewport.showSequenceFeatures = true;
\r
2647 showSeqFeatures.setSelected(true);
\r
2648 alignPanel.repaint();
\r
2651 return featuresFile;
\r
2654 public void dragEnter(DropTargetDragEvent evt)
\r
2657 public void dragExit(DropTargetEvent evt)
\r
2660 public void dragOver(DropTargetDragEvent evt)
\r
2663 public void dropActionChanged(DropTargetDragEvent evt)
\r
2666 public void drop(DropTargetDropEvent evt)
\r
2668 Transferable t = evt.getTransferable();
\r
2669 java.util.List files = null;
\r
2673 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2674 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2676 //Works on Windows and MacOSX
\r
2677 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2678 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2680 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2682 // This is used by Unix drag system
\r
2683 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2684 String data = (String) t.getTransferData(uriListFlavor);
\r
2685 files = new java.util.ArrayList(1);
\r
2686 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2689 st.hasMoreTokens(); )
\r
2691 String s = st.nextToken();
\r
2692 if (s.startsWith("#"))
\r
2694 // the line is a comment (as per the RFC 2483)
\r
2698 java.net.URI uri = new java.net.URI(s);
\r
2699 java.io.File file = new java.io.File(uri);
\r
2704 catch (Exception e)
\r
2706 e.printStackTrace();
\r
2708 if (files != null)
\r
2713 for (int i = 0; i < files.size(); i++)
\r
2715 loadJalviewDataFile(files.get(i).toString());
\r
2718 catch (Exception ex)
\r
2720 ex.printStackTrace();
\r
2725 // This method will attempt to load a "dropped" file first by testing
\r
2726 // whether its and Annotation file, then features file. If both are
\r
2727 // false then the user may have dropped an alignment file onto this
\r
2729 public void loadJalviewDataFile(String file)
\r
2732 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
\r
2735 if (!isAnnotation)
\r
2737 boolean isGroupsFile = parseFeaturesFile(file,
\r
2738 AppletFormatAdapter.FILE);
\r
2739 if (!isGroupsFile)
\r
2741 String protocol = "File";
\r
2742 String format = new IdentifyFile().Identify(file, protocol);
\r
2743 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2746 FastaFile ff = new FastaFile();
\r
2747 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2748 c.setContents(new StringSelection(ff.print(sequences)), Desktop.instance);
\r
2750 this.paste(false);
\r
2756 alignPanel.adjustAnnotationHeight();
\r
2759 }catch(Exception ex)
\r
2761 ex.printStackTrace();
\r