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 jalview.biojava.dasobert.eventmodel.*;
\r
44 * @version $Revision$
\r
46 public class AlignFrame
\r
47 extends GAlignFrame implements DropTargetListener, FeatureListener
\r
49 /** DOCUMENT ME!! */
\r
50 public static final int NEW_WINDOW_WIDTH = 700;
\r
52 /** DOCUMENT ME!! */
\r
53 public static final int NEW_WINDOW_HEIGHT = 500;
\r
54 AlignmentPanel alignPanel;
\r
55 AlignViewport viewport;
\r
57 /** DOCUMENT ME!! */
\r
58 public String currentFileFormat = null;
\r
59 Stack historyList = new Stack();
\r
60 Stack redoList = new Stack();
\r
61 private int treeCount = 0;
\r
65 * Creates a new AlignFrame object.
\r
67 * @param al DOCUMENT ME!
\r
69 public AlignFrame(AlignmentI al)
\r
71 viewport = new AlignViewport(al);
\r
73 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
\r
75 if(viewport.vconsensus==null)
\r
77 //Out of memory calculating consensus.
\r
78 BLOSUM62Colour.setEnabled(false);
\r
79 PIDColour.setEnabled(false);
\r
80 conservationMenuItem.setEnabled(false);
\r
81 modifyConservation.setEnabled(false);
\r
82 abovePIDThreshold.setEnabled(false);
\r
83 modifyPID.setEnabled(false);
\r
86 alignPanel = new AlignmentPanel(this, viewport);
\r
88 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
\r
90 if(sortby.equals("Id"))
\r
91 sortIDMenuItem_actionPerformed(null);
\r
92 else if(sortby.equals("Pairwise Identity"))
\r
93 sortPairwiseMenuItem_actionPerformed(null);
\r
95 // remove(tabbedPane);
\r
96 getContentPane().add(alignPanel, BorderLayout.CENTER);
\r
100 // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
\r
103 /////////////////////////
\r
104 if(al.getDataset()==null)
\r
106 al.setDataset(null);
\r
108 // AlignViewport ds = new AlignViewport(al.getDataset(), true);
\r
109 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
110 // tabbedPane.add("Dataset", dap);
\r
111 // viewports.add(ds);
\r
112 // alignPanels.add(dap);
\r
113 /////////////////////////
\r
116 viewport.addPropertyChangeListener(new PropertyChangeListener()
\r
118 public void propertyChange(PropertyChangeEvent evt)
\r
120 if (evt.getPropertyName().equals("alignment"))
\r
122 alignmentChanged();
\r
128 if (Desktop.desktop != null)
\r
130 addServiceListeners();
\r
131 setGUINucleotide(al.isNucleotide());
\r
135 if (jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false))
\r
137 wrapMenuItem.setSelected(true);
\r
138 wrapMenuItem_actionPerformed(null);
\r
143 public AlignViewport getViewport()
\r
148 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
149 private void addServiceListeners()
\r
151 final java.beans.PropertyChangeListener thisListener;
\r
152 // Do this once to get current state
\r
153 BuildWebServiceMenu();
\r
154 Desktop.discoverer.addPropertyChangeListener(
\r
155 thisListener = new java.beans.PropertyChangeListener()
\r
157 public void propertyChange(PropertyChangeEvent evt)
\r
159 // System.out.println("Discoverer property change.");
\r
160 if (evt.getPropertyName().equals("services"))
\r
162 // System.out.println("Rebuilding web service menu");
\r
163 BuildWebServiceMenu();
\r
167 addInternalFrameListener(new javax.swing.event.
\r
168 InternalFrameAdapter()
\r
170 public void internalFrameClosed(
\r
171 javax.swing.event.InternalFrameEvent evt)
\r
173 // System.out.println("deregistering discoverer listener");
\r
174 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
175 closeMenuItem_actionPerformed(null);
\r
181 public void setGUINucleotide(boolean nucleotide)
\r
183 showTranslation.setVisible( nucleotide );
\r
184 //sequenceFeatures.setVisible(!nucleotide );
\r
185 //featureSettings.setVisible( !nucleotide );
\r
186 conservationMenuItem.setVisible( !nucleotide );
\r
187 modifyConservation.setVisible( !nucleotide );
\r
189 //Remember AlignFrame always starts as protein
\r
192 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
196 public void comeBackLater(FeatureEvent evt)
\r
199 public void newFeatures(FeatureEvent evt)
\r
201 if (evt.getFeatures().length > 0)
\r
203 alignPanel.seqPanel.seqCanvas.fr.featuresAdded();
\r
204 alignPanel.repaint();
\r
205 if(featureSettings!=null)
\r
206 featureSettings.setTableData();
\r
210 Hashtable progressBars;
\r
211 public void setProgressBar(String message, long id)
\r
213 if(progressBars == null)
\r
214 progressBars = new Hashtable();
\r
216 JPanel progressPanel;
\r
217 GridLayout layout = (GridLayout) statusPanel.getLayout();
\r
218 if(progressBars.get( new Long(id) )!=null)
\r
220 progressPanel = (JPanel)progressBars.get( new Long(id) );
\r
221 statusPanel.remove(progressPanel);
\r
222 progressBars.remove( progressPanel );
\r
223 progressPanel = null;
\r
225 statusBar.setText(message);
\r
227 layout.setRows(layout.getRows() - 1);
\r
231 progressPanel = new JPanel(new BorderLayout(10, 5));
\r
233 JProgressBar progressBar = new JProgressBar();
\r
234 progressBar.setIndeterminate(true);
\r
236 progressPanel.add(new JLabel(message), BorderLayout.WEST);
\r
237 progressPanel.add(progressBar, BorderLayout.CENTER);
\r
239 layout.setRows(layout.getRows() + 1);
\r
240 statusPanel.add(progressPanel);
\r
242 progressBars.put(new Long(id), progressPanel);
\r
250 Added so Castor Mapping file can obtain Jalview Version
\r
252 public String getVersion()
\r
254 return jalview.bin.Cache.getProperty("VERSION");
\r
257 public FeatureRenderer getFeatureRenderer()
\r
259 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
\r
263 public void fetchSequence_actionPerformed(ActionEvent e)
\r
265 new SequenceFetcher(this);
\r
268 public void addFromFile_actionPerformed(ActionEvent e)
\r
270 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
\r
273 public void addFromText_actionPerformed(ActionEvent e)
\r
275 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
\r
278 public void addFromURL_actionPerformed(ActionEvent e)
\r
280 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
\r
286 * @param e DOCUMENT ME!
\r
288 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
290 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
291 getProperty( "LAST_DIRECTORY"),
\r
293 { "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc","jar" },
\r
295 { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview" },
\r
300 chooser.setFileView(new JalviewFileView());
\r
301 chooser.setDialogTitle("Save Alignment to file");
\r
302 chooser.setToolTipText("Save");
\r
304 int value = chooser.showSaveDialog(this);
\r
306 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
308 currentFileFormat = chooser.getSelectedFormat();
\r
310 if (currentFileFormat == null)
\r
312 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
313 "You must select a file format before saving!",
\r
314 "File format not specified",
\r
315 JOptionPane.WARNING_MESSAGE);
\r
316 value = chooser.showSaveDialog(this);
\r
320 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
321 currentFileFormat);
\r
323 String choice = chooser.getSelectedFile().getPath();
\r
324 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
326 saveAlignment(choice, currentFileFormat);
\r
330 public boolean saveAlignment(String file, String format)
\r
332 if (format.equalsIgnoreCase("Jalview"))
\r
334 String shortName = title;
\r
336 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
338 shortName = shortName.substring(shortName.lastIndexOf(
\r
339 java.io.File.separatorChar) + 1);
\r
342 new Jalview2XML().SaveAlignment(this, file, shortName);
\r
344 // USE Jalview2XML to save this file
\r
350 String[] omitHidden = null;
\r
352 if (viewport.hasHiddenColumns)
\r
354 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
\r
355 "The Alignment contains hidden columns."
\r
356 + "\nDo you want to save only the visible alignment?",
\r
357 "Save / Omit Hidden Columns",
\r
358 JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
\r
360 if (reply == JOptionPane.YES_OPTION)
\r
361 omitHidden = viewport.getViewAsString(false);
\r
364 String output = new FormatAdapter().formatSequences(
\r
366 viewport.alignment.getSequencesArray(),
\r
369 if (output == null)
\r
376 java.io.PrintWriter out = new java.io.PrintWriter(
\r
377 new java.io.FileWriter(file));
\r
381 this.setTitle(file);
\r
384 catch (Exception ex)
\r
386 ex.printStackTrace();
\r
395 * @param e DOCUMENT ME!
\r
397 protected void outputText_actionPerformed(ActionEvent e)
\r
399 String [] omitHidden = null;
\r
401 if(viewport.hasHiddenColumns)
\r
403 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
\r
404 "The Alignment contains hidden columns."
\r
405 +"\nDo you want to output only the visible alignment?",
\r
406 "Save / Omit Hidden Columns",
\r
407 JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
\r
409 if(reply==JOptionPane.YES_OPTION)
\r
411 omitHidden = viewport.getViewAsString(false);
\r
415 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
416 Desktop.addInternalFrame(cap,
\r
417 "Alignment output - " + e.getActionCommand(), 600,
\r
421 cap.setText(new FormatAdapter().formatSequences(
\r
422 e.getActionCommand(),
\r
423 viewport.alignment.getSequencesArray(),
\r
430 * @param e DOCUMENT ME!
\r
432 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
434 new HTMLOutput(viewport,
\r
435 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
436 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
439 public void createImageMap(File file, String image)
\r
441 alignPanel.makePNGImageMap(file, image);
\r
447 * @param e DOCUMENT ME!
\r
449 public void createPNG(File f)
\r
451 alignPanel.makePNG(f);
\r
457 * @param e DOCUMENT ME!
\r
459 public void createEPS(File f)
\r
461 alignPanel.makeEPS(f);
\r
467 * @param e DOCUMENT ME!
\r
469 public void printMenuItem_actionPerformed(ActionEvent e)
\r
471 //Putting in a thread avoids Swing painting problems
\r
472 PrintThread thread = new PrintThread();
\r
476 public void exportFeatures_actionPerformed(ActionEvent e)
\r
478 new AnnotationExporter().exportFeatures(alignPanel);
\r
482 public void exportAnnotations_actionPerformed(ActionEvent e)
\r
484 new AnnotationExporter().exportAnnotations(
\r
486 viewport.alignment.getAlignmentAnnotation()
\r
491 public void associatedData_actionPerformed(ActionEvent e)
\r
493 // Pick the tree file
\r
494 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
496 "LAST_DIRECTORY"));
\r
497 chooser.setFileView(new JalviewFileView());
\r
498 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
499 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
501 int value = chooser.showOpenDialog(null);
\r
503 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
505 String choice = chooser.getSelectedFile().getPath();
\r
506 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
507 loadJalviewDataFile(choice);
\r
515 * @param e DOCUMENT ME!
\r
517 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
521 PaintRefresher.components.remove(viewport.alignment);
\r
522 this.setClosed(true);
\r
524 catch (Exception ex)
\r
532 void updateEditMenuBar()
\r
534 if (historyList.size() > 0)
\r
536 undoMenuItem.setEnabled(true);
\r
538 HistoryItem hi = (HistoryItem) historyList.peek();
\r
539 undoMenuItem.setText("Undo " + hi.getDescription());
\r
543 undoMenuItem.setEnabled(false);
\r
544 undoMenuItem.setText("Undo");
\r
547 if (redoList.size() > 0)
\r
549 redoMenuItem.setEnabled(true);
\r
551 HistoryItem hi = (HistoryItem) redoList.peek();
\r
552 redoMenuItem.setText("Redo " + hi.getDescription());
\r
556 redoMenuItem.setEnabled(false);
\r
557 redoMenuItem.setText("Redo");
\r
564 * @param hi DOCUMENT ME!
\r
566 public void addHistoryItem(HistoryItem hi)
\r
568 historyList.push(hi);
\r
569 updateEditMenuBar();
\r
575 * @param e DOCUMENT ME!
\r
577 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
579 HistoryItem hi = (HistoryItem) historyList.pop();
\r
580 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
581 HistoryItem.HIDE));
\r
582 restoreHistoryItem(hi);
\r
583 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
589 * @param e DOCUMENT ME!
\r
591 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
593 HistoryItem hi = (HistoryItem) redoList.pop();
\r
594 restoreHistoryItem(hi);
\r
595 updateEditMenuBar();
\r
596 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
599 // used by undo and redo
\r
600 void restoreHistoryItem(HistoryItem hi)
\r
605 updateEditMenuBar();
\r
607 viewport.firePropertyChange("alignment", null,
\r
608 viewport.getAlignment().getSequences());
\r
614 * @param up DOCUMENT ME!
\r
616 public void moveSelectedSequences(boolean up)
\r
618 SequenceGroup sg = viewport.getSelectionGroup();
\r
627 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
629 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
631 if (!sg.getSequences(false).contains(seq))
\r
636 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
638 if (sg.getSequences(false).contains(temp))
\r
643 viewport.alignment.getSequences().setElementAt(temp, i);
\r
644 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
649 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
651 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
653 if (!sg.getSequences(false).contains(seq))
\r
658 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
660 if (sg.getSequences(false).contains(temp))
\r
665 viewport.alignment.getSequences().setElementAt(temp, i);
\r
666 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
670 alignPanel.repaint();
\r
678 * @param e DOCUMENT ME!
\r
680 protected void copy_actionPerformed(ActionEvent e)
\r
682 if (viewport.getSelectionGroup() == null)
\r
687 SequenceI [] seqs = viewport.getSelectionAsNewSequence();
\r
688 String[] omitHidden = null;
\r
690 if (viewport.hasHiddenColumns)
\r
692 omitHidden = viewport.getViewAsString(true);
\r
695 String output = new FormatAdapter().formatSequences(
\r
701 Toolkit.getDefaultToolkit().getSystemClipboard()
\r
702 .setContents(new StringSelection(output), Desktop.instance);
\r
704 Vector hiddenColumns = null;
\r
705 if(viewport.hasHiddenColumns && viewport.getSelectionGroup()!=null)
\r
707 hiddenColumns =new Vector();
\r
708 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
\r
709 for(int i=0; i<viewport.getColumnSelection().getHiddenColumns().size(); i++)
\r
711 int[] region = (int[])
\r
712 viewport.getColumnSelection().getHiddenColumns().elementAt(i);
\r
714 hiddenColumns.addElement(new int[]{region[0]-hiddenOffset,
\r
715 region[1]-hiddenOffset});
\r
719 Desktop.jalviewClipboard = new Object[]{ seqs,
\r
720 viewport.alignment.getDataset(),
\r
727 * @param e DOCUMENT ME!
\r
729 protected void pasteNew_actionPerformed(ActionEvent e)
\r
737 * @param e DOCUMENT ME!
\r
739 protected void pasteThis_actionPerformed(ActionEvent e)
\r
741 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
742 HistoryItem.PASTE));
\r
749 * @param newAlignment DOCUMENT ME!
\r
751 void paste(boolean newAlignment)
\r
755 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
756 Transferable contents = c.getContents(this);
\r
758 if (contents == null)
\r
763 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
767 String format = new IdentifyFile().Identify(str, "Paste");
\r
768 SequenceI[] sequences;
\r
771 if(Desktop.jalviewClipboard!=null)
\r
773 // The clipboard was filled from within Jalview, we must use the sequences
\r
774 // And dataset from the copied alignment
\r
775 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
779 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
782 AlignmentI alignment = null;
\r
786 System.out.println(format +" 2");
\r
787 alignment = new Alignment(sequences);
\r
789 if(Desktop.jalviewClipboard!=null)
\r
790 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
792 alignment.setDataset( null );
\r
797 System.out.println(format +" 24");
\r
798 alignment = viewport.getAlignment();
\r
801 for (int i = 0; i < sequences.length; i++)
\r
803 Sequence newseq = new Sequence(sequences[i].getName(),
\r
804 sequences[i].getSequence(), sequences[i].getStart(),
\r
805 sequences[i].getEnd());
\r
807 alignment.addSequence(newseq);
\r
811 viewport.setEndSeq(alignment.getHeight());
\r
812 alignment.getWidth();
\r
813 viewport.firePropertyChange("alignment", null, alignment.getSequences());
\r
820 // Add any annotations attached to sequences
\r
821 for (int i = 0; i < sequences.length; i++)
\r
823 if (sequences[i].getAnnotation() != null)
\r
825 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
\r
827 AlignmentAnnotation newAnnot =
\r
828 new AlignmentAnnotation(
\r
829 sequences[i].getAnnotation()[a].label,
\r
830 sequences[i].getAnnotation()[a].description,
\r
831 sequences[i].getAnnotation()[a].annotations,
\r
832 sequences[i].getAnnotation()[a].graphMin,
\r
833 sequences[i].getAnnotation()[a].graphMax,
\r
834 sequences[i].getAnnotation()[a].graph);
\r
836 sequences[i].getAnnotation()[a] = newAnnot;
\r
837 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
\r
839 newAnnot.sequenceRef = sequences[i];
\r
840 newAnnot.adjustForAlignment();
\r
841 alignment.addAnnotation(newAnnot);
\r
842 alignment.setAnnotationIndex(newAnnot, a);
\r
845 alignPanel.annotationPanel.adjustPanelHeight();
\r
851 AlignFrame af = new AlignFrame(alignment);
\r
852 String newtitle = new String("Copied sequences");
\r
854 if(Desktop.jalviewClipboard[2]!=null)
\r
856 Vector hc = (Vector)Desktop.jalviewClipboard[2];
\r
857 for(int i=0; i<hc.size(); i++)
\r
859 int [] region = (int[]) hc.elementAt(i);
\r
860 af.viewport.hideColumns(region[0], region[1]+1);
\r
865 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
866 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
867 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
870 if (title.startsWith("Copied sequences"))
\r
876 newtitle = newtitle.concat("- from " + title);
\r
879 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
880 NEW_WINDOW_HEIGHT);
\r
886 catch (Exception ex)
\r
888 ex.printStackTrace();
\r
889 System.out.println("Exception whilst pasting: "+ex);
\r
890 // could be anything being pasted in here
\r
899 * @param e DOCUMENT ME!
\r
901 protected void cut_actionPerformed(ActionEvent e)
\r
903 copy_actionPerformed(null);
\r
904 delete_actionPerformed(null);
\r
910 * @param e DOCUMENT ME!
\r
912 protected void delete_actionPerformed(ActionEvent e)
\r
915 if (viewport.getSelectionGroup() == null)
\r
921 SequenceGroup sg = viewport.getSelectionGroup();
\r
925 //Jalview no longer allows deletion of residues.
\r
926 //Check here whether any residues are in selection area
\r
927 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
929 for (int i = 0; i < sg.sequences.size(); i++)
\r
931 SequenceI seq = sg.getSequenceAt(i);
\r
932 int j = sg.getStartRes();
\r
935 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
937 JOptionPane.showInternalMessageDialog(
\r
938 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
939 + "Try hiding columns instead.",
\r
940 "Deletion of residues not permitted",
\r
941 JOptionPane.WARNING_MESSAGE);
\r
946 }while(j<=sg.getEndRes());
\r
951 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
952 HistoryItem.HIDE));
\r
955 for (int i = 0; i < sg.getSize(false); i++)
\r
957 SequenceI seq = sg.getSequenceAt(i);
\r
958 int index = viewport.getAlignment().findIndex(seq);
\r
960 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
962 // If the cut affects all sequences, remove highlighted columns
\r
963 if (sg.getSize(false) == viewport.alignment.getHeight())
\r
965 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
966 sg.getEndRes() + 1);
\r
969 if (seq.getSequence().length() < 1)
\r
971 viewport.getAlignment().deleteSequence(seq);
\r
975 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
979 viewport.setSelectionGroup(null);
\r
980 viewport.alignment.deleteGroup(sg);
\r
982 viewport.firePropertyChange("alignment", null,
\r
983 viewport.getAlignment().getSequences());
\r
987 if (viewport.getAlignment().getHeight() < 1)
\r
991 this.setClosed(true);
\r
993 catch (Exception ex)
\r
1002 * @param e DOCUMENT ME!
\r
1004 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
1006 viewport.alignment.deleteAllGroups();
\r
1007 viewport.setSelectionGroup(null);
\r
1008 alignPanel.repaint();
\r
1014 * @param e DOCUMENT ME!
\r
1016 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1018 SequenceGroup sg = new SequenceGroup();
\r
1020 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1023 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
1026 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
1027 viewport.setSelectionGroup(sg);
\r
1028 PaintRefresher.Refresh(null, viewport.alignment);
\r
1034 * @param e DOCUMENT ME!
\r
1036 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1038 if(viewport.cursorMode)
\r
1040 alignPanel.seqPanel.keyboardNo1 = null;
\r
1041 alignPanel.seqPanel.keyboardNo2 = null;
\r
1043 viewport.setSelectionGroup(null);
\r
1044 viewport.getColumnSelection().clear();
\r
1045 viewport.setSelectionGroup(null);
\r
1046 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
1047 alignPanel.idPanel.idCanvas.searchResults = null;
\r
1048 alignPanel.repaint();
\r
1049 PaintRefresher.Refresh(null, viewport.alignment);
\r
1055 * @param e DOCUMENT ME!
\r
1057 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1059 SequenceGroup sg = viewport.getSelectionGroup();
\r
1063 selectAllSequenceMenuItem_actionPerformed(null);
\r
1068 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1071 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
1074 PaintRefresher.Refresh(null, viewport.alignment);
\r
1080 * @param e DOCUMENT ME!
\r
1082 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
1084 ColumnSelection colSel = viewport.getColumnSelection();
\r
1086 if (colSel.size() > 0)
\r
1088 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
1089 HistoryItem.HIDE));
\r
1091 int min = colSel.getMin();
\r
1092 viewport.getAlignment().trimLeft(min);
\r
1093 colSel.compensateForEdit(0, min);
\r
1095 if (viewport.getSelectionGroup() != null)
\r
1097 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
1100 Vector groups = viewport.alignment.getGroups();
\r
1102 for (int i = 0; i < groups.size(); i++)
\r
1104 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1106 if (!sg.adjustForRemoveLeft(min))
\r
1108 viewport.alignment.deleteGroup(sg);
\r
1112 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1119 * @param e DOCUMENT ME!
\r
1121 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1123 ColumnSelection colSel = viewport.getColumnSelection();
\r
1125 if (colSel.size() > 0)
\r
1127 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1128 HistoryItem.HIDE));
\r
1130 int max = colSel.getMax();
\r
1131 viewport.getAlignment().trimRight(max);
\r
1133 if (viewport.getSelectionGroup() != null)
\r
1135 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1138 Vector groups = viewport.alignment.getGroups();
\r
1140 for (int i = 0; i < groups.size(); i++)
\r
1142 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1144 if (!sg.adjustForRemoveRight(max))
\r
1146 viewport.alignment.deleteGroup(sg);
\r
1150 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1157 * @param e DOCUMENT ME!
\r
1159 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1161 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1162 viewport.alignment, HistoryItem.HIDE));
\r
1164 //This is to maintain viewport position on first residue
\r
1165 //of first sequence
\r
1166 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1167 int startRes = seq.findPosition(viewport.startRes);
\r
1169 viewport.getAlignment().removeGaps();
\r
1171 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1173 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1179 * @param e DOCUMENT ME!
\r
1181 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1183 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1184 HistoryItem.HIDE));
\r
1186 //This is to maintain viewport position on first residue
\r
1187 //of first sequence
\r
1188 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1189 int startRes = seq.findPosition(viewport.startRes);
\r
1192 SequenceI current;
\r
1195 Vector seqs = null;
\r
1198 int end = viewport.alignment.getWidth();
\r
1200 if (viewport.getSelectionGroup() != null
\r
1201 && viewport.getSelectionGroup().getSequences(true) != null
\r
1202 && viewport.getSelectionGroup().getSize(true) > 0)
\r
1204 seqs = viewport.getSelectionGroup().getSequences(true);
\r
1205 start = viewport.getSelectionGroup().getStartRes();
\r
1206 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1210 seqs = viewport.alignment.getSequences();
\r
1213 for (int i = 0; i < seqs.size(); i++)
\r
1215 current = (SequenceI) seqs.elementAt(i);
\r
1216 jSize = current.getLength();
\r
1218 // Removing a range is much quicker than removing gaps
\r
1219 // one by one for long sequences
\r
1221 int rangeStart=-1, rangeEnd=-1;
\r
1225 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1227 if(rangeStart==-1)
\r
1242 current.deleteChars(rangeStart, rangeEnd);
\r
1243 j-=rangeEnd-rangeStart;
\r
1244 jSize-=rangeEnd-rangeStart;
\r
1252 while (j < end && j < jSize);
\r
1255 current.deleteChars(rangeStart, rangeEnd);
\r
1259 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1261 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1264 public void alignmentChanged()
\r
1266 if(viewport.padGaps)
\r
1267 viewport.getAlignment().padGaps();
\r
1269 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1271 viewport.updateConsensus();
\r
1272 viewport.updateConservation();
\r
1274 resetAllColourSchemes();
\r
1275 if(alignPanel.overviewPanel!=null)
\r
1276 alignPanel.overviewPanel.updateOverviewImage();
\r
1278 viewport.alignment.adjustSequenceAnnotations();
\r
1280 alignPanel.repaint();
\r
1283 void resetAllColourSchemes()
\r
1285 ColourSchemeI cs = viewport.globalColourScheme;
\r
1288 if (cs instanceof ClustalxColourScheme)
\r
1290 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1291 resetClustalX(viewport.alignment.getSequences(),
\r
1292 viewport.alignment.getWidth());
\r
1295 cs.setConsensus(viewport.vconsensus);
\r
1296 if (cs.conservationApplied())
\r
1298 Alignment al = (Alignment) viewport.alignment;
\r
1299 Conservation c = new Conservation("All",
\r
1300 ResidueProperties.propHash, 3,
\r
1301 al.getSequences(), 0,
\r
1302 al.getWidth() - 1);
\r
1304 c.verdict(false, viewport.ConsPercGaps);
\r
1306 cs.setConservation(c);
\r
1310 int s, sSize = viewport.alignment.getGroups().size();
\r
1311 for(s=0; s<sSize; s++)
\r
1313 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1314 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1316 ((ClustalxColourScheme)sg.cs).resetClustalX(
\r
1317 sg.getSequences(true), sg.getWidth());
\r
1319 sg.recalcConservation();
\r
1326 * @param e DOCUMENT ME!
\r
1328 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1330 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1331 HistoryItem.HIDE));
\r
1333 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1335 // if (viewport.padGaps)
\r
1336 alignmentChanged();
\r
1342 * @param e DOCUMENT ME!
\r
1344 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1346 JInternalFrame frame = new JInternalFrame();
\r
1347 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1348 frame.setContentPane(finder);
\r
1349 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1350 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1356 * @param e DOCUMENT ME!
\r
1358 public void font_actionPerformed(ActionEvent e)
\r
1360 new FontChooser(alignPanel);
\r
1363 public void smoothFont_actionPerformed(ActionEvent e)
\r
1365 viewport.antiAlias = smoothFont.isSelected();
\r
1366 alignPanel.annotationPanel.image = null;
\r
1367 alignPanel.repaint();
\r
1374 * @param e DOCUMENT ME!
\r
1376 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1378 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1380 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1381 alignPanel.repaint();
\r
1388 * @param e DOCUMENT ME!
\r
1390 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1392 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1393 alignPanel.repaint();
\r
1399 * @param e DOCUMENT ME!
\r
1401 public void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1403 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1404 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1405 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1406 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1407 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1410 public void showAllSeqs_actionPerformed(ActionEvent e)
\r
1412 viewport.showAllHiddenSeqs();
\r
1416 public void showAllColumns_actionPerformed(ActionEvent e)
\r
1418 viewport.getColumnSelection().revealAllHiddenColumns(viewport);
\r
1421 public void hideSelSequences_actionPerformed(ActionEvent e)
\r
1423 if(viewport.getSelectionGroup()==null)
\r
1426 SequenceI [] seqs = viewport.getSelectionGroup().getSequencesInOrder(
\r
1427 viewport.alignment
\r
1430 for(int i=0; i<seqs.length; i++)
\r
1432 viewport.hideSequence(seqs[i]);
\r
1434 alignPanel.repaint();
\r
1437 public void hideSelColumns_actionPerformed(ActionEvent e)
\r
1439 viewport.hideSelectedColumns();
\r
1443 public void hiddenMarkers_actionPerformed(ActionEvent e)
\r
1445 viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
\r
1452 * @param e DOCUMENT ME!
\r
1454 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1456 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1457 alignPanel.repaint();
\r
1463 * @param e DOCUMENT ME!
\r
1465 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1467 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1468 alignPanel.repaint();
\r
1474 * @param e DOCUMENT ME!
\r
1476 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1478 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1479 alignPanel.repaint();
\r
1485 * @param e DOCUMENT ME!
\r
1487 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1489 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1490 alignPanel.repaint();
\r
1496 * @param e DOCUMENT ME!
\r
1498 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1500 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1501 alignPanel.repaint();
\r
1507 * @param e DOCUMENT ME!
\r
1509 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1511 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1512 alignPanel.repaint();
\r
1516 FeatureSettings featureSettings;
\r
1517 public void featureSettings_actionPerformed(ActionEvent e)
\r
1519 if(featureSettings !=null )
\r
1521 featureSettings.close();
\r
1522 featureSettings = null;
\r
1524 featureSettings = new FeatureSettings(this);
\r
1530 * @param evt DOCUMENT ME!
\r
1532 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1534 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1535 alignPanel.repaint();
\r
1536 if (alignPanel.getOverviewPanel() != null)
\r
1538 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1545 * @param e DOCUMENT ME!
\r
1547 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1549 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1550 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1556 * @param e DOCUMENT ME!
\r
1558 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1560 if (alignPanel.overviewPanel != null)
\r
1565 JInternalFrame frame = new JInternalFrame();
\r
1566 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1567 frame.setContentPane(overview);
\r
1568 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1569 frame.getWidth(), frame.getHeight());
\r
1571 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1572 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1574 public void internalFrameClosed(
\r
1575 javax.swing.event.InternalFrameEvent evt)
\r
1577 alignPanel.setOverviewPanel(null);
\r
1582 alignPanel.setOverviewPanel(overview);
\r
1588 * @param e DOCUMENT ME!
\r
1590 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1592 changeColour(null);
\r
1598 * @param e DOCUMENT ME!
\r
1600 public void clustalColour_actionPerformed(ActionEvent e)
\r
1602 changeColour(new ClustalxColourScheme(
\r
1603 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1609 * @param e DOCUMENT ME!
\r
1611 public void zappoColour_actionPerformed(ActionEvent e)
\r
1613 changeColour(new ZappoColourScheme());
\r
1619 * @param e DOCUMENT ME!
\r
1621 public void taylorColour_actionPerformed(ActionEvent e)
\r
1623 changeColour(new TaylorColourScheme());
\r
1629 * @param e DOCUMENT ME!
\r
1631 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1633 changeColour(new HydrophobicColourScheme());
\r
1639 * @param e DOCUMENT ME!
\r
1641 public void helixColour_actionPerformed(ActionEvent e)
\r
1643 changeColour(new HelixColourScheme());
\r
1649 * @param e DOCUMENT ME!
\r
1651 public void strandColour_actionPerformed(ActionEvent e)
\r
1653 changeColour(new StrandColourScheme());
\r
1659 * @param e DOCUMENT ME!
\r
1661 public void turnColour_actionPerformed(ActionEvent e)
\r
1663 changeColour(new TurnColourScheme());
\r
1669 * @param e DOCUMENT ME!
\r
1671 public void buriedColour_actionPerformed(ActionEvent e)
\r
1673 changeColour(new BuriedColourScheme());
\r
1679 * @param e DOCUMENT ME!
\r
1681 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1683 changeColour(new NucleotideColourScheme());
\r
1686 public void annotationColour_actionPerformed(ActionEvent e)
\r
1688 new AnnotationColourChooser(viewport, alignPanel);
\r
1695 * @param e DOCUMENT ME!
\r
1697 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1699 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1705 * @param cs DOCUMENT ME!
\r
1707 public void changeColour(ColourSchemeI cs)
\r
1709 int threshold = 0;
\r
1713 if (viewport.getAbovePIDThreshold())
\r
1715 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1718 cs.setThreshold(threshold,
\r
1719 viewport.getIgnoreGapsConsensus());
\r
1721 viewport.setGlobalColourScheme(cs);
\r
1725 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1728 if (viewport.getConservationSelected())
\r
1731 Alignment al = (Alignment) viewport.alignment;
\r
1732 Conservation c = new Conservation("All",
\r
1733 ResidueProperties.propHash, 3,
\r
1734 al.getSequences(), 0,
\r
1735 al.getWidth() - 1);
\r
1738 c.verdict(false, viewport.ConsPercGaps);
\r
1740 cs.setConservation(c);
\r
1742 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1747 cs.setConservation(null);
\r
1750 cs.setConsensus(viewport.vconsensus);
\r
1753 viewport.setGlobalColourScheme(cs);
\r
1755 if (viewport.getColourAppliesToAllGroups())
\r
1757 Vector groups = viewport.alignment.getGroups();
\r
1759 for (int i = 0; i < groups.size(); i++)
\r
1761 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1769 if (cs instanceof ClustalxColourScheme)
\r
1771 sg.cs = new ClustalxColourScheme(
\r
1772 sg.getSequences(true), sg.getWidth());
\r
1774 else if (cs instanceof UserColourScheme)
\r
1776 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1782 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1784 catch (Exception ex)
\r
1789 if (viewport.getAbovePIDThreshold()
\r
1790 || cs instanceof PIDColourScheme
\r
1791 || cs instanceof Blosum62ColourScheme)
\r
1793 sg.cs.setThreshold(threshold,
\r
1794 viewport.getIgnoreGapsConsensus());
\r
1796 sg.cs.setConsensus(AAFrequency.calculate(
\r
1797 sg.getSequences(true), 0,
\r
1801 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1804 if (viewport.getConservationSelected())
\r
1806 Conservation c = new Conservation("Group",
\r
1807 ResidueProperties.propHash, 3,
\r
1808 sg.getSequences(true), 0,
\r
1809 viewport.alignment.getWidth() - 1);
\r
1811 c.verdict(false, viewport.ConsPercGaps);
\r
1812 sg.cs.setConservation(c);
\r
1815 sg.cs.setConservation(null);
\r
1819 if (alignPanel.getOverviewPanel() != null)
\r
1821 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1824 alignPanel.repaint();
\r
1830 * @param e DOCUMENT ME!
\r
1832 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1834 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1836 SliderPanel.setPIDSliderSource(alignPanel,
\r
1837 viewport.getGlobalColourScheme(),
\r
1839 SliderPanel.showPIDSlider();
\r
1846 * @param e DOCUMENT ME!
\r
1848 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1850 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1852 SliderPanel.setConservationSlider(alignPanel,
\r
1853 viewport.globalColourScheme,
\r
1855 SliderPanel.showConservationSlider();
\r
1862 * @param e DOCUMENT ME!
\r
1864 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1866 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1868 viewport.setAbovePIDThreshold(false);
\r
1869 abovePIDThreshold.setSelected(false);
\r
1871 changeColour(viewport.getGlobalColourScheme());
\r
1873 modifyConservation_actionPerformed(null);
\r
1879 * @param e DOCUMENT ME!
\r
1881 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1883 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1885 conservationMenuItem.setSelected(false);
\r
1886 viewport.setConservationSelected(false);
\r
1888 changeColour(viewport.getGlobalColourScheme());
\r
1890 modifyPID_actionPerformed(null);
\r
1896 * @param e DOCUMENT ME!
\r
1898 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1900 if (e.getActionCommand().equals("User Defined..."))
\r
1902 new UserDefinedColours(alignPanel, null);
\r
1906 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1907 getUserColourSchemes().get(e.getActionCommand());
\r
1909 changeColour(udc);
\r
1913 public void updateUserColourMenu()
\r
1916 Component[] menuItems = colourMenu.getMenuComponents();
\r
1917 int i, iSize = menuItems.length;
\r
1918 for (i = 0; i < iSize; i++)
\r
1920 if (menuItems[i].getName() != null &&
\r
1921 menuItems[i].getName().equals("USER_DEFINED"))
\r
1923 colourMenu.remove(menuItems[i]);
\r
1927 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1929 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1930 getUserColourSchemes().keys();
\r
1932 while (userColours.hasMoreElements())
\r
1934 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1935 nextElement().toString());
\r
1936 radioItem.setName("USER_DEFINED");
\r
1937 radioItem.addMouseListener(new MouseAdapter()
\r
1939 public void mousePressed(MouseEvent evt)
\r
1941 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1943 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1945 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1946 "Remove from default list?",
\r
1947 "Remove user defined colour",
\r
1948 JOptionPane.YES_NO_OPTION);
\r
1949 if(option == JOptionPane.YES_OPTION)
\r
1951 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1952 colourMenu.remove(radioItem);
\r
1955 radioItem.addActionListener(new ActionListener()
\r
1957 public void actionPerformed(ActionEvent evt)
\r
1959 userDefinedColour_actionPerformed(evt);
\r
1965 radioItem.addActionListener(new ActionListener()
\r
1967 public void actionPerformed(ActionEvent evt)
\r
1969 userDefinedColour_actionPerformed(evt);
\r
1973 colourMenu.insert(radioItem, 15);
\r
1974 colours.add(radioItem);
\r
1982 * @param e DOCUMENT ME!
\r
1984 public void PIDColour_actionPerformed(ActionEvent e)
\r
1986 changeColour(new PIDColourScheme());
\r
1992 * @param e DOCUMENT ME!
\r
1994 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1996 changeColour(new Blosum62ColourScheme());
\r
2002 * @param e DOCUMENT ME!
\r
2004 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
2006 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
2007 HistoryItem.SORT));
\r
2008 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
2009 viewport.getAlignment().getSequenceAt(0));
\r
2010 alignPanel.repaint();
\r
2016 * @param e DOCUMENT ME!
\r
2018 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
2020 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
2021 HistoryItem.SORT));
\r
2022 AlignmentSorter.sortByID(viewport.getAlignment());
\r
2023 alignPanel.repaint();
\r
2029 * @param e DOCUMENT ME!
\r
2031 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
2033 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
2034 HistoryItem.SORT));
\r
2036 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
2037 alignPanel.repaint();
\r
2043 * @param e DOCUMENT ME!
\r
2045 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
2047 new RedundancyPanel(alignPanel, this);
\r
2054 * @param e DOCUMENT ME!
\r
2056 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
2058 if ( (viewport.getSelectionGroup() == null) ||
\r
2059 (viewport.getSelectionGroup().getSize(false) < 2))
\r
2061 JOptionPane.showInternalMessageDialog(this,
\r
2062 "You must select at least 2 sequences.",
\r
2063 "Invalid Selection",
\r
2064 JOptionPane.WARNING_MESSAGE);
\r
2068 JInternalFrame frame = new JInternalFrame();
\r
2069 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
2070 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
2077 * @param e DOCUMENT ME!
\r
2079 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
2081 if ( ( (viewport.getSelectionGroup() != null) &&
\r
2082 (viewport.getSelectionGroup().getSize(false) < 4) &&
\r
2083 (viewport.getSelectionGroup().getSize(false) > 0)) ||
\r
2084 (viewport.getAlignment().getHeight() < 4))
\r
2086 JOptionPane.showInternalMessageDialog(this,
\r
2087 "Principal component analysis must take\n" +
\r
2088 "at least 4 input sequences.",
\r
2089 "Sequence selection insufficient",
\r
2090 JOptionPane.WARNING_MESSAGE);
\r
2095 new PCAPanel(viewport);
\r
2099 public void autoCalculate_actionPerformed(ActionEvent e)
\r
2101 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
2102 if(viewport.autoCalculateConsensus)
\r
2104 alignmentChanged();
\r
2112 * @param e DOCUMENT ME!
\r
2114 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
2116 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2122 * @param e DOCUMENT ME!
\r
2124 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2126 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2132 * @param e DOCUMENT ME!
\r
2134 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2136 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2142 * @param e DOCUMENT ME!
\r
2144 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2146 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2152 * @param type DOCUMENT ME!
\r
2153 * @param pwType DOCUMENT ME!
\r
2154 * @param title DOCUMENT ME!
\r
2156 void NewTreePanel(String type, String pwType, String title)
\r
2160 if ( (viewport.getSelectionGroup() != null) &&
\r
2161 (viewport.getSelectionGroup().getSize(false) > 3))
\r
2164 SequenceGroup sg = viewport.getSelectionGroup();
\r
2166 /* Decide if the selection is a column region */
\r
2167 while (s < sg.getSize(false))
\r
2169 if ( ( (SequenceI) sg.getSequences(false).elementAt(s++)).getLength() <
\r
2172 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2173 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2174 "Try using the Pad function in the edit menu,\n" +
\r
2175 "or one of the multiple sequence alignment web services.",
\r
2176 "Sequences in selection are not aligned",
\r
2177 JOptionPane.WARNING_MESSAGE);
\r
2183 title = title + " on region";
\r
2184 tp = new TreePanel(viewport, type, pwType);
\r
2188 //are the sequences aligned?
\r
2189 if (!viewport.alignment.isAligned())
\r
2191 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2192 "The sequences must be aligned before creating a tree.\n" +
\r
2193 "Try using the Pad function in the edit menu,\n" +
\r
2194 "or one of the multiple sequence alignment web services.",
\r
2195 "Sequences not aligned",
\r
2196 JOptionPane.WARNING_MESSAGE);
\r
2201 tp = new TreePanel(viewport, type, pwType);
\r
2204 addTreeMenuItem(tp, title);
\r
2206 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2212 * @param title DOCUMENT ME!
\r
2213 * @param order DOCUMENT ME!
\r
2215 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2217 final JMenuItem item = new JMenuItem("by " + title);
\r
2219 item.addActionListener(new java.awt.event.ActionListener()
\r
2221 public void actionPerformed(ActionEvent e)
\r
2223 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2224 HistoryItem.SORT));
\r
2226 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2227 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2228 alignPanel.repaint();
\r
2234 * Maintain the Order by->Displayed Tree menu.
\r
2235 * Creates a new menu item for a TreePanel with an appropriate
\r
2236 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2237 * to remove the menu item when the treePanel is closed, and adjust
\r
2238 * the tree leaf to sequence mapping when the alignment is modified.
\r
2239 * @param treePanel Displayed tree window.
\r
2240 * @param title SortBy menu item title.
\r
2242 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2244 final JMenuItem item = new JMenuItem(title);
\r
2248 if (treeCount == 1)
\r
2250 sort.add(sortByTreeMenu);
\r
2253 sortByTreeMenu.add(item);
\r
2254 item.addActionListener(new java.awt.event.ActionListener()
\r
2256 public void actionPerformed(ActionEvent e)
\r
2258 addHistoryItem(new HistoryItem("Tree Sort",
\r
2259 viewport.alignment, HistoryItem.SORT));
\r
2260 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2261 treePanel.getTree());
\r
2262 alignPanel.repaint();
\r
2266 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2267 InternalFrameAdapter()
\r
2269 public void internalFrameClosed(
\r
2270 javax.swing.event.InternalFrameEvent evt)
\r
2273 sortByTreeMenu.remove(item);
\r
2275 if (treeCount == 0)
\r
2277 sort.remove(sortByTreeMenu);
\r
2285 * Work out whether the whole set of sequences
\r
2286 * or just the selected set will be submitted for multiple alignment.
\r
2289 private SequenceI[] gatherSequencesForAlignment()
\r
2291 // Now, check we have enough sequences
\r
2292 SequenceI[] msa = null;
\r
2294 if ( (viewport.getSelectionGroup() != null) &&
\r
2295 (viewport.getSelectionGroup().getSize(false) > 1))
\r
2297 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2298 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2300 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2302 for (int i = 0; i < sz; i++)
\r
2304 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2309 Vector seqs = viewport.getAlignment().getSequences();
\r
2311 if (seqs.size() > 1)
\r
2313 msa = new SequenceI[seqs.size()];
\r
2315 for (int i = 0; i < seqs.size(); i++)
\r
2317 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2325 * Decides what is submitted to a secondary structure prediction service,
\r
2326 * the currently selected sequence, or the currently selected alignment
\r
2327 * (where the first sequence in the set is the one that the prediction
\r
2330 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2332 SequenceI seq = null;
\r
2333 SequenceI[] msa = null;
\r
2335 if ( (viewport.getSelectionGroup() != null) &&
\r
2336 (viewport.getSelectionGroup().getSize(false) > 0))
\r
2338 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2339 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2341 if ( (seqs.getSize(false) == 1) || !viewport.alignment.isAligned())
\r
2343 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2348 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2350 for (int i = 0; i < sz; i++)
\r
2352 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2358 Vector seqs = viewport.getAlignment().getSequences();
\r
2360 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2362 seq = (SequenceI) seqs.elementAt(0);
\r
2366 msa = new SequenceI[seqs.size()];
\r
2368 for (int i = 0; i < seqs.size(); i++)
\r
2370 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2382 return new SequenceI[]
\r
2392 * @param e DOCUMENT ME!
\r
2394 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2396 // Pick the tree file
\r
2397 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2399 "LAST_DIRECTORY"));
\r
2400 chooser.setFileView(new JalviewFileView());
\r
2401 chooser.setDialogTitle("Select a newick-like tree file");
\r
2402 chooser.setToolTipText("Load a tree file");
\r
2404 int value = chooser.showOpenDialog(null);
\r
2406 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2408 String choice = chooser.getSelectedFile().getPath();
\r
2409 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2413 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2415 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2417 catch (Exception ex)
\r
2419 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2420 "Problem reading tree file",
\r
2422 JOptionPane.WARNING_MESSAGE);
\r
2423 ex.printStackTrace();
\r
2429 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2431 return ShowNewickTree(nf,title,600,500,4,5);
\r
2436 * @param nf DOCUMENT ME!
\r
2437 * @param title DOCUMENT ME!
\r
2439 * @return DOCUMENT ME!
\r
2441 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2443 TreePanel tp = null;
\r
2449 if (nf.getTree() != null)
\r
2451 tp = new TreePanel(viewport,
\r
2459 tp.setLocation(x,y);
\r
2462 Desktop.addInternalFrame(tp, title, w, h);
\r
2463 addTreeMenuItem(tp, title);
\r
2466 catch (Exception ex)
\r
2468 ex.printStackTrace();
\r
2479 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2480 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2481 printJob.setPrintable(alignPanel, pf);
\r
2483 if (printJob.printDialog())
\r
2489 catch (Exception PrintException)
\r
2491 PrintException.printStackTrace();
\r
2498 * Generates menu items and listener event actions for web service clients
\r
2501 public void BuildWebServiceMenu()
\r
2503 if ( (Discoverer.services != null)
\r
2504 && (Discoverer.services.size() > 0))
\r
2506 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2507 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2508 Vector wsmenu = new Vector();
\r
2509 if (msaws != null)
\r
2511 // Add any Multiple Sequence Alignment Services
\r
2512 final JMenu msawsmenu = new JMenu("Alignment");
\r
2513 final AlignFrame af = this;
\r
2514 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2516 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2518 final JMenuItem method = new JMenuItem(sh.getName());
\r
2519 method.addActionListener(new ActionListener()
\r
2521 public void actionPerformed(ActionEvent e)
\r
2523 SequenceI[] msa = gatherSequencesForAlignment();
\r
2524 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2525 false, true, viewport.getAlignment().getDataset(), af);
\r
2530 msawsmenu.add(method);
\r
2531 // Deal with services that we know accept partial alignments.
\r
2532 if (sh.getName().indexOf("lustal") > -1)
\r
2534 // We know that ClustalWS can accept partial alignments for refinement.
\r
2535 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2536 methodR.addActionListener(new ActionListener()
\r
2538 public void actionPerformed(ActionEvent e)
\r
2540 SequenceI[] msa = gatherSequencesForAlignment();
\r
2541 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2542 true, true, viewport.getAlignment().getDataset(), af);
\r
2547 msawsmenu.add(methodR);
\r
2551 wsmenu.add(msawsmenu);
\r
2553 if (secstrpr != null)
\r
2555 // Add any secondary structure prediction services
\r
2556 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2557 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2559 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2561 final JMenuItem method = new JMenuItem(sh.getName());
\r
2562 method.addActionListener(new ActionListener()
\r
2564 public void actionPerformed(ActionEvent e)
\r
2566 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2567 if (msa.length == 1)
\r
2569 // Single Sequence prediction
\r
2570 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2574 if (msa.length > 1)
\r
2576 // Single Sequence prediction
\r
2577 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2583 secstrmenu.add(method);
\r
2585 wsmenu.add(secstrmenu);
\r
2587 this.webService.removeAll();
\r
2588 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2590 webService.add( (JMenu) wsmenu.get(i));
\r
2595 this.webService.removeAll();
\r
2596 this.webService.add(this.webServiceNoServices);
\r
2598 // TODO: add in rediscovery function
\r
2599 // TODO: reduce code redundancy.
\r
2600 // TODO: group services by location as well as function.
\r
2603 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2605 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2606 getProperty("LAST_DIRECTORY"));
\r
2608 chooser.setFileView(new JalviewFileView());
\r
2609 chooser.setDialogTitle("Export to Vamsas file");
\r
2610 chooser.setToolTipText("Export");
\r
2612 int value = chooser.showSaveDialog(this);
\r
2614 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2616 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2617 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2618 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2625 public void showTranslation_actionPerformed(ActionEvent e)
\r
2627 SequenceI [] selection = viewport.getSelectionAsNewSequence();
\r
2628 String [] seqstring = viewport.getViewAsString(true);
\r
2630 int s, sSize = selection.length;
\r
2631 SequenceI [] newSeq = new SequenceI[sSize];
\r
2634 StringBuffer protein;
\r
2636 for(s=0; s<sSize; s++)
\r
2638 protein = new StringBuffer();
\r
2639 seq = AlignSeq.extractGaps("-. ", seqstring[s]);
\r
2640 resSize = seq.length();
\r
2641 resSize -= resSize%3;
\r
2643 for(res = 0; res < resSize; res+=3)
\r
2645 String codon = seq.substring(res, res+3);
\r
2646 codon = codon.replace('U', 'T');
\r
2647 String aa = ResidueProperties.codonTranslate(codon);
\r
2649 protein.append(viewport.getGapCharacter());
\r
2650 else if(aa.equals("STOP"))
\r
2651 protein.append("X");
\r
2653 protein.append( aa );
\r
2655 newSeq[s] = new Sequence(selection[s].getName(),
\r
2656 protein.toString());
\r
2660 AlignmentI al = new Alignment(newSeq);
\r
2661 al.setDataset(null);
\r
2664 ////////////////////////////////
\r
2665 // Copy annotations across
\r
2666 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2667 = viewport.alignment.getAlignmentAnnotation();
\r
2669 if(annotations!=null)
\r
2671 for (int i = 0; i < annotations.length; i++)
\r
2673 if (annotations[i].label.equals("Quality") ||
\r
2674 annotations[i].label.equals("Conservation") ||
\r
2675 annotations[i].label.equals("Consensus"))
\r
2680 aSize = viewport.alignment.getWidth() / 3;
\r
2681 jalview.datamodel.Annotation[] anots =
\r
2682 new jalview.datamodel.Annotation[aSize];
\r
2684 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2686 if (annotations[i].annotations[a] == null
\r
2687 || annotations[i].annotations[a] == null)
\r
2690 anots[a / 3] = new Annotation(
\r
2691 annotations[i].annotations[a].displayCharacter,
\r
2692 annotations[i].annotations[a].description,
\r
2693 annotations[i].annotations[a].secondaryStructure,
\r
2694 annotations[i].annotations[a].value,
\r
2695 annotations[i].annotations[a].colour);
\r
2698 jalview.datamodel.AlignmentAnnotation aa
\r
2699 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2700 annotations[i].description, anots);
\r
2701 al.addAnnotation(aa);
\r
2705 AlignFrame af = new AlignFrame(al);
\r
2706 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2708 NEW_WINDOW_HEIGHT);
\r
2711 // AlignViewport newViewport = new AlignViewport(al);
\r
2712 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2713 // tabbedPane.add("Protein", ap);
\r
2714 // viewports.add(newViewport);
\r
2715 // alignPanels.add(ap);
\r
2718 /////////////////////////
\r
2720 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2721 // ds.setDataset(true);
\r
2722 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2723 // tabbedPane.add("Dataset", dap);
\r
2724 // viewports.add(ds);
\r
2725 // alignPanels.add(dap);
\r
2726 /////////////////////////
\r
2731 /*public void tabSelected()
\r
2733 int index = tabbedPane.getSelectedIndex();
\r
2734 viewport = (AlignViewport)viewports.elementAt(index);
\r
2735 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2741 * @param String DOCUMENT ME!
\r
2743 public boolean parseFeaturesFile(String file, String type)
\r
2745 boolean featuresFile = false;
\r
2747 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment.getDataset(),
\r
2748 alignPanel.seqPanel.seqCanvas.
\r
2749 getFeatureRenderer().featureColours,
\r
2752 catch(Exception ex)
\r
2754 ex.printStackTrace();
\r
2759 viewport.showSequenceFeatures = true;
\r
2760 showSeqFeatures.setSelected(true);
\r
2761 alignPanel.repaint();
\r
2764 return featuresFile;
\r
2767 public void dragEnter(DropTargetDragEvent evt)
\r
2770 public void dragExit(DropTargetEvent evt)
\r
2773 public void dragOver(DropTargetDragEvent evt)
\r
2776 public void dropActionChanged(DropTargetDragEvent evt)
\r
2779 public void drop(DropTargetDropEvent evt)
\r
2781 Transferable t = evt.getTransferable();
\r
2782 java.util.List files = null;
\r
2786 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2787 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2789 //Works on Windows and MacOSX
\r
2790 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2791 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2793 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2795 // This is used by Unix drag system
\r
2796 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2797 String data = (String) t.getTransferData(uriListFlavor);
\r
2798 files = new java.util.ArrayList(1);
\r
2799 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2802 st.hasMoreTokens(); )
\r
2804 String s = st.nextToken();
\r
2805 if (s.startsWith("#"))
\r
2807 // the line is a comment (as per the RFC 2483)
\r
2811 java.net.URI uri = new java.net.URI(s);
\r
2812 java.io.File file = new java.io.File(uri);
\r
2817 catch (Exception e)
\r
2819 e.printStackTrace();
\r
2821 if (files != null)
\r
2826 for (int i = 0; i < files.size(); i++)
\r
2828 loadJalviewDataFile(files.get(i).toString());
\r
2831 catch (Exception ex)
\r
2833 ex.printStackTrace();
\r
2838 // This method will attempt to load a "dropped" file first by testing
\r
2839 // whether its and Annotation file, then features file. If both are
\r
2840 // false then the user may have dropped an alignment file onto this
\r
2842 public void loadJalviewDataFile(String file)
\r
2845 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
\r
2848 if (!isAnnotation)
\r
2850 boolean isGroupsFile = parseFeaturesFile(file,
\r
2851 AppletFormatAdapter.FILE);
\r
2852 if (!isGroupsFile)
\r
2854 String format = new IdentifyFile().Identify(file, FormatAdapter.FILE);
\r
2855 new FileLoader().LoadFile(viewport, file, FormatAdapter.FILE, format);
\r
2861 alignPanel.adjustAnnotationHeight();
\r
2864 }catch(Exception ex)
\r
2866 ex.printStackTrace();
\r