2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Softwarechang
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
19 package jalview.gui;
\r
21 import java.beans.*;
\r
26 import java.awt.datatransfer.*;
\r
27 import java.awt.event.*;
\r
28 import java.awt.print.*;
\r
29 import javax.swing.*;
\r
31 import jalview.analysis.*;
\r
32 import jalview.datamodel.*;
\r
33 import jalview.io.*;
\r
34 import jalview.jbgui.*;
\r
35 import jalview.schemes.*;
\r
36 import jalview.ws.*;
\r
37 import java.awt.dnd.*;
\r
44 * @version $Revision$
\r
46 public class AlignFrame
\r
47 extends GAlignFrame implements ClipboardOwner, DropTargetListener
\r
49 /** DOCUMENT ME!! */
\r
50 public static final int NEW_WINDOW_WIDTH = 700;
\r
52 /** DOCUMENT ME!! */
\r
53 public static final int NEW_WINDOW_HEIGHT = 500;
\r
54 AlignmentPanel alignPanel;
\r
55 AlignViewport viewport;
\r
57 Vector viewports = new Vector();
\r
58 Vector alignPanels = new Vector();
\r
60 /** DOCUMENT ME!! */
\r
61 public String currentFileFormat = null;
\r
62 Stack historyList = new Stack();
\r
63 Stack redoList = new Stack();
\r
64 private int treeCount = 0;
\r
68 * Creates a new AlignFrame object.
\r
70 * @param al DOCUMENT ME!
\r
72 public AlignFrame(AlignmentI al)
\r
74 viewport = new AlignViewport(al);
\r
75 viewports.add(viewport);
\r
77 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
\r
79 if(viewport.vconsensus==null)
\r
81 //Out of memory calculating consensus.
\r
82 BLOSUM62Colour.setEnabled(false);
\r
83 PIDColour.setEnabled(false);
\r
84 conservationMenuItem.setEnabled(false);
\r
85 modifyConservation.setEnabled(false);
\r
86 abovePIDThreshold.setEnabled(false);
\r
87 modifyPID.setEnabled(false);
\r
90 alignPanel = new AlignmentPanel(this, viewport);
\r
91 alignPanels.add(alignPanel);
\r
93 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
\r
95 if(sortby.equals("Id"))
\r
96 sortIDMenuItem_actionPerformed(null);
\r
97 else if(sortby.equals("Pairwise Identity"))
\r
98 sortPairwiseMenuItem_actionPerformed(null);
\r
100 // remove(tabbedPane);
\r
101 getContentPane().add(alignPanel, BorderLayout.CENTER);
\r
105 // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
\r
108 /////////////////////////
\r
109 if(al.getDataset()==null)
\r
111 al.setDataset(null);
\r
113 // AlignViewport ds = new AlignViewport(al.getDataset(), true);
\r
114 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
115 // tabbedPane.add("Dataset", dap);
\r
116 // viewports.add(ds);
\r
117 // alignPanels.add(dap);
\r
118 /////////////////////////
\r
121 viewport.addPropertyChangeListener(new PropertyChangeListener()
\r
123 public void propertyChange(PropertyChangeEvent evt)
\r
125 if (evt.getPropertyName().equals("alignment"))
\r
127 alignmentChanged();
\r
133 if (Desktop.desktop != null)
\r
135 addServiceListeners();
\r
136 setGUINucleotide(al.isNucleotide());
\r
140 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
141 private void addServiceListeners()
\r
143 final java.beans.PropertyChangeListener thisListener;
\r
144 // Do this once to get current state
\r
145 BuildWebServiceMenu();
\r
146 Desktop.discoverer.addPropertyChangeListener(
\r
147 thisListener = new java.beans.PropertyChangeListener()
\r
149 public void propertyChange(PropertyChangeEvent evt)
\r
151 // System.out.println("Discoverer property change.");
\r
152 if (evt.getPropertyName().equals("services"))
\r
154 // System.out.println("Rebuilding web service menu");
\r
155 BuildWebServiceMenu();
\r
159 addInternalFrameListener(new javax.swing.event.
\r
160 InternalFrameAdapter()
\r
162 public void internalFrameClosed(
\r
163 javax.swing.event.InternalFrameEvent evt)
\r
165 // System.out.println("deregistering discoverer listener");
\r
166 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
167 closeMenuItem_actionPerformed(null);
\r
174 public void setGUINucleotide(boolean nucleotide)
\r
176 showTranslation.setVisible( nucleotide );
\r
177 //sequenceFeatures.setVisible(!nucleotide );
\r
178 //featureSettings.setVisible( !nucleotide );
\r
179 conservationMenuItem.setVisible( !nucleotide );
\r
180 modifyConservation.setVisible( !nucleotide );
\r
182 //Remember AlignFrame always starts as protein
\r
185 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
191 Added so Castor Mapping file can obtain Jalview Version
\r
193 public String getVersion()
\r
195 return jalview.bin.Cache.getProperty("VERSION");
\r
199 public void fetchSequence_actionPerformed(ActionEvent e)
\r
201 new SequenceFetcher(this);
\r
206 * @param e DOCUMENT ME!
\r
208 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
210 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
215 "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",
\r
220 "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"
\r
221 }, currentFileFormat);
\r
223 chooser.setAcceptAllFileFilterUsed(false);
\r
224 chooser.setFileView(new JalviewFileView());
\r
225 chooser.setDialogTitle("Save Alignment to file");
\r
226 chooser.setToolTipText("Save");
\r
228 int value = chooser.showSaveDialog(this);
\r
230 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
232 currentFileFormat = chooser.getSelectedFormat();
\r
234 if (currentFileFormat == null)
\r
236 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
237 "You must select a file format before saving!",
\r
238 "File format not specified",
\r
239 JOptionPane.WARNING_MESSAGE);
\r
240 value = chooser.showSaveDialog(this);
\r
244 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
245 currentFileFormat);
\r
247 String choice = chooser.getSelectedFile().getPath();
\r
248 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
250 saveAlignment(choice, currentFileFormat);
\r
254 public boolean saveAlignment(String file, String format)
\r
256 if (format.equalsIgnoreCase("Jalview"))
\r
258 String shortName = title;
\r
260 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
262 shortName = shortName.substring(shortName.lastIndexOf(
\r
263 java.io.File.separatorChar) + 1);
\r
266 Jalview2XML.SaveAlignment(this, file, shortName);
\r
268 // USE Jalview2XML to save this file
\r
273 String output = new FormatAdapter().formatSequences(format,
\r
274 viewport.getAlignment().
\r
276 if (output == null)
\r
283 java.io.PrintWriter out = new java.io.PrintWriter(
\r
284 new java.io.FileWriter(file));
\r
290 catch (Exception ex)
\r
292 ex.printStackTrace();
\r
301 * @param e DOCUMENT ME!
\r
303 protected void outputText_actionPerformed(ActionEvent e)
\r
305 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
306 Desktop.addInternalFrame(cap,
\r
307 "Alignment output - " + e.getActionCommand(), 600,
\r
309 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
310 viewport.getAlignment().
\r
317 * @param e DOCUMENT ME!
\r
319 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
321 new HTMLOutput(viewport,
\r
322 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
323 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
326 public void createImageMap(File file, String image)
\r
328 alignPanel.makePNGImageMap(file, image);
\r
334 * @param e DOCUMENT ME!
\r
336 public void createPNG(File f)
\r
338 alignPanel.makePNG(f);
\r
344 * @param e DOCUMENT ME!
\r
346 public void createEPS(File f)
\r
348 alignPanel.makeEPS(f);
\r
354 * @param e DOCUMENT ME!
\r
356 public void printMenuItem_actionPerformed(ActionEvent e)
\r
358 //Putting in a thread avoids Swing painting problems
\r
359 PrintThread thread = new PrintThread();
\r
363 public void associatedData_actionPerformed(ActionEvent e)
\r
365 // Pick the tree file
\r
366 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
368 "LAST_DIRECTORY"));
\r
369 chooser.setFileView(new JalviewFileView());
\r
370 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
371 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
373 int value = chooser.showOpenDialog(null);
\r
375 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
377 String choice = chooser.getSelectedFile().getPath();
\r
378 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
379 loadJalviewDataFile(choice);
\r
387 * @param e DOCUMENT ME!
\r
389 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
393 PaintRefresher.components.remove(viewport.alignment);
\r
394 this.setClosed(true);
\r
396 catch (Exception ex)
\r
404 void updateEditMenuBar()
\r
406 if (historyList.size() > 0)
\r
408 undoMenuItem.setEnabled(true);
\r
410 HistoryItem hi = (HistoryItem) historyList.peek();
\r
411 undoMenuItem.setText("Undo " + hi.getDescription());
\r
415 undoMenuItem.setEnabled(false);
\r
416 undoMenuItem.setText("Undo");
\r
419 if (redoList.size() > 0)
\r
421 redoMenuItem.setEnabled(true);
\r
423 HistoryItem hi = (HistoryItem) redoList.peek();
\r
424 redoMenuItem.setText("Redo " + hi.getDescription());
\r
428 redoMenuItem.setEnabled(false);
\r
429 redoMenuItem.setText("Redo");
\r
436 * @param hi DOCUMENT ME!
\r
438 public void addHistoryItem(HistoryItem hi)
\r
440 historyList.push(hi);
\r
441 updateEditMenuBar();
\r
447 * @param e DOCUMENT ME!
\r
449 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
451 HistoryItem hi = (HistoryItem) historyList.pop();
\r
452 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
453 HistoryItem.HIDE));
\r
454 restoreHistoryItem(hi);
\r
455 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
461 * @param e DOCUMENT ME!
\r
463 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
465 HistoryItem hi = (HistoryItem) redoList.pop();
\r
466 restoreHistoryItem(hi);
\r
467 updateEditMenuBar();
\r
468 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
471 // used by undo and redo
\r
472 void restoreHistoryItem(HistoryItem hi)
\r
477 updateEditMenuBar();
\r
479 viewport.firePropertyChange("alignment", null,
\r
480 viewport.getAlignment().getSequences());
\r
486 * @param up DOCUMENT ME!
\r
488 public void moveSelectedSequences(boolean up)
\r
490 SequenceGroup sg = viewport.getSelectionGroup();
\r
499 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
501 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
503 if (!sg.sequences.contains(seq))
\r
508 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
510 if (sg.sequences.contains(temp))
\r
515 viewport.alignment.getSequences().setElementAt(temp, i);
\r
516 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
521 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
523 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
525 if (!sg.sequences.contains(seq))
\r
530 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
532 if (sg.sequences.contains(temp))
\r
537 viewport.alignment.getSequences().setElementAt(temp, i);
\r
538 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
542 alignPanel.repaint();
\r
545 public void lostOwnership(Clipboard clipboard, Transferable contents)
\r
547 Desktop.jalviewClipboard = null;
\r
554 * @param e DOCUMENT ME!
\r
556 protected void copy_actionPerformed(ActionEvent e)
\r
558 if (viewport.getSelectionGroup() == null)
\r
563 SequenceGroup sg = viewport.getSelectionGroup();
\r
565 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
567 Hashtable orderedSeqs = new Hashtable();
\r
568 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
570 for (int i = 0; i < sg.getSize(); i++)
\r
572 SequenceI seq = sg.getSequenceAt(i);
\r
573 int index = viewport.alignment.findIndex(seq);
\r
574 orderedSeqs.put(index + "", seq);
\r
577 int index = 0, startRes, endRes;
\r
580 for (int i = 0; i < sg.getSize(); i++)
\r
582 SequenceI seq = null;
\r
584 while (seq == null)
\r
586 if (orderedSeqs.containsKey(index + ""))
\r
588 seq = (SequenceI) orderedSeqs.get(index + "");
\r
600 //Returns residue following index if gap
\r
601 startRes = seq.findPosition(sg.getStartRes());
\r
604 //Need to find the residue preceeding index if gap
\r
607 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
609 ch = seq.getCharAt(j);
\r
610 if (!jalview.util.Comparison.isGap( (ch)))
\r
618 endRes += seq.getStart() - 1;
\r
621 seqs[i] = new Sequence(seq.getName(),
\r
622 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
625 seqs[i].setDescription(seq.getDescription());
\r
626 seqs[i].setDBRef(seq.getDBRef());
\r
627 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
628 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
632 FastaFile ff = new FastaFile();
\r
633 ff.addJVSuffix( viewport.showJVSuffix );
\r
634 c.setContents(new StringSelection( ff.print(seqs)), this);
\r
635 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
641 * @param e DOCUMENT ME!
\r
643 protected void pasteNew_actionPerformed(ActionEvent e)
\r
651 * @param e DOCUMENT ME!
\r
653 protected void pasteThis_actionPerformed(ActionEvent e)
\r
655 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
656 HistoryItem.PASTE));
\r
663 * @param newAlignment DOCUMENT ME!
\r
665 void paste(boolean newAlignment)
\r
669 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
670 Transferable contents = c.getContents(this);
\r
672 if (contents == null)
\r
677 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
681 String format = new IdentifyFile().Identify(str, "Paste");
\r
682 SequenceI[] sequences;
\r
684 if(Desktop.jalviewClipboard!=null)
\r
686 // The clipboard was filled from within Jalview, we must use the sequences
\r
687 // And dataset from the copied alignment
\r
688 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
692 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
698 Alignment alignment = new Alignment(sequences);
\r
700 if(Desktop.jalviewClipboard!=null)
\r
701 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
703 alignment.setDataset( null );
\r
706 AlignFrame af = new AlignFrame(alignment);
\r
707 String newtitle = new String("Copied sequences");
\r
709 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
710 FeatureRenderer fr = af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
\r
711 fr.featureColours = alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureColours;
\r
713 if (title.startsWith("Copied sequences"))
\r
719 newtitle = newtitle.concat("- from " + title);
\r
722 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
723 NEW_WINDOW_HEIGHT);
\r
728 for (int i = 0; i < sequences.length; i++)
\r
730 Sequence newseq = new Sequence(sequences[i].getName(),
\r
731 sequences[i].getSequence(), sequences[i].getStart(),
\r
732 sequences[i].getEnd());
\r
733 viewport.alignment.addSequence(newseq);
\r
734 if(sequences[i].getDatasetSequence()==null)
\r
736 ////////////////////////////
\r
737 //Datset needs extension;
\r
738 /////////////////////////////
\r
739 Sequence ds = new Sequence(sequences[i].getName(),
\r
740 AlignSeq.extractGaps("-. ", sequences[i].getSequence()),
\r
741 sequences[i].getStart(),
\r
742 sequences[i].getEnd());
\r
743 newseq.setDatasetSequence(ds);
\r
744 viewport.alignment.getDataset().addSequence(ds);
\r
748 newseq.setDatasetSequence(sequences[i].getDatasetSequence());
\r
749 if(sequences[i].getDatasetSequence().getAnnotation()!=null)
\r
751 for(int aa=0; aa<sequences[i].getDatasetSequence().getAnnotation().length; aa++)
\r
753 viewport.alignment.addAnnotation(sequences[i].getDatasetSequence().getAnnotation()[aa]);
\r
758 viewport.setEndSeq(viewport.alignment.getHeight());
\r
759 viewport.alignment.getWidth();
\r
760 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
763 catch (Exception ex)
\r
765 ex.printStackTrace();
\r
766 System.out.println("Exception whilst pasting: "+ex);
\r
767 // could be anything being pasted in here
\r
776 * @param e DOCUMENT ME!
\r
778 protected void cut_actionPerformed(ActionEvent e)
\r
780 copy_actionPerformed(null);
\r
781 delete_actionPerformed(null);
\r
787 * @param e DOCUMENT ME!
\r
789 protected void delete_actionPerformed(ActionEvent e)
\r
792 if (viewport.getSelectionGroup() == null)
\r
798 SequenceGroup sg = viewport.getSelectionGroup();
\r
802 //Jalview no longer allows deletion of residues.
\r
803 //Check here whether any residues are in selection area
\r
804 if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
806 for (int i = 0; i < sg.sequences.size(); i++)
\r
808 SequenceI seq = sg.getSequenceAt(i);
\r
809 int j = sg.getStartRes();
\r
812 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
814 JOptionPane.showInternalMessageDialog(
\r
815 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
816 + "Try hiding columns instead.",
\r
817 "Deletion of residues not permitted",
\r
818 JOptionPane.WARNING_MESSAGE);
\r
823 }while(j<=sg.getEndRes());
\r
828 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
829 HistoryItem.HIDE));
\r
832 for (int i = 0; i < sg.sequences.size(); i++)
\r
834 SequenceI seq = sg.getSequenceAt(i);
\r
835 int index = viewport.getAlignment().findIndex(seq);
\r
837 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
839 // If the cut affects all sequences, remove highlighted columns
\r
840 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
842 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
843 sg.getEndRes() + 1);
\r
846 if (seq.getSequence().length() < 1)
\r
848 viewport.getAlignment().deleteSequence(seq);
\r
852 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
856 viewport.setSelectionGroup(null);
\r
857 viewport.alignment.deleteGroup(sg);
\r
859 viewport.firePropertyChange("alignment", null,
\r
860 viewport.getAlignment().getSequences());
\r
864 if (viewport.getAlignment().getHeight() < 1)
\r
868 this.setClosed(true);
\r
870 catch (Exception ex)
\r
879 * @param e DOCUMENT ME!
\r
881 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
883 viewport.alignment.deleteAllGroups();
\r
884 viewport.setSelectionGroup(null);
\r
885 alignPanel.repaint();
\r
891 * @param e DOCUMENT ME!
\r
893 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
895 SequenceGroup sg = new SequenceGroup();
\r
897 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
900 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
903 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
904 viewport.setSelectionGroup(sg);
\r
905 PaintRefresher.Refresh(null, viewport.alignment);
\r
911 * @param e DOCUMENT ME!
\r
913 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
915 viewport.setSelectionGroup(null);
\r
916 viewport.getColumnSelection().clear();
\r
917 viewport.setSelectionGroup(null);
\r
918 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
919 alignPanel.idPanel.idCanvas.searchResults = null;
\r
920 PaintRefresher.Refresh(null, viewport.alignment);
\r
926 * @param e DOCUMENT ME!
\r
928 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
930 SequenceGroup sg = viewport.getSelectionGroup();
\r
934 selectAllSequenceMenuItem_actionPerformed(null);
\r
939 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
942 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
945 PaintRefresher.Refresh(null, viewport.alignment);
\r
951 * @param e DOCUMENT ME!
\r
953 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
955 ColumnSelection colSel = viewport.getColumnSelection();
\r
957 if (colSel.size() > 0)
\r
959 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
960 HistoryItem.HIDE));
\r
962 int min = colSel.getMin();
\r
963 viewport.getAlignment().trimLeft(min);
\r
964 colSel.compensateForEdit(0, min);
\r
966 if (viewport.getSelectionGroup() != null)
\r
968 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
971 Vector groups = viewport.alignment.getGroups();
\r
973 for (int i = 0; i < groups.size(); i++)
\r
975 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
977 if (!sg.adjustForRemoveLeft(min))
\r
979 viewport.alignment.deleteGroup(sg);
\r
983 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
990 * @param e DOCUMENT ME!
\r
992 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
994 ColumnSelection colSel = viewport.getColumnSelection();
\r
996 if (colSel.size() > 0)
\r
998 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
999 HistoryItem.HIDE));
\r
1001 int max = colSel.getMax();
\r
1002 viewport.getAlignment().trimRight(max);
\r
1004 if (viewport.getSelectionGroup() != null)
\r
1006 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1009 Vector groups = viewport.alignment.getGroups();
\r
1011 for (int i = 0; i < groups.size(); i++)
\r
1013 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1015 if (!sg.adjustForRemoveRight(max))
\r
1017 viewport.alignment.deleteGroup(sg);
\r
1021 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1028 * @param e DOCUMENT ME!
\r
1030 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1032 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1033 viewport.alignment, HistoryItem.HIDE));
\r
1035 //This is to maintain viewport position on first residue
\r
1036 //of first sequence
\r
1037 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1038 int startRes = seq.findPosition(viewport.startRes);
\r
1040 viewport.getAlignment().removeGaps();
\r
1042 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1044 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1050 * @param e DOCUMENT ME!
\r
1052 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1054 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1055 HistoryItem.HIDE));
\r
1057 //This is to maintain viewport position on first residue
\r
1058 //of first sequence
\r
1059 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1060 int startRes = seq.findPosition(viewport.startRes);
\r
1063 SequenceI current;
\r
1066 Vector seqs = null;
\r
1069 int end = viewport.alignment.getWidth();
\r
1071 if (viewport.getSelectionGroup() != null
\r
1072 && viewport.getSelectionGroup().sequences != null
\r
1073 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1075 seqs = viewport.getSelectionGroup().sequences;
\r
1076 start = viewport.getSelectionGroup().getStartRes();
\r
1077 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1081 seqs = viewport.alignment.getSequences();
\r
1084 for (int i = 0; i < seqs.size(); i++)
\r
1086 current = (SequenceI) seqs.elementAt(i);
\r
1087 jSize = current.getLength();
\r
1089 // Removing a range is much quicker than removing gaps
\r
1090 // one by one for long sequences
\r
1092 int rangeStart=-1, rangeEnd=-1;
\r
1096 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1098 if(rangeStart==-1)
\r
1113 current.deleteChars(rangeStart, rangeEnd);
\r
1114 j-=rangeEnd-rangeStart;
\r
1115 jSize-=rangeEnd-rangeStart;
\r
1123 while (j < end && j < jSize);
\r
1126 current.deleteChars(rangeStart, rangeEnd);
\r
1130 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1132 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1135 public void alignmentChanged()
\r
1137 if(viewport.vconsensus!=null)
\r
1139 viewport.updateConsensus();
\r
1140 viewport.updateConservation();
\r
1142 resetAllColourSchemes();
\r
1143 if(alignPanel.overviewPanel!=null)
\r
1144 alignPanel.overviewPanel.updateOverviewImage();
\r
1146 viewport.alignment.adjustSequenceAnnotations();
\r
1148 alignPanel.repaint();
\r
1151 void resetAllColourSchemes()
\r
1153 ColourSchemeI cs = viewport.globalColourScheme;
\r
1156 if (cs instanceof ClustalxColourScheme)
\r
1158 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1159 resetClustalX(viewport.alignment.getSequences(),
\r
1160 viewport.alignment.getWidth());
\r
1163 cs.setConsensus(viewport.vconsensus);
\r
1164 if (cs.conservationApplied())
\r
1166 Alignment al = (Alignment) viewport.alignment;
\r
1167 Conservation c = new Conservation("All",
\r
1168 ResidueProperties.propHash, 3,
\r
1169 al.getSequences(), 0,
\r
1170 al.getWidth() - 1);
\r
1172 c.verdict(false, viewport.ConsPercGaps);
\r
1174 cs.setConservation(c);
\r
1178 int s, sSize = viewport.alignment.getGroups().size();
\r
1179 for(s=0; s<sSize; s++)
\r
1181 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1182 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1184 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1186 sg.recalcConservation();
\r
1193 * @param e DOCUMENT ME!
\r
1195 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1197 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1198 HistoryItem.HIDE));
\r
1199 if (viewport.getAlignment().padGaps())
\r
1200 alignmentChanged();
\r
1206 * @param e DOCUMENT ME!
\r
1208 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1210 JInternalFrame frame = new JInternalFrame();
\r
1211 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1212 frame.setContentPane(finder);
\r
1213 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1214 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1220 * @param e DOCUMENT ME!
\r
1222 public void font_actionPerformed(ActionEvent e)
\r
1224 new FontChooser(alignPanel);
\r
1227 public void smoothFont_actionPerformed(ActionEvent e)
\r
1229 viewport.antiAlias = smoothFont.isSelected();
\r
1230 alignPanel.annotationPanel.image = null;
\r
1231 alignPanel.repaint();
\r
1238 * @param e DOCUMENT ME!
\r
1240 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1242 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1244 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1245 alignPanel.repaint();
\r
1252 * @param e DOCUMENT ME!
\r
1254 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1256 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1257 alignPanel.repaint();
\r
1263 * @param e DOCUMENT ME!
\r
1265 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1267 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1268 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1269 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1270 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1271 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1272 alignPanel.repaint();
\r
1278 * @param e DOCUMENT ME!
\r
1280 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1282 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1283 alignPanel.repaint();
\r
1289 * @param e DOCUMENT ME!
\r
1291 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1293 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1294 alignPanel.repaint();
\r
1300 * @param e DOCUMENT ME!
\r
1302 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1304 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1305 alignPanel.repaint();
\r
1311 * @param e DOCUMENT ME!
\r
1313 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1315 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1316 alignPanel.repaint();
\r
1322 * @param e DOCUMENT ME!
\r
1324 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1326 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1327 alignPanel.repaint();
\r
1333 * @param e DOCUMENT ME!
\r
1335 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1337 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1338 alignPanel.repaint();
\r
1341 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1343 if (!viewport.alignment.isNucleotide())
\r
1345 new SequenceFeatureFetcher(viewport.
\r
1348 viewport.setShowSequenceFeatures(true);
\r
1349 showSeqFeatures.setSelected(true);
\r
1354 public void featureSettings_actionPerformed(ActionEvent e)
\r
1356 new FeatureSettings(viewport, alignPanel);
\r
1362 * @param evt DOCUMENT ME!
\r
1364 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1366 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1367 alignPanel.repaint();
\r
1368 if (alignPanel.getOverviewPanel() != null)
\r
1370 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1377 * @param e DOCUMENT ME!
\r
1379 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1381 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1382 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1388 * @param e DOCUMENT ME!
\r
1390 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1392 if (alignPanel.overviewPanel != null)
\r
1397 JInternalFrame frame = new JInternalFrame();
\r
1398 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1399 frame.setContentPane(overview);
\r
1400 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1401 frame.getWidth(), frame.getHeight());
\r
1403 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1404 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1406 public void internalFrameClosed(
\r
1407 javax.swing.event.InternalFrameEvent evt)
\r
1409 alignPanel.setOverviewPanel(null);
\r
1414 alignPanel.setOverviewPanel(overview);
\r
1420 * @param e DOCUMENT ME!
\r
1422 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1424 changeColour(null);
\r
1430 * @param e DOCUMENT ME!
\r
1432 public void clustalColour_actionPerformed(ActionEvent e)
\r
1434 changeColour(new ClustalxColourScheme(
\r
1435 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1441 * @param e DOCUMENT ME!
\r
1443 public void zappoColour_actionPerformed(ActionEvent e)
\r
1445 changeColour(new ZappoColourScheme());
\r
1451 * @param e DOCUMENT ME!
\r
1453 public void taylorColour_actionPerformed(ActionEvent e)
\r
1455 changeColour(new TaylorColourScheme());
\r
1461 * @param e DOCUMENT ME!
\r
1463 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1465 changeColour(new HydrophobicColourScheme());
\r
1471 * @param e DOCUMENT ME!
\r
1473 public void helixColour_actionPerformed(ActionEvent e)
\r
1475 changeColour(new HelixColourScheme());
\r
1481 * @param e DOCUMENT ME!
\r
1483 public void strandColour_actionPerformed(ActionEvent e)
\r
1485 changeColour(new StrandColourScheme());
\r
1491 * @param e DOCUMENT ME!
\r
1493 public void turnColour_actionPerformed(ActionEvent e)
\r
1495 changeColour(new TurnColourScheme());
\r
1501 * @param e DOCUMENT ME!
\r
1503 public void buriedColour_actionPerformed(ActionEvent e)
\r
1505 changeColour(new BuriedColourScheme());
\r
1511 * @param e DOCUMENT ME!
\r
1513 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1515 changeColour(new NucleotideColourScheme());
\r
1518 public void annotationColour_actionPerformed(ActionEvent e)
\r
1520 new AnnotationColourChooser(viewport, alignPanel);
\r
1527 * @param e DOCUMENT ME!
\r
1529 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1531 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1537 * @param cs DOCUMENT ME!
\r
1539 void changeColour(ColourSchemeI cs)
\r
1541 int threshold = 0;
\r
1545 if (viewport.getAbovePIDThreshold())
\r
1547 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1550 cs.setThreshold(threshold,
\r
1551 viewport.getIgnoreGapsConsensus());
\r
1553 viewport.setGlobalColourScheme(cs);
\r
1557 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1560 if (viewport.getConservationSelected())
\r
1563 Alignment al = (Alignment) viewport.alignment;
\r
1564 Conservation c = new Conservation("All",
\r
1565 ResidueProperties.propHash, 3,
\r
1566 al.getSequences(), 0,
\r
1567 al.getWidth() - 1);
\r
1570 c.verdict(false, viewport.ConsPercGaps);
\r
1572 cs.setConservation(c);
\r
1574 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1579 cs.setConservation(null);
\r
1582 cs.setConsensus(viewport.vconsensus);
\r
1585 viewport.setGlobalColourScheme(cs);
\r
1587 if (viewport.getColourAppliesToAllGroups())
\r
1589 Vector groups = viewport.alignment.getGroups();
\r
1591 for (int i = 0; i < groups.size(); i++)
\r
1593 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1601 if (cs instanceof ClustalxColourScheme)
\r
1603 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1605 else if (cs instanceof UserColourScheme)
\r
1607 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1613 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1615 catch (Exception ex)
\r
1620 if (viewport.getAbovePIDThreshold()
\r
1621 || cs instanceof PIDColourScheme
\r
1622 || cs instanceof Blosum62ColourScheme)
\r
1624 sg.cs.setThreshold(threshold,
\r
1625 viewport.getIgnoreGapsConsensus());
\r
1627 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1631 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1634 if (viewport.getConservationSelected())
\r
1636 Conservation c = new Conservation("Group",
\r
1637 ResidueProperties.propHash, 3,
\r
1639 viewport.alignment.getWidth() - 1);
\r
1641 c.verdict(false, viewport.ConsPercGaps);
\r
1642 sg.cs.setConservation(c);
\r
1645 sg.cs.setConservation(null);
\r
1649 if (alignPanel.getOverviewPanel() != null)
\r
1651 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1654 alignPanel.repaint();
\r
1660 * @param e DOCUMENT ME!
\r
1662 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1664 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1666 SliderPanel.setPIDSliderSource(alignPanel,
\r
1667 viewport.getGlobalColourScheme(),
\r
1669 SliderPanel.showPIDSlider();
\r
1676 * @param e DOCUMENT ME!
\r
1678 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1680 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1682 SliderPanel.setConservationSlider(alignPanel,
\r
1683 viewport.globalColourScheme,
\r
1685 SliderPanel.showConservationSlider();
\r
1692 * @param e DOCUMENT ME!
\r
1694 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1696 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1698 viewport.setAbovePIDThreshold(false);
\r
1699 abovePIDThreshold.setSelected(false);
\r
1701 changeColour(viewport.getGlobalColourScheme());
\r
1703 modifyConservation_actionPerformed(null);
\r
1709 * @param e DOCUMENT ME!
\r
1711 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1713 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1715 conservationMenuItem.setSelected(false);
\r
1716 viewport.setConservationSelected(false);
\r
1718 changeColour(viewport.getGlobalColourScheme());
\r
1720 modifyPID_actionPerformed(null);
\r
1726 * @param e DOCUMENT ME!
\r
1728 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1730 if (e.getActionCommand().equals("User Defined..."))
\r
1732 new UserDefinedColours(alignPanel, null);
\r
1736 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1737 getUserColourSchemes().get(e.getActionCommand());
\r
1739 changeColour(udc);
\r
1743 public void updateUserColourMenu()
\r
1746 Component[] menuItems = colourMenu.getMenuComponents();
\r
1747 int i, iSize = menuItems.length;
\r
1748 for (i = 0; i < iSize; i++)
\r
1750 if (menuItems[i].getName() != null &&
\r
1751 menuItems[i].getName().equals("USER_DEFINED"))
\r
1753 colourMenu.remove(menuItems[i]);
\r
1757 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1759 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1760 getUserColourSchemes().keys();
\r
1762 while (userColours.hasMoreElements())
\r
1764 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1765 nextElement().toString());
\r
1766 radioItem.setName("USER_DEFINED");
\r
1767 radioItem.addMouseListener(new MouseAdapter()
\r
1769 public void mousePressed(MouseEvent evt)
\r
1771 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1773 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1775 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1776 "Remove from default list?",
\r
1777 "Remove user defined colour",
\r
1778 JOptionPane.YES_NO_OPTION);
\r
1779 if(option == JOptionPane.YES_OPTION)
\r
1781 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1782 colourMenu.remove(radioItem);
\r
1785 radioItem.addActionListener(new ActionListener()
\r
1787 public void actionPerformed(ActionEvent evt)
\r
1789 userDefinedColour_actionPerformed(evt);
\r
1795 radioItem.addActionListener(new ActionListener()
\r
1797 public void actionPerformed(ActionEvent evt)
\r
1799 userDefinedColour_actionPerformed(evt);
\r
1803 colourMenu.insert(radioItem, 15);
\r
1804 colours.add(radioItem);
\r
1812 * @param e DOCUMENT ME!
\r
1814 public void PIDColour_actionPerformed(ActionEvent e)
\r
1816 changeColour(new PIDColourScheme());
\r
1822 * @param e DOCUMENT ME!
\r
1824 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1826 changeColour(new Blosum62ColourScheme());
\r
1832 * @param e DOCUMENT ME!
\r
1834 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1836 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1837 HistoryItem.SORT));
\r
1838 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1839 viewport.getAlignment().getSequenceAt(0));
\r
1840 alignPanel.repaint();
\r
1846 * @param e DOCUMENT ME!
\r
1848 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1850 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1851 HistoryItem.SORT));
\r
1852 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1853 alignPanel.repaint();
\r
1859 * @param e DOCUMENT ME!
\r
1861 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1863 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1864 HistoryItem.SORT));
\r
1866 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1867 alignPanel.repaint();
\r
1873 * @param e DOCUMENT ME!
\r
1875 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1877 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1878 JInternalFrame frame = new JInternalFrame();
\r
1879 frame.setContentPane(sp);
\r
1880 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1887 * @param e DOCUMENT ME!
\r
1889 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1891 if ( (viewport.getSelectionGroup() == null) ||
\r
1892 (viewport.getSelectionGroup().getSize() < 2))
\r
1894 JOptionPane.showInternalMessageDialog(this,
\r
1895 "You must select at least 2 sequences.",
\r
1896 "Invalid Selection",
\r
1897 JOptionPane.WARNING_MESSAGE);
\r
1901 JInternalFrame frame = new JInternalFrame();
\r
1902 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1903 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1910 * @param e DOCUMENT ME!
\r
1912 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1914 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1915 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1916 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1917 (viewport.getAlignment().getHeight() < 4))
\r
1919 JOptionPane.showInternalMessageDialog(this,
\r
1920 "Principal component analysis must take\n" +
\r
1921 "at least 4 input sequences.",
\r
1922 "Sequence selection insufficient",
\r
1923 JOptionPane.WARNING_MESSAGE);
\r
1928 new PCAPanel(viewport);
\r
1934 * @param e DOCUMENT ME!
\r
1936 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1938 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1944 * @param e DOCUMENT ME!
\r
1946 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1948 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1954 * @param e DOCUMENT ME!
\r
1956 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1958 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1964 * @param e DOCUMENT ME!
\r
1966 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1968 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1974 * @param type DOCUMENT ME!
\r
1975 * @param pwType DOCUMENT ME!
\r
1976 * @param title DOCUMENT ME!
\r
1978 void NewTreePanel(String type, String pwType, String title)
\r
1980 final TreePanel tp;
\r
1982 if ( (viewport.getSelectionGroup() != null) &&
\r
1983 (viewport.getSelectionGroup().getSize() > 3))
\r
1986 SequenceGroup sg = viewport.getSelectionGroup();
\r
1988 /* Decide if the selection is a column region */
\r
1989 while (s < sg.sequences.size())
\r
1991 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
1994 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1995 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
1996 "Try using the Pad function in the edit menu,\n" +
\r
1997 "or one of the multiple sequence alignment web services.",
\r
1998 "Sequences in selection are not aligned",
\r
1999 JOptionPane.WARNING_MESSAGE);
\r
2005 title = title + " on region";
\r
2006 tp = new TreePanel(viewport,
\r
2007 viewport.getSelectionGroup().sequences, type, pwType,
\r
2008 sg.getStartRes(), sg.getEndRes());
\r
2012 //are the sequences aligned?
\r
2013 if (!viewport.alignment.isAligned())
\r
2015 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2016 "The sequences must be aligned before creating a tree.\n" +
\r
2017 "Try using the Pad function in the edit menu,\n" +
\r
2018 "or one of the multiple sequence alignment web services.",
\r
2019 "Sequences not aligned",
\r
2020 JOptionPane.WARNING_MESSAGE);
\r
2025 tp = new TreePanel(viewport,
\r
2026 viewport.getAlignment().getSequences(), type, pwType,
\r
2028 viewport.alignment.getWidth());
\r
2031 addTreeMenuItem(tp, title);
\r
2032 viewport.setCurrentTree(tp.getTree());
\r
2034 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2040 * @param title DOCUMENT ME!
\r
2041 * @param order DOCUMENT ME!
\r
2043 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2045 final JMenuItem item = new JMenuItem("by " + title);
\r
2047 item.addActionListener(new java.awt.event.ActionListener()
\r
2049 public void actionPerformed(ActionEvent e)
\r
2051 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2052 HistoryItem.SORT));
\r
2054 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2055 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2056 alignPanel.repaint();
\r
2062 * Maintain the Order by->Displayed Tree menu.
\r
2063 * Creates a new menu item for a TreePanel with an appropriate
\r
2064 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2065 * to remove the menu item when the treePanel is closed, and adjust
\r
2066 * the tree leaf to sequence mapping when the alignment is modified.
\r
2067 * @param treePanel Displayed tree window.
\r
2068 * @param title SortBy menu item title.
\r
2070 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2072 final JMenuItem item = new JMenuItem(title);
\r
2076 if (treeCount == 1)
\r
2078 sort.add(sortByTreeMenu);
\r
2081 sortByTreeMenu.add(item);
\r
2082 item.addActionListener(new java.awt.event.ActionListener()
\r
2084 public void actionPerformed(ActionEvent e)
\r
2086 addHistoryItem(new HistoryItem("Tree Sort",
\r
2087 viewport.alignment, HistoryItem.SORT));
\r
2088 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2089 treePanel.getTree());
\r
2090 alignPanel.repaint();
\r
2094 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2095 InternalFrameAdapter()
\r
2097 public void internalFrameClosed(
\r
2098 javax.swing.event.InternalFrameEvent evt)
\r
2101 sortByTreeMenu.remove(item);
\r
2103 if (treeCount == 0)
\r
2105 sort.remove(sortByTreeMenu);
\r
2113 * Work out whether the whole set of sequences
\r
2114 * or just the selected set will be submitted for multiple alignment.
\r
2117 private SequenceI[] gatherSequencesForAlignment()
\r
2119 // Now, check we have enough sequences
\r
2120 SequenceI[] msa = null;
\r
2122 if ( (viewport.getSelectionGroup() != null) &&
\r
2123 (viewport.getSelectionGroup().getSize() > 1))
\r
2125 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2126 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2128 msa = new SequenceI[sz = seqs.getSize()];
\r
2130 for (int i = 0; i < sz; i++)
\r
2132 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2137 Vector seqs = viewport.getAlignment().getSequences();
\r
2139 if (seqs.size() > 1)
\r
2141 msa = new SequenceI[seqs.size()];
\r
2143 for (int i = 0; i < seqs.size(); i++)
\r
2145 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2153 * Decides what is submitted to a secondary structure prediction service,
\r
2154 * the currently selected sequence, or the currently selected alignment
\r
2155 * (where the first sequence in the set is the one that the prediction
\r
2158 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2160 SequenceI seq = null;
\r
2161 SequenceI[] msa = null;
\r
2163 if ( (viewport.getSelectionGroup() != null) &&
\r
2164 (viewport.getSelectionGroup().getSize() > 0))
\r
2166 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2167 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2169 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2171 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2176 msa = new SequenceI[sz = seqs.getSize()];
\r
2178 for (int i = 0; i < sz; i++)
\r
2180 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2186 Vector seqs = viewport.getAlignment().getSequences();
\r
2188 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2190 seq = (SequenceI) seqs.elementAt(0);
\r
2194 msa = new SequenceI[seqs.size()];
\r
2196 for (int i = 0; i < seqs.size(); i++)
\r
2198 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2210 return new SequenceI[]
\r
2220 * @param e DOCUMENT ME!
\r
2222 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2224 // Pick the tree file
\r
2225 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2227 "LAST_DIRECTORY"));
\r
2228 chooser.setFileView(new JalviewFileView());
\r
2229 chooser.setDialogTitle("Select a newick-like tree file");
\r
2230 chooser.setToolTipText("Load a tree file");
\r
2232 int value = chooser.showOpenDialog(null);
\r
2234 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2236 String choice = chooser.getSelectedFile().getPath();
\r
2237 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2241 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2243 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2245 catch (Exception ex)
\r
2247 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2248 "Problem reading tree file",
\r
2250 JOptionPane.WARNING_MESSAGE);
\r
2251 ex.printStackTrace();
\r
2257 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2259 return ShowNewickTree(nf,title,600,500,4,5);
\r
2264 * @param nf DOCUMENT ME!
\r
2265 * @param title DOCUMENT ME!
\r
2267 * @return DOCUMENT ME!
\r
2269 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2271 TreePanel tp = null;
\r
2277 if (nf.getTree() != null)
\r
2279 tp = new TreePanel(viewport,
\r
2280 viewport.getAlignment().getSequences(), nf,
\r
2287 tp.setLocation(x,y);
\r
2290 Desktop.addInternalFrame(tp, title, w, h);
\r
2291 addTreeMenuItem(tp, title);
\r
2294 catch (Exception ex)
\r
2296 ex.printStackTrace();
\r
2307 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2308 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2309 printJob.setPrintable(alignPanel, pf);
\r
2311 if (printJob.printDialog())
\r
2317 catch (Exception PrintException)
\r
2319 PrintException.printStackTrace();
\r
2326 * Generates menu items and listener event actions for web service clients
\r
2329 public void BuildWebServiceMenu()
\r
2331 if ( (Discoverer.services != null)
\r
2332 && (Discoverer.services.size() > 0))
\r
2334 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2335 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2336 Vector wsmenu = new Vector();
\r
2337 if (msaws != null)
\r
2339 // Add any Multiple Sequence Alignment Services
\r
2340 final JMenu msawsmenu = new JMenu("Alignment");
\r
2341 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2343 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2345 final JMenuItem method = new JMenuItem(sh.getName());
\r
2346 method.addActionListener(new ActionListener()
\r
2348 public void actionPerformed(ActionEvent e)
\r
2350 SequenceI[] msa = gatherSequencesForAlignment();
\r
2351 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2352 false, true, viewport.getAlignment().getDataset());
\r
2357 msawsmenu.add(method);
\r
2358 // Deal with services that we know accept partial alignments.
\r
2359 if (sh.getName().indexOf("lustal") > -1)
\r
2361 // We know that ClustalWS can accept partial alignments for refinement.
\r
2362 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2363 methodR.addActionListener(new ActionListener()
\r
2365 public void actionPerformed(ActionEvent e)
\r
2367 SequenceI[] msa = gatherSequencesForAlignment();
\r
2368 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2369 true, true, viewport.getAlignment().getDataset());
\r
2374 msawsmenu.add(methodR);
\r
2378 wsmenu.add(msawsmenu);
\r
2380 if (secstrpr != null)
\r
2382 // Add any secondary structure prediction services
\r
2383 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2384 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2386 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2388 final JMenuItem method = new JMenuItem(sh.getName());
\r
2389 method.addActionListener(new ActionListener()
\r
2391 public void actionPerformed(ActionEvent e)
\r
2393 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2394 if (msa.length == 1)
\r
2396 // Single Sequence prediction
\r
2397 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2401 if (msa.length > 1)
\r
2403 // Single Sequence prediction
\r
2404 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2410 secstrmenu.add(method);
\r
2412 wsmenu.add(secstrmenu);
\r
2414 this.webService.removeAll();
\r
2415 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2417 webService.add( (JMenu) wsmenu.get(i));
\r
2422 this.webService.removeAll();
\r
2423 this.webService.add(this.webServiceNoServices);
\r
2425 // TODO: add in rediscovery function
\r
2426 // TODO: reduce code redundancy.
\r
2427 // TODO: group services by location as well as function.
\r
2430 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2432 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2433 getProperty("LAST_DIRECTORY"));
\r
2435 chooser.setFileView(new JalviewFileView());
\r
2436 chooser.setDialogTitle("Export to Vamsas file");
\r
2437 chooser.setToolTipText("Export");
\r
2439 int value = chooser.showSaveDialog(this);
\r
2441 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2443 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2444 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2445 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2453 public void showTranslation_actionPerformed(ActionEvent e)
\r
2455 int s, sSize = viewport.alignment.getHeight();
\r
2456 SequenceI [] newSeq = new SequenceI[sSize];
\r
2459 StringBuffer protein;
\r
2461 for(s=0; s<sSize; s++)
\r
2463 protein = new StringBuffer();
\r
2464 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2465 resSize = seq.length();
\r
2466 resSize -= resSize%3;
\r
2468 for(res = 0; res < resSize; res+=3)
\r
2470 String codon = seq.substring(res, res+3);
\r
2471 codon = codon.replace('U', 'T');
\r
2472 String aa = ResidueProperties.codonTranslate(codon);
\r
2474 protein.append(viewport.getGapCharacter());
\r
2475 else if(aa.equals("STOP"))
\r
2476 protein.append("X");
\r
2478 protein.append( aa );
\r
2480 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2484 AlignmentI al = new Alignment(newSeq);
\r
2485 al.setDataset(null);
\r
2488 ////////////////////////////////
\r
2489 // Copy annotations across
\r
2490 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2491 = viewport.alignment.getAlignmentAnnotation();
\r
2493 for (int i = 0; i < annotations.length; i++)
\r
2496 if (annotations[i].label.equals("Quality") ||
\r
2497 annotations[i].label.equals("Conservation") ||
\r
2498 annotations[i].label.equals("Consensus"))
\r
2504 aSize = viewport.alignment.getWidth()/3;
\r
2505 jalview.datamodel.Annotation [] anots =
\r
2506 new jalview.datamodel.Annotation[aSize];
\r
2508 for(a=0; a<viewport.alignment.getWidth(); a++)
\r
2510 if( annotations[i].annotations[a]==null
\r
2511 || annotations[i].annotations[a]==null)
\r
2514 anots[a/3] = new Annotation(
\r
2515 annotations[i].annotations[a].displayCharacter,
\r
2516 annotations[i].annotations[a].description,
\r
2517 annotations[i].annotations[a].secondaryStructure,
\r
2518 annotations[i].annotations[a].value,
\r
2519 annotations[i].annotations[a].colour);
\r
2522 jalview.datamodel.AlignmentAnnotation aa
\r
2523 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2524 annotations[i].description, anots );
\r
2525 al.addAnnotation(aa);
\r
2529 AlignFrame af = new AlignFrame(al);
\r
2530 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2532 NEW_WINDOW_HEIGHT);
\r
2535 // AlignViewport newViewport = new AlignViewport(al);
\r
2536 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2537 // tabbedPane.add("Protein", ap);
\r
2538 // viewports.add(newViewport);
\r
2539 // alignPanels.add(ap);
\r
2542 /////////////////////////
\r
2544 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2545 // ds.setDataset(true);
\r
2546 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2547 // tabbedPane.add("Dataset", dap);
\r
2548 // viewports.add(ds);
\r
2549 // alignPanels.add(dap);
\r
2550 /////////////////////////
\r
2555 /*public void tabSelected()
\r
2557 int index = tabbedPane.getSelectedIndex();
\r
2558 viewport = (AlignViewport)viewports.elementAt(index);
\r
2559 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2565 * @param String DOCUMENT ME!
\r
2567 public boolean parseGroupsFile(String file)
\r
2569 String line = null;
\r
2572 BufferedReader in = new BufferedReader(new FileReader(file));
\r
2573 SequenceI seq = null;
\r
2574 String type, desc, token;
\r
2576 int index, start, end;
\r
2577 StringTokenizer st;
\r
2578 SequenceFeature sf;
\r
2580 String featureGroup = null;
\r
2581 while ( (line = in.readLine()) != null)
\r
2584 st = new StringTokenizer(line, "\t");
\r
2585 if (st.countTokens() == 2)
\r
2587 type = st.nextToken();
\r
2588 if (type.equalsIgnoreCase("startgroup"))
\r
2590 featureGroup = st.nextToken();
\r
2592 else if (type.equalsIgnoreCase("endgroup"))
\r
2594 //We should check whether this is the current group,
\r
2595 //but at present theres no way of showing more than 1 group
\r
2597 featureGroup = null;
\r
2601 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2602 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type,
\r
2603 ucs.findColour("A"));
\r
2608 while (st.hasMoreElements())
\r
2610 desc = st.nextToken();
\r
2611 token = st.nextToken();
\r
2612 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2614 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2619 index = Integer.parseInt(st.nextToken());
\r
2622 start = Integer.parseInt(st.nextToken());
\r
2623 end = Integer.parseInt(st.nextToken());
\r
2625 seq = viewport.alignment.getSequenceAt(index);
\r
2627 type = st.nextToken();
\r
2629 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2631 // Probably the old style groups file
\r
2632 UserColourScheme ucs = new UserColourScheme(type);
\r
2633 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2636 sf = new SequenceFeature(type, desc, "", start, end, featureGroup);
\r
2638 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2642 catch (Exception ex)
\r
2644 System.out.println(line);
\r
2645 ex.printStackTrace();
\r
2646 System.out.println("Error parsing groups file: " + ex +"\n"+line);
\r
2650 viewport.showSequenceFeatures = true;
\r
2651 showSeqFeatures.setSelected(true);
\r
2652 alignPanel.repaint();
\r
2656 public void dragEnter(DropTargetDragEvent evt)
\r
2659 public void dragExit(DropTargetEvent evt)
\r
2662 public void dragOver(DropTargetDragEvent evt)
\r
2665 public void dropActionChanged(DropTargetDragEvent evt)
\r
2668 public void drop(DropTargetDropEvent evt)
\r
2670 Transferable t = evt.getTransferable();
\r
2671 java.util.List files = null;
\r
2675 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2676 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2678 //Works on Windows and MacOSX
\r
2679 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2680 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2682 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2684 // This is used by Unix drag system
\r
2685 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2686 String data = (String) t.getTransferData(uriListFlavor);
\r
2687 files = new java.util.ArrayList(1);
\r
2688 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2691 st.hasMoreTokens(); )
\r
2693 String s = st.nextToken();
\r
2694 if (s.startsWith("#"))
\r
2696 // the line is a comment (as per the RFC 2483)
\r
2700 java.net.URI uri = new java.net.URI(s);
\r
2701 java.io.File file = new java.io.File(uri);
\r
2706 catch (Exception e)
\r
2708 e.printStackTrace();
\r
2710 if (files != null)
\r
2715 for (int i = 0; i < files.size(); i++)
\r
2717 loadJalviewDataFile(files.get(i).toString());
\r
2720 catch (Exception ex)
\r
2722 ex.printStackTrace();
\r
2727 // This method will attempt to load a "dropped" file first by testing
\r
2728 // whether its and Annotation file, then group file. If both are
\r
2729 // false then the user may have dropped an alignment file onto this
\r
2731 void loadJalviewDataFile(String file)
\r
2734 boolean isAnnotation = new AnnotationReader().readAnnotationFile(viewport.
\r
2737 if (!isAnnotation)
\r
2739 boolean isGroupsFile = parseGroupsFile(file);
\r
2740 if (!isGroupsFile)
\r
2742 String protocol = "File";
\r
2743 String format = new IdentifyFile().Identify(file, protocol);
\r
2744 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2747 FastaFile ff = new FastaFile();
\r
2748 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2749 c.setContents(new StringSelection(ff.print(sequences)), this);
\r
2751 this.paste(false);
\r
2757 int height = alignPanel.annotationPanel.adjustPanelHeight();
\r
2758 alignPanel.annotationScroller.setPreferredSize(
\r
2759 new Dimension(alignPanel.annotationScroller.getWidth(),
\r
2762 alignPanel.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
\r
2763 alignPanel.annotationSpaceFillerHolder.getWidth(),
\r
2766 alignPanel.addNotify();
\r
2769 }catch(Exception ex)
\r
2771 ex.printStackTrace();
\r