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 /** DOCUMENT ME!! */
\r
58 public String currentFileFormat = null;
\r
59 Stack historyList = new Stack();
\r
60 Stack redoList = new Stack();
\r
61 private int treeCount = 0;
\r
65 * Creates a new AlignFrame object.
\r
67 * @param al DOCUMENT ME!
\r
69 public AlignFrame(AlignmentI al)
\r
71 viewport = new AlignViewport(al);
\r
73 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
\r
75 if(viewport.vconsensus==null)
\r
77 //Out of memory calculating consensus.
\r
78 BLOSUM62Colour.setEnabled(false);
\r
79 PIDColour.setEnabled(false);
\r
80 conservationMenuItem.setEnabled(false);
\r
81 modifyConservation.setEnabled(false);
\r
82 abovePIDThreshold.setEnabled(false);
\r
83 modifyPID.setEnabled(false);
\r
86 alignPanel = new AlignmentPanel(this, viewport);
\r
88 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
\r
90 if(sortby.equals("Id"))
\r
91 sortIDMenuItem_actionPerformed(null);
\r
92 else if(sortby.equals("Pairwise Identity"))
\r
93 sortPairwiseMenuItem_actionPerformed(null);
\r
95 // remove(tabbedPane);
\r
96 getContentPane().add(alignPanel, BorderLayout.CENTER);
\r
100 // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
\r
103 /////////////////////////
\r
104 if(al.getDataset()==null)
\r
106 al.setDataset(null);
\r
108 // AlignViewport ds = new AlignViewport(al.getDataset(), true);
\r
109 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
110 // tabbedPane.add("Dataset", dap);
\r
111 // viewports.add(ds);
\r
112 // alignPanels.add(dap);
\r
113 /////////////////////////
\r
116 viewport.addPropertyChangeListener(new PropertyChangeListener()
\r
118 public void propertyChange(PropertyChangeEvent evt)
\r
120 if (evt.getPropertyName().equals("alignment"))
\r
122 alignmentChanged();
\r
128 if (Desktop.desktop != null)
\r
130 addServiceListeners();
\r
131 setGUINucleotide(al.isNucleotide());
\r
135 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
136 private void addServiceListeners()
\r
138 final java.beans.PropertyChangeListener thisListener;
\r
139 // Do this once to get current state
\r
140 BuildWebServiceMenu();
\r
141 Desktop.discoverer.addPropertyChangeListener(
\r
142 thisListener = new java.beans.PropertyChangeListener()
\r
144 public void propertyChange(PropertyChangeEvent evt)
\r
146 // System.out.println("Discoverer property change.");
\r
147 if (evt.getPropertyName().equals("services"))
\r
149 // System.out.println("Rebuilding web service menu");
\r
150 BuildWebServiceMenu();
\r
154 addInternalFrameListener(new javax.swing.event.
\r
155 InternalFrameAdapter()
\r
157 public void internalFrameClosed(
\r
158 javax.swing.event.InternalFrameEvent evt)
\r
160 // System.out.println("deregistering discoverer listener");
\r
161 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
162 closeMenuItem_actionPerformed(null);
\r
169 public void setGUINucleotide(boolean nucleotide)
\r
171 showTranslation.setVisible( nucleotide );
\r
172 //sequenceFeatures.setVisible(!nucleotide );
\r
173 //featureSettings.setVisible( !nucleotide );
\r
174 conservationMenuItem.setVisible( !nucleotide );
\r
175 modifyConservation.setVisible( !nucleotide );
\r
177 //Remember AlignFrame always starts as protein
\r
180 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
186 Added so Castor Mapping file can obtain Jalview Version
\r
188 public String getVersion()
\r
190 return jalview.bin.Cache.getProperty("VERSION");
\r
193 public FeatureRenderer getFeatureRenderer()
\r
195 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
\r
199 public void fetchSequence_actionPerformed(ActionEvent e)
\r
201 new SequenceFetcher(this);
\r
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 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
711 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
714 if (title.startsWith("Copied sequences"))
\r
720 newtitle = newtitle.concat("- from " + title);
\r
723 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
724 NEW_WINDOW_HEIGHT);
\r
729 for (int i = 0; i < sequences.length; i++)
\r
731 Sequence newseq = new Sequence(sequences[i].getName(),
\r
732 sequences[i].getSequence(), sequences[i].getStart(),
\r
733 sequences[i].getEnd());
\r
734 viewport.alignment.addSequence(newseq);
\r
735 if(sequences[i].getDatasetSequence()==null)
\r
737 ////////////////////////////
\r
738 //Datset needs extension;
\r
739 /////////////////////////////
\r
740 Sequence ds = new Sequence(sequences[i].getName(),
\r
741 AlignSeq.extractGaps("-. ", sequences[i].getSequence()),
\r
742 sequences[i].getStart(),
\r
743 sequences[i].getEnd());
\r
744 newseq.setDatasetSequence(ds);
\r
745 viewport.alignment.getDataset().addSequence(ds);
\r
749 newseq.setDatasetSequence(sequences[i].getDatasetSequence());
\r
750 if(sequences[i].getDatasetSequence().getAnnotation()!=null)
\r
752 for(int aa=0; aa<sequences[i].getDatasetSequence().getAnnotation().length; aa++)
\r
754 viewport.alignment.addAnnotation(sequences[i].getDatasetSequence().getAnnotation()[aa]);
\r
759 viewport.setEndSeq(viewport.alignment.getHeight());
\r
760 viewport.alignment.getWidth();
\r
761 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
764 catch (Exception ex)
\r
766 ex.printStackTrace();
\r
767 System.out.println("Exception whilst pasting: "+ex);
\r
768 // could be anything being pasted in here
\r
777 * @param e DOCUMENT ME!
\r
779 protected void cut_actionPerformed(ActionEvent e)
\r
781 copy_actionPerformed(null);
\r
782 delete_actionPerformed(null);
\r
788 * @param e DOCUMENT ME!
\r
790 protected void delete_actionPerformed(ActionEvent e)
\r
793 if (viewport.getSelectionGroup() == null)
\r
799 SequenceGroup sg = viewport.getSelectionGroup();
\r
803 //Jalview no longer allows deletion of residues.
\r
804 //Check here whether any residues are in selection area
\r
805 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
807 for (int i = 0; i < sg.sequences.size(); i++)
\r
809 SequenceI seq = sg.getSequenceAt(i);
\r
810 int j = sg.getStartRes();
\r
813 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
815 JOptionPane.showInternalMessageDialog(
\r
816 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
817 + "Try hiding columns instead.",
\r
818 "Deletion of residues not permitted",
\r
819 JOptionPane.WARNING_MESSAGE);
\r
824 }while(j<=sg.getEndRes());
\r
829 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
830 HistoryItem.HIDE));
\r
833 for (int i = 0; i < sg.sequences.size(); i++)
\r
835 SequenceI seq = sg.getSequenceAt(i);
\r
836 int index = viewport.getAlignment().findIndex(seq);
\r
838 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
840 // If the cut affects all sequences, remove highlighted columns
\r
841 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
843 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
844 sg.getEndRes() + 1);
\r
847 if (seq.getSequence().length() < 1)
\r
849 viewport.getAlignment().deleteSequence(seq);
\r
853 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
857 viewport.setSelectionGroup(null);
\r
858 viewport.alignment.deleteGroup(sg);
\r
860 viewport.firePropertyChange("alignment", null,
\r
861 viewport.getAlignment().getSequences());
\r
865 if (viewport.getAlignment().getHeight() < 1)
\r
869 this.setClosed(true);
\r
871 catch (Exception ex)
\r
880 * @param e DOCUMENT ME!
\r
882 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
884 viewport.alignment.deleteAllGroups();
\r
885 viewport.setSelectionGroup(null);
\r
886 alignPanel.repaint();
\r
892 * @param e DOCUMENT ME!
\r
894 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
896 SequenceGroup sg = new SequenceGroup();
\r
898 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
901 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
904 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
905 viewport.setSelectionGroup(sg);
\r
906 PaintRefresher.Refresh(null, viewport.alignment);
\r
912 * @param e DOCUMENT ME!
\r
914 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
916 if(viewport.cursorMode)
\r
918 alignPanel.seqPanel.keyboardNo1 = null;
\r
919 alignPanel.seqPanel.keyboardNo2 = null;
\r
921 viewport.setSelectionGroup(null);
\r
922 viewport.getColumnSelection().clear();
\r
923 viewport.setSelectionGroup(null);
\r
924 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
925 alignPanel.idPanel.idCanvas.searchResults = null;
\r
926 PaintRefresher.Refresh(null, viewport.alignment);
\r
932 * @param e DOCUMENT ME!
\r
934 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
936 SequenceGroup sg = viewport.getSelectionGroup();
\r
940 selectAllSequenceMenuItem_actionPerformed(null);
\r
945 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
948 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
951 PaintRefresher.Refresh(null, viewport.alignment);
\r
957 * @param e DOCUMENT ME!
\r
959 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
961 ColumnSelection colSel = viewport.getColumnSelection();
\r
963 if (colSel.size() > 0)
\r
965 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
966 HistoryItem.HIDE));
\r
968 int min = colSel.getMin();
\r
969 viewport.getAlignment().trimLeft(min);
\r
970 colSel.compensateForEdit(0, min);
\r
972 if (viewport.getSelectionGroup() != null)
\r
974 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
977 Vector groups = viewport.alignment.getGroups();
\r
979 for (int i = 0; i < groups.size(); i++)
\r
981 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
983 if (!sg.adjustForRemoveLeft(min))
\r
985 viewport.alignment.deleteGroup(sg);
\r
989 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
996 * @param e DOCUMENT ME!
\r
998 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1000 ColumnSelection colSel = viewport.getColumnSelection();
\r
1002 if (colSel.size() > 0)
\r
1004 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1005 HistoryItem.HIDE));
\r
1007 int max = colSel.getMax();
\r
1008 viewport.getAlignment().trimRight(max);
\r
1010 if (viewport.getSelectionGroup() != null)
\r
1012 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1015 Vector groups = viewport.alignment.getGroups();
\r
1017 for (int i = 0; i < groups.size(); i++)
\r
1019 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1021 if (!sg.adjustForRemoveRight(max))
\r
1023 viewport.alignment.deleteGroup(sg);
\r
1027 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1034 * @param e DOCUMENT ME!
\r
1036 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1038 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1039 viewport.alignment, HistoryItem.HIDE));
\r
1041 //This is to maintain viewport position on first residue
\r
1042 //of first sequence
\r
1043 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1044 int startRes = seq.findPosition(viewport.startRes);
\r
1046 viewport.getAlignment().removeGaps();
\r
1048 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1050 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1056 * @param e DOCUMENT ME!
\r
1058 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1060 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1061 HistoryItem.HIDE));
\r
1063 //This is to maintain viewport position on first residue
\r
1064 //of first sequence
\r
1065 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1066 int startRes = seq.findPosition(viewport.startRes);
\r
1069 SequenceI current;
\r
1072 Vector seqs = null;
\r
1075 int end = viewport.alignment.getWidth();
\r
1077 if (viewport.getSelectionGroup() != null
\r
1078 && viewport.getSelectionGroup().sequences != null
\r
1079 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1081 seqs = viewport.getSelectionGroup().sequences;
\r
1082 start = viewport.getSelectionGroup().getStartRes();
\r
1083 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1087 seqs = viewport.alignment.getSequences();
\r
1090 for (int i = 0; i < seqs.size(); i++)
\r
1092 current = (SequenceI) seqs.elementAt(i);
\r
1093 jSize = current.getLength();
\r
1095 // Removing a range is much quicker than removing gaps
\r
1096 // one by one for long sequences
\r
1098 int rangeStart=-1, rangeEnd=-1;
\r
1102 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1104 if(rangeStart==-1)
\r
1119 current.deleteChars(rangeStart, rangeEnd);
\r
1120 j-=rangeEnd-rangeStart;
\r
1121 jSize-=rangeEnd-rangeStart;
\r
1129 while (j < end && j < jSize);
\r
1132 current.deleteChars(rangeStart, rangeEnd);
\r
1136 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1138 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1141 public void alignmentChanged()
\r
1143 if(viewport.padGaps)
\r
1144 viewport.getAlignment().padGaps();
\r
1146 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1148 viewport.updateConsensus();
\r
1149 viewport.updateConservation();
\r
1151 resetAllColourSchemes();
\r
1152 if(alignPanel.overviewPanel!=null)
\r
1153 alignPanel.overviewPanel.updateOverviewImage();
\r
1155 viewport.alignment.adjustSequenceAnnotations();
\r
1157 alignPanel.repaint();
\r
1160 void resetAllColourSchemes()
\r
1162 ColourSchemeI cs = viewport.globalColourScheme;
\r
1165 if (cs instanceof ClustalxColourScheme)
\r
1167 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1168 resetClustalX(viewport.alignment.getSequences(),
\r
1169 viewport.alignment.getWidth());
\r
1172 cs.setConsensus(viewport.vconsensus);
\r
1173 if (cs.conservationApplied())
\r
1175 Alignment al = (Alignment) viewport.alignment;
\r
1176 Conservation c = new Conservation("All",
\r
1177 ResidueProperties.propHash, 3,
\r
1178 al.getSequences(), 0,
\r
1179 al.getWidth() - 1);
\r
1181 c.verdict(false, viewport.ConsPercGaps);
\r
1183 cs.setConservation(c);
\r
1187 int s, sSize = viewport.alignment.getGroups().size();
\r
1188 for(s=0; s<sSize; s++)
\r
1190 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1191 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1193 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1195 sg.recalcConservation();
\r
1202 * @param e DOCUMENT ME!
\r
1204 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1206 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1207 HistoryItem.HIDE));
\r
1209 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1211 // if (viewport.padGaps)
\r
1212 alignmentChanged();
\r
1218 * @param e DOCUMENT ME!
\r
1220 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1222 JInternalFrame frame = new JInternalFrame();
\r
1223 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1224 frame.setContentPane(finder);
\r
1225 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1226 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1232 * @param e DOCUMENT ME!
\r
1234 public void font_actionPerformed(ActionEvent e)
\r
1236 new FontChooser(alignPanel);
\r
1239 public void smoothFont_actionPerformed(ActionEvent e)
\r
1241 viewport.antiAlias = smoothFont.isSelected();
\r
1242 alignPanel.annotationPanel.image = null;
\r
1243 alignPanel.repaint();
\r
1250 * @param e DOCUMENT ME!
\r
1252 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1254 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1256 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1257 alignPanel.repaint();
\r
1264 * @param e DOCUMENT ME!
\r
1266 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1268 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1269 alignPanel.repaint();
\r
1275 * @param e DOCUMENT ME!
\r
1277 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1279 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1280 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1281 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1282 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1283 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1284 alignPanel.repaint();
\r
1290 * @param e DOCUMENT ME!
\r
1292 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1294 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1295 alignPanel.repaint();
\r
1301 * @param e DOCUMENT ME!
\r
1303 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1305 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1306 alignPanel.repaint();
\r
1312 * @param e DOCUMENT ME!
\r
1314 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1316 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1317 alignPanel.repaint();
\r
1323 * @param e DOCUMENT ME!
\r
1325 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1327 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1328 alignPanel.repaint();
\r
1334 * @param e DOCUMENT ME!
\r
1336 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1338 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1339 alignPanel.repaint();
\r
1345 * @param e DOCUMENT ME!
\r
1347 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1349 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1350 alignPanel.repaint();
\r
1353 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1355 if (!viewport.alignment.isNucleotide())
\r
1357 new SequenceFeatureFetcher(viewport.
\r
1360 viewport.setShowSequenceFeatures(true);
\r
1361 showSeqFeatures.setSelected(true);
\r
1366 public void featureSettings_actionPerformed(ActionEvent e)
\r
1368 new FeatureSettings(viewport, alignPanel);
\r
1374 * @param evt DOCUMENT ME!
\r
1376 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1378 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1379 alignPanel.repaint();
\r
1380 if (alignPanel.getOverviewPanel() != null)
\r
1382 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1389 * @param e DOCUMENT ME!
\r
1391 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1393 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1394 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1400 * @param e DOCUMENT ME!
\r
1402 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1404 if (alignPanel.overviewPanel != null)
\r
1409 JInternalFrame frame = new JInternalFrame();
\r
1410 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1411 frame.setContentPane(overview);
\r
1412 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1413 frame.getWidth(), frame.getHeight());
\r
1415 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1416 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1418 public void internalFrameClosed(
\r
1419 javax.swing.event.InternalFrameEvent evt)
\r
1421 alignPanel.setOverviewPanel(null);
\r
1426 alignPanel.setOverviewPanel(overview);
\r
1432 * @param e DOCUMENT ME!
\r
1434 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1436 changeColour(null);
\r
1442 * @param e DOCUMENT ME!
\r
1444 public void clustalColour_actionPerformed(ActionEvent e)
\r
1446 changeColour(new ClustalxColourScheme(
\r
1447 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1453 * @param e DOCUMENT ME!
\r
1455 public void zappoColour_actionPerformed(ActionEvent e)
\r
1457 changeColour(new ZappoColourScheme());
\r
1463 * @param e DOCUMENT ME!
\r
1465 public void taylorColour_actionPerformed(ActionEvent e)
\r
1467 changeColour(new TaylorColourScheme());
\r
1473 * @param e DOCUMENT ME!
\r
1475 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1477 changeColour(new HydrophobicColourScheme());
\r
1483 * @param e DOCUMENT ME!
\r
1485 public void helixColour_actionPerformed(ActionEvent e)
\r
1487 changeColour(new HelixColourScheme());
\r
1493 * @param e DOCUMENT ME!
\r
1495 public void strandColour_actionPerformed(ActionEvent e)
\r
1497 changeColour(new StrandColourScheme());
\r
1503 * @param e DOCUMENT ME!
\r
1505 public void turnColour_actionPerformed(ActionEvent e)
\r
1507 changeColour(new TurnColourScheme());
\r
1513 * @param e DOCUMENT ME!
\r
1515 public void buriedColour_actionPerformed(ActionEvent e)
\r
1517 changeColour(new BuriedColourScheme());
\r
1523 * @param e DOCUMENT ME!
\r
1525 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1527 changeColour(new NucleotideColourScheme());
\r
1530 public void annotationColour_actionPerformed(ActionEvent e)
\r
1532 new AnnotationColourChooser(viewport, alignPanel);
\r
1539 * @param e DOCUMENT ME!
\r
1541 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1543 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1549 * @param cs DOCUMENT ME!
\r
1551 void changeColour(ColourSchemeI cs)
\r
1553 int threshold = 0;
\r
1557 if (viewport.getAbovePIDThreshold())
\r
1559 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1562 cs.setThreshold(threshold,
\r
1563 viewport.getIgnoreGapsConsensus());
\r
1565 viewport.setGlobalColourScheme(cs);
\r
1569 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1572 if (viewport.getConservationSelected())
\r
1575 Alignment al = (Alignment) viewport.alignment;
\r
1576 Conservation c = new Conservation("All",
\r
1577 ResidueProperties.propHash, 3,
\r
1578 al.getSequences(), 0,
\r
1579 al.getWidth() - 1);
\r
1582 c.verdict(false, viewport.ConsPercGaps);
\r
1584 cs.setConservation(c);
\r
1586 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1591 cs.setConservation(null);
\r
1594 cs.setConsensus(viewport.vconsensus);
\r
1597 viewport.setGlobalColourScheme(cs);
\r
1599 if (viewport.getColourAppliesToAllGroups())
\r
1601 Vector groups = viewport.alignment.getGroups();
\r
1603 for (int i = 0; i < groups.size(); i++)
\r
1605 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1613 if (cs instanceof ClustalxColourScheme)
\r
1615 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1617 else if (cs instanceof UserColourScheme)
\r
1619 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1625 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1627 catch (Exception ex)
\r
1632 if (viewport.getAbovePIDThreshold()
\r
1633 || cs instanceof PIDColourScheme
\r
1634 || cs instanceof Blosum62ColourScheme)
\r
1636 sg.cs.setThreshold(threshold,
\r
1637 viewport.getIgnoreGapsConsensus());
\r
1639 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1643 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1646 if (viewport.getConservationSelected())
\r
1648 Conservation c = new Conservation("Group",
\r
1649 ResidueProperties.propHash, 3,
\r
1651 viewport.alignment.getWidth() - 1);
\r
1653 c.verdict(false, viewport.ConsPercGaps);
\r
1654 sg.cs.setConservation(c);
\r
1657 sg.cs.setConservation(null);
\r
1661 if (alignPanel.getOverviewPanel() != null)
\r
1663 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1666 alignPanel.repaint();
\r
1672 * @param e DOCUMENT ME!
\r
1674 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1676 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1678 SliderPanel.setPIDSliderSource(alignPanel,
\r
1679 viewport.getGlobalColourScheme(),
\r
1681 SliderPanel.showPIDSlider();
\r
1688 * @param e DOCUMENT ME!
\r
1690 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1692 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1694 SliderPanel.setConservationSlider(alignPanel,
\r
1695 viewport.globalColourScheme,
\r
1697 SliderPanel.showConservationSlider();
\r
1704 * @param e DOCUMENT ME!
\r
1706 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1708 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1710 viewport.setAbovePIDThreshold(false);
\r
1711 abovePIDThreshold.setSelected(false);
\r
1713 changeColour(viewport.getGlobalColourScheme());
\r
1715 modifyConservation_actionPerformed(null);
\r
1721 * @param e DOCUMENT ME!
\r
1723 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1725 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1727 conservationMenuItem.setSelected(false);
\r
1728 viewport.setConservationSelected(false);
\r
1730 changeColour(viewport.getGlobalColourScheme());
\r
1732 modifyPID_actionPerformed(null);
\r
1738 * @param e DOCUMENT ME!
\r
1740 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1742 if (e.getActionCommand().equals("User Defined..."))
\r
1744 new UserDefinedColours(alignPanel, null);
\r
1748 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1749 getUserColourSchemes().get(e.getActionCommand());
\r
1751 changeColour(udc);
\r
1755 public void updateUserColourMenu()
\r
1758 Component[] menuItems = colourMenu.getMenuComponents();
\r
1759 int i, iSize = menuItems.length;
\r
1760 for (i = 0; i < iSize; i++)
\r
1762 if (menuItems[i].getName() != null &&
\r
1763 menuItems[i].getName().equals("USER_DEFINED"))
\r
1765 colourMenu.remove(menuItems[i]);
\r
1769 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1771 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1772 getUserColourSchemes().keys();
\r
1774 while (userColours.hasMoreElements())
\r
1776 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1777 nextElement().toString());
\r
1778 radioItem.setName("USER_DEFINED");
\r
1779 radioItem.addMouseListener(new MouseAdapter()
\r
1781 public void mousePressed(MouseEvent evt)
\r
1783 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1785 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1787 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1788 "Remove from default list?",
\r
1789 "Remove user defined colour",
\r
1790 JOptionPane.YES_NO_OPTION);
\r
1791 if(option == JOptionPane.YES_OPTION)
\r
1793 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1794 colourMenu.remove(radioItem);
\r
1797 radioItem.addActionListener(new ActionListener()
\r
1799 public void actionPerformed(ActionEvent evt)
\r
1801 userDefinedColour_actionPerformed(evt);
\r
1807 radioItem.addActionListener(new ActionListener()
\r
1809 public void actionPerformed(ActionEvent evt)
\r
1811 userDefinedColour_actionPerformed(evt);
\r
1815 colourMenu.insert(radioItem, 15);
\r
1816 colours.add(radioItem);
\r
1824 * @param e DOCUMENT ME!
\r
1826 public void PIDColour_actionPerformed(ActionEvent e)
\r
1828 changeColour(new PIDColourScheme());
\r
1834 * @param e DOCUMENT ME!
\r
1836 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1838 changeColour(new Blosum62ColourScheme());
\r
1844 * @param e DOCUMENT ME!
\r
1846 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1848 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1849 HistoryItem.SORT));
\r
1850 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1851 viewport.getAlignment().getSequenceAt(0));
\r
1852 alignPanel.repaint();
\r
1858 * @param e DOCUMENT ME!
\r
1860 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1862 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1863 HistoryItem.SORT));
\r
1864 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1865 alignPanel.repaint();
\r
1871 * @param e DOCUMENT ME!
\r
1873 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1875 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1876 HistoryItem.SORT));
\r
1878 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1879 alignPanel.repaint();
\r
1885 * @param e DOCUMENT ME!
\r
1887 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1889 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1890 JInternalFrame frame = new JInternalFrame();
\r
1891 frame.setContentPane(sp);
\r
1892 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1899 * @param e DOCUMENT ME!
\r
1901 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1903 if ( (viewport.getSelectionGroup() == null) ||
\r
1904 (viewport.getSelectionGroup().getSize() < 2))
\r
1906 JOptionPane.showInternalMessageDialog(this,
\r
1907 "You must select at least 2 sequences.",
\r
1908 "Invalid Selection",
\r
1909 JOptionPane.WARNING_MESSAGE);
\r
1913 JInternalFrame frame = new JInternalFrame();
\r
1914 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1915 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1922 * @param e DOCUMENT ME!
\r
1924 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1926 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1927 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1928 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1929 (viewport.getAlignment().getHeight() < 4))
\r
1931 JOptionPane.showInternalMessageDialog(this,
\r
1932 "Principal component analysis must take\n" +
\r
1933 "at least 4 input sequences.",
\r
1934 "Sequence selection insufficient",
\r
1935 JOptionPane.WARNING_MESSAGE);
\r
1940 new PCAPanel(viewport);
\r
1944 public void autoCalculate_actionPerformed(ActionEvent e)
\r
1946 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
1953 * @param e DOCUMENT ME!
\r
1955 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1957 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1963 * @param e DOCUMENT ME!
\r
1965 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1967 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1973 * @param e DOCUMENT ME!
\r
1975 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1977 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1983 * @param e DOCUMENT ME!
\r
1985 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1987 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1993 * @param type DOCUMENT ME!
\r
1994 * @param pwType DOCUMENT ME!
\r
1995 * @param title DOCUMENT ME!
\r
1997 void NewTreePanel(String type, String pwType, String title)
\r
2001 if ( (viewport.getSelectionGroup() != null) &&
\r
2002 (viewport.getSelectionGroup().getSize() > 3))
\r
2005 SequenceGroup sg = viewport.getSelectionGroup();
\r
2007 /* Decide if the selection is a column region */
\r
2008 while (s < sg.sequences.size())
\r
2010 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
2013 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2014 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2015 "Try using the Pad function in the edit menu,\n" +
\r
2016 "or one of the multiple sequence alignment web services.",
\r
2017 "Sequences in selection are not aligned",
\r
2018 JOptionPane.WARNING_MESSAGE);
\r
2024 title = title + " on region";
\r
2025 tp = new TreePanel(viewport,
\r
2026 viewport.getSelectionGroup().sequences, type, pwType,
\r
2027 sg.getStartRes(), sg.getEndRes());
\r
2031 //are the sequences aligned?
\r
2032 if (!viewport.alignment.isAligned())
\r
2034 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2035 "The sequences must be aligned before creating a tree.\n" +
\r
2036 "Try using the Pad function in the edit menu,\n" +
\r
2037 "or one of the multiple sequence alignment web services.",
\r
2038 "Sequences not aligned",
\r
2039 JOptionPane.WARNING_MESSAGE);
\r
2044 tp = new TreePanel(viewport,
\r
2045 viewport.getAlignment().getSequences(), type, pwType,
\r
2047 viewport.alignment.getWidth());
\r
2050 addTreeMenuItem(tp, title);
\r
2052 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2058 * @param title DOCUMENT ME!
\r
2059 * @param order DOCUMENT ME!
\r
2061 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2063 final JMenuItem item = new JMenuItem("by " + title);
\r
2065 item.addActionListener(new java.awt.event.ActionListener()
\r
2067 public void actionPerformed(ActionEvent e)
\r
2069 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2070 HistoryItem.SORT));
\r
2072 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2073 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2074 alignPanel.repaint();
\r
2080 * Maintain the Order by->Displayed Tree menu.
\r
2081 * Creates a new menu item for a TreePanel with an appropriate
\r
2082 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2083 * to remove the menu item when the treePanel is closed, and adjust
\r
2084 * the tree leaf to sequence mapping when the alignment is modified.
\r
2085 * @param treePanel Displayed tree window.
\r
2086 * @param title SortBy menu item title.
\r
2088 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2090 final JMenuItem item = new JMenuItem(title);
\r
2094 if (treeCount == 1)
\r
2096 sort.add(sortByTreeMenu);
\r
2099 sortByTreeMenu.add(item);
\r
2100 item.addActionListener(new java.awt.event.ActionListener()
\r
2102 public void actionPerformed(ActionEvent e)
\r
2104 addHistoryItem(new HistoryItem("Tree Sort",
\r
2105 viewport.alignment, HistoryItem.SORT));
\r
2106 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2107 treePanel.getTree());
\r
2108 alignPanel.repaint();
\r
2112 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2113 InternalFrameAdapter()
\r
2115 public void internalFrameClosed(
\r
2116 javax.swing.event.InternalFrameEvent evt)
\r
2119 sortByTreeMenu.remove(item);
\r
2121 if (treeCount == 0)
\r
2123 sort.remove(sortByTreeMenu);
\r
2131 * Work out whether the whole set of sequences
\r
2132 * or just the selected set will be submitted for multiple alignment.
\r
2135 private SequenceI[] gatherSequencesForAlignment()
\r
2137 // Now, check we have enough sequences
\r
2138 SequenceI[] msa = null;
\r
2140 if ( (viewport.getSelectionGroup() != null) &&
\r
2141 (viewport.getSelectionGroup().getSize() > 1))
\r
2143 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2144 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2146 msa = new SequenceI[sz = seqs.getSize()];
\r
2148 for (int i = 0; i < sz; i++)
\r
2150 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2155 Vector seqs = viewport.getAlignment().getSequences();
\r
2157 if (seqs.size() > 1)
\r
2159 msa = new SequenceI[seqs.size()];
\r
2161 for (int i = 0; i < seqs.size(); i++)
\r
2163 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2171 * Decides what is submitted to a secondary structure prediction service,
\r
2172 * the currently selected sequence, or the currently selected alignment
\r
2173 * (where the first sequence in the set is the one that the prediction
\r
2176 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2178 SequenceI seq = null;
\r
2179 SequenceI[] msa = null;
\r
2181 if ( (viewport.getSelectionGroup() != null) &&
\r
2182 (viewport.getSelectionGroup().getSize() > 0))
\r
2184 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2185 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2187 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2189 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2194 msa = new SequenceI[sz = seqs.getSize()];
\r
2196 for (int i = 0; i < sz; i++)
\r
2198 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2204 Vector seqs = viewport.getAlignment().getSequences();
\r
2206 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2208 seq = (SequenceI) seqs.elementAt(0);
\r
2212 msa = new SequenceI[seqs.size()];
\r
2214 for (int i = 0; i < seqs.size(); i++)
\r
2216 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2228 return new SequenceI[]
\r
2238 * @param e DOCUMENT ME!
\r
2240 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2242 // Pick the tree file
\r
2243 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2245 "LAST_DIRECTORY"));
\r
2246 chooser.setFileView(new JalviewFileView());
\r
2247 chooser.setDialogTitle("Select a newick-like tree file");
\r
2248 chooser.setToolTipText("Load a tree file");
\r
2250 int value = chooser.showOpenDialog(null);
\r
2252 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2254 String choice = chooser.getSelectedFile().getPath();
\r
2255 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2259 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2261 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2263 catch (Exception ex)
\r
2265 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2266 "Problem reading tree file",
\r
2268 JOptionPane.WARNING_MESSAGE);
\r
2269 ex.printStackTrace();
\r
2275 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2277 return ShowNewickTree(nf,title,600,500,4,5);
\r
2282 * @param nf DOCUMENT ME!
\r
2283 * @param title DOCUMENT ME!
\r
2285 * @return DOCUMENT ME!
\r
2287 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2289 TreePanel tp = null;
\r
2295 if (nf.getTree() != null)
\r
2297 tp = new TreePanel(viewport,
\r
2298 viewport.getAlignment().getSequences(), nf,
\r
2305 tp.setLocation(x,y);
\r
2308 Desktop.addInternalFrame(tp, title, w, h);
\r
2309 addTreeMenuItem(tp, title);
\r
2312 catch (Exception ex)
\r
2314 ex.printStackTrace();
\r
2325 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2326 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2327 printJob.setPrintable(alignPanel, pf);
\r
2329 if (printJob.printDialog())
\r
2335 catch (Exception PrintException)
\r
2337 PrintException.printStackTrace();
\r
2344 * Generates menu items and listener event actions for web service clients
\r
2347 public void BuildWebServiceMenu()
\r
2349 if ( (Discoverer.services != null)
\r
2350 && (Discoverer.services.size() > 0))
\r
2352 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2353 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2354 Vector wsmenu = new Vector();
\r
2355 if (msaws != null)
\r
2357 // Add any Multiple Sequence Alignment Services
\r
2358 final JMenu msawsmenu = new JMenu("Alignment");
\r
2359 final AlignFrame af = this;
\r
2360 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2362 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2364 final JMenuItem method = new JMenuItem(sh.getName());
\r
2365 method.addActionListener(new ActionListener()
\r
2367 public void actionPerformed(ActionEvent e)
\r
2369 SequenceI[] msa = gatherSequencesForAlignment();
\r
2370 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2371 false, true, viewport.getAlignment().getDataset(), af);
\r
2376 msawsmenu.add(method);
\r
2377 // Deal with services that we know accept partial alignments.
\r
2378 if (sh.getName().indexOf("lustal") > -1)
\r
2380 // We know that ClustalWS can accept partial alignments for refinement.
\r
2381 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2382 methodR.addActionListener(new ActionListener()
\r
2384 public void actionPerformed(ActionEvent e)
\r
2386 SequenceI[] msa = gatherSequencesForAlignment();
\r
2387 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2388 true, true, viewport.getAlignment().getDataset(), af);
\r
2393 msawsmenu.add(methodR);
\r
2397 wsmenu.add(msawsmenu);
\r
2399 if (secstrpr != null)
\r
2401 // Add any secondary structure prediction services
\r
2402 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2403 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2405 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2407 final JMenuItem method = new JMenuItem(sh.getName());
\r
2408 method.addActionListener(new ActionListener()
\r
2410 public void actionPerformed(ActionEvent e)
\r
2412 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2413 if (msa.length == 1)
\r
2415 // Single Sequence prediction
\r
2416 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2420 if (msa.length > 1)
\r
2422 // Single Sequence prediction
\r
2423 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2429 secstrmenu.add(method);
\r
2431 wsmenu.add(secstrmenu);
\r
2433 this.webService.removeAll();
\r
2434 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2436 webService.add( (JMenu) wsmenu.get(i));
\r
2441 this.webService.removeAll();
\r
2442 this.webService.add(this.webServiceNoServices);
\r
2444 // TODO: add in rediscovery function
\r
2445 // TODO: reduce code redundancy.
\r
2446 // TODO: group services by location as well as function.
\r
2449 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2451 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2452 getProperty("LAST_DIRECTORY"));
\r
2454 chooser.setFileView(new JalviewFileView());
\r
2455 chooser.setDialogTitle("Export to Vamsas file");
\r
2456 chooser.setToolTipText("Export");
\r
2458 int value = chooser.showSaveDialog(this);
\r
2460 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2462 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2463 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2464 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2472 public void showTranslation_actionPerformed(ActionEvent e)
\r
2474 int s, sSize = viewport.alignment.getHeight();
\r
2475 SequenceI [] newSeq = new SequenceI[sSize];
\r
2478 StringBuffer protein;
\r
2480 for(s=0; s<sSize; s++)
\r
2482 protein = new StringBuffer();
\r
2483 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2484 resSize = seq.length();
\r
2485 resSize -= resSize%3;
\r
2487 for(res = 0; res < resSize; res+=3)
\r
2489 String codon = seq.substring(res, res+3);
\r
2490 codon = codon.replace('U', 'T');
\r
2491 String aa = ResidueProperties.codonTranslate(codon);
\r
2493 protein.append(viewport.getGapCharacter());
\r
2494 else if(aa.equals("STOP"))
\r
2495 protein.append("X");
\r
2497 protein.append( aa );
\r
2499 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2503 AlignmentI al = new Alignment(newSeq);
\r
2504 al.setDataset(null);
\r
2507 ////////////////////////////////
\r
2508 // Copy annotations across
\r
2509 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2510 = viewport.alignment.getAlignmentAnnotation();
\r
2512 if(annotations!=null)
\r
2514 for (int i = 0; i < annotations.length; i++)
\r
2516 if (annotations[i].label.equals("Quality") ||
\r
2517 annotations[i].label.equals("Conservation") ||
\r
2518 annotations[i].label.equals("Consensus"))
\r
2523 aSize = viewport.alignment.getWidth() / 3;
\r
2524 jalview.datamodel.Annotation[] anots =
\r
2525 new jalview.datamodel.Annotation[aSize];
\r
2527 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2529 if (annotations[i].annotations[a] == null
\r
2530 || annotations[i].annotations[a] == null)
\r
2533 anots[a / 3] = new Annotation(
\r
2534 annotations[i].annotations[a].displayCharacter,
\r
2535 annotations[i].annotations[a].description,
\r
2536 annotations[i].annotations[a].secondaryStructure,
\r
2537 annotations[i].annotations[a].value,
\r
2538 annotations[i].annotations[a].colour);
\r
2541 jalview.datamodel.AlignmentAnnotation aa
\r
2542 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2543 annotations[i].description, anots);
\r
2544 al.addAnnotation(aa);
\r
2548 AlignFrame af = new AlignFrame(al);
\r
2549 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2551 NEW_WINDOW_HEIGHT);
\r
2554 // AlignViewport newViewport = new AlignViewport(al);
\r
2555 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2556 // tabbedPane.add("Protein", ap);
\r
2557 // viewports.add(newViewport);
\r
2558 // alignPanels.add(ap);
\r
2561 /////////////////////////
\r
2563 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2564 // ds.setDataset(true);
\r
2565 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2566 // tabbedPane.add("Dataset", dap);
\r
2567 // viewports.add(ds);
\r
2568 // alignPanels.add(dap);
\r
2569 /////////////////////////
\r
2574 /*public void tabSelected()
\r
2576 int index = tabbedPane.getSelectedIndex();
\r
2577 viewport = (AlignViewport)viewports.elementAt(index);
\r
2578 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2584 * @param String DOCUMENT ME!
\r
2586 public boolean parseGroupsFile(String file)
\r
2588 String line = null;
\r
2591 BufferedReader in = new BufferedReader(new FileReader(file));
\r
2592 SequenceI seq = null;
\r
2593 String type, desc, token;
\r
2595 int index, start, end;
\r
2596 StringTokenizer st;
\r
2597 SequenceFeature sf;
\r
2599 String featureGroup = null;
\r
2600 while ( (line = in.readLine()) != null)
\r
2603 st = new StringTokenizer(line, "\t");
\r
2604 if (st.countTokens() == 2)
\r
2606 type = st.nextToken();
\r
2607 if (type.equalsIgnoreCase("startgroup"))
\r
2609 featureGroup = st.nextToken();
\r
2611 else if (type.equalsIgnoreCase("endgroup"))
\r
2613 //We should check whether this is the current group,
\r
2614 //but at present theres no way of showing more than 1 group
\r
2616 featureGroup = null;
\r
2620 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2621 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type,
\r
2622 ucs.findColour("A"));
\r
2627 while (st.hasMoreElements())
\r
2629 desc = st.nextToken();
\r
2630 token = st.nextToken();
\r
2631 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2633 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2638 index = Integer.parseInt(st.nextToken());
\r
2641 start = Integer.parseInt(st.nextToken());
\r
2642 end = Integer.parseInt(st.nextToken());
\r
2644 seq = viewport.alignment.getSequenceAt(index);
\r
2646 type = st.nextToken();
\r
2648 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2650 // Probably the old style groups file
\r
2651 UserColourScheme ucs = new UserColourScheme(type);
\r
2652 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2655 sf = new SequenceFeature(type, desc, "", start, end, featureGroup);
\r
2657 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2661 catch (Exception ex)
\r
2663 System.out.println(line);
\r
2664 ex.printStackTrace();
\r
2665 System.out.println("Error parsing groups file: " + ex +"\n"+line);
\r
2669 viewport.showSequenceFeatures = true;
\r
2670 showSeqFeatures.setSelected(true);
\r
2671 alignPanel.repaint();
\r
2675 public void dragEnter(DropTargetDragEvent evt)
\r
2678 public void dragExit(DropTargetEvent evt)
\r
2681 public void dragOver(DropTargetDragEvent evt)
\r
2684 public void dropActionChanged(DropTargetDragEvent evt)
\r
2687 public void drop(DropTargetDropEvent evt)
\r
2689 Transferable t = evt.getTransferable();
\r
2690 java.util.List files = null;
\r
2694 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2695 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2697 //Works on Windows and MacOSX
\r
2698 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2699 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2701 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2703 // This is used by Unix drag system
\r
2704 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2705 String data = (String) t.getTransferData(uriListFlavor);
\r
2706 files = new java.util.ArrayList(1);
\r
2707 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2710 st.hasMoreTokens(); )
\r
2712 String s = st.nextToken();
\r
2713 if (s.startsWith("#"))
\r
2715 // the line is a comment (as per the RFC 2483)
\r
2719 java.net.URI uri = new java.net.URI(s);
\r
2720 java.io.File file = new java.io.File(uri);
\r
2725 catch (Exception e)
\r
2727 e.printStackTrace();
\r
2729 if (files != null)
\r
2734 for (int i = 0; i < files.size(); i++)
\r
2736 loadJalviewDataFile(files.get(i).toString());
\r
2739 catch (Exception ex)
\r
2741 ex.printStackTrace();
\r
2746 // This method will attempt to load a "dropped" file first by testing
\r
2747 // whether its and Annotation file, then features file. If both are
\r
2748 // false then the user may have dropped an alignment file onto this
\r
2750 public void loadJalviewDataFile(String file)
\r
2753 boolean isAnnotation = new AnnotationReader().readAnnotationFile(viewport.
\r
2756 if (!isAnnotation)
\r
2758 boolean isGroupsFile = parseGroupsFile(file);
\r
2759 if (!isGroupsFile)
\r
2761 String protocol = "File";
\r
2762 String format = new IdentifyFile().Identify(file, protocol);
\r
2763 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2766 FastaFile ff = new FastaFile();
\r
2767 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2768 c.setContents(new StringSelection(ff.print(sequences)), this);
\r
2770 this.paste(false);
\r
2776 int height = alignPanel.annotationPanel.adjustPanelHeight();
\r
2777 alignPanel.annotationScroller.setPreferredSize(
\r
2778 new Dimension(alignPanel.annotationScroller.getWidth(),
\r
2781 alignPanel.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
\r
2782 alignPanel.annotationSpaceFillerHolder.getWidth(),
\r
2785 alignPanel.addNotify();
\r
2788 }catch(Exception ex)
\r
2790 ex.printStackTrace();
\r