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
134 if(jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false))
\r
136 wrapMenuItem.setSelected(true);
\r
137 wrapMenuItem_actionPerformed(null);
\r
141 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
142 private void addServiceListeners()
\r
144 final java.beans.PropertyChangeListener thisListener;
\r
145 // Do this once to get current state
\r
146 BuildWebServiceMenu();
\r
147 Desktop.discoverer.addPropertyChangeListener(
\r
148 thisListener = new java.beans.PropertyChangeListener()
\r
150 public void propertyChange(PropertyChangeEvent evt)
\r
152 // System.out.println("Discoverer property change.");
\r
153 if (evt.getPropertyName().equals("services"))
\r
155 // System.out.println("Rebuilding web service menu");
\r
156 BuildWebServiceMenu();
\r
160 addInternalFrameListener(new javax.swing.event.
\r
161 InternalFrameAdapter()
\r
163 public void internalFrameClosed(
\r
164 javax.swing.event.InternalFrameEvent evt)
\r
166 // System.out.println("deregistering discoverer listener");
\r
167 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
168 closeMenuItem_actionPerformed(null);
\r
175 public void setGUINucleotide(boolean nucleotide)
\r
177 showTranslation.setVisible( nucleotide );
\r
178 //sequenceFeatures.setVisible(!nucleotide );
\r
179 //featureSettings.setVisible( !nucleotide );
\r
180 conservationMenuItem.setVisible( !nucleotide );
\r
181 modifyConservation.setVisible( !nucleotide );
\r
183 //Remember AlignFrame always starts as protein
\r
186 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
192 Added so Castor Mapping file can obtain Jalview Version
\r
194 public String getVersion()
\r
196 return jalview.bin.Cache.getProperty("VERSION");
\r
199 public FeatureRenderer getFeatureRenderer()
\r
201 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
\r
205 public void fetchSequence_actionPerformed(ActionEvent e)
\r
207 new SequenceFetcher(this);
\r
210 public void addFromFile_actionPerformed(ActionEvent e)
\r
212 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
\r
215 public void addFromText_actionPerformed(ActionEvent e)
\r
217 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
\r
220 public void addFromURL_actionPerformed(ActionEvent e)
\r
222 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
\r
228 * @param e DOCUMENT ME!
\r
230 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
232 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
233 getProperty( "LAST_DIRECTORY"),
\r
235 { "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc","jar" },
\r
237 { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview" },
\r
242 chooser.setFileView(new JalviewFileView());
\r
243 chooser.setDialogTitle("Save Alignment to file");
\r
244 chooser.setToolTipText("Save");
\r
246 int value = chooser.showSaveDialog(this);
\r
248 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
250 currentFileFormat = chooser.getSelectedFormat();
\r
252 if (currentFileFormat == null)
\r
254 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
255 "You must select a file format before saving!",
\r
256 "File format not specified",
\r
257 JOptionPane.WARNING_MESSAGE);
\r
258 value = chooser.showSaveDialog(this);
\r
262 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
263 currentFileFormat);
\r
265 String choice = chooser.getSelectedFile().getPath();
\r
266 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
268 saveAlignment(choice, currentFileFormat);
\r
272 public boolean saveAlignment(String file, String format)
\r
274 if (format.equalsIgnoreCase("Jalview"))
\r
276 String shortName = title;
\r
278 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
280 shortName = shortName.substring(shortName.lastIndexOf(
\r
281 java.io.File.separatorChar) + 1);
\r
284 new Jalview2XML().SaveAlignment(this, file, shortName);
\r
286 // USE Jalview2XML to save this file
\r
291 String output = new FormatAdapter().formatSequences(format,
\r
292 viewport.getAlignment().
\r
294 if (output == null)
\r
301 java.io.PrintWriter out = new java.io.PrintWriter(
\r
302 new java.io.FileWriter(file));
\r
306 this.setTitle(file);
\r
309 catch (Exception ex)
\r
311 ex.printStackTrace();
\r
320 * @param e DOCUMENT ME!
\r
322 protected void outputText_actionPerformed(ActionEvent e)
\r
324 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
325 Desktop.addInternalFrame(cap,
\r
326 "Alignment output - " + e.getActionCommand(), 600,
\r
328 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
329 viewport.getAlignment().
\r
336 * @param e DOCUMENT ME!
\r
338 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
340 new HTMLOutput(viewport,
\r
341 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
342 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
345 public void createImageMap(File file, String image)
\r
347 alignPanel.makePNGImageMap(file, image);
\r
353 * @param e DOCUMENT ME!
\r
355 public void createPNG(File f)
\r
357 alignPanel.makePNG(f);
\r
363 * @param e DOCUMENT ME!
\r
365 public void createEPS(File f)
\r
367 alignPanel.makeEPS(f);
\r
373 * @param e DOCUMENT ME!
\r
375 public void printMenuItem_actionPerformed(ActionEvent e)
\r
377 //Putting in a thread avoids Swing painting problems
\r
378 PrintThread thread = new PrintThread();
\r
382 public void exportFeatures_actionPerformed(ActionEvent e)
\r
384 new AnnotationExporter().exportFeatures(alignPanel);
\r
387 public void exportAnnotations_actionPerformed(ActionEvent e)
\r
389 new AnnotationExporter().exportAnnotations(
\r
391 viewport.alignment.getAlignmentAnnotation()
\r
396 public void associatedData_actionPerformed(ActionEvent e)
\r
398 // Pick the tree file
\r
399 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
401 "LAST_DIRECTORY"));
\r
402 chooser.setFileView(new JalviewFileView());
\r
403 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
404 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
406 int value = chooser.showOpenDialog(null);
\r
408 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
410 String choice = chooser.getSelectedFile().getPath();
\r
411 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
412 loadJalviewDataFile(choice);
\r
420 * @param e DOCUMENT ME!
\r
422 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
426 PaintRefresher.components.remove(viewport.alignment);
\r
427 this.setClosed(true);
\r
429 catch (Exception ex)
\r
437 void updateEditMenuBar()
\r
439 if (historyList.size() > 0)
\r
441 undoMenuItem.setEnabled(true);
\r
443 HistoryItem hi = (HistoryItem) historyList.peek();
\r
444 undoMenuItem.setText("Undo " + hi.getDescription());
\r
448 undoMenuItem.setEnabled(false);
\r
449 undoMenuItem.setText("Undo");
\r
452 if (redoList.size() > 0)
\r
454 redoMenuItem.setEnabled(true);
\r
456 HistoryItem hi = (HistoryItem) redoList.peek();
\r
457 redoMenuItem.setText("Redo " + hi.getDescription());
\r
461 redoMenuItem.setEnabled(false);
\r
462 redoMenuItem.setText("Redo");
\r
469 * @param hi DOCUMENT ME!
\r
471 public void addHistoryItem(HistoryItem hi)
\r
473 historyList.push(hi);
\r
474 updateEditMenuBar();
\r
480 * @param e DOCUMENT ME!
\r
482 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
484 HistoryItem hi = (HistoryItem) historyList.pop();
\r
485 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
486 HistoryItem.HIDE));
\r
487 restoreHistoryItem(hi);
\r
488 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
494 * @param e DOCUMENT ME!
\r
496 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
498 HistoryItem hi = (HistoryItem) redoList.pop();
\r
499 restoreHistoryItem(hi);
\r
500 updateEditMenuBar();
\r
501 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
504 // used by undo and redo
\r
505 void restoreHistoryItem(HistoryItem hi)
\r
510 updateEditMenuBar();
\r
512 viewport.firePropertyChange("alignment", null,
\r
513 viewport.getAlignment().getSequences());
\r
519 * @param up DOCUMENT ME!
\r
521 public void moveSelectedSequences(boolean up)
\r
523 SequenceGroup sg = viewport.getSelectionGroup();
\r
532 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
534 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
536 if (!sg.sequences.contains(seq))
\r
541 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
543 if (sg.sequences.contains(temp))
\r
548 viewport.alignment.getSequences().setElementAt(temp, i);
\r
549 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
554 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
556 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
558 if (!sg.sequences.contains(seq))
\r
563 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
565 if (sg.sequences.contains(temp))
\r
570 viewport.alignment.getSequences().setElementAt(temp, i);
\r
571 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
575 alignPanel.repaint();
\r
583 * @param e DOCUMENT ME!
\r
585 protected void copy_actionPerformed(ActionEvent e)
\r
587 if (viewport.getSelectionGroup() == null)
\r
592 SequenceGroup sg = viewport.getSelectionGroup();
\r
594 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
596 Hashtable orderedSeqs = new Hashtable();
\r
597 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
599 for (int i = 0; i < sg.getSize(); i++)
\r
601 SequenceI seq = sg.getSequenceAt(i);
\r
602 int index = viewport.alignment.findIndex(seq);
\r
603 orderedSeqs.put(index + "", seq);
\r
606 int index = 0, startRes, endRes;
\r
609 for (int i = 0; i < sg.getSize(); i++)
\r
611 SequenceI seq = null;
\r
613 while (seq == null)
\r
615 if (orderedSeqs.containsKey(index + ""))
\r
617 seq = (SequenceI) orderedSeqs.get(index + "");
\r
629 //Returns residue following index if gap
\r
630 startRes = seq.findPosition(sg.getStartRes());
\r
633 //Need to find the residue preceeding index if gap
\r
636 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
638 ch = seq.getCharAt(j);
\r
639 if (!jalview.util.Comparison.isGap( (ch)))
\r
647 endRes += seq.getStart() - 1;
\r
650 seqs[i] = new Sequence(seq.getName(),
\r
651 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
654 seqs[i].setDescription(seq.getDescription());
\r
655 seqs[i].setDBRef(seq.getDBRef());
\r
656 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
657 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
658 if(seq.getAnnotation()!=null)
\r
660 for(int a=0; a<seq.getAnnotation().length; a++)
\r
661 seqs[i].addAlignmentAnnotation(seq.getAnnotation()[a]);
\r
665 FastaFile ff = new FastaFile();
\r
666 ff.addJVSuffix( viewport.showJVSuffix );
\r
667 c.setContents(new StringSelection( ff.print(seqs)), Desktop.instance);
\r
668 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
674 * @param e DOCUMENT ME!
\r
676 protected void pasteNew_actionPerformed(ActionEvent e)
\r
684 * @param e DOCUMENT ME!
\r
686 protected void pasteThis_actionPerformed(ActionEvent e)
\r
688 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
689 HistoryItem.PASTE));
\r
696 * @param newAlignment DOCUMENT ME!
\r
698 void paste(boolean newAlignment)
\r
702 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
703 Transferable contents = c.getContents(this);
\r
705 if (contents == null)
\r
710 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
714 String format = new IdentifyFile().Identify(str, "Paste");
\r
715 SequenceI[] sequences;
\r
717 if(Desktop.jalviewClipboard!=null)
\r
719 // The clipboard was filled from within Jalview, we must use the sequences
\r
720 // And dataset from the copied alignment
\r
721 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
725 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
728 AlignmentI alignment = null;
\r
732 alignment = new Alignment(sequences);
\r
734 if(Desktop.jalviewClipboard!=null)
\r
735 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
737 alignment.setDataset( null );
\r
741 alignment = viewport.getAlignment();
\r
744 for (int i = 0; i < sequences.length; i++)
\r
747 Sequence newseq = new Sequence(sequences[i].getName(),
\r
748 sequences[i].getSequence(), sequences[i].getStart(),
\r
749 sequences[i].getEnd());
\r
751 alignment.addSequence(newseq);
\r
753 viewport.setEndSeq(alignment.getHeight());
\r
754 alignment.getWidth();
\r
755 viewport.firePropertyChange("alignment", null, alignment.getSequences());
\r
758 // Add any annotations attached to sequences
\r
759 for (int i = 0; i < sequences.length; i++)
\r
761 if (sequences[i].getAnnotation() != null)
\r
763 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
\r
765 AlignmentAnnotation newAnnot =
\r
766 new AlignmentAnnotation(
\r
767 sequences[i].getAnnotation()[a].label,
\r
768 sequences[i].getAnnotation()[a].description,
\r
769 sequences[i].getAnnotation()[a].annotations,
\r
770 sequences[i].getAnnotation()[a].graphMin,
\r
771 sequences[i].getAnnotation()[a].graphMax,
\r
772 sequences[i].getAnnotation()[a].graph);
\r
774 sequences[i].getAnnotation()[a] = newAnnot;
\r
775 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
\r
777 newAnnot.sequenceRef = sequences[i];
\r
778 newAnnot.adjustForAlignment();
\r
779 alignment.addAnnotation(newAnnot);
\r
780 alignment.setAnnotationIndex(newAnnot, a);
\r
783 alignPanel.annotationPanel.adjustPanelHeight();
\r
789 AlignFrame af = new AlignFrame(alignment);
\r
790 String newtitle = new String("Copied sequences");
\r
793 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
794 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
795 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
798 if (title.startsWith("Copied sequences"))
\r
804 newtitle = newtitle.concat("- from " + title);
\r
807 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
808 NEW_WINDOW_HEIGHT);
\r
814 catch (Exception ex)
\r
816 ex.printStackTrace();
\r
817 System.out.println("Exception whilst pasting: "+ex);
\r
818 // could be anything being pasted in here
\r
827 * @param e DOCUMENT ME!
\r
829 protected void cut_actionPerformed(ActionEvent e)
\r
831 copy_actionPerformed(null);
\r
832 delete_actionPerformed(null);
\r
838 * @param e DOCUMENT ME!
\r
840 protected void delete_actionPerformed(ActionEvent e)
\r
843 if (viewport.getSelectionGroup() == null)
\r
849 SequenceGroup sg = viewport.getSelectionGroup();
\r
853 //Jalview no longer allows deletion of residues.
\r
854 //Check here whether any residues are in selection area
\r
855 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
857 for (int i = 0; i < sg.sequences.size(); i++)
\r
859 SequenceI seq = sg.getSequenceAt(i);
\r
860 int j = sg.getStartRes();
\r
863 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
865 JOptionPane.showInternalMessageDialog(
\r
866 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
867 + "Try hiding columns instead.",
\r
868 "Deletion of residues not permitted",
\r
869 JOptionPane.WARNING_MESSAGE);
\r
874 }while(j<=sg.getEndRes());
\r
879 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
880 HistoryItem.HIDE));
\r
883 for (int i = 0; i < sg.sequences.size(); i++)
\r
885 SequenceI seq = sg.getSequenceAt(i);
\r
886 int index = viewport.getAlignment().findIndex(seq);
\r
888 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
890 // If the cut affects all sequences, remove highlighted columns
\r
891 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
893 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
894 sg.getEndRes() + 1);
\r
897 if (seq.getSequence().length() < 1)
\r
899 viewport.getAlignment().deleteSequence(seq);
\r
903 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
907 viewport.setSelectionGroup(null);
\r
908 viewport.alignment.deleteGroup(sg);
\r
910 viewport.firePropertyChange("alignment", null,
\r
911 viewport.getAlignment().getSequences());
\r
915 if (viewport.getAlignment().getHeight() < 1)
\r
919 this.setClosed(true);
\r
921 catch (Exception ex)
\r
930 * @param e DOCUMENT ME!
\r
932 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
934 viewport.alignment.deleteAllGroups();
\r
935 viewport.setSelectionGroup(null);
\r
936 alignPanel.repaint();
\r
942 * @param e DOCUMENT ME!
\r
944 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
946 SequenceGroup sg = new SequenceGroup();
\r
948 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
951 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
954 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
955 viewport.setSelectionGroup(sg);
\r
956 PaintRefresher.Refresh(null, viewport.alignment);
\r
962 * @param e DOCUMENT ME!
\r
964 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
966 if(viewport.cursorMode)
\r
968 alignPanel.seqPanel.keyboardNo1 = null;
\r
969 alignPanel.seqPanel.keyboardNo2 = null;
\r
971 viewport.setSelectionGroup(null);
\r
972 viewport.getColumnSelection().clear();
\r
973 viewport.setSelectionGroup(null);
\r
974 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
975 alignPanel.idPanel.idCanvas.searchResults = null;
\r
976 PaintRefresher.Refresh(null, viewport.alignment);
\r
982 * @param e DOCUMENT ME!
\r
984 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
986 SequenceGroup sg = viewport.getSelectionGroup();
\r
990 selectAllSequenceMenuItem_actionPerformed(null);
\r
995 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
998 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
1001 PaintRefresher.Refresh(null, viewport.alignment);
\r
1007 * @param e DOCUMENT ME!
\r
1009 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
1011 ColumnSelection colSel = viewport.getColumnSelection();
\r
1013 if (colSel.size() > 0)
\r
1015 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
1016 HistoryItem.HIDE));
\r
1018 int min = colSel.getMin();
\r
1019 viewport.getAlignment().trimLeft(min);
\r
1020 colSel.compensateForEdit(0, min);
\r
1022 if (viewport.getSelectionGroup() != null)
\r
1024 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
1027 Vector groups = viewport.alignment.getGroups();
\r
1029 for (int i = 0; i < groups.size(); i++)
\r
1031 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1033 if (!sg.adjustForRemoveLeft(min))
\r
1035 viewport.alignment.deleteGroup(sg);
\r
1039 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1046 * @param e DOCUMENT ME!
\r
1048 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1050 ColumnSelection colSel = viewport.getColumnSelection();
\r
1052 if (colSel.size() > 0)
\r
1054 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1055 HistoryItem.HIDE));
\r
1057 int max = colSel.getMax();
\r
1058 viewport.getAlignment().trimRight(max);
\r
1060 if (viewport.getSelectionGroup() != null)
\r
1062 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1065 Vector groups = viewport.alignment.getGroups();
\r
1067 for (int i = 0; i < groups.size(); i++)
\r
1069 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1071 if (!sg.adjustForRemoveRight(max))
\r
1073 viewport.alignment.deleteGroup(sg);
\r
1077 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1084 * @param e DOCUMENT ME!
\r
1086 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1088 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1089 viewport.alignment, HistoryItem.HIDE));
\r
1091 //This is to maintain viewport position on first residue
\r
1092 //of first sequence
\r
1093 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1094 int startRes = seq.findPosition(viewport.startRes);
\r
1096 viewport.getAlignment().removeGaps();
\r
1098 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1100 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1106 * @param e DOCUMENT ME!
\r
1108 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1110 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1111 HistoryItem.HIDE));
\r
1113 //This is to maintain viewport position on first residue
\r
1114 //of first sequence
\r
1115 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1116 int startRes = seq.findPosition(viewport.startRes);
\r
1119 SequenceI current;
\r
1122 Vector seqs = null;
\r
1125 int end = viewport.alignment.getWidth();
\r
1127 if (viewport.getSelectionGroup() != null
\r
1128 && viewport.getSelectionGroup().sequences != null
\r
1129 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1131 seqs = viewport.getSelectionGroup().sequences;
\r
1132 start = viewport.getSelectionGroup().getStartRes();
\r
1133 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1137 seqs = viewport.alignment.getSequences();
\r
1140 for (int i = 0; i < seqs.size(); i++)
\r
1142 current = (SequenceI) seqs.elementAt(i);
\r
1143 jSize = current.getLength();
\r
1145 // Removing a range is much quicker than removing gaps
\r
1146 // one by one for long sequences
\r
1148 int rangeStart=-1, rangeEnd=-1;
\r
1152 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1154 if(rangeStart==-1)
\r
1169 current.deleteChars(rangeStart, rangeEnd);
\r
1170 j-=rangeEnd-rangeStart;
\r
1171 jSize-=rangeEnd-rangeStart;
\r
1179 while (j < end && j < jSize);
\r
1182 current.deleteChars(rangeStart, rangeEnd);
\r
1186 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1188 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1191 public void alignmentChanged()
\r
1193 if(viewport.padGaps)
\r
1194 viewport.getAlignment().padGaps();
\r
1196 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1198 viewport.updateConsensus();
\r
1199 viewport.updateConservation();
\r
1201 resetAllColourSchemes();
\r
1202 if(alignPanel.overviewPanel!=null)
\r
1203 alignPanel.overviewPanel.updateOverviewImage();
\r
1205 viewport.alignment.adjustSequenceAnnotations();
\r
1207 alignPanel.repaint();
\r
1210 void resetAllColourSchemes()
\r
1212 ColourSchemeI cs = viewport.globalColourScheme;
\r
1215 if (cs instanceof ClustalxColourScheme)
\r
1217 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1218 resetClustalX(viewport.alignment.getSequences(),
\r
1219 viewport.alignment.getWidth());
\r
1222 cs.setConsensus(viewport.vconsensus);
\r
1223 if (cs.conservationApplied())
\r
1225 Alignment al = (Alignment) viewport.alignment;
\r
1226 Conservation c = new Conservation("All",
\r
1227 ResidueProperties.propHash, 3,
\r
1228 al.getSequences(), 0,
\r
1229 al.getWidth() - 1);
\r
1231 c.verdict(false, viewport.ConsPercGaps);
\r
1233 cs.setConservation(c);
\r
1237 int s, sSize = viewport.alignment.getGroups().size();
\r
1238 for(s=0; s<sSize; s++)
\r
1240 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1241 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1243 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1245 sg.recalcConservation();
\r
1252 * @param e DOCUMENT ME!
\r
1254 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1256 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1257 HistoryItem.HIDE));
\r
1259 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1261 // if (viewport.padGaps)
\r
1262 alignmentChanged();
\r
1268 * @param e DOCUMENT ME!
\r
1270 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1272 JInternalFrame frame = new JInternalFrame();
\r
1273 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1274 frame.setContentPane(finder);
\r
1275 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1276 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1282 * @param e DOCUMENT ME!
\r
1284 public void font_actionPerformed(ActionEvent e)
\r
1286 new FontChooser(alignPanel);
\r
1289 public void smoothFont_actionPerformed(ActionEvent e)
\r
1291 viewport.antiAlias = smoothFont.isSelected();
\r
1292 alignPanel.annotationPanel.image = null;
\r
1293 alignPanel.repaint();
\r
1300 * @param e DOCUMENT ME!
\r
1302 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1304 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1306 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1307 alignPanel.repaint();
\r
1314 * @param e DOCUMENT ME!
\r
1316 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1318 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1319 alignPanel.repaint();
\r
1325 * @param e DOCUMENT ME!
\r
1327 public void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1329 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1330 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1331 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1332 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1333 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1334 alignPanel.repaint();
\r
1340 * @param e DOCUMENT ME!
\r
1342 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1344 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1345 alignPanel.repaint();
\r
1351 * @param e DOCUMENT ME!
\r
1353 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1355 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1356 alignPanel.repaint();
\r
1362 * @param e DOCUMENT ME!
\r
1364 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1366 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1367 alignPanel.repaint();
\r
1373 * @param e DOCUMENT ME!
\r
1375 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1377 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1378 alignPanel.repaint();
\r
1384 * @param e DOCUMENT ME!
\r
1386 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1388 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1389 alignPanel.repaint();
\r
1395 * @param e DOCUMENT ME!
\r
1397 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1399 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1400 alignPanel.repaint();
\r
1403 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1405 new DasSequenceFeatureFetcher(viewport.
\r
1408 viewport.setShowSequenceFeatures(true);
\r
1409 showSeqFeatures.setSelected(true);
\r
1413 public void featureSettings_actionPerformed(ActionEvent e)
\r
1415 new FeatureSettings(viewport, alignPanel);
\r
1421 * @param evt DOCUMENT ME!
\r
1423 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1425 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1426 alignPanel.repaint();
\r
1427 if (alignPanel.getOverviewPanel() != null)
\r
1429 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1436 * @param e DOCUMENT ME!
\r
1438 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1440 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1441 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1447 * @param e DOCUMENT ME!
\r
1449 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1451 if (alignPanel.overviewPanel != null)
\r
1456 JInternalFrame frame = new JInternalFrame();
\r
1457 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1458 frame.setContentPane(overview);
\r
1459 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1460 frame.getWidth(), frame.getHeight());
\r
1462 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1463 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1465 public void internalFrameClosed(
\r
1466 javax.swing.event.InternalFrameEvent evt)
\r
1468 alignPanel.setOverviewPanel(null);
\r
1473 alignPanel.setOverviewPanel(overview);
\r
1479 * @param e DOCUMENT ME!
\r
1481 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1483 changeColour(null);
\r
1489 * @param e DOCUMENT ME!
\r
1491 public void clustalColour_actionPerformed(ActionEvent e)
\r
1493 changeColour(new ClustalxColourScheme(
\r
1494 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1500 * @param e DOCUMENT ME!
\r
1502 public void zappoColour_actionPerformed(ActionEvent e)
\r
1504 changeColour(new ZappoColourScheme());
\r
1510 * @param e DOCUMENT ME!
\r
1512 public void taylorColour_actionPerformed(ActionEvent e)
\r
1514 changeColour(new TaylorColourScheme());
\r
1520 * @param e DOCUMENT ME!
\r
1522 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1524 changeColour(new HydrophobicColourScheme());
\r
1530 * @param e DOCUMENT ME!
\r
1532 public void helixColour_actionPerformed(ActionEvent e)
\r
1534 changeColour(new HelixColourScheme());
\r
1540 * @param e DOCUMENT ME!
\r
1542 public void strandColour_actionPerformed(ActionEvent e)
\r
1544 changeColour(new StrandColourScheme());
\r
1550 * @param e DOCUMENT ME!
\r
1552 public void turnColour_actionPerformed(ActionEvent e)
\r
1554 changeColour(new TurnColourScheme());
\r
1560 * @param e DOCUMENT ME!
\r
1562 public void buriedColour_actionPerformed(ActionEvent e)
\r
1564 changeColour(new BuriedColourScheme());
\r
1570 * @param e DOCUMENT ME!
\r
1572 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1574 changeColour(new NucleotideColourScheme());
\r
1577 public void annotationColour_actionPerformed(ActionEvent e)
\r
1579 new AnnotationColourChooser(viewport, alignPanel);
\r
1586 * @param e DOCUMENT ME!
\r
1588 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1590 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1596 * @param cs DOCUMENT ME!
\r
1598 void changeColour(ColourSchemeI cs)
\r
1600 int threshold = 0;
\r
1604 if (viewport.getAbovePIDThreshold())
\r
1606 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1609 cs.setThreshold(threshold,
\r
1610 viewport.getIgnoreGapsConsensus());
\r
1612 viewport.setGlobalColourScheme(cs);
\r
1616 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1619 if (viewport.getConservationSelected())
\r
1622 Alignment al = (Alignment) viewport.alignment;
\r
1623 Conservation c = new Conservation("All",
\r
1624 ResidueProperties.propHash, 3,
\r
1625 al.getSequences(), 0,
\r
1626 al.getWidth() - 1);
\r
1629 c.verdict(false, viewport.ConsPercGaps);
\r
1631 cs.setConservation(c);
\r
1633 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1638 cs.setConservation(null);
\r
1641 cs.setConsensus(viewport.vconsensus);
\r
1644 viewport.setGlobalColourScheme(cs);
\r
1646 if (viewport.getColourAppliesToAllGroups())
\r
1648 Vector groups = viewport.alignment.getGroups();
\r
1650 for (int i = 0; i < groups.size(); i++)
\r
1652 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1660 if (cs instanceof ClustalxColourScheme)
\r
1662 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1664 else if (cs instanceof UserColourScheme)
\r
1666 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1672 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1674 catch (Exception ex)
\r
1679 if (viewport.getAbovePIDThreshold()
\r
1680 || cs instanceof PIDColourScheme
\r
1681 || cs instanceof Blosum62ColourScheme)
\r
1683 sg.cs.setThreshold(threshold,
\r
1684 viewport.getIgnoreGapsConsensus());
\r
1686 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1690 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1693 if (viewport.getConservationSelected())
\r
1695 Conservation c = new Conservation("Group",
\r
1696 ResidueProperties.propHash, 3,
\r
1698 viewport.alignment.getWidth() - 1);
\r
1700 c.verdict(false, viewport.ConsPercGaps);
\r
1701 sg.cs.setConservation(c);
\r
1704 sg.cs.setConservation(null);
\r
1708 if (alignPanel.getOverviewPanel() != null)
\r
1710 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1713 alignPanel.repaint();
\r
1719 * @param e DOCUMENT ME!
\r
1721 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1723 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1725 SliderPanel.setPIDSliderSource(alignPanel,
\r
1726 viewport.getGlobalColourScheme(),
\r
1728 SliderPanel.showPIDSlider();
\r
1735 * @param e DOCUMENT ME!
\r
1737 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1739 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1741 SliderPanel.setConservationSlider(alignPanel,
\r
1742 viewport.globalColourScheme,
\r
1744 SliderPanel.showConservationSlider();
\r
1751 * @param e DOCUMENT ME!
\r
1753 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1755 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1757 viewport.setAbovePIDThreshold(false);
\r
1758 abovePIDThreshold.setSelected(false);
\r
1760 changeColour(viewport.getGlobalColourScheme());
\r
1762 modifyConservation_actionPerformed(null);
\r
1768 * @param e DOCUMENT ME!
\r
1770 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1772 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1774 conservationMenuItem.setSelected(false);
\r
1775 viewport.setConservationSelected(false);
\r
1777 changeColour(viewport.getGlobalColourScheme());
\r
1779 modifyPID_actionPerformed(null);
\r
1785 * @param e DOCUMENT ME!
\r
1787 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1789 if (e.getActionCommand().equals("User Defined..."))
\r
1791 new UserDefinedColours(alignPanel, null);
\r
1795 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1796 getUserColourSchemes().get(e.getActionCommand());
\r
1798 changeColour(udc);
\r
1802 public void updateUserColourMenu()
\r
1805 Component[] menuItems = colourMenu.getMenuComponents();
\r
1806 int i, iSize = menuItems.length;
\r
1807 for (i = 0; i < iSize; i++)
\r
1809 if (menuItems[i].getName() != null &&
\r
1810 menuItems[i].getName().equals("USER_DEFINED"))
\r
1812 colourMenu.remove(menuItems[i]);
\r
1816 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1818 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1819 getUserColourSchemes().keys();
\r
1821 while (userColours.hasMoreElements())
\r
1823 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1824 nextElement().toString());
\r
1825 radioItem.setName("USER_DEFINED");
\r
1826 radioItem.addMouseListener(new MouseAdapter()
\r
1828 public void mousePressed(MouseEvent evt)
\r
1830 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1832 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1834 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1835 "Remove from default list?",
\r
1836 "Remove user defined colour",
\r
1837 JOptionPane.YES_NO_OPTION);
\r
1838 if(option == JOptionPane.YES_OPTION)
\r
1840 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1841 colourMenu.remove(radioItem);
\r
1844 radioItem.addActionListener(new ActionListener()
\r
1846 public void actionPerformed(ActionEvent evt)
\r
1848 userDefinedColour_actionPerformed(evt);
\r
1854 radioItem.addActionListener(new ActionListener()
\r
1856 public void actionPerformed(ActionEvent evt)
\r
1858 userDefinedColour_actionPerformed(evt);
\r
1862 colourMenu.insert(radioItem, 15);
\r
1863 colours.add(radioItem);
\r
1871 * @param e DOCUMENT ME!
\r
1873 public void PIDColour_actionPerformed(ActionEvent e)
\r
1875 changeColour(new PIDColourScheme());
\r
1881 * @param e DOCUMENT ME!
\r
1883 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1885 changeColour(new Blosum62ColourScheme());
\r
1891 * @param e DOCUMENT ME!
\r
1893 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1895 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1896 HistoryItem.SORT));
\r
1897 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1898 viewport.getAlignment().getSequenceAt(0));
\r
1899 alignPanel.repaint();
\r
1905 * @param e DOCUMENT ME!
\r
1907 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1909 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1910 HistoryItem.SORT));
\r
1911 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1912 alignPanel.repaint();
\r
1918 * @param e DOCUMENT ME!
\r
1920 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1922 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1923 HistoryItem.SORT));
\r
1925 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1926 alignPanel.repaint();
\r
1932 * @param e DOCUMENT ME!
\r
1934 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1936 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1937 JInternalFrame frame = new JInternalFrame();
\r
1938 frame.setContentPane(sp);
\r
1939 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1946 * @param e DOCUMENT ME!
\r
1948 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1950 if ( (viewport.getSelectionGroup() == null) ||
\r
1951 (viewport.getSelectionGroup().getSize() < 2))
\r
1953 JOptionPane.showInternalMessageDialog(this,
\r
1954 "You must select at least 2 sequences.",
\r
1955 "Invalid Selection",
\r
1956 JOptionPane.WARNING_MESSAGE);
\r
1960 JInternalFrame frame = new JInternalFrame();
\r
1961 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1962 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1969 * @param e DOCUMENT ME!
\r
1971 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1973 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1974 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1975 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1976 (viewport.getAlignment().getHeight() < 4))
\r
1978 JOptionPane.showInternalMessageDialog(this,
\r
1979 "Principal component analysis must take\n" +
\r
1980 "at least 4 input sequences.",
\r
1981 "Sequence selection insufficient",
\r
1982 JOptionPane.WARNING_MESSAGE);
\r
1987 new PCAPanel(viewport);
\r
1991 public void autoCalculate_actionPerformed(ActionEvent e)
\r
1993 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
1994 if(viewport.autoCalculateConsensus)
\r
1996 alignmentChanged();
\r
2004 * @param e DOCUMENT ME!
\r
2006 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
2008 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2014 * @param e DOCUMENT ME!
\r
2016 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2018 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2024 * @param e DOCUMENT ME!
\r
2026 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2028 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2034 * @param e DOCUMENT ME!
\r
2036 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2038 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2044 * @param type DOCUMENT ME!
\r
2045 * @param pwType DOCUMENT ME!
\r
2046 * @param title DOCUMENT ME!
\r
2048 void NewTreePanel(String type, String pwType, String title)
\r
2052 if ( (viewport.getSelectionGroup() != null) &&
\r
2053 (viewport.getSelectionGroup().getSize() > 3))
\r
2056 SequenceGroup sg = viewport.getSelectionGroup();
\r
2058 /* Decide if the selection is a column region */
\r
2059 while (s < sg.sequences.size())
\r
2061 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
2064 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2065 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2066 "Try using the Pad function in the edit menu,\n" +
\r
2067 "or one of the multiple sequence alignment web services.",
\r
2068 "Sequences in selection are not aligned",
\r
2069 JOptionPane.WARNING_MESSAGE);
\r
2075 title = title + " on region";
\r
2076 tp = new TreePanel(viewport,
\r
2077 viewport.getSelectionGroup().sequences, type, pwType,
\r
2078 sg.getStartRes(), sg.getEndRes());
\r
2082 //are the sequences aligned?
\r
2083 if (!viewport.alignment.isAligned())
\r
2085 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2086 "The sequences must be aligned before creating a tree.\n" +
\r
2087 "Try using the Pad function in the edit menu,\n" +
\r
2088 "or one of the multiple sequence alignment web services.",
\r
2089 "Sequences not aligned",
\r
2090 JOptionPane.WARNING_MESSAGE);
\r
2095 tp = new TreePanel(viewport,
\r
2096 viewport.getAlignment().getSequences(), type, pwType,
\r
2098 viewport.alignment.getWidth());
\r
2101 addTreeMenuItem(tp, title);
\r
2103 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2109 * @param title DOCUMENT ME!
\r
2110 * @param order DOCUMENT ME!
\r
2112 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2114 final JMenuItem item = new JMenuItem("by " + title);
\r
2116 item.addActionListener(new java.awt.event.ActionListener()
\r
2118 public void actionPerformed(ActionEvent e)
\r
2120 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2121 HistoryItem.SORT));
\r
2123 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2124 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2125 alignPanel.repaint();
\r
2131 * Maintain the Order by->Displayed Tree menu.
\r
2132 * Creates a new menu item for a TreePanel with an appropriate
\r
2133 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2134 * to remove the menu item when the treePanel is closed, and adjust
\r
2135 * the tree leaf to sequence mapping when the alignment is modified.
\r
2136 * @param treePanel Displayed tree window.
\r
2137 * @param title SortBy menu item title.
\r
2139 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2141 final JMenuItem item = new JMenuItem(title);
\r
2145 if (treeCount == 1)
\r
2147 sort.add(sortByTreeMenu);
\r
2150 sortByTreeMenu.add(item);
\r
2151 item.addActionListener(new java.awt.event.ActionListener()
\r
2153 public void actionPerformed(ActionEvent e)
\r
2155 addHistoryItem(new HistoryItem("Tree Sort",
\r
2156 viewport.alignment, HistoryItem.SORT));
\r
2157 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2158 treePanel.getTree());
\r
2159 alignPanel.repaint();
\r
2163 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2164 InternalFrameAdapter()
\r
2166 public void internalFrameClosed(
\r
2167 javax.swing.event.InternalFrameEvent evt)
\r
2170 sortByTreeMenu.remove(item);
\r
2172 if (treeCount == 0)
\r
2174 sort.remove(sortByTreeMenu);
\r
2182 * Work out whether the whole set of sequences
\r
2183 * or just the selected set will be submitted for multiple alignment.
\r
2186 private SequenceI[] gatherSequencesForAlignment()
\r
2188 // Now, check we have enough sequences
\r
2189 SequenceI[] msa = null;
\r
2191 if ( (viewport.getSelectionGroup() != null) &&
\r
2192 (viewport.getSelectionGroup().getSize() > 1))
\r
2194 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2195 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2197 msa = new SequenceI[sz = seqs.getSize()];
\r
2199 for (int i = 0; i < sz; i++)
\r
2201 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2206 Vector seqs = viewport.getAlignment().getSequences();
\r
2208 if (seqs.size() > 1)
\r
2210 msa = new SequenceI[seqs.size()];
\r
2212 for (int i = 0; i < seqs.size(); i++)
\r
2214 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2222 * Decides what is submitted to a secondary structure prediction service,
\r
2223 * the currently selected sequence, or the currently selected alignment
\r
2224 * (where the first sequence in the set is the one that the prediction
\r
2227 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2229 SequenceI seq = null;
\r
2230 SequenceI[] msa = null;
\r
2232 if ( (viewport.getSelectionGroup() != null) &&
\r
2233 (viewport.getSelectionGroup().getSize() > 0))
\r
2235 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2236 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2238 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2240 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2245 msa = new SequenceI[sz = seqs.getSize()];
\r
2247 for (int i = 0; i < sz; i++)
\r
2249 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2255 Vector seqs = viewport.getAlignment().getSequences();
\r
2257 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2259 seq = (SequenceI) seqs.elementAt(0);
\r
2263 msa = new SequenceI[seqs.size()];
\r
2265 for (int i = 0; i < seqs.size(); i++)
\r
2267 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2279 return new SequenceI[]
\r
2289 * @param e DOCUMENT ME!
\r
2291 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2293 // Pick the tree file
\r
2294 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2296 "LAST_DIRECTORY"));
\r
2297 chooser.setFileView(new JalviewFileView());
\r
2298 chooser.setDialogTitle("Select a newick-like tree file");
\r
2299 chooser.setToolTipText("Load a tree file");
\r
2301 int value = chooser.showOpenDialog(null);
\r
2303 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2305 String choice = chooser.getSelectedFile().getPath();
\r
2306 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2310 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2312 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2314 catch (Exception ex)
\r
2316 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2317 "Problem reading tree file",
\r
2319 JOptionPane.WARNING_MESSAGE);
\r
2320 ex.printStackTrace();
\r
2326 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2328 return ShowNewickTree(nf,title,600,500,4,5);
\r
2333 * @param nf DOCUMENT ME!
\r
2334 * @param title DOCUMENT ME!
\r
2336 * @return DOCUMENT ME!
\r
2338 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2340 TreePanel tp = null;
\r
2346 if (nf.getTree() != null)
\r
2348 tp = new TreePanel(viewport,
\r
2349 viewport.getAlignment().getSequences(), nf,
\r
2356 tp.setLocation(x,y);
\r
2359 Desktop.addInternalFrame(tp, title, w, h);
\r
2360 addTreeMenuItem(tp, title);
\r
2363 catch (Exception ex)
\r
2365 ex.printStackTrace();
\r
2376 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2377 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2378 printJob.setPrintable(alignPanel, pf);
\r
2380 if (printJob.printDialog())
\r
2386 catch (Exception PrintException)
\r
2388 PrintException.printStackTrace();
\r
2395 * Generates menu items and listener event actions for web service clients
\r
2398 public void BuildWebServiceMenu()
\r
2400 if ( (Discoverer.services != null)
\r
2401 && (Discoverer.services.size() > 0))
\r
2403 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2404 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2405 Vector wsmenu = new Vector();
\r
2406 if (msaws != null)
\r
2408 // Add any Multiple Sequence Alignment Services
\r
2409 final JMenu msawsmenu = new JMenu("Alignment");
\r
2410 final AlignFrame af = this;
\r
2411 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2413 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2415 final JMenuItem method = new JMenuItem(sh.getName());
\r
2416 method.addActionListener(new ActionListener()
\r
2418 public void actionPerformed(ActionEvent e)
\r
2420 SequenceI[] msa = gatherSequencesForAlignment();
\r
2421 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2422 false, true, viewport.getAlignment().getDataset(), af);
\r
2427 msawsmenu.add(method);
\r
2428 // Deal with services that we know accept partial alignments.
\r
2429 if (sh.getName().indexOf("lustal") > -1)
\r
2431 // We know that ClustalWS can accept partial alignments for refinement.
\r
2432 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2433 methodR.addActionListener(new ActionListener()
\r
2435 public void actionPerformed(ActionEvent e)
\r
2437 SequenceI[] msa = gatherSequencesForAlignment();
\r
2438 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2439 true, true, viewport.getAlignment().getDataset(), af);
\r
2444 msawsmenu.add(methodR);
\r
2448 wsmenu.add(msawsmenu);
\r
2450 if (secstrpr != null)
\r
2452 // Add any secondary structure prediction services
\r
2453 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2454 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2456 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2458 final JMenuItem method = new JMenuItem(sh.getName());
\r
2459 method.addActionListener(new ActionListener()
\r
2461 public void actionPerformed(ActionEvent e)
\r
2463 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2464 if (msa.length == 1)
\r
2466 // Single Sequence prediction
\r
2467 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2471 if (msa.length > 1)
\r
2473 // Single Sequence prediction
\r
2474 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2480 secstrmenu.add(method);
\r
2482 wsmenu.add(secstrmenu);
\r
2484 this.webService.removeAll();
\r
2485 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2487 webService.add( (JMenu) wsmenu.get(i));
\r
2492 this.webService.removeAll();
\r
2493 this.webService.add(this.webServiceNoServices);
\r
2495 // TODO: add in rediscovery function
\r
2496 // TODO: reduce code redundancy.
\r
2497 // TODO: group services by location as well as function.
\r
2500 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2502 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2503 getProperty("LAST_DIRECTORY"));
\r
2505 chooser.setFileView(new JalviewFileView());
\r
2506 chooser.setDialogTitle("Export to Vamsas file");
\r
2507 chooser.setToolTipText("Export");
\r
2509 int value = chooser.showSaveDialog(this);
\r
2511 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2513 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2514 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2515 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2523 public void showTranslation_actionPerformed(ActionEvent e)
\r
2525 int s, sSize = viewport.alignment.getHeight();
\r
2526 SequenceI [] newSeq = new SequenceI[sSize];
\r
2529 StringBuffer protein;
\r
2531 for(s=0; s<sSize; s++)
\r
2533 protein = new StringBuffer();
\r
2534 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2535 resSize = seq.length();
\r
2536 resSize -= resSize%3;
\r
2538 for(res = 0; res < resSize; res+=3)
\r
2540 String codon = seq.substring(res, res+3);
\r
2541 codon = codon.replace('U', 'T');
\r
2542 String aa = ResidueProperties.codonTranslate(codon);
\r
2544 protein.append(viewport.getGapCharacter());
\r
2545 else if(aa.equals("STOP"))
\r
2546 protein.append("X");
\r
2548 protein.append( aa );
\r
2550 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2554 AlignmentI al = new Alignment(newSeq);
\r
2555 al.setDataset(null);
\r
2558 ////////////////////////////////
\r
2559 // Copy annotations across
\r
2560 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2561 = viewport.alignment.getAlignmentAnnotation();
\r
2563 if(annotations!=null)
\r
2565 for (int i = 0; i < annotations.length; i++)
\r
2567 if (annotations[i].label.equals("Quality") ||
\r
2568 annotations[i].label.equals("Conservation") ||
\r
2569 annotations[i].label.equals("Consensus"))
\r
2574 aSize = viewport.alignment.getWidth() / 3;
\r
2575 jalview.datamodel.Annotation[] anots =
\r
2576 new jalview.datamodel.Annotation[aSize];
\r
2578 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2580 if (annotations[i].annotations[a] == null
\r
2581 || annotations[i].annotations[a] == null)
\r
2584 anots[a / 3] = new Annotation(
\r
2585 annotations[i].annotations[a].displayCharacter,
\r
2586 annotations[i].annotations[a].description,
\r
2587 annotations[i].annotations[a].secondaryStructure,
\r
2588 annotations[i].annotations[a].value,
\r
2589 annotations[i].annotations[a].colour);
\r
2592 jalview.datamodel.AlignmentAnnotation aa
\r
2593 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2594 annotations[i].description, anots);
\r
2595 al.addAnnotation(aa);
\r
2599 AlignFrame af = new AlignFrame(al);
\r
2600 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2602 NEW_WINDOW_HEIGHT);
\r
2605 // AlignViewport newViewport = new AlignViewport(al);
\r
2606 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2607 // tabbedPane.add("Protein", ap);
\r
2608 // viewports.add(newViewport);
\r
2609 // alignPanels.add(ap);
\r
2612 /////////////////////////
\r
2614 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2615 // ds.setDataset(true);
\r
2616 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2617 // tabbedPane.add("Dataset", dap);
\r
2618 // viewports.add(ds);
\r
2619 // alignPanels.add(dap);
\r
2620 /////////////////////////
\r
2625 /*public void tabSelected()
\r
2627 int index = tabbedPane.getSelectedIndex();
\r
2628 viewport = (AlignViewport)viewports.elementAt(index);
\r
2629 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2635 * @param String DOCUMENT ME!
\r
2637 public boolean parseFeaturesFile(String file, String type)
\r
2639 boolean featuresFile = false;
\r
2641 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment,
\r
2642 alignPanel.seqPanel.seqCanvas.
\r
2643 getFeatureRenderer().featureColours);
\r
2645 catch(Exception ex)
\r
2647 ex.printStackTrace();
\r
2652 viewport.showSequenceFeatures = true;
\r
2653 showSeqFeatures.setSelected(true);
\r
2654 alignPanel.repaint();
\r
2657 return featuresFile;
\r
2660 public void dragEnter(DropTargetDragEvent evt)
\r
2663 public void dragExit(DropTargetEvent evt)
\r
2666 public void dragOver(DropTargetDragEvent evt)
\r
2669 public void dropActionChanged(DropTargetDragEvent evt)
\r
2672 public void drop(DropTargetDropEvent evt)
\r
2674 Transferable t = evt.getTransferable();
\r
2675 java.util.List files = null;
\r
2679 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2680 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2682 //Works on Windows and MacOSX
\r
2683 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2684 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2686 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2688 // This is used by Unix drag system
\r
2689 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2690 String data = (String) t.getTransferData(uriListFlavor);
\r
2691 files = new java.util.ArrayList(1);
\r
2692 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2695 st.hasMoreTokens(); )
\r
2697 String s = st.nextToken();
\r
2698 if (s.startsWith("#"))
\r
2700 // the line is a comment (as per the RFC 2483)
\r
2704 java.net.URI uri = new java.net.URI(s);
\r
2705 java.io.File file = new java.io.File(uri);
\r
2710 catch (Exception e)
\r
2712 e.printStackTrace();
\r
2714 if (files != null)
\r
2719 for (int i = 0; i < files.size(); i++)
\r
2721 loadJalviewDataFile(files.get(i).toString());
\r
2724 catch (Exception ex)
\r
2726 ex.printStackTrace();
\r
2731 // This method will attempt to load a "dropped" file first by testing
\r
2732 // whether its and Annotation file, then features file. If both are
\r
2733 // false then the user may have dropped an alignment file onto this
\r
2735 public void loadJalviewDataFile(String file)
\r
2738 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
\r
2741 if (!isAnnotation)
\r
2743 boolean isGroupsFile = parseFeaturesFile(file,
\r
2744 AppletFormatAdapter.FILE);
\r
2745 if (!isGroupsFile)
\r
2747 String protocol = "File";
\r
2748 String format = new IdentifyFile().Identify(file, protocol);
\r
2749 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2752 FastaFile ff = new FastaFile();
\r
2753 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2754 c.setContents(new StringSelection(ff.print(sequences)), Desktop.instance);
\r
2756 this.paste(false);
\r
2762 alignPanel.adjustAnnotationHeight();
\r
2765 }catch(Exception ex)
\r
2767 ex.printStackTrace();
\r