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
1947 if(viewport.autoCalculateConsensus)
\r
1949 alignmentChanged();
\r
1957 * @param e DOCUMENT ME!
\r
1959 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1961 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1967 * @param e DOCUMENT ME!
\r
1969 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1971 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1977 * @param e DOCUMENT ME!
\r
1979 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1981 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1987 * @param e DOCUMENT ME!
\r
1989 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1991 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1997 * @param type DOCUMENT ME!
\r
1998 * @param pwType DOCUMENT ME!
\r
1999 * @param title DOCUMENT ME!
\r
2001 void NewTreePanel(String type, String pwType, String title)
\r
2005 if ( (viewport.getSelectionGroup() != null) &&
\r
2006 (viewport.getSelectionGroup().getSize() > 3))
\r
2009 SequenceGroup sg = viewport.getSelectionGroup();
\r
2011 /* Decide if the selection is a column region */
\r
2012 while (s < sg.sequences.size())
\r
2014 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
2017 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2018 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2019 "Try using the Pad function in the edit menu,\n" +
\r
2020 "or one of the multiple sequence alignment web services.",
\r
2021 "Sequences in selection are not aligned",
\r
2022 JOptionPane.WARNING_MESSAGE);
\r
2028 title = title + " on region";
\r
2029 tp = new TreePanel(viewport,
\r
2030 viewport.getSelectionGroup().sequences, type, pwType,
\r
2031 sg.getStartRes(), sg.getEndRes());
\r
2035 //are the sequences aligned?
\r
2036 if (!viewport.alignment.isAligned())
\r
2038 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2039 "The sequences must be aligned before creating a tree.\n" +
\r
2040 "Try using the Pad function in the edit menu,\n" +
\r
2041 "or one of the multiple sequence alignment web services.",
\r
2042 "Sequences not aligned",
\r
2043 JOptionPane.WARNING_MESSAGE);
\r
2048 tp = new TreePanel(viewport,
\r
2049 viewport.getAlignment().getSequences(), type, pwType,
\r
2051 viewport.alignment.getWidth());
\r
2054 addTreeMenuItem(tp, title);
\r
2056 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2062 * @param title DOCUMENT ME!
\r
2063 * @param order DOCUMENT ME!
\r
2065 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2067 final JMenuItem item = new JMenuItem("by " + title);
\r
2069 item.addActionListener(new java.awt.event.ActionListener()
\r
2071 public void actionPerformed(ActionEvent e)
\r
2073 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2074 HistoryItem.SORT));
\r
2076 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2077 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2078 alignPanel.repaint();
\r
2084 * Maintain the Order by->Displayed Tree menu.
\r
2085 * Creates a new menu item for a TreePanel with an appropriate
\r
2086 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2087 * to remove the menu item when the treePanel is closed, and adjust
\r
2088 * the tree leaf to sequence mapping when the alignment is modified.
\r
2089 * @param treePanel Displayed tree window.
\r
2090 * @param title SortBy menu item title.
\r
2092 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2094 final JMenuItem item = new JMenuItem(title);
\r
2098 if (treeCount == 1)
\r
2100 sort.add(sortByTreeMenu);
\r
2103 sortByTreeMenu.add(item);
\r
2104 item.addActionListener(new java.awt.event.ActionListener()
\r
2106 public void actionPerformed(ActionEvent e)
\r
2108 addHistoryItem(new HistoryItem("Tree Sort",
\r
2109 viewport.alignment, HistoryItem.SORT));
\r
2110 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2111 treePanel.getTree());
\r
2112 alignPanel.repaint();
\r
2116 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2117 InternalFrameAdapter()
\r
2119 public void internalFrameClosed(
\r
2120 javax.swing.event.InternalFrameEvent evt)
\r
2123 sortByTreeMenu.remove(item);
\r
2125 if (treeCount == 0)
\r
2127 sort.remove(sortByTreeMenu);
\r
2135 * Work out whether the whole set of sequences
\r
2136 * or just the selected set will be submitted for multiple alignment.
\r
2139 private SequenceI[] gatherSequencesForAlignment()
\r
2141 // Now, check we have enough sequences
\r
2142 SequenceI[] msa = null;
\r
2144 if ( (viewport.getSelectionGroup() != null) &&
\r
2145 (viewport.getSelectionGroup().getSize() > 1))
\r
2147 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2148 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2150 msa = new SequenceI[sz = seqs.getSize()];
\r
2152 for (int i = 0; i < sz; i++)
\r
2154 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2159 Vector seqs = viewport.getAlignment().getSequences();
\r
2161 if (seqs.size() > 1)
\r
2163 msa = new SequenceI[seqs.size()];
\r
2165 for (int i = 0; i < seqs.size(); i++)
\r
2167 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2175 * Decides what is submitted to a secondary structure prediction service,
\r
2176 * the currently selected sequence, or the currently selected alignment
\r
2177 * (where the first sequence in the set is the one that the prediction
\r
2180 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2182 SequenceI seq = null;
\r
2183 SequenceI[] msa = null;
\r
2185 if ( (viewport.getSelectionGroup() != null) &&
\r
2186 (viewport.getSelectionGroup().getSize() > 0))
\r
2188 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2189 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2191 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2193 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2198 msa = new SequenceI[sz = seqs.getSize()];
\r
2200 for (int i = 0; i < sz; i++)
\r
2202 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2208 Vector seqs = viewport.getAlignment().getSequences();
\r
2210 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2212 seq = (SequenceI) seqs.elementAt(0);
\r
2216 msa = new SequenceI[seqs.size()];
\r
2218 for (int i = 0; i < seqs.size(); i++)
\r
2220 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2232 return new SequenceI[]
\r
2242 * @param e DOCUMENT ME!
\r
2244 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2246 // Pick the tree file
\r
2247 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2249 "LAST_DIRECTORY"));
\r
2250 chooser.setFileView(new JalviewFileView());
\r
2251 chooser.setDialogTitle("Select a newick-like tree file");
\r
2252 chooser.setToolTipText("Load a tree file");
\r
2254 int value = chooser.showOpenDialog(null);
\r
2256 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2258 String choice = chooser.getSelectedFile().getPath();
\r
2259 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2263 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2265 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2267 catch (Exception ex)
\r
2269 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2270 "Problem reading tree file",
\r
2272 JOptionPane.WARNING_MESSAGE);
\r
2273 ex.printStackTrace();
\r
2279 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2281 return ShowNewickTree(nf,title,600,500,4,5);
\r
2286 * @param nf DOCUMENT ME!
\r
2287 * @param title DOCUMENT ME!
\r
2289 * @return DOCUMENT ME!
\r
2291 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2293 TreePanel tp = null;
\r
2299 if (nf.getTree() != null)
\r
2301 tp = new TreePanel(viewport,
\r
2302 viewport.getAlignment().getSequences(), nf,
\r
2309 tp.setLocation(x,y);
\r
2312 Desktop.addInternalFrame(tp, title, w, h);
\r
2313 addTreeMenuItem(tp, title);
\r
2316 catch (Exception ex)
\r
2318 ex.printStackTrace();
\r
2329 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2330 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2331 printJob.setPrintable(alignPanel, pf);
\r
2333 if (printJob.printDialog())
\r
2339 catch (Exception PrintException)
\r
2341 PrintException.printStackTrace();
\r
2348 * Generates menu items and listener event actions for web service clients
\r
2351 public void BuildWebServiceMenu()
\r
2353 if ( (Discoverer.services != null)
\r
2354 && (Discoverer.services.size() > 0))
\r
2356 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2357 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2358 Vector wsmenu = new Vector();
\r
2359 if (msaws != null)
\r
2361 // Add any Multiple Sequence Alignment Services
\r
2362 final JMenu msawsmenu = new JMenu("Alignment");
\r
2363 final AlignFrame af = this;
\r
2364 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2366 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2368 final JMenuItem method = new JMenuItem(sh.getName());
\r
2369 method.addActionListener(new ActionListener()
\r
2371 public void actionPerformed(ActionEvent e)
\r
2373 SequenceI[] msa = gatherSequencesForAlignment();
\r
2374 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2375 false, true, viewport.getAlignment().getDataset(), af);
\r
2380 msawsmenu.add(method);
\r
2381 // Deal with services that we know accept partial alignments.
\r
2382 if (sh.getName().indexOf("lustal") > -1)
\r
2384 // We know that ClustalWS can accept partial alignments for refinement.
\r
2385 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2386 methodR.addActionListener(new ActionListener()
\r
2388 public void actionPerformed(ActionEvent e)
\r
2390 SequenceI[] msa = gatherSequencesForAlignment();
\r
2391 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2392 true, true, viewport.getAlignment().getDataset(), af);
\r
2397 msawsmenu.add(methodR);
\r
2401 wsmenu.add(msawsmenu);
\r
2403 if (secstrpr != null)
\r
2405 // Add any secondary structure prediction services
\r
2406 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2407 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2409 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2411 final JMenuItem method = new JMenuItem(sh.getName());
\r
2412 method.addActionListener(new ActionListener()
\r
2414 public void actionPerformed(ActionEvent e)
\r
2416 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2417 if (msa.length == 1)
\r
2419 // Single Sequence prediction
\r
2420 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2424 if (msa.length > 1)
\r
2426 // Single Sequence prediction
\r
2427 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2433 secstrmenu.add(method);
\r
2435 wsmenu.add(secstrmenu);
\r
2437 this.webService.removeAll();
\r
2438 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2440 webService.add( (JMenu) wsmenu.get(i));
\r
2445 this.webService.removeAll();
\r
2446 this.webService.add(this.webServiceNoServices);
\r
2448 // TODO: add in rediscovery function
\r
2449 // TODO: reduce code redundancy.
\r
2450 // TODO: group services by location as well as function.
\r
2453 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2455 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2456 getProperty("LAST_DIRECTORY"));
\r
2458 chooser.setFileView(new JalviewFileView());
\r
2459 chooser.setDialogTitle("Export to Vamsas file");
\r
2460 chooser.setToolTipText("Export");
\r
2462 int value = chooser.showSaveDialog(this);
\r
2464 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2466 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2467 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2468 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2476 public void showTranslation_actionPerformed(ActionEvent e)
\r
2478 int s, sSize = viewport.alignment.getHeight();
\r
2479 SequenceI [] newSeq = new SequenceI[sSize];
\r
2482 StringBuffer protein;
\r
2484 for(s=0; s<sSize; s++)
\r
2486 protein = new StringBuffer();
\r
2487 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2488 resSize = seq.length();
\r
2489 resSize -= resSize%3;
\r
2491 for(res = 0; res < resSize; res+=3)
\r
2493 String codon = seq.substring(res, res+3);
\r
2494 codon = codon.replace('U', 'T');
\r
2495 String aa = ResidueProperties.codonTranslate(codon);
\r
2497 protein.append(viewport.getGapCharacter());
\r
2498 else if(aa.equals("STOP"))
\r
2499 protein.append("X");
\r
2501 protein.append( aa );
\r
2503 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2507 AlignmentI al = new Alignment(newSeq);
\r
2508 al.setDataset(null);
\r
2511 ////////////////////////////////
\r
2512 // Copy annotations across
\r
2513 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2514 = viewport.alignment.getAlignmentAnnotation();
\r
2516 if(annotations!=null)
\r
2518 for (int i = 0; i < annotations.length; i++)
\r
2520 if (annotations[i].label.equals("Quality") ||
\r
2521 annotations[i].label.equals("Conservation") ||
\r
2522 annotations[i].label.equals("Consensus"))
\r
2527 aSize = viewport.alignment.getWidth() / 3;
\r
2528 jalview.datamodel.Annotation[] anots =
\r
2529 new jalview.datamodel.Annotation[aSize];
\r
2531 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2533 if (annotations[i].annotations[a] == null
\r
2534 || annotations[i].annotations[a] == null)
\r
2537 anots[a / 3] = new Annotation(
\r
2538 annotations[i].annotations[a].displayCharacter,
\r
2539 annotations[i].annotations[a].description,
\r
2540 annotations[i].annotations[a].secondaryStructure,
\r
2541 annotations[i].annotations[a].value,
\r
2542 annotations[i].annotations[a].colour);
\r
2545 jalview.datamodel.AlignmentAnnotation aa
\r
2546 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2547 annotations[i].description, anots);
\r
2548 al.addAnnotation(aa);
\r
2552 AlignFrame af = new AlignFrame(al);
\r
2553 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2555 NEW_WINDOW_HEIGHT);
\r
2558 // AlignViewport newViewport = new AlignViewport(al);
\r
2559 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2560 // tabbedPane.add("Protein", ap);
\r
2561 // viewports.add(newViewport);
\r
2562 // alignPanels.add(ap);
\r
2565 /////////////////////////
\r
2567 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2568 // ds.setDataset(true);
\r
2569 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2570 // tabbedPane.add("Dataset", dap);
\r
2571 // viewports.add(ds);
\r
2572 // alignPanels.add(dap);
\r
2573 /////////////////////////
\r
2578 /*public void tabSelected()
\r
2580 int index = tabbedPane.getSelectedIndex();
\r
2581 viewport = (AlignViewport)viewports.elementAt(index);
\r
2582 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2588 * @param String DOCUMENT ME!
\r
2590 public boolean parseGroupsFile(String file)
\r
2592 String line = null;
\r
2595 BufferedReader in = new BufferedReader(new FileReader(file));
\r
2596 SequenceI seq = null;
\r
2597 String type, desc, token;
\r
2599 int index, start, end;
\r
2600 StringTokenizer st;
\r
2601 SequenceFeature sf;
\r
2603 String featureGroup = null;
\r
2604 while ( (line = in.readLine()) != null)
\r
2607 st = new StringTokenizer(line, "\t");
\r
2608 if (st.countTokens() == 2)
\r
2610 type = st.nextToken();
\r
2611 if (type.equalsIgnoreCase("startgroup"))
\r
2613 featureGroup = st.nextToken();
\r
2615 else if (type.equalsIgnoreCase("endgroup"))
\r
2617 //We should check whether this is the current group,
\r
2618 //but at present theres no way of showing more than 1 group
\r
2620 featureGroup = null;
\r
2624 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2625 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type,
\r
2626 ucs.findColour("A"));
\r
2631 while (st.hasMoreElements())
\r
2633 desc = st.nextToken();
\r
2634 token = st.nextToken();
\r
2635 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2637 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2642 index = Integer.parseInt(st.nextToken());
\r
2645 start = Integer.parseInt(st.nextToken());
\r
2646 end = Integer.parseInt(st.nextToken());
\r
2648 seq = viewport.alignment.getSequenceAt(index);
\r
2650 type = st.nextToken();
\r
2652 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2654 // Probably the old style groups file
\r
2655 UserColourScheme ucs = new UserColourScheme(type);
\r
2656 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2659 sf = new SequenceFeature(type, desc, "", start, end, featureGroup);
\r
2661 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2665 catch (Exception ex)
\r
2667 System.out.println(line);
\r
2668 ex.printStackTrace();
\r
2669 System.out.println("Error parsing groups file: " + ex +"\n"+line);
\r
2673 viewport.showSequenceFeatures = true;
\r
2674 showSeqFeatures.setSelected(true);
\r
2675 alignPanel.repaint();
\r
2679 public void dragEnter(DropTargetDragEvent evt)
\r
2682 public void dragExit(DropTargetEvent evt)
\r
2685 public void dragOver(DropTargetDragEvent evt)
\r
2688 public void dropActionChanged(DropTargetDragEvent evt)
\r
2691 public void drop(DropTargetDropEvent evt)
\r
2693 Transferable t = evt.getTransferable();
\r
2694 java.util.List files = null;
\r
2698 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2699 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2701 //Works on Windows and MacOSX
\r
2702 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2703 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2705 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2707 // This is used by Unix drag system
\r
2708 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2709 String data = (String) t.getTransferData(uriListFlavor);
\r
2710 files = new java.util.ArrayList(1);
\r
2711 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2714 st.hasMoreTokens(); )
\r
2716 String s = st.nextToken();
\r
2717 if (s.startsWith("#"))
\r
2719 // the line is a comment (as per the RFC 2483)
\r
2723 java.net.URI uri = new java.net.URI(s);
\r
2724 java.io.File file = new java.io.File(uri);
\r
2729 catch (Exception e)
\r
2731 e.printStackTrace();
\r
2733 if (files != null)
\r
2738 for (int i = 0; i < files.size(); i++)
\r
2740 loadJalviewDataFile(files.get(i).toString());
\r
2743 catch (Exception ex)
\r
2745 ex.printStackTrace();
\r
2750 // This method will attempt to load a "dropped" file first by testing
\r
2751 // whether its and Annotation file, then features file. If both are
\r
2752 // false then the user may have dropped an alignment file onto this
\r
2754 public void loadJalviewDataFile(String file)
\r
2757 boolean isAnnotation = new AnnotationReader().readAnnotationFile(viewport.
\r
2760 if (!isAnnotation)
\r
2762 boolean isGroupsFile = parseGroupsFile(file);
\r
2763 if (!isGroupsFile)
\r
2765 String protocol = "File";
\r
2766 String format = new IdentifyFile().Identify(file, protocol);
\r
2767 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2770 FastaFile ff = new FastaFile();
\r
2771 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2772 c.setContents(new StringSelection(ff.print(sequences)), this);
\r
2774 this.paste(false);
\r
2780 int height = alignPanel.annotationPanel.adjustPanelHeight();
\r
2781 alignPanel.annotationScroller.setPreferredSize(
\r
2782 new Dimension(alignPanel.annotationScroller.getWidth(),
\r
2785 alignPanel.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
\r
2786 alignPanel.annotationSpaceFillerHolder.getWidth(),
\r
2789 alignPanel.addNotify();
\r
2792 }catch(Exception ex)
\r
2794 ex.printStackTrace();
\r