2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Softwarechang
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
19 package jalview.gui;
\r
21 import java.beans.*;
\r
26 import java.awt.datatransfer.*;
\r
27 import java.awt.event.*;
\r
28 import java.awt.print.*;
\r
29 import javax.swing.*;
\r
31 import jalview.analysis.*;
\r
32 import jalview.datamodel.*;
\r
33 import jalview.io.*;
\r
34 import jalview.jbgui.*;
\r
35 import jalview.schemes.*;
\r
36 import jalview.ws.*;
\r
37 import java.awt.dnd.*;
\r
44 * @version $Revision$
\r
46 public class AlignFrame
\r
47 extends GAlignFrame implements DropTargetListener
\r
49 /** DOCUMENT ME!! */
\r
50 public static final int NEW_WINDOW_WIDTH = 700;
\r
52 /** DOCUMENT ME!! */
\r
53 public static final int NEW_WINDOW_HEIGHT = 500;
\r
54 AlignmentPanel alignPanel;
\r
55 AlignViewport viewport;
\r
57 /** DOCUMENT ME!! */
\r
58 public String currentFileFormat = null;
\r
59 Stack historyList = new Stack();
\r
60 Stack redoList = new Stack();
\r
61 private int treeCount = 0;
\r
65 * Creates a new AlignFrame object.
\r
67 * @param al DOCUMENT ME!
\r
69 public AlignFrame(AlignmentI al)
\r
71 viewport = new AlignViewport(al);
\r
73 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
\r
75 if(viewport.vconsensus==null)
\r
77 //Out of memory calculating consensus.
\r
78 BLOSUM62Colour.setEnabled(false);
\r
79 PIDColour.setEnabled(false);
\r
80 conservationMenuItem.setEnabled(false);
\r
81 modifyConservation.setEnabled(false);
\r
82 abovePIDThreshold.setEnabled(false);
\r
83 modifyPID.setEnabled(false);
\r
86 alignPanel = new AlignmentPanel(this, viewport);
\r
88 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
\r
90 if(sortby.equals("Id"))
\r
91 sortIDMenuItem_actionPerformed(null);
\r
92 else if(sortby.equals("Pairwise Identity"))
\r
93 sortPairwiseMenuItem_actionPerformed(null);
\r
95 // remove(tabbedPane);
\r
96 getContentPane().add(alignPanel, BorderLayout.CENTER);
\r
100 // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
\r
103 /////////////////////////
\r
104 if(al.getDataset()==null)
\r
106 al.setDataset(null);
\r
108 // AlignViewport ds = new AlignViewport(al.getDataset(), true);
\r
109 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
110 // tabbedPane.add("Dataset", dap);
\r
111 // viewports.add(ds);
\r
112 // alignPanels.add(dap);
\r
113 /////////////////////////
\r
116 viewport.addPropertyChangeListener(new PropertyChangeListener()
\r
118 public void propertyChange(PropertyChangeEvent evt)
\r
120 if (evt.getPropertyName().equals("alignment"))
\r
122 alignmentChanged();
\r
128 if (Desktop.desktop != null)
\r
130 addServiceListeners();
\r
131 setGUINucleotide(al.isNucleotide());
\r
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
204 public void addFromFile_actionPerformed(ActionEvent e)
\r
206 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
\r
209 public void addFromText_actionPerformed(ActionEvent e)
\r
211 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
\r
214 public void addFromURL_actionPerformed(ActionEvent e)
\r
216 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
\r
222 * @param e DOCUMENT ME!
\r
224 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
226 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
231 "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",
\r
236 "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"
\r
237 }, currentFileFormat);
\r
239 chooser.setAcceptAllFileFilterUsed(false);
\r
240 chooser.setFileView(new JalviewFileView());
\r
241 chooser.setDialogTitle("Save Alignment to file");
\r
242 chooser.setToolTipText("Save");
\r
244 int value = chooser.showSaveDialog(this);
\r
246 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
248 currentFileFormat = chooser.getSelectedFormat();
\r
250 if (currentFileFormat == null)
\r
252 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
253 "You must select a file format before saving!",
\r
254 "File format not specified",
\r
255 JOptionPane.WARNING_MESSAGE);
\r
256 value = chooser.showSaveDialog(this);
\r
260 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
261 currentFileFormat);
\r
263 String choice = chooser.getSelectedFile().getPath();
\r
264 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
266 saveAlignment(choice, currentFileFormat);
\r
270 public boolean saveAlignment(String file, String format)
\r
272 if (format.equalsIgnoreCase("Jalview"))
\r
274 String shortName = title;
\r
276 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
278 shortName = shortName.substring(shortName.lastIndexOf(
\r
279 java.io.File.separatorChar) + 1);
\r
282 new Jalview2XML().SaveAlignment(this, file, shortName);
\r
284 // USE Jalview2XML to save this file
\r
289 String output = new FormatAdapter().formatSequences(format,
\r
290 viewport.getAlignment().
\r
292 if (output == null)
\r
299 java.io.PrintWriter out = new java.io.PrintWriter(
\r
300 new java.io.FileWriter(file));
\r
304 this.setTitle(file);
\r
307 catch (Exception ex)
\r
309 ex.printStackTrace();
\r
318 * @param e DOCUMENT ME!
\r
320 protected void outputText_actionPerformed(ActionEvent e)
\r
322 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
323 Desktop.addInternalFrame(cap,
\r
324 "Alignment output - " + e.getActionCommand(), 600,
\r
326 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
327 viewport.getAlignment().
\r
334 * @param e DOCUMENT ME!
\r
336 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
338 new HTMLOutput(viewport,
\r
339 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
340 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
343 public void createImageMap(File file, String image)
\r
345 alignPanel.makePNGImageMap(file, image);
\r
351 * @param e DOCUMENT ME!
\r
353 public void createPNG(File f)
\r
355 alignPanel.makePNG(f);
\r
361 * @param e DOCUMENT ME!
\r
363 public void createEPS(File f)
\r
365 alignPanel.makeEPS(f);
\r
371 * @param e DOCUMENT ME!
\r
373 public void printMenuItem_actionPerformed(ActionEvent e)
\r
375 //Putting in a thread avoids Swing painting problems
\r
376 PrintThread thread = new PrintThread();
\r
380 public void associatedData_actionPerformed(ActionEvent e)
\r
382 // Pick the tree file
\r
383 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
385 "LAST_DIRECTORY"));
\r
386 chooser.setFileView(new JalviewFileView());
\r
387 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
388 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
390 int value = chooser.showOpenDialog(null);
\r
392 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
394 String choice = chooser.getSelectedFile().getPath();
\r
395 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
396 loadJalviewDataFile(choice);
\r
404 * @param e DOCUMENT ME!
\r
406 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
410 PaintRefresher.components.remove(viewport.alignment);
\r
411 this.setClosed(true);
\r
413 catch (Exception ex)
\r
421 void updateEditMenuBar()
\r
423 if (historyList.size() > 0)
\r
425 undoMenuItem.setEnabled(true);
\r
427 HistoryItem hi = (HistoryItem) historyList.peek();
\r
428 undoMenuItem.setText("Undo " + hi.getDescription());
\r
432 undoMenuItem.setEnabled(false);
\r
433 undoMenuItem.setText("Undo");
\r
436 if (redoList.size() > 0)
\r
438 redoMenuItem.setEnabled(true);
\r
440 HistoryItem hi = (HistoryItem) redoList.peek();
\r
441 redoMenuItem.setText("Redo " + hi.getDescription());
\r
445 redoMenuItem.setEnabled(false);
\r
446 redoMenuItem.setText("Redo");
\r
453 * @param hi DOCUMENT ME!
\r
455 public void addHistoryItem(HistoryItem hi)
\r
457 historyList.push(hi);
\r
458 updateEditMenuBar();
\r
464 * @param e DOCUMENT ME!
\r
466 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
468 HistoryItem hi = (HistoryItem) historyList.pop();
\r
469 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
470 HistoryItem.HIDE));
\r
471 restoreHistoryItem(hi);
\r
472 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
478 * @param e DOCUMENT ME!
\r
480 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
482 HistoryItem hi = (HistoryItem) redoList.pop();
\r
483 restoreHistoryItem(hi);
\r
484 updateEditMenuBar();
\r
485 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
488 // used by undo and redo
\r
489 void restoreHistoryItem(HistoryItem hi)
\r
494 updateEditMenuBar();
\r
496 viewport.firePropertyChange("alignment", null,
\r
497 viewport.getAlignment().getSequences());
\r
503 * @param up DOCUMENT ME!
\r
505 public void moveSelectedSequences(boolean up)
\r
507 SequenceGroup sg = viewport.getSelectionGroup();
\r
516 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
518 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
520 if (!sg.sequences.contains(seq))
\r
525 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
527 if (sg.sequences.contains(temp))
\r
532 viewport.alignment.getSequences().setElementAt(temp, i);
\r
533 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
538 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
540 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
542 if (!sg.sequences.contains(seq))
\r
547 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
549 if (sg.sequences.contains(temp))
\r
554 viewport.alignment.getSequences().setElementAt(temp, i);
\r
555 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
559 alignPanel.repaint();
\r
567 * @param e DOCUMENT ME!
\r
569 protected void copy_actionPerformed(ActionEvent e)
\r
571 if (viewport.getSelectionGroup() == null)
\r
576 SequenceGroup sg = viewport.getSelectionGroup();
\r
578 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
580 Hashtable orderedSeqs = new Hashtable();
\r
581 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
583 for (int i = 0; i < sg.getSize(); i++)
\r
585 SequenceI seq = sg.getSequenceAt(i);
\r
586 int index = viewport.alignment.findIndex(seq);
\r
587 orderedSeqs.put(index + "", seq);
\r
590 int index = 0, startRes, endRes;
\r
593 for (int i = 0; i < sg.getSize(); i++)
\r
595 SequenceI seq = null;
\r
597 while (seq == null)
\r
599 if (orderedSeqs.containsKey(index + ""))
\r
601 seq = (SequenceI) orderedSeqs.get(index + "");
\r
613 //Returns residue following index if gap
\r
614 startRes = seq.findPosition(sg.getStartRes());
\r
617 //Need to find the residue preceeding index if gap
\r
620 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
622 ch = seq.getCharAt(j);
\r
623 if (!jalview.util.Comparison.isGap( (ch)))
\r
631 endRes += seq.getStart() - 1;
\r
634 seqs[i] = new Sequence(seq.getName(),
\r
635 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
638 seqs[i].setDescription(seq.getDescription());
\r
639 seqs[i].setDBRef(seq.getDBRef());
\r
640 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
641 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
642 if(seq.getAnnotation()!=null)
\r
644 for(int a=0; a<seq.getAnnotation().length; a++)
\r
645 seqs[i].addAlignmentAnnotation(seq.getAnnotation()[a]);
\r
649 FastaFile ff = new FastaFile();
\r
650 ff.addJVSuffix( viewport.showJVSuffix );
\r
651 c.setContents(new StringSelection( ff.print(seqs)), Desktop.instance);
\r
652 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
658 * @param e DOCUMENT ME!
\r
660 protected void pasteNew_actionPerformed(ActionEvent e)
\r
668 * @param e DOCUMENT ME!
\r
670 protected void pasteThis_actionPerformed(ActionEvent e)
\r
672 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
673 HistoryItem.PASTE));
\r
680 * @param newAlignment DOCUMENT ME!
\r
682 void paste(boolean newAlignment)
\r
686 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
687 Transferable contents = c.getContents(this);
\r
689 if (contents == null)
\r
694 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
698 String format = new IdentifyFile().Identify(str, "Paste");
\r
699 SequenceI[] sequences;
\r
701 if(Desktop.jalviewClipboard!=null)
\r
703 // The clipboard was filled from within Jalview, we must use the sequences
\r
704 // And dataset from the copied alignment
\r
705 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
709 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
712 AlignmentI alignment = null;
\r
716 alignment = new Alignment(sequences);
\r
718 if(Desktop.jalviewClipboard!=null)
\r
719 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
721 alignment.setDataset( null );
\r
725 alignment = viewport.getAlignment();
\r
728 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
735 alignment.addSequence(newseq);
\r
737 viewport.setEndSeq(alignment.getHeight());
\r
738 alignment.getWidth();
\r
739 viewport.firePropertyChange("alignment", null, alignment.getSequences());
\r
742 // Add any annotations attached to sequences
\r
743 for (int i = 0; i < sequences.length; i++)
\r
745 if (sequences[i].getAnnotation() != null)
\r
747 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
\r
749 AlignmentAnnotation newAnnot =
\r
750 new AlignmentAnnotation(
\r
751 sequences[i].getAnnotation()[a].label,
\r
752 sequences[i].getAnnotation()[a].description,
\r
753 sequences[i].getAnnotation()[a].annotations,
\r
754 sequences[i].getAnnotation()[a].graphMin,
\r
755 sequences[i].getAnnotation()[a].graphMax,
\r
756 sequences[i].getAnnotation()[a].graph);
\r
758 sequences[i].getAnnotation()[a] = newAnnot;
\r
759 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
\r
761 newAnnot.sequenceRef = sequences[i];
\r
762 newAnnot.adjustForAlignment();
\r
763 alignment.addAnnotation(newAnnot);
\r
764 alignment.setAnnotationIndex(newAnnot, a);
\r
767 alignPanel.annotationPanel.adjustPanelHeight();
\r
773 AlignFrame af = new AlignFrame(alignment);
\r
774 String newtitle = new String("Copied sequences");
\r
777 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
778 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
779 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
782 if (title.startsWith("Copied sequences"))
\r
788 newtitle = newtitle.concat("- from " + title);
\r
791 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
792 NEW_WINDOW_HEIGHT);
\r
798 catch (Exception ex)
\r
800 ex.printStackTrace();
\r
801 System.out.println("Exception whilst pasting: "+ex);
\r
802 // could be anything being pasted in here
\r
811 * @param e DOCUMENT ME!
\r
813 protected void cut_actionPerformed(ActionEvent e)
\r
815 copy_actionPerformed(null);
\r
816 delete_actionPerformed(null);
\r
822 * @param e DOCUMENT ME!
\r
824 protected void delete_actionPerformed(ActionEvent e)
\r
827 if (viewport.getSelectionGroup() == null)
\r
833 SequenceGroup sg = viewport.getSelectionGroup();
\r
837 //Jalview no longer allows deletion of residues.
\r
838 //Check here whether any residues are in selection area
\r
839 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
841 for (int i = 0; i < sg.sequences.size(); i++)
\r
843 SequenceI seq = sg.getSequenceAt(i);
\r
844 int j = sg.getStartRes();
\r
847 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
849 JOptionPane.showInternalMessageDialog(
\r
850 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
851 + "Try hiding columns instead.",
\r
852 "Deletion of residues not permitted",
\r
853 JOptionPane.WARNING_MESSAGE);
\r
858 }while(j<=sg.getEndRes());
\r
863 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
864 HistoryItem.HIDE));
\r
867 for (int i = 0; i < sg.sequences.size(); i++)
\r
869 SequenceI seq = sg.getSequenceAt(i);
\r
870 int index = viewport.getAlignment().findIndex(seq);
\r
872 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
874 // If the cut affects all sequences, remove highlighted columns
\r
875 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
877 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
878 sg.getEndRes() + 1);
\r
881 if (seq.getSequence().length() < 1)
\r
883 viewport.getAlignment().deleteSequence(seq);
\r
887 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
891 viewport.setSelectionGroup(null);
\r
892 viewport.alignment.deleteGroup(sg);
\r
894 viewport.firePropertyChange("alignment", null,
\r
895 viewport.getAlignment().getSequences());
\r
899 if (viewport.getAlignment().getHeight() < 1)
\r
903 this.setClosed(true);
\r
905 catch (Exception ex)
\r
914 * @param e DOCUMENT ME!
\r
916 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
918 viewport.alignment.deleteAllGroups();
\r
919 viewport.setSelectionGroup(null);
\r
920 alignPanel.repaint();
\r
926 * @param e DOCUMENT ME!
\r
928 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
930 SequenceGroup sg = new SequenceGroup();
\r
932 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
935 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
938 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
939 viewport.setSelectionGroup(sg);
\r
940 PaintRefresher.Refresh(null, viewport.alignment);
\r
946 * @param e DOCUMENT ME!
\r
948 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
950 if(viewport.cursorMode)
\r
952 alignPanel.seqPanel.keyboardNo1 = null;
\r
953 alignPanel.seqPanel.keyboardNo2 = null;
\r
955 viewport.setSelectionGroup(null);
\r
956 viewport.getColumnSelection().clear();
\r
957 viewport.setSelectionGroup(null);
\r
958 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
959 alignPanel.idPanel.idCanvas.searchResults = null;
\r
960 PaintRefresher.Refresh(null, viewport.alignment);
\r
966 * @param e DOCUMENT ME!
\r
968 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
970 SequenceGroup sg = viewport.getSelectionGroup();
\r
974 selectAllSequenceMenuItem_actionPerformed(null);
\r
979 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
982 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
985 PaintRefresher.Refresh(null, viewport.alignment);
\r
991 * @param e DOCUMENT ME!
\r
993 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
995 ColumnSelection colSel = viewport.getColumnSelection();
\r
997 if (colSel.size() > 0)
\r
999 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
1000 HistoryItem.HIDE));
\r
1002 int min = colSel.getMin();
\r
1003 viewport.getAlignment().trimLeft(min);
\r
1004 colSel.compensateForEdit(0, min);
\r
1006 if (viewport.getSelectionGroup() != null)
\r
1008 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
1011 Vector groups = viewport.alignment.getGroups();
\r
1013 for (int i = 0; i < groups.size(); i++)
\r
1015 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1017 if (!sg.adjustForRemoveLeft(min))
\r
1019 viewport.alignment.deleteGroup(sg);
\r
1023 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1030 * @param e DOCUMENT ME!
\r
1032 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1034 ColumnSelection colSel = viewport.getColumnSelection();
\r
1036 if (colSel.size() > 0)
\r
1038 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1039 HistoryItem.HIDE));
\r
1041 int max = colSel.getMax();
\r
1042 viewport.getAlignment().trimRight(max);
\r
1044 if (viewport.getSelectionGroup() != null)
\r
1046 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1049 Vector groups = viewport.alignment.getGroups();
\r
1051 for (int i = 0; i < groups.size(); i++)
\r
1053 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1055 if (!sg.adjustForRemoveRight(max))
\r
1057 viewport.alignment.deleteGroup(sg);
\r
1061 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1068 * @param e DOCUMENT ME!
\r
1070 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1072 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1073 viewport.alignment, HistoryItem.HIDE));
\r
1075 //This is to maintain viewport position on first residue
\r
1076 //of first sequence
\r
1077 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1078 int startRes = seq.findPosition(viewport.startRes);
\r
1080 viewport.getAlignment().removeGaps();
\r
1082 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1084 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1090 * @param e DOCUMENT ME!
\r
1092 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1094 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1095 HistoryItem.HIDE));
\r
1097 //This is to maintain viewport position on first residue
\r
1098 //of first sequence
\r
1099 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1100 int startRes = seq.findPosition(viewport.startRes);
\r
1103 SequenceI current;
\r
1106 Vector seqs = null;
\r
1109 int end = viewport.alignment.getWidth();
\r
1111 if (viewport.getSelectionGroup() != null
\r
1112 && viewport.getSelectionGroup().sequences != null
\r
1113 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1115 seqs = viewport.getSelectionGroup().sequences;
\r
1116 start = viewport.getSelectionGroup().getStartRes();
\r
1117 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1121 seqs = viewport.alignment.getSequences();
\r
1124 for (int i = 0; i < seqs.size(); i++)
\r
1126 current = (SequenceI) seqs.elementAt(i);
\r
1127 jSize = current.getLength();
\r
1129 // Removing a range is much quicker than removing gaps
\r
1130 // one by one for long sequences
\r
1132 int rangeStart=-1, rangeEnd=-1;
\r
1136 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1138 if(rangeStart==-1)
\r
1153 current.deleteChars(rangeStart, rangeEnd);
\r
1154 j-=rangeEnd-rangeStart;
\r
1155 jSize-=rangeEnd-rangeStart;
\r
1163 while (j < end && j < jSize);
\r
1166 current.deleteChars(rangeStart, rangeEnd);
\r
1170 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1172 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1175 public void alignmentChanged()
\r
1177 if(viewport.padGaps)
\r
1178 viewport.getAlignment().padGaps();
\r
1180 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1182 viewport.updateConsensus();
\r
1183 viewport.updateConservation();
\r
1185 resetAllColourSchemes();
\r
1186 if(alignPanel.overviewPanel!=null)
\r
1187 alignPanel.overviewPanel.updateOverviewImage();
\r
1189 viewport.alignment.adjustSequenceAnnotations();
\r
1191 alignPanel.repaint();
\r
1194 void resetAllColourSchemes()
\r
1196 ColourSchemeI cs = viewport.globalColourScheme;
\r
1199 if (cs instanceof ClustalxColourScheme)
\r
1201 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1202 resetClustalX(viewport.alignment.getSequences(),
\r
1203 viewport.alignment.getWidth());
\r
1206 cs.setConsensus(viewport.vconsensus);
\r
1207 if (cs.conservationApplied())
\r
1209 Alignment al = (Alignment) viewport.alignment;
\r
1210 Conservation c = new Conservation("All",
\r
1211 ResidueProperties.propHash, 3,
\r
1212 al.getSequences(), 0,
\r
1213 al.getWidth() - 1);
\r
1215 c.verdict(false, viewport.ConsPercGaps);
\r
1217 cs.setConservation(c);
\r
1221 int s, sSize = viewport.alignment.getGroups().size();
\r
1222 for(s=0; s<sSize; s++)
\r
1224 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1225 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1227 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1229 sg.recalcConservation();
\r
1236 * @param e DOCUMENT ME!
\r
1238 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1240 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1241 HistoryItem.HIDE));
\r
1243 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1245 // if (viewport.padGaps)
\r
1246 alignmentChanged();
\r
1252 * @param e DOCUMENT ME!
\r
1254 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1256 JInternalFrame frame = new JInternalFrame();
\r
1257 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1258 frame.setContentPane(finder);
\r
1259 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1260 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1266 * @param e DOCUMENT ME!
\r
1268 public void font_actionPerformed(ActionEvent e)
\r
1270 new FontChooser(alignPanel);
\r
1273 public void smoothFont_actionPerformed(ActionEvent e)
\r
1275 viewport.antiAlias = smoothFont.isSelected();
\r
1276 alignPanel.annotationPanel.image = null;
\r
1277 alignPanel.repaint();
\r
1284 * @param e DOCUMENT ME!
\r
1286 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1288 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1290 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1291 alignPanel.repaint();
\r
1298 * @param e DOCUMENT ME!
\r
1300 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1302 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1303 alignPanel.repaint();
\r
1309 * @param e DOCUMENT ME!
\r
1311 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1313 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1314 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1315 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1316 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1317 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1318 alignPanel.repaint();
\r
1324 * @param e DOCUMENT ME!
\r
1326 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1328 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1329 alignPanel.repaint();
\r
1335 * @param e DOCUMENT ME!
\r
1337 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1339 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1340 alignPanel.repaint();
\r
1346 * @param e DOCUMENT ME!
\r
1348 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1350 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1351 alignPanel.repaint();
\r
1357 * @param e DOCUMENT ME!
\r
1359 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1361 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1362 alignPanel.repaint();
\r
1368 * @param e DOCUMENT ME!
\r
1370 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1372 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1373 alignPanel.repaint();
\r
1379 * @param e DOCUMENT ME!
\r
1381 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1383 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1384 alignPanel.repaint();
\r
1387 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1389 if (!viewport.alignment.isNucleotide())
\r
1391 new DasSequenceFeatureFetcher(viewport.
\r
1394 viewport.setShowSequenceFeatures(true);
\r
1395 showSeqFeatures.setSelected(true);
\r
1400 public void featureSettings_actionPerformed(ActionEvent e)
\r
1402 new FeatureSettings(viewport, alignPanel);
\r
1408 * @param evt DOCUMENT ME!
\r
1410 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1412 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1413 alignPanel.repaint();
\r
1414 if (alignPanel.getOverviewPanel() != null)
\r
1416 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1423 * @param e DOCUMENT ME!
\r
1425 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1427 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1428 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1434 * @param e DOCUMENT ME!
\r
1436 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1438 if (alignPanel.overviewPanel != null)
\r
1443 JInternalFrame frame = new JInternalFrame();
\r
1444 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1445 frame.setContentPane(overview);
\r
1446 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1447 frame.getWidth(), frame.getHeight());
\r
1449 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1450 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1452 public void internalFrameClosed(
\r
1453 javax.swing.event.InternalFrameEvent evt)
\r
1455 alignPanel.setOverviewPanel(null);
\r
1460 alignPanel.setOverviewPanel(overview);
\r
1466 * @param e DOCUMENT ME!
\r
1468 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1470 changeColour(null);
\r
1476 * @param e DOCUMENT ME!
\r
1478 public void clustalColour_actionPerformed(ActionEvent e)
\r
1480 changeColour(new ClustalxColourScheme(
\r
1481 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1487 * @param e DOCUMENT ME!
\r
1489 public void zappoColour_actionPerformed(ActionEvent e)
\r
1491 changeColour(new ZappoColourScheme());
\r
1497 * @param e DOCUMENT ME!
\r
1499 public void taylorColour_actionPerformed(ActionEvent e)
\r
1501 changeColour(new TaylorColourScheme());
\r
1507 * @param e DOCUMENT ME!
\r
1509 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1511 changeColour(new HydrophobicColourScheme());
\r
1517 * @param e DOCUMENT ME!
\r
1519 public void helixColour_actionPerformed(ActionEvent e)
\r
1521 changeColour(new HelixColourScheme());
\r
1527 * @param e DOCUMENT ME!
\r
1529 public void strandColour_actionPerformed(ActionEvent e)
\r
1531 changeColour(new StrandColourScheme());
\r
1537 * @param e DOCUMENT ME!
\r
1539 public void turnColour_actionPerformed(ActionEvent e)
\r
1541 changeColour(new TurnColourScheme());
\r
1547 * @param e DOCUMENT ME!
\r
1549 public void buriedColour_actionPerformed(ActionEvent e)
\r
1551 changeColour(new BuriedColourScheme());
\r
1557 * @param e DOCUMENT ME!
\r
1559 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1561 changeColour(new NucleotideColourScheme());
\r
1564 public void annotationColour_actionPerformed(ActionEvent e)
\r
1566 new AnnotationColourChooser(viewport, alignPanel);
\r
1573 * @param e DOCUMENT ME!
\r
1575 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1577 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1583 * @param cs DOCUMENT ME!
\r
1585 void changeColour(ColourSchemeI cs)
\r
1587 int threshold = 0;
\r
1591 if (viewport.getAbovePIDThreshold())
\r
1593 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1596 cs.setThreshold(threshold,
\r
1597 viewport.getIgnoreGapsConsensus());
\r
1599 viewport.setGlobalColourScheme(cs);
\r
1603 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1606 if (viewport.getConservationSelected())
\r
1609 Alignment al = (Alignment) viewport.alignment;
\r
1610 Conservation c = new Conservation("All",
\r
1611 ResidueProperties.propHash, 3,
\r
1612 al.getSequences(), 0,
\r
1613 al.getWidth() - 1);
\r
1616 c.verdict(false, viewport.ConsPercGaps);
\r
1618 cs.setConservation(c);
\r
1620 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1625 cs.setConservation(null);
\r
1628 cs.setConsensus(viewport.vconsensus);
\r
1631 viewport.setGlobalColourScheme(cs);
\r
1633 if (viewport.getColourAppliesToAllGroups())
\r
1635 Vector groups = viewport.alignment.getGroups();
\r
1637 for (int i = 0; i < groups.size(); i++)
\r
1639 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1647 if (cs instanceof ClustalxColourScheme)
\r
1649 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1651 else if (cs instanceof UserColourScheme)
\r
1653 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1659 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1661 catch (Exception ex)
\r
1666 if (viewport.getAbovePIDThreshold()
\r
1667 || cs instanceof PIDColourScheme
\r
1668 || cs instanceof Blosum62ColourScheme)
\r
1670 sg.cs.setThreshold(threshold,
\r
1671 viewport.getIgnoreGapsConsensus());
\r
1673 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1677 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1680 if (viewport.getConservationSelected())
\r
1682 Conservation c = new Conservation("Group",
\r
1683 ResidueProperties.propHash, 3,
\r
1685 viewport.alignment.getWidth() - 1);
\r
1687 c.verdict(false, viewport.ConsPercGaps);
\r
1688 sg.cs.setConservation(c);
\r
1691 sg.cs.setConservation(null);
\r
1695 if (alignPanel.getOverviewPanel() != null)
\r
1697 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1700 alignPanel.repaint();
\r
1706 * @param e DOCUMENT ME!
\r
1708 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1710 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1712 SliderPanel.setPIDSliderSource(alignPanel,
\r
1713 viewport.getGlobalColourScheme(),
\r
1715 SliderPanel.showPIDSlider();
\r
1722 * @param e DOCUMENT ME!
\r
1724 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1726 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1728 SliderPanel.setConservationSlider(alignPanel,
\r
1729 viewport.globalColourScheme,
\r
1731 SliderPanel.showConservationSlider();
\r
1738 * @param e DOCUMENT ME!
\r
1740 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1742 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1744 viewport.setAbovePIDThreshold(false);
\r
1745 abovePIDThreshold.setSelected(false);
\r
1747 changeColour(viewport.getGlobalColourScheme());
\r
1749 modifyConservation_actionPerformed(null);
\r
1755 * @param e DOCUMENT ME!
\r
1757 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1759 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1761 conservationMenuItem.setSelected(false);
\r
1762 viewport.setConservationSelected(false);
\r
1764 changeColour(viewport.getGlobalColourScheme());
\r
1766 modifyPID_actionPerformed(null);
\r
1772 * @param e DOCUMENT ME!
\r
1774 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1776 if (e.getActionCommand().equals("User Defined..."))
\r
1778 new UserDefinedColours(alignPanel, null);
\r
1782 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1783 getUserColourSchemes().get(e.getActionCommand());
\r
1785 changeColour(udc);
\r
1789 public void updateUserColourMenu()
\r
1792 Component[] menuItems = colourMenu.getMenuComponents();
\r
1793 int i, iSize = menuItems.length;
\r
1794 for (i = 0; i < iSize; i++)
\r
1796 if (menuItems[i].getName() != null &&
\r
1797 menuItems[i].getName().equals("USER_DEFINED"))
\r
1799 colourMenu.remove(menuItems[i]);
\r
1803 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1805 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1806 getUserColourSchemes().keys();
\r
1808 while (userColours.hasMoreElements())
\r
1810 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1811 nextElement().toString());
\r
1812 radioItem.setName("USER_DEFINED");
\r
1813 radioItem.addMouseListener(new MouseAdapter()
\r
1815 public void mousePressed(MouseEvent evt)
\r
1817 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1819 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1821 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1822 "Remove from default list?",
\r
1823 "Remove user defined colour",
\r
1824 JOptionPane.YES_NO_OPTION);
\r
1825 if(option == JOptionPane.YES_OPTION)
\r
1827 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1828 colourMenu.remove(radioItem);
\r
1831 radioItem.addActionListener(new ActionListener()
\r
1833 public void actionPerformed(ActionEvent evt)
\r
1835 userDefinedColour_actionPerformed(evt);
\r
1841 radioItem.addActionListener(new ActionListener()
\r
1843 public void actionPerformed(ActionEvent evt)
\r
1845 userDefinedColour_actionPerformed(evt);
\r
1849 colourMenu.insert(radioItem, 15);
\r
1850 colours.add(radioItem);
\r
1858 * @param e DOCUMENT ME!
\r
1860 public void PIDColour_actionPerformed(ActionEvent e)
\r
1862 changeColour(new PIDColourScheme());
\r
1868 * @param e DOCUMENT ME!
\r
1870 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1872 changeColour(new Blosum62ColourScheme());
\r
1878 * @param e DOCUMENT ME!
\r
1880 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1882 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1883 HistoryItem.SORT));
\r
1884 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1885 viewport.getAlignment().getSequenceAt(0));
\r
1886 alignPanel.repaint();
\r
1892 * @param e DOCUMENT ME!
\r
1894 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1896 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1897 HistoryItem.SORT));
\r
1898 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1899 alignPanel.repaint();
\r
1905 * @param e DOCUMENT ME!
\r
1907 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1909 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1910 HistoryItem.SORT));
\r
1912 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1913 alignPanel.repaint();
\r
1919 * @param e DOCUMENT ME!
\r
1921 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1923 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1924 JInternalFrame frame = new JInternalFrame();
\r
1925 frame.setContentPane(sp);
\r
1926 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1933 * @param e DOCUMENT ME!
\r
1935 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1937 if ( (viewport.getSelectionGroup() == null) ||
\r
1938 (viewport.getSelectionGroup().getSize() < 2))
\r
1940 JOptionPane.showInternalMessageDialog(this,
\r
1941 "You must select at least 2 sequences.",
\r
1942 "Invalid Selection",
\r
1943 JOptionPane.WARNING_MESSAGE);
\r
1947 JInternalFrame frame = new JInternalFrame();
\r
1948 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1949 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1956 * @param e DOCUMENT ME!
\r
1958 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1960 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1961 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1962 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1963 (viewport.getAlignment().getHeight() < 4))
\r
1965 JOptionPane.showInternalMessageDialog(this,
\r
1966 "Principal component analysis must take\n" +
\r
1967 "at least 4 input sequences.",
\r
1968 "Sequence selection insufficient",
\r
1969 JOptionPane.WARNING_MESSAGE);
\r
1974 new PCAPanel(viewport);
\r
1978 public void autoCalculate_actionPerformed(ActionEvent e)
\r
1980 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
1981 if(viewport.autoCalculateConsensus)
\r
1983 alignmentChanged();
\r
1991 * @param e DOCUMENT ME!
\r
1993 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1995 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2001 * @param e DOCUMENT ME!
\r
2003 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2005 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2011 * @param e DOCUMENT ME!
\r
2013 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2015 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2021 * @param e DOCUMENT ME!
\r
2023 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2025 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2031 * @param type DOCUMENT ME!
\r
2032 * @param pwType DOCUMENT ME!
\r
2033 * @param title DOCUMENT ME!
\r
2035 void NewTreePanel(String type, String pwType, String title)
\r
2039 if ( (viewport.getSelectionGroup() != null) &&
\r
2040 (viewport.getSelectionGroup().getSize() > 3))
\r
2043 SequenceGroup sg = viewport.getSelectionGroup();
\r
2045 /* Decide if the selection is a column region */
\r
2046 while (s < sg.sequences.size())
\r
2048 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
2051 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2052 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2053 "Try using the Pad function in the edit menu,\n" +
\r
2054 "or one of the multiple sequence alignment web services.",
\r
2055 "Sequences in selection are not aligned",
\r
2056 JOptionPane.WARNING_MESSAGE);
\r
2062 title = title + " on region";
\r
2063 tp = new TreePanel(viewport,
\r
2064 viewport.getSelectionGroup().sequences, type, pwType,
\r
2065 sg.getStartRes(), sg.getEndRes());
\r
2069 //are the sequences aligned?
\r
2070 if (!viewport.alignment.isAligned())
\r
2072 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2073 "The sequences must be aligned before creating a tree.\n" +
\r
2074 "Try using the Pad function in the edit menu,\n" +
\r
2075 "or one of the multiple sequence alignment web services.",
\r
2076 "Sequences not aligned",
\r
2077 JOptionPane.WARNING_MESSAGE);
\r
2082 tp = new TreePanel(viewport,
\r
2083 viewport.getAlignment().getSequences(), type, pwType,
\r
2085 viewport.alignment.getWidth());
\r
2088 addTreeMenuItem(tp, title);
\r
2090 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2096 * @param title DOCUMENT ME!
\r
2097 * @param order DOCUMENT ME!
\r
2099 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2101 final JMenuItem item = new JMenuItem("by " + title);
\r
2103 item.addActionListener(new java.awt.event.ActionListener()
\r
2105 public void actionPerformed(ActionEvent e)
\r
2107 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2108 HistoryItem.SORT));
\r
2110 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2111 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2112 alignPanel.repaint();
\r
2118 * Maintain the Order by->Displayed Tree menu.
\r
2119 * Creates a new menu item for a TreePanel with an appropriate
\r
2120 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2121 * to remove the menu item when the treePanel is closed, and adjust
\r
2122 * the tree leaf to sequence mapping when the alignment is modified.
\r
2123 * @param treePanel Displayed tree window.
\r
2124 * @param title SortBy menu item title.
\r
2126 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2128 final JMenuItem item = new JMenuItem(title);
\r
2132 if (treeCount == 1)
\r
2134 sort.add(sortByTreeMenu);
\r
2137 sortByTreeMenu.add(item);
\r
2138 item.addActionListener(new java.awt.event.ActionListener()
\r
2140 public void actionPerformed(ActionEvent e)
\r
2142 addHistoryItem(new HistoryItem("Tree Sort",
\r
2143 viewport.alignment, HistoryItem.SORT));
\r
2144 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2145 treePanel.getTree());
\r
2146 alignPanel.repaint();
\r
2150 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2151 InternalFrameAdapter()
\r
2153 public void internalFrameClosed(
\r
2154 javax.swing.event.InternalFrameEvent evt)
\r
2157 sortByTreeMenu.remove(item);
\r
2159 if (treeCount == 0)
\r
2161 sort.remove(sortByTreeMenu);
\r
2169 * Work out whether the whole set of sequences
\r
2170 * or just the selected set will be submitted for multiple alignment.
\r
2173 private SequenceI[] gatherSequencesForAlignment()
\r
2175 // Now, check we have enough sequences
\r
2176 SequenceI[] msa = null;
\r
2178 if ( (viewport.getSelectionGroup() != null) &&
\r
2179 (viewport.getSelectionGroup().getSize() > 1))
\r
2181 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2182 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2184 msa = new SequenceI[sz = seqs.getSize()];
\r
2186 for (int i = 0; i < sz; i++)
\r
2188 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2193 Vector seqs = viewport.getAlignment().getSequences();
\r
2195 if (seqs.size() > 1)
\r
2197 msa = new SequenceI[seqs.size()];
\r
2199 for (int i = 0; i < seqs.size(); i++)
\r
2201 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2209 * Decides what is submitted to a secondary structure prediction service,
\r
2210 * the currently selected sequence, or the currently selected alignment
\r
2211 * (where the first sequence in the set is the one that the prediction
\r
2214 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2216 SequenceI seq = null;
\r
2217 SequenceI[] msa = null;
\r
2219 if ( (viewport.getSelectionGroup() != null) &&
\r
2220 (viewport.getSelectionGroup().getSize() > 0))
\r
2222 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2223 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2225 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2227 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2232 msa = new SequenceI[sz = seqs.getSize()];
\r
2234 for (int i = 0; i < sz; i++)
\r
2236 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2242 Vector seqs = viewport.getAlignment().getSequences();
\r
2244 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2246 seq = (SequenceI) seqs.elementAt(0);
\r
2250 msa = new SequenceI[seqs.size()];
\r
2252 for (int i = 0; i < seqs.size(); i++)
\r
2254 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2266 return new SequenceI[]
\r
2276 * @param e DOCUMENT ME!
\r
2278 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2280 // Pick the tree file
\r
2281 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2283 "LAST_DIRECTORY"));
\r
2284 chooser.setFileView(new JalviewFileView());
\r
2285 chooser.setDialogTitle("Select a newick-like tree file");
\r
2286 chooser.setToolTipText("Load a tree file");
\r
2288 int value = chooser.showOpenDialog(null);
\r
2290 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2292 String choice = chooser.getSelectedFile().getPath();
\r
2293 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2297 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2299 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2301 catch (Exception ex)
\r
2303 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2304 "Problem reading tree file",
\r
2306 JOptionPane.WARNING_MESSAGE);
\r
2307 ex.printStackTrace();
\r
2313 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2315 return ShowNewickTree(nf,title,600,500,4,5);
\r
2320 * @param nf DOCUMENT ME!
\r
2321 * @param title DOCUMENT ME!
\r
2323 * @return DOCUMENT ME!
\r
2325 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2327 TreePanel tp = null;
\r
2333 if (nf.getTree() != null)
\r
2335 tp = new TreePanel(viewport,
\r
2336 viewport.getAlignment().getSequences(), nf,
\r
2343 tp.setLocation(x,y);
\r
2346 Desktop.addInternalFrame(tp, title, w, h);
\r
2347 addTreeMenuItem(tp, title);
\r
2350 catch (Exception ex)
\r
2352 ex.printStackTrace();
\r
2363 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2364 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2365 printJob.setPrintable(alignPanel, pf);
\r
2367 if (printJob.printDialog())
\r
2373 catch (Exception PrintException)
\r
2375 PrintException.printStackTrace();
\r
2382 * Generates menu items and listener event actions for web service clients
\r
2385 public void BuildWebServiceMenu()
\r
2387 if ( (Discoverer.services != null)
\r
2388 && (Discoverer.services.size() > 0))
\r
2390 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2391 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2392 Vector wsmenu = new Vector();
\r
2393 if (msaws != null)
\r
2395 // Add any Multiple Sequence Alignment Services
\r
2396 final JMenu msawsmenu = new JMenu("Alignment");
\r
2397 final AlignFrame af = this;
\r
2398 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2400 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2402 final JMenuItem method = new JMenuItem(sh.getName());
\r
2403 method.addActionListener(new ActionListener()
\r
2405 public void actionPerformed(ActionEvent e)
\r
2407 SequenceI[] msa = gatherSequencesForAlignment();
\r
2408 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2409 false, true, viewport.getAlignment().getDataset(), af);
\r
2414 msawsmenu.add(method);
\r
2415 // Deal with services that we know accept partial alignments.
\r
2416 if (sh.getName().indexOf("lustal") > -1)
\r
2418 // We know that ClustalWS can accept partial alignments for refinement.
\r
2419 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2420 methodR.addActionListener(new ActionListener()
\r
2422 public void actionPerformed(ActionEvent e)
\r
2424 SequenceI[] msa = gatherSequencesForAlignment();
\r
2425 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2426 true, true, viewport.getAlignment().getDataset(), af);
\r
2431 msawsmenu.add(methodR);
\r
2435 wsmenu.add(msawsmenu);
\r
2437 if (secstrpr != null)
\r
2439 // Add any secondary structure prediction services
\r
2440 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2441 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2443 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2445 final JMenuItem method = new JMenuItem(sh.getName());
\r
2446 method.addActionListener(new ActionListener()
\r
2448 public void actionPerformed(ActionEvent e)
\r
2450 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2451 if (msa.length == 1)
\r
2453 // Single Sequence prediction
\r
2454 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2458 if (msa.length > 1)
\r
2460 // Single Sequence prediction
\r
2461 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2467 secstrmenu.add(method);
\r
2469 wsmenu.add(secstrmenu);
\r
2471 this.webService.removeAll();
\r
2472 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2474 webService.add( (JMenu) wsmenu.get(i));
\r
2479 this.webService.removeAll();
\r
2480 this.webService.add(this.webServiceNoServices);
\r
2482 // TODO: add in rediscovery function
\r
2483 // TODO: reduce code redundancy.
\r
2484 // TODO: group services by location as well as function.
\r
2487 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2489 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2490 getProperty("LAST_DIRECTORY"));
\r
2492 chooser.setFileView(new JalviewFileView());
\r
2493 chooser.setDialogTitle("Export to Vamsas file");
\r
2494 chooser.setToolTipText("Export");
\r
2496 int value = chooser.showSaveDialog(this);
\r
2498 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2500 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2501 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2502 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2510 public void showTranslation_actionPerformed(ActionEvent e)
\r
2512 int s, sSize = viewport.alignment.getHeight();
\r
2513 SequenceI [] newSeq = new SequenceI[sSize];
\r
2516 StringBuffer protein;
\r
2518 for(s=0; s<sSize; s++)
\r
2520 protein = new StringBuffer();
\r
2521 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2522 resSize = seq.length();
\r
2523 resSize -= resSize%3;
\r
2525 for(res = 0; res < resSize; res+=3)
\r
2527 String codon = seq.substring(res, res+3);
\r
2528 codon = codon.replace('U', 'T');
\r
2529 String aa = ResidueProperties.codonTranslate(codon);
\r
2531 protein.append(viewport.getGapCharacter());
\r
2532 else if(aa.equals("STOP"))
\r
2533 protein.append("X");
\r
2535 protein.append( aa );
\r
2537 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2541 AlignmentI al = new Alignment(newSeq);
\r
2542 al.setDataset(null);
\r
2545 ////////////////////////////////
\r
2546 // Copy annotations across
\r
2547 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2548 = viewport.alignment.getAlignmentAnnotation();
\r
2550 if(annotations!=null)
\r
2552 for (int i = 0; i < annotations.length; i++)
\r
2554 if (annotations[i].label.equals("Quality") ||
\r
2555 annotations[i].label.equals("Conservation") ||
\r
2556 annotations[i].label.equals("Consensus"))
\r
2561 aSize = viewport.alignment.getWidth() / 3;
\r
2562 jalview.datamodel.Annotation[] anots =
\r
2563 new jalview.datamodel.Annotation[aSize];
\r
2565 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2567 if (annotations[i].annotations[a] == null
\r
2568 || annotations[i].annotations[a] == null)
\r
2571 anots[a / 3] = new Annotation(
\r
2572 annotations[i].annotations[a].displayCharacter,
\r
2573 annotations[i].annotations[a].description,
\r
2574 annotations[i].annotations[a].secondaryStructure,
\r
2575 annotations[i].annotations[a].value,
\r
2576 annotations[i].annotations[a].colour);
\r
2579 jalview.datamodel.AlignmentAnnotation aa
\r
2580 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2581 annotations[i].description, anots);
\r
2582 al.addAnnotation(aa);
\r
2586 AlignFrame af = new AlignFrame(al);
\r
2587 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2589 NEW_WINDOW_HEIGHT);
\r
2592 // AlignViewport newViewport = new AlignViewport(al);
\r
2593 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2594 // tabbedPane.add("Protein", ap);
\r
2595 // viewports.add(newViewport);
\r
2596 // alignPanels.add(ap);
\r
2599 /////////////////////////
\r
2601 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2602 // ds.setDataset(true);
\r
2603 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2604 // tabbedPane.add("Dataset", dap);
\r
2605 // viewports.add(ds);
\r
2606 // alignPanels.add(dap);
\r
2607 /////////////////////////
\r
2612 /*public void tabSelected()
\r
2614 int index = tabbedPane.getSelectedIndex();
\r
2615 viewport = (AlignViewport)viewports.elementAt(index);
\r
2616 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2622 * @param String DOCUMENT ME!
\r
2624 public boolean parseGroupsFile(String file)
\r
2626 String line = null;
\r
2629 BufferedReader in = new BufferedReader(new FileReader(file));
\r
2630 SequenceI seq = null;
\r
2631 String type, desc, token;
\r
2633 int index, start, end;
\r
2634 StringTokenizer st;
\r
2635 SequenceFeature sf;
\r
2637 String featureGroup = null;
\r
2638 while ( (line = in.readLine()) != null)
\r
2641 st = new StringTokenizer(line, "\t");
\r
2642 if (st.countTokens() == 2)
\r
2644 type = st.nextToken();
\r
2645 if (type.equalsIgnoreCase("startgroup"))
\r
2647 featureGroup = st.nextToken();
\r
2649 else if (type.equalsIgnoreCase("endgroup"))
\r
2651 //We should check whether this is the current group,
\r
2652 //but at present theres no way of showing more than 1 group
\r
2654 featureGroup = null;
\r
2658 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2659 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type,
\r
2660 ucs.findColour("A"));
\r
2665 while (st.hasMoreElements())
\r
2667 desc = st.nextToken();
\r
2668 token = st.nextToken();
\r
2669 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2671 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2676 index = Integer.parseInt(st.nextToken());
\r
2679 start = Integer.parseInt(st.nextToken());
\r
2680 end = Integer.parseInt(st.nextToken());
\r
2682 seq = viewport.alignment.getSequenceAt(index);
\r
2684 type = st.nextToken();
\r
2686 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2688 // Probably the old style groups file
\r
2689 UserColourScheme ucs = new UserColourScheme(type);
\r
2690 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2693 sf = new SequenceFeature(type, desc, "", start, end, featureGroup);
\r
2695 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2699 catch (Exception ex)
\r
2701 System.out.println(line);
\r
2702 ex.printStackTrace();
\r
2703 System.out.println("Error parsing groups file: " + ex +"\n"+line);
\r
2707 viewport.showSequenceFeatures = true;
\r
2708 showSeqFeatures.setSelected(true);
\r
2709 alignPanel.repaint();
\r
2713 public void dragEnter(DropTargetDragEvent evt)
\r
2716 public void dragExit(DropTargetEvent evt)
\r
2719 public void dragOver(DropTargetDragEvent evt)
\r
2722 public void dropActionChanged(DropTargetDragEvent evt)
\r
2725 public void drop(DropTargetDropEvent evt)
\r
2727 Transferable t = evt.getTransferable();
\r
2728 java.util.List files = null;
\r
2732 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2733 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2735 //Works on Windows and MacOSX
\r
2736 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2737 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2739 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2741 // This is used by Unix drag system
\r
2742 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2743 String data = (String) t.getTransferData(uriListFlavor);
\r
2744 files = new java.util.ArrayList(1);
\r
2745 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2748 st.hasMoreTokens(); )
\r
2750 String s = st.nextToken();
\r
2751 if (s.startsWith("#"))
\r
2753 // the line is a comment (as per the RFC 2483)
\r
2757 java.net.URI uri = new java.net.URI(s);
\r
2758 java.io.File file = new java.io.File(uri);
\r
2763 catch (Exception e)
\r
2765 e.printStackTrace();
\r
2767 if (files != null)
\r
2772 for (int i = 0; i < files.size(); i++)
\r
2774 loadJalviewDataFile(files.get(i).toString());
\r
2777 catch (Exception ex)
\r
2779 ex.printStackTrace();
\r
2784 // This method will attempt to load a "dropped" file first by testing
\r
2785 // whether its and Annotation file, then features file. If both are
\r
2786 // false then the user may have dropped an alignment file onto this
\r
2788 public void loadJalviewDataFile(String file)
\r
2791 boolean isAnnotation = new AnnotationReader().readAnnotationFile(viewport.
\r
2794 if (!isAnnotation)
\r
2796 boolean isGroupsFile = parseGroupsFile(file);
\r
2797 if (!isGroupsFile)
\r
2799 String protocol = "File";
\r
2800 String format = new IdentifyFile().Identify(file, protocol);
\r
2801 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2804 FastaFile ff = new FastaFile();
\r
2805 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2806 c.setContents(new StringSelection(ff.print(sequences)), Desktop.instance);
\r
2808 this.paste(false);
\r
2814 alignPanel.adjustAnnotationHeight();
\r
2817 }catch(Exception ex)
\r
2819 ex.printStackTrace();
\r