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
206 if(featureSettings!=null)
\r
207 featureSettings.setTableData();
\r
211 Hashtable progressBars;
\r
212 public void setProgressBar(String message, long id)
\r
214 if(progressBars == null)
\r
215 progressBars = new Hashtable();
\r
217 JPanel progressPanel;
\r
218 GridLayout layout = (GridLayout) statusPanel.getLayout();
\r
219 if(progressBars.get( new Long(id) )!=null)
\r
221 progressPanel = (JPanel)progressBars.get( new Long(id) );
\r
222 statusPanel.remove(progressPanel);
\r
223 progressBars.remove( progressPanel );
\r
224 progressPanel = null;
\r
226 statusBar.setText(message);
\r
228 layout.setRows(layout.getRows() - 1);
\r
232 progressPanel = new JPanel(new BorderLayout(10, 5));
\r
234 JProgressBar progressBar = new JProgressBar();
\r
235 progressBar.setIndeterminate(true);
\r
237 progressPanel.add(new JLabel(message), BorderLayout.WEST);
\r
238 progressPanel.add(progressBar, BorderLayout.CENTER);
\r
240 layout.setRows(layout.getRows() + 1);
\r
241 statusPanel.add(progressPanel);
\r
243 progressBars.put(new Long(id), progressPanel);
\r
251 Added so Castor Mapping file can obtain Jalview Version
\r
253 public String getVersion()
\r
255 return jalview.bin.Cache.getProperty("VERSION");
\r
258 public FeatureRenderer getFeatureRenderer()
\r
260 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
\r
264 public void fetchSequence_actionPerformed(ActionEvent e)
\r
266 new SequenceFetcher(this);
\r
269 public void addFromFile_actionPerformed(ActionEvent e)
\r
271 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
\r
274 public void addFromText_actionPerformed(ActionEvent e)
\r
276 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
\r
279 public void addFromURL_actionPerformed(ActionEvent e)
\r
281 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
\r
287 * @param e DOCUMENT ME!
\r
289 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
291 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
292 getProperty( "LAST_DIRECTORY"),
\r
294 { "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc","jar" },
\r
296 { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview" },
\r
301 chooser.setFileView(new JalviewFileView());
\r
302 chooser.setDialogTitle("Save Alignment to file");
\r
303 chooser.setToolTipText("Save");
\r
305 int value = chooser.showSaveDialog(this);
\r
307 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
309 currentFileFormat = chooser.getSelectedFormat();
\r
311 if (currentFileFormat == null)
\r
313 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
314 "You must select a file format before saving!",
\r
315 "File format not specified",
\r
316 JOptionPane.WARNING_MESSAGE);
\r
317 value = chooser.showSaveDialog(this);
\r
321 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
322 currentFileFormat);
\r
324 String choice = chooser.getSelectedFile().getPath();
\r
325 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
327 saveAlignment(choice, currentFileFormat);
\r
331 public boolean saveAlignment(String file, String format)
\r
333 if (format.equalsIgnoreCase("Jalview"))
\r
335 String shortName = title;
\r
337 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
339 shortName = shortName.substring(shortName.lastIndexOf(
\r
340 java.io.File.separatorChar) + 1);
\r
343 new Jalview2XML().SaveAlignment(this, file, shortName);
\r
345 // USE Jalview2XML to save this file
\r
350 String output = new FormatAdapter().formatSequences(format,
\r
351 viewport.getAlignment().
\r
353 if (output == null)
\r
360 java.io.PrintWriter out = new java.io.PrintWriter(
\r
361 new java.io.FileWriter(file));
\r
365 this.setTitle(file);
\r
368 catch (Exception ex)
\r
370 ex.printStackTrace();
\r
379 * @param e DOCUMENT ME!
\r
381 protected void outputText_actionPerformed(ActionEvent e)
\r
383 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
384 Desktop.addInternalFrame(cap,
\r
385 "Alignment output - " + e.getActionCommand(), 600,
\r
387 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
388 viewport.getAlignment().
\r
395 * @param e DOCUMENT ME!
\r
397 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
399 new HTMLOutput(viewport,
\r
400 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
401 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
404 public void createImageMap(File file, String image)
\r
406 alignPanel.makePNGImageMap(file, image);
\r
412 * @param e DOCUMENT ME!
\r
414 public void createPNG(File f)
\r
416 alignPanel.makePNG(f);
\r
422 * @param e DOCUMENT ME!
\r
424 public void createEPS(File f)
\r
426 alignPanel.makeEPS(f);
\r
432 * @param e DOCUMENT ME!
\r
434 public void printMenuItem_actionPerformed(ActionEvent e)
\r
436 //Putting in a thread avoids Swing painting problems
\r
437 PrintThread thread = new PrintThread();
\r
441 public void exportFeatures_actionPerformed(ActionEvent e)
\r
443 new AnnotationExporter().exportFeatures(alignPanel);
\r
446 public void exportAnnotations_actionPerformed(ActionEvent e)
\r
448 new AnnotationExporter().exportAnnotations(
\r
450 viewport.alignment.getAlignmentAnnotation()
\r
455 public void associatedData_actionPerformed(ActionEvent e)
\r
457 // Pick the tree file
\r
458 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
460 "LAST_DIRECTORY"));
\r
461 chooser.setFileView(new JalviewFileView());
\r
462 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
463 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
465 int value = chooser.showOpenDialog(null);
\r
467 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
469 String choice = chooser.getSelectedFile().getPath();
\r
470 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
471 loadJalviewDataFile(choice);
\r
479 * @param e DOCUMENT ME!
\r
481 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
485 PaintRefresher.components.remove(viewport.alignment);
\r
486 this.setClosed(true);
\r
488 catch (Exception ex)
\r
496 void updateEditMenuBar()
\r
498 if (historyList.size() > 0)
\r
500 undoMenuItem.setEnabled(true);
\r
502 HistoryItem hi = (HistoryItem) historyList.peek();
\r
503 undoMenuItem.setText("Undo " + hi.getDescription());
\r
507 undoMenuItem.setEnabled(false);
\r
508 undoMenuItem.setText("Undo");
\r
511 if (redoList.size() > 0)
\r
513 redoMenuItem.setEnabled(true);
\r
515 HistoryItem hi = (HistoryItem) redoList.peek();
\r
516 redoMenuItem.setText("Redo " + hi.getDescription());
\r
520 redoMenuItem.setEnabled(false);
\r
521 redoMenuItem.setText("Redo");
\r
528 * @param hi DOCUMENT ME!
\r
530 public void addHistoryItem(HistoryItem hi)
\r
532 historyList.push(hi);
\r
533 updateEditMenuBar();
\r
539 * @param e DOCUMENT ME!
\r
541 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
543 HistoryItem hi = (HistoryItem) historyList.pop();
\r
544 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
545 HistoryItem.HIDE));
\r
546 restoreHistoryItem(hi);
\r
547 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
553 * @param e DOCUMENT ME!
\r
555 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
557 HistoryItem hi = (HistoryItem) redoList.pop();
\r
558 restoreHistoryItem(hi);
\r
559 updateEditMenuBar();
\r
560 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
563 // used by undo and redo
\r
564 void restoreHistoryItem(HistoryItem hi)
\r
569 updateEditMenuBar();
\r
571 viewport.firePropertyChange("alignment", null,
\r
572 viewport.getAlignment().getSequences());
\r
578 * @param up DOCUMENT ME!
\r
580 public void moveSelectedSequences(boolean up)
\r
582 SequenceGroup sg = viewport.getSelectionGroup();
\r
591 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
593 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
595 if (!sg.getSequences(false).contains(seq))
\r
600 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
602 if (sg.getSequences(false).contains(temp))
\r
607 viewport.alignment.getSequences().setElementAt(temp, i);
\r
608 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
613 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
615 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
617 if (!sg.getSequences(false).contains(seq))
\r
622 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
624 if (sg.getSequences(false).contains(temp))
\r
629 viewport.alignment.getSequences().setElementAt(temp, i);
\r
630 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
634 alignPanel.repaint();
\r
642 * @param e DOCUMENT ME!
\r
644 protected void copy_actionPerformed(ActionEvent e)
\r
646 if (viewport.getSelectionGroup() == null)
\r
651 SequenceGroup sg = viewport.getSelectionGroup();
\r
653 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
655 Hashtable orderedSeqs = new Hashtable();
\r
656 SequenceI[] seqs = new SequenceI[sg.getSize(false)];
\r
658 for (int i = 0; i < sg.getSize(false); i++)
\r
660 SequenceI seq = sg.getSequenceAt(i);
\r
661 int index = viewport.alignment.findIndex(seq);
\r
662 orderedSeqs.put(index + "", seq);
\r
665 int index = 0, startRes, endRes;
\r
668 for (int i = 0; i < sg.getSize(false); i++)
\r
670 SequenceI seq = null;
\r
672 while (seq == null)
\r
674 if (orderedSeqs.containsKey(index + ""))
\r
676 seq = (SequenceI) orderedSeqs.get(index + "");
\r
688 //Returns residue following index if gap
\r
689 startRes = seq.findPosition(sg.getStartRes());
\r
692 //Need to find the residue preceeding index if gap
\r
695 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
697 ch = seq.getCharAt(j);
\r
698 if (!jalview.util.Comparison.isGap( (ch)))
\r
706 endRes += seq.getStart() - 1;
\r
709 seqs[i] = new Sequence(seq.getName(),
\r
710 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
713 seqs[i].setDescription(seq.getDescription());
\r
714 seqs[i].setDBRef(seq.getDBRef());
\r
715 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
716 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
717 if(seq.getAnnotation()!=null)
\r
719 for(int a=0; a<seq.getAnnotation().length; a++)
\r
720 seqs[i].addAlignmentAnnotation(seq.getAnnotation()[a]);
\r
724 FastaFile ff = new FastaFile();
\r
725 ff.addJVSuffix( viewport.showJVSuffix );
\r
726 c.setContents(new StringSelection( ff.print(seqs)), Desktop.instance);
\r
727 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
733 * @param e DOCUMENT ME!
\r
735 protected void pasteNew_actionPerformed(ActionEvent e)
\r
743 * @param e DOCUMENT ME!
\r
745 protected void pasteThis_actionPerformed(ActionEvent e)
\r
747 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
748 HistoryItem.PASTE));
\r
755 * @param newAlignment DOCUMENT ME!
\r
757 void paste(boolean newAlignment)
\r
761 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
762 Transferable contents = c.getContents(this);
\r
764 if (contents == null)
\r
769 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
773 String format = new IdentifyFile().Identify(str, "Paste");
\r
774 SequenceI[] sequences;
\r
776 if(Desktop.jalviewClipboard!=null)
\r
778 // The clipboard was filled from within Jalview, we must use the sequences
\r
779 // And dataset from the copied alignment
\r
780 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
784 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
787 AlignmentI alignment = null;
\r
791 alignment = new Alignment(sequences);
\r
793 if(Desktop.jalviewClipboard!=null)
\r
794 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
796 alignment.setDataset( null );
\r
800 alignment = viewport.getAlignment();
\r
803 for (int i = 0; i < sequences.length; i++)
\r
806 Sequence newseq = new Sequence(sequences[i].getName(),
\r
807 sequences[i].getSequence(), sequences[i].getStart(),
\r
808 sequences[i].getEnd());
\r
810 alignment.addSequence(newseq);
\r
812 viewport.setEndSeq(alignment.getHeight());
\r
813 alignment.getWidth();
\r
814 viewport.firePropertyChange("alignment", null, alignment.getSequences());
\r
817 // Add any annotations attached to sequences
\r
818 for (int i = 0; i < sequences.length; i++)
\r
820 if (sequences[i].getAnnotation() != null)
\r
822 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
\r
824 AlignmentAnnotation newAnnot =
\r
825 new AlignmentAnnotation(
\r
826 sequences[i].getAnnotation()[a].label,
\r
827 sequences[i].getAnnotation()[a].description,
\r
828 sequences[i].getAnnotation()[a].annotations,
\r
829 sequences[i].getAnnotation()[a].graphMin,
\r
830 sequences[i].getAnnotation()[a].graphMax,
\r
831 sequences[i].getAnnotation()[a].graph);
\r
833 sequences[i].getAnnotation()[a] = newAnnot;
\r
834 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
\r
836 newAnnot.sequenceRef = sequences[i];
\r
837 newAnnot.adjustForAlignment();
\r
838 alignment.addAnnotation(newAnnot);
\r
839 alignment.setAnnotationIndex(newAnnot, a);
\r
842 alignPanel.annotationPanel.adjustPanelHeight();
\r
848 AlignFrame af = new AlignFrame(alignment);
\r
849 String newtitle = new String("Copied sequences");
\r
852 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
853 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
854 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
857 if (title.startsWith("Copied sequences"))
\r
863 newtitle = newtitle.concat("- from " + title);
\r
866 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
867 NEW_WINDOW_HEIGHT);
\r
873 catch (Exception ex)
\r
875 ex.printStackTrace();
\r
876 System.out.println("Exception whilst pasting: "+ex);
\r
877 // could be anything being pasted in here
\r
886 * @param e DOCUMENT ME!
\r
888 protected void cut_actionPerformed(ActionEvent e)
\r
890 copy_actionPerformed(null);
\r
891 delete_actionPerformed(null);
\r
897 * @param e DOCUMENT ME!
\r
899 protected void delete_actionPerformed(ActionEvent e)
\r
902 if (viewport.getSelectionGroup() == null)
\r
908 SequenceGroup sg = viewport.getSelectionGroup();
\r
912 //Jalview no longer allows deletion of residues.
\r
913 //Check here whether any residues are in selection area
\r
914 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
916 for (int i = 0; i < sg.sequences.size(); i++)
\r
918 SequenceI seq = sg.getSequenceAt(i);
\r
919 int j = sg.getStartRes();
\r
922 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
924 JOptionPane.showInternalMessageDialog(
\r
925 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
926 + "Try hiding columns instead.",
\r
927 "Deletion of residues not permitted",
\r
928 JOptionPane.WARNING_MESSAGE);
\r
933 }while(j<=sg.getEndRes());
\r
938 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
939 HistoryItem.HIDE));
\r
942 for (int i = 0; i < sg.getSize(false); i++)
\r
944 SequenceI seq = sg.getSequenceAt(i);
\r
945 int index = viewport.getAlignment().findIndex(seq);
\r
947 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
949 // If the cut affects all sequences, remove highlighted columns
\r
950 if (sg.getSize(false) == viewport.alignment.getHeight())
\r
952 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
953 sg.getEndRes() + 1);
\r
956 if (seq.getSequence().length() < 1)
\r
958 viewport.getAlignment().deleteSequence(seq);
\r
962 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
966 viewport.setSelectionGroup(null);
\r
967 viewport.alignment.deleteGroup(sg);
\r
969 viewport.firePropertyChange("alignment", null,
\r
970 viewport.getAlignment().getSequences());
\r
974 if (viewport.getAlignment().getHeight() < 1)
\r
978 this.setClosed(true);
\r
980 catch (Exception ex)
\r
989 * @param e DOCUMENT ME!
\r
991 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
993 viewport.alignment.deleteAllGroups();
\r
994 viewport.setSelectionGroup(null);
\r
995 alignPanel.repaint();
\r
1001 * @param e DOCUMENT ME!
\r
1003 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1005 SequenceGroup sg = new SequenceGroup();
\r
1007 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1010 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
1013 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
1014 viewport.setSelectionGroup(sg);
\r
1015 PaintRefresher.Refresh(null, viewport.alignment);
\r
1021 * @param e DOCUMENT ME!
\r
1023 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1025 if(viewport.cursorMode)
\r
1027 alignPanel.seqPanel.keyboardNo1 = null;
\r
1028 alignPanel.seqPanel.keyboardNo2 = null;
\r
1030 viewport.setSelectionGroup(null);
\r
1031 viewport.getColumnSelection().clear();
\r
1032 viewport.setSelectionGroup(null);
\r
1033 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
1034 alignPanel.idPanel.idCanvas.searchResults = null;
\r
1035 alignPanel.repaint();
\r
1036 PaintRefresher.Refresh(null, viewport.alignment);
\r
1042 * @param e DOCUMENT ME!
\r
1044 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1046 SequenceGroup sg = viewport.getSelectionGroup();
\r
1050 selectAllSequenceMenuItem_actionPerformed(null);
\r
1055 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1058 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
1061 PaintRefresher.Refresh(null, viewport.alignment);
\r
1067 * @param e DOCUMENT ME!
\r
1069 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
1071 ColumnSelection colSel = viewport.getColumnSelection();
\r
1073 if (colSel.size() > 0)
\r
1075 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
1076 HistoryItem.HIDE));
\r
1078 int min = colSel.getMin();
\r
1079 viewport.getAlignment().trimLeft(min);
\r
1080 colSel.compensateForEdit(0, min);
\r
1082 if (viewport.getSelectionGroup() != null)
\r
1084 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
1087 Vector groups = viewport.alignment.getGroups();
\r
1089 for (int i = 0; i < groups.size(); i++)
\r
1091 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1093 if (!sg.adjustForRemoveLeft(min))
\r
1095 viewport.alignment.deleteGroup(sg);
\r
1099 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1106 * @param e DOCUMENT ME!
\r
1108 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1110 ColumnSelection colSel = viewport.getColumnSelection();
\r
1112 if (colSel.size() > 0)
\r
1114 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1115 HistoryItem.HIDE));
\r
1117 int max = colSel.getMax();
\r
1118 viewport.getAlignment().trimRight(max);
\r
1120 if (viewport.getSelectionGroup() != null)
\r
1122 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1125 Vector groups = viewport.alignment.getGroups();
\r
1127 for (int i = 0; i < groups.size(); i++)
\r
1129 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1131 if (!sg.adjustForRemoveRight(max))
\r
1133 viewport.alignment.deleteGroup(sg);
\r
1137 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1144 * @param e DOCUMENT ME!
\r
1146 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1148 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1149 viewport.alignment, HistoryItem.HIDE));
\r
1151 //This is to maintain viewport position on first residue
\r
1152 //of first sequence
\r
1153 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1154 int startRes = seq.findPosition(viewport.startRes);
\r
1156 viewport.getAlignment().removeGaps();
\r
1158 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1160 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1166 * @param e DOCUMENT ME!
\r
1168 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1170 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1171 HistoryItem.HIDE));
\r
1173 //This is to maintain viewport position on first residue
\r
1174 //of first sequence
\r
1175 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1176 int startRes = seq.findPosition(viewport.startRes);
\r
1179 SequenceI current;
\r
1182 Vector seqs = null;
\r
1185 int end = viewport.alignment.getWidth();
\r
1187 if (viewport.getSelectionGroup() != null
\r
1188 && viewport.getSelectionGroup().getSequences(true) != null
\r
1189 && viewport.getSelectionGroup().getSize(true) > 0)
\r
1191 seqs = viewport.getSelectionGroup().getSequences(true);
\r
1192 start = viewport.getSelectionGroup().getStartRes();
\r
1193 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1197 seqs = viewport.alignment.getSequences();
\r
1200 for (int i = 0; i < seqs.size(); i++)
\r
1202 current = (SequenceI) seqs.elementAt(i);
\r
1203 jSize = current.getLength();
\r
1205 // Removing a range is much quicker than removing gaps
\r
1206 // one by one for long sequences
\r
1208 int rangeStart=-1, rangeEnd=-1;
\r
1212 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1214 if(rangeStart==-1)
\r
1229 current.deleteChars(rangeStart, rangeEnd);
\r
1230 j-=rangeEnd-rangeStart;
\r
1231 jSize-=rangeEnd-rangeStart;
\r
1239 while (j < end && j < jSize);
\r
1242 current.deleteChars(rangeStart, rangeEnd);
\r
1246 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1248 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1251 public void alignmentChanged()
\r
1253 if(viewport.padGaps)
\r
1254 viewport.getAlignment().padGaps();
\r
1256 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1258 viewport.updateConsensus();
\r
1259 viewport.updateConservation();
\r
1261 resetAllColourSchemes();
\r
1262 if(alignPanel.overviewPanel!=null)
\r
1263 alignPanel.overviewPanel.updateOverviewImage();
\r
1265 viewport.alignment.adjustSequenceAnnotations();
\r
1267 alignPanel.repaint();
\r
1270 void resetAllColourSchemes()
\r
1272 ColourSchemeI cs = viewport.globalColourScheme;
\r
1275 if (cs instanceof ClustalxColourScheme)
\r
1277 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1278 resetClustalX(viewport.alignment.getSequences(),
\r
1279 viewport.alignment.getWidth());
\r
1282 cs.setConsensus(viewport.vconsensus);
\r
1283 if (cs.conservationApplied())
\r
1285 Alignment al = (Alignment) viewport.alignment;
\r
1286 Conservation c = new Conservation("All",
\r
1287 ResidueProperties.propHash, 3,
\r
1288 al.getSequences(), 0,
\r
1289 al.getWidth() - 1);
\r
1291 c.verdict(false, viewport.ConsPercGaps);
\r
1293 cs.setConservation(c);
\r
1297 int s, sSize = viewport.alignment.getGroups().size();
\r
1298 for(s=0; s<sSize; s++)
\r
1300 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1301 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1303 ((ClustalxColourScheme)sg.cs).resetClustalX(
\r
1304 sg.getSequences(true), sg.getWidth());
\r
1306 sg.recalcConservation();
\r
1313 * @param e DOCUMENT ME!
\r
1315 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1317 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1318 HistoryItem.HIDE));
\r
1320 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1322 // if (viewport.padGaps)
\r
1323 alignmentChanged();
\r
1329 * @param e DOCUMENT ME!
\r
1331 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1333 JInternalFrame frame = new JInternalFrame();
\r
1334 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1335 frame.setContentPane(finder);
\r
1336 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1337 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1343 * @param e DOCUMENT ME!
\r
1345 public void font_actionPerformed(ActionEvent e)
\r
1347 new FontChooser(alignPanel);
\r
1350 public void smoothFont_actionPerformed(ActionEvent e)
\r
1352 viewport.antiAlias = smoothFont.isSelected();
\r
1353 alignPanel.annotationPanel.image = null;
\r
1354 alignPanel.repaint();
\r
1361 * @param e DOCUMENT ME!
\r
1363 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1365 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1367 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1368 alignPanel.repaint();
\r
1375 * @param e DOCUMENT ME!
\r
1377 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1379 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1380 alignPanel.repaint();
\r
1386 * @param e DOCUMENT ME!
\r
1388 public void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1390 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1391 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1392 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1393 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1394 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1400 * @param e DOCUMENT ME!
\r
1402 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1404 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1405 alignPanel.repaint();
\r
1411 * @param e DOCUMENT ME!
\r
1413 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1415 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1416 alignPanel.repaint();
\r
1422 * @param e DOCUMENT ME!
\r
1424 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1426 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1427 alignPanel.repaint();
\r
1433 * @param e DOCUMENT ME!
\r
1435 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1437 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1438 alignPanel.repaint();
\r
1444 * @param e DOCUMENT ME!
\r
1446 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1448 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1449 alignPanel.repaint();
\r
1455 * @param e DOCUMENT ME!
\r
1457 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1459 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1460 alignPanel.repaint();
\r
1464 FeatureSettings featureSettings;
\r
1465 public void featureSettings_actionPerformed(ActionEvent e)
\r
1467 if(featureSettings !=null )
\r
1469 featureSettings.close();
\r
1470 featureSettings = null;
\r
1472 featureSettings = new FeatureSettings(this);
\r
1478 * @param evt DOCUMENT ME!
\r
1480 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1482 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1483 alignPanel.repaint();
\r
1484 if (alignPanel.getOverviewPanel() != null)
\r
1486 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1493 * @param e DOCUMENT ME!
\r
1495 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1497 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1498 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1504 * @param e DOCUMENT ME!
\r
1506 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1508 if (alignPanel.overviewPanel != null)
\r
1513 JInternalFrame frame = new JInternalFrame();
\r
1514 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1515 frame.setContentPane(overview);
\r
1516 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1517 frame.getWidth(), frame.getHeight());
\r
1519 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1520 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1522 public void internalFrameClosed(
\r
1523 javax.swing.event.InternalFrameEvent evt)
\r
1525 alignPanel.setOverviewPanel(null);
\r
1530 alignPanel.setOverviewPanel(overview);
\r
1536 * @param e DOCUMENT ME!
\r
1538 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1540 changeColour(null);
\r
1546 * @param e DOCUMENT ME!
\r
1548 public void clustalColour_actionPerformed(ActionEvent e)
\r
1550 changeColour(new ClustalxColourScheme(
\r
1551 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1557 * @param e DOCUMENT ME!
\r
1559 public void zappoColour_actionPerformed(ActionEvent e)
\r
1561 changeColour(new ZappoColourScheme());
\r
1567 * @param e DOCUMENT ME!
\r
1569 public void taylorColour_actionPerformed(ActionEvent e)
\r
1571 changeColour(new TaylorColourScheme());
\r
1577 * @param e DOCUMENT ME!
\r
1579 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1581 changeColour(new HydrophobicColourScheme());
\r
1587 * @param e DOCUMENT ME!
\r
1589 public void helixColour_actionPerformed(ActionEvent e)
\r
1591 changeColour(new HelixColourScheme());
\r
1597 * @param e DOCUMENT ME!
\r
1599 public void strandColour_actionPerformed(ActionEvent e)
\r
1601 changeColour(new StrandColourScheme());
\r
1607 * @param e DOCUMENT ME!
\r
1609 public void turnColour_actionPerformed(ActionEvent e)
\r
1611 changeColour(new TurnColourScheme());
\r
1617 * @param e DOCUMENT ME!
\r
1619 public void buriedColour_actionPerformed(ActionEvent e)
\r
1621 changeColour(new BuriedColourScheme());
\r
1627 * @param e DOCUMENT ME!
\r
1629 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1631 changeColour(new NucleotideColourScheme());
\r
1634 public void annotationColour_actionPerformed(ActionEvent e)
\r
1636 new AnnotationColourChooser(viewport, alignPanel);
\r
1643 * @param e DOCUMENT ME!
\r
1645 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1647 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1653 * @param cs DOCUMENT ME!
\r
1655 public void changeColour(ColourSchemeI cs)
\r
1657 int threshold = 0;
\r
1661 if (viewport.getAbovePIDThreshold())
\r
1663 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1666 cs.setThreshold(threshold,
\r
1667 viewport.getIgnoreGapsConsensus());
\r
1669 viewport.setGlobalColourScheme(cs);
\r
1673 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1676 if (viewport.getConservationSelected())
\r
1679 Alignment al = (Alignment) viewport.alignment;
\r
1680 Conservation c = new Conservation("All",
\r
1681 ResidueProperties.propHash, 3,
\r
1682 al.getSequences(), 0,
\r
1683 al.getWidth() - 1);
\r
1686 c.verdict(false, viewport.ConsPercGaps);
\r
1688 cs.setConservation(c);
\r
1690 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1695 cs.setConservation(null);
\r
1698 cs.setConsensus(viewport.vconsensus);
\r
1701 viewport.setGlobalColourScheme(cs);
\r
1703 if (viewport.getColourAppliesToAllGroups())
\r
1705 Vector groups = viewport.alignment.getGroups();
\r
1707 for (int i = 0; i < groups.size(); i++)
\r
1709 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1717 if (cs instanceof ClustalxColourScheme)
\r
1719 sg.cs = new ClustalxColourScheme(
\r
1720 sg.getSequences(true), sg.getWidth());
\r
1722 else if (cs instanceof UserColourScheme)
\r
1724 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1730 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1732 catch (Exception ex)
\r
1737 if (viewport.getAbovePIDThreshold()
\r
1738 || cs instanceof PIDColourScheme
\r
1739 || cs instanceof Blosum62ColourScheme)
\r
1741 sg.cs.setThreshold(threshold,
\r
1742 viewport.getIgnoreGapsConsensus());
\r
1744 sg.cs.setConsensus(AAFrequency.calculate(
\r
1745 sg.getSequences(true), 0,
\r
1749 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1752 if (viewport.getConservationSelected())
\r
1754 Conservation c = new Conservation("Group",
\r
1755 ResidueProperties.propHash, 3,
\r
1756 sg.getSequences(true), 0,
\r
1757 viewport.alignment.getWidth() - 1);
\r
1759 c.verdict(false, viewport.ConsPercGaps);
\r
1760 sg.cs.setConservation(c);
\r
1763 sg.cs.setConservation(null);
\r
1767 if (alignPanel.getOverviewPanel() != null)
\r
1769 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1772 alignPanel.repaint();
\r
1778 * @param e DOCUMENT ME!
\r
1780 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1782 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1784 SliderPanel.setPIDSliderSource(alignPanel,
\r
1785 viewport.getGlobalColourScheme(),
\r
1787 SliderPanel.showPIDSlider();
\r
1794 * @param e DOCUMENT ME!
\r
1796 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1798 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1800 SliderPanel.setConservationSlider(alignPanel,
\r
1801 viewport.globalColourScheme,
\r
1803 SliderPanel.showConservationSlider();
\r
1810 * @param e DOCUMENT ME!
\r
1812 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1814 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1816 viewport.setAbovePIDThreshold(false);
\r
1817 abovePIDThreshold.setSelected(false);
\r
1819 changeColour(viewport.getGlobalColourScheme());
\r
1821 modifyConservation_actionPerformed(null);
\r
1827 * @param e DOCUMENT ME!
\r
1829 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1831 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1833 conservationMenuItem.setSelected(false);
\r
1834 viewport.setConservationSelected(false);
\r
1836 changeColour(viewport.getGlobalColourScheme());
\r
1838 modifyPID_actionPerformed(null);
\r
1844 * @param e DOCUMENT ME!
\r
1846 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1848 if (e.getActionCommand().equals("User Defined..."))
\r
1850 new UserDefinedColours(alignPanel, null);
\r
1854 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1855 getUserColourSchemes().get(e.getActionCommand());
\r
1857 changeColour(udc);
\r
1861 public void updateUserColourMenu()
\r
1864 Component[] menuItems = colourMenu.getMenuComponents();
\r
1865 int i, iSize = menuItems.length;
\r
1866 for (i = 0; i < iSize; i++)
\r
1868 if (menuItems[i].getName() != null &&
\r
1869 menuItems[i].getName().equals("USER_DEFINED"))
\r
1871 colourMenu.remove(menuItems[i]);
\r
1875 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1877 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1878 getUserColourSchemes().keys();
\r
1880 while (userColours.hasMoreElements())
\r
1882 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1883 nextElement().toString());
\r
1884 radioItem.setName("USER_DEFINED");
\r
1885 radioItem.addMouseListener(new MouseAdapter()
\r
1887 public void mousePressed(MouseEvent evt)
\r
1889 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1891 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1893 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1894 "Remove from default list?",
\r
1895 "Remove user defined colour",
\r
1896 JOptionPane.YES_NO_OPTION);
\r
1897 if(option == JOptionPane.YES_OPTION)
\r
1899 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1900 colourMenu.remove(radioItem);
\r
1903 radioItem.addActionListener(new ActionListener()
\r
1905 public void actionPerformed(ActionEvent evt)
\r
1907 userDefinedColour_actionPerformed(evt);
\r
1913 radioItem.addActionListener(new ActionListener()
\r
1915 public void actionPerformed(ActionEvent evt)
\r
1917 userDefinedColour_actionPerformed(evt);
\r
1921 colourMenu.insert(radioItem, 15);
\r
1922 colours.add(radioItem);
\r
1930 * @param e DOCUMENT ME!
\r
1932 public void PIDColour_actionPerformed(ActionEvent e)
\r
1934 changeColour(new PIDColourScheme());
\r
1940 * @param e DOCUMENT ME!
\r
1942 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1944 changeColour(new Blosum62ColourScheme());
\r
1950 * @param e DOCUMENT ME!
\r
1952 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1954 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1955 HistoryItem.SORT));
\r
1956 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1957 viewport.getAlignment().getSequenceAt(0));
\r
1958 alignPanel.repaint();
\r
1964 * @param e DOCUMENT ME!
\r
1966 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1968 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1969 HistoryItem.SORT));
\r
1970 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1971 alignPanel.repaint();
\r
1977 * @param e DOCUMENT ME!
\r
1979 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1981 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1982 HistoryItem.SORT));
\r
1984 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1985 alignPanel.repaint();
\r
1991 * @param e DOCUMENT ME!
\r
1993 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1995 new RedundancyPanel(alignPanel, this);
\r
2002 * @param e DOCUMENT ME!
\r
2004 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
2006 if ( (viewport.getSelectionGroup() == null) ||
\r
2007 (viewport.getSelectionGroup().getSize(false) < 2))
\r
2009 JOptionPane.showInternalMessageDialog(this,
\r
2010 "You must select at least 2 sequences.",
\r
2011 "Invalid Selection",
\r
2012 JOptionPane.WARNING_MESSAGE);
\r
2016 JInternalFrame frame = new JInternalFrame();
\r
2017 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
2018 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
2025 * @param e DOCUMENT ME!
\r
2027 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
2029 if ( ( (viewport.getSelectionGroup() != null) &&
\r
2030 (viewport.getSelectionGroup().getSize(false) < 4) &&
\r
2031 (viewport.getSelectionGroup().getSize(false) > 0)) ||
\r
2032 (viewport.getAlignment().getHeight() < 4))
\r
2034 JOptionPane.showInternalMessageDialog(this,
\r
2035 "Principal component analysis must take\n" +
\r
2036 "at least 4 input sequences.",
\r
2037 "Sequence selection insufficient",
\r
2038 JOptionPane.WARNING_MESSAGE);
\r
2043 new PCAPanel(viewport);
\r
2047 public void autoCalculate_actionPerformed(ActionEvent e)
\r
2049 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
2050 if(viewport.autoCalculateConsensus)
\r
2052 alignmentChanged();
\r
2060 * @param e DOCUMENT ME!
\r
2062 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
2064 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2070 * @param e DOCUMENT ME!
\r
2072 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2074 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2080 * @param e DOCUMENT ME!
\r
2082 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2084 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2090 * @param e DOCUMENT ME!
\r
2092 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2094 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2100 * @param type DOCUMENT ME!
\r
2101 * @param pwType DOCUMENT ME!
\r
2102 * @param title DOCUMENT ME!
\r
2104 void NewTreePanel(String type, String pwType, String title)
\r
2108 if ( (viewport.getSelectionGroup() != null) &&
\r
2109 (viewport.getSelectionGroup().getSize(false) > 3))
\r
2112 SequenceGroup sg = viewport.getSelectionGroup();
\r
2114 /* Decide if the selection is a column region */
\r
2115 while (s < sg.getSize(false))
\r
2117 if ( ( (SequenceI) sg.getSequences(false).elementAt(s++)).getLength() <
\r
2120 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2121 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2122 "Try using the Pad function in the edit menu,\n" +
\r
2123 "or one of the multiple sequence alignment web services.",
\r
2124 "Sequences in selection are not aligned",
\r
2125 JOptionPane.WARNING_MESSAGE);
\r
2131 title = title + " on region";
\r
2132 tp = new TreePanel(viewport,
\r
2133 viewport.getSelectionGroup().getSequences(false),
\r
2135 sg.getStartRes(), sg.getEndRes());
\r
2139 //are the sequences aligned?
\r
2140 if (!viewport.alignment.isAligned())
\r
2142 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2143 "The sequences must be aligned before creating a tree.\n" +
\r
2144 "Try using the Pad function in the edit menu,\n" +
\r
2145 "or one of the multiple sequence alignment web services.",
\r
2146 "Sequences not aligned",
\r
2147 JOptionPane.WARNING_MESSAGE);
\r
2152 tp = new TreePanel(viewport,
\r
2153 viewport.getAlignment().getSequences(), type, pwType,
\r
2155 viewport.alignment.getWidth());
\r
2158 addTreeMenuItem(tp, title);
\r
2160 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2166 * @param title DOCUMENT ME!
\r
2167 * @param order DOCUMENT ME!
\r
2169 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2171 final JMenuItem item = new JMenuItem("by " + title);
\r
2173 item.addActionListener(new java.awt.event.ActionListener()
\r
2175 public void actionPerformed(ActionEvent e)
\r
2177 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2178 HistoryItem.SORT));
\r
2180 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2181 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2182 alignPanel.repaint();
\r
2188 * Maintain the Order by->Displayed Tree menu.
\r
2189 * Creates a new menu item for a TreePanel with an appropriate
\r
2190 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2191 * to remove the menu item when the treePanel is closed, and adjust
\r
2192 * the tree leaf to sequence mapping when the alignment is modified.
\r
2193 * @param treePanel Displayed tree window.
\r
2194 * @param title SortBy menu item title.
\r
2196 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2198 final JMenuItem item = new JMenuItem(title);
\r
2202 if (treeCount == 1)
\r
2204 sort.add(sortByTreeMenu);
\r
2207 sortByTreeMenu.add(item);
\r
2208 item.addActionListener(new java.awt.event.ActionListener()
\r
2210 public void actionPerformed(ActionEvent e)
\r
2212 addHistoryItem(new HistoryItem("Tree Sort",
\r
2213 viewport.alignment, HistoryItem.SORT));
\r
2214 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2215 treePanel.getTree());
\r
2216 alignPanel.repaint();
\r
2220 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2221 InternalFrameAdapter()
\r
2223 public void internalFrameClosed(
\r
2224 javax.swing.event.InternalFrameEvent evt)
\r
2227 sortByTreeMenu.remove(item);
\r
2229 if (treeCount == 0)
\r
2231 sort.remove(sortByTreeMenu);
\r
2239 * Work out whether the whole set of sequences
\r
2240 * or just the selected set will be submitted for multiple alignment.
\r
2243 private SequenceI[] gatherSequencesForAlignment()
\r
2245 // Now, check we have enough sequences
\r
2246 SequenceI[] msa = null;
\r
2248 if ( (viewport.getSelectionGroup() != null) &&
\r
2249 (viewport.getSelectionGroup().getSize(false) > 1))
\r
2251 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2252 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2254 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2256 for (int i = 0; i < sz; i++)
\r
2258 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2263 Vector seqs = viewport.getAlignment().getSequences();
\r
2265 if (seqs.size() > 1)
\r
2267 msa = new SequenceI[seqs.size()];
\r
2269 for (int i = 0; i < seqs.size(); i++)
\r
2271 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2279 * Decides what is submitted to a secondary structure prediction service,
\r
2280 * the currently selected sequence, or the currently selected alignment
\r
2281 * (where the first sequence in the set is the one that the prediction
\r
2284 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2286 SequenceI seq = null;
\r
2287 SequenceI[] msa = null;
\r
2289 if ( (viewport.getSelectionGroup() != null) &&
\r
2290 (viewport.getSelectionGroup().getSize(false) > 0))
\r
2292 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2293 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2295 if ( (seqs.getSize(false) == 1) || !viewport.alignment.isAligned())
\r
2297 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2302 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2304 for (int i = 0; i < sz; i++)
\r
2306 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2312 Vector seqs = viewport.getAlignment().getSequences();
\r
2314 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2316 seq = (SequenceI) seqs.elementAt(0);
\r
2320 msa = new SequenceI[seqs.size()];
\r
2322 for (int i = 0; i < seqs.size(); i++)
\r
2324 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2336 return new SequenceI[]
\r
2346 * @param e DOCUMENT ME!
\r
2348 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2350 // Pick the tree file
\r
2351 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2353 "LAST_DIRECTORY"));
\r
2354 chooser.setFileView(new JalviewFileView());
\r
2355 chooser.setDialogTitle("Select a newick-like tree file");
\r
2356 chooser.setToolTipText("Load a tree file");
\r
2358 int value = chooser.showOpenDialog(null);
\r
2360 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2362 String choice = chooser.getSelectedFile().getPath();
\r
2363 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2367 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2369 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2371 catch (Exception ex)
\r
2373 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2374 "Problem reading tree file",
\r
2376 JOptionPane.WARNING_MESSAGE);
\r
2377 ex.printStackTrace();
\r
2383 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2385 return ShowNewickTree(nf,title,600,500,4,5);
\r
2390 * @param nf DOCUMENT ME!
\r
2391 * @param title DOCUMENT ME!
\r
2393 * @return DOCUMENT ME!
\r
2395 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2397 TreePanel tp = null;
\r
2403 if (nf.getTree() != null)
\r
2405 tp = new TreePanel(viewport,
\r
2406 viewport.getAlignment().getSequences(), nf,
\r
2413 tp.setLocation(x,y);
\r
2416 Desktop.addInternalFrame(tp, title, w, h);
\r
2417 addTreeMenuItem(tp, title);
\r
2420 catch (Exception ex)
\r
2422 ex.printStackTrace();
\r
2433 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2434 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2435 printJob.setPrintable(alignPanel, pf);
\r
2437 if (printJob.printDialog())
\r
2443 catch (Exception PrintException)
\r
2445 PrintException.printStackTrace();
\r
2452 * Generates menu items and listener event actions for web service clients
\r
2455 public void BuildWebServiceMenu()
\r
2457 if ( (Discoverer.services != null)
\r
2458 && (Discoverer.services.size() > 0))
\r
2460 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2461 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2462 Vector wsmenu = new Vector();
\r
2463 if (msaws != null)
\r
2465 // Add any Multiple Sequence Alignment Services
\r
2466 final JMenu msawsmenu = new JMenu("Alignment");
\r
2467 final AlignFrame af = this;
\r
2468 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2470 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2472 final JMenuItem method = new JMenuItem(sh.getName());
\r
2473 method.addActionListener(new ActionListener()
\r
2475 public void actionPerformed(ActionEvent e)
\r
2477 SequenceI[] msa = gatherSequencesForAlignment();
\r
2478 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2479 false, true, viewport.getAlignment().getDataset(), af);
\r
2484 msawsmenu.add(method);
\r
2485 // Deal with services that we know accept partial alignments.
\r
2486 if (sh.getName().indexOf("lustal") > -1)
\r
2488 // We know that ClustalWS can accept partial alignments for refinement.
\r
2489 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2490 methodR.addActionListener(new ActionListener()
\r
2492 public void actionPerformed(ActionEvent e)
\r
2494 SequenceI[] msa = gatherSequencesForAlignment();
\r
2495 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2496 true, true, viewport.getAlignment().getDataset(), af);
\r
2501 msawsmenu.add(methodR);
\r
2505 wsmenu.add(msawsmenu);
\r
2507 if (secstrpr != null)
\r
2509 // Add any secondary structure prediction services
\r
2510 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2511 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2513 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2515 final JMenuItem method = new JMenuItem(sh.getName());
\r
2516 method.addActionListener(new ActionListener()
\r
2518 public void actionPerformed(ActionEvent e)
\r
2520 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2521 if (msa.length == 1)
\r
2523 // Single Sequence prediction
\r
2524 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2528 if (msa.length > 1)
\r
2530 // Single Sequence prediction
\r
2531 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2537 secstrmenu.add(method);
\r
2539 wsmenu.add(secstrmenu);
\r
2541 this.webService.removeAll();
\r
2542 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2544 webService.add( (JMenu) wsmenu.get(i));
\r
2549 this.webService.removeAll();
\r
2550 this.webService.add(this.webServiceNoServices);
\r
2552 // TODO: add in rediscovery function
\r
2553 // TODO: reduce code redundancy.
\r
2554 // TODO: group services by location as well as function.
\r
2557 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2559 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2560 getProperty("LAST_DIRECTORY"));
\r
2562 chooser.setFileView(new JalviewFileView());
\r
2563 chooser.setDialogTitle("Export to Vamsas file");
\r
2564 chooser.setToolTipText("Export");
\r
2566 int value = chooser.showSaveDialog(this);
\r
2568 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2570 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2571 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2572 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2580 public void showTranslation_actionPerformed(ActionEvent e)
\r
2582 int s, sSize = viewport.alignment.getHeight();
\r
2583 SequenceI [] newSeq = new SequenceI[sSize];
\r
2586 StringBuffer protein;
\r
2588 for(s=0; s<sSize; s++)
\r
2590 protein = new StringBuffer();
\r
2591 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2592 resSize = seq.length();
\r
2593 resSize -= resSize%3;
\r
2595 for(res = 0; res < resSize; res+=3)
\r
2597 String codon = seq.substring(res, res+3);
\r
2598 codon = codon.replace('U', 'T');
\r
2599 String aa = ResidueProperties.codonTranslate(codon);
\r
2601 protein.append(viewport.getGapCharacter());
\r
2602 else if(aa.equals("STOP"))
\r
2603 protein.append("X");
\r
2605 protein.append( aa );
\r
2607 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2611 AlignmentI al = new Alignment(newSeq);
\r
2612 al.setDataset(null);
\r
2615 ////////////////////////////////
\r
2616 // Copy annotations across
\r
2617 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2618 = viewport.alignment.getAlignmentAnnotation();
\r
2620 if(annotations!=null)
\r
2622 for (int i = 0; i < annotations.length; i++)
\r
2624 if (annotations[i].label.equals("Quality") ||
\r
2625 annotations[i].label.equals("Conservation") ||
\r
2626 annotations[i].label.equals("Consensus"))
\r
2631 aSize = viewport.alignment.getWidth() / 3;
\r
2632 jalview.datamodel.Annotation[] anots =
\r
2633 new jalview.datamodel.Annotation[aSize];
\r
2635 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2637 if (annotations[i].annotations[a] == null
\r
2638 || annotations[i].annotations[a] == null)
\r
2641 anots[a / 3] = new Annotation(
\r
2642 annotations[i].annotations[a].displayCharacter,
\r
2643 annotations[i].annotations[a].description,
\r
2644 annotations[i].annotations[a].secondaryStructure,
\r
2645 annotations[i].annotations[a].value,
\r
2646 annotations[i].annotations[a].colour);
\r
2649 jalview.datamodel.AlignmentAnnotation aa
\r
2650 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2651 annotations[i].description, anots);
\r
2652 al.addAnnotation(aa);
\r
2656 AlignFrame af = new AlignFrame(al);
\r
2657 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2659 NEW_WINDOW_HEIGHT);
\r
2662 // AlignViewport newViewport = new AlignViewport(al);
\r
2663 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2664 // tabbedPane.add("Protein", ap);
\r
2665 // viewports.add(newViewport);
\r
2666 // alignPanels.add(ap);
\r
2669 /////////////////////////
\r
2671 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2672 // ds.setDataset(true);
\r
2673 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2674 // tabbedPane.add("Dataset", dap);
\r
2675 // viewports.add(ds);
\r
2676 // alignPanels.add(dap);
\r
2677 /////////////////////////
\r
2682 /*public void tabSelected()
\r
2684 int index = tabbedPane.getSelectedIndex();
\r
2685 viewport = (AlignViewport)viewports.elementAt(index);
\r
2686 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2692 * @param String DOCUMENT ME!
\r
2694 public boolean parseFeaturesFile(String file, String type)
\r
2696 boolean featuresFile = false;
\r
2698 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment.getDataset(),
\r
2699 alignPanel.seqPanel.seqCanvas.
\r
2700 getFeatureRenderer().featureColours,
\r
2703 catch(Exception ex)
\r
2705 ex.printStackTrace();
\r
2710 viewport.showSequenceFeatures = true;
\r
2711 showSeqFeatures.setSelected(true);
\r
2712 alignPanel.repaint();
\r
2715 return featuresFile;
\r
2718 public void dragEnter(DropTargetDragEvent evt)
\r
2721 public void dragExit(DropTargetEvent evt)
\r
2724 public void dragOver(DropTargetDragEvent evt)
\r
2727 public void dropActionChanged(DropTargetDragEvent evt)
\r
2730 public void drop(DropTargetDropEvent evt)
\r
2732 Transferable t = evt.getTransferable();
\r
2733 java.util.List files = null;
\r
2737 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2738 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2740 //Works on Windows and MacOSX
\r
2741 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2742 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2744 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2746 // This is used by Unix drag system
\r
2747 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2748 String data = (String) t.getTransferData(uriListFlavor);
\r
2749 files = new java.util.ArrayList(1);
\r
2750 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2753 st.hasMoreTokens(); )
\r
2755 String s = st.nextToken();
\r
2756 if (s.startsWith("#"))
\r
2758 // the line is a comment (as per the RFC 2483)
\r
2762 java.net.URI uri = new java.net.URI(s);
\r
2763 java.io.File file = new java.io.File(uri);
\r
2768 catch (Exception e)
\r
2770 e.printStackTrace();
\r
2772 if (files != null)
\r
2777 for (int i = 0; i < files.size(); i++)
\r
2779 loadJalviewDataFile(files.get(i).toString());
\r
2782 catch (Exception ex)
\r
2784 ex.printStackTrace();
\r
2789 // This method will attempt to load a "dropped" file first by testing
\r
2790 // whether its and Annotation file, then features file. If both are
\r
2791 // false then the user may have dropped an alignment file onto this
\r
2793 public void loadJalviewDataFile(String file)
\r
2796 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
\r
2799 if (!isAnnotation)
\r
2801 boolean isGroupsFile = parseFeaturesFile(file,
\r
2802 AppletFormatAdapter.FILE);
\r
2803 if (!isGroupsFile)
\r
2805 String protocol = "File";
\r
2806 String format = new IdentifyFile().Identify(file, protocol);
\r
2807 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2810 FastaFile ff = new FastaFile();
\r
2811 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2812 c.setContents(new StringSelection(ff.print(sequences)), Desktop.instance);
\r
2814 this.paste(false);
\r
2820 alignPanel.adjustAnnotationHeight();
\r
2823 }catch(Exception ex)
\r
2825 ex.printStackTrace();
\r