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
38 import org.biojava.dasobert.eventmodel.*;
\r
45 * @version $Revision$
\r
47 public class AlignFrame
\r
48 extends GAlignFrame implements DropTargetListener, FeatureListener
\r
50 /** DOCUMENT ME!! */
\r
51 public static final int NEW_WINDOW_WIDTH = 700;
\r
53 /** DOCUMENT ME!! */
\r
54 public static final int NEW_WINDOW_HEIGHT = 500;
\r
55 AlignmentPanel alignPanel;
\r
56 AlignViewport viewport;
\r
58 /** DOCUMENT ME!! */
\r
59 public String currentFileFormat = null;
\r
60 Stack historyList = new Stack();
\r
61 Stack redoList = new Stack();
\r
62 private int treeCount = 0;
\r
66 * Creates a new AlignFrame object.
\r
68 * @param al DOCUMENT ME!
\r
70 public AlignFrame(AlignmentI al)
\r
72 viewport = new AlignViewport(al);
\r
74 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
\r
76 if(viewport.vconsensus==null)
\r
78 //Out of memory calculating consensus.
\r
79 BLOSUM62Colour.setEnabled(false);
\r
80 PIDColour.setEnabled(false);
\r
81 conservationMenuItem.setEnabled(false);
\r
82 modifyConservation.setEnabled(false);
\r
83 abovePIDThreshold.setEnabled(false);
\r
84 modifyPID.setEnabled(false);
\r
87 alignPanel = new AlignmentPanel(this, viewport);
\r
89 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
\r
91 if(sortby.equals("Id"))
\r
92 sortIDMenuItem_actionPerformed(null);
\r
93 else if(sortby.equals("Pairwise Identity"))
\r
94 sortPairwiseMenuItem_actionPerformed(null);
\r
96 // remove(tabbedPane);
\r
97 getContentPane().add(alignPanel, BorderLayout.CENTER);
\r
101 // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
\r
104 /////////////////////////
\r
105 if(al.getDataset()==null)
\r
107 al.setDataset(null);
\r
109 // AlignViewport ds = new AlignViewport(al.getDataset(), true);
\r
110 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
111 // tabbedPane.add("Dataset", dap);
\r
112 // viewports.add(ds);
\r
113 // alignPanels.add(dap);
\r
114 /////////////////////////
\r
117 viewport.addPropertyChangeListener(new PropertyChangeListener()
\r
119 public void propertyChange(PropertyChangeEvent evt)
\r
121 if (evt.getPropertyName().equals("alignment"))
\r
123 alignmentChanged();
\r
129 if (Desktop.desktop != null)
\r
131 addServiceListeners();
\r
132 setGUINucleotide(al.isNucleotide());
\r
136 if (jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false))
\r
138 wrapMenuItem.setSelected(true);
\r
139 wrapMenuItem_actionPerformed(null);
\r
144 public AlignViewport getViewport()
\r
149 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
150 private void addServiceListeners()
\r
152 final java.beans.PropertyChangeListener thisListener;
\r
153 // Do this once to get current state
\r
154 BuildWebServiceMenu();
\r
155 Desktop.discoverer.addPropertyChangeListener(
\r
156 thisListener = new java.beans.PropertyChangeListener()
\r
158 public void propertyChange(PropertyChangeEvent evt)
\r
160 // System.out.println("Discoverer property change.");
\r
161 if (evt.getPropertyName().equals("services"))
\r
163 // System.out.println("Rebuilding web service menu");
\r
164 BuildWebServiceMenu();
\r
168 addInternalFrameListener(new javax.swing.event.
\r
169 InternalFrameAdapter()
\r
171 public void internalFrameClosed(
\r
172 javax.swing.event.InternalFrameEvent evt)
\r
174 // System.out.println("deregistering discoverer listener");
\r
175 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
176 closeMenuItem_actionPerformed(null);
\r
182 public void setGUINucleotide(boolean nucleotide)
\r
184 showTranslation.setVisible( nucleotide );
\r
185 //sequenceFeatures.setVisible(!nucleotide );
\r
186 //featureSettings.setVisible( !nucleotide );
\r
187 conservationMenuItem.setVisible( !nucleotide );
\r
188 modifyConservation.setVisible( !nucleotide );
\r
190 //Remember AlignFrame always starts as protein
\r
193 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
197 public void comeBackLater(FeatureEvent evt)
\r
200 public void newFeatures(FeatureEvent evt)
\r
202 if (evt.getFeatures().length > 0)
\r
204 alignPanel.seqPanel.seqCanvas.fr.featuresAdded();
\r
205 alignPanel.repaint();
\r
209 System.out.println("No Features found for " +
\r
210 evt.getDasSource().getNickname());
\r
214 Hashtable progressBars;
\r
215 public void setProgressBar(String message, long id)
\r
217 if(progressBars == null)
\r
218 progressBars = new Hashtable();
\r
220 JPanel progressPanel;
\r
221 GridLayout layout = (GridLayout) statusPanel.getLayout();
\r
222 if(progressBars.get( new Long(id) )!=null)
\r
224 progressPanel = (JPanel)progressBars.get( new Long(id) );
\r
225 statusPanel.remove(progressPanel);
\r
226 progressBars.remove( progressPanel );
\r
227 progressPanel = null;
\r
229 statusBar.setText(message);
\r
231 layout.setRows(layout.getRows() - 1);
\r
235 progressPanel = new JPanel(new BorderLayout(10, 5));
\r
237 JProgressBar progressBar = new JProgressBar();
\r
238 progressBar.setIndeterminate(true);
\r
240 progressPanel.add(new JLabel(message), BorderLayout.WEST);
\r
241 progressPanel.add(progressBar, BorderLayout.CENTER);
\r
243 layout.setRows(layout.getRows() + 1);
\r
244 statusPanel.add(progressPanel);
\r
246 progressBars.put(new Long(id), progressPanel);
\r
254 Added so Castor Mapping file can obtain Jalview Version
\r
256 public String getVersion()
\r
258 return jalview.bin.Cache.getProperty("VERSION");
\r
261 public FeatureRenderer getFeatureRenderer()
\r
263 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
\r
267 public void fetchSequence_actionPerformed(ActionEvent e)
\r
269 new SequenceFetcher(this);
\r
272 public void addFromFile_actionPerformed(ActionEvent e)
\r
274 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
\r
277 public void addFromText_actionPerformed(ActionEvent e)
\r
279 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
\r
282 public void addFromURL_actionPerformed(ActionEvent e)
\r
284 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
\r
290 * @param e DOCUMENT ME!
\r
292 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
294 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
295 getProperty( "LAST_DIRECTORY"),
\r
297 { "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc","jar" },
\r
299 { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview" },
\r
304 chooser.setFileView(new JalviewFileView());
\r
305 chooser.setDialogTitle("Save Alignment to file");
\r
306 chooser.setToolTipText("Save");
\r
308 int value = chooser.showSaveDialog(this);
\r
310 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
312 currentFileFormat = chooser.getSelectedFormat();
\r
314 if (currentFileFormat == null)
\r
316 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
317 "You must select a file format before saving!",
\r
318 "File format not specified",
\r
319 JOptionPane.WARNING_MESSAGE);
\r
320 value = chooser.showSaveDialog(this);
\r
324 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
325 currentFileFormat);
\r
327 String choice = chooser.getSelectedFile().getPath();
\r
328 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
330 saveAlignment(choice, currentFileFormat);
\r
334 public boolean saveAlignment(String file, String format)
\r
336 if (format.equalsIgnoreCase("Jalview"))
\r
338 String shortName = title;
\r
340 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
342 shortName = shortName.substring(shortName.lastIndexOf(
\r
343 java.io.File.separatorChar) + 1);
\r
346 new Jalview2XML().SaveAlignment(this, file, shortName);
\r
348 // USE Jalview2XML to save this file
\r
353 String output = new FormatAdapter().formatSequences(format,
\r
354 viewport.getAlignment().
\r
356 if (output == null)
\r
363 java.io.PrintWriter out = new java.io.PrintWriter(
\r
364 new java.io.FileWriter(file));
\r
368 this.setTitle(file);
\r
371 catch (Exception ex)
\r
373 ex.printStackTrace();
\r
382 * @param e DOCUMENT ME!
\r
384 protected void outputText_actionPerformed(ActionEvent e)
\r
386 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
387 Desktop.addInternalFrame(cap,
\r
388 "Alignment output - " + e.getActionCommand(), 600,
\r
390 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
391 viewport.getAlignment().
\r
398 * @param e DOCUMENT ME!
\r
400 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
402 new HTMLOutput(viewport,
\r
403 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
404 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
407 public void createImageMap(File file, String image)
\r
409 alignPanel.makePNGImageMap(file, image);
\r
415 * @param e DOCUMENT ME!
\r
417 public void createPNG(File f)
\r
419 alignPanel.makePNG(f);
\r
425 * @param e DOCUMENT ME!
\r
427 public void createEPS(File f)
\r
429 alignPanel.makeEPS(f);
\r
435 * @param e DOCUMENT ME!
\r
437 public void printMenuItem_actionPerformed(ActionEvent e)
\r
439 //Putting in a thread avoids Swing painting problems
\r
440 PrintThread thread = new PrintThread();
\r
444 public void exportFeatures_actionPerformed(ActionEvent e)
\r
446 new AnnotationExporter().exportFeatures(alignPanel);
\r
449 public void exportAnnotations_actionPerformed(ActionEvent e)
\r
451 new AnnotationExporter().exportAnnotations(
\r
453 viewport.alignment.getAlignmentAnnotation()
\r
458 public void associatedData_actionPerformed(ActionEvent e)
\r
460 // Pick the tree file
\r
461 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
463 "LAST_DIRECTORY"));
\r
464 chooser.setFileView(new JalviewFileView());
\r
465 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
466 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
468 int value = chooser.showOpenDialog(null);
\r
470 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
472 String choice = chooser.getSelectedFile().getPath();
\r
473 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
474 loadJalviewDataFile(choice);
\r
482 * @param e DOCUMENT ME!
\r
484 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
488 PaintRefresher.components.remove(viewport.alignment);
\r
489 this.setClosed(true);
\r
491 catch (Exception ex)
\r
499 void updateEditMenuBar()
\r
501 if (historyList.size() > 0)
\r
503 undoMenuItem.setEnabled(true);
\r
505 HistoryItem hi = (HistoryItem) historyList.peek();
\r
506 undoMenuItem.setText("Undo " + hi.getDescription());
\r
510 undoMenuItem.setEnabled(false);
\r
511 undoMenuItem.setText("Undo");
\r
514 if (redoList.size() > 0)
\r
516 redoMenuItem.setEnabled(true);
\r
518 HistoryItem hi = (HistoryItem) redoList.peek();
\r
519 redoMenuItem.setText("Redo " + hi.getDescription());
\r
523 redoMenuItem.setEnabled(false);
\r
524 redoMenuItem.setText("Redo");
\r
531 * @param hi DOCUMENT ME!
\r
533 public void addHistoryItem(HistoryItem hi)
\r
535 historyList.push(hi);
\r
536 updateEditMenuBar();
\r
542 * @param e DOCUMENT ME!
\r
544 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
546 HistoryItem hi = (HistoryItem) historyList.pop();
\r
547 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
548 HistoryItem.HIDE));
\r
549 restoreHistoryItem(hi);
\r
550 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
556 * @param e DOCUMENT ME!
\r
558 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
560 HistoryItem hi = (HistoryItem) redoList.pop();
\r
561 restoreHistoryItem(hi);
\r
562 updateEditMenuBar();
\r
563 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
566 // used by undo and redo
\r
567 void restoreHistoryItem(HistoryItem hi)
\r
572 updateEditMenuBar();
\r
574 viewport.firePropertyChange("alignment", null,
\r
575 viewport.getAlignment().getSequences());
\r
581 * @param up DOCUMENT ME!
\r
583 public void moveSelectedSequences(boolean up)
\r
585 SequenceGroup sg = viewport.getSelectionGroup();
\r
594 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
596 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
598 if (!sg.sequences.contains(seq))
\r
603 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
605 if (sg.sequences.contains(temp))
\r
610 viewport.alignment.getSequences().setElementAt(temp, i);
\r
611 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
616 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
618 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
620 if (!sg.sequences.contains(seq))
\r
625 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
627 if (sg.sequences.contains(temp))
\r
632 viewport.alignment.getSequences().setElementAt(temp, i);
\r
633 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
637 alignPanel.repaint();
\r
645 * @param e DOCUMENT ME!
\r
647 protected void copy_actionPerformed(ActionEvent e)
\r
649 if (viewport.getSelectionGroup() == null)
\r
654 SequenceGroup sg = viewport.getSelectionGroup();
\r
656 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
658 Hashtable orderedSeqs = new Hashtable();
\r
659 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
661 for (int i = 0; i < sg.getSize(); i++)
\r
663 SequenceI seq = sg.getSequenceAt(i);
\r
664 int index = viewport.alignment.findIndex(seq);
\r
665 orderedSeqs.put(index + "", seq);
\r
668 int index = 0, startRes, endRes;
\r
671 for (int i = 0; i < sg.getSize(); i++)
\r
673 SequenceI seq = null;
\r
675 while (seq == null)
\r
677 if (orderedSeqs.containsKey(index + ""))
\r
679 seq = (SequenceI) orderedSeqs.get(index + "");
\r
691 //Returns residue following index if gap
\r
692 startRes = seq.findPosition(sg.getStartRes());
\r
695 //Need to find the residue preceeding index if gap
\r
698 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
700 ch = seq.getCharAt(j);
\r
701 if (!jalview.util.Comparison.isGap( (ch)))
\r
709 endRes += seq.getStart() - 1;
\r
712 seqs[i] = new Sequence(seq.getName(),
\r
713 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
716 seqs[i].setDescription(seq.getDescription());
\r
717 seqs[i].setDBRef(seq.getDBRef());
\r
718 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
719 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
720 if(seq.getAnnotation()!=null)
\r
722 for(int a=0; a<seq.getAnnotation().length; a++)
\r
723 seqs[i].addAlignmentAnnotation(seq.getAnnotation()[a]);
\r
727 FastaFile ff = new FastaFile();
\r
728 ff.addJVSuffix( viewport.showJVSuffix );
\r
729 c.setContents(new StringSelection( ff.print(seqs)), Desktop.instance);
\r
730 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
736 * @param e DOCUMENT ME!
\r
738 protected void pasteNew_actionPerformed(ActionEvent e)
\r
746 * @param e DOCUMENT ME!
\r
748 protected void pasteThis_actionPerformed(ActionEvent e)
\r
750 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
751 HistoryItem.PASTE));
\r
758 * @param newAlignment DOCUMENT ME!
\r
760 void paste(boolean newAlignment)
\r
764 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
765 Transferable contents = c.getContents(this);
\r
767 if (contents == null)
\r
772 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
776 String format = new IdentifyFile().Identify(str, "Paste");
\r
777 SequenceI[] sequences;
\r
779 if(Desktop.jalviewClipboard!=null)
\r
781 // The clipboard was filled from within Jalview, we must use the sequences
\r
782 // And dataset from the copied alignment
\r
783 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
787 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
790 AlignmentI alignment = null;
\r
794 alignment = new Alignment(sequences);
\r
796 if(Desktop.jalviewClipboard!=null)
\r
797 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
799 alignment.setDataset( null );
\r
803 alignment = viewport.getAlignment();
\r
806 for (int i = 0; i < sequences.length; i++)
\r
809 Sequence newseq = new Sequence(sequences[i].getName(),
\r
810 sequences[i].getSequence(), sequences[i].getStart(),
\r
811 sequences[i].getEnd());
\r
813 alignment.addSequence(newseq);
\r
815 viewport.setEndSeq(alignment.getHeight());
\r
816 alignment.getWidth();
\r
817 viewport.firePropertyChange("alignment", null, alignment.getSequences());
\r
820 // Add any annotations attached to sequences
\r
821 for (int i = 0; i < sequences.length; i++)
\r
823 if (sequences[i].getAnnotation() != null)
\r
825 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
\r
827 AlignmentAnnotation newAnnot =
\r
828 new AlignmentAnnotation(
\r
829 sequences[i].getAnnotation()[a].label,
\r
830 sequences[i].getAnnotation()[a].description,
\r
831 sequences[i].getAnnotation()[a].annotations,
\r
832 sequences[i].getAnnotation()[a].graphMin,
\r
833 sequences[i].getAnnotation()[a].graphMax,
\r
834 sequences[i].getAnnotation()[a].graph);
\r
836 sequences[i].getAnnotation()[a] = newAnnot;
\r
837 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
\r
839 newAnnot.sequenceRef = sequences[i];
\r
840 newAnnot.adjustForAlignment();
\r
841 alignment.addAnnotation(newAnnot);
\r
842 alignment.setAnnotationIndex(newAnnot, a);
\r
845 alignPanel.annotationPanel.adjustPanelHeight();
\r
851 AlignFrame af = new AlignFrame(alignment);
\r
852 String newtitle = new String("Copied sequences");
\r
855 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
856 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
857 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
860 if (title.startsWith("Copied sequences"))
\r
866 newtitle = newtitle.concat("- from " + title);
\r
869 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
870 NEW_WINDOW_HEIGHT);
\r
876 catch (Exception ex)
\r
878 ex.printStackTrace();
\r
879 System.out.println("Exception whilst pasting: "+ex);
\r
880 // could be anything being pasted in here
\r
889 * @param e DOCUMENT ME!
\r
891 protected void cut_actionPerformed(ActionEvent e)
\r
893 copy_actionPerformed(null);
\r
894 delete_actionPerformed(null);
\r
900 * @param e DOCUMENT ME!
\r
902 protected void delete_actionPerformed(ActionEvent e)
\r
905 if (viewport.getSelectionGroup() == null)
\r
911 SequenceGroup sg = viewport.getSelectionGroup();
\r
915 //Jalview no longer allows deletion of residues.
\r
916 //Check here whether any residues are in selection area
\r
917 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
919 for (int i = 0; i < sg.sequences.size(); i++)
\r
921 SequenceI seq = sg.getSequenceAt(i);
\r
922 int j = sg.getStartRes();
\r
925 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
927 JOptionPane.showInternalMessageDialog(
\r
928 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
929 + "Try hiding columns instead.",
\r
930 "Deletion of residues not permitted",
\r
931 JOptionPane.WARNING_MESSAGE);
\r
936 }while(j<=sg.getEndRes());
\r
941 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
942 HistoryItem.HIDE));
\r
945 for (int i = 0; i < sg.sequences.size(); i++)
\r
947 SequenceI seq = sg.getSequenceAt(i);
\r
948 int index = viewport.getAlignment().findIndex(seq);
\r
950 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
952 // If the cut affects all sequences, remove highlighted columns
\r
953 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
955 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
956 sg.getEndRes() + 1);
\r
959 if (seq.getSequence().length() < 1)
\r
961 viewport.getAlignment().deleteSequence(seq);
\r
965 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
969 viewport.setSelectionGroup(null);
\r
970 viewport.alignment.deleteGroup(sg);
\r
972 viewport.firePropertyChange("alignment", null,
\r
973 viewport.getAlignment().getSequences());
\r
977 if (viewport.getAlignment().getHeight() < 1)
\r
981 this.setClosed(true);
\r
983 catch (Exception ex)
\r
992 * @param e DOCUMENT ME!
\r
994 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
996 viewport.alignment.deleteAllGroups();
\r
997 viewport.setSelectionGroup(null);
\r
998 alignPanel.repaint();
\r
1004 * @param e DOCUMENT ME!
\r
1006 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1008 SequenceGroup sg = new SequenceGroup();
\r
1010 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1013 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
1016 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
1017 viewport.setSelectionGroup(sg);
\r
1018 PaintRefresher.Refresh(null, viewport.alignment);
\r
1024 * @param e DOCUMENT ME!
\r
1026 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1028 if(viewport.cursorMode)
\r
1030 alignPanel.seqPanel.keyboardNo1 = null;
\r
1031 alignPanel.seqPanel.keyboardNo2 = null;
\r
1033 viewport.setSelectionGroup(null);
\r
1034 viewport.getColumnSelection().clear();
\r
1035 viewport.setSelectionGroup(null);
\r
1036 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
1037 alignPanel.idPanel.idCanvas.searchResults = null;
\r
1038 PaintRefresher.Refresh(null, viewport.alignment);
\r
1044 * @param e DOCUMENT ME!
\r
1046 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1048 SequenceGroup sg = viewport.getSelectionGroup();
\r
1052 selectAllSequenceMenuItem_actionPerformed(null);
\r
1057 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1060 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
1063 PaintRefresher.Refresh(null, viewport.alignment);
\r
1069 * @param e DOCUMENT ME!
\r
1071 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
1073 ColumnSelection colSel = viewport.getColumnSelection();
\r
1075 if (colSel.size() > 0)
\r
1077 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
1078 HistoryItem.HIDE));
\r
1080 int min = colSel.getMin();
\r
1081 viewport.getAlignment().trimLeft(min);
\r
1082 colSel.compensateForEdit(0, min);
\r
1084 if (viewport.getSelectionGroup() != null)
\r
1086 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
1089 Vector groups = viewport.alignment.getGroups();
\r
1091 for (int i = 0; i < groups.size(); i++)
\r
1093 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1095 if (!sg.adjustForRemoveLeft(min))
\r
1097 viewport.alignment.deleteGroup(sg);
\r
1101 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1108 * @param e DOCUMENT ME!
\r
1110 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1112 ColumnSelection colSel = viewport.getColumnSelection();
\r
1114 if (colSel.size() > 0)
\r
1116 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1117 HistoryItem.HIDE));
\r
1119 int max = colSel.getMax();
\r
1120 viewport.getAlignment().trimRight(max);
\r
1122 if (viewport.getSelectionGroup() != null)
\r
1124 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1127 Vector groups = viewport.alignment.getGroups();
\r
1129 for (int i = 0; i < groups.size(); i++)
\r
1131 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1133 if (!sg.adjustForRemoveRight(max))
\r
1135 viewport.alignment.deleteGroup(sg);
\r
1139 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1146 * @param e DOCUMENT ME!
\r
1148 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1150 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1151 viewport.alignment, HistoryItem.HIDE));
\r
1153 //This is to maintain viewport position on first residue
\r
1154 //of first sequence
\r
1155 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1156 int startRes = seq.findPosition(viewport.startRes);
\r
1158 viewport.getAlignment().removeGaps();
\r
1160 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1162 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1168 * @param e DOCUMENT ME!
\r
1170 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1172 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1173 HistoryItem.HIDE));
\r
1175 //This is to maintain viewport position on first residue
\r
1176 //of first sequence
\r
1177 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1178 int startRes = seq.findPosition(viewport.startRes);
\r
1181 SequenceI current;
\r
1184 Vector seqs = null;
\r
1187 int end = viewport.alignment.getWidth();
\r
1189 if (viewport.getSelectionGroup() != null
\r
1190 && viewport.getSelectionGroup().sequences != null
\r
1191 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1193 seqs = viewport.getSelectionGroup().sequences;
\r
1194 start = viewport.getSelectionGroup().getStartRes();
\r
1195 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1199 seqs = viewport.alignment.getSequences();
\r
1202 for (int i = 0; i < seqs.size(); i++)
\r
1204 current = (SequenceI) seqs.elementAt(i);
\r
1205 jSize = current.getLength();
\r
1207 // Removing a range is much quicker than removing gaps
\r
1208 // one by one for long sequences
\r
1210 int rangeStart=-1, rangeEnd=-1;
\r
1214 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1216 if(rangeStart==-1)
\r
1231 current.deleteChars(rangeStart, rangeEnd);
\r
1232 j-=rangeEnd-rangeStart;
\r
1233 jSize-=rangeEnd-rangeStart;
\r
1241 while (j < end && j < jSize);
\r
1244 current.deleteChars(rangeStart, rangeEnd);
\r
1248 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1250 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1253 public void alignmentChanged()
\r
1255 if(viewport.padGaps)
\r
1256 viewport.getAlignment().padGaps();
\r
1258 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1260 viewport.updateConsensus();
\r
1261 viewport.updateConservation();
\r
1263 resetAllColourSchemes();
\r
1264 if(alignPanel.overviewPanel!=null)
\r
1265 alignPanel.overviewPanel.updateOverviewImage();
\r
1267 viewport.alignment.adjustSequenceAnnotations();
\r
1269 alignPanel.repaint();
\r
1272 void resetAllColourSchemes()
\r
1274 ColourSchemeI cs = viewport.globalColourScheme;
\r
1277 if (cs instanceof ClustalxColourScheme)
\r
1279 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1280 resetClustalX(viewport.alignment.getSequences(),
\r
1281 viewport.alignment.getWidth());
\r
1284 cs.setConsensus(viewport.vconsensus);
\r
1285 if (cs.conservationApplied())
\r
1287 Alignment al = (Alignment) viewport.alignment;
\r
1288 Conservation c = new Conservation("All",
\r
1289 ResidueProperties.propHash, 3,
\r
1290 al.getSequences(), 0,
\r
1291 al.getWidth() - 1);
\r
1293 c.verdict(false, viewport.ConsPercGaps);
\r
1295 cs.setConservation(c);
\r
1299 int s, sSize = viewport.alignment.getGroups().size();
\r
1300 for(s=0; s<sSize; s++)
\r
1302 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1303 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1305 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1307 sg.recalcConservation();
\r
1314 * @param e DOCUMENT ME!
\r
1316 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1318 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1319 HistoryItem.HIDE));
\r
1321 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1323 // if (viewport.padGaps)
\r
1324 alignmentChanged();
\r
1330 * @param e DOCUMENT ME!
\r
1332 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1334 JInternalFrame frame = new JInternalFrame();
\r
1335 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1336 frame.setContentPane(finder);
\r
1337 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1338 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1344 * @param e DOCUMENT ME!
\r
1346 public void font_actionPerformed(ActionEvent e)
\r
1348 new FontChooser(alignPanel);
\r
1351 public void smoothFont_actionPerformed(ActionEvent e)
\r
1353 viewport.antiAlias = smoothFont.isSelected();
\r
1354 alignPanel.annotationPanel.image = null;
\r
1355 alignPanel.repaint();
\r
1362 * @param e DOCUMENT ME!
\r
1364 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1366 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1368 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1369 alignPanel.repaint();
\r
1376 * @param e DOCUMENT ME!
\r
1378 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1380 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1381 alignPanel.repaint();
\r
1387 * @param e DOCUMENT ME!
\r
1389 public void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1391 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1392 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1393 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1394 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1395 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1401 * @param e DOCUMENT ME!
\r
1403 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1405 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1406 alignPanel.repaint();
\r
1412 * @param e DOCUMENT ME!
\r
1414 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1416 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1417 alignPanel.repaint();
\r
1423 * @param e DOCUMENT ME!
\r
1425 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1427 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1428 alignPanel.repaint();
\r
1434 * @param e DOCUMENT ME!
\r
1436 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1438 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1439 alignPanel.repaint();
\r
1445 * @param e DOCUMENT ME!
\r
1447 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1449 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1450 alignPanel.repaint();
\r
1456 * @param e DOCUMENT ME!
\r
1458 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1460 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1461 alignPanel.repaint();
\r
1465 public void dbRefs_actionPerformed(ActionEvent e)
\r
1467 new DBRefFetcher(viewport.alignment, this);
\r
1470 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1472 new DasSequenceFeatureFetcher(viewport.alignment,
\r
1474 viewport.setShowSequenceFeatures(true);
\r
1475 showSeqFeatures.setSelected(true);
\r
1479 public void featureSettings_actionPerformed(ActionEvent e)
\r
1481 new FeatureSettings(viewport, alignPanel);
\r
1487 * @param evt DOCUMENT ME!
\r
1489 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1491 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1492 alignPanel.repaint();
\r
1493 if (alignPanel.getOverviewPanel() != null)
\r
1495 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1502 * @param e DOCUMENT ME!
\r
1504 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1506 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1507 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1513 * @param e DOCUMENT ME!
\r
1515 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1517 if (alignPanel.overviewPanel != null)
\r
1522 JInternalFrame frame = new JInternalFrame();
\r
1523 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1524 frame.setContentPane(overview);
\r
1525 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1526 frame.getWidth(), frame.getHeight());
\r
1528 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1529 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1531 public void internalFrameClosed(
\r
1532 javax.swing.event.InternalFrameEvent evt)
\r
1534 alignPanel.setOverviewPanel(null);
\r
1539 alignPanel.setOverviewPanel(overview);
\r
1545 * @param e DOCUMENT ME!
\r
1547 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1549 changeColour(null);
\r
1555 * @param e DOCUMENT ME!
\r
1557 public void clustalColour_actionPerformed(ActionEvent e)
\r
1559 changeColour(new ClustalxColourScheme(
\r
1560 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1566 * @param e DOCUMENT ME!
\r
1568 public void zappoColour_actionPerformed(ActionEvent e)
\r
1570 changeColour(new ZappoColourScheme());
\r
1576 * @param e DOCUMENT ME!
\r
1578 public void taylorColour_actionPerformed(ActionEvent e)
\r
1580 changeColour(new TaylorColourScheme());
\r
1586 * @param e DOCUMENT ME!
\r
1588 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1590 changeColour(new HydrophobicColourScheme());
\r
1596 * @param e DOCUMENT ME!
\r
1598 public void helixColour_actionPerformed(ActionEvent e)
\r
1600 changeColour(new HelixColourScheme());
\r
1606 * @param e DOCUMENT ME!
\r
1608 public void strandColour_actionPerformed(ActionEvent e)
\r
1610 changeColour(new StrandColourScheme());
\r
1616 * @param e DOCUMENT ME!
\r
1618 public void turnColour_actionPerformed(ActionEvent e)
\r
1620 changeColour(new TurnColourScheme());
\r
1626 * @param e DOCUMENT ME!
\r
1628 public void buriedColour_actionPerformed(ActionEvent e)
\r
1630 changeColour(new BuriedColourScheme());
\r
1636 * @param e DOCUMENT ME!
\r
1638 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1640 changeColour(new NucleotideColourScheme());
\r
1643 public void annotationColour_actionPerformed(ActionEvent e)
\r
1645 new AnnotationColourChooser(viewport, alignPanel);
\r
1652 * @param e DOCUMENT ME!
\r
1654 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1656 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1662 * @param cs DOCUMENT ME!
\r
1664 public void changeColour(ColourSchemeI cs)
\r
1666 int threshold = 0;
\r
1670 if (viewport.getAbovePIDThreshold())
\r
1672 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1675 cs.setThreshold(threshold,
\r
1676 viewport.getIgnoreGapsConsensus());
\r
1678 viewport.setGlobalColourScheme(cs);
\r
1682 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1685 if (viewport.getConservationSelected())
\r
1688 Alignment al = (Alignment) viewport.alignment;
\r
1689 Conservation c = new Conservation("All",
\r
1690 ResidueProperties.propHash, 3,
\r
1691 al.getSequences(), 0,
\r
1692 al.getWidth() - 1);
\r
1695 c.verdict(false, viewport.ConsPercGaps);
\r
1697 cs.setConservation(c);
\r
1699 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1704 cs.setConservation(null);
\r
1707 cs.setConsensus(viewport.vconsensus);
\r
1710 viewport.setGlobalColourScheme(cs);
\r
1712 if (viewport.getColourAppliesToAllGroups())
\r
1714 Vector groups = viewport.alignment.getGroups();
\r
1716 for (int i = 0; i < groups.size(); i++)
\r
1718 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1726 if (cs instanceof ClustalxColourScheme)
\r
1728 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1730 else if (cs instanceof UserColourScheme)
\r
1732 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1738 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1740 catch (Exception ex)
\r
1745 if (viewport.getAbovePIDThreshold()
\r
1746 || cs instanceof PIDColourScheme
\r
1747 || cs instanceof Blosum62ColourScheme)
\r
1749 sg.cs.setThreshold(threshold,
\r
1750 viewport.getIgnoreGapsConsensus());
\r
1752 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1756 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1759 if (viewport.getConservationSelected())
\r
1761 Conservation c = new Conservation("Group",
\r
1762 ResidueProperties.propHash, 3,
\r
1764 viewport.alignment.getWidth() - 1);
\r
1766 c.verdict(false, viewport.ConsPercGaps);
\r
1767 sg.cs.setConservation(c);
\r
1770 sg.cs.setConservation(null);
\r
1774 if (alignPanel.getOverviewPanel() != null)
\r
1776 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1779 alignPanel.repaint();
\r
1785 * @param e DOCUMENT ME!
\r
1787 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1789 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1791 SliderPanel.setPIDSliderSource(alignPanel,
\r
1792 viewport.getGlobalColourScheme(),
\r
1794 SliderPanel.showPIDSlider();
\r
1801 * @param e DOCUMENT ME!
\r
1803 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1805 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1807 SliderPanel.setConservationSlider(alignPanel,
\r
1808 viewport.globalColourScheme,
\r
1810 SliderPanel.showConservationSlider();
\r
1817 * @param e DOCUMENT ME!
\r
1819 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1821 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1823 viewport.setAbovePIDThreshold(false);
\r
1824 abovePIDThreshold.setSelected(false);
\r
1826 changeColour(viewport.getGlobalColourScheme());
\r
1828 modifyConservation_actionPerformed(null);
\r
1834 * @param e DOCUMENT ME!
\r
1836 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1838 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1840 conservationMenuItem.setSelected(false);
\r
1841 viewport.setConservationSelected(false);
\r
1843 changeColour(viewport.getGlobalColourScheme());
\r
1845 modifyPID_actionPerformed(null);
\r
1851 * @param e DOCUMENT ME!
\r
1853 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1855 if (e.getActionCommand().equals("User Defined..."))
\r
1857 new UserDefinedColours(alignPanel, null);
\r
1861 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1862 getUserColourSchemes().get(e.getActionCommand());
\r
1864 changeColour(udc);
\r
1868 public void updateUserColourMenu()
\r
1871 Component[] menuItems = colourMenu.getMenuComponents();
\r
1872 int i, iSize = menuItems.length;
\r
1873 for (i = 0; i < iSize; i++)
\r
1875 if (menuItems[i].getName() != null &&
\r
1876 menuItems[i].getName().equals("USER_DEFINED"))
\r
1878 colourMenu.remove(menuItems[i]);
\r
1882 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1884 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1885 getUserColourSchemes().keys();
\r
1887 while (userColours.hasMoreElements())
\r
1889 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1890 nextElement().toString());
\r
1891 radioItem.setName("USER_DEFINED");
\r
1892 radioItem.addMouseListener(new MouseAdapter()
\r
1894 public void mousePressed(MouseEvent evt)
\r
1896 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1898 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1900 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1901 "Remove from default list?",
\r
1902 "Remove user defined colour",
\r
1903 JOptionPane.YES_NO_OPTION);
\r
1904 if(option == JOptionPane.YES_OPTION)
\r
1906 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1907 colourMenu.remove(radioItem);
\r
1910 radioItem.addActionListener(new ActionListener()
\r
1912 public void actionPerformed(ActionEvent evt)
\r
1914 userDefinedColour_actionPerformed(evt);
\r
1920 radioItem.addActionListener(new ActionListener()
\r
1922 public void actionPerformed(ActionEvent evt)
\r
1924 userDefinedColour_actionPerformed(evt);
\r
1928 colourMenu.insert(radioItem, 15);
\r
1929 colours.add(radioItem);
\r
1937 * @param e DOCUMENT ME!
\r
1939 public void PIDColour_actionPerformed(ActionEvent e)
\r
1941 changeColour(new PIDColourScheme());
\r
1947 * @param e DOCUMENT ME!
\r
1949 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1951 changeColour(new Blosum62ColourScheme());
\r
1957 * @param e DOCUMENT ME!
\r
1959 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1961 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1962 HistoryItem.SORT));
\r
1963 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1964 viewport.getAlignment().getSequenceAt(0));
\r
1965 alignPanel.repaint();
\r
1971 * @param e DOCUMENT ME!
\r
1973 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1975 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1976 HistoryItem.SORT));
\r
1977 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1978 alignPanel.repaint();
\r
1984 * @param e DOCUMENT ME!
\r
1986 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1988 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1989 HistoryItem.SORT));
\r
1991 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1992 alignPanel.repaint();
\r
1998 * @param e DOCUMENT ME!
\r
2000 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
2002 new RedundancyPanel(alignPanel, this);
\r
2009 * @param e DOCUMENT ME!
\r
2011 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
2013 if ( (viewport.getSelectionGroup() == null) ||
\r
2014 (viewport.getSelectionGroup().getSize() < 2))
\r
2016 JOptionPane.showInternalMessageDialog(this,
\r
2017 "You must select at least 2 sequences.",
\r
2018 "Invalid Selection",
\r
2019 JOptionPane.WARNING_MESSAGE);
\r
2023 JInternalFrame frame = new JInternalFrame();
\r
2024 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
2025 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
2032 * @param e DOCUMENT ME!
\r
2034 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
2036 if ( ( (viewport.getSelectionGroup() != null) &&
\r
2037 (viewport.getSelectionGroup().getSize() < 4) &&
\r
2038 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
2039 (viewport.getAlignment().getHeight() < 4))
\r
2041 JOptionPane.showInternalMessageDialog(this,
\r
2042 "Principal component analysis must take\n" +
\r
2043 "at least 4 input sequences.",
\r
2044 "Sequence selection insufficient",
\r
2045 JOptionPane.WARNING_MESSAGE);
\r
2050 new PCAPanel(viewport);
\r
2054 public void autoCalculate_actionPerformed(ActionEvent e)
\r
2056 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
2057 if(viewport.autoCalculateConsensus)
\r
2059 alignmentChanged();
\r
2067 * @param e DOCUMENT ME!
\r
2069 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
2071 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2077 * @param e DOCUMENT ME!
\r
2079 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2081 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2087 * @param e DOCUMENT ME!
\r
2089 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2091 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2097 * @param e DOCUMENT ME!
\r
2099 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2101 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2107 * @param type DOCUMENT ME!
\r
2108 * @param pwType DOCUMENT ME!
\r
2109 * @param title DOCUMENT ME!
\r
2111 void NewTreePanel(String type, String pwType, String title)
\r
2115 if ( (viewport.getSelectionGroup() != null) &&
\r
2116 (viewport.getSelectionGroup().getSize() > 3))
\r
2119 SequenceGroup sg = viewport.getSelectionGroup();
\r
2121 /* Decide if the selection is a column region */
\r
2122 while (s < sg.sequences.size())
\r
2124 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
2127 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2128 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2129 "Try using the Pad function in the edit menu,\n" +
\r
2130 "or one of the multiple sequence alignment web services.",
\r
2131 "Sequences in selection are not aligned",
\r
2132 JOptionPane.WARNING_MESSAGE);
\r
2138 title = title + " on region";
\r
2139 tp = new TreePanel(viewport,
\r
2140 viewport.getSelectionGroup().sequences, type, pwType,
\r
2141 sg.getStartRes(), sg.getEndRes());
\r
2145 //are the sequences aligned?
\r
2146 if (!viewport.alignment.isAligned())
\r
2148 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2149 "The sequences must be aligned before creating a tree.\n" +
\r
2150 "Try using the Pad function in the edit menu,\n" +
\r
2151 "or one of the multiple sequence alignment web services.",
\r
2152 "Sequences not aligned",
\r
2153 JOptionPane.WARNING_MESSAGE);
\r
2158 tp = new TreePanel(viewport,
\r
2159 viewport.getAlignment().getSequences(), type, pwType,
\r
2161 viewport.alignment.getWidth());
\r
2164 addTreeMenuItem(tp, title);
\r
2166 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2172 * @param title DOCUMENT ME!
\r
2173 * @param order DOCUMENT ME!
\r
2175 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2177 final JMenuItem item = new JMenuItem("by " + title);
\r
2179 item.addActionListener(new java.awt.event.ActionListener()
\r
2181 public void actionPerformed(ActionEvent e)
\r
2183 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2184 HistoryItem.SORT));
\r
2186 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2187 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2188 alignPanel.repaint();
\r
2194 * Maintain the Order by->Displayed Tree menu.
\r
2195 * Creates a new menu item for a TreePanel with an appropriate
\r
2196 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2197 * to remove the menu item when the treePanel is closed, and adjust
\r
2198 * the tree leaf to sequence mapping when the alignment is modified.
\r
2199 * @param treePanel Displayed tree window.
\r
2200 * @param title SortBy menu item title.
\r
2202 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2204 final JMenuItem item = new JMenuItem(title);
\r
2208 if (treeCount == 1)
\r
2210 sort.add(sortByTreeMenu);
\r
2213 sortByTreeMenu.add(item);
\r
2214 item.addActionListener(new java.awt.event.ActionListener()
\r
2216 public void actionPerformed(ActionEvent e)
\r
2218 addHistoryItem(new HistoryItem("Tree Sort",
\r
2219 viewport.alignment, HistoryItem.SORT));
\r
2220 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2221 treePanel.getTree());
\r
2222 alignPanel.repaint();
\r
2226 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2227 InternalFrameAdapter()
\r
2229 public void internalFrameClosed(
\r
2230 javax.swing.event.InternalFrameEvent evt)
\r
2233 sortByTreeMenu.remove(item);
\r
2235 if (treeCount == 0)
\r
2237 sort.remove(sortByTreeMenu);
\r
2245 * Work out whether the whole set of sequences
\r
2246 * or just the selected set will be submitted for multiple alignment.
\r
2249 private SequenceI[] gatherSequencesForAlignment()
\r
2251 // Now, check we have enough sequences
\r
2252 SequenceI[] msa = null;
\r
2254 if ( (viewport.getSelectionGroup() != null) &&
\r
2255 (viewport.getSelectionGroup().getSize() > 1))
\r
2257 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2258 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2260 msa = new SequenceI[sz = seqs.getSize()];
\r
2262 for (int i = 0; i < sz; i++)
\r
2264 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2269 Vector seqs = viewport.getAlignment().getSequences();
\r
2271 if (seqs.size() > 1)
\r
2273 msa = new SequenceI[seqs.size()];
\r
2275 for (int i = 0; i < seqs.size(); i++)
\r
2277 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2285 * Decides what is submitted to a secondary structure prediction service,
\r
2286 * the currently selected sequence, or the currently selected alignment
\r
2287 * (where the first sequence in the set is the one that the prediction
\r
2290 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2292 SequenceI seq = null;
\r
2293 SequenceI[] msa = null;
\r
2295 if ( (viewport.getSelectionGroup() != null) &&
\r
2296 (viewport.getSelectionGroup().getSize() > 0))
\r
2298 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2299 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2301 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2303 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2308 msa = new SequenceI[sz = seqs.getSize()];
\r
2310 for (int i = 0; i < sz; i++)
\r
2312 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2318 Vector seqs = viewport.getAlignment().getSequences();
\r
2320 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2322 seq = (SequenceI) seqs.elementAt(0);
\r
2326 msa = new SequenceI[seqs.size()];
\r
2328 for (int i = 0; i < seqs.size(); i++)
\r
2330 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2342 return new SequenceI[]
\r
2352 * @param e DOCUMENT ME!
\r
2354 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2356 // Pick the tree file
\r
2357 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2359 "LAST_DIRECTORY"));
\r
2360 chooser.setFileView(new JalviewFileView());
\r
2361 chooser.setDialogTitle("Select a newick-like tree file");
\r
2362 chooser.setToolTipText("Load a tree file");
\r
2364 int value = chooser.showOpenDialog(null);
\r
2366 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2368 String choice = chooser.getSelectedFile().getPath();
\r
2369 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2373 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2375 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2377 catch (Exception ex)
\r
2379 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2380 "Problem reading tree file",
\r
2382 JOptionPane.WARNING_MESSAGE);
\r
2383 ex.printStackTrace();
\r
2389 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2391 return ShowNewickTree(nf,title,600,500,4,5);
\r
2396 * @param nf DOCUMENT ME!
\r
2397 * @param title DOCUMENT ME!
\r
2399 * @return DOCUMENT ME!
\r
2401 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2403 TreePanel tp = null;
\r
2409 if (nf.getTree() != null)
\r
2411 tp = new TreePanel(viewport,
\r
2412 viewport.getAlignment().getSequences(), nf,
\r
2419 tp.setLocation(x,y);
\r
2422 Desktop.addInternalFrame(tp, title, w, h);
\r
2423 addTreeMenuItem(tp, title);
\r
2426 catch (Exception ex)
\r
2428 ex.printStackTrace();
\r
2439 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2440 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2441 printJob.setPrintable(alignPanel, pf);
\r
2443 if (printJob.printDialog())
\r
2449 catch (Exception PrintException)
\r
2451 PrintException.printStackTrace();
\r
2458 * Generates menu items and listener event actions for web service clients
\r
2461 public void BuildWebServiceMenu()
\r
2463 if ( (Discoverer.services != null)
\r
2464 && (Discoverer.services.size() > 0))
\r
2466 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2467 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2468 Vector wsmenu = new Vector();
\r
2469 if (msaws != null)
\r
2471 // Add any Multiple Sequence Alignment Services
\r
2472 final JMenu msawsmenu = new JMenu("Alignment");
\r
2473 final AlignFrame af = this;
\r
2474 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2476 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2478 final JMenuItem method = new JMenuItem(sh.getName());
\r
2479 method.addActionListener(new ActionListener()
\r
2481 public void actionPerformed(ActionEvent e)
\r
2483 SequenceI[] msa = gatherSequencesForAlignment();
\r
2484 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2485 false, true, viewport.getAlignment().getDataset(), af);
\r
2490 msawsmenu.add(method);
\r
2491 // Deal with services that we know accept partial alignments.
\r
2492 if (sh.getName().indexOf("lustal") > -1)
\r
2494 // We know that ClustalWS can accept partial alignments for refinement.
\r
2495 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2496 methodR.addActionListener(new ActionListener()
\r
2498 public void actionPerformed(ActionEvent e)
\r
2500 SequenceI[] msa = gatherSequencesForAlignment();
\r
2501 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2502 true, true, viewport.getAlignment().getDataset(), af);
\r
2507 msawsmenu.add(methodR);
\r
2511 wsmenu.add(msawsmenu);
\r
2513 if (secstrpr != null)
\r
2515 // Add any secondary structure prediction services
\r
2516 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2517 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2519 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2521 final JMenuItem method = new JMenuItem(sh.getName());
\r
2522 method.addActionListener(new ActionListener()
\r
2524 public void actionPerformed(ActionEvent e)
\r
2526 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2527 if (msa.length == 1)
\r
2529 // Single Sequence prediction
\r
2530 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2534 if (msa.length > 1)
\r
2536 // Single Sequence prediction
\r
2537 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2543 secstrmenu.add(method);
\r
2545 wsmenu.add(secstrmenu);
\r
2547 this.webService.removeAll();
\r
2548 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2550 webService.add( (JMenu) wsmenu.get(i));
\r
2555 this.webService.removeAll();
\r
2556 this.webService.add(this.webServiceNoServices);
\r
2558 // TODO: add in rediscovery function
\r
2559 // TODO: reduce code redundancy.
\r
2560 // TODO: group services by location as well as function.
\r
2563 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2565 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2566 getProperty("LAST_DIRECTORY"));
\r
2568 chooser.setFileView(new JalviewFileView());
\r
2569 chooser.setDialogTitle("Export to Vamsas file");
\r
2570 chooser.setToolTipText("Export");
\r
2572 int value = chooser.showSaveDialog(this);
\r
2574 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2576 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2577 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2578 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2586 public void showTranslation_actionPerformed(ActionEvent e)
\r
2588 int s, sSize = viewport.alignment.getHeight();
\r
2589 SequenceI [] newSeq = new SequenceI[sSize];
\r
2592 StringBuffer protein;
\r
2594 for(s=0; s<sSize; s++)
\r
2596 protein = new StringBuffer();
\r
2597 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2598 resSize = seq.length();
\r
2599 resSize -= resSize%3;
\r
2601 for(res = 0; res < resSize; res+=3)
\r
2603 String codon = seq.substring(res, res+3);
\r
2604 codon = codon.replace('U', 'T');
\r
2605 String aa = ResidueProperties.codonTranslate(codon);
\r
2607 protein.append(viewport.getGapCharacter());
\r
2608 else if(aa.equals("STOP"))
\r
2609 protein.append("X");
\r
2611 protein.append( aa );
\r
2613 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2617 AlignmentI al = new Alignment(newSeq);
\r
2618 al.setDataset(null);
\r
2621 ////////////////////////////////
\r
2622 // Copy annotations across
\r
2623 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2624 = viewport.alignment.getAlignmentAnnotation();
\r
2626 if(annotations!=null)
\r
2628 for (int i = 0; i < annotations.length; i++)
\r
2630 if (annotations[i].label.equals("Quality") ||
\r
2631 annotations[i].label.equals("Conservation") ||
\r
2632 annotations[i].label.equals("Consensus"))
\r
2637 aSize = viewport.alignment.getWidth() / 3;
\r
2638 jalview.datamodel.Annotation[] anots =
\r
2639 new jalview.datamodel.Annotation[aSize];
\r
2641 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2643 if (annotations[i].annotations[a] == null
\r
2644 || annotations[i].annotations[a] == null)
\r
2647 anots[a / 3] = new Annotation(
\r
2648 annotations[i].annotations[a].displayCharacter,
\r
2649 annotations[i].annotations[a].description,
\r
2650 annotations[i].annotations[a].secondaryStructure,
\r
2651 annotations[i].annotations[a].value,
\r
2652 annotations[i].annotations[a].colour);
\r
2655 jalview.datamodel.AlignmentAnnotation aa
\r
2656 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2657 annotations[i].description, anots);
\r
2658 al.addAnnotation(aa);
\r
2662 AlignFrame af = new AlignFrame(al);
\r
2663 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2665 NEW_WINDOW_HEIGHT);
\r
2668 // AlignViewport newViewport = new AlignViewport(al);
\r
2669 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2670 // tabbedPane.add("Protein", ap);
\r
2671 // viewports.add(newViewport);
\r
2672 // alignPanels.add(ap);
\r
2675 /////////////////////////
\r
2677 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2678 // ds.setDataset(true);
\r
2679 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2680 // tabbedPane.add("Dataset", dap);
\r
2681 // viewports.add(ds);
\r
2682 // alignPanels.add(dap);
\r
2683 /////////////////////////
\r
2688 /*public void tabSelected()
\r
2690 int index = tabbedPane.getSelectedIndex();
\r
2691 viewport = (AlignViewport)viewports.elementAt(index);
\r
2692 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2698 * @param String DOCUMENT ME!
\r
2700 public boolean parseFeaturesFile(String file, String type)
\r
2702 boolean featuresFile = false;
\r
2704 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment.getDataset(),
\r
2705 alignPanel.seqPanel.seqCanvas.
\r
2706 getFeatureRenderer().featureColours,
\r
2709 catch(Exception ex)
\r
2711 ex.printStackTrace();
\r
2716 viewport.showSequenceFeatures = true;
\r
2717 showSeqFeatures.setSelected(true);
\r
2718 alignPanel.repaint();
\r
2721 return featuresFile;
\r
2724 public void dragEnter(DropTargetDragEvent evt)
\r
2727 public void dragExit(DropTargetEvent evt)
\r
2730 public void dragOver(DropTargetDragEvent evt)
\r
2733 public void dropActionChanged(DropTargetDragEvent evt)
\r
2736 public void drop(DropTargetDropEvent evt)
\r
2738 Transferable t = evt.getTransferable();
\r
2739 java.util.List files = null;
\r
2743 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2744 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2746 //Works on Windows and MacOSX
\r
2747 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2748 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2750 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2752 // This is used by Unix drag system
\r
2753 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2754 String data = (String) t.getTransferData(uriListFlavor);
\r
2755 files = new java.util.ArrayList(1);
\r
2756 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2759 st.hasMoreTokens(); )
\r
2761 String s = st.nextToken();
\r
2762 if (s.startsWith("#"))
\r
2764 // the line is a comment (as per the RFC 2483)
\r
2768 java.net.URI uri = new java.net.URI(s);
\r
2769 java.io.File file = new java.io.File(uri);
\r
2774 catch (Exception e)
\r
2776 e.printStackTrace();
\r
2778 if (files != null)
\r
2783 for (int i = 0; i < files.size(); i++)
\r
2785 loadJalviewDataFile(files.get(i).toString());
\r
2788 catch (Exception ex)
\r
2790 ex.printStackTrace();
\r
2795 // This method will attempt to load a "dropped" file first by testing
\r
2796 // whether its and Annotation file, then features file. If both are
\r
2797 // false then the user may have dropped an alignment file onto this
\r
2799 public void loadJalviewDataFile(String file)
\r
2802 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
\r
2805 if (!isAnnotation)
\r
2807 boolean isGroupsFile = parseFeaturesFile(file,
\r
2808 AppletFormatAdapter.FILE);
\r
2809 if (!isGroupsFile)
\r
2811 String protocol = "File";
\r
2812 String format = new IdentifyFile().Identify(file, protocol);
\r
2813 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2816 FastaFile ff = new FastaFile();
\r
2817 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2818 c.setContents(new StringSelection(ff.print(sequences)), Desktop.instance);
\r
2820 this.paste(false);
\r
2826 alignPanel.adjustAnnotationHeight();
\r
2829 }catch(Exception ex)
\r
2831 ex.printStackTrace();
\r