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
366 if (output == null)
\r
373 java.io.PrintWriter out = new java.io.PrintWriter(
\r
374 new java.io.FileWriter(file));
\r
378 this.setTitle(file);
\r
381 catch (Exception ex)
\r
383 ex.printStackTrace();
\r
392 * @param e DOCUMENT ME!
\r
394 protected void outputText_actionPerformed(ActionEvent e)
\r
396 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
399 String [] omitHidden = null;
\r
401 if(viewport.hasHiddenColumns)
\r
403 System.out.println("PROMPT USER HERE");
\r
404 omitHidden = viewport.getSelectionAsString();
\r
407 cap.setText(new FormatAdapter().formatSequences(
\r
408 e.getActionCommand(),
\r
409 viewport.getSelectionAsNewSequence(),
\r
416 * @param e DOCUMENT ME!
\r
418 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
420 new HTMLOutput(viewport,
\r
421 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
422 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
425 public void createImageMap(File file, String image)
\r
427 alignPanel.makePNGImageMap(file, image);
\r
433 * @param e DOCUMENT ME!
\r
435 public void createPNG(File f)
\r
437 alignPanel.makePNG(f);
\r
443 * @param e DOCUMENT ME!
\r
445 public void createEPS(File f)
\r
447 alignPanel.makeEPS(f);
\r
453 * @param e DOCUMENT ME!
\r
455 public void printMenuItem_actionPerformed(ActionEvent e)
\r
457 //Putting in a thread avoids Swing painting problems
\r
458 PrintThread thread = new PrintThread();
\r
462 public void exportFeatures_actionPerformed(ActionEvent e)
\r
464 new AnnotationExporter().exportFeatures(alignPanel);
\r
467 public void exportAnnotations_actionPerformed(ActionEvent e)
\r
469 new AnnotationExporter().exportAnnotations(
\r
471 viewport.alignment.getAlignmentAnnotation()
\r
476 public void associatedData_actionPerformed(ActionEvent e)
\r
478 // Pick the tree file
\r
479 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
481 "LAST_DIRECTORY"));
\r
482 chooser.setFileView(new JalviewFileView());
\r
483 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
484 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
486 int value = chooser.showOpenDialog(null);
\r
488 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
490 String choice = chooser.getSelectedFile().getPath();
\r
491 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
492 loadJalviewDataFile(choice);
\r
500 * @param e DOCUMENT ME!
\r
502 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
506 PaintRefresher.components.remove(viewport.alignment);
\r
507 this.setClosed(true);
\r
509 catch (Exception ex)
\r
517 void updateEditMenuBar()
\r
519 if (historyList.size() > 0)
\r
521 undoMenuItem.setEnabled(true);
\r
523 HistoryItem hi = (HistoryItem) historyList.peek();
\r
524 undoMenuItem.setText("Undo " + hi.getDescription());
\r
528 undoMenuItem.setEnabled(false);
\r
529 undoMenuItem.setText("Undo");
\r
532 if (redoList.size() > 0)
\r
534 redoMenuItem.setEnabled(true);
\r
536 HistoryItem hi = (HistoryItem) redoList.peek();
\r
537 redoMenuItem.setText("Redo " + hi.getDescription());
\r
541 redoMenuItem.setEnabled(false);
\r
542 redoMenuItem.setText("Redo");
\r
549 * @param hi DOCUMENT ME!
\r
551 public void addHistoryItem(HistoryItem hi)
\r
553 historyList.push(hi);
\r
554 updateEditMenuBar();
\r
560 * @param e DOCUMENT ME!
\r
562 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
564 HistoryItem hi = (HistoryItem) historyList.pop();
\r
565 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
566 HistoryItem.HIDE));
\r
567 restoreHistoryItem(hi);
\r
568 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
574 * @param e DOCUMENT ME!
\r
576 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
578 HistoryItem hi = (HistoryItem) redoList.pop();
\r
579 restoreHistoryItem(hi);
\r
580 updateEditMenuBar();
\r
581 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
584 // used by undo and redo
\r
585 void restoreHistoryItem(HistoryItem hi)
\r
590 updateEditMenuBar();
\r
592 viewport.firePropertyChange("alignment", null,
\r
593 viewport.getAlignment().getSequences());
\r
599 * @param up DOCUMENT ME!
\r
601 public void moveSelectedSequences(boolean up)
\r
603 SequenceGroup sg = viewport.getSelectionGroup();
\r
612 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
614 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
616 if (!sg.getSequences(false).contains(seq))
\r
621 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
623 if (sg.getSequences(false).contains(temp))
\r
628 viewport.alignment.getSequences().setElementAt(temp, i);
\r
629 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
634 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
636 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
638 if (!sg.getSequences(false).contains(seq))
\r
643 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
645 if (sg.getSequences(false).contains(temp))
\r
650 viewport.alignment.getSequences().setElementAt(temp, i);
\r
651 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
655 alignPanel.repaint();
\r
663 * @param e DOCUMENT ME!
\r
665 protected void copy_actionPerformed(ActionEvent e)
\r
667 if (viewport.getSelectionGroup() == null)
\r
672 SequenceI [] seqs = viewport.getSelectionAsNewSequence();
\r
674 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
676 FastaFile ff = new FastaFile();
\r
677 ff.addJVSuffix( viewport.showJVSuffix );
\r
679 c.setContents(new StringSelection(ff.print(seqs)), Desktop.instance);
\r
681 Vector hiddenColumns = null;
\r
682 if(viewport.hasHiddenColumns && viewport.getSelectionGroup()!=null)
\r
684 hiddenColumns =new Vector();
\r
685 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
\r
686 for(int i=0; i<viewport.getColumnSelection().getHiddenColumns().size(); i++)
\r
688 int[] region = (int[])
\r
689 viewport.getColumnSelection().getHiddenColumns().elementAt(i);
\r
691 hiddenColumns.addElement(new int[]{region[0]-hiddenOffset,
\r
692 region[1]-hiddenOffset});
\r
695 Desktop.jalviewClipboard = new Object[]{ seqs,
\r
696 viewport.alignment.getDataset(),
\r
703 * @param e DOCUMENT ME!
\r
705 protected void pasteNew_actionPerformed(ActionEvent e)
\r
713 * @param e DOCUMENT ME!
\r
715 protected void pasteThis_actionPerformed(ActionEvent e)
\r
717 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
718 HistoryItem.PASTE));
\r
725 * @param newAlignment DOCUMENT ME!
\r
727 void paste(boolean newAlignment)
\r
731 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
732 Transferable contents = c.getContents(this);
\r
734 if (contents == null)
\r
739 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
743 String format = new IdentifyFile().Identify(str, "Paste");
\r
744 SequenceI[] sequences;
\r
746 if(Desktop.jalviewClipboard!=null)
\r
748 // The clipboard was filled from within Jalview, we must use the sequences
\r
749 // And dataset from the copied alignment
\r
750 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
754 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
757 AlignmentI alignment = null;
\r
761 alignment = new Alignment(sequences);
\r
763 if(Desktop.jalviewClipboard!=null)
\r
764 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
766 alignment.setDataset( null );
\r
770 alignment = viewport.getAlignment();
\r
773 for (int i = 0; i < sequences.length; i++)
\r
776 Sequence newseq = new Sequence(sequences[i].getName(),
\r
777 sequences[i].getSequence(), sequences[i].getStart(),
\r
778 sequences[i].getEnd());
\r
780 alignment.addSequence(newseq);
\r
782 viewport.setEndSeq(alignment.getHeight());
\r
783 alignment.getWidth();
\r
784 viewport.firePropertyChange("alignment", null, alignment.getSequences());
\r
787 // Add any annotations attached to sequences
\r
788 for (int i = 0; i < sequences.length; i++)
\r
790 if (sequences[i].getAnnotation() != null)
\r
792 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
\r
794 AlignmentAnnotation newAnnot =
\r
795 new AlignmentAnnotation(
\r
796 sequences[i].getAnnotation()[a].label,
\r
797 sequences[i].getAnnotation()[a].description,
\r
798 sequences[i].getAnnotation()[a].annotations,
\r
799 sequences[i].getAnnotation()[a].graphMin,
\r
800 sequences[i].getAnnotation()[a].graphMax,
\r
801 sequences[i].getAnnotation()[a].graph);
\r
803 sequences[i].getAnnotation()[a] = newAnnot;
\r
804 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
\r
806 newAnnot.sequenceRef = sequences[i];
\r
807 newAnnot.adjustForAlignment();
\r
808 alignment.addAnnotation(newAnnot);
\r
809 alignment.setAnnotationIndex(newAnnot, a);
\r
812 alignPanel.annotationPanel.adjustPanelHeight();
\r
818 AlignFrame af = new AlignFrame(alignment);
\r
819 String newtitle = new String("Copied sequences");
\r
821 if(Desktop.jalviewClipboard[2]!=null)
\r
823 Vector hc = (Vector)Desktop.jalviewClipboard[2];
\r
824 for(int i=0; i<hc.size(); i++)
\r
826 int [] region = (int[]) hc.elementAt(i);
\r
827 for(int j=region[0]; j<region[1]+1; j++)
\r
828 af.viewport.getColumnSelection().addElement(j);
\r
829 af.viewport.getColumnSelection().hideColumns(region[0], af.viewport);
\r
834 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
835 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
836 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
839 if (title.startsWith("Copied sequences"))
\r
845 newtitle = newtitle.concat("- from " + title);
\r
848 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
849 NEW_WINDOW_HEIGHT);
\r
855 catch (Exception ex)
\r
857 ex.printStackTrace();
\r
858 System.out.println("Exception whilst pasting: "+ex);
\r
859 // could be anything being pasted in here
\r
868 * @param e DOCUMENT ME!
\r
870 protected void cut_actionPerformed(ActionEvent e)
\r
872 copy_actionPerformed(null);
\r
873 delete_actionPerformed(null);
\r
879 * @param e DOCUMENT ME!
\r
881 protected void delete_actionPerformed(ActionEvent e)
\r
884 if (viewport.getSelectionGroup() == null)
\r
890 SequenceGroup sg = viewport.getSelectionGroup();
\r
894 //Jalview no longer allows deletion of residues.
\r
895 //Check here whether any residues are in selection area
\r
896 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
898 for (int i = 0; i < sg.sequences.size(); i++)
\r
900 SequenceI seq = sg.getSequenceAt(i);
\r
901 int j = sg.getStartRes();
\r
904 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
906 JOptionPane.showInternalMessageDialog(
\r
907 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
908 + "Try hiding columns instead.",
\r
909 "Deletion of residues not permitted",
\r
910 JOptionPane.WARNING_MESSAGE);
\r
915 }while(j<=sg.getEndRes());
\r
920 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
921 HistoryItem.HIDE));
\r
924 for (int i = 0; i < sg.getSize(false); i++)
\r
926 SequenceI seq = sg.getSequenceAt(i);
\r
927 int index = viewport.getAlignment().findIndex(seq);
\r
929 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
931 // If the cut affects all sequences, remove highlighted columns
\r
932 if (sg.getSize(false) == viewport.alignment.getHeight())
\r
934 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
935 sg.getEndRes() + 1);
\r
938 if (seq.getSequence().length() < 1)
\r
940 viewport.getAlignment().deleteSequence(seq);
\r
944 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
948 viewport.setSelectionGroup(null);
\r
949 viewport.alignment.deleteGroup(sg);
\r
951 viewport.firePropertyChange("alignment", null,
\r
952 viewport.getAlignment().getSequences());
\r
956 if (viewport.getAlignment().getHeight() < 1)
\r
960 this.setClosed(true);
\r
962 catch (Exception ex)
\r
971 * @param e DOCUMENT ME!
\r
973 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
975 viewport.alignment.deleteAllGroups();
\r
976 viewport.setSelectionGroup(null);
\r
977 alignPanel.repaint();
\r
983 * @param e DOCUMENT ME!
\r
985 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
987 SequenceGroup sg = new SequenceGroup();
\r
989 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
992 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
995 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
996 viewport.setSelectionGroup(sg);
\r
997 PaintRefresher.Refresh(null, viewport.alignment);
\r
1003 * @param e DOCUMENT ME!
\r
1005 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1007 if(viewport.cursorMode)
\r
1009 alignPanel.seqPanel.keyboardNo1 = null;
\r
1010 alignPanel.seqPanel.keyboardNo2 = null;
\r
1012 viewport.setSelectionGroup(null);
\r
1013 viewport.getColumnSelection().clear();
\r
1014 viewport.setSelectionGroup(null);
\r
1015 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
1016 alignPanel.idPanel.idCanvas.searchResults = null;
\r
1017 alignPanel.repaint();
\r
1018 PaintRefresher.Refresh(null, viewport.alignment);
\r
1024 * @param e DOCUMENT ME!
\r
1026 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1028 SequenceGroup sg = viewport.getSelectionGroup();
\r
1032 selectAllSequenceMenuItem_actionPerformed(null);
\r
1037 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1040 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
1043 PaintRefresher.Refresh(null, viewport.alignment);
\r
1049 * @param e DOCUMENT ME!
\r
1051 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
1053 ColumnSelection colSel = viewport.getColumnSelection();
\r
1055 if (colSel.size() > 0)
\r
1057 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
1058 HistoryItem.HIDE));
\r
1060 int min = colSel.getMin();
\r
1061 viewport.getAlignment().trimLeft(min);
\r
1062 colSel.compensateForEdit(0, min);
\r
1064 if (viewport.getSelectionGroup() != null)
\r
1066 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
1069 Vector groups = viewport.alignment.getGroups();
\r
1071 for (int i = 0; i < groups.size(); i++)
\r
1073 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1075 if (!sg.adjustForRemoveLeft(min))
\r
1077 viewport.alignment.deleteGroup(sg);
\r
1081 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1088 * @param e DOCUMENT ME!
\r
1090 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1092 ColumnSelection colSel = viewport.getColumnSelection();
\r
1094 if (colSel.size() > 0)
\r
1096 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1097 HistoryItem.HIDE));
\r
1099 int max = colSel.getMax();
\r
1100 viewport.getAlignment().trimRight(max);
\r
1102 if (viewport.getSelectionGroup() != null)
\r
1104 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1107 Vector groups = viewport.alignment.getGroups();
\r
1109 for (int i = 0; i < groups.size(); i++)
\r
1111 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1113 if (!sg.adjustForRemoveRight(max))
\r
1115 viewport.alignment.deleteGroup(sg);
\r
1119 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1126 * @param e DOCUMENT ME!
\r
1128 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1130 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1131 viewport.alignment, HistoryItem.HIDE));
\r
1133 //This is to maintain viewport position on first residue
\r
1134 //of first sequence
\r
1135 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1136 int startRes = seq.findPosition(viewport.startRes);
\r
1138 viewport.getAlignment().removeGaps();
\r
1140 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1142 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1148 * @param e DOCUMENT ME!
\r
1150 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1152 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1153 HistoryItem.HIDE));
\r
1155 //This is to maintain viewport position on first residue
\r
1156 //of first sequence
\r
1157 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1158 int startRes = seq.findPosition(viewport.startRes);
\r
1161 SequenceI current;
\r
1164 Vector seqs = null;
\r
1167 int end = viewport.alignment.getWidth();
\r
1169 if (viewport.getSelectionGroup() != null
\r
1170 && viewport.getSelectionGroup().getSequences(true) != null
\r
1171 && viewport.getSelectionGroup().getSize(true) > 0)
\r
1173 seqs = viewport.getSelectionGroup().getSequences(true);
\r
1174 start = viewport.getSelectionGroup().getStartRes();
\r
1175 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1179 seqs = viewport.alignment.getSequences();
\r
1182 for (int i = 0; i < seqs.size(); i++)
\r
1184 current = (SequenceI) seqs.elementAt(i);
\r
1185 jSize = current.getLength();
\r
1187 // Removing a range is much quicker than removing gaps
\r
1188 // one by one for long sequences
\r
1190 int rangeStart=-1, rangeEnd=-1;
\r
1194 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1196 if(rangeStart==-1)
\r
1211 current.deleteChars(rangeStart, rangeEnd);
\r
1212 j-=rangeEnd-rangeStart;
\r
1213 jSize-=rangeEnd-rangeStart;
\r
1221 while (j < end && j < jSize);
\r
1224 current.deleteChars(rangeStart, rangeEnd);
\r
1228 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1230 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1233 public void alignmentChanged()
\r
1235 if(viewport.padGaps)
\r
1236 viewport.getAlignment().padGaps();
\r
1238 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1240 viewport.updateConsensus();
\r
1241 viewport.updateConservation();
\r
1243 resetAllColourSchemes();
\r
1244 if(alignPanel.overviewPanel!=null)
\r
1245 alignPanel.overviewPanel.updateOverviewImage();
\r
1247 viewport.alignment.adjustSequenceAnnotations();
\r
1249 alignPanel.repaint();
\r
1252 void resetAllColourSchemes()
\r
1254 ColourSchemeI cs = viewport.globalColourScheme;
\r
1257 if (cs instanceof ClustalxColourScheme)
\r
1259 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1260 resetClustalX(viewport.alignment.getSequences(),
\r
1261 viewport.alignment.getWidth());
\r
1264 cs.setConsensus(viewport.vconsensus);
\r
1265 if (cs.conservationApplied())
\r
1267 Alignment al = (Alignment) viewport.alignment;
\r
1268 Conservation c = new Conservation("All",
\r
1269 ResidueProperties.propHash, 3,
\r
1270 al.getSequences(), 0,
\r
1271 al.getWidth() - 1);
\r
1273 c.verdict(false, viewport.ConsPercGaps);
\r
1275 cs.setConservation(c);
\r
1279 int s, sSize = viewport.alignment.getGroups().size();
\r
1280 for(s=0; s<sSize; s++)
\r
1282 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1283 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1285 ((ClustalxColourScheme)sg.cs).resetClustalX(
\r
1286 sg.getSequences(true), sg.getWidth());
\r
1288 sg.recalcConservation();
\r
1295 * @param e DOCUMENT ME!
\r
1297 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1299 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1300 HistoryItem.HIDE));
\r
1302 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1304 // if (viewport.padGaps)
\r
1305 alignmentChanged();
\r
1311 * @param e DOCUMENT ME!
\r
1313 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1315 JInternalFrame frame = new JInternalFrame();
\r
1316 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1317 frame.setContentPane(finder);
\r
1318 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1319 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1325 * @param e DOCUMENT ME!
\r
1327 public void font_actionPerformed(ActionEvent e)
\r
1329 new FontChooser(alignPanel);
\r
1332 public void smoothFont_actionPerformed(ActionEvent e)
\r
1334 viewport.antiAlias = smoothFont.isSelected();
\r
1335 alignPanel.annotationPanel.image = null;
\r
1336 alignPanel.repaint();
\r
1343 * @param e DOCUMENT ME!
\r
1345 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1347 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1349 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1350 alignPanel.repaint();
\r
1357 * @param e DOCUMENT ME!
\r
1359 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1361 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1362 alignPanel.repaint();
\r
1368 * @param e DOCUMENT ME!
\r
1370 public void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1372 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1373 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1374 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1375 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1376 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1382 * @param e DOCUMENT ME!
\r
1384 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1386 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1387 alignPanel.repaint();
\r
1393 * @param e DOCUMENT ME!
\r
1395 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1397 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1398 alignPanel.repaint();
\r
1404 * @param e DOCUMENT ME!
\r
1406 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1408 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1409 alignPanel.repaint();
\r
1415 * @param e DOCUMENT ME!
\r
1417 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1419 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1420 alignPanel.repaint();
\r
1426 * @param e DOCUMENT ME!
\r
1428 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1430 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1431 alignPanel.repaint();
\r
1437 * @param e DOCUMENT ME!
\r
1439 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1441 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1442 alignPanel.repaint();
\r
1446 FeatureSettings featureSettings;
\r
1447 public void featureSettings_actionPerformed(ActionEvent e)
\r
1449 if(featureSettings !=null )
\r
1451 featureSettings.close();
\r
1452 featureSettings = null;
\r
1454 featureSettings = new FeatureSettings(this);
\r
1460 * @param evt DOCUMENT ME!
\r
1462 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1464 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1465 alignPanel.repaint();
\r
1466 if (alignPanel.getOverviewPanel() != null)
\r
1468 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1475 * @param e DOCUMENT ME!
\r
1477 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1479 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1480 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1486 * @param e DOCUMENT ME!
\r
1488 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1490 if (alignPanel.overviewPanel != null)
\r
1495 JInternalFrame frame = new JInternalFrame();
\r
1496 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1497 frame.setContentPane(overview);
\r
1498 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1499 frame.getWidth(), frame.getHeight());
\r
1501 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1502 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1504 public void internalFrameClosed(
\r
1505 javax.swing.event.InternalFrameEvent evt)
\r
1507 alignPanel.setOverviewPanel(null);
\r
1512 alignPanel.setOverviewPanel(overview);
\r
1518 * @param e DOCUMENT ME!
\r
1520 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1522 changeColour(null);
\r
1528 * @param e DOCUMENT ME!
\r
1530 public void clustalColour_actionPerformed(ActionEvent e)
\r
1532 changeColour(new ClustalxColourScheme(
\r
1533 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1539 * @param e DOCUMENT ME!
\r
1541 public void zappoColour_actionPerformed(ActionEvent e)
\r
1543 changeColour(new ZappoColourScheme());
\r
1549 * @param e DOCUMENT ME!
\r
1551 public void taylorColour_actionPerformed(ActionEvent e)
\r
1553 changeColour(new TaylorColourScheme());
\r
1559 * @param e DOCUMENT ME!
\r
1561 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1563 changeColour(new HydrophobicColourScheme());
\r
1569 * @param e DOCUMENT ME!
\r
1571 public void helixColour_actionPerformed(ActionEvent e)
\r
1573 changeColour(new HelixColourScheme());
\r
1579 * @param e DOCUMENT ME!
\r
1581 public void strandColour_actionPerformed(ActionEvent e)
\r
1583 changeColour(new StrandColourScheme());
\r
1589 * @param e DOCUMENT ME!
\r
1591 public void turnColour_actionPerformed(ActionEvent e)
\r
1593 changeColour(new TurnColourScheme());
\r
1599 * @param e DOCUMENT ME!
\r
1601 public void buriedColour_actionPerformed(ActionEvent e)
\r
1603 changeColour(new BuriedColourScheme());
\r
1609 * @param e DOCUMENT ME!
\r
1611 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1613 changeColour(new NucleotideColourScheme());
\r
1616 public void annotationColour_actionPerformed(ActionEvent e)
\r
1618 new AnnotationColourChooser(viewport, alignPanel);
\r
1625 * @param e DOCUMENT ME!
\r
1627 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1629 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1635 * @param cs DOCUMENT ME!
\r
1637 public void changeColour(ColourSchemeI cs)
\r
1639 int threshold = 0;
\r
1643 if (viewport.getAbovePIDThreshold())
\r
1645 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1648 cs.setThreshold(threshold,
\r
1649 viewport.getIgnoreGapsConsensus());
\r
1651 viewport.setGlobalColourScheme(cs);
\r
1655 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1658 if (viewport.getConservationSelected())
\r
1661 Alignment al = (Alignment) viewport.alignment;
\r
1662 Conservation c = new Conservation("All",
\r
1663 ResidueProperties.propHash, 3,
\r
1664 al.getSequences(), 0,
\r
1665 al.getWidth() - 1);
\r
1668 c.verdict(false, viewport.ConsPercGaps);
\r
1670 cs.setConservation(c);
\r
1672 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1677 cs.setConservation(null);
\r
1680 cs.setConsensus(viewport.vconsensus);
\r
1683 viewport.setGlobalColourScheme(cs);
\r
1685 if (viewport.getColourAppliesToAllGroups())
\r
1687 Vector groups = viewport.alignment.getGroups();
\r
1689 for (int i = 0; i < groups.size(); i++)
\r
1691 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1699 if (cs instanceof ClustalxColourScheme)
\r
1701 sg.cs = new ClustalxColourScheme(
\r
1702 sg.getSequences(true), sg.getWidth());
\r
1704 else if (cs instanceof UserColourScheme)
\r
1706 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1712 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1714 catch (Exception ex)
\r
1719 if (viewport.getAbovePIDThreshold()
\r
1720 || cs instanceof PIDColourScheme
\r
1721 || cs instanceof Blosum62ColourScheme)
\r
1723 sg.cs.setThreshold(threshold,
\r
1724 viewport.getIgnoreGapsConsensus());
\r
1726 sg.cs.setConsensus(AAFrequency.calculate(
\r
1727 sg.getSequences(true), 0,
\r
1731 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1734 if (viewport.getConservationSelected())
\r
1736 Conservation c = new Conservation("Group",
\r
1737 ResidueProperties.propHash, 3,
\r
1738 sg.getSequences(true), 0,
\r
1739 viewport.alignment.getWidth() - 1);
\r
1741 c.verdict(false, viewport.ConsPercGaps);
\r
1742 sg.cs.setConservation(c);
\r
1745 sg.cs.setConservation(null);
\r
1749 if (alignPanel.getOverviewPanel() != null)
\r
1751 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1754 alignPanel.repaint();
\r
1760 * @param e DOCUMENT ME!
\r
1762 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1764 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1766 SliderPanel.setPIDSliderSource(alignPanel,
\r
1767 viewport.getGlobalColourScheme(),
\r
1769 SliderPanel.showPIDSlider();
\r
1776 * @param e DOCUMENT ME!
\r
1778 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1780 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1782 SliderPanel.setConservationSlider(alignPanel,
\r
1783 viewport.globalColourScheme,
\r
1785 SliderPanel.showConservationSlider();
\r
1792 * @param e DOCUMENT ME!
\r
1794 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1796 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1798 viewport.setAbovePIDThreshold(false);
\r
1799 abovePIDThreshold.setSelected(false);
\r
1801 changeColour(viewport.getGlobalColourScheme());
\r
1803 modifyConservation_actionPerformed(null);
\r
1809 * @param e DOCUMENT ME!
\r
1811 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1813 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1815 conservationMenuItem.setSelected(false);
\r
1816 viewport.setConservationSelected(false);
\r
1818 changeColour(viewport.getGlobalColourScheme());
\r
1820 modifyPID_actionPerformed(null);
\r
1826 * @param e DOCUMENT ME!
\r
1828 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1830 if (e.getActionCommand().equals("User Defined..."))
\r
1832 new UserDefinedColours(alignPanel, null);
\r
1836 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1837 getUserColourSchemes().get(e.getActionCommand());
\r
1839 changeColour(udc);
\r
1843 public void updateUserColourMenu()
\r
1846 Component[] menuItems = colourMenu.getMenuComponents();
\r
1847 int i, iSize = menuItems.length;
\r
1848 for (i = 0; i < iSize; i++)
\r
1850 if (menuItems[i].getName() != null &&
\r
1851 menuItems[i].getName().equals("USER_DEFINED"))
\r
1853 colourMenu.remove(menuItems[i]);
\r
1857 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1859 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1860 getUserColourSchemes().keys();
\r
1862 while (userColours.hasMoreElements())
\r
1864 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1865 nextElement().toString());
\r
1866 radioItem.setName("USER_DEFINED");
\r
1867 radioItem.addMouseListener(new MouseAdapter()
\r
1869 public void mousePressed(MouseEvent evt)
\r
1871 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1873 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1875 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1876 "Remove from default list?",
\r
1877 "Remove user defined colour",
\r
1878 JOptionPane.YES_NO_OPTION);
\r
1879 if(option == JOptionPane.YES_OPTION)
\r
1881 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1882 colourMenu.remove(radioItem);
\r
1885 radioItem.addActionListener(new ActionListener()
\r
1887 public void actionPerformed(ActionEvent evt)
\r
1889 userDefinedColour_actionPerformed(evt);
\r
1895 radioItem.addActionListener(new ActionListener()
\r
1897 public void actionPerformed(ActionEvent evt)
\r
1899 userDefinedColour_actionPerformed(evt);
\r
1903 colourMenu.insert(radioItem, 15);
\r
1904 colours.add(radioItem);
\r
1912 * @param e DOCUMENT ME!
\r
1914 public void PIDColour_actionPerformed(ActionEvent e)
\r
1916 changeColour(new PIDColourScheme());
\r
1922 * @param e DOCUMENT ME!
\r
1924 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1926 changeColour(new Blosum62ColourScheme());
\r
1932 * @param e DOCUMENT ME!
\r
1934 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1936 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1937 HistoryItem.SORT));
\r
1938 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1939 viewport.getAlignment().getSequenceAt(0));
\r
1940 alignPanel.repaint();
\r
1946 * @param e DOCUMENT ME!
\r
1948 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1950 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1951 HistoryItem.SORT));
\r
1952 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1953 alignPanel.repaint();
\r
1959 * @param e DOCUMENT ME!
\r
1961 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1963 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1964 HistoryItem.SORT));
\r
1966 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1967 alignPanel.repaint();
\r
1973 * @param e DOCUMENT ME!
\r
1975 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1977 new RedundancyPanel(alignPanel, this);
\r
1984 * @param e DOCUMENT ME!
\r
1986 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1988 if ( (viewport.getSelectionGroup() == null) ||
\r
1989 (viewport.getSelectionGroup().getSize(false) < 2))
\r
1991 JOptionPane.showInternalMessageDialog(this,
\r
1992 "You must select at least 2 sequences.",
\r
1993 "Invalid Selection",
\r
1994 JOptionPane.WARNING_MESSAGE);
\r
1998 JInternalFrame frame = new JInternalFrame();
\r
1999 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
2000 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
2007 * @param e DOCUMENT ME!
\r
2009 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
2011 if ( ( (viewport.getSelectionGroup() != null) &&
\r
2012 (viewport.getSelectionGroup().getSize(false) < 4) &&
\r
2013 (viewport.getSelectionGroup().getSize(false) > 0)) ||
\r
2014 (viewport.getAlignment().getHeight() < 4))
\r
2016 JOptionPane.showInternalMessageDialog(this,
\r
2017 "Principal component analysis must take\n" +
\r
2018 "at least 4 input sequences.",
\r
2019 "Sequence selection insufficient",
\r
2020 JOptionPane.WARNING_MESSAGE);
\r
2025 new PCAPanel(viewport);
\r
2029 public void autoCalculate_actionPerformed(ActionEvent e)
\r
2031 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
2032 if(viewport.autoCalculateConsensus)
\r
2034 alignmentChanged();
\r
2042 * @param e DOCUMENT ME!
\r
2044 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
2046 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2052 * @param e DOCUMENT ME!
\r
2054 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2056 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2062 * @param e DOCUMENT ME!
\r
2064 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2066 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2072 * @param e DOCUMENT ME!
\r
2074 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2076 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2082 * @param type DOCUMENT ME!
\r
2083 * @param pwType DOCUMENT ME!
\r
2084 * @param title DOCUMENT ME!
\r
2086 void NewTreePanel(String type, String pwType, String title)
\r
2090 if ( (viewport.getSelectionGroup() != null) &&
\r
2091 (viewport.getSelectionGroup().getSize(false) > 3))
\r
2094 SequenceGroup sg = viewport.getSelectionGroup();
\r
2096 /* Decide if the selection is a column region */
\r
2097 while (s < sg.getSize(false))
\r
2099 if ( ( (SequenceI) sg.getSequences(false).elementAt(s++)).getLength() <
\r
2102 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2103 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2104 "Try using the Pad function in the edit menu,\n" +
\r
2105 "or one of the multiple sequence alignment web services.",
\r
2106 "Sequences in selection are not aligned",
\r
2107 JOptionPane.WARNING_MESSAGE);
\r
2113 title = title + " on region";
\r
2114 tp = new TreePanel(viewport, type, pwType);
\r
2118 //are the sequences aligned?
\r
2119 if (!viewport.alignment.isAligned())
\r
2121 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2122 "The sequences must be aligned before creating a tree.\n" +
\r
2123 "Try using the Pad function in the edit menu,\n" +
\r
2124 "or one of the multiple sequence alignment web services.",
\r
2125 "Sequences not aligned",
\r
2126 JOptionPane.WARNING_MESSAGE);
\r
2131 tp = new TreePanel(viewport, type, pwType);
\r
2134 addTreeMenuItem(tp, title);
\r
2136 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2142 * @param title DOCUMENT ME!
\r
2143 * @param order DOCUMENT ME!
\r
2145 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2147 final JMenuItem item = new JMenuItem("by " + title);
\r
2149 item.addActionListener(new java.awt.event.ActionListener()
\r
2151 public void actionPerformed(ActionEvent e)
\r
2153 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2154 HistoryItem.SORT));
\r
2156 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2157 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2158 alignPanel.repaint();
\r
2164 * Maintain the Order by->Displayed Tree menu.
\r
2165 * Creates a new menu item for a TreePanel with an appropriate
\r
2166 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2167 * to remove the menu item when the treePanel is closed, and adjust
\r
2168 * the tree leaf to sequence mapping when the alignment is modified.
\r
2169 * @param treePanel Displayed tree window.
\r
2170 * @param title SortBy menu item title.
\r
2172 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2174 final JMenuItem item = new JMenuItem(title);
\r
2178 if (treeCount == 1)
\r
2180 sort.add(sortByTreeMenu);
\r
2183 sortByTreeMenu.add(item);
\r
2184 item.addActionListener(new java.awt.event.ActionListener()
\r
2186 public void actionPerformed(ActionEvent e)
\r
2188 addHistoryItem(new HistoryItem("Tree Sort",
\r
2189 viewport.alignment, HistoryItem.SORT));
\r
2190 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2191 treePanel.getTree());
\r
2192 alignPanel.repaint();
\r
2196 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2197 InternalFrameAdapter()
\r
2199 public void internalFrameClosed(
\r
2200 javax.swing.event.InternalFrameEvent evt)
\r
2203 sortByTreeMenu.remove(item);
\r
2205 if (treeCount == 0)
\r
2207 sort.remove(sortByTreeMenu);
\r
2215 * Work out whether the whole set of sequences
\r
2216 * or just the selected set will be submitted for multiple alignment.
\r
2219 private SequenceI[] gatherSequencesForAlignment()
\r
2221 // Now, check we have enough sequences
\r
2222 SequenceI[] msa = null;
\r
2224 if ( (viewport.getSelectionGroup() != null) &&
\r
2225 (viewport.getSelectionGroup().getSize(false) > 1))
\r
2227 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2228 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2230 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2232 for (int i = 0; i < sz; i++)
\r
2234 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2239 Vector seqs = viewport.getAlignment().getSequences();
\r
2241 if (seqs.size() > 1)
\r
2243 msa = new SequenceI[seqs.size()];
\r
2245 for (int i = 0; i < seqs.size(); i++)
\r
2247 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2255 * Decides what is submitted to a secondary structure prediction service,
\r
2256 * the currently selected sequence, or the currently selected alignment
\r
2257 * (where the first sequence in the set is the one that the prediction
\r
2260 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2262 SequenceI seq = null;
\r
2263 SequenceI[] msa = null;
\r
2265 if ( (viewport.getSelectionGroup() != null) &&
\r
2266 (viewport.getSelectionGroup().getSize(false) > 0))
\r
2268 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2269 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2271 if ( (seqs.getSize(false) == 1) || !viewport.alignment.isAligned())
\r
2273 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2278 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2280 for (int i = 0; i < sz; i++)
\r
2282 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2288 Vector seqs = viewport.getAlignment().getSequences();
\r
2290 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2292 seq = (SequenceI) seqs.elementAt(0);
\r
2296 msa = new SequenceI[seqs.size()];
\r
2298 for (int i = 0; i < seqs.size(); i++)
\r
2300 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2312 return new SequenceI[]
\r
2322 * @param e DOCUMENT ME!
\r
2324 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2326 // Pick the tree file
\r
2327 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2329 "LAST_DIRECTORY"));
\r
2330 chooser.setFileView(new JalviewFileView());
\r
2331 chooser.setDialogTitle("Select a newick-like tree file");
\r
2332 chooser.setToolTipText("Load a tree file");
\r
2334 int value = chooser.showOpenDialog(null);
\r
2336 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2338 String choice = chooser.getSelectedFile().getPath();
\r
2339 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2343 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2345 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2347 catch (Exception ex)
\r
2349 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2350 "Problem reading tree file",
\r
2352 JOptionPane.WARNING_MESSAGE);
\r
2353 ex.printStackTrace();
\r
2359 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2361 return ShowNewickTree(nf,title,600,500,4,5);
\r
2366 * @param nf DOCUMENT ME!
\r
2367 * @param title DOCUMENT ME!
\r
2369 * @return DOCUMENT ME!
\r
2371 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2373 TreePanel tp = null;
\r
2379 if (nf.getTree() != null)
\r
2381 tp = new TreePanel(viewport,
\r
2389 tp.setLocation(x,y);
\r
2392 Desktop.addInternalFrame(tp, title, w, h);
\r
2393 addTreeMenuItem(tp, title);
\r
2396 catch (Exception ex)
\r
2398 ex.printStackTrace();
\r
2409 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2410 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2411 printJob.setPrintable(alignPanel, pf);
\r
2413 if (printJob.printDialog())
\r
2419 catch (Exception PrintException)
\r
2421 PrintException.printStackTrace();
\r
2428 * Generates menu items and listener event actions for web service clients
\r
2431 public void BuildWebServiceMenu()
\r
2433 if ( (Discoverer.services != null)
\r
2434 && (Discoverer.services.size() > 0))
\r
2436 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2437 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2438 Vector wsmenu = new Vector();
\r
2439 if (msaws != null)
\r
2441 // Add any Multiple Sequence Alignment Services
\r
2442 final JMenu msawsmenu = new JMenu("Alignment");
\r
2443 final AlignFrame af = this;
\r
2444 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2446 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2448 final JMenuItem method = new JMenuItem(sh.getName());
\r
2449 method.addActionListener(new ActionListener()
\r
2451 public void actionPerformed(ActionEvent e)
\r
2453 SequenceI[] msa = gatherSequencesForAlignment();
\r
2454 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2455 false, true, viewport.getAlignment().getDataset(), af);
\r
2460 msawsmenu.add(method);
\r
2461 // Deal with services that we know accept partial alignments.
\r
2462 if (sh.getName().indexOf("lustal") > -1)
\r
2464 // We know that ClustalWS can accept partial alignments for refinement.
\r
2465 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2466 methodR.addActionListener(new ActionListener()
\r
2468 public void actionPerformed(ActionEvent e)
\r
2470 SequenceI[] msa = gatherSequencesForAlignment();
\r
2471 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2472 true, true, viewport.getAlignment().getDataset(), af);
\r
2477 msawsmenu.add(methodR);
\r
2481 wsmenu.add(msawsmenu);
\r
2483 if (secstrpr != null)
\r
2485 // Add any secondary structure prediction services
\r
2486 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2487 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2489 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2491 final JMenuItem method = new JMenuItem(sh.getName());
\r
2492 method.addActionListener(new ActionListener()
\r
2494 public void actionPerformed(ActionEvent e)
\r
2496 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2497 if (msa.length == 1)
\r
2499 // Single Sequence prediction
\r
2500 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2504 if (msa.length > 1)
\r
2506 // Single Sequence prediction
\r
2507 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2513 secstrmenu.add(method);
\r
2515 wsmenu.add(secstrmenu);
\r
2517 this.webService.removeAll();
\r
2518 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2520 webService.add( (JMenu) wsmenu.get(i));
\r
2525 this.webService.removeAll();
\r
2526 this.webService.add(this.webServiceNoServices);
\r
2528 // TODO: add in rediscovery function
\r
2529 // TODO: reduce code redundancy.
\r
2530 // TODO: group services by location as well as function.
\r
2533 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2535 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2536 getProperty("LAST_DIRECTORY"));
\r
2538 chooser.setFileView(new JalviewFileView());
\r
2539 chooser.setDialogTitle("Export to Vamsas file");
\r
2540 chooser.setToolTipText("Export");
\r
2542 int value = chooser.showSaveDialog(this);
\r
2544 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2546 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2547 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2548 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2556 public void showTranslation_actionPerformed(ActionEvent e)
\r
2558 int s, sSize = viewport.alignment.getHeight();
\r
2559 SequenceI [] newSeq = new SequenceI[sSize];
\r
2562 StringBuffer protein;
\r
2564 for(s=0; s<sSize; s++)
\r
2566 protein = new StringBuffer();
\r
2567 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2568 resSize = seq.length();
\r
2569 resSize -= resSize%3;
\r
2571 for(res = 0; res < resSize; res+=3)
\r
2573 String codon = seq.substring(res, res+3);
\r
2574 codon = codon.replace('U', 'T');
\r
2575 String aa = ResidueProperties.codonTranslate(codon);
\r
2577 protein.append(viewport.getGapCharacter());
\r
2578 else if(aa.equals("STOP"))
\r
2579 protein.append("X");
\r
2581 protein.append( aa );
\r
2583 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2587 AlignmentI al = new Alignment(newSeq);
\r
2588 al.setDataset(null);
\r
2591 ////////////////////////////////
\r
2592 // Copy annotations across
\r
2593 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2594 = viewport.alignment.getAlignmentAnnotation();
\r
2596 if(annotations!=null)
\r
2598 for (int i = 0; i < annotations.length; i++)
\r
2600 if (annotations[i].label.equals("Quality") ||
\r
2601 annotations[i].label.equals("Conservation") ||
\r
2602 annotations[i].label.equals("Consensus"))
\r
2607 aSize = viewport.alignment.getWidth() / 3;
\r
2608 jalview.datamodel.Annotation[] anots =
\r
2609 new jalview.datamodel.Annotation[aSize];
\r
2611 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2613 if (annotations[i].annotations[a] == null
\r
2614 || annotations[i].annotations[a] == null)
\r
2617 anots[a / 3] = new Annotation(
\r
2618 annotations[i].annotations[a].displayCharacter,
\r
2619 annotations[i].annotations[a].description,
\r
2620 annotations[i].annotations[a].secondaryStructure,
\r
2621 annotations[i].annotations[a].value,
\r
2622 annotations[i].annotations[a].colour);
\r
2625 jalview.datamodel.AlignmentAnnotation aa
\r
2626 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2627 annotations[i].description, anots);
\r
2628 al.addAnnotation(aa);
\r
2632 AlignFrame af = new AlignFrame(al);
\r
2633 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2635 NEW_WINDOW_HEIGHT);
\r
2638 // AlignViewport newViewport = new AlignViewport(al);
\r
2639 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2640 // tabbedPane.add("Protein", ap);
\r
2641 // viewports.add(newViewport);
\r
2642 // alignPanels.add(ap);
\r
2645 /////////////////////////
\r
2647 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2648 // ds.setDataset(true);
\r
2649 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2650 // tabbedPane.add("Dataset", dap);
\r
2651 // viewports.add(ds);
\r
2652 // alignPanels.add(dap);
\r
2653 /////////////////////////
\r
2658 /*public void tabSelected()
\r
2660 int index = tabbedPane.getSelectedIndex();
\r
2661 viewport = (AlignViewport)viewports.elementAt(index);
\r
2662 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2668 * @param String DOCUMENT ME!
\r
2670 public boolean parseFeaturesFile(String file, String type)
\r
2672 boolean featuresFile = false;
\r
2674 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment.getDataset(),
\r
2675 alignPanel.seqPanel.seqCanvas.
\r
2676 getFeatureRenderer().featureColours,
\r
2679 catch(Exception ex)
\r
2681 ex.printStackTrace();
\r
2686 viewport.showSequenceFeatures = true;
\r
2687 showSeqFeatures.setSelected(true);
\r
2688 alignPanel.repaint();
\r
2691 return featuresFile;
\r
2694 public void dragEnter(DropTargetDragEvent evt)
\r
2697 public void dragExit(DropTargetEvent evt)
\r
2700 public void dragOver(DropTargetDragEvent evt)
\r
2703 public void dropActionChanged(DropTargetDragEvent evt)
\r
2706 public void drop(DropTargetDropEvent evt)
\r
2708 Transferable t = evt.getTransferable();
\r
2709 java.util.List files = null;
\r
2713 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2714 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2716 //Works on Windows and MacOSX
\r
2717 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2718 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2720 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2722 // This is used by Unix drag system
\r
2723 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2724 String data = (String) t.getTransferData(uriListFlavor);
\r
2725 files = new java.util.ArrayList(1);
\r
2726 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2729 st.hasMoreTokens(); )
\r
2731 String s = st.nextToken();
\r
2732 if (s.startsWith("#"))
\r
2734 // the line is a comment (as per the RFC 2483)
\r
2738 java.net.URI uri = new java.net.URI(s);
\r
2739 java.io.File file = new java.io.File(uri);
\r
2744 catch (Exception e)
\r
2746 e.printStackTrace();
\r
2748 if (files != null)
\r
2753 for (int i = 0; i < files.size(); i++)
\r
2755 loadJalviewDataFile(files.get(i).toString());
\r
2758 catch (Exception ex)
\r
2760 ex.printStackTrace();
\r
2765 // This method will attempt to load a "dropped" file first by testing
\r
2766 // whether its and Annotation file, then features file. If both are
\r
2767 // false then the user may have dropped an alignment file onto this
\r
2769 public void loadJalviewDataFile(String file)
\r
2772 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
\r
2775 if (!isAnnotation)
\r
2777 boolean isGroupsFile = parseFeaturesFile(file,
\r
2778 AppletFormatAdapter.FILE);
\r
2779 if (!isGroupsFile)
\r
2781 String protocol = "File";
\r
2782 String format = new IdentifyFile().Identify(file, protocol);
\r
2783 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2786 FastaFile ff = new FastaFile();
\r
2787 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2788 c.setContents(new StringSelection(ff.print(sequences)), Desktop.instance);
\r
2790 this.paste(false);
\r
2796 alignPanel.adjustAnnotationHeight();
\r
2799 }catch(Exception ex)
\r
2801 ex.printStackTrace();
\r