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 Hashtable progressBars;
\r
210 public void setProgressBar(String message, long id)
\r
212 if(progressBars == null)
\r
213 progressBars = new Hashtable();
\r
215 JPanel progressPanel;
\r
216 GridLayout layout = (GridLayout) statusPanel.getLayout();
\r
217 if(progressBars.get( new Long(id) )!=null)
\r
219 progressPanel = (JPanel)progressBars.get( new Long(id) );
\r
220 statusPanel.remove(progressPanel);
\r
221 progressBars.remove( progressPanel );
\r
222 progressPanel = null;
\r
224 statusBar.setText(message);
\r
226 layout.setRows(layout.getRows() - 1);
\r
230 progressPanel = new JPanel(new BorderLayout(10, 5));
\r
232 JProgressBar progressBar = new JProgressBar();
\r
233 progressBar.setIndeterminate(true);
\r
235 progressPanel.add(new JLabel(message), BorderLayout.WEST);
\r
236 progressPanel.add(progressBar, BorderLayout.CENTER);
\r
238 layout.setRows(layout.getRows() + 1);
\r
239 statusPanel.add(progressPanel);
\r
241 progressBars.put(new Long(id), progressPanel);
\r
249 Added so Castor Mapping file can obtain Jalview Version
\r
251 public String getVersion()
\r
253 return jalview.bin.Cache.getProperty("VERSION");
\r
256 public FeatureRenderer getFeatureRenderer()
\r
258 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
\r
262 public void fetchSequence_actionPerformed(ActionEvent e)
\r
264 new SequenceFetcher(this);
\r
267 public void addFromFile_actionPerformed(ActionEvent e)
\r
269 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
\r
272 public void addFromText_actionPerformed(ActionEvent e)
\r
274 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
\r
277 public void addFromURL_actionPerformed(ActionEvent e)
\r
279 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
\r
285 * @param e DOCUMENT ME!
\r
287 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
289 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
290 getProperty( "LAST_DIRECTORY"),
\r
292 { "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc","jar" },
\r
294 { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview" },
\r
299 chooser.setFileView(new JalviewFileView());
\r
300 chooser.setDialogTitle("Save Alignment to file");
\r
301 chooser.setToolTipText("Save");
\r
303 int value = chooser.showSaveDialog(this);
\r
305 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
307 currentFileFormat = chooser.getSelectedFormat();
\r
309 if (currentFileFormat == null)
\r
311 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
312 "You must select a file format before saving!",
\r
313 "File format not specified",
\r
314 JOptionPane.WARNING_MESSAGE);
\r
315 value = chooser.showSaveDialog(this);
\r
319 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
320 currentFileFormat);
\r
322 String choice = chooser.getSelectedFile().getPath();
\r
323 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
325 saveAlignment(choice, currentFileFormat);
\r
329 public boolean saveAlignment(String file, String format)
\r
331 if (format.equalsIgnoreCase("Jalview"))
\r
333 String shortName = title;
\r
335 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
337 shortName = shortName.substring(shortName.lastIndexOf(
\r
338 java.io.File.separatorChar) + 1);
\r
341 new Jalview2XML().SaveAlignment(this, file, shortName);
\r
343 // USE Jalview2XML to save this file
\r
348 String output = new FormatAdapter().formatSequences(format,
\r
349 viewport.getAlignment().
\r
351 if (output == null)
\r
358 java.io.PrintWriter out = new java.io.PrintWriter(
\r
359 new java.io.FileWriter(file));
\r
363 this.setTitle(file);
\r
366 catch (Exception ex)
\r
368 ex.printStackTrace();
\r
377 * @param e DOCUMENT ME!
\r
379 protected void outputText_actionPerformed(ActionEvent e)
\r
381 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
382 Desktop.addInternalFrame(cap,
\r
383 "Alignment output - " + e.getActionCommand(), 600,
\r
385 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
386 viewport.getAlignment().
\r
393 * @param e DOCUMENT ME!
\r
395 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
397 new HTMLOutput(viewport,
\r
398 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
399 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
402 public void createImageMap(File file, String image)
\r
404 alignPanel.makePNGImageMap(file, image);
\r
410 * @param e DOCUMENT ME!
\r
412 public void createPNG(File f)
\r
414 alignPanel.makePNG(f);
\r
420 * @param e DOCUMENT ME!
\r
422 public void createEPS(File f)
\r
424 alignPanel.makeEPS(f);
\r
430 * @param e DOCUMENT ME!
\r
432 public void printMenuItem_actionPerformed(ActionEvent e)
\r
434 //Putting in a thread avoids Swing painting problems
\r
435 PrintThread thread = new PrintThread();
\r
439 public void exportFeatures_actionPerformed(ActionEvent e)
\r
441 new AnnotationExporter().exportFeatures(alignPanel);
\r
444 public void exportAnnotations_actionPerformed(ActionEvent e)
\r
446 new AnnotationExporter().exportAnnotations(
\r
448 viewport.alignment.getAlignmentAnnotation()
\r
453 public void associatedData_actionPerformed(ActionEvent e)
\r
455 // Pick the tree file
\r
456 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
458 "LAST_DIRECTORY"));
\r
459 chooser.setFileView(new JalviewFileView());
\r
460 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
461 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
463 int value = chooser.showOpenDialog(null);
\r
465 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
467 String choice = chooser.getSelectedFile().getPath();
\r
468 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
469 loadJalviewDataFile(choice);
\r
477 * @param e DOCUMENT ME!
\r
479 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
483 PaintRefresher.components.remove(viewport.alignment);
\r
484 this.setClosed(true);
\r
486 catch (Exception ex)
\r
494 void updateEditMenuBar()
\r
496 if (historyList.size() > 0)
\r
498 undoMenuItem.setEnabled(true);
\r
500 HistoryItem hi = (HistoryItem) historyList.peek();
\r
501 undoMenuItem.setText("Undo " + hi.getDescription());
\r
505 undoMenuItem.setEnabled(false);
\r
506 undoMenuItem.setText("Undo");
\r
509 if (redoList.size() > 0)
\r
511 redoMenuItem.setEnabled(true);
\r
513 HistoryItem hi = (HistoryItem) redoList.peek();
\r
514 redoMenuItem.setText("Redo " + hi.getDescription());
\r
518 redoMenuItem.setEnabled(false);
\r
519 redoMenuItem.setText("Redo");
\r
526 * @param hi DOCUMENT ME!
\r
528 public void addHistoryItem(HistoryItem hi)
\r
530 historyList.push(hi);
\r
531 updateEditMenuBar();
\r
537 * @param e DOCUMENT ME!
\r
539 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
541 HistoryItem hi = (HistoryItem) historyList.pop();
\r
542 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
543 HistoryItem.HIDE));
\r
544 restoreHistoryItem(hi);
\r
545 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
551 * @param e DOCUMENT ME!
\r
553 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
555 HistoryItem hi = (HistoryItem) redoList.pop();
\r
556 restoreHistoryItem(hi);
\r
557 updateEditMenuBar();
\r
558 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
561 // used by undo and redo
\r
562 void restoreHistoryItem(HistoryItem hi)
\r
567 updateEditMenuBar();
\r
569 viewport.firePropertyChange("alignment", null,
\r
570 viewport.getAlignment().getSequences());
\r
576 * @param up DOCUMENT ME!
\r
578 public void moveSelectedSequences(boolean up)
\r
580 SequenceGroup sg = viewport.getSelectionGroup();
\r
589 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
591 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
593 if (!sg.getSequences(false).contains(seq))
\r
598 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
600 if (sg.getSequences(false).contains(temp))
\r
605 viewport.alignment.getSequences().setElementAt(temp, i);
\r
606 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
611 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
613 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
615 if (!sg.getSequences(false).contains(seq))
\r
620 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
622 if (sg.getSequences(false).contains(temp))
\r
627 viewport.alignment.getSequences().setElementAt(temp, i);
\r
628 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
632 alignPanel.repaint();
\r
640 * @param e DOCUMENT ME!
\r
642 protected void copy_actionPerformed(ActionEvent e)
\r
644 if (viewport.getSelectionGroup() == null)
\r
649 SequenceGroup sg = viewport.getSelectionGroup();
\r
651 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
653 Hashtable orderedSeqs = new Hashtable();
\r
654 SequenceI[] seqs = new SequenceI[sg.getSize(false)];
\r
656 for (int i = 0; i < sg.getSize(false); i++)
\r
658 SequenceI seq = sg.getSequenceAt(i);
\r
659 int index = viewport.alignment.findIndex(seq);
\r
660 orderedSeqs.put(index + "", seq);
\r
663 int index = 0, startRes, endRes;
\r
666 for (int i = 0; i < sg.getSize(false); i++)
\r
668 SequenceI seq = null;
\r
670 while (seq == null)
\r
672 if (orderedSeqs.containsKey(index + ""))
\r
674 seq = (SequenceI) orderedSeqs.get(index + "");
\r
686 //Returns residue following index if gap
\r
687 startRes = seq.findPosition(sg.getStartRes());
\r
690 //Need to find the residue preceeding index if gap
\r
693 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
695 ch = seq.getCharAt(j);
\r
696 if (!jalview.util.Comparison.isGap( (ch)))
\r
704 endRes += seq.getStart() - 1;
\r
707 seqs[i] = new Sequence(seq.getName(),
\r
708 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
711 seqs[i].setDescription(seq.getDescription());
\r
712 seqs[i].setDBRef(seq.getDBRef());
\r
713 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
714 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
715 if(seq.getAnnotation()!=null)
\r
717 for(int a=0; a<seq.getAnnotation().length; a++)
\r
718 seqs[i].addAlignmentAnnotation(seq.getAnnotation()[a]);
\r
722 FastaFile ff = new FastaFile();
\r
723 ff.addJVSuffix( viewport.showJVSuffix );
\r
724 c.setContents(new StringSelection( ff.print(seqs)), Desktop.instance);
\r
725 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
731 * @param e DOCUMENT ME!
\r
733 protected void pasteNew_actionPerformed(ActionEvent e)
\r
741 * @param e DOCUMENT ME!
\r
743 protected void pasteThis_actionPerformed(ActionEvent e)
\r
745 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
746 HistoryItem.PASTE));
\r
753 * @param newAlignment DOCUMENT ME!
\r
755 void paste(boolean newAlignment)
\r
759 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
760 Transferable contents = c.getContents(this);
\r
762 if (contents == null)
\r
767 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
771 String format = new IdentifyFile().Identify(str, "Paste");
\r
772 SequenceI[] sequences;
\r
774 if(Desktop.jalviewClipboard!=null)
\r
776 // The clipboard was filled from within Jalview, we must use the sequences
\r
777 // And dataset from the copied alignment
\r
778 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
782 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
785 AlignmentI alignment = null;
\r
789 alignment = new Alignment(sequences);
\r
791 if(Desktop.jalviewClipboard!=null)
\r
792 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
794 alignment.setDataset( null );
\r
798 alignment = viewport.getAlignment();
\r
801 for (int i = 0; i < sequences.length; i++)
\r
804 Sequence newseq = new Sequence(sequences[i].getName(),
\r
805 sequences[i].getSequence(), sequences[i].getStart(),
\r
806 sequences[i].getEnd());
\r
808 alignment.addSequence(newseq);
\r
810 viewport.setEndSeq(alignment.getHeight());
\r
811 alignment.getWidth();
\r
812 viewport.firePropertyChange("alignment", null, alignment.getSequences());
\r
815 // Add any annotations attached to sequences
\r
816 for (int i = 0; i < sequences.length; i++)
\r
818 if (sequences[i].getAnnotation() != null)
\r
820 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
\r
822 AlignmentAnnotation newAnnot =
\r
823 new AlignmentAnnotation(
\r
824 sequences[i].getAnnotation()[a].label,
\r
825 sequences[i].getAnnotation()[a].description,
\r
826 sequences[i].getAnnotation()[a].annotations,
\r
827 sequences[i].getAnnotation()[a].graphMin,
\r
828 sequences[i].getAnnotation()[a].graphMax,
\r
829 sequences[i].getAnnotation()[a].graph);
\r
831 sequences[i].getAnnotation()[a] = newAnnot;
\r
832 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
\r
834 newAnnot.sequenceRef = sequences[i];
\r
835 newAnnot.adjustForAlignment();
\r
836 alignment.addAnnotation(newAnnot);
\r
837 alignment.setAnnotationIndex(newAnnot, a);
\r
840 alignPanel.annotationPanel.adjustPanelHeight();
\r
846 AlignFrame af = new AlignFrame(alignment);
\r
847 String newtitle = new String("Copied sequences");
\r
850 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
851 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
852 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
855 if (title.startsWith("Copied sequences"))
\r
861 newtitle = newtitle.concat("- from " + title);
\r
864 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
865 NEW_WINDOW_HEIGHT);
\r
871 catch (Exception ex)
\r
873 ex.printStackTrace();
\r
874 System.out.println("Exception whilst pasting: "+ex);
\r
875 // could be anything being pasted in here
\r
884 * @param e DOCUMENT ME!
\r
886 protected void cut_actionPerformed(ActionEvent e)
\r
888 copy_actionPerformed(null);
\r
889 delete_actionPerformed(null);
\r
895 * @param e DOCUMENT ME!
\r
897 protected void delete_actionPerformed(ActionEvent e)
\r
900 if (viewport.getSelectionGroup() == null)
\r
906 SequenceGroup sg = viewport.getSelectionGroup();
\r
910 //Jalview no longer allows deletion of residues.
\r
911 //Check here whether any residues are in selection area
\r
912 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
914 for (int i = 0; i < sg.sequences.size(); i++)
\r
916 SequenceI seq = sg.getSequenceAt(i);
\r
917 int j = sg.getStartRes();
\r
920 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
922 JOptionPane.showInternalMessageDialog(
\r
923 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
924 + "Try hiding columns instead.",
\r
925 "Deletion of residues not permitted",
\r
926 JOptionPane.WARNING_MESSAGE);
\r
931 }while(j<=sg.getEndRes());
\r
936 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
937 HistoryItem.HIDE));
\r
940 for (int i = 0; i < sg.getSize(false); i++)
\r
942 SequenceI seq = sg.getSequenceAt(i);
\r
943 int index = viewport.getAlignment().findIndex(seq);
\r
945 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
947 // If the cut affects all sequences, remove highlighted columns
\r
948 if (sg.getSize(false) == viewport.alignment.getHeight())
\r
950 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
951 sg.getEndRes() + 1);
\r
954 if (seq.getSequence().length() < 1)
\r
956 viewport.getAlignment().deleteSequence(seq);
\r
960 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
964 viewport.setSelectionGroup(null);
\r
965 viewport.alignment.deleteGroup(sg);
\r
967 viewport.firePropertyChange("alignment", null,
\r
968 viewport.getAlignment().getSequences());
\r
972 if (viewport.getAlignment().getHeight() < 1)
\r
976 this.setClosed(true);
\r
978 catch (Exception ex)
\r
987 * @param e DOCUMENT ME!
\r
989 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
991 viewport.alignment.deleteAllGroups();
\r
992 viewport.setSelectionGroup(null);
\r
993 alignPanel.repaint();
\r
999 * @param e DOCUMENT ME!
\r
1001 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1003 SequenceGroup sg = new SequenceGroup();
\r
1005 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1008 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
1011 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
1012 viewport.setSelectionGroup(sg);
\r
1013 PaintRefresher.Refresh(null, viewport.alignment);
\r
1019 * @param e DOCUMENT ME!
\r
1021 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1023 if(viewport.cursorMode)
\r
1025 alignPanel.seqPanel.keyboardNo1 = null;
\r
1026 alignPanel.seqPanel.keyboardNo2 = null;
\r
1028 viewport.setSelectionGroup(null);
\r
1029 viewport.getColumnSelection().clear();
\r
1030 viewport.setSelectionGroup(null);
\r
1031 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
1032 alignPanel.idPanel.idCanvas.searchResults = null;
\r
1033 alignPanel.repaint();
\r
1034 PaintRefresher.Refresh(null, viewport.alignment);
\r
1040 * @param e DOCUMENT ME!
\r
1042 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1044 SequenceGroup sg = viewport.getSelectionGroup();
\r
1048 selectAllSequenceMenuItem_actionPerformed(null);
\r
1053 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1056 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
1059 PaintRefresher.Refresh(null, viewport.alignment);
\r
1065 * @param e DOCUMENT ME!
\r
1067 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
1069 ColumnSelection colSel = viewport.getColumnSelection();
\r
1071 if (colSel.size() > 0)
\r
1073 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
1074 HistoryItem.HIDE));
\r
1076 int min = colSel.getMin();
\r
1077 viewport.getAlignment().trimLeft(min);
\r
1078 colSel.compensateForEdit(0, min);
\r
1080 if (viewport.getSelectionGroup() != null)
\r
1082 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
1085 Vector groups = viewport.alignment.getGroups();
\r
1087 for (int i = 0; i < groups.size(); i++)
\r
1089 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1091 if (!sg.adjustForRemoveLeft(min))
\r
1093 viewport.alignment.deleteGroup(sg);
\r
1097 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1104 * @param e DOCUMENT ME!
\r
1106 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1108 ColumnSelection colSel = viewport.getColumnSelection();
\r
1110 if (colSel.size() > 0)
\r
1112 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1113 HistoryItem.HIDE));
\r
1115 int max = colSel.getMax();
\r
1116 viewport.getAlignment().trimRight(max);
\r
1118 if (viewport.getSelectionGroup() != null)
\r
1120 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1123 Vector groups = viewport.alignment.getGroups();
\r
1125 for (int i = 0; i < groups.size(); i++)
\r
1127 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1129 if (!sg.adjustForRemoveRight(max))
\r
1131 viewport.alignment.deleteGroup(sg);
\r
1135 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1142 * @param e DOCUMENT ME!
\r
1144 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1146 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1147 viewport.alignment, HistoryItem.HIDE));
\r
1149 //This is to maintain viewport position on first residue
\r
1150 //of first sequence
\r
1151 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1152 int startRes = seq.findPosition(viewport.startRes);
\r
1154 viewport.getAlignment().removeGaps();
\r
1156 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1158 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1164 * @param e DOCUMENT ME!
\r
1166 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1168 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1169 HistoryItem.HIDE));
\r
1171 //This is to maintain viewport position on first residue
\r
1172 //of first sequence
\r
1173 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1174 int startRes = seq.findPosition(viewport.startRes);
\r
1177 SequenceI current;
\r
1180 Vector seqs = null;
\r
1183 int end = viewport.alignment.getWidth();
\r
1185 if (viewport.getSelectionGroup() != null
\r
1186 && viewport.getSelectionGroup().getSequences(true) != null
\r
1187 && viewport.getSelectionGroup().getSize(true) > 0)
\r
1189 seqs = viewport.getSelectionGroup().getSequences(true);
\r
1190 start = viewport.getSelectionGroup().getStartRes();
\r
1191 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1195 seqs = viewport.alignment.getSequences();
\r
1198 for (int i = 0; i < seqs.size(); i++)
\r
1200 current = (SequenceI) seqs.elementAt(i);
\r
1201 jSize = current.getLength();
\r
1203 // Removing a range is much quicker than removing gaps
\r
1204 // one by one for long sequences
\r
1206 int rangeStart=-1, rangeEnd=-1;
\r
1210 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1212 if(rangeStart==-1)
\r
1227 current.deleteChars(rangeStart, rangeEnd);
\r
1228 j-=rangeEnd-rangeStart;
\r
1229 jSize-=rangeEnd-rangeStart;
\r
1237 while (j < end && j < jSize);
\r
1240 current.deleteChars(rangeStart, rangeEnd);
\r
1244 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1246 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1249 public void alignmentChanged()
\r
1251 if(viewport.padGaps)
\r
1252 viewport.getAlignment().padGaps();
\r
1254 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1256 viewport.updateConsensus();
\r
1257 viewport.updateConservation();
\r
1259 resetAllColourSchemes();
\r
1260 if(alignPanel.overviewPanel!=null)
\r
1261 alignPanel.overviewPanel.updateOverviewImage();
\r
1263 viewport.alignment.adjustSequenceAnnotations();
\r
1265 alignPanel.repaint();
\r
1268 void resetAllColourSchemes()
\r
1270 ColourSchemeI cs = viewport.globalColourScheme;
\r
1273 if (cs instanceof ClustalxColourScheme)
\r
1275 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1276 resetClustalX(viewport.alignment.getSequences(),
\r
1277 viewport.alignment.getWidth());
\r
1280 cs.setConsensus(viewport.vconsensus);
\r
1281 if (cs.conservationApplied())
\r
1283 Alignment al = (Alignment) viewport.alignment;
\r
1284 Conservation c = new Conservation("All",
\r
1285 ResidueProperties.propHash, 3,
\r
1286 al.getSequences(), 0,
\r
1287 al.getWidth() - 1);
\r
1289 c.verdict(false, viewport.ConsPercGaps);
\r
1291 cs.setConservation(c);
\r
1295 int s, sSize = viewport.alignment.getGroups().size();
\r
1296 for(s=0; s<sSize; s++)
\r
1298 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1299 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1301 ((ClustalxColourScheme)sg.cs).resetClustalX(
\r
1302 sg.getSequences(true), sg.getWidth());
\r
1304 sg.recalcConservation();
\r
1311 * @param e DOCUMENT ME!
\r
1313 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1315 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1316 HistoryItem.HIDE));
\r
1318 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1320 // if (viewport.padGaps)
\r
1321 alignmentChanged();
\r
1327 * @param e DOCUMENT ME!
\r
1329 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1331 JInternalFrame frame = new JInternalFrame();
\r
1332 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1333 frame.setContentPane(finder);
\r
1334 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1335 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1341 * @param e DOCUMENT ME!
\r
1343 public void font_actionPerformed(ActionEvent e)
\r
1345 new FontChooser(alignPanel);
\r
1348 public void smoothFont_actionPerformed(ActionEvent e)
\r
1350 viewport.antiAlias = smoothFont.isSelected();
\r
1351 alignPanel.annotationPanel.image = null;
\r
1352 alignPanel.repaint();
\r
1359 * @param e DOCUMENT ME!
\r
1361 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1363 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1365 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1366 alignPanel.repaint();
\r
1373 * @param e DOCUMENT ME!
\r
1375 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1377 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1378 alignPanel.repaint();
\r
1384 * @param e DOCUMENT ME!
\r
1386 public void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1388 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1389 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1390 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1391 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1392 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1398 * @param e DOCUMENT ME!
\r
1400 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1402 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1403 alignPanel.repaint();
\r
1409 * @param e DOCUMENT ME!
\r
1411 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1413 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1414 alignPanel.repaint();
\r
1420 * @param e DOCUMENT ME!
\r
1422 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1424 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1425 alignPanel.repaint();
\r
1431 * @param e DOCUMENT ME!
\r
1433 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1435 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1436 alignPanel.repaint();
\r
1442 * @param e DOCUMENT ME!
\r
1444 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1446 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1447 alignPanel.repaint();
\r
1453 * @param e DOCUMENT ME!
\r
1455 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1457 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1458 alignPanel.repaint();
\r
1462 public void dbRefs_actionPerformed(ActionEvent e)
\r
1464 new DBRefFetcher(viewport.alignment, this);
\r
1467 public void defaultDASSource_actionPerformed(ActionEvent e)
\r
1469 new DasSequenceFeatureFetcher(viewport.alignment, this);
\r
1470 viewport.setShowSequenceFeatures(true);
\r
1471 showSeqFeatures.setSelected(true);
\r
1474 public void modifyDASSource_actionPerformed(ActionEvent e)
\r
1476 DasSourceBrowser dsb = new DasSourceBrowser();
\r
1477 JInternalFrame frame = new JInternalFrame();
\r
1478 frame.setContentPane(dsb);
\r
1479 Desktop.addInternalFrame(frame, "Modify DAS Source",
\r
1484 public void featureSettings_actionPerformed(ActionEvent e)
\r
1486 new FeatureSettings(viewport, alignPanel);
\r
1492 * @param evt DOCUMENT ME!
\r
1494 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1496 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1497 alignPanel.repaint();
\r
1498 if (alignPanel.getOverviewPanel() != null)
\r
1500 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1507 * @param e DOCUMENT ME!
\r
1509 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1511 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1512 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1518 * @param e DOCUMENT ME!
\r
1520 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1522 if (alignPanel.overviewPanel != null)
\r
1527 JInternalFrame frame = new JInternalFrame();
\r
1528 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1529 frame.setContentPane(overview);
\r
1530 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1531 frame.getWidth(), frame.getHeight());
\r
1533 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1534 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1536 public void internalFrameClosed(
\r
1537 javax.swing.event.InternalFrameEvent evt)
\r
1539 alignPanel.setOverviewPanel(null);
\r
1544 alignPanel.setOverviewPanel(overview);
\r
1550 * @param e DOCUMENT ME!
\r
1552 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1554 changeColour(null);
\r
1560 * @param e DOCUMENT ME!
\r
1562 public void clustalColour_actionPerformed(ActionEvent e)
\r
1564 changeColour(new ClustalxColourScheme(
\r
1565 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1571 * @param e DOCUMENT ME!
\r
1573 public void zappoColour_actionPerformed(ActionEvent e)
\r
1575 changeColour(new ZappoColourScheme());
\r
1581 * @param e DOCUMENT ME!
\r
1583 public void taylorColour_actionPerformed(ActionEvent e)
\r
1585 changeColour(new TaylorColourScheme());
\r
1591 * @param e DOCUMENT ME!
\r
1593 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1595 changeColour(new HydrophobicColourScheme());
\r
1601 * @param e DOCUMENT ME!
\r
1603 public void helixColour_actionPerformed(ActionEvent e)
\r
1605 changeColour(new HelixColourScheme());
\r
1611 * @param e DOCUMENT ME!
\r
1613 public void strandColour_actionPerformed(ActionEvent e)
\r
1615 changeColour(new StrandColourScheme());
\r
1621 * @param e DOCUMENT ME!
\r
1623 public void turnColour_actionPerformed(ActionEvent e)
\r
1625 changeColour(new TurnColourScheme());
\r
1631 * @param e DOCUMENT ME!
\r
1633 public void buriedColour_actionPerformed(ActionEvent e)
\r
1635 changeColour(new BuriedColourScheme());
\r
1641 * @param e DOCUMENT ME!
\r
1643 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1645 changeColour(new NucleotideColourScheme());
\r
1648 public void annotationColour_actionPerformed(ActionEvent e)
\r
1650 new AnnotationColourChooser(viewport, alignPanel);
\r
1657 * @param e DOCUMENT ME!
\r
1659 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1661 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1667 * @param cs DOCUMENT ME!
\r
1669 public void changeColour(ColourSchemeI cs)
\r
1671 int threshold = 0;
\r
1675 if (viewport.getAbovePIDThreshold())
\r
1677 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1680 cs.setThreshold(threshold,
\r
1681 viewport.getIgnoreGapsConsensus());
\r
1683 viewport.setGlobalColourScheme(cs);
\r
1687 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1690 if (viewport.getConservationSelected())
\r
1693 Alignment al = (Alignment) viewport.alignment;
\r
1694 Conservation c = new Conservation("All",
\r
1695 ResidueProperties.propHash, 3,
\r
1696 al.getSequences(), 0,
\r
1697 al.getWidth() - 1);
\r
1700 c.verdict(false, viewport.ConsPercGaps);
\r
1702 cs.setConservation(c);
\r
1704 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1709 cs.setConservation(null);
\r
1712 cs.setConsensus(viewport.vconsensus);
\r
1715 viewport.setGlobalColourScheme(cs);
\r
1717 if (viewport.getColourAppliesToAllGroups())
\r
1719 Vector groups = viewport.alignment.getGroups();
\r
1721 for (int i = 0; i < groups.size(); i++)
\r
1723 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1731 if (cs instanceof ClustalxColourScheme)
\r
1733 sg.cs = new ClustalxColourScheme(
\r
1734 sg.getSequences(true), sg.getWidth());
\r
1736 else if (cs instanceof UserColourScheme)
\r
1738 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1744 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1746 catch (Exception ex)
\r
1751 if (viewport.getAbovePIDThreshold()
\r
1752 || cs instanceof PIDColourScheme
\r
1753 || cs instanceof Blosum62ColourScheme)
\r
1755 sg.cs.setThreshold(threshold,
\r
1756 viewport.getIgnoreGapsConsensus());
\r
1758 sg.cs.setConsensus(AAFrequency.calculate(
\r
1759 sg.getSequences(true), 0,
\r
1763 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1766 if (viewport.getConservationSelected())
\r
1768 Conservation c = new Conservation("Group",
\r
1769 ResidueProperties.propHash, 3,
\r
1770 sg.getSequences(true), 0,
\r
1771 viewport.alignment.getWidth() - 1);
\r
1773 c.verdict(false, viewport.ConsPercGaps);
\r
1774 sg.cs.setConservation(c);
\r
1777 sg.cs.setConservation(null);
\r
1781 if (alignPanel.getOverviewPanel() != null)
\r
1783 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1786 alignPanel.repaint();
\r
1792 * @param e DOCUMENT ME!
\r
1794 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1796 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1798 SliderPanel.setPIDSliderSource(alignPanel,
\r
1799 viewport.getGlobalColourScheme(),
\r
1801 SliderPanel.showPIDSlider();
\r
1808 * @param e DOCUMENT ME!
\r
1810 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1812 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1814 SliderPanel.setConservationSlider(alignPanel,
\r
1815 viewport.globalColourScheme,
\r
1817 SliderPanel.showConservationSlider();
\r
1824 * @param e DOCUMENT ME!
\r
1826 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1828 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1830 viewport.setAbovePIDThreshold(false);
\r
1831 abovePIDThreshold.setSelected(false);
\r
1833 changeColour(viewport.getGlobalColourScheme());
\r
1835 modifyConservation_actionPerformed(null);
\r
1841 * @param e DOCUMENT ME!
\r
1843 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1845 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1847 conservationMenuItem.setSelected(false);
\r
1848 viewport.setConservationSelected(false);
\r
1850 changeColour(viewport.getGlobalColourScheme());
\r
1852 modifyPID_actionPerformed(null);
\r
1858 * @param e DOCUMENT ME!
\r
1860 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1862 if (e.getActionCommand().equals("User Defined..."))
\r
1864 new UserDefinedColours(alignPanel, null);
\r
1868 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1869 getUserColourSchemes().get(e.getActionCommand());
\r
1871 changeColour(udc);
\r
1875 public void updateUserColourMenu()
\r
1878 Component[] menuItems = colourMenu.getMenuComponents();
\r
1879 int i, iSize = menuItems.length;
\r
1880 for (i = 0; i < iSize; i++)
\r
1882 if (menuItems[i].getName() != null &&
\r
1883 menuItems[i].getName().equals("USER_DEFINED"))
\r
1885 colourMenu.remove(menuItems[i]);
\r
1889 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1891 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1892 getUserColourSchemes().keys();
\r
1894 while (userColours.hasMoreElements())
\r
1896 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1897 nextElement().toString());
\r
1898 radioItem.setName("USER_DEFINED");
\r
1899 radioItem.addMouseListener(new MouseAdapter()
\r
1901 public void mousePressed(MouseEvent evt)
\r
1903 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1905 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1907 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1908 "Remove from default list?",
\r
1909 "Remove user defined colour",
\r
1910 JOptionPane.YES_NO_OPTION);
\r
1911 if(option == JOptionPane.YES_OPTION)
\r
1913 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1914 colourMenu.remove(radioItem);
\r
1917 radioItem.addActionListener(new ActionListener()
\r
1919 public void actionPerformed(ActionEvent evt)
\r
1921 userDefinedColour_actionPerformed(evt);
\r
1927 radioItem.addActionListener(new ActionListener()
\r
1929 public void actionPerformed(ActionEvent evt)
\r
1931 userDefinedColour_actionPerformed(evt);
\r
1935 colourMenu.insert(radioItem, 15);
\r
1936 colours.add(radioItem);
\r
1944 * @param e DOCUMENT ME!
\r
1946 public void PIDColour_actionPerformed(ActionEvent e)
\r
1948 changeColour(new PIDColourScheme());
\r
1954 * @param e DOCUMENT ME!
\r
1956 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1958 changeColour(new Blosum62ColourScheme());
\r
1964 * @param e DOCUMENT ME!
\r
1966 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1968 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1969 HistoryItem.SORT));
\r
1970 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1971 viewport.getAlignment().getSequenceAt(0));
\r
1972 alignPanel.repaint();
\r
1978 * @param e DOCUMENT ME!
\r
1980 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1982 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1983 HistoryItem.SORT));
\r
1984 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1985 alignPanel.repaint();
\r
1991 * @param e DOCUMENT ME!
\r
1993 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1995 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1996 HistoryItem.SORT));
\r
1998 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1999 alignPanel.repaint();
\r
2005 * @param e DOCUMENT ME!
\r
2007 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
2009 new RedundancyPanel(alignPanel, this);
\r
2016 * @param e DOCUMENT ME!
\r
2018 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
2020 if ( (viewport.getSelectionGroup() == null) ||
\r
2021 (viewport.getSelectionGroup().getSize(false) < 2))
\r
2023 JOptionPane.showInternalMessageDialog(this,
\r
2024 "You must select at least 2 sequences.",
\r
2025 "Invalid Selection",
\r
2026 JOptionPane.WARNING_MESSAGE);
\r
2030 JInternalFrame frame = new JInternalFrame();
\r
2031 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
2032 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
2039 * @param e DOCUMENT ME!
\r
2041 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
2043 if ( ( (viewport.getSelectionGroup() != null) &&
\r
2044 (viewport.getSelectionGroup().getSize(false) < 4) &&
\r
2045 (viewport.getSelectionGroup().getSize(false) > 0)) ||
\r
2046 (viewport.getAlignment().getHeight() < 4))
\r
2048 JOptionPane.showInternalMessageDialog(this,
\r
2049 "Principal component analysis must take\n" +
\r
2050 "at least 4 input sequences.",
\r
2051 "Sequence selection insufficient",
\r
2052 JOptionPane.WARNING_MESSAGE);
\r
2057 new PCAPanel(viewport);
\r
2061 public void autoCalculate_actionPerformed(ActionEvent e)
\r
2063 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
2064 if(viewport.autoCalculateConsensus)
\r
2066 alignmentChanged();
\r
2074 * @param e DOCUMENT ME!
\r
2076 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
2078 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2084 * @param e DOCUMENT ME!
\r
2086 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2088 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2094 * @param e DOCUMENT ME!
\r
2096 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2098 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2104 * @param e DOCUMENT ME!
\r
2106 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2108 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2114 * @param type DOCUMENT ME!
\r
2115 * @param pwType DOCUMENT ME!
\r
2116 * @param title DOCUMENT ME!
\r
2118 void NewTreePanel(String type, String pwType, String title)
\r
2122 if ( (viewport.getSelectionGroup() != null) &&
\r
2123 (viewport.getSelectionGroup().getSize(false) > 3))
\r
2126 SequenceGroup sg = viewport.getSelectionGroup();
\r
2128 /* Decide if the selection is a column region */
\r
2129 while (s < sg.getSize(false))
\r
2131 if ( ( (SequenceI) sg.getSequences(false).elementAt(s++)).getLength() <
\r
2134 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2135 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2136 "Try using the Pad function in the edit menu,\n" +
\r
2137 "or one of the multiple sequence alignment web services.",
\r
2138 "Sequences in selection are not aligned",
\r
2139 JOptionPane.WARNING_MESSAGE);
\r
2145 title = title + " on region";
\r
2146 tp = new TreePanel(viewport,
\r
2147 viewport.getSelectionGroup().getSequences(false),
\r
2149 sg.getStartRes(), sg.getEndRes());
\r
2153 //are the sequences aligned?
\r
2154 if (!viewport.alignment.isAligned())
\r
2156 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2157 "The sequences must be aligned before creating a tree.\n" +
\r
2158 "Try using the Pad function in the edit menu,\n" +
\r
2159 "or one of the multiple sequence alignment web services.",
\r
2160 "Sequences not aligned",
\r
2161 JOptionPane.WARNING_MESSAGE);
\r
2166 tp = new TreePanel(viewport,
\r
2167 viewport.getAlignment().getSequences(), type, pwType,
\r
2169 viewport.alignment.getWidth());
\r
2172 addTreeMenuItem(tp, title);
\r
2174 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2180 * @param title DOCUMENT ME!
\r
2181 * @param order DOCUMENT ME!
\r
2183 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2185 final JMenuItem item = new JMenuItem("by " + title);
\r
2187 item.addActionListener(new java.awt.event.ActionListener()
\r
2189 public void actionPerformed(ActionEvent e)
\r
2191 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2192 HistoryItem.SORT));
\r
2194 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2195 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2196 alignPanel.repaint();
\r
2202 * Maintain the Order by->Displayed Tree menu.
\r
2203 * Creates a new menu item for a TreePanel with an appropriate
\r
2204 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2205 * to remove the menu item when the treePanel is closed, and adjust
\r
2206 * the tree leaf to sequence mapping when the alignment is modified.
\r
2207 * @param treePanel Displayed tree window.
\r
2208 * @param title SortBy menu item title.
\r
2210 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2212 final JMenuItem item = new JMenuItem(title);
\r
2216 if (treeCount == 1)
\r
2218 sort.add(sortByTreeMenu);
\r
2221 sortByTreeMenu.add(item);
\r
2222 item.addActionListener(new java.awt.event.ActionListener()
\r
2224 public void actionPerformed(ActionEvent e)
\r
2226 addHistoryItem(new HistoryItem("Tree Sort",
\r
2227 viewport.alignment, HistoryItem.SORT));
\r
2228 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2229 treePanel.getTree());
\r
2230 alignPanel.repaint();
\r
2234 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2235 InternalFrameAdapter()
\r
2237 public void internalFrameClosed(
\r
2238 javax.swing.event.InternalFrameEvent evt)
\r
2241 sortByTreeMenu.remove(item);
\r
2243 if (treeCount == 0)
\r
2245 sort.remove(sortByTreeMenu);
\r
2253 * Work out whether the whole set of sequences
\r
2254 * or just the selected set will be submitted for multiple alignment.
\r
2257 private SequenceI[] gatherSequencesForAlignment()
\r
2259 // Now, check we have enough sequences
\r
2260 SequenceI[] msa = null;
\r
2262 if ( (viewport.getSelectionGroup() != null) &&
\r
2263 (viewport.getSelectionGroup().getSize(false) > 1))
\r
2265 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2266 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2268 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2270 for (int i = 0; i < sz; i++)
\r
2272 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2277 Vector seqs = viewport.getAlignment().getSequences();
\r
2279 if (seqs.size() > 1)
\r
2281 msa = new SequenceI[seqs.size()];
\r
2283 for (int i = 0; i < seqs.size(); i++)
\r
2285 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2293 * Decides what is submitted to a secondary structure prediction service,
\r
2294 * the currently selected sequence, or the currently selected alignment
\r
2295 * (where the first sequence in the set is the one that the prediction
\r
2298 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2300 SequenceI seq = null;
\r
2301 SequenceI[] msa = null;
\r
2303 if ( (viewport.getSelectionGroup() != null) &&
\r
2304 (viewport.getSelectionGroup().getSize(false) > 0))
\r
2306 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2307 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2309 if ( (seqs.getSize(false) == 1) || !viewport.alignment.isAligned())
\r
2311 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2316 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2318 for (int i = 0; i < sz; i++)
\r
2320 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2326 Vector seqs = viewport.getAlignment().getSequences();
\r
2328 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2330 seq = (SequenceI) seqs.elementAt(0);
\r
2334 msa = new SequenceI[seqs.size()];
\r
2336 for (int i = 0; i < seqs.size(); i++)
\r
2338 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2350 return new SequenceI[]
\r
2360 * @param e DOCUMENT ME!
\r
2362 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2364 // Pick the tree file
\r
2365 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2367 "LAST_DIRECTORY"));
\r
2368 chooser.setFileView(new JalviewFileView());
\r
2369 chooser.setDialogTitle("Select a newick-like tree file");
\r
2370 chooser.setToolTipText("Load a tree file");
\r
2372 int value = chooser.showOpenDialog(null);
\r
2374 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2376 String choice = chooser.getSelectedFile().getPath();
\r
2377 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2381 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2383 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2385 catch (Exception ex)
\r
2387 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2388 "Problem reading tree file",
\r
2390 JOptionPane.WARNING_MESSAGE);
\r
2391 ex.printStackTrace();
\r
2397 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2399 return ShowNewickTree(nf,title,600,500,4,5);
\r
2404 * @param nf DOCUMENT ME!
\r
2405 * @param title DOCUMENT ME!
\r
2407 * @return DOCUMENT ME!
\r
2409 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2411 TreePanel tp = null;
\r
2417 if (nf.getTree() != null)
\r
2419 tp = new TreePanel(viewport,
\r
2420 viewport.getAlignment().getSequences(), nf,
\r
2427 tp.setLocation(x,y);
\r
2430 Desktop.addInternalFrame(tp, title, w, h);
\r
2431 addTreeMenuItem(tp, title);
\r
2434 catch (Exception ex)
\r
2436 ex.printStackTrace();
\r
2447 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2448 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2449 printJob.setPrintable(alignPanel, pf);
\r
2451 if (printJob.printDialog())
\r
2457 catch (Exception PrintException)
\r
2459 PrintException.printStackTrace();
\r
2466 * Generates menu items and listener event actions for web service clients
\r
2469 public void BuildWebServiceMenu()
\r
2471 if ( (Discoverer.services != null)
\r
2472 && (Discoverer.services.size() > 0))
\r
2474 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2475 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2476 Vector wsmenu = new Vector();
\r
2477 if (msaws != null)
\r
2479 // Add any Multiple Sequence Alignment Services
\r
2480 final JMenu msawsmenu = new JMenu("Alignment");
\r
2481 final AlignFrame af = this;
\r
2482 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2484 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2486 final JMenuItem method = new JMenuItem(sh.getName());
\r
2487 method.addActionListener(new ActionListener()
\r
2489 public void actionPerformed(ActionEvent e)
\r
2491 SequenceI[] msa = gatherSequencesForAlignment();
\r
2492 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2493 false, true, viewport.getAlignment().getDataset(), af);
\r
2498 msawsmenu.add(method);
\r
2499 // Deal with services that we know accept partial alignments.
\r
2500 if (sh.getName().indexOf("lustal") > -1)
\r
2502 // We know that ClustalWS can accept partial alignments for refinement.
\r
2503 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2504 methodR.addActionListener(new ActionListener()
\r
2506 public void actionPerformed(ActionEvent e)
\r
2508 SequenceI[] msa = gatherSequencesForAlignment();
\r
2509 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2510 true, true, viewport.getAlignment().getDataset(), af);
\r
2515 msawsmenu.add(methodR);
\r
2519 wsmenu.add(msawsmenu);
\r
2521 if (secstrpr != null)
\r
2523 // Add any secondary structure prediction services
\r
2524 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2525 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2527 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2529 final JMenuItem method = new JMenuItem(sh.getName());
\r
2530 method.addActionListener(new ActionListener()
\r
2532 public void actionPerformed(ActionEvent e)
\r
2534 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2535 if (msa.length == 1)
\r
2537 // Single Sequence prediction
\r
2538 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2542 if (msa.length > 1)
\r
2544 // Single Sequence prediction
\r
2545 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2551 secstrmenu.add(method);
\r
2553 wsmenu.add(secstrmenu);
\r
2555 this.webService.removeAll();
\r
2556 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2558 webService.add( (JMenu) wsmenu.get(i));
\r
2563 this.webService.removeAll();
\r
2564 this.webService.add(this.webServiceNoServices);
\r
2566 // TODO: add in rediscovery function
\r
2567 // TODO: reduce code redundancy.
\r
2568 // TODO: group services by location as well as function.
\r
2571 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2573 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2574 getProperty("LAST_DIRECTORY"));
\r
2576 chooser.setFileView(new JalviewFileView());
\r
2577 chooser.setDialogTitle("Export to Vamsas file");
\r
2578 chooser.setToolTipText("Export");
\r
2580 int value = chooser.showSaveDialog(this);
\r
2582 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2584 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2585 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2586 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2594 public void showTranslation_actionPerformed(ActionEvent e)
\r
2596 int s, sSize = viewport.alignment.getHeight();
\r
2597 SequenceI [] newSeq = new SequenceI[sSize];
\r
2600 StringBuffer protein;
\r
2602 for(s=0; s<sSize; s++)
\r
2604 protein = new StringBuffer();
\r
2605 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2606 resSize = seq.length();
\r
2607 resSize -= resSize%3;
\r
2609 for(res = 0; res < resSize; res+=3)
\r
2611 String codon = seq.substring(res, res+3);
\r
2612 codon = codon.replace('U', 'T');
\r
2613 String aa = ResidueProperties.codonTranslate(codon);
\r
2615 protein.append(viewport.getGapCharacter());
\r
2616 else if(aa.equals("STOP"))
\r
2617 protein.append("X");
\r
2619 protein.append( aa );
\r
2621 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2625 AlignmentI al = new Alignment(newSeq);
\r
2626 al.setDataset(null);
\r
2629 ////////////////////////////////
\r
2630 // Copy annotations across
\r
2631 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2632 = viewport.alignment.getAlignmentAnnotation();
\r
2634 if(annotations!=null)
\r
2636 for (int i = 0; i < annotations.length; i++)
\r
2638 if (annotations[i].label.equals("Quality") ||
\r
2639 annotations[i].label.equals("Conservation") ||
\r
2640 annotations[i].label.equals("Consensus"))
\r
2645 aSize = viewport.alignment.getWidth() / 3;
\r
2646 jalview.datamodel.Annotation[] anots =
\r
2647 new jalview.datamodel.Annotation[aSize];
\r
2649 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2651 if (annotations[i].annotations[a] == null
\r
2652 || annotations[i].annotations[a] == null)
\r
2655 anots[a / 3] = new Annotation(
\r
2656 annotations[i].annotations[a].displayCharacter,
\r
2657 annotations[i].annotations[a].description,
\r
2658 annotations[i].annotations[a].secondaryStructure,
\r
2659 annotations[i].annotations[a].value,
\r
2660 annotations[i].annotations[a].colour);
\r
2663 jalview.datamodel.AlignmentAnnotation aa
\r
2664 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2665 annotations[i].description, anots);
\r
2666 al.addAnnotation(aa);
\r
2670 AlignFrame af = new AlignFrame(al);
\r
2671 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2673 NEW_WINDOW_HEIGHT);
\r
2676 // AlignViewport newViewport = new AlignViewport(al);
\r
2677 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2678 // tabbedPane.add("Protein", ap);
\r
2679 // viewports.add(newViewport);
\r
2680 // alignPanels.add(ap);
\r
2683 /////////////////////////
\r
2685 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2686 // ds.setDataset(true);
\r
2687 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2688 // tabbedPane.add("Dataset", dap);
\r
2689 // viewports.add(ds);
\r
2690 // alignPanels.add(dap);
\r
2691 /////////////////////////
\r
2696 /*public void tabSelected()
\r
2698 int index = tabbedPane.getSelectedIndex();
\r
2699 viewport = (AlignViewport)viewports.elementAt(index);
\r
2700 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2706 * @param String DOCUMENT ME!
\r
2708 public boolean parseFeaturesFile(String file, String type)
\r
2710 boolean featuresFile = false;
\r
2712 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment.getDataset(),
\r
2713 alignPanel.seqPanel.seqCanvas.
\r
2714 getFeatureRenderer().featureColours,
\r
2717 catch(Exception ex)
\r
2719 ex.printStackTrace();
\r
2724 viewport.showSequenceFeatures = true;
\r
2725 showSeqFeatures.setSelected(true);
\r
2726 alignPanel.repaint();
\r
2729 return featuresFile;
\r
2732 public void dragEnter(DropTargetDragEvent evt)
\r
2735 public void dragExit(DropTargetEvent evt)
\r
2738 public void dragOver(DropTargetDragEvent evt)
\r
2741 public void dropActionChanged(DropTargetDragEvent evt)
\r
2744 public void drop(DropTargetDropEvent evt)
\r
2746 Transferable t = evt.getTransferable();
\r
2747 java.util.List files = null;
\r
2751 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2752 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2754 //Works on Windows and MacOSX
\r
2755 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2756 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2758 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2760 // This is used by Unix drag system
\r
2761 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2762 String data = (String) t.getTransferData(uriListFlavor);
\r
2763 files = new java.util.ArrayList(1);
\r
2764 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2767 st.hasMoreTokens(); )
\r
2769 String s = st.nextToken();
\r
2770 if (s.startsWith("#"))
\r
2772 // the line is a comment (as per the RFC 2483)
\r
2776 java.net.URI uri = new java.net.URI(s);
\r
2777 java.io.File file = new java.io.File(uri);
\r
2782 catch (Exception e)
\r
2784 e.printStackTrace();
\r
2786 if (files != null)
\r
2791 for (int i = 0; i < files.size(); i++)
\r
2793 loadJalviewDataFile(files.get(i).toString());
\r
2796 catch (Exception ex)
\r
2798 ex.printStackTrace();
\r
2803 // This method will attempt to load a "dropped" file first by testing
\r
2804 // whether its and Annotation file, then features file. If both are
\r
2805 // false then the user may have dropped an alignment file onto this
\r
2807 public void loadJalviewDataFile(String file)
\r
2810 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
\r
2813 if (!isAnnotation)
\r
2815 boolean isGroupsFile = parseFeaturesFile(file,
\r
2816 AppletFormatAdapter.FILE);
\r
2817 if (!isGroupsFile)
\r
2819 String protocol = "File";
\r
2820 String format = new IdentifyFile().Identify(file, protocol);
\r
2821 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2824 FastaFile ff = new FastaFile();
\r
2825 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2826 c.setContents(new StringSelection(ff.print(sequences)), Desktop.instance);
\r
2828 this.paste(false);
\r
2834 alignPanel.adjustAnnotationHeight();
\r
2837 }catch(Exception ex)
\r
2839 ex.printStackTrace();
\r