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
351 String[] omitHidden = null;
\r
353 if (viewport.hasHiddenColumns)
\r
355 System.out.println("PROMPT USER HERE");
\r
356 omitHidden = viewport.getSelectionAsString();
\r
359 String output = new FormatAdapter().formatSequences(
\r
361 viewport.getSelectionAsNewSequence(),
\r
365 if (output == null)
\r
372 java.io.PrintWriter out = new java.io.PrintWriter(
\r
373 new java.io.FileWriter(file));
\r
377 this.setTitle(file);
\r
380 catch (Exception ex)
\r
382 ex.printStackTrace();
\r
391 * @param e DOCUMENT ME!
\r
393 protected void outputText_actionPerformed(ActionEvent e)
\r
395 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
398 String [] omitHidden = null;
\r
400 if(viewport.hasHiddenColumns)
\r
402 System.out.println("PROMPT USER HERE");
\r
403 omitHidden = viewport.getSelectionAsString();
\r
406 cap.setText(new FormatAdapter().formatSequences(
\r
407 e.getActionCommand(),
\r
408 viewport.getSelectionAsNewSequence(),
\r
415 * @param e DOCUMENT ME!
\r
417 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
419 new HTMLOutput(viewport,
\r
420 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
421 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
424 public void createImageMap(File file, String image)
\r
426 alignPanel.makePNGImageMap(file, image);
\r
432 * @param e DOCUMENT ME!
\r
434 public void createPNG(File f)
\r
436 alignPanel.makePNG(f);
\r
442 * @param e DOCUMENT ME!
\r
444 public void createEPS(File f)
\r
446 alignPanel.makeEPS(f);
\r
452 * @param e DOCUMENT ME!
\r
454 public void printMenuItem_actionPerformed(ActionEvent e)
\r
456 //Putting in a thread avoids Swing painting problems
\r
457 PrintThread thread = new PrintThread();
\r
461 public void exportFeatures_actionPerformed(ActionEvent e)
\r
463 new AnnotationExporter().exportFeatures(alignPanel);
\r
466 public void exportAnnotations_actionPerformed(ActionEvent e)
\r
468 new AnnotationExporter().exportAnnotations(
\r
470 viewport.alignment.getAlignmentAnnotation()
\r
475 public void associatedData_actionPerformed(ActionEvent e)
\r
477 // Pick the tree file
\r
478 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
480 "LAST_DIRECTORY"));
\r
481 chooser.setFileView(new JalviewFileView());
\r
482 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
483 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
485 int value = chooser.showOpenDialog(null);
\r
487 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
489 String choice = chooser.getSelectedFile().getPath();
\r
490 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
491 loadJalviewDataFile(choice);
\r
499 * @param e DOCUMENT ME!
\r
501 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
505 PaintRefresher.components.remove(viewport.alignment);
\r
506 this.setClosed(true);
\r
508 catch (Exception ex)
\r
516 void updateEditMenuBar()
\r
518 if (historyList.size() > 0)
\r
520 undoMenuItem.setEnabled(true);
\r
522 HistoryItem hi = (HistoryItem) historyList.peek();
\r
523 undoMenuItem.setText("Undo " + hi.getDescription());
\r
527 undoMenuItem.setEnabled(false);
\r
528 undoMenuItem.setText("Undo");
\r
531 if (redoList.size() > 0)
\r
533 redoMenuItem.setEnabled(true);
\r
535 HistoryItem hi = (HistoryItem) redoList.peek();
\r
536 redoMenuItem.setText("Redo " + hi.getDescription());
\r
540 redoMenuItem.setEnabled(false);
\r
541 redoMenuItem.setText("Redo");
\r
548 * @param hi DOCUMENT ME!
\r
550 public void addHistoryItem(HistoryItem hi)
\r
552 historyList.push(hi);
\r
553 updateEditMenuBar();
\r
559 * @param e DOCUMENT ME!
\r
561 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
563 HistoryItem hi = (HistoryItem) historyList.pop();
\r
564 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
565 HistoryItem.HIDE));
\r
566 restoreHistoryItem(hi);
\r
567 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
573 * @param e DOCUMENT ME!
\r
575 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
577 HistoryItem hi = (HistoryItem) redoList.pop();
\r
578 restoreHistoryItem(hi);
\r
579 updateEditMenuBar();
\r
580 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
583 // used by undo and redo
\r
584 void restoreHistoryItem(HistoryItem hi)
\r
589 updateEditMenuBar();
\r
591 viewport.firePropertyChange("alignment", null,
\r
592 viewport.getAlignment().getSequences());
\r
598 * @param up DOCUMENT ME!
\r
600 public void moveSelectedSequences(boolean up)
\r
602 SequenceGroup sg = viewport.getSelectionGroup();
\r
611 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
613 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
615 if (!sg.getSequences(false).contains(seq))
\r
620 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
622 if (sg.getSequences(false).contains(temp))
\r
627 viewport.alignment.getSequences().setElementAt(temp, i);
\r
628 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
633 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
635 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
637 if (!sg.getSequences(false).contains(seq))
\r
642 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
644 if (sg.getSequences(false).contains(temp))
\r
649 viewport.alignment.getSequences().setElementAt(temp, i);
\r
650 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
654 alignPanel.repaint();
\r
662 * @param e DOCUMENT ME!
\r
664 protected void copy_actionPerformed(ActionEvent e)
\r
666 if (viewport.getSelectionGroup() == null)
\r
671 if(viewport.getSelectionGroup()==null)
\r
673 seqs = viewport.alignment.getSequencesArray();
\r
677 seqs = viewport.getSelectionGroup().getSequencesInOrder(viewport.alignment);
\r
680 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
682 FastaFile ff = new FastaFile();
\r
683 ff.addJVSuffix( viewport.showJVSuffix );
\r
685 c.setContents(new StringSelection(ff.print(seqs)), Desktop.instance);
\r
687 Vector hiddenColumns = null;
\r
688 if(viewport.hasHiddenColumns && viewport.getSelectionGroup()!=null)
\r
690 hiddenColumns =new Vector();
\r
691 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
\r
692 for(int i=0; i<viewport.getColumnSelection().getHiddenColumns().size(); i++)
\r
694 int[] region = (int[])
\r
695 viewport.getColumnSelection().getHiddenColumns().elementAt(i);
\r
697 hiddenColumns.addElement(new int[]{region[0]-hiddenOffset,
\r
698 region[1]-hiddenOffset});
\r
701 Desktop.jalviewClipboard = new Object[]{ seqs,
\r
702 viewport.alignment.getDataset(),
\r
709 * @param e DOCUMENT ME!
\r
711 protected void pasteNew_actionPerformed(ActionEvent e)
\r
719 * @param e DOCUMENT ME!
\r
721 protected void pasteThis_actionPerformed(ActionEvent e)
\r
723 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
724 HistoryItem.PASTE));
\r
731 * @param newAlignment DOCUMENT ME!
\r
733 void paste(boolean newAlignment)
\r
737 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
738 Transferable contents = c.getContents(this);
\r
740 if (contents == null)
\r
745 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
749 String format = new IdentifyFile().Identify(str, "Paste");
\r
750 SequenceI[] sequences;
\r
752 if(Desktop.jalviewClipboard!=null)
\r
754 // The clipboard was filled from within Jalview, we must use the sequences
\r
755 // And dataset from the copied alignment
\r
756 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
760 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
763 AlignmentI alignment = null;
\r
767 alignment = new Alignment(sequences);
\r
769 if(Desktop.jalviewClipboard!=null)
\r
770 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
772 alignment.setDataset( null );
\r
776 alignment = viewport.getAlignment();
\r
779 for (int i = 0; i < sequences.length; i++)
\r
782 Sequence newseq = new Sequence(sequences[i].getName(),
\r
783 sequences[i].getSequence(), sequences[i].getStart(),
\r
784 sequences[i].getEnd());
\r
786 alignment.addSequence(newseq);
\r
788 viewport.setEndSeq(alignment.getHeight());
\r
789 alignment.getWidth();
\r
790 viewport.firePropertyChange("alignment", null, alignment.getSequences());
\r
793 // Add any annotations attached to sequences
\r
794 for (int i = 0; i < sequences.length; i++)
\r
796 if (sequences[i].getAnnotation() != null)
\r
798 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
\r
800 AlignmentAnnotation newAnnot =
\r
801 new AlignmentAnnotation(
\r
802 sequences[i].getAnnotation()[a].label,
\r
803 sequences[i].getAnnotation()[a].description,
\r
804 sequences[i].getAnnotation()[a].annotations,
\r
805 sequences[i].getAnnotation()[a].graphMin,
\r
806 sequences[i].getAnnotation()[a].graphMax,
\r
807 sequences[i].getAnnotation()[a].graph);
\r
809 sequences[i].getAnnotation()[a] = newAnnot;
\r
810 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
\r
812 newAnnot.sequenceRef = sequences[i];
\r
813 newAnnot.adjustForAlignment();
\r
814 alignment.addAnnotation(newAnnot);
\r
815 alignment.setAnnotationIndex(newAnnot, a);
\r
818 alignPanel.annotationPanel.adjustPanelHeight();
\r
824 AlignFrame af = new AlignFrame(alignment);
\r
825 String newtitle = new String("Copied sequences");
\r
827 if(Desktop.jalviewClipboard[2]!=null)
\r
829 Vector hc = (Vector)Desktop.jalviewClipboard[2];
\r
830 for(int i=0; i<hc.size(); i++)
\r
832 int [] region = (int[]) hc.elementAt(i);
\r
833 for(int j=region[0]; j<region[1]+1; j++)
\r
834 af.viewport.getColumnSelection().addElement(j);
\r
835 af.viewport.getColumnSelection().hideColumns(region[0], af.viewport);
\r
840 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
841 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
842 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
845 if (title.startsWith("Copied sequences"))
\r
851 newtitle = newtitle.concat("- from " + title);
\r
854 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
855 NEW_WINDOW_HEIGHT);
\r
861 catch (Exception ex)
\r
863 ex.printStackTrace();
\r
864 System.out.println("Exception whilst pasting: "+ex);
\r
865 // could be anything being pasted in here
\r
874 * @param e DOCUMENT ME!
\r
876 protected void cut_actionPerformed(ActionEvent e)
\r
878 copy_actionPerformed(null);
\r
879 delete_actionPerformed(null);
\r
885 * @param e DOCUMENT ME!
\r
887 protected void delete_actionPerformed(ActionEvent e)
\r
890 if (viewport.getSelectionGroup() == null)
\r
896 SequenceGroup sg = viewport.getSelectionGroup();
\r
900 //Jalview no longer allows deletion of residues.
\r
901 //Check here whether any residues are in selection area
\r
902 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
904 for (int i = 0; i < sg.sequences.size(); i++)
\r
906 SequenceI seq = sg.getSequenceAt(i);
\r
907 int j = sg.getStartRes();
\r
910 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
912 JOptionPane.showInternalMessageDialog(
\r
913 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
914 + "Try hiding columns instead.",
\r
915 "Deletion of residues not permitted",
\r
916 JOptionPane.WARNING_MESSAGE);
\r
921 }while(j<=sg.getEndRes());
\r
926 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
927 HistoryItem.HIDE));
\r
930 for (int i = 0; i < sg.getSize(false); i++)
\r
932 SequenceI seq = sg.getSequenceAt(i);
\r
933 int index = viewport.getAlignment().findIndex(seq);
\r
935 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
937 // If the cut affects all sequences, remove highlighted columns
\r
938 if (sg.getSize(false) == viewport.alignment.getHeight())
\r
940 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
941 sg.getEndRes() + 1);
\r
944 if (seq.getSequence().length() < 1)
\r
946 viewport.getAlignment().deleteSequence(seq);
\r
950 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
954 viewport.setSelectionGroup(null);
\r
955 viewport.alignment.deleteGroup(sg);
\r
957 viewport.firePropertyChange("alignment", null,
\r
958 viewport.getAlignment().getSequences());
\r
962 if (viewport.getAlignment().getHeight() < 1)
\r
966 this.setClosed(true);
\r
968 catch (Exception ex)
\r
977 * @param e DOCUMENT ME!
\r
979 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
981 viewport.alignment.deleteAllGroups();
\r
982 viewport.setSelectionGroup(null);
\r
983 alignPanel.repaint();
\r
989 * @param e DOCUMENT ME!
\r
991 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
993 SequenceGroup sg = new SequenceGroup();
\r
995 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
998 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
1001 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
1002 viewport.setSelectionGroup(sg);
\r
1003 PaintRefresher.Refresh(null, viewport.alignment);
\r
1009 * @param e DOCUMENT ME!
\r
1011 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1013 if(viewport.cursorMode)
\r
1015 alignPanel.seqPanel.keyboardNo1 = null;
\r
1016 alignPanel.seqPanel.keyboardNo2 = null;
\r
1018 viewport.setSelectionGroup(null);
\r
1019 viewport.getColumnSelection().clear();
\r
1020 viewport.setSelectionGroup(null);
\r
1021 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
1022 alignPanel.idPanel.idCanvas.searchResults = null;
\r
1023 alignPanel.repaint();
\r
1024 PaintRefresher.Refresh(null, viewport.alignment);
\r
1030 * @param e DOCUMENT ME!
\r
1032 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1034 SequenceGroup sg = viewport.getSelectionGroup();
\r
1038 selectAllSequenceMenuItem_actionPerformed(null);
\r
1043 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1046 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
1049 PaintRefresher.Refresh(null, viewport.alignment);
\r
1055 * @param e DOCUMENT ME!
\r
1057 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
1059 ColumnSelection colSel = viewport.getColumnSelection();
\r
1061 if (colSel.size() > 0)
\r
1063 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
1064 HistoryItem.HIDE));
\r
1066 int min = colSel.getMin();
\r
1067 viewport.getAlignment().trimLeft(min);
\r
1068 colSel.compensateForEdit(0, min);
\r
1070 if (viewport.getSelectionGroup() != null)
\r
1072 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
1075 Vector groups = viewport.alignment.getGroups();
\r
1077 for (int i = 0; i < groups.size(); i++)
\r
1079 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1081 if (!sg.adjustForRemoveLeft(min))
\r
1083 viewport.alignment.deleteGroup(sg);
\r
1087 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1094 * @param e DOCUMENT ME!
\r
1096 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1098 ColumnSelection colSel = viewport.getColumnSelection();
\r
1100 if (colSel.size() > 0)
\r
1102 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1103 HistoryItem.HIDE));
\r
1105 int max = colSel.getMax();
\r
1106 viewport.getAlignment().trimRight(max);
\r
1108 if (viewport.getSelectionGroup() != null)
\r
1110 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1113 Vector groups = viewport.alignment.getGroups();
\r
1115 for (int i = 0; i < groups.size(); i++)
\r
1117 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1119 if (!sg.adjustForRemoveRight(max))
\r
1121 viewport.alignment.deleteGroup(sg);
\r
1125 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1132 * @param e DOCUMENT ME!
\r
1134 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1136 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1137 viewport.alignment, HistoryItem.HIDE));
\r
1139 //This is to maintain viewport position on first residue
\r
1140 //of first sequence
\r
1141 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1142 int startRes = seq.findPosition(viewport.startRes);
\r
1144 viewport.getAlignment().removeGaps();
\r
1146 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1148 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1154 * @param e DOCUMENT ME!
\r
1156 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1158 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1159 HistoryItem.HIDE));
\r
1161 //This is to maintain viewport position on first residue
\r
1162 //of first sequence
\r
1163 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1164 int startRes = seq.findPosition(viewport.startRes);
\r
1167 SequenceI current;
\r
1170 Vector seqs = null;
\r
1173 int end = viewport.alignment.getWidth();
\r
1175 if (viewport.getSelectionGroup() != null
\r
1176 && viewport.getSelectionGroup().getSequences(true) != null
\r
1177 && viewport.getSelectionGroup().getSize(true) > 0)
\r
1179 seqs = viewport.getSelectionGroup().getSequences(true);
\r
1180 start = viewport.getSelectionGroup().getStartRes();
\r
1181 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1185 seqs = viewport.alignment.getSequences();
\r
1188 for (int i = 0; i < seqs.size(); i++)
\r
1190 current = (SequenceI) seqs.elementAt(i);
\r
1191 jSize = current.getLength();
\r
1193 // Removing a range is much quicker than removing gaps
\r
1194 // one by one for long sequences
\r
1196 int rangeStart=-1, rangeEnd=-1;
\r
1200 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1202 if(rangeStart==-1)
\r
1217 current.deleteChars(rangeStart, rangeEnd);
\r
1218 j-=rangeEnd-rangeStart;
\r
1219 jSize-=rangeEnd-rangeStart;
\r
1227 while (j < end && j < jSize);
\r
1230 current.deleteChars(rangeStart, rangeEnd);
\r
1234 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1236 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1239 public void alignmentChanged()
\r
1241 if(viewport.padGaps)
\r
1242 viewport.getAlignment().padGaps();
\r
1244 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1246 viewport.updateConsensus();
\r
1247 viewport.updateConservation();
\r
1249 resetAllColourSchemes();
\r
1250 if(alignPanel.overviewPanel!=null)
\r
1251 alignPanel.overviewPanel.updateOverviewImage();
\r
1253 viewport.alignment.adjustSequenceAnnotations();
\r
1255 alignPanel.repaint();
\r
1258 void resetAllColourSchemes()
\r
1260 ColourSchemeI cs = viewport.globalColourScheme;
\r
1263 if (cs instanceof ClustalxColourScheme)
\r
1265 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1266 resetClustalX(viewport.alignment.getSequences(),
\r
1267 viewport.alignment.getWidth());
\r
1270 cs.setConsensus(viewport.vconsensus);
\r
1271 if (cs.conservationApplied())
\r
1273 Alignment al = (Alignment) viewport.alignment;
\r
1274 Conservation c = new Conservation("All",
\r
1275 ResidueProperties.propHash, 3,
\r
1276 al.getSequences(), 0,
\r
1277 al.getWidth() - 1);
\r
1279 c.verdict(false, viewport.ConsPercGaps);
\r
1281 cs.setConservation(c);
\r
1285 int s, sSize = viewport.alignment.getGroups().size();
\r
1286 for(s=0; s<sSize; s++)
\r
1288 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1289 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1291 ((ClustalxColourScheme)sg.cs).resetClustalX(
\r
1292 sg.getSequences(true), sg.getWidth());
\r
1294 sg.recalcConservation();
\r
1301 * @param e DOCUMENT ME!
\r
1303 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1305 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1306 HistoryItem.HIDE));
\r
1308 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1310 // if (viewport.padGaps)
\r
1311 alignmentChanged();
\r
1317 * @param e DOCUMENT ME!
\r
1319 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1321 JInternalFrame frame = new JInternalFrame();
\r
1322 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1323 frame.setContentPane(finder);
\r
1324 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1325 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1331 * @param e DOCUMENT ME!
\r
1333 public void font_actionPerformed(ActionEvent e)
\r
1335 new FontChooser(alignPanel);
\r
1338 public void smoothFont_actionPerformed(ActionEvent e)
\r
1340 viewport.antiAlias = smoothFont.isSelected();
\r
1341 alignPanel.annotationPanel.image = null;
\r
1342 alignPanel.repaint();
\r
1349 * @param e DOCUMENT ME!
\r
1351 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1353 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1355 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1356 alignPanel.repaint();
\r
1363 * @param e DOCUMENT ME!
\r
1365 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1367 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1368 alignPanel.repaint();
\r
1374 * @param e DOCUMENT ME!
\r
1376 public void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1378 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1379 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1380 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1381 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1382 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1388 * @param e DOCUMENT ME!
\r
1390 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1392 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1393 alignPanel.repaint();
\r
1399 * @param e DOCUMENT ME!
\r
1401 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1403 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1404 alignPanel.repaint();
\r
1410 * @param e DOCUMENT ME!
\r
1412 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1414 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1415 alignPanel.repaint();
\r
1421 * @param e DOCUMENT ME!
\r
1423 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1425 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1426 alignPanel.repaint();
\r
1432 * @param e DOCUMENT ME!
\r
1434 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1436 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1437 alignPanel.repaint();
\r
1443 * @param e DOCUMENT ME!
\r
1445 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1447 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1448 alignPanel.repaint();
\r
1452 FeatureSettings featureSettings;
\r
1453 public void featureSettings_actionPerformed(ActionEvent e)
\r
1455 if(featureSettings !=null )
\r
1457 featureSettings.close();
\r
1458 featureSettings = null;
\r
1460 featureSettings = new FeatureSettings(this);
\r
1466 * @param evt DOCUMENT ME!
\r
1468 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1470 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1471 alignPanel.repaint();
\r
1472 if (alignPanel.getOverviewPanel() != null)
\r
1474 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1481 * @param e DOCUMENT ME!
\r
1483 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1485 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1486 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1492 * @param e DOCUMENT ME!
\r
1494 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1496 if (alignPanel.overviewPanel != null)
\r
1501 JInternalFrame frame = new JInternalFrame();
\r
1502 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1503 frame.setContentPane(overview);
\r
1504 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1505 frame.getWidth(), frame.getHeight());
\r
1507 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1508 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1510 public void internalFrameClosed(
\r
1511 javax.swing.event.InternalFrameEvent evt)
\r
1513 alignPanel.setOverviewPanel(null);
\r
1518 alignPanel.setOverviewPanel(overview);
\r
1524 * @param e DOCUMENT ME!
\r
1526 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1528 changeColour(null);
\r
1534 * @param e DOCUMENT ME!
\r
1536 public void clustalColour_actionPerformed(ActionEvent e)
\r
1538 changeColour(new ClustalxColourScheme(
\r
1539 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1545 * @param e DOCUMENT ME!
\r
1547 public void zappoColour_actionPerformed(ActionEvent e)
\r
1549 changeColour(new ZappoColourScheme());
\r
1555 * @param e DOCUMENT ME!
\r
1557 public void taylorColour_actionPerformed(ActionEvent e)
\r
1559 changeColour(new TaylorColourScheme());
\r
1565 * @param e DOCUMENT ME!
\r
1567 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1569 changeColour(new HydrophobicColourScheme());
\r
1575 * @param e DOCUMENT ME!
\r
1577 public void helixColour_actionPerformed(ActionEvent e)
\r
1579 changeColour(new HelixColourScheme());
\r
1585 * @param e DOCUMENT ME!
\r
1587 public void strandColour_actionPerformed(ActionEvent e)
\r
1589 changeColour(new StrandColourScheme());
\r
1595 * @param e DOCUMENT ME!
\r
1597 public void turnColour_actionPerformed(ActionEvent e)
\r
1599 changeColour(new TurnColourScheme());
\r
1605 * @param e DOCUMENT ME!
\r
1607 public void buriedColour_actionPerformed(ActionEvent e)
\r
1609 changeColour(new BuriedColourScheme());
\r
1615 * @param e DOCUMENT ME!
\r
1617 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1619 changeColour(new NucleotideColourScheme());
\r
1622 public void annotationColour_actionPerformed(ActionEvent e)
\r
1624 new AnnotationColourChooser(viewport, alignPanel);
\r
1631 * @param e DOCUMENT ME!
\r
1633 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1635 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1641 * @param cs DOCUMENT ME!
\r
1643 public void changeColour(ColourSchemeI cs)
\r
1645 int threshold = 0;
\r
1649 if (viewport.getAbovePIDThreshold())
\r
1651 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1654 cs.setThreshold(threshold,
\r
1655 viewport.getIgnoreGapsConsensus());
\r
1657 viewport.setGlobalColourScheme(cs);
\r
1661 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1664 if (viewport.getConservationSelected())
\r
1667 Alignment al = (Alignment) viewport.alignment;
\r
1668 Conservation c = new Conservation("All",
\r
1669 ResidueProperties.propHash, 3,
\r
1670 al.getSequences(), 0,
\r
1671 al.getWidth() - 1);
\r
1674 c.verdict(false, viewport.ConsPercGaps);
\r
1676 cs.setConservation(c);
\r
1678 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1683 cs.setConservation(null);
\r
1686 cs.setConsensus(viewport.vconsensus);
\r
1689 viewport.setGlobalColourScheme(cs);
\r
1691 if (viewport.getColourAppliesToAllGroups())
\r
1693 Vector groups = viewport.alignment.getGroups();
\r
1695 for (int i = 0; i < groups.size(); i++)
\r
1697 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1705 if (cs instanceof ClustalxColourScheme)
\r
1707 sg.cs = new ClustalxColourScheme(
\r
1708 sg.getSequences(true), sg.getWidth());
\r
1710 else if (cs instanceof UserColourScheme)
\r
1712 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1718 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1720 catch (Exception ex)
\r
1725 if (viewport.getAbovePIDThreshold()
\r
1726 || cs instanceof PIDColourScheme
\r
1727 || cs instanceof Blosum62ColourScheme)
\r
1729 sg.cs.setThreshold(threshold,
\r
1730 viewport.getIgnoreGapsConsensus());
\r
1732 sg.cs.setConsensus(AAFrequency.calculate(
\r
1733 sg.getSequences(true), 0,
\r
1737 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1740 if (viewport.getConservationSelected())
\r
1742 Conservation c = new Conservation("Group",
\r
1743 ResidueProperties.propHash, 3,
\r
1744 sg.getSequences(true), 0,
\r
1745 viewport.alignment.getWidth() - 1);
\r
1747 c.verdict(false, viewport.ConsPercGaps);
\r
1748 sg.cs.setConservation(c);
\r
1751 sg.cs.setConservation(null);
\r
1755 if (alignPanel.getOverviewPanel() != null)
\r
1757 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1760 alignPanel.repaint();
\r
1766 * @param e DOCUMENT ME!
\r
1768 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1770 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1772 SliderPanel.setPIDSliderSource(alignPanel,
\r
1773 viewport.getGlobalColourScheme(),
\r
1775 SliderPanel.showPIDSlider();
\r
1782 * @param e DOCUMENT ME!
\r
1784 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1786 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1788 SliderPanel.setConservationSlider(alignPanel,
\r
1789 viewport.globalColourScheme,
\r
1791 SliderPanel.showConservationSlider();
\r
1798 * @param e DOCUMENT ME!
\r
1800 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1802 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1804 viewport.setAbovePIDThreshold(false);
\r
1805 abovePIDThreshold.setSelected(false);
\r
1807 changeColour(viewport.getGlobalColourScheme());
\r
1809 modifyConservation_actionPerformed(null);
\r
1815 * @param e DOCUMENT ME!
\r
1817 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1819 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1821 conservationMenuItem.setSelected(false);
\r
1822 viewport.setConservationSelected(false);
\r
1824 changeColour(viewport.getGlobalColourScheme());
\r
1826 modifyPID_actionPerformed(null);
\r
1832 * @param e DOCUMENT ME!
\r
1834 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1836 if (e.getActionCommand().equals("User Defined..."))
\r
1838 new UserDefinedColours(alignPanel, null);
\r
1842 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1843 getUserColourSchemes().get(e.getActionCommand());
\r
1845 changeColour(udc);
\r
1849 public void updateUserColourMenu()
\r
1852 Component[] menuItems = colourMenu.getMenuComponents();
\r
1853 int i, iSize = menuItems.length;
\r
1854 for (i = 0; i < iSize; i++)
\r
1856 if (menuItems[i].getName() != null &&
\r
1857 menuItems[i].getName().equals("USER_DEFINED"))
\r
1859 colourMenu.remove(menuItems[i]);
\r
1863 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1865 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1866 getUserColourSchemes().keys();
\r
1868 while (userColours.hasMoreElements())
\r
1870 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1871 nextElement().toString());
\r
1872 radioItem.setName("USER_DEFINED");
\r
1873 radioItem.addMouseListener(new MouseAdapter()
\r
1875 public void mousePressed(MouseEvent evt)
\r
1877 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1879 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1881 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1882 "Remove from default list?",
\r
1883 "Remove user defined colour",
\r
1884 JOptionPane.YES_NO_OPTION);
\r
1885 if(option == JOptionPane.YES_OPTION)
\r
1887 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1888 colourMenu.remove(radioItem);
\r
1891 radioItem.addActionListener(new ActionListener()
\r
1893 public void actionPerformed(ActionEvent evt)
\r
1895 userDefinedColour_actionPerformed(evt);
\r
1901 radioItem.addActionListener(new ActionListener()
\r
1903 public void actionPerformed(ActionEvent evt)
\r
1905 userDefinedColour_actionPerformed(evt);
\r
1909 colourMenu.insert(radioItem, 15);
\r
1910 colours.add(radioItem);
\r
1918 * @param e DOCUMENT ME!
\r
1920 public void PIDColour_actionPerformed(ActionEvent e)
\r
1922 changeColour(new PIDColourScheme());
\r
1928 * @param e DOCUMENT ME!
\r
1930 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1932 changeColour(new Blosum62ColourScheme());
\r
1938 * @param e DOCUMENT ME!
\r
1940 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1942 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1943 HistoryItem.SORT));
\r
1944 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1945 viewport.getAlignment().getSequenceAt(0));
\r
1946 alignPanel.repaint();
\r
1952 * @param e DOCUMENT ME!
\r
1954 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1956 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1957 HistoryItem.SORT));
\r
1958 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1959 alignPanel.repaint();
\r
1965 * @param e DOCUMENT ME!
\r
1967 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1969 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1970 HistoryItem.SORT));
\r
1972 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1973 alignPanel.repaint();
\r
1979 * @param e DOCUMENT ME!
\r
1981 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1983 new RedundancyPanel(alignPanel, this);
\r
1990 * @param e DOCUMENT ME!
\r
1992 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1994 if ( (viewport.getSelectionGroup() == null) ||
\r
1995 (viewport.getSelectionGroup().getSize(false) < 2))
\r
1997 JOptionPane.showInternalMessageDialog(this,
\r
1998 "You must select at least 2 sequences.",
\r
1999 "Invalid Selection",
\r
2000 JOptionPane.WARNING_MESSAGE);
\r
2004 JInternalFrame frame = new JInternalFrame();
\r
2005 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
2006 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
2013 * @param e DOCUMENT ME!
\r
2015 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
2017 if ( ( (viewport.getSelectionGroup() != null) &&
\r
2018 (viewport.getSelectionGroup().getSize(false) < 4) &&
\r
2019 (viewport.getSelectionGroup().getSize(false) > 0)) ||
\r
2020 (viewport.getAlignment().getHeight() < 4))
\r
2022 JOptionPane.showInternalMessageDialog(this,
\r
2023 "Principal component analysis must take\n" +
\r
2024 "at least 4 input sequences.",
\r
2025 "Sequence selection insufficient",
\r
2026 JOptionPane.WARNING_MESSAGE);
\r
2031 new PCAPanel(viewport);
\r
2035 public void autoCalculate_actionPerformed(ActionEvent e)
\r
2037 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
2038 if(viewport.autoCalculateConsensus)
\r
2040 alignmentChanged();
\r
2048 * @param e DOCUMENT ME!
\r
2050 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
2052 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2058 * @param e DOCUMENT ME!
\r
2060 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2062 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2068 * @param e DOCUMENT ME!
\r
2070 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2072 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2078 * @param e DOCUMENT ME!
\r
2080 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2082 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2088 * @param type DOCUMENT ME!
\r
2089 * @param pwType DOCUMENT ME!
\r
2090 * @param title DOCUMENT ME!
\r
2092 void NewTreePanel(String type, String pwType, String title)
\r
2096 if ( (viewport.getSelectionGroup() != null) &&
\r
2097 (viewport.getSelectionGroup().getSize(false) > 3))
\r
2100 SequenceGroup sg = viewport.getSelectionGroup();
\r
2102 /* Decide if the selection is a column region */
\r
2103 while (s < sg.getSize(false))
\r
2105 if ( ( (SequenceI) sg.getSequences(false).elementAt(s++)).getLength() <
\r
2108 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2109 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2110 "Try using the Pad function in the edit menu,\n" +
\r
2111 "or one of the multiple sequence alignment web services.",
\r
2112 "Sequences in selection are not aligned",
\r
2113 JOptionPane.WARNING_MESSAGE);
\r
2119 title = title + " on region";
\r
2120 tp = new TreePanel(viewport, type, pwType);
\r
2124 //are the sequences aligned?
\r
2125 if (!viewport.alignment.isAligned())
\r
2127 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2128 "The sequences must be aligned before creating a tree.\n" +
\r
2129 "Try using the Pad function in the edit menu,\n" +
\r
2130 "or one of the multiple sequence alignment web services.",
\r
2131 "Sequences not aligned",
\r
2132 JOptionPane.WARNING_MESSAGE);
\r
2137 tp = new TreePanel(viewport, type, pwType);
\r
2140 addTreeMenuItem(tp, title);
\r
2142 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2148 * @param title DOCUMENT ME!
\r
2149 * @param order DOCUMENT ME!
\r
2151 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2153 final JMenuItem item = new JMenuItem("by " + title);
\r
2155 item.addActionListener(new java.awt.event.ActionListener()
\r
2157 public void actionPerformed(ActionEvent e)
\r
2159 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2160 HistoryItem.SORT));
\r
2162 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2163 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2164 alignPanel.repaint();
\r
2170 * Maintain the Order by->Displayed Tree menu.
\r
2171 * Creates a new menu item for a TreePanel with an appropriate
\r
2172 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2173 * to remove the menu item when the treePanel is closed, and adjust
\r
2174 * the tree leaf to sequence mapping when the alignment is modified.
\r
2175 * @param treePanel Displayed tree window.
\r
2176 * @param title SortBy menu item title.
\r
2178 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2180 final JMenuItem item = new JMenuItem(title);
\r
2184 if (treeCount == 1)
\r
2186 sort.add(sortByTreeMenu);
\r
2189 sortByTreeMenu.add(item);
\r
2190 item.addActionListener(new java.awt.event.ActionListener()
\r
2192 public void actionPerformed(ActionEvent e)
\r
2194 addHistoryItem(new HistoryItem("Tree Sort",
\r
2195 viewport.alignment, HistoryItem.SORT));
\r
2196 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2197 treePanel.getTree());
\r
2198 alignPanel.repaint();
\r
2202 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2203 InternalFrameAdapter()
\r
2205 public void internalFrameClosed(
\r
2206 javax.swing.event.InternalFrameEvent evt)
\r
2209 sortByTreeMenu.remove(item);
\r
2211 if (treeCount == 0)
\r
2213 sort.remove(sortByTreeMenu);
\r
2221 * Work out whether the whole set of sequences
\r
2222 * or just the selected set will be submitted for multiple alignment.
\r
2225 private SequenceI[] gatherSequencesForAlignment()
\r
2227 // Now, check we have enough sequences
\r
2228 SequenceI[] msa = null;
\r
2230 if ( (viewport.getSelectionGroup() != null) &&
\r
2231 (viewport.getSelectionGroup().getSize(false) > 1))
\r
2233 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2234 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2236 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2238 for (int i = 0; i < sz; i++)
\r
2240 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2245 Vector seqs = viewport.getAlignment().getSequences();
\r
2247 if (seqs.size() > 1)
\r
2249 msa = new SequenceI[seqs.size()];
\r
2251 for (int i = 0; i < seqs.size(); i++)
\r
2253 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2261 * Decides what is submitted to a secondary structure prediction service,
\r
2262 * the currently selected sequence, or the currently selected alignment
\r
2263 * (where the first sequence in the set is the one that the prediction
\r
2266 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2268 SequenceI seq = null;
\r
2269 SequenceI[] msa = null;
\r
2271 if ( (viewport.getSelectionGroup() != null) &&
\r
2272 (viewport.getSelectionGroup().getSize(false) > 0))
\r
2274 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2275 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2277 if ( (seqs.getSize(false) == 1) || !viewport.alignment.isAligned())
\r
2279 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2284 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2286 for (int i = 0; i < sz; i++)
\r
2288 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2294 Vector seqs = viewport.getAlignment().getSequences();
\r
2296 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2298 seq = (SequenceI) seqs.elementAt(0);
\r
2302 msa = new SequenceI[seqs.size()];
\r
2304 for (int i = 0; i < seqs.size(); i++)
\r
2306 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2318 return new SequenceI[]
\r
2328 * @param e DOCUMENT ME!
\r
2330 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2332 // Pick the tree file
\r
2333 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2335 "LAST_DIRECTORY"));
\r
2336 chooser.setFileView(new JalviewFileView());
\r
2337 chooser.setDialogTitle("Select a newick-like tree file");
\r
2338 chooser.setToolTipText("Load a tree file");
\r
2340 int value = chooser.showOpenDialog(null);
\r
2342 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2344 String choice = chooser.getSelectedFile().getPath();
\r
2345 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2349 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2351 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2353 catch (Exception ex)
\r
2355 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2356 "Problem reading tree file",
\r
2358 JOptionPane.WARNING_MESSAGE);
\r
2359 ex.printStackTrace();
\r
2365 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2367 return ShowNewickTree(nf,title,600,500,4,5);
\r
2372 * @param nf DOCUMENT ME!
\r
2373 * @param title DOCUMENT ME!
\r
2375 * @return DOCUMENT ME!
\r
2377 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2379 TreePanel tp = null;
\r
2385 if (nf.getTree() != null)
\r
2387 tp = new TreePanel(viewport,
\r
2395 tp.setLocation(x,y);
\r
2398 Desktop.addInternalFrame(tp, title, w, h);
\r
2399 addTreeMenuItem(tp, title);
\r
2402 catch (Exception ex)
\r
2404 ex.printStackTrace();
\r
2415 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2416 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2417 printJob.setPrintable(alignPanel, pf);
\r
2419 if (printJob.printDialog())
\r
2425 catch (Exception PrintException)
\r
2427 PrintException.printStackTrace();
\r
2434 * Generates menu items and listener event actions for web service clients
\r
2437 public void BuildWebServiceMenu()
\r
2439 if ( (Discoverer.services != null)
\r
2440 && (Discoverer.services.size() > 0))
\r
2442 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2443 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2444 Vector wsmenu = new Vector();
\r
2445 if (msaws != null)
\r
2447 // Add any Multiple Sequence Alignment Services
\r
2448 final JMenu msawsmenu = new JMenu("Alignment");
\r
2449 final AlignFrame af = this;
\r
2450 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2452 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2454 final JMenuItem method = new JMenuItem(sh.getName());
\r
2455 method.addActionListener(new ActionListener()
\r
2457 public void actionPerformed(ActionEvent e)
\r
2459 SequenceI[] msa = gatherSequencesForAlignment();
\r
2460 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2461 false, true, viewport.getAlignment().getDataset(), af);
\r
2466 msawsmenu.add(method);
\r
2467 // Deal with services that we know accept partial alignments.
\r
2468 if (sh.getName().indexOf("lustal") > -1)
\r
2470 // We know that ClustalWS can accept partial alignments for refinement.
\r
2471 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2472 methodR.addActionListener(new ActionListener()
\r
2474 public void actionPerformed(ActionEvent e)
\r
2476 SequenceI[] msa = gatherSequencesForAlignment();
\r
2477 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2478 true, true, viewport.getAlignment().getDataset(), af);
\r
2483 msawsmenu.add(methodR);
\r
2487 wsmenu.add(msawsmenu);
\r
2489 if (secstrpr != null)
\r
2491 // Add any secondary structure prediction services
\r
2492 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2493 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2495 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2497 final JMenuItem method = new JMenuItem(sh.getName());
\r
2498 method.addActionListener(new ActionListener()
\r
2500 public void actionPerformed(ActionEvent e)
\r
2502 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2503 if (msa.length == 1)
\r
2505 // Single Sequence prediction
\r
2506 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2510 if (msa.length > 1)
\r
2512 // Single Sequence prediction
\r
2513 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2519 secstrmenu.add(method);
\r
2521 wsmenu.add(secstrmenu);
\r
2523 this.webService.removeAll();
\r
2524 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2526 webService.add( (JMenu) wsmenu.get(i));
\r
2531 this.webService.removeAll();
\r
2532 this.webService.add(this.webServiceNoServices);
\r
2534 // TODO: add in rediscovery function
\r
2535 // TODO: reduce code redundancy.
\r
2536 // TODO: group services by location as well as function.
\r
2539 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2541 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2542 getProperty("LAST_DIRECTORY"));
\r
2544 chooser.setFileView(new JalviewFileView());
\r
2545 chooser.setDialogTitle("Export to Vamsas file");
\r
2546 chooser.setToolTipText("Export");
\r
2548 int value = chooser.showSaveDialog(this);
\r
2550 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2552 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2553 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2554 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2562 public void showTranslation_actionPerformed(ActionEvent e)
\r
2564 int s, sSize = viewport.alignment.getHeight();
\r
2565 SequenceI [] newSeq = new SequenceI[sSize];
\r
2568 StringBuffer protein;
\r
2570 for(s=0; s<sSize; s++)
\r
2572 protein = new StringBuffer();
\r
2573 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2574 resSize = seq.length();
\r
2575 resSize -= resSize%3;
\r
2577 for(res = 0; res < resSize; res+=3)
\r
2579 String codon = seq.substring(res, res+3);
\r
2580 codon = codon.replace('U', 'T');
\r
2581 String aa = ResidueProperties.codonTranslate(codon);
\r
2583 protein.append(viewport.getGapCharacter());
\r
2584 else if(aa.equals("STOP"))
\r
2585 protein.append("X");
\r
2587 protein.append( aa );
\r
2589 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2593 AlignmentI al = new Alignment(newSeq);
\r
2594 al.setDataset(null);
\r
2597 ////////////////////////////////
\r
2598 // Copy annotations across
\r
2599 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2600 = viewport.alignment.getAlignmentAnnotation();
\r
2602 if(annotations!=null)
\r
2604 for (int i = 0; i < annotations.length; i++)
\r
2606 if (annotations[i].label.equals("Quality") ||
\r
2607 annotations[i].label.equals("Conservation") ||
\r
2608 annotations[i].label.equals("Consensus"))
\r
2613 aSize = viewport.alignment.getWidth() / 3;
\r
2614 jalview.datamodel.Annotation[] anots =
\r
2615 new jalview.datamodel.Annotation[aSize];
\r
2617 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2619 if (annotations[i].annotations[a] == null
\r
2620 || annotations[i].annotations[a] == null)
\r
2623 anots[a / 3] = new Annotation(
\r
2624 annotations[i].annotations[a].displayCharacter,
\r
2625 annotations[i].annotations[a].description,
\r
2626 annotations[i].annotations[a].secondaryStructure,
\r
2627 annotations[i].annotations[a].value,
\r
2628 annotations[i].annotations[a].colour);
\r
2631 jalview.datamodel.AlignmentAnnotation aa
\r
2632 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2633 annotations[i].description, anots);
\r
2634 al.addAnnotation(aa);
\r
2638 AlignFrame af = new AlignFrame(al);
\r
2639 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2641 NEW_WINDOW_HEIGHT);
\r
2644 // AlignViewport newViewport = new AlignViewport(al);
\r
2645 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2646 // tabbedPane.add("Protein", ap);
\r
2647 // viewports.add(newViewport);
\r
2648 // alignPanels.add(ap);
\r
2651 /////////////////////////
\r
2653 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2654 // ds.setDataset(true);
\r
2655 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2656 // tabbedPane.add("Dataset", dap);
\r
2657 // viewports.add(ds);
\r
2658 // alignPanels.add(dap);
\r
2659 /////////////////////////
\r
2664 /*public void tabSelected()
\r
2666 int index = tabbedPane.getSelectedIndex();
\r
2667 viewport = (AlignViewport)viewports.elementAt(index);
\r
2668 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2674 * @param String DOCUMENT ME!
\r
2676 public boolean parseFeaturesFile(String file, String type)
\r
2678 boolean featuresFile = false;
\r
2680 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment.getDataset(),
\r
2681 alignPanel.seqPanel.seqCanvas.
\r
2682 getFeatureRenderer().featureColours,
\r
2685 catch(Exception ex)
\r
2687 ex.printStackTrace();
\r
2692 viewport.showSequenceFeatures = true;
\r
2693 showSeqFeatures.setSelected(true);
\r
2694 alignPanel.repaint();
\r
2697 return featuresFile;
\r
2700 public void dragEnter(DropTargetDragEvent evt)
\r
2703 public void dragExit(DropTargetEvent evt)
\r
2706 public void dragOver(DropTargetDragEvent evt)
\r
2709 public void dropActionChanged(DropTargetDragEvent evt)
\r
2712 public void drop(DropTargetDropEvent evt)
\r
2714 Transferable t = evt.getTransferable();
\r
2715 java.util.List files = null;
\r
2719 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2720 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2722 //Works on Windows and MacOSX
\r
2723 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2724 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2726 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2728 // This is used by Unix drag system
\r
2729 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2730 String data = (String) t.getTransferData(uriListFlavor);
\r
2731 files = new java.util.ArrayList(1);
\r
2732 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2735 st.hasMoreTokens(); )
\r
2737 String s = st.nextToken();
\r
2738 if (s.startsWith("#"))
\r
2740 // the line is a comment (as per the RFC 2483)
\r
2744 java.net.URI uri = new java.net.URI(s);
\r
2745 java.io.File file = new java.io.File(uri);
\r
2750 catch (Exception e)
\r
2752 e.printStackTrace();
\r
2754 if (files != null)
\r
2759 for (int i = 0; i < files.size(); i++)
\r
2761 loadJalviewDataFile(files.get(i).toString());
\r
2764 catch (Exception ex)
\r
2766 ex.printStackTrace();
\r
2771 // This method will attempt to load a "dropped" file first by testing
\r
2772 // whether its and Annotation file, then features file. If both are
\r
2773 // false then the user may have dropped an alignment file onto this
\r
2775 public void loadJalviewDataFile(String file)
\r
2778 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
\r
2781 if (!isAnnotation)
\r
2783 boolean isGroupsFile = parseFeaturesFile(file,
\r
2784 AppletFormatAdapter.FILE);
\r
2785 if (!isGroupsFile)
\r
2787 String protocol = "File";
\r
2788 String format = new IdentifyFile().Identify(file, protocol);
\r
2789 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2792 FastaFile ff = new FastaFile();
\r
2793 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2794 c.setContents(new StringSelection(ff.print(sequences)), Desktop.instance);
\r
2796 this.paste(false);
\r
2802 alignPanel.adjustAnnotationHeight();
\r
2805 }catch(Exception ex)
\r
2807 ex.printStackTrace();
\r