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
1435 alignPanel.repaint();
\r
1438 public void hideSelColumns_actionPerformed(ActionEvent e)
\r
1440 viewport.hideSelectedColumns();
\r
1441 alignPanel.repaint();
\r
1444 public void hiddenMarkers_actionPerformed(ActionEvent e)
\r
1446 viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
\r
1453 * @param e DOCUMENT ME!
\r
1455 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1457 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1458 alignPanel.repaint();
\r
1464 * @param e DOCUMENT ME!
\r
1466 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1468 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1469 alignPanel.repaint();
\r
1475 * @param e DOCUMENT ME!
\r
1477 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1479 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1480 alignPanel.repaint();
\r
1486 * @param e DOCUMENT ME!
\r
1488 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1490 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1491 alignPanel.repaint();
\r
1497 * @param e DOCUMENT ME!
\r
1499 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1501 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1502 alignPanel.repaint();
\r
1508 * @param e DOCUMENT ME!
\r
1510 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1512 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1513 alignPanel.repaint();
\r
1517 FeatureSettings featureSettings;
\r
1518 public void featureSettings_actionPerformed(ActionEvent e)
\r
1520 if(featureSettings !=null )
\r
1522 featureSettings.close();
\r
1523 featureSettings = null;
\r
1525 featureSettings = new FeatureSettings(this);
\r
1531 * @param evt DOCUMENT ME!
\r
1533 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1535 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1536 alignPanel.repaint();
\r
1537 if (alignPanel.getOverviewPanel() != null)
\r
1539 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1546 * @param e DOCUMENT ME!
\r
1548 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1550 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1551 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1557 * @param e DOCUMENT ME!
\r
1559 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1561 if (alignPanel.overviewPanel != null)
\r
1566 JInternalFrame frame = new JInternalFrame();
\r
1567 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1568 frame.setContentPane(overview);
\r
1569 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1570 frame.getWidth(), frame.getHeight());
\r
1572 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1573 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1575 public void internalFrameClosed(
\r
1576 javax.swing.event.InternalFrameEvent evt)
\r
1578 alignPanel.setOverviewPanel(null);
\r
1583 alignPanel.setOverviewPanel(overview);
\r
1589 * @param e DOCUMENT ME!
\r
1591 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1593 changeColour(null);
\r
1599 * @param e DOCUMENT ME!
\r
1601 public void clustalColour_actionPerformed(ActionEvent e)
\r
1603 changeColour(new ClustalxColourScheme(
\r
1604 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1610 * @param e DOCUMENT ME!
\r
1612 public void zappoColour_actionPerformed(ActionEvent e)
\r
1614 changeColour(new ZappoColourScheme());
\r
1620 * @param e DOCUMENT ME!
\r
1622 public void taylorColour_actionPerformed(ActionEvent e)
\r
1624 changeColour(new TaylorColourScheme());
\r
1630 * @param e DOCUMENT ME!
\r
1632 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1634 changeColour(new HydrophobicColourScheme());
\r
1640 * @param e DOCUMENT ME!
\r
1642 public void helixColour_actionPerformed(ActionEvent e)
\r
1644 changeColour(new HelixColourScheme());
\r
1650 * @param e DOCUMENT ME!
\r
1652 public void strandColour_actionPerformed(ActionEvent e)
\r
1654 changeColour(new StrandColourScheme());
\r
1660 * @param e DOCUMENT ME!
\r
1662 public void turnColour_actionPerformed(ActionEvent e)
\r
1664 changeColour(new TurnColourScheme());
\r
1670 * @param e DOCUMENT ME!
\r
1672 public void buriedColour_actionPerformed(ActionEvent e)
\r
1674 changeColour(new BuriedColourScheme());
\r
1680 * @param e DOCUMENT ME!
\r
1682 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1684 changeColour(new NucleotideColourScheme());
\r
1687 public void annotationColour_actionPerformed(ActionEvent e)
\r
1689 new AnnotationColourChooser(viewport, alignPanel);
\r
1696 * @param e DOCUMENT ME!
\r
1698 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1700 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1706 * @param cs DOCUMENT ME!
\r
1708 public void changeColour(ColourSchemeI cs)
\r
1710 int threshold = 0;
\r
1714 if (viewport.getAbovePIDThreshold())
\r
1716 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1719 cs.setThreshold(threshold,
\r
1720 viewport.getIgnoreGapsConsensus());
\r
1722 viewport.setGlobalColourScheme(cs);
\r
1726 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1729 if (viewport.getConservationSelected())
\r
1732 Alignment al = (Alignment) viewport.alignment;
\r
1733 Conservation c = new Conservation("All",
\r
1734 ResidueProperties.propHash, 3,
\r
1735 al.getSequences(), 0,
\r
1736 al.getWidth() - 1);
\r
1739 c.verdict(false, viewport.ConsPercGaps);
\r
1741 cs.setConservation(c);
\r
1743 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1748 cs.setConservation(null);
\r
1751 cs.setConsensus(viewport.vconsensus);
\r
1754 viewport.setGlobalColourScheme(cs);
\r
1756 if (viewport.getColourAppliesToAllGroups())
\r
1758 Vector groups = viewport.alignment.getGroups();
\r
1760 for (int i = 0; i < groups.size(); i++)
\r
1762 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1770 if (cs instanceof ClustalxColourScheme)
\r
1772 sg.cs = new ClustalxColourScheme(
\r
1773 sg.getSequences(true), sg.getWidth());
\r
1775 else if (cs instanceof UserColourScheme)
\r
1777 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1783 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1785 catch (Exception ex)
\r
1790 if (viewport.getAbovePIDThreshold()
\r
1791 || cs instanceof PIDColourScheme
\r
1792 || cs instanceof Blosum62ColourScheme)
\r
1794 sg.cs.setThreshold(threshold,
\r
1795 viewport.getIgnoreGapsConsensus());
\r
1797 sg.cs.setConsensus(AAFrequency.calculate(
\r
1798 sg.getSequences(true), 0,
\r
1802 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1805 if (viewport.getConservationSelected())
\r
1807 Conservation c = new Conservation("Group",
\r
1808 ResidueProperties.propHash, 3,
\r
1809 sg.getSequences(true), 0,
\r
1810 viewport.alignment.getWidth() - 1);
\r
1812 c.verdict(false, viewport.ConsPercGaps);
\r
1813 sg.cs.setConservation(c);
\r
1816 sg.cs.setConservation(null);
\r
1820 if (alignPanel.getOverviewPanel() != null)
\r
1822 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1825 alignPanel.repaint();
\r
1831 * @param e DOCUMENT ME!
\r
1833 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1835 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1837 SliderPanel.setPIDSliderSource(alignPanel,
\r
1838 viewport.getGlobalColourScheme(),
\r
1840 SliderPanel.showPIDSlider();
\r
1847 * @param e DOCUMENT ME!
\r
1849 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1851 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1853 SliderPanel.setConservationSlider(alignPanel,
\r
1854 viewport.globalColourScheme,
\r
1856 SliderPanel.showConservationSlider();
\r
1863 * @param e DOCUMENT ME!
\r
1865 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1867 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1869 viewport.setAbovePIDThreshold(false);
\r
1870 abovePIDThreshold.setSelected(false);
\r
1872 changeColour(viewport.getGlobalColourScheme());
\r
1874 modifyConservation_actionPerformed(null);
\r
1880 * @param e DOCUMENT ME!
\r
1882 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1884 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1886 conservationMenuItem.setSelected(false);
\r
1887 viewport.setConservationSelected(false);
\r
1889 changeColour(viewport.getGlobalColourScheme());
\r
1891 modifyPID_actionPerformed(null);
\r
1897 * @param e DOCUMENT ME!
\r
1899 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1901 if (e.getActionCommand().equals("User Defined..."))
\r
1903 new UserDefinedColours(alignPanel, null);
\r
1907 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1908 getUserColourSchemes().get(e.getActionCommand());
\r
1910 changeColour(udc);
\r
1914 public void updateUserColourMenu()
\r
1917 Component[] menuItems = colourMenu.getMenuComponents();
\r
1918 int i, iSize = menuItems.length;
\r
1919 for (i = 0; i < iSize; i++)
\r
1921 if (menuItems[i].getName() != null &&
\r
1922 menuItems[i].getName().equals("USER_DEFINED"))
\r
1924 colourMenu.remove(menuItems[i]);
\r
1928 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1930 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1931 getUserColourSchemes().keys();
\r
1933 while (userColours.hasMoreElements())
\r
1935 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1936 nextElement().toString());
\r
1937 radioItem.setName("USER_DEFINED");
\r
1938 radioItem.addMouseListener(new MouseAdapter()
\r
1940 public void mousePressed(MouseEvent evt)
\r
1942 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1944 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1946 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1947 "Remove from default list?",
\r
1948 "Remove user defined colour",
\r
1949 JOptionPane.YES_NO_OPTION);
\r
1950 if(option == JOptionPane.YES_OPTION)
\r
1952 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1953 colourMenu.remove(radioItem);
\r
1956 radioItem.addActionListener(new ActionListener()
\r
1958 public void actionPerformed(ActionEvent evt)
\r
1960 userDefinedColour_actionPerformed(evt);
\r
1966 radioItem.addActionListener(new ActionListener()
\r
1968 public void actionPerformed(ActionEvent evt)
\r
1970 userDefinedColour_actionPerformed(evt);
\r
1974 colourMenu.insert(radioItem, 15);
\r
1975 colours.add(radioItem);
\r
1983 * @param e DOCUMENT ME!
\r
1985 public void PIDColour_actionPerformed(ActionEvent e)
\r
1987 changeColour(new PIDColourScheme());
\r
1993 * @param e DOCUMENT ME!
\r
1995 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1997 changeColour(new Blosum62ColourScheme());
\r
2003 * @param e DOCUMENT ME!
\r
2005 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
2007 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
2008 HistoryItem.SORT));
\r
2009 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
2010 viewport.getAlignment().getSequenceAt(0));
\r
2011 alignPanel.repaint();
\r
2017 * @param e DOCUMENT ME!
\r
2019 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
2021 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
2022 HistoryItem.SORT));
\r
2023 AlignmentSorter.sortByID(viewport.getAlignment());
\r
2024 alignPanel.repaint();
\r
2030 * @param e DOCUMENT ME!
\r
2032 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
2034 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
2035 HistoryItem.SORT));
\r
2037 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
2038 alignPanel.repaint();
\r
2044 * @param e DOCUMENT ME!
\r
2046 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
2048 new RedundancyPanel(alignPanel, this);
\r
2055 * @param e DOCUMENT ME!
\r
2057 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
2059 if ( (viewport.getSelectionGroup() == null) ||
\r
2060 (viewport.getSelectionGroup().getSize(false) < 2))
\r
2062 JOptionPane.showInternalMessageDialog(this,
\r
2063 "You must select at least 2 sequences.",
\r
2064 "Invalid Selection",
\r
2065 JOptionPane.WARNING_MESSAGE);
\r
2069 JInternalFrame frame = new JInternalFrame();
\r
2070 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
2071 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
2078 * @param e DOCUMENT ME!
\r
2080 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
2082 if ( ( (viewport.getSelectionGroup() != null) &&
\r
2083 (viewport.getSelectionGroup().getSize(false) < 4) &&
\r
2084 (viewport.getSelectionGroup().getSize(false) > 0)) ||
\r
2085 (viewport.getAlignment().getHeight() < 4))
\r
2087 JOptionPane.showInternalMessageDialog(this,
\r
2088 "Principal component analysis must take\n" +
\r
2089 "at least 4 input sequences.",
\r
2090 "Sequence selection insufficient",
\r
2091 JOptionPane.WARNING_MESSAGE);
\r
2096 new PCAPanel(viewport);
\r
2100 public void autoCalculate_actionPerformed(ActionEvent e)
\r
2102 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
2103 if(viewport.autoCalculateConsensus)
\r
2105 alignmentChanged();
\r
2113 * @param e DOCUMENT ME!
\r
2115 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
2117 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2123 * @param e DOCUMENT ME!
\r
2125 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2127 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2133 * @param e DOCUMENT ME!
\r
2135 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2137 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2143 * @param e DOCUMENT ME!
\r
2145 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2147 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2153 * @param type DOCUMENT ME!
\r
2154 * @param pwType DOCUMENT ME!
\r
2155 * @param title DOCUMENT ME!
\r
2157 void NewTreePanel(String type, String pwType, String title)
\r
2161 if ( (viewport.getSelectionGroup() != null) &&
\r
2162 (viewport.getSelectionGroup().getSize(false) > 3))
\r
2165 SequenceGroup sg = viewport.getSelectionGroup();
\r
2167 /* Decide if the selection is a column region */
\r
2168 while (s < sg.getSize(false))
\r
2170 if ( ( (SequenceI) sg.getSequences(false).elementAt(s++)).getLength() <
\r
2173 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2174 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2175 "Try using the Pad function in the edit menu,\n" +
\r
2176 "or one of the multiple sequence alignment web services.",
\r
2177 "Sequences in selection are not aligned",
\r
2178 JOptionPane.WARNING_MESSAGE);
\r
2184 title = title + " on region";
\r
2185 tp = new TreePanel(viewport, type, pwType);
\r
2189 //are the sequences aligned?
\r
2190 if (!viewport.alignment.isAligned())
\r
2192 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2193 "The sequences must be aligned before creating a tree.\n" +
\r
2194 "Try using the Pad function in the edit menu,\n" +
\r
2195 "or one of the multiple sequence alignment web services.",
\r
2196 "Sequences not aligned",
\r
2197 JOptionPane.WARNING_MESSAGE);
\r
2202 tp = new TreePanel(viewport, type, pwType);
\r
2205 addTreeMenuItem(tp, title);
\r
2207 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2213 * @param title DOCUMENT ME!
\r
2214 * @param order DOCUMENT ME!
\r
2216 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2218 final JMenuItem item = new JMenuItem("by " + title);
\r
2220 item.addActionListener(new java.awt.event.ActionListener()
\r
2222 public void actionPerformed(ActionEvent e)
\r
2224 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2225 HistoryItem.SORT));
\r
2227 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2228 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2229 alignPanel.repaint();
\r
2235 * Maintain the Order by->Displayed Tree menu.
\r
2236 * Creates a new menu item for a TreePanel with an appropriate
\r
2237 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2238 * to remove the menu item when the treePanel is closed, and adjust
\r
2239 * the tree leaf to sequence mapping when the alignment is modified.
\r
2240 * @param treePanel Displayed tree window.
\r
2241 * @param title SortBy menu item title.
\r
2243 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2245 final JMenuItem item = new JMenuItem(title);
\r
2249 if (treeCount == 1)
\r
2251 sort.add(sortByTreeMenu);
\r
2254 sortByTreeMenu.add(item);
\r
2255 item.addActionListener(new java.awt.event.ActionListener()
\r
2257 public void actionPerformed(ActionEvent e)
\r
2259 addHistoryItem(new HistoryItem("Tree Sort",
\r
2260 viewport.alignment, HistoryItem.SORT));
\r
2261 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2262 treePanel.getTree());
\r
2263 alignPanel.repaint();
\r
2267 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2268 InternalFrameAdapter()
\r
2270 public void internalFrameClosed(
\r
2271 javax.swing.event.InternalFrameEvent evt)
\r
2274 sortByTreeMenu.remove(item);
\r
2276 if (treeCount == 0)
\r
2278 sort.remove(sortByTreeMenu);
\r
2286 * Work out whether the whole set of sequences
\r
2287 * or just the selected set will be submitted for multiple alignment.
\r
2290 private SequenceI[] gatherSequencesForAlignment()
\r
2292 // Now, check we have enough sequences
\r
2293 SequenceI[] msa = null;
\r
2295 if ( (viewport.getSelectionGroup() != null) &&
\r
2296 (viewport.getSelectionGroup().getSize(false) > 1))
\r
2298 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2299 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2301 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2303 for (int i = 0; i < sz; i++)
\r
2305 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2310 Vector seqs = viewport.getAlignment().getSequences();
\r
2312 if (seqs.size() > 1)
\r
2314 msa = new SequenceI[seqs.size()];
\r
2316 for (int i = 0; i < seqs.size(); i++)
\r
2318 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2326 * Decides what is submitted to a secondary structure prediction service,
\r
2327 * the currently selected sequence, or the currently selected alignment
\r
2328 * (where the first sequence in the set is the one that the prediction
\r
2331 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2333 SequenceI seq = null;
\r
2334 SequenceI[] msa = null;
\r
2336 if ( (viewport.getSelectionGroup() != null) &&
\r
2337 (viewport.getSelectionGroup().getSize(false) > 0))
\r
2339 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2340 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2342 if ( (seqs.getSize(false) == 1) || !viewport.alignment.isAligned())
\r
2344 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2349 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2351 for (int i = 0; i < sz; i++)
\r
2353 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2359 Vector seqs = viewport.getAlignment().getSequences();
\r
2361 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2363 seq = (SequenceI) seqs.elementAt(0);
\r
2367 msa = new SequenceI[seqs.size()];
\r
2369 for (int i = 0; i < seqs.size(); i++)
\r
2371 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2383 return new SequenceI[]
\r
2393 * @param e DOCUMENT ME!
\r
2395 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2397 // Pick the tree file
\r
2398 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2400 "LAST_DIRECTORY"));
\r
2401 chooser.setFileView(new JalviewFileView());
\r
2402 chooser.setDialogTitle("Select a newick-like tree file");
\r
2403 chooser.setToolTipText("Load a tree file");
\r
2405 int value = chooser.showOpenDialog(null);
\r
2407 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2409 String choice = chooser.getSelectedFile().getPath();
\r
2410 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2414 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2416 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2418 catch (Exception ex)
\r
2420 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2421 "Problem reading tree file",
\r
2423 JOptionPane.WARNING_MESSAGE);
\r
2424 ex.printStackTrace();
\r
2430 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2432 return ShowNewickTree(nf,title,600,500,4,5);
\r
2437 * @param nf DOCUMENT ME!
\r
2438 * @param title DOCUMENT ME!
\r
2440 * @return DOCUMENT ME!
\r
2442 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2444 TreePanel tp = null;
\r
2450 if (nf.getTree() != null)
\r
2452 tp = new TreePanel(viewport,
\r
2460 tp.setLocation(x,y);
\r
2463 Desktop.addInternalFrame(tp, title, w, h);
\r
2464 addTreeMenuItem(tp, title);
\r
2467 catch (Exception ex)
\r
2469 ex.printStackTrace();
\r
2480 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2481 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2482 printJob.setPrintable(alignPanel, pf);
\r
2484 if (printJob.printDialog())
\r
2490 catch (Exception PrintException)
\r
2492 PrintException.printStackTrace();
\r
2499 * Generates menu items and listener event actions for web service clients
\r
2502 public void BuildWebServiceMenu()
\r
2504 if ( (Discoverer.services != null)
\r
2505 && (Discoverer.services.size() > 0))
\r
2507 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2508 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2509 Vector wsmenu = new Vector();
\r
2510 if (msaws != null)
\r
2512 // Add any Multiple Sequence Alignment Services
\r
2513 final JMenu msawsmenu = new JMenu("Alignment");
\r
2514 final AlignFrame af = this;
\r
2515 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2517 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2519 final JMenuItem method = new JMenuItem(sh.getName());
\r
2520 method.addActionListener(new ActionListener()
\r
2522 public void actionPerformed(ActionEvent e)
\r
2524 SequenceI[] msa = gatherSequencesForAlignment();
\r
2525 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2526 false, true, viewport.getAlignment().getDataset(), af);
\r
2531 msawsmenu.add(method);
\r
2532 // Deal with services that we know accept partial alignments.
\r
2533 if (sh.getName().indexOf("lustal") > -1)
\r
2535 // We know that ClustalWS can accept partial alignments for refinement.
\r
2536 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2537 methodR.addActionListener(new ActionListener()
\r
2539 public void actionPerformed(ActionEvent e)
\r
2541 SequenceI[] msa = gatherSequencesForAlignment();
\r
2542 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2543 true, true, viewport.getAlignment().getDataset(), af);
\r
2548 msawsmenu.add(methodR);
\r
2552 wsmenu.add(msawsmenu);
\r
2554 if (secstrpr != null)
\r
2556 // Add any secondary structure prediction services
\r
2557 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2558 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2560 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2562 final JMenuItem method = new JMenuItem(sh.getName());
\r
2563 method.addActionListener(new ActionListener()
\r
2565 public void actionPerformed(ActionEvent e)
\r
2567 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2568 if (msa.length == 1)
\r
2570 // Single Sequence prediction
\r
2571 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2575 if (msa.length > 1)
\r
2577 // Single Sequence prediction
\r
2578 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2584 secstrmenu.add(method);
\r
2586 wsmenu.add(secstrmenu);
\r
2588 this.webService.removeAll();
\r
2589 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2591 webService.add( (JMenu) wsmenu.get(i));
\r
2596 this.webService.removeAll();
\r
2597 this.webService.add(this.webServiceNoServices);
\r
2599 // TODO: add in rediscovery function
\r
2600 // TODO: reduce code redundancy.
\r
2601 // TODO: group services by location as well as function.
\r
2604 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2606 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2607 getProperty("LAST_DIRECTORY"));
\r
2609 chooser.setFileView(new JalviewFileView());
\r
2610 chooser.setDialogTitle("Export to Vamsas file");
\r
2611 chooser.setToolTipText("Export");
\r
2613 int value = chooser.showSaveDialog(this);
\r
2615 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2617 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2618 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2619 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2626 public void showTranslation_actionPerformed(ActionEvent e)
\r
2628 SequenceI [] selection = viewport.getSelectionAsNewSequence();
\r
2629 String [] seqstring = viewport.getViewAsString(true);
\r
2631 int s, sSize = selection.length;
\r
2632 SequenceI [] newSeq = new SequenceI[sSize];
\r
2635 StringBuffer protein;
\r
2637 for(s=0; s<sSize; s++)
\r
2639 protein = new StringBuffer();
\r
2640 seq = AlignSeq.extractGaps("-. ", seqstring[s]);
\r
2641 resSize = seq.length();
\r
2642 resSize -= resSize%3;
\r
2644 for(res = 0; res < resSize; res+=3)
\r
2646 String codon = seq.substring(res, res+3);
\r
2647 codon = codon.replace('U', 'T');
\r
2648 String aa = ResidueProperties.codonTranslate(codon);
\r
2650 protein.append(viewport.getGapCharacter());
\r
2651 else if(aa.equals("STOP"))
\r
2652 protein.append("X");
\r
2654 protein.append( aa );
\r
2656 newSeq[s] = new Sequence(selection[s].getName(),
\r
2657 protein.toString());
\r
2661 AlignmentI al = new Alignment(newSeq);
\r
2662 al.setDataset(null);
\r
2665 ////////////////////////////////
\r
2666 // Copy annotations across
\r
2667 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2668 = viewport.alignment.getAlignmentAnnotation();
\r
2670 if(annotations!=null)
\r
2672 for (int i = 0; i < annotations.length; i++)
\r
2674 if (annotations[i].label.equals("Quality") ||
\r
2675 annotations[i].label.equals("Conservation") ||
\r
2676 annotations[i].label.equals("Consensus"))
\r
2681 aSize = viewport.alignment.getWidth() / 3;
\r
2682 jalview.datamodel.Annotation[] anots =
\r
2683 new jalview.datamodel.Annotation[aSize];
\r
2685 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2687 if (annotations[i].annotations[a] == null
\r
2688 || annotations[i].annotations[a] == null)
\r
2691 anots[a / 3] = new Annotation(
\r
2692 annotations[i].annotations[a].displayCharacter,
\r
2693 annotations[i].annotations[a].description,
\r
2694 annotations[i].annotations[a].secondaryStructure,
\r
2695 annotations[i].annotations[a].value,
\r
2696 annotations[i].annotations[a].colour);
\r
2699 jalview.datamodel.AlignmentAnnotation aa
\r
2700 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2701 annotations[i].description, anots);
\r
2702 al.addAnnotation(aa);
\r
2706 AlignFrame af = new AlignFrame(al);
\r
2707 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2709 NEW_WINDOW_HEIGHT);
\r
2712 // AlignViewport newViewport = new AlignViewport(al);
\r
2713 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2714 // tabbedPane.add("Protein", ap);
\r
2715 // viewports.add(newViewport);
\r
2716 // alignPanels.add(ap);
\r
2719 /////////////////////////
\r
2721 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2722 // ds.setDataset(true);
\r
2723 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2724 // tabbedPane.add("Dataset", dap);
\r
2725 // viewports.add(ds);
\r
2726 // alignPanels.add(dap);
\r
2727 /////////////////////////
\r
2732 /*public void tabSelected()
\r
2734 int index = tabbedPane.getSelectedIndex();
\r
2735 viewport = (AlignViewport)viewports.elementAt(index);
\r
2736 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2742 * @param String DOCUMENT ME!
\r
2744 public boolean parseFeaturesFile(String file, String type)
\r
2746 boolean featuresFile = false;
\r
2748 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment.getDataset(),
\r
2749 alignPanel.seqPanel.seqCanvas.
\r
2750 getFeatureRenderer().featureColours,
\r
2753 catch(Exception ex)
\r
2755 ex.printStackTrace();
\r
2760 viewport.showSequenceFeatures = true;
\r
2761 showSeqFeatures.setSelected(true);
\r
2762 alignPanel.repaint();
\r
2765 return featuresFile;
\r
2768 public void dragEnter(DropTargetDragEvent evt)
\r
2771 public void dragExit(DropTargetEvent evt)
\r
2774 public void dragOver(DropTargetDragEvent evt)
\r
2777 public void dropActionChanged(DropTargetDragEvent evt)
\r
2780 public void drop(DropTargetDropEvent evt)
\r
2782 Transferable t = evt.getTransferable();
\r
2783 java.util.List files = null;
\r
2787 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2788 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2790 //Works on Windows and MacOSX
\r
2791 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2792 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2794 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2796 // This is used by Unix drag system
\r
2797 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2798 String data = (String) t.getTransferData(uriListFlavor);
\r
2799 files = new java.util.ArrayList(1);
\r
2800 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2803 st.hasMoreTokens(); )
\r
2805 String s = st.nextToken();
\r
2806 if (s.startsWith("#"))
\r
2808 // the line is a comment (as per the RFC 2483)
\r
2812 java.net.URI uri = new java.net.URI(s);
\r
2813 java.io.File file = new java.io.File(uri);
\r
2818 catch (Exception e)
\r
2820 e.printStackTrace();
\r
2822 if (files != null)
\r
2827 for (int i = 0; i < files.size(); i++)
\r
2829 loadJalviewDataFile(files.get(i).toString());
\r
2832 catch (Exception ex)
\r
2834 ex.printStackTrace();
\r
2839 // This method will attempt to load a "dropped" file first by testing
\r
2840 // whether its and Annotation file, then features file. If both are
\r
2841 // false then the user may have dropped an alignment file onto this
\r
2843 public void loadJalviewDataFile(String file)
\r
2846 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
\r
2849 if (!isAnnotation)
\r
2851 boolean isGroupsFile = parseFeaturesFile(file,
\r
2852 AppletFormatAdapter.FILE);
\r
2853 if (!isGroupsFile)
\r
2855 String format = new IdentifyFile().Identify(file, FormatAdapter.FILE);
\r
2856 new FileLoader().LoadFile(viewport, file, FormatAdapter.FILE, format);
\r
2862 alignPanel.adjustAnnotationHeight();
\r
2865 }catch(Exception ex)
\r
2867 ex.printStackTrace();
\r