2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Softwarechang
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
19 package jalview.gui;
\r
21 import java.beans.*;
\r
26 import java.awt.datatransfer.*;
\r
27 import java.awt.event.*;
\r
28 import java.awt.print.*;
\r
29 import javax.swing.*;
\r
31 import jalview.analysis.*;
\r
32 import jalview.datamodel.*;
\r
33 import jalview.io.*;
\r
34 import jalview.jbgui.*;
\r
35 import jalview.schemes.*;
\r
36 import jalview.ws.*;
\r
37 import java.awt.dnd.*;
\r
38 import org.biojava.dasobert.eventmodel.*;
\r
45 * @version $Revision$
\r
47 public class AlignFrame
\r
48 extends GAlignFrame implements DropTargetListener, FeatureListener
\r
50 /** DOCUMENT ME!! */
\r
51 public static final int NEW_WINDOW_WIDTH = 700;
\r
53 /** DOCUMENT ME!! */
\r
54 public static final int NEW_WINDOW_HEIGHT = 500;
\r
55 AlignmentPanel alignPanel;
\r
56 AlignViewport viewport;
\r
58 /** DOCUMENT ME!! */
\r
59 public String currentFileFormat = null;
\r
60 Stack historyList = new Stack();
\r
61 Stack redoList = new Stack();
\r
62 private int treeCount = 0;
\r
66 * Creates a new AlignFrame object.
\r
68 * @param al DOCUMENT ME!
\r
70 public AlignFrame(AlignmentI al)
\r
72 viewport = new AlignViewport(al);
\r
74 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
\r
76 if(viewport.vconsensus==null)
\r
78 //Out of memory calculating consensus.
\r
79 BLOSUM62Colour.setEnabled(false);
\r
80 PIDColour.setEnabled(false);
\r
81 conservationMenuItem.setEnabled(false);
\r
82 modifyConservation.setEnabled(false);
\r
83 abovePIDThreshold.setEnabled(false);
\r
84 modifyPID.setEnabled(false);
\r
87 alignPanel = new AlignmentPanel(this, viewport);
\r
89 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
\r
91 if(sortby.equals("Id"))
\r
92 sortIDMenuItem_actionPerformed(null);
\r
93 else if(sortby.equals("Pairwise Identity"))
\r
94 sortPairwiseMenuItem_actionPerformed(null);
\r
96 // remove(tabbedPane);
\r
97 getContentPane().add(alignPanel, BorderLayout.CENTER);
\r
101 // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
\r
104 /////////////////////////
\r
105 if(al.getDataset()==null)
\r
107 al.setDataset(null);
\r
109 // AlignViewport ds = new AlignViewport(al.getDataset(), true);
\r
110 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
111 // tabbedPane.add("Dataset", dap);
\r
112 // viewports.add(ds);
\r
113 // alignPanels.add(dap);
\r
114 /////////////////////////
\r
117 viewport.addPropertyChangeListener(new PropertyChangeListener()
\r
119 public void propertyChange(PropertyChangeEvent evt)
\r
121 if (evt.getPropertyName().equals("alignment"))
\r
123 alignmentChanged();
\r
129 if (Desktop.desktop != null)
\r
131 addServiceListeners();
\r
132 setGUINucleotide(al.isNucleotide());
\r
136 if (jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false))
\r
138 wrapMenuItem.setSelected(true);
\r
139 wrapMenuItem_actionPerformed(null);
\r
144 public AlignViewport getViewport()
\r
149 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
150 private void addServiceListeners()
\r
152 final java.beans.PropertyChangeListener thisListener;
\r
153 // Do this once to get current state
\r
154 BuildWebServiceMenu();
\r
155 Desktop.discoverer.addPropertyChangeListener(
\r
156 thisListener = new java.beans.PropertyChangeListener()
\r
158 public void propertyChange(PropertyChangeEvent evt)
\r
160 // System.out.println("Discoverer property change.");
\r
161 if (evt.getPropertyName().equals("services"))
\r
163 // System.out.println("Rebuilding web service menu");
\r
164 BuildWebServiceMenu();
\r
168 addInternalFrameListener(new javax.swing.event.
\r
169 InternalFrameAdapter()
\r
171 public void internalFrameClosed(
\r
172 javax.swing.event.InternalFrameEvent evt)
\r
174 // System.out.println("deregistering discoverer listener");
\r
175 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
176 closeMenuItem_actionPerformed(null);
\r
182 public void setGUINucleotide(boolean nucleotide)
\r
184 showTranslation.setVisible( nucleotide );
\r
185 //sequenceFeatures.setVisible(!nucleotide );
\r
186 //featureSettings.setVisible( !nucleotide );
\r
187 conservationMenuItem.setVisible( !nucleotide );
\r
188 modifyConservation.setVisible( !nucleotide );
\r
190 //Remember AlignFrame always starts as protein
\r
193 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
197 public void comeBackLater(FeatureEvent evt)
\r
200 public void newFeatures(FeatureEvent evt)
\r
202 if (evt.getFeatures().length > 0)
\r
204 alignPanel.seqPanel.seqCanvas.fr.featuresAdded();
\r
205 alignPanel.repaint();
\r
206 if(featureSettings!=null)
\r
207 featureSettings.setTableData();
\r
211 Hashtable progressBars;
\r
212 public void setProgressBar(String message, long id)
\r
214 if(progressBars == null)
\r
215 progressBars = new Hashtable();
\r
217 JPanel progressPanel;
\r
218 GridLayout layout = (GridLayout) statusPanel.getLayout();
\r
219 if(progressBars.get( new Long(id) )!=null)
\r
221 progressPanel = (JPanel)progressBars.get( new Long(id) );
\r
222 statusPanel.remove(progressPanel);
\r
223 progressBars.remove( progressPanel );
\r
224 progressPanel = null;
\r
226 statusBar.setText(message);
\r
228 layout.setRows(layout.getRows() - 1);
\r
232 progressPanel = new JPanel(new BorderLayout(10, 5));
\r
234 JProgressBar progressBar = new JProgressBar();
\r
235 progressBar.setIndeterminate(true);
\r
237 progressPanel.add(new JLabel(message), BorderLayout.WEST);
\r
238 progressPanel.add(progressBar, BorderLayout.CENTER);
\r
240 layout.setRows(layout.getRows() + 1);
\r
241 statusPanel.add(progressPanel);
\r
243 progressBars.put(new Long(id), progressPanel);
\r
251 Added so Castor Mapping file can obtain Jalview Version
\r
253 public String getVersion()
\r
255 return jalview.bin.Cache.getProperty("VERSION");
\r
258 public FeatureRenderer getFeatureRenderer()
\r
260 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
\r
264 public void fetchSequence_actionPerformed(ActionEvent e)
\r
266 new SequenceFetcher(this);
\r
269 public void addFromFile_actionPerformed(ActionEvent e)
\r
271 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
\r
274 public void addFromText_actionPerformed(ActionEvent e)
\r
276 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
\r
279 public void addFromURL_actionPerformed(ActionEvent e)
\r
281 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
\r
287 * @param e DOCUMENT ME!
\r
289 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
291 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
292 getProperty( "LAST_DIRECTORY"),
\r
294 { "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc","jar" },
\r
296 { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview" },
\r
301 chooser.setFileView(new JalviewFileView());
\r
302 chooser.setDialogTitle("Save Alignment to file");
\r
303 chooser.setToolTipText("Save");
\r
305 int value = chooser.showSaveDialog(this);
\r
307 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
309 currentFileFormat = chooser.getSelectedFormat();
\r
311 if (currentFileFormat == null)
\r
313 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
314 "You must select a file format before saving!",
\r
315 "File format not specified",
\r
316 JOptionPane.WARNING_MESSAGE);
\r
317 value = chooser.showSaveDialog(this);
\r
321 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
322 currentFileFormat);
\r
324 String choice = chooser.getSelectedFile().getPath();
\r
325 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
327 saveAlignment(choice, currentFileFormat);
\r
331 public boolean saveAlignment(String file, String format)
\r
333 if (format.equalsIgnoreCase("Jalview"))
\r
335 String shortName = title;
\r
337 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
339 shortName = shortName.substring(shortName.lastIndexOf(
\r
340 java.io.File.separatorChar) + 1);
\r
343 new Jalview2XML().SaveAlignment(this, file, shortName);
\r
345 // USE Jalview2XML to save this file
\r
351 String[] omitHidden = null;
\r
353 if (viewport.hasHiddenColumns)
\r
355 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
\r
356 "The Alignment contains hidden columns."
\r
357 + "\nDo you want to save only the visible alignment?",
\r
358 "Save / Omit Hidden Columns",
\r
359 JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
\r
361 if (reply == JOptionPane.YES_OPTION)
\r
362 omitHidden = viewport.getSelectionAsString();
\r
365 String output = new FormatAdapter().formatSequences(
\r
367 viewport.alignment.getSequencesArray(),
\r
369 //viewport.getSelectionAsNewSequence(),
\r
373 if (output == null)
\r
380 java.io.PrintWriter out = new java.io.PrintWriter(
\r
381 new java.io.FileWriter(file));
\r
385 this.setTitle(file);
\r
388 catch (Exception ex)
\r
390 ex.printStackTrace();
\r
399 * @param e DOCUMENT ME!
\r
401 protected void outputText_actionPerformed(ActionEvent e)
\r
403 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
404 Desktop.addInternalFrame(cap,
\r
405 "Alignment output - " + e.getActionCommand(), 600,
\r
409 String [] omitHidden = null;
\r
411 if(viewport.hasHiddenColumns)
\r
413 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
\r
414 "The Alignment contains hidden columns."
\r
415 +"\nDo you want to output only the visible alignment?",
\r
416 "Save / Omit Hidden Columns",
\r
417 JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
\r
419 if(reply==JOptionPane.YES_OPTION)
\r
420 omitHidden = viewport.getSelectionAsString();
\r
423 cap.setText(new FormatAdapter().formatSequences(
\r
424 e.getActionCommand(),
\r
425 viewport.getSelectionAsNewSequence(),
\r
432 * @param e DOCUMENT ME!
\r
434 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
436 new HTMLOutput(viewport,
\r
437 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
438 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
441 public void createImageMap(File file, String image)
\r
443 alignPanel.makePNGImageMap(file, image);
\r
449 * @param e DOCUMENT ME!
\r
451 public void createPNG(File f)
\r
453 alignPanel.makePNG(f);
\r
459 * @param e DOCUMENT ME!
\r
461 public void createEPS(File f)
\r
463 alignPanel.makeEPS(f);
\r
469 * @param e DOCUMENT ME!
\r
471 public void printMenuItem_actionPerformed(ActionEvent e)
\r
473 //Putting in a thread avoids Swing painting problems
\r
474 PrintThread thread = new PrintThread();
\r
478 public void exportFeatures_actionPerformed(ActionEvent e)
\r
480 new AnnotationExporter().exportFeatures(alignPanel);
\r
483 public void exportAnnotations_actionPerformed(ActionEvent e)
\r
485 new AnnotationExporter().exportAnnotations(
\r
487 viewport.alignment.getAlignmentAnnotation()
\r
492 public void associatedData_actionPerformed(ActionEvent e)
\r
494 // Pick the tree file
\r
495 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
497 "LAST_DIRECTORY"));
\r
498 chooser.setFileView(new JalviewFileView());
\r
499 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
500 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
502 int value = chooser.showOpenDialog(null);
\r
504 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
506 String choice = chooser.getSelectedFile().getPath();
\r
507 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
508 loadJalviewDataFile(choice);
\r
516 * @param e DOCUMENT ME!
\r
518 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
522 PaintRefresher.components.remove(viewport.alignment);
\r
523 this.setClosed(true);
\r
525 catch (Exception ex)
\r
533 void updateEditMenuBar()
\r
535 if (historyList.size() > 0)
\r
537 undoMenuItem.setEnabled(true);
\r
539 HistoryItem hi = (HistoryItem) historyList.peek();
\r
540 undoMenuItem.setText("Undo " + hi.getDescription());
\r
544 undoMenuItem.setEnabled(false);
\r
545 undoMenuItem.setText("Undo");
\r
548 if (redoList.size() > 0)
\r
550 redoMenuItem.setEnabled(true);
\r
552 HistoryItem hi = (HistoryItem) redoList.peek();
\r
553 redoMenuItem.setText("Redo " + hi.getDescription());
\r
557 redoMenuItem.setEnabled(false);
\r
558 redoMenuItem.setText("Redo");
\r
565 * @param hi DOCUMENT ME!
\r
567 public void addHistoryItem(HistoryItem hi)
\r
569 historyList.push(hi);
\r
570 updateEditMenuBar();
\r
576 * @param e DOCUMENT ME!
\r
578 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
580 HistoryItem hi = (HistoryItem) historyList.pop();
\r
581 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
582 HistoryItem.HIDE));
\r
583 restoreHistoryItem(hi);
\r
584 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
590 * @param e DOCUMENT ME!
\r
592 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
594 HistoryItem hi = (HistoryItem) redoList.pop();
\r
595 restoreHistoryItem(hi);
\r
596 updateEditMenuBar();
\r
597 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
600 // used by undo and redo
\r
601 void restoreHistoryItem(HistoryItem hi)
\r
606 updateEditMenuBar();
\r
608 viewport.firePropertyChange("alignment", null,
\r
609 viewport.getAlignment().getSequences());
\r
615 * @param up DOCUMENT ME!
\r
617 public void moveSelectedSequences(boolean up)
\r
619 SequenceGroup sg = viewport.getSelectionGroup();
\r
628 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
630 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
632 if (!sg.getSequences(false).contains(seq))
\r
637 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
639 if (sg.getSequences(false).contains(temp))
\r
644 viewport.alignment.getSequences().setElementAt(temp, i);
\r
645 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
650 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
652 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
654 if (!sg.getSequences(false).contains(seq))
\r
659 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
661 if (sg.getSequences(false).contains(temp))
\r
666 viewport.alignment.getSequences().setElementAt(temp, i);
\r
667 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
671 alignPanel.repaint();
\r
679 * @param e DOCUMENT ME!
\r
681 protected void copy_actionPerformed(ActionEvent e)
\r
683 if (viewport.getSelectionGroup() == null)
\r
688 SequenceI [] seqs = viewport.getSelectionAsNewSequence();
\r
689 String[] omitHidden = null;
\r
691 if (viewport.hasHiddenColumns)
\r
693 omitHidden = viewport.getSelectionAsString();
\r
696 String output = new FormatAdapter().formatSequences(
\r
702 Toolkit.getDefaultToolkit().getSystemClipboard()
\r
703 .setContents(new StringSelection(output), Desktop.instance);
\r
705 Vector hiddenColumns = null;
\r
706 if(viewport.hasHiddenColumns && viewport.getSelectionGroup()!=null)
\r
708 hiddenColumns =new Vector();
\r
709 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
\r
710 for(int i=0; i<viewport.getColumnSelection().getHiddenColumns().size(); i++)
\r
712 int[] region = (int[])
\r
713 viewport.getColumnSelection().getHiddenColumns().elementAt(i);
\r
715 hiddenColumns.addElement(new int[]{region[0]-hiddenOffset,
\r
716 region[1]-hiddenOffset});
\r
720 Desktop.jalviewClipboard = new Object[]{ seqs,
\r
721 viewport.alignment.getDataset(),
\r
728 * @param e DOCUMENT ME!
\r
730 protected void pasteNew_actionPerformed(ActionEvent e)
\r
738 * @param e DOCUMENT ME!
\r
740 protected void pasteThis_actionPerformed(ActionEvent e)
\r
742 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
743 HistoryItem.PASTE));
\r
750 * @param newAlignment DOCUMENT ME!
\r
752 void paste(boolean newAlignment)
\r
756 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
757 Transferable contents = c.getContents(this);
\r
759 if (contents == null)
\r
764 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
768 String format = new IdentifyFile().Identify(str, "Paste");
\r
769 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 alignment = new Alignment(sequences);
\r
788 if(Desktop.jalviewClipboard!=null)
\r
789 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
791 alignment.setDataset( null );
\r
795 alignment = viewport.getAlignment();
\r
798 for (int i = 0; i < sequences.length; i++)
\r
801 Sequence newseq = new Sequence(sequences[i].getName(),
\r
802 sequences[i].getSequence(), sequences[i].getStart(),
\r
803 sequences[i].getEnd());
\r
805 alignment.addSequence(newseq);
\r
807 viewport.setEndSeq(alignment.getHeight());
\r
808 alignment.getWidth();
\r
809 viewport.firePropertyChange("alignment", null, alignment.getSequences());
\r
812 // Add any annotations attached to sequences
\r
813 for (int i = 0; i < sequences.length; i++)
\r
815 if (sequences[i].getAnnotation() != null)
\r
817 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
\r
819 AlignmentAnnotation newAnnot =
\r
820 new AlignmentAnnotation(
\r
821 sequences[i].getAnnotation()[a].label,
\r
822 sequences[i].getAnnotation()[a].description,
\r
823 sequences[i].getAnnotation()[a].annotations,
\r
824 sequences[i].getAnnotation()[a].graphMin,
\r
825 sequences[i].getAnnotation()[a].graphMax,
\r
826 sequences[i].getAnnotation()[a].graph);
\r
828 sequences[i].getAnnotation()[a] = newAnnot;
\r
829 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
\r
831 newAnnot.sequenceRef = sequences[i];
\r
832 newAnnot.adjustForAlignment();
\r
833 alignment.addAnnotation(newAnnot);
\r
834 alignment.setAnnotationIndex(newAnnot, a);
\r
837 alignPanel.annotationPanel.adjustPanelHeight();
\r
843 AlignFrame af = new AlignFrame(alignment);
\r
844 String newtitle = new String("Copied sequences");
\r
846 if(Desktop.jalviewClipboard[2]!=null)
\r
848 Vector hc = (Vector)Desktop.jalviewClipboard[2];
\r
849 for(int i=0; i<hc.size(); i++)
\r
851 int [] region = (int[]) hc.elementAt(i);
\r
852 af.viewport.hideColumns(region[0], region[1]);
\r
857 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
858 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
859 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
862 if (title.startsWith("Copied sequences"))
\r
868 newtitle = newtitle.concat("- from " + title);
\r
871 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
872 NEW_WINDOW_HEIGHT);
\r
878 catch (Exception ex)
\r
880 ex.printStackTrace();
\r
881 System.out.println("Exception whilst pasting: "+ex);
\r
882 // could be anything being pasted in here
\r
891 * @param e DOCUMENT ME!
\r
893 protected void cut_actionPerformed(ActionEvent e)
\r
895 copy_actionPerformed(null);
\r
896 delete_actionPerformed(null);
\r
902 * @param e DOCUMENT ME!
\r
904 protected void delete_actionPerformed(ActionEvent e)
\r
907 if (viewport.getSelectionGroup() == null)
\r
913 SequenceGroup sg = viewport.getSelectionGroup();
\r
917 //Jalview no longer allows deletion of residues.
\r
918 //Check here whether any residues are in selection area
\r
919 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
921 for (int i = 0; i < sg.sequences.size(); i++)
\r
923 SequenceI seq = sg.getSequenceAt(i);
\r
924 int j = sg.getStartRes();
\r
927 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
929 JOptionPane.showInternalMessageDialog(
\r
930 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
931 + "Try hiding columns instead.",
\r
932 "Deletion of residues not permitted",
\r
933 JOptionPane.WARNING_MESSAGE);
\r
938 }while(j<=sg.getEndRes());
\r
943 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
944 HistoryItem.HIDE));
\r
947 for (int i = 0; i < sg.getSize(false); i++)
\r
949 SequenceI seq = sg.getSequenceAt(i);
\r
950 int index = viewport.getAlignment().findIndex(seq);
\r
952 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
954 // If the cut affects all sequences, remove highlighted columns
\r
955 if (sg.getSize(false) == viewport.alignment.getHeight())
\r
957 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
958 sg.getEndRes() + 1);
\r
961 if (seq.getSequence().length() < 1)
\r
963 viewport.getAlignment().deleteSequence(seq);
\r
967 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
971 viewport.setSelectionGroup(null);
\r
972 viewport.alignment.deleteGroup(sg);
\r
974 viewport.firePropertyChange("alignment", null,
\r
975 viewport.getAlignment().getSequences());
\r
979 if (viewport.getAlignment().getHeight() < 1)
\r
983 this.setClosed(true);
\r
985 catch (Exception ex)
\r
994 * @param e DOCUMENT ME!
\r
996 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
998 viewport.alignment.deleteAllGroups();
\r
999 viewport.setSelectionGroup(null);
\r
1000 alignPanel.repaint();
\r
1006 * @param e DOCUMENT ME!
\r
1008 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1010 SequenceGroup sg = new SequenceGroup();
\r
1012 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1015 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
1018 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
1019 viewport.setSelectionGroup(sg);
\r
1020 PaintRefresher.Refresh(null, viewport.alignment);
\r
1026 * @param e DOCUMENT ME!
\r
1028 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1030 if(viewport.cursorMode)
\r
1032 alignPanel.seqPanel.keyboardNo1 = null;
\r
1033 alignPanel.seqPanel.keyboardNo2 = null;
\r
1035 viewport.setSelectionGroup(null);
\r
1036 viewport.getColumnSelection().clear();
\r
1037 viewport.setSelectionGroup(null);
\r
1038 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
1039 alignPanel.idPanel.idCanvas.searchResults = null;
\r
1040 alignPanel.repaint();
\r
1041 PaintRefresher.Refresh(null, viewport.alignment);
\r
1047 * @param e DOCUMENT ME!
\r
1049 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1051 SequenceGroup sg = viewport.getSelectionGroup();
\r
1055 selectAllSequenceMenuItem_actionPerformed(null);
\r
1060 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1063 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
1066 PaintRefresher.Refresh(null, viewport.alignment);
\r
1072 * @param e DOCUMENT ME!
\r
1074 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
1076 ColumnSelection colSel = viewport.getColumnSelection();
\r
1078 if (colSel.size() > 0)
\r
1080 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
1081 HistoryItem.HIDE));
\r
1083 int min = colSel.getMin();
\r
1084 viewport.getAlignment().trimLeft(min);
\r
1085 colSel.compensateForEdit(0, min);
\r
1087 if (viewport.getSelectionGroup() != null)
\r
1089 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
1092 Vector groups = viewport.alignment.getGroups();
\r
1094 for (int i = 0; i < groups.size(); i++)
\r
1096 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1098 if (!sg.adjustForRemoveLeft(min))
\r
1100 viewport.alignment.deleteGroup(sg);
\r
1104 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1111 * @param e DOCUMENT ME!
\r
1113 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1115 ColumnSelection colSel = viewport.getColumnSelection();
\r
1117 if (colSel.size() > 0)
\r
1119 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1120 HistoryItem.HIDE));
\r
1122 int max = colSel.getMax();
\r
1123 viewport.getAlignment().trimRight(max);
\r
1125 if (viewport.getSelectionGroup() != null)
\r
1127 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1130 Vector groups = viewport.alignment.getGroups();
\r
1132 for (int i = 0; i < groups.size(); i++)
\r
1134 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1136 if (!sg.adjustForRemoveRight(max))
\r
1138 viewport.alignment.deleteGroup(sg);
\r
1142 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1149 * @param e DOCUMENT ME!
\r
1151 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1153 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1154 viewport.alignment, HistoryItem.HIDE));
\r
1156 //This is to maintain viewport position on first residue
\r
1157 //of first sequence
\r
1158 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1159 int startRes = seq.findPosition(viewport.startRes);
\r
1161 viewport.getAlignment().removeGaps();
\r
1163 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1165 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1171 * @param e DOCUMENT ME!
\r
1173 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1175 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1176 HistoryItem.HIDE));
\r
1178 //This is to maintain viewport position on first residue
\r
1179 //of first sequence
\r
1180 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1181 int startRes = seq.findPosition(viewport.startRes);
\r
1184 SequenceI current;
\r
1187 Vector seqs = null;
\r
1190 int end = viewport.alignment.getWidth();
\r
1192 if (viewport.getSelectionGroup() != null
\r
1193 && viewport.getSelectionGroup().getSequences(true) != null
\r
1194 && viewport.getSelectionGroup().getSize(true) > 0)
\r
1196 seqs = viewport.getSelectionGroup().getSequences(true);
\r
1197 start = viewport.getSelectionGroup().getStartRes();
\r
1198 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1202 seqs = viewport.alignment.getSequences();
\r
1205 for (int i = 0; i < seqs.size(); i++)
\r
1207 current = (SequenceI) seqs.elementAt(i);
\r
1208 jSize = current.getLength();
\r
1210 // Removing a range is much quicker than removing gaps
\r
1211 // one by one for long sequences
\r
1213 int rangeStart=-1, rangeEnd=-1;
\r
1217 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1219 if(rangeStart==-1)
\r
1234 current.deleteChars(rangeStart, rangeEnd);
\r
1235 j-=rangeEnd-rangeStart;
\r
1236 jSize-=rangeEnd-rangeStart;
\r
1244 while (j < end && j < jSize);
\r
1247 current.deleteChars(rangeStart, rangeEnd);
\r
1251 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1253 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1256 public void alignmentChanged()
\r
1258 if(viewport.padGaps)
\r
1259 viewport.getAlignment().padGaps();
\r
1261 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1263 viewport.updateConsensus();
\r
1264 viewport.updateConservation();
\r
1266 resetAllColourSchemes();
\r
1267 if(alignPanel.overviewPanel!=null)
\r
1268 alignPanel.overviewPanel.updateOverviewImage();
\r
1270 viewport.alignment.adjustSequenceAnnotations();
\r
1272 alignPanel.repaint();
\r
1275 void resetAllColourSchemes()
\r
1277 ColourSchemeI cs = viewport.globalColourScheme;
\r
1280 if (cs instanceof ClustalxColourScheme)
\r
1282 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1283 resetClustalX(viewport.alignment.getSequences(),
\r
1284 viewport.alignment.getWidth());
\r
1287 cs.setConsensus(viewport.vconsensus);
\r
1288 if (cs.conservationApplied())
\r
1290 Alignment al = (Alignment) viewport.alignment;
\r
1291 Conservation c = new Conservation("All",
\r
1292 ResidueProperties.propHash, 3,
\r
1293 al.getSequences(), 0,
\r
1294 al.getWidth() - 1);
\r
1296 c.verdict(false, viewport.ConsPercGaps);
\r
1298 cs.setConservation(c);
\r
1302 int s, sSize = viewport.alignment.getGroups().size();
\r
1303 for(s=0; s<sSize; s++)
\r
1305 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1306 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1308 ((ClustalxColourScheme)sg.cs).resetClustalX(
\r
1309 sg.getSequences(true), sg.getWidth());
\r
1311 sg.recalcConservation();
\r
1318 * @param e DOCUMENT ME!
\r
1320 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1322 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1323 HistoryItem.HIDE));
\r
1325 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1327 // if (viewport.padGaps)
\r
1328 alignmentChanged();
\r
1334 * @param e DOCUMENT ME!
\r
1336 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1338 JInternalFrame frame = new JInternalFrame();
\r
1339 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1340 frame.setContentPane(finder);
\r
1341 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1342 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1348 * @param e DOCUMENT ME!
\r
1350 public void font_actionPerformed(ActionEvent e)
\r
1352 new FontChooser(alignPanel);
\r
1355 public void smoothFont_actionPerformed(ActionEvent e)
\r
1357 viewport.antiAlias = smoothFont.isSelected();
\r
1358 alignPanel.annotationPanel.image = null;
\r
1359 alignPanel.repaint();
\r
1366 * @param e DOCUMENT ME!
\r
1368 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1370 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1372 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1373 alignPanel.repaint();
\r
1380 * @param e DOCUMENT ME!
\r
1382 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1384 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1385 alignPanel.repaint();
\r
1391 * @param e DOCUMENT ME!
\r
1393 public void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1395 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1396 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1397 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1398 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1399 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1402 public void showAllSeqs_actionPerformed(ActionEvent e)
\r
1404 viewport.showAllHiddenSeqs();
\r
1408 public void showAllColumns_actionPerformed(ActionEvent e)
\r
1410 viewport.getColumnSelection().revealAllHiddenColumns(viewport);
\r
1413 public void hideSelSequences_actionPerformed(ActionEvent e)
\r
1415 if(viewport.getSelectionGroup()==null)
\r
1418 SequenceI [] seqs = viewport.getSelectionGroup().getSequencesInOrder(
\r
1419 viewport.alignment
\r
1422 for(int i=0; i<seqs.length; i++)
\r
1424 viewport.hideSequence(seqs[i]);
\r
1429 public void hideSelColumns_actionPerformed(ActionEvent e)
\r
1431 viewport.hideSelectedColumns();
\r
1435 public void hiddenMarkers_actionPerformed(ActionEvent e)
\r
1437 viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
\r
1444 * @param e DOCUMENT ME!
\r
1446 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1448 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1449 alignPanel.repaint();
\r
1455 * @param e DOCUMENT ME!
\r
1457 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1459 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1460 alignPanel.repaint();
\r
1466 * @param e DOCUMENT ME!
\r
1468 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1470 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1471 alignPanel.repaint();
\r
1477 * @param e DOCUMENT ME!
\r
1479 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1481 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1482 alignPanel.repaint();
\r
1488 * @param e DOCUMENT ME!
\r
1490 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1492 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1493 alignPanel.repaint();
\r
1499 * @param e DOCUMENT ME!
\r
1501 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1503 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1504 alignPanel.repaint();
\r
1508 FeatureSettings featureSettings;
\r
1509 public void featureSettings_actionPerformed(ActionEvent e)
\r
1511 if(featureSettings !=null )
\r
1513 featureSettings.close();
\r
1514 featureSettings = null;
\r
1516 featureSettings = new FeatureSettings(this);
\r
1522 * @param evt DOCUMENT ME!
\r
1524 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1526 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1527 alignPanel.repaint();
\r
1528 if (alignPanel.getOverviewPanel() != null)
\r
1530 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1537 * @param e DOCUMENT ME!
\r
1539 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1541 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1542 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1548 * @param e DOCUMENT ME!
\r
1550 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1552 if (alignPanel.overviewPanel != null)
\r
1557 JInternalFrame frame = new JInternalFrame();
\r
1558 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1559 frame.setContentPane(overview);
\r
1560 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1561 frame.getWidth(), frame.getHeight());
\r
1563 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1564 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1566 public void internalFrameClosed(
\r
1567 javax.swing.event.InternalFrameEvent evt)
\r
1569 alignPanel.setOverviewPanel(null);
\r
1574 alignPanel.setOverviewPanel(overview);
\r
1580 * @param e DOCUMENT ME!
\r
1582 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1584 changeColour(null);
\r
1590 * @param e DOCUMENT ME!
\r
1592 public void clustalColour_actionPerformed(ActionEvent e)
\r
1594 changeColour(new ClustalxColourScheme(
\r
1595 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1601 * @param e DOCUMENT ME!
\r
1603 public void zappoColour_actionPerformed(ActionEvent e)
\r
1605 changeColour(new ZappoColourScheme());
\r
1611 * @param e DOCUMENT ME!
\r
1613 public void taylorColour_actionPerformed(ActionEvent e)
\r
1615 changeColour(new TaylorColourScheme());
\r
1621 * @param e DOCUMENT ME!
\r
1623 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1625 changeColour(new HydrophobicColourScheme());
\r
1631 * @param e DOCUMENT ME!
\r
1633 public void helixColour_actionPerformed(ActionEvent e)
\r
1635 changeColour(new HelixColourScheme());
\r
1641 * @param e DOCUMENT ME!
\r
1643 public void strandColour_actionPerformed(ActionEvent e)
\r
1645 changeColour(new StrandColourScheme());
\r
1651 * @param e DOCUMENT ME!
\r
1653 public void turnColour_actionPerformed(ActionEvent e)
\r
1655 changeColour(new TurnColourScheme());
\r
1661 * @param e DOCUMENT ME!
\r
1663 public void buriedColour_actionPerformed(ActionEvent e)
\r
1665 changeColour(new BuriedColourScheme());
\r
1671 * @param e DOCUMENT ME!
\r
1673 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1675 changeColour(new NucleotideColourScheme());
\r
1678 public void annotationColour_actionPerformed(ActionEvent e)
\r
1680 new AnnotationColourChooser(viewport, alignPanel);
\r
1687 * @param e DOCUMENT ME!
\r
1689 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1691 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1697 * @param cs DOCUMENT ME!
\r
1699 public void changeColour(ColourSchemeI cs)
\r
1701 int threshold = 0;
\r
1705 if (viewport.getAbovePIDThreshold())
\r
1707 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1710 cs.setThreshold(threshold,
\r
1711 viewport.getIgnoreGapsConsensus());
\r
1713 viewport.setGlobalColourScheme(cs);
\r
1717 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1720 if (viewport.getConservationSelected())
\r
1723 Alignment al = (Alignment) viewport.alignment;
\r
1724 Conservation c = new Conservation("All",
\r
1725 ResidueProperties.propHash, 3,
\r
1726 al.getSequences(), 0,
\r
1727 al.getWidth() - 1);
\r
1730 c.verdict(false, viewport.ConsPercGaps);
\r
1732 cs.setConservation(c);
\r
1734 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1739 cs.setConservation(null);
\r
1742 cs.setConsensus(viewport.vconsensus);
\r
1745 viewport.setGlobalColourScheme(cs);
\r
1747 if (viewport.getColourAppliesToAllGroups())
\r
1749 Vector groups = viewport.alignment.getGroups();
\r
1751 for (int i = 0; i < groups.size(); i++)
\r
1753 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1761 if (cs instanceof ClustalxColourScheme)
\r
1763 sg.cs = new ClustalxColourScheme(
\r
1764 sg.getSequences(true), sg.getWidth());
\r
1766 else if (cs instanceof UserColourScheme)
\r
1768 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1774 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1776 catch (Exception ex)
\r
1781 if (viewport.getAbovePIDThreshold()
\r
1782 || cs instanceof PIDColourScheme
\r
1783 || cs instanceof Blosum62ColourScheme)
\r
1785 sg.cs.setThreshold(threshold,
\r
1786 viewport.getIgnoreGapsConsensus());
\r
1788 sg.cs.setConsensus(AAFrequency.calculate(
\r
1789 sg.getSequences(true), 0,
\r
1793 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1796 if (viewport.getConservationSelected())
\r
1798 Conservation c = new Conservation("Group",
\r
1799 ResidueProperties.propHash, 3,
\r
1800 sg.getSequences(true), 0,
\r
1801 viewport.alignment.getWidth() - 1);
\r
1803 c.verdict(false, viewport.ConsPercGaps);
\r
1804 sg.cs.setConservation(c);
\r
1807 sg.cs.setConservation(null);
\r
1811 if (alignPanel.getOverviewPanel() != null)
\r
1813 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1816 alignPanel.repaint();
\r
1822 * @param e DOCUMENT ME!
\r
1824 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1826 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1828 SliderPanel.setPIDSliderSource(alignPanel,
\r
1829 viewport.getGlobalColourScheme(),
\r
1831 SliderPanel.showPIDSlider();
\r
1838 * @param e DOCUMENT ME!
\r
1840 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1842 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1844 SliderPanel.setConservationSlider(alignPanel,
\r
1845 viewport.globalColourScheme,
\r
1847 SliderPanel.showConservationSlider();
\r
1854 * @param e DOCUMENT ME!
\r
1856 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1858 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1860 viewport.setAbovePIDThreshold(false);
\r
1861 abovePIDThreshold.setSelected(false);
\r
1863 changeColour(viewport.getGlobalColourScheme());
\r
1865 modifyConservation_actionPerformed(null);
\r
1871 * @param e DOCUMENT ME!
\r
1873 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1875 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1877 conservationMenuItem.setSelected(false);
\r
1878 viewport.setConservationSelected(false);
\r
1880 changeColour(viewport.getGlobalColourScheme());
\r
1882 modifyPID_actionPerformed(null);
\r
1888 * @param e DOCUMENT ME!
\r
1890 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1892 if (e.getActionCommand().equals("User Defined..."))
\r
1894 new UserDefinedColours(alignPanel, null);
\r
1898 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1899 getUserColourSchemes().get(e.getActionCommand());
\r
1901 changeColour(udc);
\r
1905 public void updateUserColourMenu()
\r
1908 Component[] menuItems = colourMenu.getMenuComponents();
\r
1909 int i, iSize = menuItems.length;
\r
1910 for (i = 0; i < iSize; i++)
\r
1912 if (menuItems[i].getName() != null &&
\r
1913 menuItems[i].getName().equals("USER_DEFINED"))
\r
1915 colourMenu.remove(menuItems[i]);
\r
1919 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1921 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1922 getUserColourSchemes().keys();
\r
1924 while (userColours.hasMoreElements())
\r
1926 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1927 nextElement().toString());
\r
1928 radioItem.setName("USER_DEFINED");
\r
1929 radioItem.addMouseListener(new MouseAdapter()
\r
1931 public void mousePressed(MouseEvent evt)
\r
1933 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1935 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1937 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1938 "Remove from default list?",
\r
1939 "Remove user defined colour",
\r
1940 JOptionPane.YES_NO_OPTION);
\r
1941 if(option == JOptionPane.YES_OPTION)
\r
1943 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1944 colourMenu.remove(radioItem);
\r
1947 radioItem.addActionListener(new ActionListener()
\r
1949 public void actionPerformed(ActionEvent evt)
\r
1951 userDefinedColour_actionPerformed(evt);
\r
1957 radioItem.addActionListener(new ActionListener()
\r
1959 public void actionPerformed(ActionEvent evt)
\r
1961 userDefinedColour_actionPerformed(evt);
\r
1965 colourMenu.insert(radioItem, 15);
\r
1966 colours.add(radioItem);
\r
1974 * @param e DOCUMENT ME!
\r
1976 public void PIDColour_actionPerformed(ActionEvent e)
\r
1978 changeColour(new PIDColourScheme());
\r
1984 * @param e DOCUMENT ME!
\r
1986 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1988 changeColour(new Blosum62ColourScheme());
\r
1994 * @param e DOCUMENT ME!
\r
1996 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1998 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1999 HistoryItem.SORT));
\r
2000 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
2001 viewport.getAlignment().getSequenceAt(0));
\r
2002 alignPanel.repaint();
\r
2008 * @param e DOCUMENT ME!
\r
2010 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
2012 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
2013 HistoryItem.SORT));
\r
2014 AlignmentSorter.sortByID(viewport.getAlignment());
\r
2015 alignPanel.repaint();
\r
2021 * @param e DOCUMENT ME!
\r
2023 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
2025 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
2026 HistoryItem.SORT));
\r
2028 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
2029 alignPanel.repaint();
\r
2035 * @param e DOCUMENT ME!
\r
2037 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
2039 new RedundancyPanel(alignPanel, this);
\r
2046 * @param e DOCUMENT ME!
\r
2048 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
2050 if ( (viewport.getSelectionGroup() == null) ||
\r
2051 (viewport.getSelectionGroup().getSize(false) < 2))
\r
2053 JOptionPane.showInternalMessageDialog(this,
\r
2054 "You must select at least 2 sequences.",
\r
2055 "Invalid Selection",
\r
2056 JOptionPane.WARNING_MESSAGE);
\r
2060 JInternalFrame frame = new JInternalFrame();
\r
2061 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
2062 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
2069 * @param e DOCUMENT ME!
\r
2071 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
2073 if ( ( (viewport.getSelectionGroup() != null) &&
\r
2074 (viewport.getSelectionGroup().getSize(false) < 4) &&
\r
2075 (viewport.getSelectionGroup().getSize(false) > 0)) ||
\r
2076 (viewport.getAlignment().getHeight() < 4))
\r
2078 JOptionPane.showInternalMessageDialog(this,
\r
2079 "Principal component analysis must take\n" +
\r
2080 "at least 4 input sequences.",
\r
2081 "Sequence selection insufficient",
\r
2082 JOptionPane.WARNING_MESSAGE);
\r
2087 new PCAPanel(viewport);
\r
2091 public void autoCalculate_actionPerformed(ActionEvent e)
\r
2093 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
2094 if(viewport.autoCalculateConsensus)
\r
2096 alignmentChanged();
\r
2104 * @param e DOCUMENT ME!
\r
2106 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
2108 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2114 * @param e DOCUMENT ME!
\r
2116 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2118 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2124 * @param e DOCUMENT ME!
\r
2126 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2128 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2134 * @param e DOCUMENT ME!
\r
2136 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2138 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2144 * @param type DOCUMENT ME!
\r
2145 * @param pwType DOCUMENT ME!
\r
2146 * @param title DOCUMENT ME!
\r
2148 void NewTreePanel(String type, String pwType, String title)
\r
2152 if ( (viewport.getSelectionGroup() != null) &&
\r
2153 (viewport.getSelectionGroup().getSize(false) > 3))
\r
2156 SequenceGroup sg = viewport.getSelectionGroup();
\r
2158 /* Decide if the selection is a column region */
\r
2159 while (s < sg.getSize(false))
\r
2161 if ( ( (SequenceI) sg.getSequences(false).elementAt(s++)).getLength() <
\r
2164 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2165 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2166 "Try using the Pad function in the edit menu,\n" +
\r
2167 "or one of the multiple sequence alignment web services.",
\r
2168 "Sequences in selection are not aligned",
\r
2169 JOptionPane.WARNING_MESSAGE);
\r
2175 title = title + " on region";
\r
2176 tp = new TreePanel(viewport, type, pwType);
\r
2180 //are the sequences aligned?
\r
2181 if (!viewport.alignment.isAligned())
\r
2183 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2184 "The sequences must be aligned before creating a tree.\n" +
\r
2185 "Try using the Pad function in the edit menu,\n" +
\r
2186 "or one of the multiple sequence alignment web services.",
\r
2187 "Sequences not aligned",
\r
2188 JOptionPane.WARNING_MESSAGE);
\r
2193 tp = new TreePanel(viewport, type, pwType);
\r
2196 addTreeMenuItem(tp, title);
\r
2198 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2204 * @param title DOCUMENT ME!
\r
2205 * @param order DOCUMENT ME!
\r
2207 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2209 final JMenuItem item = new JMenuItem("by " + title);
\r
2211 item.addActionListener(new java.awt.event.ActionListener()
\r
2213 public void actionPerformed(ActionEvent e)
\r
2215 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2216 HistoryItem.SORT));
\r
2218 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2219 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2220 alignPanel.repaint();
\r
2226 * Maintain the Order by->Displayed Tree menu.
\r
2227 * Creates a new menu item for a TreePanel with an appropriate
\r
2228 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2229 * to remove the menu item when the treePanel is closed, and adjust
\r
2230 * the tree leaf to sequence mapping when the alignment is modified.
\r
2231 * @param treePanel Displayed tree window.
\r
2232 * @param title SortBy menu item title.
\r
2234 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2236 final JMenuItem item = new JMenuItem(title);
\r
2240 if (treeCount == 1)
\r
2242 sort.add(sortByTreeMenu);
\r
2245 sortByTreeMenu.add(item);
\r
2246 item.addActionListener(new java.awt.event.ActionListener()
\r
2248 public void actionPerformed(ActionEvent e)
\r
2250 addHistoryItem(new HistoryItem("Tree Sort",
\r
2251 viewport.alignment, HistoryItem.SORT));
\r
2252 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2253 treePanel.getTree());
\r
2254 alignPanel.repaint();
\r
2258 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2259 InternalFrameAdapter()
\r
2261 public void internalFrameClosed(
\r
2262 javax.swing.event.InternalFrameEvent evt)
\r
2265 sortByTreeMenu.remove(item);
\r
2267 if (treeCount == 0)
\r
2269 sort.remove(sortByTreeMenu);
\r
2277 * Work out whether the whole set of sequences
\r
2278 * or just the selected set will be submitted for multiple alignment.
\r
2281 private SequenceI[] gatherSequencesForAlignment()
\r
2283 // Now, check we have enough sequences
\r
2284 SequenceI[] msa = null;
\r
2286 if ( (viewport.getSelectionGroup() != null) &&
\r
2287 (viewport.getSelectionGroup().getSize(false) > 1))
\r
2289 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2290 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2292 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2294 for (int i = 0; i < sz; i++)
\r
2296 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2301 Vector seqs = viewport.getAlignment().getSequences();
\r
2303 if (seqs.size() > 1)
\r
2305 msa = new SequenceI[seqs.size()];
\r
2307 for (int i = 0; i < seqs.size(); i++)
\r
2309 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2317 * Decides what is submitted to a secondary structure prediction service,
\r
2318 * the currently selected sequence, or the currently selected alignment
\r
2319 * (where the first sequence in the set is the one that the prediction
\r
2322 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2324 SequenceI seq = null;
\r
2325 SequenceI[] msa = null;
\r
2327 if ( (viewport.getSelectionGroup() != null) &&
\r
2328 (viewport.getSelectionGroup().getSize(false) > 0))
\r
2330 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2331 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2333 if ( (seqs.getSize(false) == 1) || !viewport.alignment.isAligned())
\r
2335 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2340 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2342 for (int i = 0; i < sz; i++)
\r
2344 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2350 Vector seqs = viewport.getAlignment().getSequences();
\r
2352 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2354 seq = (SequenceI) seqs.elementAt(0);
\r
2358 msa = new SequenceI[seqs.size()];
\r
2360 for (int i = 0; i < seqs.size(); i++)
\r
2362 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2374 return new SequenceI[]
\r
2384 * @param e DOCUMENT ME!
\r
2386 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2388 // Pick the tree file
\r
2389 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2391 "LAST_DIRECTORY"));
\r
2392 chooser.setFileView(new JalviewFileView());
\r
2393 chooser.setDialogTitle("Select a newick-like tree file");
\r
2394 chooser.setToolTipText("Load a tree file");
\r
2396 int value = chooser.showOpenDialog(null);
\r
2398 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2400 String choice = chooser.getSelectedFile().getPath();
\r
2401 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2405 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2407 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2409 catch (Exception ex)
\r
2411 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2412 "Problem reading tree file",
\r
2414 JOptionPane.WARNING_MESSAGE);
\r
2415 ex.printStackTrace();
\r
2421 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2423 return ShowNewickTree(nf,title,600,500,4,5);
\r
2428 * @param nf DOCUMENT ME!
\r
2429 * @param title DOCUMENT ME!
\r
2431 * @return DOCUMENT ME!
\r
2433 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2435 TreePanel tp = null;
\r
2441 if (nf.getTree() != null)
\r
2443 tp = new TreePanel(viewport,
\r
2451 tp.setLocation(x,y);
\r
2454 Desktop.addInternalFrame(tp, title, w, h);
\r
2455 addTreeMenuItem(tp, title);
\r
2458 catch (Exception ex)
\r
2460 ex.printStackTrace();
\r
2471 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2472 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2473 printJob.setPrintable(alignPanel, pf);
\r
2475 if (printJob.printDialog())
\r
2481 catch (Exception PrintException)
\r
2483 PrintException.printStackTrace();
\r
2490 * Generates menu items and listener event actions for web service clients
\r
2493 public void BuildWebServiceMenu()
\r
2495 if ( (Discoverer.services != null)
\r
2496 && (Discoverer.services.size() > 0))
\r
2498 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2499 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2500 Vector wsmenu = new Vector();
\r
2501 if (msaws != null)
\r
2503 // Add any Multiple Sequence Alignment Services
\r
2504 final JMenu msawsmenu = new JMenu("Alignment");
\r
2505 final AlignFrame af = this;
\r
2506 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2508 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2510 final JMenuItem method = new JMenuItem(sh.getName());
\r
2511 method.addActionListener(new ActionListener()
\r
2513 public void actionPerformed(ActionEvent e)
\r
2515 SequenceI[] msa = gatherSequencesForAlignment();
\r
2516 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2517 false, true, viewport.getAlignment().getDataset(), af);
\r
2522 msawsmenu.add(method);
\r
2523 // Deal with services that we know accept partial alignments.
\r
2524 if (sh.getName().indexOf("lustal") > -1)
\r
2526 // We know that ClustalWS can accept partial alignments for refinement.
\r
2527 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2528 methodR.addActionListener(new ActionListener()
\r
2530 public void actionPerformed(ActionEvent e)
\r
2532 SequenceI[] msa = gatherSequencesForAlignment();
\r
2533 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2534 true, true, viewport.getAlignment().getDataset(), af);
\r
2539 msawsmenu.add(methodR);
\r
2543 wsmenu.add(msawsmenu);
\r
2545 if (secstrpr != null)
\r
2547 // Add any secondary structure prediction services
\r
2548 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2549 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2551 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2553 final JMenuItem method = new JMenuItem(sh.getName());
\r
2554 method.addActionListener(new ActionListener()
\r
2556 public void actionPerformed(ActionEvent e)
\r
2558 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2559 if (msa.length == 1)
\r
2561 // Single Sequence prediction
\r
2562 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2566 if (msa.length > 1)
\r
2568 // Single Sequence prediction
\r
2569 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2575 secstrmenu.add(method);
\r
2577 wsmenu.add(secstrmenu);
\r
2579 this.webService.removeAll();
\r
2580 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2582 webService.add( (JMenu) wsmenu.get(i));
\r
2587 this.webService.removeAll();
\r
2588 this.webService.add(this.webServiceNoServices);
\r
2590 // TODO: add in rediscovery function
\r
2591 // TODO: reduce code redundancy.
\r
2592 // TODO: group services by location as well as function.
\r
2595 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2597 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2598 getProperty("LAST_DIRECTORY"));
\r
2600 chooser.setFileView(new JalviewFileView());
\r
2601 chooser.setDialogTitle("Export to Vamsas file");
\r
2602 chooser.setToolTipText("Export");
\r
2604 int value = chooser.showSaveDialog(this);
\r
2606 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2608 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2609 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2610 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2618 public void showTranslation_actionPerformed(ActionEvent e)
\r
2620 SequenceI [] selection = viewport.getSelectionAsNewSequence();
\r
2621 String [] seqstring = viewport.getSelectionAsString();
\r
2623 int s, sSize = selection.length;
\r
2624 SequenceI [] newSeq = new SequenceI[sSize];
\r
2627 StringBuffer protein;
\r
2629 for(s=0; s<sSize; s++)
\r
2631 protein = new StringBuffer();
\r
2632 seq = AlignSeq.extractGaps("-. ", seqstring[s]);
\r
2633 resSize = seq.length();
\r
2634 resSize -= resSize%3;
\r
2636 for(res = 0; res < resSize; res+=3)
\r
2638 String codon = seq.substring(res, res+3);
\r
2639 codon = codon.replace('U', 'T');
\r
2640 String aa = ResidueProperties.codonTranslate(codon);
\r
2642 protein.append(viewport.getGapCharacter());
\r
2643 else if(aa.equals("STOP"))
\r
2644 protein.append("X");
\r
2646 protein.append( aa );
\r
2648 newSeq[s] = new Sequence(selection[s].getName(),
\r
2649 protein.toString());
\r
2653 AlignmentI al = new Alignment(newSeq);
\r
2654 al.setDataset(null);
\r
2657 ////////////////////////////////
\r
2658 // Copy annotations across
\r
2659 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2660 = viewport.alignment.getAlignmentAnnotation();
\r
2662 if(annotations!=null)
\r
2664 for (int i = 0; i < annotations.length; i++)
\r
2666 if (annotations[i].label.equals("Quality") ||
\r
2667 annotations[i].label.equals("Conservation") ||
\r
2668 annotations[i].label.equals("Consensus"))
\r
2673 aSize = viewport.alignment.getWidth() / 3;
\r
2674 jalview.datamodel.Annotation[] anots =
\r
2675 new jalview.datamodel.Annotation[aSize];
\r
2677 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2679 if (annotations[i].annotations[a] == null
\r
2680 || annotations[i].annotations[a] == null)
\r
2683 anots[a / 3] = new Annotation(
\r
2684 annotations[i].annotations[a].displayCharacter,
\r
2685 annotations[i].annotations[a].description,
\r
2686 annotations[i].annotations[a].secondaryStructure,
\r
2687 annotations[i].annotations[a].value,
\r
2688 annotations[i].annotations[a].colour);
\r
2691 jalview.datamodel.AlignmentAnnotation aa
\r
2692 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2693 annotations[i].description, anots);
\r
2694 al.addAnnotation(aa);
\r
2698 AlignFrame af = new AlignFrame(al);
\r
2699 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2701 NEW_WINDOW_HEIGHT);
\r
2704 // AlignViewport newViewport = new AlignViewport(al);
\r
2705 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2706 // tabbedPane.add("Protein", ap);
\r
2707 // viewports.add(newViewport);
\r
2708 // alignPanels.add(ap);
\r
2711 /////////////////////////
\r
2713 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2714 // ds.setDataset(true);
\r
2715 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2716 // tabbedPane.add("Dataset", dap);
\r
2717 // viewports.add(ds);
\r
2718 // alignPanels.add(dap);
\r
2719 /////////////////////////
\r
2724 /*public void tabSelected()
\r
2726 int index = tabbedPane.getSelectedIndex();
\r
2727 viewport = (AlignViewport)viewports.elementAt(index);
\r
2728 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2734 * @param String DOCUMENT ME!
\r
2736 public boolean parseFeaturesFile(String file, String type)
\r
2738 boolean featuresFile = false;
\r
2740 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment.getDataset(),
\r
2741 alignPanel.seqPanel.seqCanvas.
\r
2742 getFeatureRenderer().featureColours,
\r
2745 catch(Exception ex)
\r
2747 ex.printStackTrace();
\r
2752 viewport.showSequenceFeatures = true;
\r
2753 showSeqFeatures.setSelected(true);
\r
2754 alignPanel.repaint();
\r
2757 return featuresFile;
\r
2760 public void dragEnter(DropTargetDragEvent evt)
\r
2763 public void dragExit(DropTargetEvent evt)
\r
2766 public void dragOver(DropTargetDragEvent evt)
\r
2769 public void dropActionChanged(DropTargetDragEvent evt)
\r
2772 public void drop(DropTargetDropEvent evt)
\r
2774 Transferable t = evt.getTransferable();
\r
2775 java.util.List files = null;
\r
2779 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2780 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2782 //Works on Windows and MacOSX
\r
2783 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2784 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2786 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2788 // This is used by Unix drag system
\r
2789 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2790 String data = (String) t.getTransferData(uriListFlavor);
\r
2791 files = new java.util.ArrayList(1);
\r
2792 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2795 st.hasMoreTokens(); )
\r
2797 String s = st.nextToken();
\r
2798 if (s.startsWith("#"))
\r
2800 // the line is a comment (as per the RFC 2483)
\r
2804 java.net.URI uri = new java.net.URI(s);
\r
2805 java.io.File file = new java.io.File(uri);
\r
2810 catch (Exception e)
\r
2812 e.printStackTrace();
\r
2814 if (files != null)
\r
2819 for (int i = 0; i < files.size(); i++)
\r
2821 loadJalviewDataFile(files.get(i).toString());
\r
2824 catch (Exception ex)
\r
2826 ex.printStackTrace();
\r
2831 // This method will attempt to load a "dropped" file first by testing
\r
2832 // whether its and Annotation file, then features file. If both are
\r
2833 // false then the user may have dropped an alignment file onto this
\r
2835 public void loadJalviewDataFile(String file)
\r
2838 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
\r
2841 if (!isAnnotation)
\r
2843 boolean isGroupsFile = parseFeaturesFile(file,
\r
2844 AppletFormatAdapter.FILE);
\r
2845 if (!isGroupsFile)
\r
2847 String protocol = "File";
\r
2848 String format = new IdentifyFile().Identify(file, protocol);
\r
2849 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2852 FastaFile ff = new FastaFile();
\r
2853 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2854 c.setContents(new StringSelection(ff.print(sequences)), Desktop.instance);
\r
2856 this.paste(false);
\r
2862 alignPanel.adjustAnnotationHeight();
\r
2865 }catch(Exception ex)
\r
2867 ex.printStackTrace();
\r