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 new 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 if(viewport.cursorMode)
\r
917 alignPanel.seqPanel.keyboardNo1 = null;
\r
918 alignPanel.seqPanel.keyboardNo2 = null;
\r
920 viewport.setSelectionGroup(null);
\r
921 viewport.getColumnSelection().clear();
\r
922 viewport.setSelectionGroup(null);
\r
923 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
924 alignPanel.idPanel.idCanvas.searchResults = null;
\r
925 PaintRefresher.Refresh(null, viewport.alignment);
\r
931 * @param e DOCUMENT ME!
\r
933 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
935 SequenceGroup sg = viewport.getSelectionGroup();
\r
939 selectAllSequenceMenuItem_actionPerformed(null);
\r
944 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
947 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
950 PaintRefresher.Refresh(null, viewport.alignment);
\r
956 * @param e DOCUMENT ME!
\r
958 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
960 ColumnSelection colSel = viewport.getColumnSelection();
\r
962 if (colSel.size() > 0)
\r
964 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
965 HistoryItem.HIDE));
\r
967 int min = colSel.getMin();
\r
968 viewport.getAlignment().trimLeft(min);
\r
969 colSel.compensateForEdit(0, min);
\r
971 if (viewport.getSelectionGroup() != null)
\r
973 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
976 Vector groups = viewport.alignment.getGroups();
\r
978 for (int i = 0; i < groups.size(); i++)
\r
980 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
982 if (!sg.adjustForRemoveLeft(min))
\r
984 viewport.alignment.deleteGroup(sg);
\r
988 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
995 * @param e DOCUMENT ME!
\r
997 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
999 ColumnSelection colSel = viewport.getColumnSelection();
\r
1001 if (colSel.size() > 0)
\r
1003 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1004 HistoryItem.HIDE));
\r
1006 int max = colSel.getMax();
\r
1007 viewport.getAlignment().trimRight(max);
\r
1009 if (viewport.getSelectionGroup() != null)
\r
1011 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1014 Vector groups = viewport.alignment.getGroups();
\r
1016 for (int i = 0; i < groups.size(); i++)
\r
1018 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1020 if (!sg.adjustForRemoveRight(max))
\r
1022 viewport.alignment.deleteGroup(sg);
\r
1026 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1033 * @param e DOCUMENT ME!
\r
1035 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1037 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1038 viewport.alignment, HistoryItem.HIDE));
\r
1040 //This is to maintain viewport position on first residue
\r
1041 //of first sequence
\r
1042 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1043 int startRes = seq.findPosition(viewport.startRes);
\r
1045 viewport.getAlignment().removeGaps();
\r
1047 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1049 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1055 * @param e DOCUMENT ME!
\r
1057 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1059 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1060 HistoryItem.HIDE));
\r
1062 //This is to maintain viewport position on first residue
\r
1063 //of first sequence
\r
1064 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1065 int startRes = seq.findPosition(viewport.startRes);
\r
1068 SequenceI current;
\r
1071 Vector seqs = null;
\r
1074 int end = viewport.alignment.getWidth();
\r
1076 if (viewport.getSelectionGroup() != null
\r
1077 && viewport.getSelectionGroup().sequences != null
\r
1078 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1080 seqs = viewport.getSelectionGroup().sequences;
\r
1081 start = viewport.getSelectionGroup().getStartRes();
\r
1082 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1086 seqs = viewport.alignment.getSequences();
\r
1089 for (int i = 0; i < seqs.size(); i++)
\r
1091 current = (SequenceI) seqs.elementAt(i);
\r
1092 jSize = current.getLength();
\r
1094 // Removing a range is much quicker than removing gaps
\r
1095 // one by one for long sequences
\r
1097 int rangeStart=-1, rangeEnd=-1;
\r
1101 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1103 if(rangeStart==-1)
\r
1118 current.deleteChars(rangeStart, rangeEnd);
\r
1119 j-=rangeEnd-rangeStart;
\r
1120 jSize-=rangeEnd-rangeStart;
\r
1128 while (j < end && j < jSize);
\r
1131 current.deleteChars(rangeStart, rangeEnd);
\r
1135 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1137 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1140 public void alignmentChanged()
\r
1142 if(viewport.padGaps)
\r
1143 viewport.getAlignment().padGaps();
\r
1145 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1147 viewport.updateConsensus();
\r
1148 viewport.updateConservation();
\r
1150 resetAllColourSchemes();
\r
1151 if(alignPanel.overviewPanel!=null)
\r
1152 alignPanel.overviewPanel.updateOverviewImage();
\r
1154 viewport.alignment.adjustSequenceAnnotations();
\r
1156 alignPanel.repaint();
\r
1159 void resetAllColourSchemes()
\r
1161 ColourSchemeI cs = viewport.globalColourScheme;
\r
1164 if (cs instanceof ClustalxColourScheme)
\r
1166 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1167 resetClustalX(viewport.alignment.getSequences(),
\r
1168 viewport.alignment.getWidth());
\r
1171 cs.setConsensus(viewport.vconsensus);
\r
1172 if (cs.conservationApplied())
\r
1174 Alignment al = (Alignment) viewport.alignment;
\r
1175 Conservation c = new Conservation("All",
\r
1176 ResidueProperties.propHash, 3,
\r
1177 al.getSequences(), 0,
\r
1178 al.getWidth() - 1);
\r
1180 c.verdict(false, viewport.ConsPercGaps);
\r
1182 cs.setConservation(c);
\r
1186 int s, sSize = viewport.alignment.getGroups().size();
\r
1187 for(s=0; s<sSize; s++)
\r
1189 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1190 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1192 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1194 sg.recalcConservation();
\r
1201 * @param e DOCUMENT ME!
\r
1203 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1205 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1206 HistoryItem.HIDE));
\r
1208 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1210 if (viewport.padGaps)
\r
1211 alignmentChanged();
\r
1217 * @param e DOCUMENT ME!
\r
1219 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1221 JInternalFrame frame = new JInternalFrame();
\r
1222 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1223 frame.setContentPane(finder);
\r
1224 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1225 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1231 * @param e DOCUMENT ME!
\r
1233 public void font_actionPerformed(ActionEvent e)
\r
1235 new FontChooser(alignPanel);
\r
1238 public void smoothFont_actionPerformed(ActionEvent e)
\r
1240 viewport.antiAlias = smoothFont.isSelected();
\r
1241 alignPanel.annotationPanel.image = null;
\r
1242 alignPanel.repaint();
\r
1249 * @param e DOCUMENT ME!
\r
1251 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1253 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1255 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1256 alignPanel.repaint();
\r
1263 * @param e DOCUMENT ME!
\r
1265 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1267 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1268 alignPanel.repaint();
\r
1274 * @param e DOCUMENT ME!
\r
1276 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1278 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1279 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1280 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1281 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1282 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1283 alignPanel.repaint();
\r
1289 * @param e DOCUMENT ME!
\r
1291 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1293 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1294 alignPanel.repaint();
\r
1300 * @param e DOCUMENT ME!
\r
1302 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1304 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1305 alignPanel.repaint();
\r
1311 * @param e DOCUMENT ME!
\r
1313 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1315 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1316 alignPanel.repaint();
\r
1322 * @param e DOCUMENT ME!
\r
1324 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1326 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1327 alignPanel.repaint();
\r
1333 * @param e DOCUMENT ME!
\r
1335 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1337 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1338 alignPanel.repaint();
\r
1344 * @param e DOCUMENT ME!
\r
1346 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1348 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1349 alignPanel.repaint();
\r
1352 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1354 if (!viewport.alignment.isNucleotide())
\r
1356 new SequenceFeatureFetcher(viewport.
\r
1359 viewport.setShowSequenceFeatures(true);
\r
1360 showSeqFeatures.setSelected(true);
\r
1365 public void featureSettings_actionPerformed(ActionEvent e)
\r
1367 new FeatureSettings(viewport, alignPanel);
\r
1373 * @param evt DOCUMENT ME!
\r
1375 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1377 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1378 alignPanel.repaint();
\r
1379 if (alignPanel.getOverviewPanel() != null)
\r
1381 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1388 * @param e DOCUMENT ME!
\r
1390 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1392 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1393 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1399 * @param e DOCUMENT ME!
\r
1401 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1403 if (alignPanel.overviewPanel != null)
\r
1408 JInternalFrame frame = new JInternalFrame();
\r
1409 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1410 frame.setContentPane(overview);
\r
1411 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1412 frame.getWidth(), frame.getHeight());
\r
1414 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1415 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1417 public void internalFrameClosed(
\r
1418 javax.swing.event.InternalFrameEvent evt)
\r
1420 alignPanel.setOverviewPanel(null);
\r
1425 alignPanel.setOverviewPanel(overview);
\r
1431 * @param e DOCUMENT ME!
\r
1433 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1435 changeColour(null);
\r
1441 * @param e DOCUMENT ME!
\r
1443 public void clustalColour_actionPerformed(ActionEvent e)
\r
1445 changeColour(new ClustalxColourScheme(
\r
1446 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1452 * @param e DOCUMENT ME!
\r
1454 public void zappoColour_actionPerformed(ActionEvent e)
\r
1456 changeColour(new ZappoColourScheme());
\r
1462 * @param e DOCUMENT ME!
\r
1464 public void taylorColour_actionPerformed(ActionEvent e)
\r
1466 changeColour(new TaylorColourScheme());
\r
1472 * @param e DOCUMENT ME!
\r
1474 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1476 changeColour(new HydrophobicColourScheme());
\r
1482 * @param e DOCUMENT ME!
\r
1484 public void helixColour_actionPerformed(ActionEvent e)
\r
1486 changeColour(new HelixColourScheme());
\r
1492 * @param e DOCUMENT ME!
\r
1494 public void strandColour_actionPerformed(ActionEvent e)
\r
1496 changeColour(new StrandColourScheme());
\r
1502 * @param e DOCUMENT ME!
\r
1504 public void turnColour_actionPerformed(ActionEvent e)
\r
1506 changeColour(new TurnColourScheme());
\r
1512 * @param e DOCUMENT ME!
\r
1514 public void buriedColour_actionPerformed(ActionEvent e)
\r
1516 changeColour(new BuriedColourScheme());
\r
1522 * @param e DOCUMENT ME!
\r
1524 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1526 changeColour(new NucleotideColourScheme());
\r
1529 public void annotationColour_actionPerformed(ActionEvent e)
\r
1531 new AnnotationColourChooser(viewport, alignPanel);
\r
1538 * @param e DOCUMENT ME!
\r
1540 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1542 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1548 * @param cs DOCUMENT ME!
\r
1550 void changeColour(ColourSchemeI cs)
\r
1552 int threshold = 0;
\r
1556 if (viewport.getAbovePIDThreshold())
\r
1558 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1561 cs.setThreshold(threshold,
\r
1562 viewport.getIgnoreGapsConsensus());
\r
1564 viewport.setGlobalColourScheme(cs);
\r
1568 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1571 if (viewport.getConservationSelected())
\r
1574 Alignment al = (Alignment) viewport.alignment;
\r
1575 Conservation c = new Conservation("All",
\r
1576 ResidueProperties.propHash, 3,
\r
1577 al.getSequences(), 0,
\r
1578 al.getWidth() - 1);
\r
1581 c.verdict(false, viewport.ConsPercGaps);
\r
1583 cs.setConservation(c);
\r
1585 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1590 cs.setConservation(null);
\r
1593 cs.setConsensus(viewport.vconsensus);
\r
1596 viewport.setGlobalColourScheme(cs);
\r
1598 if (viewport.getColourAppliesToAllGroups())
\r
1600 Vector groups = viewport.alignment.getGroups();
\r
1602 for (int i = 0; i < groups.size(); i++)
\r
1604 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1612 if (cs instanceof ClustalxColourScheme)
\r
1614 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1616 else if (cs instanceof UserColourScheme)
\r
1618 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1624 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1626 catch (Exception ex)
\r
1631 if (viewport.getAbovePIDThreshold()
\r
1632 || cs instanceof PIDColourScheme
\r
1633 || cs instanceof Blosum62ColourScheme)
\r
1635 sg.cs.setThreshold(threshold,
\r
1636 viewport.getIgnoreGapsConsensus());
\r
1638 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1642 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1645 if (viewport.getConservationSelected())
\r
1647 Conservation c = new Conservation("Group",
\r
1648 ResidueProperties.propHash, 3,
\r
1650 viewport.alignment.getWidth() - 1);
\r
1652 c.verdict(false, viewport.ConsPercGaps);
\r
1653 sg.cs.setConservation(c);
\r
1656 sg.cs.setConservation(null);
\r
1660 if (alignPanel.getOverviewPanel() != null)
\r
1662 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1665 alignPanel.repaint();
\r
1671 * @param e DOCUMENT ME!
\r
1673 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1675 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1677 SliderPanel.setPIDSliderSource(alignPanel,
\r
1678 viewport.getGlobalColourScheme(),
\r
1680 SliderPanel.showPIDSlider();
\r
1687 * @param e DOCUMENT ME!
\r
1689 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1691 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1693 SliderPanel.setConservationSlider(alignPanel,
\r
1694 viewport.globalColourScheme,
\r
1696 SliderPanel.showConservationSlider();
\r
1703 * @param e DOCUMENT ME!
\r
1705 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1707 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1709 viewport.setAbovePIDThreshold(false);
\r
1710 abovePIDThreshold.setSelected(false);
\r
1712 changeColour(viewport.getGlobalColourScheme());
\r
1714 modifyConservation_actionPerformed(null);
\r
1720 * @param e DOCUMENT ME!
\r
1722 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1724 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1726 conservationMenuItem.setSelected(false);
\r
1727 viewport.setConservationSelected(false);
\r
1729 changeColour(viewport.getGlobalColourScheme());
\r
1731 modifyPID_actionPerformed(null);
\r
1737 * @param e DOCUMENT ME!
\r
1739 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1741 if (e.getActionCommand().equals("User Defined..."))
\r
1743 new UserDefinedColours(alignPanel, null);
\r
1747 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1748 getUserColourSchemes().get(e.getActionCommand());
\r
1750 changeColour(udc);
\r
1754 public void updateUserColourMenu()
\r
1757 Component[] menuItems = colourMenu.getMenuComponents();
\r
1758 int i, iSize = menuItems.length;
\r
1759 for (i = 0; i < iSize; i++)
\r
1761 if (menuItems[i].getName() != null &&
\r
1762 menuItems[i].getName().equals("USER_DEFINED"))
\r
1764 colourMenu.remove(menuItems[i]);
\r
1768 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1770 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1771 getUserColourSchemes().keys();
\r
1773 while (userColours.hasMoreElements())
\r
1775 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1776 nextElement().toString());
\r
1777 radioItem.setName("USER_DEFINED");
\r
1778 radioItem.addMouseListener(new MouseAdapter()
\r
1780 public void mousePressed(MouseEvent evt)
\r
1782 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1784 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1786 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1787 "Remove from default list?",
\r
1788 "Remove user defined colour",
\r
1789 JOptionPane.YES_NO_OPTION);
\r
1790 if(option == JOptionPane.YES_OPTION)
\r
1792 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1793 colourMenu.remove(radioItem);
\r
1796 radioItem.addActionListener(new ActionListener()
\r
1798 public void actionPerformed(ActionEvent evt)
\r
1800 userDefinedColour_actionPerformed(evt);
\r
1806 radioItem.addActionListener(new ActionListener()
\r
1808 public void actionPerformed(ActionEvent evt)
\r
1810 userDefinedColour_actionPerformed(evt);
\r
1814 colourMenu.insert(radioItem, 15);
\r
1815 colours.add(radioItem);
\r
1823 * @param e DOCUMENT ME!
\r
1825 public void PIDColour_actionPerformed(ActionEvent e)
\r
1827 changeColour(new PIDColourScheme());
\r
1833 * @param e DOCUMENT ME!
\r
1835 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1837 changeColour(new Blosum62ColourScheme());
\r
1843 * @param e DOCUMENT ME!
\r
1845 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1847 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1848 HistoryItem.SORT));
\r
1849 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1850 viewport.getAlignment().getSequenceAt(0));
\r
1851 alignPanel.repaint();
\r
1857 * @param e DOCUMENT ME!
\r
1859 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1861 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1862 HistoryItem.SORT));
\r
1863 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1864 alignPanel.repaint();
\r
1870 * @param e DOCUMENT ME!
\r
1872 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1874 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1875 HistoryItem.SORT));
\r
1877 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1878 alignPanel.repaint();
\r
1884 * @param e DOCUMENT ME!
\r
1886 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1888 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1889 JInternalFrame frame = new JInternalFrame();
\r
1890 frame.setContentPane(sp);
\r
1891 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1898 * @param e DOCUMENT ME!
\r
1900 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1902 if ( (viewport.getSelectionGroup() == null) ||
\r
1903 (viewport.getSelectionGroup().getSize() < 2))
\r
1905 JOptionPane.showInternalMessageDialog(this,
\r
1906 "You must select at least 2 sequences.",
\r
1907 "Invalid Selection",
\r
1908 JOptionPane.WARNING_MESSAGE);
\r
1912 JInternalFrame frame = new JInternalFrame();
\r
1913 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1914 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1921 * @param e DOCUMENT ME!
\r
1923 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1925 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1926 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1927 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1928 (viewport.getAlignment().getHeight() < 4))
\r
1930 JOptionPane.showInternalMessageDialog(this,
\r
1931 "Principal component analysis must take\n" +
\r
1932 "at least 4 input sequences.",
\r
1933 "Sequence selection insufficient",
\r
1934 JOptionPane.WARNING_MESSAGE);
\r
1939 new PCAPanel(viewport);
\r
1943 public void autoCalculate_actionPerformed(ActionEvent e)
\r
1945 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
1952 * @param e DOCUMENT ME!
\r
1954 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1956 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1962 * @param e DOCUMENT ME!
\r
1964 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1966 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1972 * @param e DOCUMENT ME!
\r
1974 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1976 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1982 * @param e DOCUMENT ME!
\r
1984 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1986 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1992 * @param type DOCUMENT ME!
\r
1993 * @param pwType DOCUMENT ME!
\r
1994 * @param title DOCUMENT ME!
\r
1996 void NewTreePanel(String type, String pwType, String title)
\r
2000 if ( (viewport.getSelectionGroup() != null) &&
\r
2001 (viewport.getSelectionGroup().getSize() > 3))
\r
2004 SequenceGroup sg = viewport.getSelectionGroup();
\r
2006 /* Decide if the selection is a column region */
\r
2007 while (s < sg.sequences.size())
\r
2009 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
2012 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2013 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2014 "Try using the Pad function in the edit menu,\n" +
\r
2015 "or one of the multiple sequence alignment web services.",
\r
2016 "Sequences in selection are not aligned",
\r
2017 JOptionPane.WARNING_MESSAGE);
\r
2023 title = title + " on region";
\r
2024 tp = new TreePanel(viewport,
\r
2025 viewport.getSelectionGroup().sequences, type, pwType,
\r
2026 sg.getStartRes(), sg.getEndRes());
\r
2030 //are the sequences aligned?
\r
2031 if (!viewport.alignment.isAligned())
\r
2033 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2034 "The sequences must be aligned before creating a tree.\n" +
\r
2035 "Try using the Pad function in the edit menu,\n" +
\r
2036 "or one of the multiple sequence alignment web services.",
\r
2037 "Sequences not aligned",
\r
2038 JOptionPane.WARNING_MESSAGE);
\r
2043 tp = new TreePanel(viewport,
\r
2044 viewport.getAlignment().getSequences(), type, pwType,
\r
2046 viewport.alignment.getWidth());
\r
2049 addTreeMenuItem(tp, title);
\r
2051 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2057 * @param title DOCUMENT ME!
\r
2058 * @param order DOCUMENT ME!
\r
2060 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2062 final JMenuItem item = new JMenuItem("by " + title);
\r
2064 item.addActionListener(new java.awt.event.ActionListener()
\r
2066 public void actionPerformed(ActionEvent e)
\r
2068 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2069 HistoryItem.SORT));
\r
2071 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2072 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2073 alignPanel.repaint();
\r
2079 * Maintain the Order by->Displayed Tree menu.
\r
2080 * Creates a new menu item for a TreePanel with an appropriate
\r
2081 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2082 * to remove the menu item when the treePanel is closed, and adjust
\r
2083 * the tree leaf to sequence mapping when the alignment is modified.
\r
2084 * @param treePanel Displayed tree window.
\r
2085 * @param title SortBy menu item title.
\r
2087 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2089 final JMenuItem item = new JMenuItem(title);
\r
2093 if (treeCount == 1)
\r
2095 sort.add(sortByTreeMenu);
\r
2098 sortByTreeMenu.add(item);
\r
2099 item.addActionListener(new java.awt.event.ActionListener()
\r
2101 public void actionPerformed(ActionEvent e)
\r
2103 addHistoryItem(new HistoryItem("Tree Sort",
\r
2104 viewport.alignment, HistoryItem.SORT));
\r
2105 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2106 treePanel.getTree());
\r
2107 alignPanel.repaint();
\r
2111 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2112 InternalFrameAdapter()
\r
2114 public void internalFrameClosed(
\r
2115 javax.swing.event.InternalFrameEvent evt)
\r
2118 sortByTreeMenu.remove(item);
\r
2120 if (treeCount == 0)
\r
2122 sort.remove(sortByTreeMenu);
\r
2130 * Work out whether the whole set of sequences
\r
2131 * or just the selected set will be submitted for multiple alignment.
\r
2134 private SequenceI[] gatherSequencesForAlignment()
\r
2136 // Now, check we have enough sequences
\r
2137 SequenceI[] msa = null;
\r
2139 if ( (viewport.getSelectionGroup() != null) &&
\r
2140 (viewport.getSelectionGroup().getSize() > 1))
\r
2142 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2143 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2145 msa = new SequenceI[sz = seqs.getSize()];
\r
2147 for (int i = 0; i < sz; i++)
\r
2149 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2154 Vector seqs = viewport.getAlignment().getSequences();
\r
2156 if (seqs.size() > 1)
\r
2158 msa = new SequenceI[seqs.size()];
\r
2160 for (int i = 0; i < seqs.size(); i++)
\r
2162 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2170 * Decides what is submitted to a secondary structure prediction service,
\r
2171 * the currently selected sequence, or the currently selected alignment
\r
2172 * (where the first sequence in the set is the one that the prediction
\r
2175 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2177 SequenceI seq = null;
\r
2178 SequenceI[] msa = null;
\r
2180 if ( (viewport.getSelectionGroup() != null) &&
\r
2181 (viewport.getSelectionGroup().getSize() > 0))
\r
2183 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2184 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2186 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2188 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2193 msa = new SequenceI[sz = seqs.getSize()];
\r
2195 for (int i = 0; i < sz; i++)
\r
2197 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2203 Vector seqs = viewport.getAlignment().getSequences();
\r
2205 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2207 seq = (SequenceI) seqs.elementAt(0);
\r
2211 msa = new SequenceI[seqs.size()];
\r
2213 for (int i = 0; i < seqs.size(); i++)
\r
2215 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2227 return new SequenceI[]
\r
2237 * @param e DOCUMENT ME!
\r
2239 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2241 // Pick the tree file
\r
2242 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2244 "LAST_DIRECTORY"));
\r
2245 chooser.setFileView(new JalviewFileView());
\r
2246 chooser.setDialogTitle("Select a newick-like tree file");
\r
2247 chooser.setToolTipText("Load a tree file");
\r
2249 int value = chooser.showOpenDialog(null);
\r
2251 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2253 String choice = chooser.getSelectedFile().getPath();
\r
2254 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2258 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2260 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2262 catch (Exception ex)
\r
2264 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2265 "Problem reading tree file",
\r
2267 JOptionPane.WARNING_MESSAGE);
\r
2268 ex.printStackTrace();
\r
2274 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2276 return ShowNewickTree(nf,title,600,500,4,5);
\r
2281 * @param nf DOCUMENT ME!
\r
2282 * @param title DOCUMENT ME!
\r
2284 * @return DOCUMENT ME!
\r
2286 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2288 TreePanel tp = null;
\r
2294 if (nf.getTree() != null)
\r
2296 tp = new TreePanel(viewport,
\r
2297 viewport.getAlignment().getSequences(), nf,
\r
2304 tp.setLocation(x,y);
\r
2307 Desktop.addInternalFrame(tp, title, w, h);
\r
2308 addTreeMenuItem(tp, title);
\r
2311 catch (Exception ex)
\r
2313 ex.printStackTrace();
\r
2324 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2325 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2326 printJob.setPrintable(alignPanel, pf);
\r
2328 if (printJob.printDialog())
\r
2334 catch (Exception PrintException)
\r
2336 PrintException.printStackTrace();
\r
2343 * Generates menu items and listener event actions for web service clients
\r
2346 public void BuildWebServiceMenu()
\r
2348 if ( (Discoverer.services != null)
\r
2349 && (Discoverer.services.size() > 0))
\r
2351 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2352 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2353 Vector wsmenu = new Vector();
\r
2354 if (msaws != null)
\r
2356 // Add any Multiple Sequence Alignment Services
\r
2357 final JMenu msawsmenu = new JMenu("Alignment");
\r
2358 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2360 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2362 final JMenuItem method = new JMenuItem(sh.getName());
\r
2363 method.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 false, true, viewport.getAlignment().getDataset());
\r
2374 msawsmenu.add(method);
\r
2375 // Deal with services that we know accept partial alignments.
\r
2376 if (sh.getName().indexOf("lustal") > -1)
\r
2378 // We know that ClustalWS can accept partial alignments for refinement.
\r
2379 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2380 methodR.addActionListener(new ActionListener()
\r
2382 public void actionPerformed(ActionEvent e)
\r
2384 SequenceI[] msa = gatherSequencesForAlignment();
\r
2385 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2386 true, true, viewport.getAlignment().getDataset());
\r
2391 msawsmenu.add(methodR);
\r
2395 wsmenu.add(msawsmenu);
\r
2397 if (secstrpr != null)
\r
2399 // Add any secondary structure prediction services
\r
2400 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2401 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2403 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2405 final JMenuItem method = new JMenuItem(sh.getName());
\r
2406 method.addActionListener(new ActionListener()
\r
2408 public void actionPerformed(ActionEvent e)
\r
2410 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2411 if (msa.length == 1)
\r
2413 // Single Sequence prediction
\r
2414 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2418 if (msa.length > 1)
\r
2420 // Single Sequence prediction
\r
2421 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2427 secstrmenu.add(method);
\r
2429 wsmenu.add(secstrmenu);
\r
2431 this.webService.removeAll();
\r
2432 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2434 webService.add( (JMenu) wsmenu.get(i));
\r
2439 this.webService.removeAll();
\r
2440 this.webService.add(this.webServiceNoServices);
\r
2442 // TODO: add in rediscovery function
\r
2443 // TODO: reduce code redundancy.
\r
2444 // TODO: group services by location as well as function.
\r
2447 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2449 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2450 getProperty("LAST_DIRECTORY"));
\r
2452 chooser.setFileView(new JalviewFileView());
\r
2453 chooser.setDialogTitle("Export to Vamsas file");
\r
2454 chooser.setToolTipText("Export");
\r
2456 int value = chooser.showSaveDialog(this);
\r
2458 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2460 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2461 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2462 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2470 public void showTranslation_actionPerformed(ActionEvent e)
\r
2472 int s, sSize = viewport.alignment.getHeight();
\r
2473 SequenceI [] newSeq = new SequenceI[sSize];
\r
2476 StringBuffer protein;
\r
2478 for(s=0; s<sSize; s++)
\r
2480 protein = new StringBuffer();
\r
2481 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2482 resSize = seq.length();
\r
2483 resSize -= resSize%3;
\r
2485 for(res = 0; res < resSize; res+=3)
\r
2487 String codon = seq.substring(res, res+3);
\r
2488 codon = codon.replace('U', 'T');
\r
2489 String aa = ResidueProperties.codonTranslate(codon);
\r
2491 protein.append(viewport.getGapCharacter());
\r
2492 else if(aa.equals("STOP"))
\r
2493 protein.append("X");
\r
2495 protein.append( aa );
\r
2497 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2501 AlignmentI al = new Alignment(newSeq);
\r
2502 al.setDataset(null);
\r
2505 ////////////////////////////////
\r
2506 // Copy annotations across
\r
2507 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2508 = viewport.alignment.getAlignmentAnnotation();
\r
2510 for (int i = 0; i < annotations.length; i++)
\r
2513 if (annotations[i].label.equals("Quality") ||
\r
2514 annotations[i].label.equals("Conservation") ||
\r
2515 annotations[i].label.equals("Consensus"))
\r
2521 aSize = viewport.alignment.getWidth()/3;
\r
2522 jalview.datamodel.Annotation [] anots =
\r
2523 new jalview.datamodel.Annotation[aSize];
\r
2525 for(a=0; a<viewport.alignment.getWidth(); a++)
\r
2527 if( annotations[i].annotations[a]==null
\r
2528 || annotations[i].annotations[a]==null)
\r
2531 anots[a/3] = new Annotation(
\r
2532 annotations[i].annotations[a].displayCharacter,
\r
2533 annotations[i].annotations[a].description,
\r
2534 annotations[i].annotations[a].secondaryStructure,
\r
2535 annotations[i].annotations[a].value,
\r
2536 annotations[i].annotations[a].colour);
\r
2539 jalview.datamodel.AlignmentAnnotation aa
\r
2540 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2541 annotations[i].description, anots );
\r
2542 al.addAnnotation(aa);
\r
2546 AlignFrame af = new AlignFrame(al);
\r
2547 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2549 NEW_WINDOW_HEIGHT);
\r
2552 // AlignViewport newViewport = new AlignViewport(al);
\r
2553 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2554 // tabbedPane.add("Protein", ap);
\r
2555 // viewports.add(newViewport);
\r
2556 // alignPanels.add(ap);
\r
2559 /////////////////////////
\r
2561 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2562 // ds.setDataset(true);
\r
2563 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2564 // tabbedPane.add("Dataset", dap);
\r
2565 // viewports.add(ds);
\r
2566 // alignPanels.add(dap);
\r
2567 /////////////////////////
\r
2572 /*public void tabSelected()
\r
2574 int index = tabbedPane.getSelectedIndex();
\r
2575 viewport = (AlignViewport)viewports.elementAt(index);
\r
2576 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2582 * @param String DOCUMENT ME!
\r
2584 public boolean parseGroupsFile(String file)
\r
2586 String line = null;
\r
2589 BufferedReader in = new BufferedReader(new FileReader(file));
\r
2590 SequenceI seq = null;
\r
2591 String type, desc, token;
\r
2593 int index, start, end;
\r
2594 StringTokenizer st;
\r
2595 SequenceFeature sf;
\r
2597 String featureGroup = null;
\r
2598 while ( (line = in.readLine()) != null)
\r
2601 st = new StringTokenizer(line, "\t");
\r
2602 if (st.countTokens() == 2)
\r
2604 type = st.nextToken();
\r
2605 if (type.equalsIgnoreCase("startgroup"))
\r
2607 featureGroup = st.nextToken();
\r
2609 else if (type.equalsIgnoreCase("endgroup"))
\r
2611 //We should check whether this is the current group,
\r
2612 //but at present theres no way of showing more than 1 group
\r
2614 featureGroup = null;
\r
2618 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2619 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type,
\r
2620 ucs.findColour("A"));
\r
2625 while (st.hasMoreElements())
\r
2627 desc = st.nextToken();
\r
2628 token = st.nextToken();
\r
2629 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2631 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2636 index = Integer.parseInt(st.nextToken());
\r
2639 start = Integer.parseInt(st.nextToken());
\r
2640 end = Integer.parseInt(st.nextToken());
\r
2642 seq = viewport.alignment.getSequenceAt(index);
\r
2644 type = st.nextToken();
\r
2646 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2648 // Probably the old style groups file
\r
2649 UserColourScheme ucs = new UserColourScheme(type);
\r
2650 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2653 sf = new SequenceFeature(type, desc, "", start, end, featureGroup);
\r
2655 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2659 catch (Exception ex)
\r
2661 System.out.println(line);
\r
2662 ex.printStackTrace();
\r
2663 System.out.println("Error parsing groups file: " + ex +"\n"+line);
\r
2667 viewport.showSequenceFeatures = true;
\r
2668 showSeqFeatures.setSelected(true);
\r
2669 alignPanel.repaint();
\r
2673 public void dragEnter(DropTargetDragEvent evt)
\r
2676 public void dragExit(DropTargetEvent evt)
\r
2679 public void dragOver(DropTargetDragEvent evt)
\r
2682 public void dropActionChanged(DropTargetDragEvent evt)
\r
2685 public void drop(DropTargetDropEvent evt)
\r
2687 Transferable t = evt.getTransferable();
\r
2688 java.util.List files = null;
\r
2692 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2693 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2695 //Works on Windows and MacOSX
\r
2696 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2697 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2699 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2701 // This is used by Unix drag system
\r
2702 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2703 String data = (String) t.getTransferData(uriListFlavor);
\r
2704 files = new java.util.ArrayList(1);
\r
2705 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2708 st.hasMoreTokens(); )
\r
2710 String s = st.nextToken();
\r
2711 if (s.startsWith("#"))
\r
2713 // the line is a comment (as per the RFC 2483)
\r
2717 java.net.URI uri = new java.net.URI(s);
\r
2718 java.io.File file = new java.io.File(uri);
\r
2723 catch (Exception e)
\r
2725 e.printStackTrace();
\r
2727 if (files != null)
\r
2732 for (int i = 0; i < files.size(); i++)
\r
2734 loadJalviewDataFile(files.get(i).toString());
\r
2737 catch (Exception ex)
\r
2739 ex.printStackTrace();
\r
2744 // This method will attempt to load a "dropped" file first by testing
\r
2745 // whether its and Annotation file, then features file. If both are
\r
2746 // false then the user may have dropped an alignment file onto this
\r
2748 public void loadJalviewDataFile(String file)
\r
2751 boolean isAnnotation = new AnnotationReader().readAnnotationFile(viewport.
\r
2754 if (!isAnnotation)
\r
2756 boolean isGroupsFile = parseGroupsFile(file);
\r
2757 if (!isGroupsFile)
\r
2759 String protocol = "File";
\r
2760 String format = new IdentifyFile().Identify(file, protocol);
\r
2761 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2764 FastaFile ff = new FastaFile();
\r
2765 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2766 c.setContents(new StringSelection(ff.print(sequences)), this);
\r
2768 this.paste(false);
\r
2774 int height = alignPanel.annotationPanel.adjustPanelHeight();
\r
2775 alignPanel.annotationScroller.setPreferredSize(
\r
2776 new Dimension(alignPanel.annotationScroller.getWidth(),
\r
2779 alignPanel.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
\r
2780 alignPanel.annotationSpaceFillerHolder.getWidth(),
\r
2783 alignPanel.addNotify();
\r
2786 }catch(Exception ex)
\r
2788 ex.printStackTrace();
\r