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
135 if(jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false))
\r
137 wrapMenuItem.setSelected(true);
\r
138 wrapMenuItem_actionPerformed(null);
\r
142 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
143 private void addServiceListeners()
\r
145 final java.beans.PropertyChangeListener thisListener;
\r
146 // Do this once to get current state
\r
147 BuildWebServiceMenu();
\r
148 Desktop.discoverer.addPropertyChangeListener(
\r
149 thisListener = new java.beans.PropertyChangeListener()
\r
151 public void propertyChange(PropertyChangeEvent evt)
\r
153 // System.out.println("Discoverer property change.");
\r
154 if (evt.getPropertyName().equals("services"))
\r
156 // System.out.println("Rebuilding web service menu");
\r
157 BuildWebServiceMenu();
\r
161 addInternalFrameListener(new javax.swing.event.
\r
162 InternalFrameAdapter()
\r
164 public void internalFrameClosed(
\r
165 javax.swing.event.InternalFrameEvent evt)
\r
167 // System.out.println("deregistering discoverer listener");
\r
168 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
169 closeMenuItem_actionPerformed(null);
\r
175 public void setGUINucleotide(boolean nucleotide)
\r
177 showTranslation.setVisible( nucleotide );
\r
178 //sequenceFeatures.setVisible(!nucleotide );
\r
179 //featureSettings.setVisible( !nucleotide );
\r
180 conservationMenuItem.setVisible( !nucleotide );
\r
181 modifyConservation.setVisible( !nucleotide );
\r
183 //Remember AlignFrame always starts as protein
\r
186 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
190 public void comeBackLater(FeatureEvent evt)
\r
193 public void newFeatures(FeatureEvent evt)
\r
195 if (evt.getFeatures().length > 0)
\r
197 alignPanel.seqPanel.seqCanvas.fr.featuresAdded();
\r
198 alignPanel.repaint();
\r
202 System.out.println("No Features found for " +
\r
203 evt.getDasSource().getNickname());
\r
207 Hashtable progressBars;
\r
208 public void setProgressBar(String message, long id)
\r
210 if(progressBars == null)
\r
211 progressBars = new Hashtable();
\r
213 JPanel progressPanel;
\r
214 GridLayout layout = (GridLayout) statusPanel.getLayout();
\r
215 if(progressBars.get( new Long(id) )!=null)
\r
217 progressPanel = (JPanel)progressBars.get( new Long(id) );
\r
218 statusPanel.remove(progressPanel);
\r
219 progressBars.remove( progressPanel );
\r
220 progressPanel = null;
\r
222 statusBar.setText(message);
\r
224 layout.setRows(layout.getRows() - 1);
\r
228 progressPanel = new JPanel(new BorderLayout(10, 5));
\r
230 JProgressBar progressBar = new JProgressBar();
\r
231 progressBar.setIndeterminate(true);
\r
233 progressPanel.add(new JLabel(message), BorderLayout.WEST);
\r
234 progressPanel.add(progressBar, BorderLayout.CENTER);
\r
236 layout.setRows(layout.getRows() + 1);
\r
237 statusPanel.add(progressPanel);
\r
239 progressBars.put(new Long(id), progressPanel);
\r
247 Added so Castor Mapping file can obtain Jalview Version
\r
249 public String getVersion()
\r
251 return jalview.bin.Cache.getProperty("VERSION");
\r
254 public FeatureRenderer getFeatureRenderer()
\r
256 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
\r
260 public void fetchSequence_actionPerformed(ActionEvent e)
\r
262 new SequenceFetcher(this);
\r
265 public void addFromFile_actionPerformed(ActionEvent e)
\r
267 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
\r
270 public void addFromText_actionPerformed(ActionEvent e)
\r
272 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
\r
275 public void addFromURL_actionPerformed(ActionEvent e)
\r
277 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
\r
283 * @param e DOCUMENT ME!
\r
285 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
287 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
288 getProperty( "LAST_DIRECTORY"),
\r
290 { "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc","jar" },
\r
292 { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview" },
\r
297 chooser.setFileView(new JalviewFileView());
\r
298 chooser.setDialogTitle("Save Alignment to file");
\r
299 chooser.setToolTipText("Save");
\r
301 int value = chooser.showSaveDialog(this);
\r
303 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
305 currentFileFormat = chooser.getSelectedFormat();
\r
307 if (currentFileFormat == null)
\r
309 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
310 "You must select a file format before saving!",
\r
311 "File format not specified",
\r
312 JOptionPane.WARNING_MESSAGE);
\r
313 value = chooser.showSaveDialog(this);
\r
317 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
318 currentFileFormat);
\r
320 String choice = chooser.getSelectedFile().getPath();
\r
321 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
323 saveAlignment(choice, currentFileFormat);
\r
327 public boolean saveAlignment(String file, String format)
\r
329 if (format.equalsIgnoreCase("Jalview"))
\r
331 String shortName = title;
\r
333 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
335 shortName = shortName.substring(shortName.lastIndexOf(
\r
336 java.io.File.separatorChar) + 1);
\r
339 new Jalview2XML().SaveAlignment(this, file, shortName);
\r
341 // USE Jalview2XML to save this file
\r
346 String output = new FormatAdapter().formatSequences(format,
\r
347 viewport.getAlignment().
\r
349 if (output == null)
\r
356 java.io.PrintWriter out = new java.io.PrintWriter(
\r
357 new java.io.FileWriter(file));
\r
361 this.setTitle(file);
\r
364 catch (Exception ex)
\r
366 ex.printStackTrace();
\r
375 * @param e DOCUMENT ME!
\r
377 protected void outputText_actionPerformed(ActionEvent e)
\r
379 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
380 Desktop.addInternalFrame(cap,
\r
381 "Alignment output - " + e.getActionCommand(), 600,
\r
383 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
384 viewport.getAlignment().
\r
391 * @param e DOCUMENT ME!
\r
393 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
395 new HTMLOutput(viewport,
\r
396 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
397 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
400 public void createImageMap(File file, String image)
\r
402 alignPanel.makePNGImageMap(file, image);
\r
408 * @param e DOCUMENT ME!
\r
410 public void createPNG(File f)
\r
412 alignPanel.makePNG(f);
\r
418 * @param e DOCUMENT ME!
\r
420 public void createEPS(File f)
\r
422 alignPanel.makeEPS(f);
\r
428 * @param e DOCUMENT ME!
\r
430 public void printMenuItem_actionPerformed(ActionEvent e)
\r
432 //Putting in a thread avoids Swing painting problems
\r
433 PrintThread thread = new PrintThread();
\r
437 public void exportFeatures_actionPerformed(ActionEvent e)
\r
439 new AnnotationExporter().exportFeatures(alignPanel);
\r
442 public void exportAnnotations_actionPerformed(ActionEvent e)
\r
444 new AnnotationExporter().exportAnnotations(
\r
446 viewport.alignment.getAlignmentAnnotation()
\r
451 public void associatedData_actionPerformed(ActionEvent e)
\r
453 // Pick the tree file
\r
454 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
456 "LAST_DIRECTORY"));
\r
457 chooser.setFileView(new JalviewFileView());
\r
458 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
459 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
461 int value = chooser.showOpenDialog(null);
\r
463 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
465 String choice = chooser.getSelectedFile().getPath();
\r
466 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
467 loadJalviewDataFile(choice);
\r
475 * @param e DOCUMENT ME!
\r
477 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
481 PaintRefresher.components.remove(viewport.alignment);
\r
482 this.setClosed(true);
\r
484 catch (Exception ex)
\r
492 void updateEditMenuBar()
\r
494 if (historyList.size() > 0)
\r
496 undoMenuItem.setEnabled(true);
\r
498 HistoryItem hi = (HistoryItem) historyList.peek();
\r
499 undoMenuItem.setText("Undo " + hi.getDescription());
\r
503 undoMenuItem.setEnabled(false);
\r
504 undoMenuItem.setText("Undo");
\r
507 if (redoList.size() > 0)
\r
509 redoMenuItem.setEnabled(true);
\r
511 HistoryItem hi = (HistoryItem) redoList.peek();
\r
512 redoMenuItem.setText("Redo " + hi.getDescription());
\r
516 redoMenuItem.setEnabled(false);
\r
517 redoMenuItem.setText("Redo");
\r
524 * @param hi DOCUMENT ME!
\r
526 public void addHistoryItem(HistoryItem hi)
\r
528 historyList.push(hi);
\r
529 updateEditMenuBar();
\r
535 * @param e DOCUMENT ME!
\r
537 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
539 HistoryItem hi = (HistoryItem) historyList.pop();
\r
540 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
541 HistoryItem.HIDE));
\r
542 restoreHistoryItem(hi);
\r
543 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
549 * @param e DOCUMENT ME!
\r
551 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
553 HistoryItem hi = (HistoryItem) redoList.pop();
\r
554 restoreHistoryItem(hi);
\r
555 updateEditMenuBar();
\r
556 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
559 // used by undo and redo
\r
560 void restoreHistoryItem(HistoryItem hi)
\r
565 updateEditMenuBar();
\r
567 viewport.firePropertyChange("alignment", null,
\r
568 viewport.getAlignment().getSequences());
\r
574 * @param up DOCUMENT ME!
\r
576 public void moveSelectedSequences(boolean up)
\r
578 SequenceGroup sg = viewport.getSelectionGroup();
\r
587 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
589 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
591 if (!sg.sequences.contains(seq))
\r
596 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
598 if (sg.sequences.contains(temp))
\r
603 viewport.alignment.getSequences().setElementAt(temp, i);
\r
604 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
609 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
611 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
613 if (!sg.sequences.contains(seq))
\r
618 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
620 if (sg.sequences.contains(temp))
\r
625 viewport.alignment.getSequences().setElementAt(temp, i);
\r
626 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
630 alignPanel.repaint();
\r
638 * @param e DOCUMENT ME!
\r
640 protected void copy_actionPerformed(ActionEvent e)
\r
642 if (viewport.getSelectionGroup() == null)
\r
647 SequenceGroup sg = viewport.getSelectionGroup();
\r
649 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
651 Hashtable orderedSeqs = new Hashtable();
\r
652 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
654 for (int i = 0; i < sg.getSize(); i++)
\r
656 SequenceI seq = sg.getSequenceAt(i);
\r
657 int index = viewport.alignment.findIndex(seq);
\r
658 orderedSeqs.put(index + "", seq);
\r
661 int index = 0, startRes, endRes;
\r
664 for (int i = 0; i < sg.getSize(); i++)
\r
666 SequenceI seq = null;
\r
668 while (seq == null)
\r
670 if (orderedSeqs.containsKey(index + ""))
\r
672 seq = (SequenceI) orderedSeqs.get(index + "");
\r
684 //Returns residue following index if gap
\r
685 startRes = seq.findPosition(sg.getStartRes());
\r
688 //Need to find the residue preceeding index if gap
\r
691 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
693 ch = seq.getCharAt(j);
\r
694 if (!jalview.util.Comparison.isGap( (ch)))
\r
702 endRes += seq.getStart() - 1;
\r
705 seqs[i] = new Sequence(seq.getName(),
\r
706 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
709 seqs[i].setDescription(seq.getDescription());
\r
710 seqs[i].setDBRef(seq.getDBRef());
\r
711 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
712 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
713 if(seq.getAnnotation()!=null)
\r
715 for(int a=0; a<seq.getAnnotation().length; a++)
\r
716 seqs[i].addAlignmentAnnotation(seq.getAnnotation()[a]);
\r
720 FastaFile ff = new FastaFile();
\r
721 ff.addJVSuffix( viewport.showJVSuffix );
\r
722 c.setContents(new StringSelection( ff.print(seqs)), Desktop.instance);
\r
723 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
729 * @param e DOCUMENT ME!
\r
731 protected void pasteNew_actionPerformed(ActionEvent e)
\r
739 * @param e DOCUMENT ME!
\r
741 protected void pasteThis_actionPerformed(ActionEvent e)
\r
743 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
744 HistoryItem.PASTE));
\r
751 * @param newAlignment DOCUMENT ME!
\r
753 void paste(boolean newAlignment)
\r
757 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
758 Transferable contents = c.getContents(this);
\r
760 if (contents == null)
\r
765 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
769 String format = new IdentifyFile().Identify(str, "Paste");
\r
770 SequenceI[] sequences;
\r
772 if(Desktop.jalviewClipboard!=null)
\r
774 // The clipboard was filled from within Jalview, we must use the sequences
\r
775 // And dataset from the copied alignment
\r
776 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
780 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
783 AlignmentI alignment = null;
\r
787 alignment = new Alignment(sequences);
\r
789 if(Desktop.jalviewClipboard!=null)
\r
790 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
792 alignment.setDataset( null );
\r
796 alignment = viewport.getAlignment();
\r
799 for (int i = 0; i < sequences.length; i++)
\r
802 Sequence newseq = new Sequence(sequences[i].getName(),
\r
803 sequences[i].getSequence(), sequences[i].getStart(),
\r
804 sequences[i].getEnd());
\r
806 alignment.addSequence(newseq);
\r
808 viewport.setEndSeq(alignment.getHeight());
\r
809 alignment.getWidth();
\r
810 viewport.firePropertyChange("alignment", null, alignment.getSequences());
\r
813 // Add any annotations attached to sequences
\r
814 for (int i = 0; i < sequences.length; i++)
\r
816 if (sequences[i].getAnnotation() != null)
\r
818 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
\r
820 AlignmentAnnotation newAnnot =
\r
821 new AlignmentAnnotation(
\r
822 sequences[i].getAnnotation()[a].label,
\r
823 sequences[i].getAnnotation()[a].description,
\r
824 sequences[i].getAnnotation()[a].annotations,
\r
825 sequences[i].getAnnotation()[a].graphMin,
\r
826 sequences[i].getAnnotation()[a].graphMax,
\r
827 sequences[i].getAnnotation()[a].graph);
\r
829 sequences[i].getAnnotation()[a] = newAnnot;
\r
830 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
\r
832 newAnnot.sequenceRef = sequences[i];
\r
833 newAnnot.adjustForAlignment();
\r
834 alignment.addAnnotation(newAnnot);
\r
835 alignment.setAnnotationIndex(newAnnot, a);
\r
838 alignPanel.annotationPanel.adjustPanelHeight();
\r
844 AlignFrame af = new AlignFrame(alignment);
\r
845 String newtitle = new String("Copied sequences");
\r
848 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
849 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
850 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
853 if (title.startsWith("Copied sequences"))
\r
859 newtitle = newtitle.concat("- from " + title);
\r
862 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
863 NEW_WINDOW_HEIGHT);
\r
869 catch (Exception ex)
\r
871 ex.printStackTrace();
\r
872 System.out.println("Exception whilst pasting: "+ex);
\r
873 // could be anything being pasted in here
\r
882 * @param e DOCUMENT ME!
\r
884 protected void cut_actionPerformed(ActionEvent e)
\r
886 copy_actionPerformed(null);
\r
887 delete_actionPerformed(null);
\r
893 * @param e DOCUMENT ME!
\r
895 protected void delete_actionPerformed(ActionEvent e)
\r
898 if (viewport.getSelectionGroup() == null)
\r
904 SequenceGroup sg = viewport.getSelectionGroup();
\r
908 //Jalview no longer allows deletion of residues.
\r
909 //Check here whether any residues are in selection area
\r
910 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
912 for (int i = 0; i < sg.sequences.size(); i++)
\r
914 SequenceI seq = sg.getSequenceAt(i);
\r
915 int j = sg.getStartRes();
\r
918 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
920 JOptionPane.showInternalMessageDialog(
\r
921 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
922 + "Try hiding columns instead.",
\r
923 "Deletion of residues not permitted",
\r
924 JOptionPane.WARNING_MESSAGE);
\r
929 }while(j<=sg.getEndRes());
\r
934 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
935 HistoryItem.HIDE));
\r
938 for (int i = 0; i < sg.sequences.size(); i++)
\r
940 SequenceI seq = sg.getSequenceAt(i);
\r
941 int index = viewport.getAlignment().findIndex(seq);
\r
943 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
945 // If the cut affects all sequences, remove highlighted columns
\r
946 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
948 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
949 sg.getEndRes() + 1);
\r
952 if (seq.getSequence().length() < 1)
\r
954 viewport.getAlignment().deleteSequence(seq);
\r
958 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
962 viewport.setSelectionGroup(null);
\r
963 viewport.alignment.deleteGroup(sg);
\r
965 viewport.firePropertyChange("alignment", null,
\r
966 viewport.getAlignment().getSequences());
\r
970 if (viewport.getAlignment().getHeight() < 1)
\r
974 this.setClosed(true);
\r
976 catch (Exception ex)
\r
985 * @param e DOCUMENT ME!
\r
987 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
989 viewport.alignment.deleteAllGroups();
\r
990 viewport.setSelectionGroup(null);
\r
991 alignPanel.repaint();
\r
997 * @param e DOCUMENT ME!
\r
999 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1001 SequenceGroup sg = new SequenceGroup();
\r
1003 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1006 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
1009 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
1010 viewport.setSelectionGroup(sg);
\r
1011 PaintRefresher.Refresh(null, viewport.alignment);
\r
1017 * @param e DOCUMENT ME!
\r
1019 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1021 if(viewport.cursorMode)
\r
1023 alignPanel.seqPanel.keyboardNo1 = null;
\r
1024 alignPanel.seqPanel.keyboardNo2 = null;
\r
1026 viewport.setSelectionGroup(null);
\r
1027 viewport.getColumnSelection().clear();
\r
1028 viewport.setSelectionGroup(null);
\r
1029 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
1030 alignPanel.idPanel.idCanvas.searchResults = null;
\r
1031 PaintRefresher.Refresh(null, viewport.alignment);
\r
1037 * @param e DOCUMENT ME!
\r
1039 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1041 SequenceGroup sg = viewport.getSelectionGroup();
\r
1045 selectAllSequenceMenuItem_actionPerformed(null);
\r
1050 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1053 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
1056 PaintRefresher.Refresh(null, viewport.alignment);
\r
1062 * @param e DOCUMENT ME!
\r
1064 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
1066 ColumnSelection colSel = viewport.getColumnSelection();
\r
1068 if (colSel.size() > 0)
\r
1070 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
1071 HistoryItem.HIDE));
\r
1073 int min = colSel.getMin();
\r
1074 viewport.getAlignment().trimLeft(min);
\r
1075 colSel.compensateForEdit(0, min);
\r
1077 if (viewport.getSelectionGroup() != null)
\r
1079 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
1082 Vector groups = viewport.alignment.getGroups();
\r
1084 for (int i = 0; i < groups.size(); i++)
\r
1086 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1088 if (!sg.adjustForRemoveLeft(min))
\r
1090 viewport.alignment.deleteGroup(sg);
\r
1094 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1101 * @param e DOCUMENT ME!
\r
1103 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1105 ColumnSelection colSel = viewport.getColumnSelection();
\r
1107 if (colSel.size() > 0)
\r
1109 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1110 HistoryItem.HIDE));
\r
1112 int max = colSel.getMax();
\r
1113 viewport.getAlignment().trimRight(max);
\r
1115 if (viewport.getSelectionGroup() != null)
\r
1117 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1120 Vector groups = viewport.alignment.getGroups();
\r
1122 for (int i = 0; i < groups.size(); i++)
\r
1124 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1126 if (!sg.adjustForRemoveRight(max))
\r
1128 viewport.alignment.deleteGroup(sg);
\r
1132 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1139 * @param e DOCUMENT ME!
\r
1141 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1143 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1144 viewport.alignment, HistoryItem.HIDE));
\r
1146 //This is to maintain viewport position on first residue
\r
1147 //of first sequence
\r
1148 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1149 int startRes = seq.findPosition(viewport.startRes);
\r
1151 viewport.getAlignment().removeGaps();
\r
1153 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1155 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1161 * @param e DOCUMENT ME!
\r
1163 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1165 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1166 HistoryItem.HIDE));
\r
1168 //This is to maintain viewport position on first residue
\r
1169 //of first sequence
\r
1170 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1171 int startRes = seq.findPosition(viewport.startRes);
\r
1174 SequenceI current;
\r
1177 Vector seqs = null;
\r
1180 int end = viewport.alignment.getWidth();
\r
1182 if (viewport.getSelectionGroup() != null
\r
1183 && viewport.getSelectionGroup().sequences != null
\r
1184 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1186 seqs = viewport.getSelectionGroup().sequences;
\r
1187 start = viewport.getSelectionGroup().getStartRes();
\r
1188 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1192 seqs = viewport.alignment.getSequences();
\r
1195 for (int i = 0; i < seqs.size(); i++)
\r
1197 current = (SequenceI) seqs.elementAt(i);
\r
1198 jSize = current.getLength();
\r
1200 // Removing a range is much quicker than removing gaps
\r
1201 // one by one for long sequences
\r
1203 int rangeStart=-1, rangeEnd=-1;
\r
1207 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1209 if(rangeStart==-1)
\r
1224 current.deleteChars(rangeStart, rangeEnd);
\r
1225 j-=rangeEnd-rangeStart;
\r
1226 jSize-=rangeEnd-rangeStart;
\r
1234 while (j < end && j < jSize);
\r
1237 current.deleteChars(rangeStart, rangeEnd);
\r
1241 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1243 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1246 public void alignmentChanged()
\r
1248 if(viewport.padGaps)
\r
1249 viewport.getAlignment().padGaps();
\r
1251 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1253 viewport.updateConsensus();
\r
1254 viewport.updateConservation();
\r
1256 resetAllColourSchemes();
\r
1257 if(alignPanel.overviewPanel!=null)
\r
1258 alignPanel.overviewPanel.updateOverviewImage();
\r
1260 viewport.alignment.adjustSequenceAnnotations();
\r
1262 alignPanel.repaint();
\r
1265 void resetAllColourSchemes()
\r
1267 ColourSchemeI cs = viewport.globalColourScheme;
\r
1270 if (cs instanceof ClustalxColourScheme)
\r
1272 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1273 resetClustalX(viewport.alignment.getSequences(),
\r
1274 viewport.alignment.getWidth());
\r
1277 cs.setConsensus(viewport.vconsensus);
\r
1278 if (cs.conservationApplied())
\r
1280 Alignment al = (Alignment) viewport.alignment;
\r
1281 Conservation c = new Conservation("All",
\r
1282 ResidueProperties.propHash, 3,
\r
1283 al.getSequences(), 0,
\r
1284 al.getWidth() - 1);
\r
1286 c.verdict(false, viewport.ConsPercGaps);
\r
1288 cs.setConservation(c);
\r
1292 int s, sSize = viewport.alignment.getGroups().size();
\r
1293 for(s=0; s<sSize; s++)
\r
1295 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1296 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1298 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1300 sg.recalcConservation();
\r
1307 * @param e DOCUMENT ME!
\r
1309 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1311 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1312 HistoryItem.HIDE));
\r
1314 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1316 // if (viewport.padGaps)
\r
1317 alignmentChanged();
\r
1323 * @param e DOCUMENT ME!
\r
1325 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1327 JInternalFrame frame = new JInternalFrame();
\r
1328 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1329 frame.setContentPane(finder);
\r
1330 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1331 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1337 * @param e DOCUMENT ME!
\r
1339 public void font_actionPerformed(ActionEvent e)
\r
1341 new FontChooser(alignPanel);
\r
1344 public void smoothFont_actionPerformed(ActionEvent e)
\r
1346 viewport.antiAlias = smoothFont.isSelected();
\r
1347 alignPanel.annotationPanel.image = null;
\r
1348 alignPanel.repaint();
\r
1355 * @param e DOCUMENT ME!
\r
1357 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1359 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1361 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1362 alignPanel.repaint();
\r
1369 * @param e DOCUMENT ME!
\r
1371 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1373 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1374 alignPanel.repaint();
\r
1380 * @param e DOCUMENT ME!
\r
1382 public void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1384 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1385 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1386 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1387 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1388 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1389 alignPanel.repaint();
\r
1395 * @param e DOCUMENT ME!
\r
1397 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1399 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1400 alignPanel.repaint();
\r
1406 * @param e DOCUMENT ME!
\r
1408 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1410 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1411 alignPanel.repaint();
\r
1417 * @param e DOCUMENT ME!
\r
1419 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1421 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1422 alignPanel.repaint();
\r
1428 * @param e DOCUMENT ME!
\r
1430 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1432 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1433 alignPanel.repaint();
\r
1439 * @param e DOCUMENT ME!
\r
1441 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1443 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1444 alignPanel.repaint();
\r
1450 * @param e DOCUMENT ME!
\r
1452 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1454 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1455 alignPanel.repaint();
\r
1459 public void dbRefs_actionPerformed(ActionEvent e)
\r
1461 new DBRefFetcher(viewport.alignment, this);
\r
1464 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1466 new DasSequenceFeatureFetcher(viewport.alignment,
\r
1468 viewport.setShowSequenceFeatures(true);
\r
1469 showSeqFeatures.setSelected(true);
\r
1473 public void featureSettings_actionPerformed(ActionEvent e)
\r
1475 new FeatureSettings(viewport, alignPanel);
\r
1481 * @param evt DOCUMENT ME!
\r
1483 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1485 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1486 alignPanel.repaint();
\r
1487 if (alignPanel.getOverviewPanel() != null)
\r
1489 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1496 * @param e DOCUMENT ME!
\r
1498 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1500 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1501 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1507 * @param e DOCUMENT ME!
\r
1509 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1511 if (alignPanel.overviewPanel != null)
\r
1516 JInternalFrame frame = new JInternalFrame();
\r
1517 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1518 frame.setContentPane(overview);
\r
1519 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1520 frame.getWidth(), frame.getHeight());
\r
1522 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1523 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1525 public void internalFrameClosed(
\r
1526 javax.swing.event.InternalFrameEvent evt)
\r
1528 alignPanel.setOverviewPanel(null);
\r
1533 alignPanel.setOverviewPanel(overview);
\r
1539 * @param e DOCUMENT ME!
\r
1541 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1543 changeColour(null);
\r
1549 * @param e DOCUMENT ME!
\r
1551 public void clustalColour_actionPerformed(ActionEvent e)
\r
1553 changeColour(new ClustalxColourScheme(
\r
1554 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1560 * @param e DOCUMENT ME!
\r
1562 public void zappoColour_actionPerformed(ActionEvent e)
\r
1564 changeColour(new ZappoColourScheme());
\r
1570 * @param e DOCUMENT ME!
\r
1572 public void taylorColour_actionPerformed(ActionEvent e)
\r
1574 changeColour(new TaylorColourScheme());
\r
1580 * @param e DOCUMENT ME!
\r
1582 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1584 changeColour(new HydrophobicColourScheme());
\r
1590 * @param e DOCUMENT ME!
\r
1592 public void helixColour_actionPerformed(ActionEvent e)
\r
1594 changeColour(new HelixColourScheme());
\r
1600 * @param e DOCUMENT ME!
\r
1602 public void strandColour_actionPerformed(ActionEvent e)
\r
1604 changeColour(new StrandColourScheme());
\r
1610 * @param e DOCUMENT ME!
\r
1612 public void turnColour_actionPerformed(ActionEvent e)
\r
1614 changeColour(new TurnColourScheme());
\r
1620 * @param e DOCUMENT ME!
\r
1622 public void buriedColour_actionPerformed(ActionEvent e)
\r
1624 changeColour(new BuriedColourScheme());
\r
1630 * @param e DOCUMENT ME!
\r
1632 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1634 changeColour(new NucleotideColourScheme());
\r
1637 public void annotationColour_actionPerformed(ActionEvent e)
\r
1639 new AnnotationColourChooser(viewport, alignPanel);
\r
1646 * @param e DOCUMENT ME!
\r
1648 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1650 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1656 * @param cs DOCUMENT ME!
\r
1658 void changeColour(ColourSchemeI cs)
\r
1660 int threshold = 0;
\r
1664 if (viewport.getAbovePIDThreshold())
\r
1666 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1669 cs.setThreshold(threshold,
\r
1670 viewport.getIgnoreGapsConsensus());
\r
1672 viewport.setGlobalColourScheme(cs);
\r
1676 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1679 if (viewport.getConservationSelected())
\r
1682 Alignment al = (Alignment) viewport.alignment;
\r
1683 Conservation c = new Conservation("All",
\r
1684 ResidueProperties.propHash, 3,
\r
1685 al.getSequences(), 0,
\r
1686 al.getWidth() - 1);
\r
1689 c.verdict(false, viewport.ConsPercGaps);
\r
1691 cs.setConservation(c);
\r
1693 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1698 cs.setConservation(null);
\r
1701 cs.setConsensus(viewport.vconsensus);
\r
1704 viewport.setGlobalColourScheme(cs);
\r
1706 if (viewport.getColourAppliesToAllGroups())
\r
1708 Vector groups = viewport.alignment.getGroups();
\r
1710 for (int i = 0; i < groups.size(); i++)
\r
1712 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1720 if (cs instanceof ClustalxColourScheme)
\r
1722 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1724 else if (cs instanceof UserColourScheme)
\r
1726 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1732 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1734 catch (Exception ex)
\r
1739 if (viewport.getAbovePIDThreshold()
\r
1740 || cs instanceof PIDColourScheme
\r
1741 || cs instanceof Blosum62ColourScheme)
\r
1743 sg.cs.setThreshold(threshold,
\r
1744 viewport.getIgnoreGapsConsensus());
\r
1746 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1750 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1753 if (viewport.getConservationSelected())
\r
1755 Conservation c = new Conservation("Group",
\r
1756 ResidueProperties.propHash, 3,
\r
1758 viewport.alignment.getWidth() - 1);
\r
1760 c.verdict(false, viewport.ConsPercGaps);
\r
1761 sg.cs.setConservation(c);
\r
1764 sg.cs.setConservation(null);
\r
1768 if (alignPanel.getOverviewPanel() != null)
\r
1770 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1773 alignPanel.repaint();
\r
1779 * @param e DOCUMENT ME!
\r
1781 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1783 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1785 SliderPanel.setPIDSliderSource(alignPanel,
\r
1786 viewport.getGlobalColourScheme(),
\r
1788 SliderPanel.showPIDSlider();
\r
1795 * @param e DOCUMENT ME!
\r
1797 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1799 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1801 SliderPanel.setConservationSlider(alignPanel,
\r
1802 viewport.globalColourScheme,
\r
1804 SliderPanel.showConservationSlider();
\r
1811 * @param e DOCUMENT ME!
\r
1813 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1815 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1817 viewport.setAbovePIDThreshold(false);
\r
1818 abovePIDThreshold.setSelected(false);
\r
1820 changeColour(viewport.getGlobalColourScheme());
\r
1822 modifyConservation_actionPerformed(null);
\r
1828 * @param e DOCUMENT ME!
\r
1830 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1832 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1834 conservationMenuItem.setSelected(false);
\r
1835 viewport.setConservationSelected(false);
\r
1837 changeColour(viewport.getGlobalColourScheme());
\r
1839 modifyPID_actionPerformed(null);
\r
1845 * @param e DOCUMENT ME!
\r
1847 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1849 if (e.getActionCommand().equals("User Defined..."))
\r
1851 new UserDefinedColours(alignPanel, null);
\r
1855 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1856 getUserColourSchemes().get(e.getActionCommand());
\r
1858 changeColour(udc);
\r
1862 public void updateUserColourMenu()
\r
1865 Component[] menuItems = colourMenu.getMenuComponents();
\r
1866 int i, iSize = menuItems.length;
\r
1867 for (i = 0; i < iSize; i++)
\r
1869 if (menuItems[i].getName() != null &&
\r
1870 menuItems[i].getName().equals("USER_DEFINED"))
\r
1872 colourMenu.remove(menuItems[i]);
\r
1876 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1878 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1879 getUserColourSchemes().keys();
\r
1881 while (userColours.hasMoreElements())
\r
1883 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1884 nextElement().toString());
\r
1885 radioItem.setName("USER_DEFINED");
\r
1886 radioItem.addMouseListener(new MouseAdapter()
\r
1888 public void mousePressed(MouseEvent evt)
\r
1890 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1892 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1894 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1895 "Remove from default list?",
\r
1896 "Remove user defined colour",
\r
1897 JOptionPane.YES_NO_OPTION);
\r
1898 if(option == JOptionPane.YES_OPTION)
\r
1900 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1901 colourMenu.remove(radioItem);
\r
1904 radioItem.addActionListener(new ActionListener()
\r
1906 public void actionPerformed(ActionEvent evt)
\r
1908 userDefinedColour_actionPerformed(evt);
\r
1914 radioItem.addActionListener(new ActionListener()
\r
1916 public void actionPerformed(ActionEvent evt)
\r
1918 userDefinedColour_actionPerformed(evt);
\r
1922 colourMenu.insert(radioItem, 15);
\r
1923 colours.add(radioItem);
\r
1931 * @param e DOCUMENT ME!
\r
1933 public void PIDColour_actionPerformed(ActionEvent e)
\r
1935 changeColour(new PIDColourScheme());
\r
1941 * @param e DOCUMENT ME!
\r
1943 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1945 changeColour(new Blosum62ColourScheme());
\r
1951 * @param e DOCUMENT ME!
\r
1953 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1955 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1956 HistoryItem.SORT));
\r
1957 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1958 viewport.getAlignment().getSequenceAt(0));
\r
1959 alignPanel.repaint();
\r
1965 * @param e DOCUMENT ME!
\r
1967 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1969 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1970 HistoryItem.SORT));
\r
1971 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1972 alignPanel.repaint();
\r
1978 * @param e DOCUMENT ME!
\r
1980 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1982 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1983 HistoryItem.SORT));
\r
1985 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1986 alignPanel.repaint();
\r
1992 * @param e DOCUMENT ME!
\r
1994 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1996 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1997 JInternalFrame frame = new JInternalFrame();
\r
1998 frame.setContentPane(sp);
\r
1999 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
2006 * @param e DOCUMENT ME!
\r
2008 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
2010 if ( (viewport.getSelectionGroup() == null) ||
\r
2011 (viewport.getSelectionGroup().getSize() < 2))
\r
2013 JOptionPane.showInternalMessageDialog(this,
\r
2014 "You must select at least 2 sequences.",
\r
2015 "Invalid Selection",
\r
2016 JOptionPane.WARNING_MESSAGE);
\r
2020 JInternalFrame frame = new JInternalFrame();
\r
2021 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
2022 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
2029 * @param e DOCUMENT ME!
\r
2031 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
2033 if ( ( (viewport.getSelectionGroup() != null) &&
\r
2034 (viewport.getSelectionGroup().getSize() < 4) &&
\r
2035 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
2036 (viewport.getAlignment().getHeight() < 4))
\r
2038 JOptionPane.showInternalMessageDialog(this,
\r
2039 "Principal component analysis must take\n" +
\r
2040 "at least 4 input sequences.",
\r
2041 "Sequence selection insufficient",
\r
2042 JOptionPane.WARNING_MESSAGE);
\r
2047 new PCAPanel(viewport);
\r
2051 public void autoCalculate_actionPerformed(ActionEvent e)
\r
2053 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
2054 if(viewport.autoCalculateConsensus)
\r
2056 alignmentChanged();
\r
2064 * @param e DOCUMENT ME!
\r
2066 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
2068 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2074 * @param e DOCUMENT ME!
\r
2076 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2078 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2084 * @param e DOCUMENT ME!
\r
2086 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2088 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2094 * @param e DOCUMENT ME!
\r
2096 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2098 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2104 * @param type DOCUMENT ME!
\r
2105 * @param pwType DOCUMENT ME!
\r
2106 * @param title DOCUMENT ME!
\r
2108 void NewTreePanel(String type, String pwType, String title)
\r
2112 if ( (viewport.getSelectionGroup() != null) &&
\r
2113 (viewport.getSelectionGroup().getSize() > 3))
\r
2116 SequenceGroup sg = viewport.getSelectionGroup();
\r
2118 /* Decide if the selection is a column region */
\r
2119 while (s < sg.sequences.size())
\r
2121 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
2124 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2125 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2126 "Try using the Pad function in the edit menu,\n" +
\r
2127 "or one of the multiple sequence alignment web services.",
\r
2128 "Sequences in selection are not aligned",
\r
2129 JOptionPane.WARNING_MESSAGE);
\r
2135 title = title + " on region";
\r
2136 tp = new TreePanel(viewport,
\r
2137 viewport.getSelectionGroup().sequences, type, pwType,
\r
2138 sg.getStartRes(), sg.getEndRes());
\r
2142 //are the sequences aligned?
\r
2143 if (!viewport.alignment.isAligned())
\r
2145 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2146 "The sequences must be aligned before creating a tree.\n" +
\r
2147 "Try using the Pad function in the edit menu,\n" +
\r
2148 "or one of the multiple sequence alignment web services.",
\r
2149 "Sequences not aligned",
\r
2150 JOptionPane.WARNING_MESSAGE);
\r
2155 tp = new TreePanel(viewport,
\r
2156 viewport.getAlignment().getSequences(), type, pwType,
\r
2158 viewport.alignment.getWidth());
\r
2161 addTreeMenuItem(tp, title);
\r
2163 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2169 * @param title DOCUMENT ME!
\r
2170 * @param order DOCUMENT ME!
\r
2172 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2174 final JMenuItem item = new JMenuItem("by " + title);
\r
2176 item.addActionListener(new java.awt.event.ActionListener()
\r
2178 public void actionPerformed(ActionEvent e)
\r
2180 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2181 HistoryItem.SORT));
\r
2183 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2184 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2185 alignPanel.repaint();
\r
2191 * Maintain the Order by->Displayed Tree menu.
\r
2192 * Creates a new menu item for a TreePanel with an appropriate
\r
2193 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2194 * to remove the menu item when the treePanel is closed, and adjust
\r
2195 * the tree leaf to sequence mapping when the alignment is modified.
\r
2196 * @param treePanel Displayed tree window.
\r
2197 * @param title SortBy menu item title.
\r
2199 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2201 final JMenuItem item = new JMenuItem(title);
\r
2205 if (treeCount == 1)
\r
2207 sort.add(sortByTreeMenu);
\r
2210 sortByTreeMenu.add(item);
\r
2211 item.addActionListener(new java.awt.event.ActionListener()
\r
2213 public void actionPerformed(ActionEvent e)
\r
2215 addHistoryItem(new HistoryItem("Tree Sort",
\r
2216 viewport.alignment, HistoryItem.SORT));
\r
2217 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2218 treePanel.getTree());
\r
2219 alignPanel.repaint();
\r
2223 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2224 InternalFrameAdapter()
\r
2226 public void internalFrameClosed(
\r
2227 javax.swing.event.InternalFrameEvent evt)
\r
2230 sortByTreeMenu.remove(item);
\r
2232 if (treeCount == 0)
\r
2234 sort.remove(sortByTreeMenu);
\r
2242 * Work out whether the whole set of sequences
\r
2243 * or just the selected set will be submitted for multiple alignment.
\r
2246 private SequenceI[] gatherSequencesForAlignment()
\r
2248 // Now, check we have enough sequences
\r
2249 SequenceI[] msa = null;
\r
2251 if ( (viewport.getSelectionGroup() != null) &&
\r
2252 (viewport.getSelectionGroup().getSize() > 1))
\r
2254 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2255 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2257 msa = new SequenceI[sz = seqs.getSize()];
\r
2259 for (int i = 0; i < sz; i++)
\r
2261 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2266 Vector seqs = viewport.getAlignment().getSequences();
\r
2268 if (seqs.size() > 1)
\r
2270 msa = new SequenceI[seqs.size()];
\r
2272 for (int i = 0; i < seqs.size(); i++)
\r
2274 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2282 * Decides what is submitted to a secondary structure prediction service,
\r
2283 * the currently selected sequence, or the currently selected alignment
\r
2284 * (where the first sequence in the set is the one that the prediction
\r
2287 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2289 SequenceI seq = null;
\r
2290 SequenceI[] msa = null;
\r
2292 if ( (viewport.getSelectionGroup() != null) &&
\r
2293 (viewport.getSelectionGroup().getSize() > 0))
\r
2295 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2296 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2298 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2300 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2305 msa = new SequenceI[sz = seqs.getSize()];
\r
2307 for (int i = 0; i < sz; i++)
\r
2309 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2315 Vector seqs = viewport.getAlignment().getSequences();
\r
2317 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2319 seq = (SequenceI) seqs.elementAt(0);
\r
2323 msa = new SequenceI[seqs.size()];
\r
2325 for (int i = 0; i < seqs.size(); i++)
\r
2327 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2339 return new SequenceI[]
\r
2349 * @param e DOCUMENT ME!
\r
2351 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2353 // Pick the tree file
\r
2354 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2356 "LAST_DIRECTORY"));
\r
2357 chooser.setFileView(new JalviewFileView());
\r
2358 chooser.setDialogTitle("Select a newick-like tree file");
\r
2359 chooser.setToolTipText("Load a tree file");
\r
2361 int value = chooser.showOpenDialog(null);
\r
2363 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2365 String choice = chooser.getSelectedFile().getPath();
\r
2366 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2370 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2372 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2374 catch (Exception ex)
\r
2376 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2377 "Problem reading tree file",
\r
2379 JOptionPane.WARNING_MESSAGE);
\r
2380 ex.printStackTrace();
\r
2386 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2388 return ShowNewickTree(nf,title,600,500,4,5);
\r
2393 * @param nf DOCUMENT ME!
\r
2394 * @param title DOCUMENT ME!
\r
2396 * @return DOCUMENT ME!
\r
2398 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2400 TreePanel tp = null;
\r
2406 if (nf.getTree() != null)
\r
2408 tp = new TreePanel(viewport,
\r
2409 viewport.getAlignment().getSequences(), nf,
\r
2416 tp.setLocation(x,y);
\r
2419 Desktop.addInternalFrame(tp, title, w, h);
\r
2420 addTreeMenuItem(tp, title);
\r
2423 catch (Exception ex)
\r
2425 ex.printStackTrace();
\r
2436 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2437 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2438 printJob.setPrintable(alignPanel, pf);
\r
2440 if (printJob.printDialog())
\r
2446 catch (Exception PrintException)
\r
2448 PrintException.printStackTrace();
\r
2455 * Generates menu items and listener event actions for web service clients
\r
2458 public void BuildWebServiceMenu()
\r
2460 if ( (Discoverer.services != null)
\r
2461 && (Discoverer.services.size() > 0))
\r
2463 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2464 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2465 Vector wsmenu = new Vector();
\r
2466 if (msaws != null)
\r
2468 // Add any Multiple Sequence Alignment Services
\r
2469 final JMenu msawsmenu = new JMenu("Alignment");
\r
2470 final AlignFrame af = this;
\r
2471 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2473 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2475 final JMenuItem method = new JMenuItem(sh.getName());
\r
2476 method.addActionListener(new ActionListener()
\r
2478 public void actionPerformed(ActionEvent e)
\r
2480 SequenceI[] msa = gatherSequencesForAlignment();
\r
2481 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2482 false, true, viewport.getAlignment().getDataset(), af);
\r
2487 msawsmenu.add(method);
\r
2488 // Deal with services that we know accept partial alignments.
\r
2489 if (sh.getName().indexOf("lustal") > -1)
\r
2491 // We know that ClustalWS can accept partial alignments for refinement.
\r
2492 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2493 methodR.addActionListener(new ActionListener()
\r
2495 public void actionPerformed(ActionEvent e)
\r
2497 SequenceI[] msa = gatherSequencesForAlignment();
\r
2498 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2499 true, true, viewport.getAlignment().getDataset(), af);
\r
2504 msawsmenu.add(methodR);
\r
2508 wsmenu.add(msawsmenu);
\r
2510 if (secstrpr != null)
\r
2512 // Add any secondary structure prediction services
\r
2513 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2514 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2516 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2518 final JMenuItem method = new JMenuItem(sh.getName());
\r
2519 method.addActionListener(new ActionListener()
\r
2521 public void actionPerformed(ActionEvent e)
\r
2523 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2524 if (msa.length == 1)
\r
2526 // Single Sequence prediction
\r
2527 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2531 if (msa.length > 1)
\r
2533 // Single Sequence prediction
\r
2534 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2540 secstrmenu.add(method);
\r
2542 wsmenu.add(secstrmenu);
\r
2544 this.webService.removeAll();
\r
2545 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2547 webService.add( (JMenu) wsmenu.get(i));
\r
2552 this.webService.removeAll();
\r
2553 this.webService.add(this.webServiceNoServices);
\r
2555 // TODO: add in rediscovery function
\r
2556 // TODO: reduce code redundancy.
\r
2557 // TODO: group services by location as well as function.
\r
2560 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2562 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2563 getProperty("LAST_DIRECTORY"));
\r
2565 chooser.setFileView(new JalviewFileView());
\r
2566 chooser.setDialogTitle("Export to Vamsas file");
\r
2567 chooser.setToolTipText("Export");
\r
2569 int value = chooser.showSaveDialog(this);
\r
2571 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2573 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2574 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2575 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2583 public void showTranslation_actionPerformed(ActionEvent e)
\r
2585 int s, sSize = viewport.alignment.getHeight();
\r
2586 SequenceI [] newSeq = new SequenceI[sSize];
\r
2589 StringBuffer protein;
\r
2591 for(s=0; s<sSize; s++)
\r
2593 protein = new StringBuffer();
\r
2594 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2595 resSize = seq.length();
\r
2596 resSize -= resSize%3;
\r
2598 for(res = 0; res < resSize; res+=3)
\r
2600 String codon = seq.substring(res, res+3);
\r
2601 codon = codon.replace('U', 'T');
\r
2602 String aa = ResidueProperties.codonTranslate(codon);
\r
2604 protein.append(viewport.getGapCharacter());
\r
2605 else if(aa.equals("STOP"))
\r
2606 protein.append("X");
\r
2608 protein.append( aa );
\r
2610 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2614 AlignmentI al = new Alignment(newSeq);
\r
2615 al.setDataset(null);
\r
2618 ////////////////////////////////
\r
2619 // Copy annotations across
\r
2620 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2621 = viewport.alignment.getAlignmentAnnotation();
\r
2623 if(annotations!=null)
\r
2625 for (int i = 0; i < annotations.length; i++)
\r
2627 if (annotations[i].label.equals("Quality") ||
\r
2628 annotations[i].label.equals("Conservation") ||
\r
2629 annotations[i].label.equals("Consensus"))
\r
2634 aSize = viewport.alignment.getWidth() / 3;
\r
2635 jalview.datamodel.Annotation[] anots =
\r
2636 new jalview.datamodel.Annotation[aSize];
\r
2638 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2640 if (annotations[i].annotations[a] == null
\r
2641 || annotations[i].annotations[a] == null)
\r
2644 anots[a / 3] = new Annotation(
\r
2645 annotations[i].annotations[a].displayCharacter,
\r
2646 annotations[i].annotations[a].description,
\r
2647 annotations[i].annotations[a].secondaryStructure,
\r
2648 annotations[i].annotations[a].value,
\r
2649 annotations[i].annotations[a].colour);
\r
2652 jalview.datamodel.AlignmentAnnotation aa
\r
2653 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2654 annotations[i].description, anots);
\r
2655 al.addAnnotation(aa);
\r
2659 AlignFrame af = new AlignFrame(al);
\r
2660 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2662 NEW_WINDOW_HEIGHT);
\r
2665 // AlignViewport newViewport = new AlignViewport(al);
\r
2666 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2667 // tabbedPane.add("Protein", ap);
\r
2668 // viewports.add(newViewport);
\r
2669 // alignPanels.add(ap);
\r
2672 /////////////////////////
\r
2674 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2675 // ds.setDataset(true);
\r
2676 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2677 // tabbedPane.add("Dataset", dap);
\r
2678 // viewports.add(ds);
\r
2679 // alignPanels.add(dap);
\r
2680 /////////////////////////
\r
2685 /*public void tabSelected()
\r
2687 int index = tabbedPane.getSelectedIndex();
\r
2688 viewport = (AlignViewport)viewports.elementAt(index);
\r
2689 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2695 * @param String DOCUMENT ME!
\r
2697 public boolean parseFeaturesFile(String file, String type)
\r
2699 boolean featuresFile = false;
\r
2701 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment.getDataset(),
\r
2702 alignPanel.seqPanel.seqCanvas.
\r
2703 getFeatureRenderer().featureColours);
\r
2705 catch(Exception ex)
\r
2707 ex.printStackTrace();
\r
2712 viewport.showSequenceFeatures = true;
\r
2713 showSeqFeatures.setSelected(true);
\r
2714 alignPanel.repaint();
\r
2717 return featuresFile;
\r
2720 public void dragEnter(DropTargetDragEvent evt)
\r
2723 public void dragExit(DropTargetEvent evt)
\r
2726 public void dragOver(DropTargetDragEvent evt)
\r
2729 public void dropActionChanged(DropTargetDragEvent evt)
\r
2732 public void drop(DropTargetDropEvent evt)
\r
2734 Transferable t = evt.getTransferable();
\r
2735 java.util.List files = null;
\r
2739 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2740 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2742 //Works on Windows and MacOSX
\r
2743 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2744 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2746 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2748 // This is used by Unix drag system
\r
2749 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2750 String data = (String) t.getTransferData(uriListFlavor);
\r
2751 files = new java.util.ArrayList(1);
\r
2752 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2755 st.hasMoreTokens(); )
\r
2757 String s = st.nextToken();
\r
2758 if (s.startsWith("#"))
\r
2760 // the line is a comment (as per the RFC 2483)
\r
2764 java.net.URI uri = new java.net.URI(s);
\r
2765 java.io.File file = new java.io.File(uri);
\r
2770 catch (Exception e)
\r
2772 e.printStackTrace();
\r
2774 if (files != null)
\r
2779 for (int i = 0; i < files.size(); i++)
\r
2781 loadJalviewDataFile(files.get(i).toString());
\r
2784 catch (Exception ex)
\r
2786 ex.printStackTrace();
\r
2791 // This method will attempt to load a "dropped" file first by testing
\r
2792 // whether its and Annotation file, then features file. If both are
\r
2793 // false then the user may have dropped an alignment file onto this
\r
2795 public void loadJalviewDataFile(String file)
\r
2798 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
\r
2801 if (!isAnnotation)
\r
2803 boolean isGroupsFile = parseFeaturesFile(file,
\r
2804 AppletFormatAdapter.FILE);
\r
2805 if (!isGroupsFile)
\r
2807 String protocol = "File";
\r
2808 String format = new IdentifyFile().Identify(file, protocol);
\r
2809 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2812 FastaFile ff = new FastaFile();
\r
2813 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2814 c.setContents(new StringSelection(ff.print(sequences)), Desktop.instance);
\r
2816 this.paste(false);
\r
2822 alignPanel.adjustAnnotationHeight();
\r
2825 }catch(Exception ex)
\r
2827 ex.printStackTrace();
\r