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 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
145 private void addServiceListeners()
\r
147 final java.beans.PropertyChangeListener thisListener;
\r
148 // Do this once to get current state
\r
149 BuildWebServiceMenu();
\r
150 Desktop.discoverer.addPropertyChangeListener(
\r
151 thisListener = new java.beans.PropertyChangeListener()
\r
153 public void propertyChange(PropertyChangeEvent evt)
\r
155 // System.out.println("Discoverer property change.");
\r
156 if (evt.getPropertyName().equals("services"))
\r
158 // System.out.println("Rebuilding web service menu");
\r
159 BuildWebServiceMenu();
\r
163 addInternalFrameListener(new javax.swing.event.
\r
164 InternalFrameAdapter()
\r
166 public void internalFrameClosed(
\r
167 javax.swing.event.InternalFrameEvent evt)
\r
169 // System.out.println("deregistering discoverer listener");
\r
170 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
171 closeMenuItem_actionPerformed(null);
\r
177 public void setGUINucleotide(boolean nucleotide)
\r
179 showTranslation.setVisible( nucleotide );
\r
180 //sequenceFeatures.setVisible(!nucleotide );
\r
181 //featureSettings.setVisible( !nucleotide );
\r
182 conservationMenuItem.setVisible( !nucleotide );
\r
183 modifyConservation.setVisible( !nucleotide );
\r
185 //Remember AlignFrame always starts as protein
\r
188 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
192 public void comeBackLater(FeatureEvent evt)
\r
195 public void newFeatures(FeatureEvent evt)
\r
197 if (evt.getFeatures().length > 0)
\r
199 alignPanel.seqPanel.seqCanvas.fr.featuresAdded();
\r
200 alignPanel.repaint();
\r
204 System.out.println("No Features found for " +
\r
205 evt.getDasSource().getNickname());
\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.sequences.contains(seq))
\r
598 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
600 if (sg.sequences.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.sequences.contains(seq))
\r
620 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
622 if (sg.sequences.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()];
\r
656 for (int i = 0; i < sg.getSize(); 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(); 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.sequences.size(); 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.sequences.size() == 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 PaintRefresher.Refresh(null, viewport.alignment);
\r
1039 * @param e DOCUMENT ME!
\r
1041 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1043 SequenceGroup sg = viewport.getSelectionGroup();
\r
1047 selectAllSequenceMenuItem_actionPerformed(null);
\r
1052 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1055 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
1058 PaintRefresher.Refresh(null, viewport.alignment);
\r
1064 * @param e DOCUMENT ME!
\r
1066 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
1068 ColumnSelection colSel = viewport.getColumnSelection();
\r
1070 if (colSel.size() > 0)
\r
1072 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
1073 HistoryItem.HIDE));
\r
1075 int min = colSel.getMin();
\r
1076 viewport.getAlignment().trimLeft(min);
\r
1077 colSel.compensateForEdit(0, min);
\r
1079 if (viewport.getSelectionGroup() != null)
\r
1081 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
1084 Vector groups = viewport.alignment.getGroups();
\r
1086 for (int i = 0; i < groups.size(); i++)
\r
1088 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1090 if (!sg.adjustForRemoveLeft(min))
\r
1092 viewport.alignment.deleteGroup(sg);
\r
1096 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1103 * @param e DOCUMENT ME!
\r
1105 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1107 ColumnSelection colSel = viewport.getColumnSelection();
\r
1109 if (colSel.size() > 0)
\r
1111 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1112 HistoryItem.HIDE));
\r
1114 int max = colSel.getMax();
\r
1115 viewport.getAlignment().trimRight(max);
\r
1117 if (viewport.getSelectionGroup() != null)
\r
1119 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1122 Vector groups = viewport.alignment.getGroups();
\r
1124 for (int i = 0; i < groups.size(); i++)
\r
1126 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1128 if (!sg.adjustForRemoveRight(max))
\r
1130 viewport.alignment.deleteGroup(sg);
\r
1134 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1141 * @param e DOCUMENT ME!
\r
1143 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1145 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1146 viewport.alignment, HistoryItem.HIDE));
\r
1148 //This is to maintain viewport position on first residue
\r
1149 //of first sequence
\r
1150 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1151 int startRes = seq.findPosition(viewport.startRes);
\r
1153 viewport.getAlignment().removeGaps();
\r
1155 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1157 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1163 * @param e DOCUMENT ME!
\r
1165 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1167 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1168 HistoryItem.HIDE));
\r
1170 //This is to maintain viewport position on first residue
\r
1171 //of first sequence
\r
1172 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1173 int startRes = seq.findPosition(viewport.startRes);
\r
1176 SequenceI current;
\r
1179 Vector seqs = null;
\r
1182 int end = viewport.alignment.getWidth();
\r
1184 if (viewport.getSelectionGroup() != null
\r
1185 && viewport.getSelectionGroup().sequences != null
\r
1186 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1188 seqs = viewport.getSelectionGroup().sequences;
\r
1189 start = viewport.getSelectionGroup().getStartRes();
\r
1190 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1194 seqs = viewport.alignment.getSequences();
\r
1197 for (int i = 0; i < seqs.size(); i++)
\r
1199 current = (SequenceI) seqs.elementAt(i);
\r
1200 jSize = current.getLength();
\r
1202 // Removing a range is much quicker than removing gaps
\r
1203 // one by one for long sequences
\r
1205 int rangeStart=-1, rangeEnd=-1;
\r
1209 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1211 if(rangeStart==-1)
\r
1226 current.deleteChars(rangeStart, rangeEnd);
\r
1227 j-=rangeEnd-rangeStart;
\r
1228 jSize-=rangeEnd-rangeStart;
\r
1236 while (j < end && j < jSize);
\r
1239 current.deleteChars(rangeStart, rangeEnd);
\r
1243 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1245 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1248 public void alignmentChanged()
\r
1250 if(viewport.padGaps)
\r
1251 viewport.getAlignment().padGaps();
\r
1253 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1255 viewport.updateConsensus();
\r
1256 viewport.updateConservation();
\r
1258 resetAllColourSchemes();
\r
1259 if(alignPanel.overviewPanel!=null)
\r
1260 alignPanel.overviewPanel.updateOverviewImage();
\r
1262 viewport.alignment.adjustSequenceAnnotations();
\r
1264 alignPanel.repaint();
\r
1267 void resetAllColourSchemes()
\r
1269 ColourSchemeI cs = viewport.globalColourScheme;
\r
1272 if (cs instanceof ClustalxColourScheme)
\r
1274 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1275 resetClustalX(viewport.alignment.getSequences(),
\r
1276 viewport.alignment.getWidth());
\r
1279 cs.setConsensus(viewport.vconsensus);
\r
1280 if (cs.conservationApplied())
\r
1282 Alignment al = (Alignment) viewport.alignment;
\r
1283 Conservation c = new Conservation("All",
\r
1284 ResidueProperties.propHash, 3,
\r
1285 al.getSequences(), 0,
\r
1286 al.getWidth() - 1);
\r
1288 c.verdict(false, viewport.ConsPercGaps);
\r
1290 cs.setConservation(c);
\r
1294 int s, sSize = viewport.alignment.getGroups().size();
\r
1295 for(s=0; s<sSize; s++)
\r
1297 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1298 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1300 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1302 sg.recalcConservation();
\r
1309 * @param e DOCUMENT ME!
\r
1311 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1313 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1314 HistoryItem.HIDE));
\r
1316 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1318 // if (viewport.padGaps)
\r
1319 alignmentChanged();
\r
1325 * @param e DOCUMENT ME!
\r
1327 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1329 JInternalFrame frame = new JInternalFrame();
\r
1330 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1331 frame.setContentPane(finder);
\r
1332 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1333 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1339 * @param e DOCUMENT ME!
\r
1341 public void font_actionPerformed(ActionEvent e)
\r
1343 new FontChooser(alignPanel);
\r
1346 public void smoothFont_actionPerformed(ActionEvent e)
\r
1348 viewport.antiAlias = smoothFont.isSelected();
\r
1349 alignPanel.annotationPanel.image = null;
\r
1350 alignPanel.repaint();
\r
1357 * @param e DOCUMENT ME!
\r
1359 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1361 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1363 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1364 alignPanel.repaint();
\r
1371 * @param e DOCUMENT ME!
\r
1373 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1375 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1376 alignPanel.repaint();
\r
1382 * @param e DOCUMENT ME!
\r
1384 public void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1386 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1387 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1388 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1389 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1390 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1396 * @param e DOCUMENT ME!
\r
1398 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1400 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1401 alignPanel.repaint();
\r
1407 * @param e DOCUMENT ME!
\r
1409 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1411 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1412 alignPanel.repaint();
\r
1418 * @param e DOCUMENT ME!
\r
1420 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1422 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1423 alignPanel.repaint();
\r
1429 * @param e DOCUMENT ME!
\r
1431 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1433 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1434 alignPanel.repaint();
\r
1440 * @param e DOCUMENT ME!
\r
1442 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1444 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1445 alignPanel.repaint();
\r
1451 * @param e DOCUMENT ME!
\r
1453 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1455 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1456 alignPanel.repaint();
\r
1460 public void dbRefs_actionPerformed(ActionEvent e)
\r
1462 new DBRefFetcher(viewport.alignment, this);
\r
1465 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1467 new DasSequenceFeatureFetcher(viewport.alignment,
\r
1469 viewport.setShowSequenceFeatures(true);
\r
1470 showSeqFeatures.setSelected(true);
\r
1474 public void featureSettings_actionPerformed(ActionEvent e)
\r
1476 new FeatureSettings(viewport, alignPanel);
\r
1482 * @param evt DOCUMENT ME!
\r
1484 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1486 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1487 alignPanel.repaint();
\r
1488 if (alignPanel.getOverviewPanel() != null)
\r
1490 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1497 * @param e DOCUMENT ME!
\r
1499 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1501 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1502 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1508 * @param e DOCUMENT ME!
\r
1510 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1512 if (alignPanel.overviewPanel != null)
\r
1517 JInternalFrame frame = new JInternalFrame();
\r
1518 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1519 frame.setContentPane(overview);
\r
1520 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1521 frame.getWidth(), frame.getHeight());
\r
1523 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1524 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1526 public void internalFrameClosed(
\r
1527 javax.swing.event.InternalFrameEvent evt)
\r
1529 alignPanel.setOverviewPanel(null);
\r
1534 alignPanel.setOverviewPanel(overview);
\r
1540 * @param e DOCUMENT ME!
\r
1542 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1544 changeColour(null);
\r
1550 * @param e DOCUMENT ME!
\r
1552 public void clustalColour_actionPerformed(ActionEvent e)
\r
1554 changeColour(new ClustalxColourScheme(
\r
1555 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1561 * @param e DOCUMENT ME!
\r
1563 public void zappoColour_actionPerformed(ActionEvent e)
\r
1565 changeColour(new ZappoColourScheme());
\r
1571 * @param e DOCUMENT ME!
\r
1573 public void taylorColour_actionPerformed(ActionEvent e)
\r
1575 changeColour(new TaylorColourScheme());
\r
1581 * @param e DOCUMENT ME!
\r
1583 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1585 changeColour(new HydrophobicColourScheme());
\r
1591 * @param e DOCUMENT ME!
\r
1593 public void helixColour_actionPerformed(ActionEvent e)
\r
1595 changeColour(new HelixColourScheme());
\r
1601 * @param e DOCUMENT ME!
\r
1603 public void strandColour_actionPerformed(ActionEvent e)
\r
1605 changeColour(new StrandColourScheme());
\r
1611 * @param e DOCUMENT ME!
\r
1613 public void turnColour_actionPerformed(ActionEvent e)
\r
1615 changeColour(new TurnColourScheme());
\r
1621 * @param e DOCUMENT ME!
\r
1623 public void buriedColour_actionPerformed(ActionEvent e)
\r
1625 changeColour(new BuriedColourScheme());
\r
1631 * @param e DOCUMENT ME!
\r
1633 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1635 changeColour(new NucleotideColourScheme());
\r
1638 public void annotationColour_actionPerformed(ActionEvent e)
\r
1640 new AnnotationColourChooser(viewport, alignPanel);
\r
1647 * @param e DOCUMENT ME!
\r
1649 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1651 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1657 * @param cs DOCUMENT ME!
\r
1659 void changeColour(ColourSchemeI cs)
\r
1661 int threshold = 0;
\r
1665 if (viewport.getAbovePIDThreshold())
\r
1667 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1670 cs.setThreshold(threshold,
\r
1671 viewport.getIgnoreGapsConsensus());
\r
1673 viewport.setGlobalColourScheme(cs);
\r
1677 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1680 if (viewport.getConservationSelected())
\r
1683 Alignment al = (Alignment) viewport.alignment;
\r
1684 Conservation c = new Conservation("All",
\r
1685 ResidueProperties.propHash, 3,
\r
1686 al.getSequences(), 0,
\r
1687 al.getWidth() - 1);
\r
1690 c.verdict(false, viewport.ConsPercGaps);
\r
1692 cs.setConservation(c);
\r
1694 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1699 cs.setConservation(null);
\r
1702 cs.setConsensus(viewport.vconsensus);
\r
1705 viewport.setGlobalColourScheme(cs);
\r
1707 if (viewport.getColourAppliesToAllGroups())
\r
1709 Vector groups = viewport.alignment.getGroups();
\r
1711 for (int i = 0; i < groups.size(); i++)
\r
1713 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1721 if (cs instanceof ClustalxColourScheme)
\r
1723 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1725 else if (cs instanceof UserColourScheme)
\r
1727 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1733 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1735 catch (Exception ex)
\r
1740 if (viewport.getAbovePIDThreshold()
\r
1741 || cs instanceof PIDColourScheme
\r
1742 || cs instanceof Blosum62ColourScheme)
\r
1744 sg.cs.setThreshold(threshold,
\r
1745 viewport.getIgnoreGapsConsensus());
\r
1747 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1751 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1754 if (viewport.getConservationSelected())
\r
1756 Conservation c = new Conservation("Group",
\r
1757 ResidueProperties.propHash, 3,
\r
1759 viewport.alignment.getWidth() - 1);
\r
1761 c.verdict(false, viewport.ConsPercGaps);
\r
1762 sg.cs.setConservation(c);
\r
1765 sg.cs.setConservation(null);
\r
1769 if (alignPanel.getOverviewPanel() != null)
\r
1771 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1774 alignPanel.repaint();
\r
1780 * @param e DOCUMENT ME!
\r
1782 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1784 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1786 SliderPanel.setPIDSliderSource(alignPanel,
\r
1787 viewport.getGlobalColourScheme(),
\r
1789 SliderPanel.showPIDSlider();
\r
1796 * @param e DOCUMENT ME!
\r
1798 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1800 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1802 SliderPanel.setConservationSlider(alignPanel,
\r
1803 viewport.globalColourScheme,
\r
1805 SliderPanel.showConservationSlider();
\r
1812 * @param e DOCUMENT ME!
\r
1814 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1816 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1818 viewport.setAbovePIDThreshold(false);
\r
1819 abovePIDThreshold.setSelected(false);
\r
1821 changeColour(viewport.getGlobalColourScheme());
\r
1823 modifyConservation_actionPerformed(null);
\r
1829 * @param e DOCUMENT ME!
\r
1831 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1833 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1835 conservationMenuItem.setSelected(false);
\r
1836 viewport.setConservationSelected(false);
\r
1838 changeColour(viewport.getGlobalColourScheme());
\r
1840 modifyPID_actionPerformed(null);
\r
1846 * @param e DOCUMENT ME!
\r
1848 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1850 if (e.getActionCommand().equals("User Defined..."))
\r
1852 new UserDefinedColours(alignPanel, null);
\r
1856 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1857 getUserColourSchemes().get(e.getActionCommand());
\r
1859 changeColour(udc);
\r
1863 public void updateUserColourMenu()
\r
1866 Component[] menuItems = colourMenu.getMenuComponents();
\r
1867 int i, iSize = menuItems.length;
\r
1868 for (i = 0; i < iSize; i++)
\r
1870 if (menuItems[i].getName() != null &&
\r
1871 menuItems[i].getName().equals("USER_DEFINED"))
\r
1873 colourMenu.remove(menuItems[i]);
\r
1877 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1879 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1880 getUserColourSchemes().keys();
\r
1882 while (userColours.hasMoreElements())
\r
1884 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1885 nextElement().toString());
\r
1886 radioItem.setName("USER_DEFINED");
\r
1887 radioItem.addMouseListener(new MouseAdapter()
\r
1889 public void mousePressed(MouseEvent evt)
\r
1891 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1893 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1895 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1896 "Remove from default list?",
\r
1897 "Remove user defined colour",
\r
1898 JOptionPane.YES_NO_OPTION);
\r
1899 if(option == JOptionPane.YES_OPTION)
\r
1901 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1902 colourMenu.remove(radioItem);
\r
1905 radioItem.addActionListener(new ActionListener()
\r
1907 public void actionPerformed(ActionEvent evt)
\r
1909 userDefinedColour_actionPerformed(evt);
\r
1915 radioItem.addActionListener(new ActionListener()
\r
1917 public void actionPerformed(ActionEvent evt)
\r
1919 userDefinedColour_actionPerformed(evt);
\r
1923 colourMenu.insert(radioItem, 15);
\r
1924 colours.add(radioItem);
\r
1932 * @param e DOCUMENT ME!
\r
1934 public void PIDColour_actionPerformed(ActionEvent e)
\r
1936 changeColour(new PIDColourScheme());
\r
1942 * @param e DOCUMENT ME!
\r
1944 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1946 changeColour(new Blosum62ColourScheme());
\r
1952 * @param e DOCUMENT ME!
\r
1954 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1956 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1957 HistoryItem.SORT));
\r
1958 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1959 viewport.getAlignment().getSequenceAt(0));
\r
1960 alignPanel.repaint();
\r
1966 * @param e DOCUMENT ME!
\r
1968 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1970 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1971 HistoryItem.SORT));
\r
1972 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1973 alignPanel.repaint();
\r
1979 * @param e DOCUMENT ME!
\r
1981 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1983 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1984 HistoryItem.SORT));
\r
1986 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1987 alignPanel.repaint();
\r
1993 * @param e DOCUMENT ME!
\r
1995 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1997 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1998 JInternalFrame frame = new JInternalFrame();
\r
1999 frame.setContentPane(sp);
\r
2000 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
2007 * @param e DOCUMENT ME!
\r
2009 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
2011 if ( (viewport.getSelectionGroup() == null) ||
\r
2012 (viewport.getSelectionGroup().getSize() < 2))
\r
2014 JOptionPane.showInternalMessageDialog(this,
\r
2015 "You must select at least 2 sequences.",
\r
2016 "Invalid Selection",
\r
2017 JOptionPane.WARNING_MESSAGE);
\r
2021 JInternalFrame frame = new JInternalFrame();
\r
2022 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
2023 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
2030 * @param e DOCUMENT ME!
\r
2032 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
2034 if ( ( (viewport.getSelectionGroup() != null) &&
\r
2035 (viewport.getSelectionGroup().getSize() < 4) &&
\r
2036 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
2037 (viewport.getAlignment().getHeight() < 4))
\r
2039 JOptionPane.showInternalMessageDialog(this,
\r
2040 "Principal component analysis must take\n" +
\r
2041 "at least 4 input sequences.",
\r
2042 "Sequence selection insufficient",
\r
2043 JOptionPane.WARNING_MESSAGE);
\r
2048 new PCAPanel(viewport);
\r
2052 public void autoCalculate_actionPerformed(ActionEvent e)
\r
2054 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
2055 if(viewport.autoCalculateConsensus)
\r
2057 alignmentChanged();
\r
2065 * @param e DOCUMENT ME!
\r
2067 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
2069 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2075 * @param e DOCUMENT ME!
\r
2077 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2079 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2085 * @param e DOCUMENT ME!
\r
2087 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2089 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2095 * @param e DOCUMENT ME!
\r
2097 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2099 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2105 * @param type DOCUMENT ME!
\r
2106 * @param pwType DOCUMENT ME!
\r
2107 * @param title DOCUMENT ME!
\r
2109 void NewTreePanel(String type, String pwType, String title)
\r
2113 if ( (viewport.getSelectionGroup() != null) &&
\r
2114 (viewport.getSelectionGroup().getSize() > 3))
\r
2117 SequenceGroup sg = viewport.getSelectionGroup();
\r
2119 /* Decide if the selection is a column region */
\r
2120 while (s < sg.sequences.size())
\r
2122 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
2125 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2126 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2127 "Try using the Pad function in the edit menu,\n" +
\r
2128 "or one of the multiple sequence alignment web services.",
\r
2129 "Sequences in selection are not aligned",
\r
2130 JOptionPane.WARNING_MESSAGE);
\r
2136 title = title + " on region";
\r
2137 tp = new TreePanel(viewport,
\r
2138 viewport.getSelectionGroup().sequences, type, pwType,
\r
2139 sg.getStartRes(), sg.getEndRes());
\r
2143 //are the sequences aligned?
\r
2144 if (!viewport.alignment.isAligned())
\r
2146 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2147 "The sequences must be aligned before creating a tree.\n" +
\r
2148 "Try using the Pad function in the edit menu,\n" +
\r
2149 "or one of the multiple sequence alignment web services.",
\r
2150 "Sequences not aligned",
\r
2151 JOptionPane.WARNING_MESSAGE);
\r
2156 tp = new TreePanel(viewport,
\r
2157 viewport.getAlignment().getSequences(), type, pwType,
\r
2159 viewport.alignment.getWidth());
\r
2162 addTreeMenuItem(tp, title);
\r
2164 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2170 * @param title DOCUMENT ME!
\r
2171 * @param order DOCUMENT ME!
\r
2173 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2175 final JMenuItem item = new JMenuItem("by " + title);
\r
2177 item.addActionListener(new java.awt.event.ActionListener()
\r
2179 public void actionPerformed(ActionEvent e)
\r
2181 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2182 HistoryItem.SORT));
\r
2184 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2185 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2186 alignPanel.repaint();
\r
2192 * Maintain the Order by->Displayed Tree menu.
\r
2193 * Creates a new menu item for a TreePanel with an appropriate
\r
2194 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2195 * to remove the menu item when the treePanel is closed, and adjust
\r
2196 * the tree leaf to sequence mapping when the alignment is modified.
\r
2197 * @param treePanel Displayed tree window.
\r
2198 * @param title SortBy menu item title.
\r
2200 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2202 final JMenuItem item = new JMenuItem(title);
\r
2206 if (treeCount == 1)
\r
2208 sort.add(sortByTreeMenu);
\r
2211 sortByTreeMenu.add(item);
\r
2212 item.addActionListener(new java.awt.event.ActionListener()
\r
2214 public void actionPerformed(ActionEvent e)
\r
2216 addHistoryItem(new HistoryItem("Tree Sort",
\r
2217 viewport.alignment, HistoryItem.SORT));
\r
2218 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2219 treePanel.getTree());
\r
2220 alignPanel.repaint();
\r
2224 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2225 InternalFrameAdapter()
\r
2227 public void internalFrameClosed(
\r
2228 javax.swing.event.InternalFrameEvent evt)
\r
2231 sortByTreeMenu.remove(item);
\r
2233 if (treeCount == 0)
\r
2235 sort.remove(sortByTreeMenu);
\r
2243 * Work out whether the whole set of sequences
\r
2244 * or just the selected set will be submitted for multiple alignment.
\r
2247 private SequenceI[] gatherSequencesForAlignment()
\r
2249 // Now, check we have enough sequences
\r
2250 SequenceI[] msa = null;
\r
2252 if ( (viewport.getSelectionGroup() != null) &&
\r
2253 (viewport.getSelectionGroup().getSize() > 1))
\r
2255 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2256 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2258 msa = new SequenceI[sz = seqs.getSize()];
\r
2260 for (int i = 0; i < sz; i++)
\r
2262 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2267 Vector seqs = viewport.getAlignment().getSequences();
\r
2269 if (seqs.size() > 1)
\r
2271 msa = new SequenceI[seqs.size()];
\r
2273 for (int i = 0; i < seqs.size(); i++)
\r
2275 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2283 * Decides what is submitted to a secondary structure prediction service,
\r
2284 * the currently selected sequence, or the currently selected alignment
\r
2285 * (where the first sequence in the set is the one that the prediction
\r
2288 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2290 SequenceI seq = null;
\r
2291 SequenceI[] msa = null;
\r
2293 if ( (viewport.getSelectionGroup() != null) &&
\r
2294 (viewport.getSelectionGroup().getSize() > 0))
\r
2296 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2297 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2299 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2301 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2306 msa = new SequenceI[sz = seqs.getSize()];
\r
2308 for (int i = 0; i < sz; i++)
\r
2310 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2316 Vector seqs = viewport.getAlignment().getSequences();
\r
2318 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2320 seq = (SequenceI) seqs.elementAt(0);
\r
2324 msa = new SequenceI[seqs.size()];
\r
2326 for (int i = 0; i < seqs.size(); i++)
\r
2328 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2340 return new SequenceI[]
\r
2350 * @param e DOCUMENT ME!
\r
2352 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2354 // Pick the tree file
\r
2355 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2357 "LAST_DIRECTORY"));
\r
2358 chooser.setFileView(new JalviewFileView());
\r
2359 chooser.setDialogTitle("Select a newick-like tree file");
\r
2360 chooser.setToolTipText("Load a tree file");
\r
2362 int value = chooser.showOpenDialog(null);
\r
2364 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2366 String choice = chooser.getSelectedFile().getPath();
\r
2367 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2371 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2373 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2375 catch (Exception ex)
\r
2377 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2378 "Problem reading tree file",
\r
2380 JOptionPane.WARNING_MESSAGE);
\r
2381 ex.printStackTrace();
\r
2387 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2389 return ShowNewickTree(nf,title,600,500,4,5);
\r
2394 * @param nf DOCUMENT ME!
\r
2395 * @param title DOCUMENT ME!
\r
2397 * @return DOCUMENT ME!
\r
2399 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2401 TreePanel tp = null;
\r
2407 if (nf.getTree() != null)
\r
2409 tp = new TreePanel(viewport,
\r
2410 viewport.getAlignment().getSequences(), nf,
\r
2417 tp.setLocation(x,y);
\r
2420 Desktop.addInternalFrame(tp, title, w, h);
\r
2421 addTreeMenuItem(tp, title);
\r
2424 catch (Exception ex)
\r
2426 ex.printStackTrace();
\r
2437 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2438 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2439 printJob.setPrintable(alignPanel, pf);
\r
2441 if (printJob.printDialog())
\r
2447 catch (Exception PrintException)
\r
2449 PrintException.printStackTrace();
\r
2456 * Generates menu items and listener event actions for web service clients
\r
2459 public void BuildWebServiceMenu()
\r
2461 if ( (Discoverer.services != null)
\r
2462 && (Discoverer.services.size() > 0))
\r
2464 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2465 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2466 Vector wsmenu = new Vector();
\r
2467 if (msaws != null)
\r
2469 // Add any Multiple Sequence Alignment Services
\r
2470 final JMenu msawsmenu = new JMenu("Alignment");
\r
2471 final AlignFrame af = this;
\r
2472 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2474 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2476 final JMenuItem method = new JMenuItem(sh.getName());
\r
2477 method.addActionListener(new ActionListener()
\r
2479 public void actionPerformed(ActionEvent e)
\r
2481 SequenceI[] msa = gatherSequencesForAlignment();
\r
2482 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2483 false, true, viewport.getAlignment().getDataset(), af);
\r
2488 msawsmenu.add(method);
\r
2489 // Deal with services that we know accept partial alignments.
\r
2490 if (sh.getName().indexOf("lustal") > -1)
\r
2492 // We know that ClustalWS can accept partial alignments for refinement.
\r
2493 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2494 methodR.addActionListener(new ActionListener()
\r
2496 public void actionPerformed(ActionEvent e)
\r
2498 SequenceI[] msa = gatherSequencesForAlignment();
\r
2499 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2500 true, true, viewport.getAlignment().getDataset(), af);
\r
2505 msawsmenu.add(methodR);
\r
2509 wsmenu.add(msawsmenu);
\r
2511 if (secstrpr != null)
\r
2513 // Add any secondary structure prediction services
\r
2514 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2515 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2517 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2519 final JMenuItem method = new JMenuItem(sh.getName());
\r
2520 method.addActionListener(new ActionListener()
\r
2522 public void actionPerformed(ActionEvent e)
\r
2524 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2525 if (msa.length == 1)
\r
2527 // Single Sequence prediction
\r
2528 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2532 if (msa.length > 1)
\r
2534 // Single Sequence prediction
\r
2535 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2541 secstrmenu.add(method);
\r
2543 wsmenu.add(secstrmenu);
\r
2545 this.webService.removeAll();
\r
2546 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2548 webService.add( (JMenu) wsmenu.get(i));
\r
2553 this.webService.removeAll();
\r
2554 this.webService.add(this.webServiceNoServices);
\r
2556 // TODO: add in rediscovery function
\r
2557 // TODO: reduce code redundancy.
\r
2558 // TODO: group services by location as well as function.
\r
2561 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2563 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2564 getProperty("LAST_DIRECTORY"));
\r
2566 chooser.setFileView(new JalviewFileView());
\r
2567 chooser.setDialogTitle("Export to Vamsas file");
\r
2568 chooser.setToolTipText("Export");
\r
2570 int value = chooser.showSaveDialog(this);
\r
2572 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2574 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2575 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2576 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2584 public void showTranslation_actionPerformed(ActionEvent e)
\r
2586 int s, sSize = viewport.alignment.getHeight();
\r
2587 SequenceI [] newSeq = new SequenceI[sSize];
\r
2590 StringBuffer protein;
\r
2592 for(s=0; s<sSize; s++)
\r
2594 protein = new StringBuffer();
\r
2595 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2596 resSize = seq.length();
\r
2597 resSize -= resSize%3;
\r
2599 for(res = 0; res < resSize; res+=3)
\r
2601 String codon = seq.substring(res, res+3);
\r
2602 codon = codon.replace('U', 'T');
\r
2603 String aa = ResidueProperties.codonTranslate(codon);
\r
2605 protein.append(viewport.getGapCharacter());
\r
2606 else if(aa.equals("STOP"))
\r
2607 protein.append("X");
\r
2609 protein.append( aa );
\r
2611 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2615 AlignmentI al = new Alignment(newSeq);
\r
2616 al.setDataset(null);
\r
2619 ////////////////////////////////
\r
2620 // Copy annotations across
\r
2621 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2622 = viewport.alignment.getAlignmentAnnotation();
\r
2624 if(annotations!=null)
\r
2626 for (int i = 0; i < annotations.length; i++)
\r
2628 if (annotations[i].label.equals("Quality") ||
\r
2629 annotations[i].label.equals("Conservation") ||
\r
2630 annotations[i].label.equals("Consensus"))
\r
2635 aSize = viewport.alignment.getWidth() / 3;
\r
2636 jalview.datamodel.Annotation[] anots =
\r
2637 new jalview.datamodel.Annotation[aSize];
\r
2639 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2641 if (annotations[i].annotations[a] == null
\r
2642 || annotations[i].annotations[a] == null)
\r
2645 anots[a / 3] = new Annotation(
\r
2646 annotations[i].annotations[a].displayCharacter,
\r
2647 annotations[i].annotations[a].description,
\r
2648 annotations[i].annotations[a].secondaryStructure,
\r
2649 annotations[i].annotations[a].value,
\r
2650 annotations[i].annotations[a].colour);
\r
2653 jalview.datamodel.AlignmentAnnotation aa
\r
2654 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2655 annotations[i].description, anots);
\r
2656 al.addAnnotation(aa);
\r
2660 AlignFrame af = new AlignFrame(al);
\r
2661 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2663 NEW_WINDOW_HEIGHT);
\r
2666 // AlignViewport newViewport = new AlignViewport(al);
\r
2667 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2668 // tabbedPane.add("Protein", ap);
\r
2669 // viewports.add(newViewport);
\r
2670 // alignPanels.add(ap);
\r
2673 /////////////////////////
\r
2675 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2676 // ds.setDataset(true);
\r
2677 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2678 // tabbedPane.add("Dataset", dap);
\r
2679 // viewports.add(ds);
\r
2680 // alignPanels.add(dap);
\r
2681 /////////////////////////
\r
2686 /*public void tabSelected()
\r
2688 int index = tabbedPane.getSelectedIndex();
\r
2689 viewport = (AlignViewport)viewports.elementAt(index);
\r
2690 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2696 * @param String DOCUMENT ME!
\r
2698 public boolean parseFeaturesFile(String file, String type)
\r
2700 boolean featuresFile = false;
\r
2702 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment.getDataset(),
\r
2703 alignPanel.seqPanel.seqCanvas.
\r
2704 getFeatureRenderer().featureColours,
\r
2707 catch(Exception ex)
\r
2709 ex.printStackTrace();
\r
2714 viewport.showSequenceFeatures = true;
\r
2715 showSeqFeatures.setSelected(true);
\r
2716 alignPanel.repaint();
\r
2719 return featuresFile;
\r
2722 public void dragEnter(DropTargetDragEvent evt)
\r
2725 public void dragExit(DropTargetEvent evt)
\r
2728 public void dragOver(DropTargetDragEvent evt)
\r
2731 public void dropActionChanged(DropTargetDragEvent evt)
\r
2734 public void drop(DropTargetDropEvent evt)
\r
2736 Transferable t = evt.getTransferable();
\r
2737 java.util.List files = null;
\r
2741 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2742 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2744 //Works on Windows and MacOSX
\r
2745 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2746 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2748 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2750 // This is used by Unix drag system
\r
2751 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2752 String data = (String) t.getTransferData(uriListFlavor);
\r
2753 files = new java.util.ArrayList(1);
\r
2754 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2757 st.hasMoreTokens(); )
\r
2759 String s = st.nextToken();
\r
2760 if (s.startsWith("#"))
\r
2762 // the line is a comment (as per the RFC 2483)
\r
2766 java.net.URI uri = new java.net.URI(s);
\r
2767 java.io.File file = new java.io.File(uri);
\r
2772 catch (Exception e)
\r
2774 e.printStackTrace();
\r
2776 if (files != null)
\r
2781 for (int i = 0; i < files.size(); i++)
\r
2783 loadJalviewDataFile(files.get(i).toString());
\r
2786 catch (Exception ex)
\r
2788 ex.printStackTrace();
\r
2793 // This method will attempt to load a "dropped" file first by testing
\r
2794 // whether its and Annotation file, then features file. If both are
\r
2795 // false then the user may have dropped an alignment file onto this
\r
2797 public void loadJalviewDataFile(String file)
\r
2800 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
\r
2803 if (!isAnnotation)
\r
2805 boolean isGroupsFile = parseFeaturesFile(file,
\r
2806 AppletFormatAdapter.FILE);
\r
2807 if (!isGroupsFile)
\r
2809 String protocol = "File";
\r
2810 String format = new IdentifyFile().Identify(file, protocol);
\r
2811 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2814 FastaFile ff = new FastaFile();
\r
2815 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2816 c.setContents(new StringSelection(ff.print(sequences)), Desktop.instance);
\r
2818 this.paste(false);
\r
2824 alignPanel.adjustAnnotationHeight();
\r
2827 }catch(Exception ex)
\r
2829 ex.printStackTrace();
\r