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
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
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.getViewAsString(false);
\r
365 String output = new FormatAdapter().formatSequences(
\r
367 viewport.alignment.getSequencesArray(),
\r
370 if (output == null)
\r
377 java.io.PrintWriter out = new java.io.PrintWriter(
\r
378 new java.io.FileWriter(file));
\r
382 this.setTitle(file);
\r
385 catch (Exception ex)
\r
387 ex.printStackTrace();
\r
396 * @param e DOCUMENT ME!
\r
398 protected void outputText_actionPerformed(ActionEvent e)
\r
400 String [] omitHidden = null;
\r
402 if(viewport.hasHiddenColumns)
\r
404 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
\r
405 "The Alignment contains hidden columns."
\r
406 +"\nDo you want to output only the visible alignment?",
\r
407 "Save / Omit Hidden Columns",
\r
408 JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
\r
410 if(reply==JOptionPane.YES_OPTION)
\r
412 omitHidden = viewport.getViewAsString(false);
\r
416 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
417 Desktop.addInternalFrame(cap,
\r
418 "Alignment output - " + e.getActionCommand(), 600,
\r
422 cap.setText(new FormatAdapter().formatSequences(
\r
423 e.getActionCommand(),
\r
424 viewport.alignment.getSequencesArray(),
\r
431 * @param e DOCUMENT ME!
\r
433 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
435 new HTMLOutput(viewport,
\r
436 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
437 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
440 public void createImageMap(File file, String image)
\r
442 alignPanel.makePNGImageMap(file, image);
\r
448 * @param e DOCUMENT ME!
\r
450 public void createPNG(File f)
\r
452 alignPanel.makePNG(f);
\r
458 * @param e DOCUMENT ME!
\r
460 public void createEPS(File f)
\r
462 alignPanel.makeEPS(f);
\r
468 * @param e DOCUMENT ME!
\r
470 public void printMenuItem_actionPerformed(ActionEvent e)
\r
472 //Putting in a thread avoids Swing painting problems
\r
473 PrintThread thread = new PrintThread();
\r
477 public void exportFeatures_actionPerformed(ActionEvent e)
\r
479 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.getViewAsString(true);
\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
772 if(Desktop.jalviewClipboard!=null)
\r
774 // The clipboard was filled from within Jalview, we must use the sequences
\r
775 // And dataset from the copied alignment
\r
776 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
780 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
783 AlignmentI alignment = null;
\r
787 System.out.println(format +" 2");
\r
788 alignment = new Alignment(sequences);
\r
790 if(Desktop.jalviewClipboard!=null)
\r
791 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
793 alignment.setDataset( null );
\r
798 System.out.println(format +" 24");
\r
799 alignment = viewport.getAlignment();
\r
802 for (int i = 0; i < sequences.length; i++)
\r
804 Sequence newseq = new Sequence(sequences[i].getName(),
\r
805 sequences[i].getSequence(), sequences[i].getStart(),
\r
806 sequences[i].getEnd());
\r
808 alignment.addSequence(newseq);
\r
812 viewport.setEndSeq(alignment.getHeight());
\r
813 alignment.getWidth();
\r
814 viewport.firePropertyChange("alignment", null, alignment.getSequences());
\r
821 // Add any annotations attached to sequences
\r
822 for (int i = 0; i < sequences.length; i++)
\r
824 if (sequences[i].getAnnotation() != null)
\r
826 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
\r
828 AlignmentAnnotation newAnnot =
\r
829 new AlignmentAnnotation(
\r
830 sequences[i].getAnnotation()[a].label,
\r
831 sequences[i].getAnnotation()[a].description,
\r
832 sequences[i].getAnnotation()[a].annotations,
\r
833 sequences[i].getAnnotation()[a].graphMin,
\r
834 sequences[i].getAnnotation()[a].graphMax,
\r
835 sequences[i].getAnnotation()[a].graph);
\r
837 sequences[i].getAnnotation()[a] = newAnnot;
\r
838 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
\r
840 newAnnot.sequenceRef = sequences[i];
\r
841 newAnnot.adjustForAlignment();
\r
842 alignment.addAnnotation(newAnnot);
\r
843 alignment.setAnnotationIndex(newAnnot, a);
\r
846 alignPanel.annotationPanel.adjustPanelHeight();
\r
852 AlignFrame af = new AlignFrame(alignment);
\r
853 String newtitle = new String("Copied sequences");
\r
855 if(Desktop.jalviewClipboard[2]!=null)
\r
857 Vector hc = (Vector)Desktop.jalviewClipboard[2];
\r
858 for(int i=0; i<hc.size(); i++)
\r
860 int [] region = (int[]) hc.elementAt(i);
\r
861 af.viewport.hideColumns(region[0], region[1]);
\r
866 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
867 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
868 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
871 if (title.startsWith("Copied sequences"))
\r
877 newtitle = newtitle.concat("- from " + title);
\r
880 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
881 NEW_WINDOW_HEIGHT);
\r
887 catch (Exception ex)
\r
889 ex.printStackTrace();
\r
890 System.out.println("Exception whilst pasting: "+ex);
\r
891 // could be anything being pasted in here
\r
900 * @param e DOCUMENT ME!
\r
902 protected void cut_actionPerformed(ActionEvent e)
\r
904 copy_actionPerformed(null);
\r
905 delete_actionPerformed(null);
\r
911 * @param e DOCUMENT ME!
\r
913 protected void delete_actionPerformed(ActionEvent e)
\r
916 if (viewport.getSelectionGroup() == null)
\r
922 SequenceGroup sg = viewport.getSelectionGroup();
\r
926 //Jalview no longer allows deletion of residues.
\r
927 //Check here whether any residues are in selection area
\r
928 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
930 for (int i = 0; i < sg.sequences.size(); i++)
\r
932 SequenceI seq = sg.getSequenceAt(i);
\r
933 int j = sg.getStartRes();
\r
936 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
938 JOptionPane.showInternalMessageDialog(
\r
939 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
940 + "Try hiding columns instead.",
\r
941 "Deletion of residues not permitted",
\r
942 JOptionPane.WARNING_MESSAGE);
\r
947 }while(j<=sg.getEndRes());
\r
952 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
953 HistoryItem.HIDE));
\r
956 for (int i = 0; i < sg.getSize(false); i++)
\r
958 SequenceI seq = sg.getSequenceAt(i);
\r
959 int index = viewport.getAlignment().findIndex(seq);
\r
961 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
963 // If the cut affects all sequences, remove highlighted columns
\r
964 if (sg.getSize(false) == viewport.alignment.getHeight())
\r
966 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
967 sg.getEndRes() + 1);
\r
970 if (seq.getSequence().length() < 1)
\r
972 viewport.getAlignment().deleteSequence(seq);
\r
976 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
980 viewport.setSelectionGroup(null);
\r
981 viewport.alignment.deleteGroup(sg);
\r
983 viewport.firePropertyChange("alignment", null,
\r
984 viewport.getAlignment().getSequences());
\r
988 if (viewport.getAlignment().getHeight() < 1)
\r
992 this.setClosed(true);
\r
994 catch (Exception ex)
\r
1003 * @param e DOCUMENT ME!
\r
1005 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
1007 viewport.alignment.deleteAllGroups();
\r
1008 viewport.setSelectionGroup(null);
\r
1009 alignPanel.repaint();
\r
1015 * @param e DOCUMENT ME!
\r
1017 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1019 SequenceGroup sg = new SequenceGroup();
\r
1021 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1024 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
1027 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
1028 viewport.setSelectionGroup(sg);
\r
1029 PaintRefresher.Refresh(null, viewport.alignment);
\r
1035 * @param e DOCUMENT ME!
\r
1037 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1039 if(viewport.cursorMode)
\r
1041 alignPanel.seqPanel.keyboardNo1 = null;
\r
1042 alignPanel.seqPanel.keyboardNo2 = null;
\r
1044 viewport.setSelectionGroup(null);
\r
1045 viewport.getColumnSelection().clear();
\r
1046 viewport.setSelectionGroup(null);
\r
1047 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
1048 alignPanel.idPanel.idCanvas.searchResults = null;
\r
1049 alignPanel.repaint();
\r
1050 PaintRefresher.Refresh(null, viewport.alignment);
\r
1056 * @param e DOCUMENT ME!
\r
1058 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
1060 SequenceGroup sg = viewport.getSelectionGroup();
\r
1064 selectAllSequenceMenuItem_actionPerformed(null);
\r
1069 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1072 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
1075 PaintRefresher.Refresh(null, viewport.alignment);
\r
1081 * @param e DOCUMENT ME!
\r
1083 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
1085 ColumnSelection colSel = viewport.getColumnSelection();
\r
1087 if (colSel.size() > 0)
\r
1089 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
1090 HistoryItem.HIDE));
\r
1092 int min = colSel.getMin();
\r
1093 viewport.getAlignment().trimLeft(min);
\r
1094 colSel.compensateForEdit(0, min);
\r
1096 if (viewport.getSelectionGroup() != null)
\r
1098 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
1101 Vector groups = viewport.alignment.getGroups();
\r
1103 for (int i = 0; i < groups.size(); i++)
\r
1105 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1107 if (!sg.adjustForRemoveLeft(min))
\r
1109 viewport.alignment.deleteGroup(sg);
\r
1113 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1120 * @param e DOCUMENT ME!
\r
1122 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1124 ColumnSelection colSel = viewport.getColumnSelection();
\r
1126 if (colSel.size() > 0)
\r
1128 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1129 HistoryItem.HIDE));
\r
1131 int max = colSel.getMax();
\r
1132 viewport.getAlignment().trimRight(max);
\r
1134 if (viewport.getSelectionGroup() != null)
\r
1136 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1139 Vector groups = viewport.alignment.getGroups();
\r
1141 for (int i = 0; i < groups.size(); i++)
\r
1143 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1145 if (!sg.adjustForRemoveRight(max))
\r
1147 viewport.alignment.deleteGroup(sg);
\r
1151 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1158 * @param e DOCUMENT ME!
\r
1160 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1162 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1163 viewport.alignment, HistoryItem.HIDE));
\r
1165 //This is to maintain viewport position on first residue
\r
1166 //of first sequence
\r
1167 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1168 int startRes = seq.findPosition(viewport.startRes);
\r
1170 viewport.getAlignment().removeGaps();
\r
1172 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1174 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1180 * @param e DOCUMENT ME!
\r
1182 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1184 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1185 HistoryItem.HIDE));
\r
1187 //This is to maintain viewport position on first residue
\r
1188 //of first sequence
\r
1189 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1190 int startRes = seq.findPosition(viewport.startRes);
\r
1193 SequenceI current;
\r
1196 Vector seqs = null;
\r
1199 int end = viewport.alignment.getWidth();
\r
1201 if (viewport.getSelectionGroup() != null
\r
1202 && viewport.getSelectionGroup().getSequences(true) != null
\r
1203 && viewport.getSelectionGroup().getSize(true) > 0)
\r
1205 seqs = viewport.getSelectionGroup().getSequences(true);
\r
1206 start = viewport.getSelectionGroup().getStartRes();
\r
1207 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1211 seqs = viewport.alignment.getSequences();
\r
1214 for (int i = 0; i < seqs.size(); i++)
\r
1216 current = (SequenceI) seqs.elementAt(i);
\r
1217 jSize = current.getLength();
\r
1219 // Removing a range is much quicker than removing gaps
\r
1220 // one by one for long sequences
\r
1222 int rangeStart=-1, rangeEnd=-1;
\r
1226 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1228 if(rangeStart==-1)
\r
1243 current.deleteChars(rangeStart, rangeEnd);
\r
1244 j-=rangeEnd-rangeStart;
\r
1245 jSize-=rangeEnd-rangeStart;
\r
1253 while (j < end && j < jSize);
\r
1256 current.deleteChars(rangeStart, rangeEnd);
\r
1260 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1262 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1265 public void alignmentChanged()
\r
1267 if(viewport.padGaps)
\r
1268 viewport.getAlignment().padGaps();
\r
1270 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1272 viewport.updateConsensus();
\r
1273 viewport.updateConservation();
\r
1275 resetAllColourSchemes();
\r
1276 if(alignPanel.overviewPanel!=null)
\r
1277 alignPanel.overviewPanel.updateOverviewImage();
\r
1279 viewport.alignment.adjustSequenceAnnotations();
\r
1281 alignPanel.repaint();
\r
1284 void resetAllColourSchemes()
\r
1286 ColourSchemeI cs = viewport.globalColourScheme;
\r
1289 if (cs instanceof ClustalxColourScheme)
\r
1291 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1292 resetClustalX(viewport.alignment.getSequences(),
\r
1293 viewport.alignment.getWidth());
\r
1296 cs.setConsensus(viewport.vconsensus);
\r
1297 if (cs.conservationApplied())
\r
1299 Alignment al = (Alignment) viewport.alignment;
\r
1300 Conservation c = new Conservation("All",
\r
1301 ResidueProperties.propHash, 3,
\r
1302 al.getSequences(), 0,
\r
1303 al.getWidth() - 1);
\r
1305 c.verdict(false, viewport.ConsPercGaps);
\r
1307 cs.setConservation(c);
\r
1311 int s, sSize = viewport.alignment.getGroups().size();
\r
1312 for(s=0; s<sSize; s++)
\r
1314 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1315 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1317 ((ClustalxColourScheme)sg.cs).resetClustalX(
\r
1318 sg.getSequences(true), sg.getWidth());
\r
1320 sg.recalcConservation();
\r
1327 * @param e DOCUMENT ME!
\r
1329 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1331 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1332 HistoryItem.HIDE));
\r
1334 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1336 // if (viewport.padGaps)
\r
1337 alignmentChanged();
\r
1343 * @param e DOCUMENT ME!
\r
1345 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1347 JInternalFrame frame = new JInternalFrame();
\r
1348 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1349 frame.setContentPane(finder);
\r
1350 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1351 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1357 * @param e DOCUMENT ME!
\r
1359 public void font_actionPerformed(ActionEvent e)
\r
1361 new FontChooser(alignPanel);
\r
1364 public void smoothFont_actionPerformed(ActionEvent e)
\r
1366 viewport.antiAlias = smoothFont.isSelected();
\r
1367 alignPanel.annotationPanel.image = null;
\r
1368 alignPanel.repaint();
\r
1375 * @param e DOCUMENT ME!
\r
1377 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1379 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1381 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1382 alignPanel.repaint();
\r
1389 * @param e DOCUMENT ME!
\r
1391 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1393 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1394 alignPanel.repaint();
\r
1400 * @param e DOCUMENT ME!
\r
1402 public void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1404 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1405 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1406 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1407 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1408 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1411 public void showAllSeqs_actionPerformed(ActionEvent e)
\r
1413 viewport.showAllHiddenSeqs();
\r
1417 public void showAllColumns_actionPerformed(ActionEvent e)
\r
1419 viewport.showAllHiddenColumns();
\r
1422 public void hideSelSequences_actionPerformed(ActionEvent e)
\r
1424 if(viewport.getSelectionGroup()==null)
\r
1427 SequenceI [] seqs = viewport.getSelectionGroup().getSequencesInOrder(
\r
1428 viewport.alignment
\r
1431 for(int i=0; i<seqs.length; i++)
\r
1433 viewport.hideSequence(seqs[i]);
\r
1436 alignPanel.repaint();
\r
1439 public void hideSelColumns_actionPerformed(ActionEvent e)
\r
1441 viewport.hideSelectedColumns();
\r
1442 alignPanel.repaint();
\r
1445 public void hiddenMarkers_actionPerformed(ActionEvent e)
\r
1447 viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
\r
1454 * @param e DOCUMENT ME!
\r
1456 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1458 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1459 alignPanel.repaint();
\r
1465 * @param e DOCUMENT ME!
\r
1467 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1469 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1470 alignPanel.repaint();
\r
1476 * @param e DOCUMENT ME!
\r
1478 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1480 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1481 alignPanel.repaint();
\r
1487 * @param e DOCUMENT ME!
\r
1489 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1491 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1492 alignPanel.repaint();
\r
1498 * @param e DOCUMENT ME!
\r
1500 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1502 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1503 alignPanel.repaint();
\r
1509 * @param e DOCUMENT ME!
\r
1511 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1513 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1514 alignPanel.repaint();
\r
1518 FeatureSettings featureSettings;
\r
1519 public void featureSettings_actionPerformed(ActionEvent e)
\r
1521 if(featureSettings !=null )
\r
1523 featureSettings.close();
\r
1524 featureSettings = null;
\r
1526 featureSettings = new FeatureSettings(this);
\r
1532 * @param evt DOCUMENT ME!
\r
1534 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1536 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1537 alignPanel.repaint();
\r
1538 if (alignPanel.getOverviewPanel() != null)
\r
1540 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1547 * @param e DOCUMENT ME!
\r
1549 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1551 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1552 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1558 * @param e DOCUMENT ME!
\r
1560 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1562 if (alignPanel.overviewPanel != null)
\r
1567 JInternalFrame frame = new JInternalFrame();
\r
1568 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1569 frame.setContentPane(overview);
\r
1570 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1571 frame.getWidth(), frame.getHeight());
\r
1573 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1574 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1576 public void internalFrameClosed(
\r
1577 javax.swing.event.InternalFrameEvent evt)
\r
1579 alignPanel.setOverviewPanel(null);
\r
1584 alignPanel.setOverviewPanel(overview);
\r
1590 * @param e DOCUMENT ME!
\r
1592 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1594 changeColour(null);
\r
1600 * @param e DOCUMENT ME!
\r
1602 public void clustalColour_actionPerformed(ActionEvent e)
\r
1604 changeColour(new ClustalxColourScheme(
\r
1605 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1611 * @param e DOCUMENT ME!
\r
1613 public void zappoColour_actionPerformed(ActionEvent e)
\r
1615 changeColour(new ZappoColourScheme());
\r
1621 * @param e DOCUMENT ME!
\r
1623 public void taylorColour_actionPerformed(ActionEvent e)
\r
1625 changeColour(new TaylorColourScheme());
\r
1631 * @param e DOCUMENT ME!
\r
1633 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1635 changeColour(new HydrophobicColourScheme());
\r
1641 * @param e DOCUMENT ME!
\r
1643 public void helixColour_actionPerformed(ActionEvent e)
\r
1645 changeColour(new HelixColourScheme());
\r
1651 * @param e DOCUMENT ME!
\r
1653 public void strandColour_actionPerformed(ActionEvent e)
\r
1655 changeColour(new StrandColourScheme());
\r
1661 * @param e DOCUMENT ME!
\r
1663 public void turnColour_actionPerformed(ActionEvent e)
\r
1665 changeColour(new TurnColourScheme());
\r
1671 * @param e DOCUMENT ME!
\r
1673 public void buriedColour_actionPerformed(ActionEvent e)
\r
1675 changeColour(new BuriedColourScheme());
\r
1681 * @param e DOCUMENT ME!
\r
1683 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1685 changeColour(new NucleotideColourScheme());
\r
1688 public void annotationColour_actionPerformed(ActionEvent e)
\r
1690 new AnnotationColourChooser(viewport, alignPanel);
\r
1697 * @param e DOCUMENT ME!
\r
1699 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1701 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1707 * @param cs DOCUMENT ME!
\r
1709 public void changeColour(ColourSchemeI cs)
\r
1711 int threshold = 0;
\r
1715 if (viewport.getAbovePIDThreshold())
\r
1717 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1720 cs.setThreshold(threshold,
\r
1721 viewport.getIgnoreGapsConsensus());
\r
1723 viewport.setGlobalColourScheme(cs);
\r
1727 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1730 if (viewport.getConservationSelected())
\r
1733 Alignment al = (Alignment) viewport.alignment;
\r
1734 Conservation c = new Conservation("All",
\r
1735 ResidueProperties.propHash, 3,
\r
1736 al.getSequences(), 0,
\r
1737 al.getWidth() - 1);
\r
1740 c.verdict(false, viewport.ConsPercGaps);
\r
1742 cs.setConservation(c);
\r
1744 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1749 cs.setConservation(null);
\r
1752 cs.setConsensus(viewport.vconsensus);
\r
1755 viewport.setGlobalColourScheme(cs);
\r
1757 if (viewport.getColourAppliesToAllGroups())
\r
1759 Vector groups = viewport.alignment.getGroups();
\r
1761 for (int i = 0; i < groups.size(); i++)
\r
1763 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1771 if (cs instanceof ClustalxColourScheme)
\r
1773 sg.cs = new ClustalxColourScheme(
\r
1774 sg.getSequences(true), sg.getWidth());
\r
1776 else if (cs instanceof UserColourScheme)
\r
1778 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1784 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1786 catch (Exception ex)
\r
1791 if (viewport.getAbovePIDThreshold()
\r
1792 || cs instanceof PIDColourScheme
\r
1793 || cs instanceof Blosum62ColourScheme)
\r
1795 sg.cs.setThreshold(threshold,
\r
1796 viewport.getIgnoreGapsConsensus());
\r
1798 sg.cs.setConsensus(AAFrequency.calculate(
\r
1799 sg.getSequences(true), 0,
\r
1803 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1806 if (viewport.getConservationSelected())
\r
1808 Conservation c = new Conservation("Group",
\r
1809 ResidueProperties.propHash, 3,
\r
1810 sg.getSequences(true), 0,
\r
1811 viewport.alignment.getWidth() - 1);
\r
1813 c.verdict(false, viewport.ConsPercGaps);
\r
1814 sg.cs.setConservation(c);
\r
1817 sg.cs.setConservation(null);
\r
1821 if (alignPanel.getOverviewPanel() != null)
\r
1823 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1826 alignPanel.repaint();
\r
1832 * @param e DOCUMENT ME!
\r
1834 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1836 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1838 SliderPanel.setPIDSliderSource(alignPanel,
\r
1839 viewport.getGlobalColourScheme(),
\r
1841 SliderPanel.showPIDSlider();
\r
1848 * @param e DOCUMENT ME!
\r
1850 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1852 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1854 SliderPanel.setConservationSlider(alignPanel,
\r
1855 viewport.globalColourScheme,
\r
1857 SliderPanel.showConservationSlider();
\r
1864 * @param e DOCUMENT ME!
\r
1866 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1868 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1870 viewport.setAbovePIDThreshold(false);
\r
1871 abovePIDThreshold.setSelected(false);
\r
1873 changeColour(viewport.getGlobalColourScheme());
\r
1875 modifyConservation_actionPerformed(null);
\r
1881 * @param e DOCUMENT ME!
\r
1883 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1885 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1887 conservationMenuItem.setSelected(false);
\r
1888 viewport.setConservationSelected(false);
\r
1890 changeColour(viewport.getGlobalColourScheme());
\r
1892 modifyPID_actionPerformed(null);
\r
1898 * @param e DOCUMENT ME!
\r
1900 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1902 if (e.getActionCommand().equals("User Defined..."))
\r
1904 new UserDefinedColours(alignPanel, null);
\r
1908 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1909 getUserColourSchemes().get(e.getActionCommand());
\r
1911 changeColour(udc);
\r
1915 public void updateUserColourMenu()
\r
1918 Component[] menuItems = colourMenu.getMenuComponents();
\r
1919 int i, iSize = menuItems.length;
\r
1920 for (i = 0; i < iSize; i++)
\r
1922 if (menuItems[i].getName() != null &&
\r
1923 menuItems[i].getName().equals("USER_DEFINED"))
\r
1925 colourMenu.remove(menuItems[i]);
\r
1929 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1931 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1932 getUserColourSchemes().keys();
\r
1934 while (userColours.hasMoreElements())
\r
1936 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1937 nextElement().toString());
\r
1938 radioItem.setName("USER_DEFINED");
\r
1939 radioItem.addMouseListener(new MouseAdapter()
\r
1941 public void mousePressed(MouseEvent evt)
\r
1943 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1945 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1947 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1948 "Remove from default list?",
\r
1949 "Remove user defined colour",
\r
1950 JOptionPane.YES_NO_OPTION);
\r
1951 if(option == JOptionPane.YES_OPTION)
\r
1953 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1954 colourMenu.remove(radioItem);
\r
1957 radioItem.addActionListener(new ActionListener()
\r
1959 public void actionPerformed(ActionEvent evt)
\r
1961 userDefinedColour_actionPerformed(evt);
\r
1967 radioItem.addActionListener(new ActionListener()
\r
1969 public void actionPerformed(ActionEvent evt)
\r
1971 userDefinedColour_actionPerformed(evt);
\r
1975 colourMenu.insert(radioItem, 15);
\r
1976 colours.add(radioItem);
\r
1984 * @param e DOCUMENT ME!
\r
1986 public void PIDColour_actionPerformed(ActionEvent e)
\r
1988 changeColour(new PIDColourScheme());
\r
1994 * @param e DOCUMENT ME!
\r
1996 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1998 changeColour(new Blosum62ColourScheme());
\r
2004 * @param e DOCUMENT ME!
\r
2006 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
2008 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
2009 HistoryItem.SORT));
\r
2010 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
2011 viewport.getAlignment().getSequenceAt(0));
\r
2012 alignPanel.repaint();
\r
2018 * @param e DOCUMENT ME!
\r
2020 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
2022 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
2023 HistoryItem.SORT));
\r
2024 AlignmentSorter.sortByID(viewport.getAlignment());
\r
2025 alignPanel.repaint();
\r
2031 * @param e DOCUMENT ME!
\r
2033 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
2035 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
2036 HistoryItem.SORT));
\r
2038 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
2039 alignPanel.repaint();
\r
2045 * @param e DOCUMENT ME!
\r
2047 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
2049 new RedundancyPanel(alignPanel, this);
\r
2056 * @param e DOCUMENT ME!
\r
2058 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
2060 if ( (viewport.getSelectionGroup() == null) ||
\r
2061 (viewport.getSelectionGroup().getSize(false) < 2))
\r
2063 JOptionPane.showInternalMessageDialog(this,
\r
2064 "You must select at least 2 sequences.",
\r
2065 "Invalid Selection",
\r
2066 JOptionPane.WARNING_MESSAGE);
\r
2070 JInternalFrame frame = new JInternalFrame();
\r
2071 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
2072 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
2079 * @param e DOCUMENT ME!
\r
2081 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
2083 if ( ( (viewport.getSelectionGroup() != null) &&
\r
2084 (viewport.getSelectionGroup().getSize(false) < 4) &&
\r
2085 (viewport.getSelectionGroup().getSize(false) > 0)) ||
\r
2086 (viewport.getAlignment().getHeight() < 4))
\r
2088 JOptionPane.showInternalMessageDialog(this,
\r
2089 "Principal component analysis must take\n" +
\r
2090 "at least 4 input sequences.",
\r
2091 "Sequence selection insufficient",
\r
2092 JOptionPane.WARNING_MESSAGE);
\r
2097 new PCAPanel(viewport);
\r
2101 public void autoCalculate_actionPerformed(ActionEvent e)
\r
2103 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
2104 if(viewport.autoCalculateConsensus)
\r
2106 alignmentChanged();
\r
2114 * @param e DOCUMENT ME!
\r
2116 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
2118 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2124 * @param e DOCUMENT ME!
\r
2126 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2128 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2134 * @param e DOCUMENT ME!
\r
2136 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2138 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2144 * @param e DOCUMENT ME!
\r
2146 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2148 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2154 * @param type DOCUMENT ME!
\r
2155 * @param pwType DOCUMENT ME!
\r
2156 * @param title DOCUMENT ME!
\r
2158 void NewTreePanel(String type, String pwType, String title)
\r
2162 if ( (viewport.getSelectionGroup() != null) &&
\r
2163 (viewport.getSelectionGroup().getSize(false) > 3))
\r
2166 SequenceGroup sg = viewport.getSelectionGroup();
\r
2168 /* Decide if the selection is a column region */
\r
2169 while (s < sg.getSize(false))
\r
2171 if ( ( (SequenceI) sg.getSequences(false).elementAt(s++)).getLength() <
\r
2174 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2175 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2176 "Try using the Pad function in the edit menu,\n" +
\r
2177 "or one of the multiple sequence alignment web services.",
\r
2178 "Sequences in selection are not aligned",
\r
2179 JOptionPane.WARNING_MESSAGE);
\r
2185 title = title + " on region";
\r
2186 tp = new TreePanel(viewport, type, pwType);
\r
2190 //are the sequences aligned?
\r
2191 if (!viewport.alignment.isAligned())
\r
2193 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2194 "The sequences must be aligned before creating a tree.\n" +
\r
2195 "Try using the Pad function in the edit menu,\n" +
\r
2196 "or one of the multiple sequence alignment web services.",
\r
2197 "Sequences not aligned",
\r
2198 JOptionPane.WARNING_MESSAGE);
\r
2203 if(viewport.alignment.getHeight()<2)
\r
2206 tp = new TreePanel(viewport, type, pwType);
\r
2209 addTreeMenuItem(tp, title);
\r
2211 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2217 * @param title DOCUMENT ME!
\r
2218 * @param order DOCUMENT ME!
\r
2220 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2222 final JMenuItem item = new JMenuItem("by " + title);
\r
2224 item.addActionListener(new java.awt.event.ActionListener()
\r
2226 public void actionPerformed(ActionEvent e)
\r
2228 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2229 HistoryItem.SORT));
\r
2231 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2232 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2233 alignPanel.repaint();
\r
2239 * Maintain the Order by->Displayed Tree menu.
\r
2240 * Creates a new menu item for a TreePanel with an appropriate
\r
2241 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2242 * to remove the menu item when the treePanel is closed, and adjust
\r
2243 * the tree leaf to sequence mapping when the alignment is modified.
\r
2244 * @param treePanel Displayed tree window.
\r
2245 * @param title SortBy menu item title.
\r
2247 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2249 final JMenuItem item = new JMenuItem(title);
\r
2253 if (treeCount == 1)
\r
2255 sort.add(sortByTreeMenu);
\r
2258 sortByTreeMenu.add(item);
\r
2259 item.addActionListener(new java.awt.event.ActionListener()
\r
2261 public void actionPerformed(ActionEvent e)
\r
2263 addHistoryItem(new HistoryItem("Tree Sort",
\r
2264 viewport.alignment, HistoryItem.SORT));
\r
2265 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2266 treePanel.getTree());
\r
2267 alignPanel.repaint();
\r
2271 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2272 InternalFrameAdapter()
\r
2274 public void internalFrameClosed(
\r
2275 javax.swing.event.InternalFrameEvent evt)
\r
2278 sortByTreeMenu.remove(item);
\r
2280 if (treeCount == 0)
\r
2282 sort.remove(sortByTreeMenu);
\r
2290 * Work out whether the whole set of sequences
\r
2291 * or just the selected set will be submitted for multiple alignment.
\r
2294 private SequenceI[] gatherSequencesForAlignment()
\r
2296 // Now, check we have enough sequences
\r
2297 SequenceI[] msa = null;
\r
2299 if ( (viewport.getSelectionGroup() != null) &&
\r
2300 (viewport.getSelectionGroup().getSize(false) > 1))
\r
2302 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2303 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2305 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2307 for (int i = 0; i < sz; i++)
\r
2309 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2314 Vector seqs = viewport.getAlignment().getSequences();
\r
2316 if (seqs.size() > 1)
\r
2318 msa = new SequenceI[seqs.size()];
\r
2320 for (int i = 0; i < seqs.size(); i++)
\r
2322 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2330 * Decides what is submitted to a secondary structure prediction service,
\r
2331 * the currently selected sequence, or the currently selected alignment
\r
2332 * (where the first sequence in the set is the one that the prediction
\r
2335 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2337 SequenceI seq = null;
\r
2338 SequenceI[] msa = null;
\r
2340 if ( (viewport.getSelectionGroup() != null) &&
\r
2341 (viewport.getSelectionGroup().getSize(false) > 0))
\r
2343 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2344 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2346 if ( (seqs.getSize(false) == 1) || !viewport.alignment.isAligned())
\r
2348 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2353 msa = new SequenceI[sz = seqs.getSize(false)];
\r
2355 for (int i = 0; i < sz; i++)
\r
2357 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2363 Vector seqs = viewport.getAlignment().getSequences();
\r
2365 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2367 seq = (SequenceI) seqs.elementAt(0);
\r
2371 msa = new SequenceI[seqs.size()];
\r
2373 for (int i = 0; i < seqs.size(); i++)
\r
2375 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2387 return new SequenceI[]
\r
2397 * @param e DOCUMENT ME!
\r
2399 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2401 // Pick the tree file
\r
2402 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2404 "LAST_DIRECTORY"));
\r
2405 chooser.setFileView(new JalviewFileView());
\r
2406 chooser.setDialogTitle("Select a newick-like tree file");
\r
2407 chooser.setToolTipText("Load a tree file");
\r
2409 int value = chooser.showOpenDialog(null);
\r
2411 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2413 String choice = chooser.getSelectedFile().getPath();
\r
2414 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2418 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2420 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2422 catch (Exception ex)
\r
2424 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2425 "Problem reading tree file",
\r
2427 JOptionPane.WARNING_MESSAGE);
\r
2428 ex.printStackTrace();
\r
2434 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2436 return ShowNewickTree(nf,title,600,500,4,5);
\r
2441 * @param nf DOCUMENT ME!
\r
2442 * @param title DOCUMENT ME!
\r
2444 * @return DOCUMENT ME!
\r
2446 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2448 TreePanel tp = null;
\r
2454 if (nf.getTree() != null)
\r
2456 tp = new TreePanel(viewport,
\r
2464 tp.setLocation(x,y);
\r
2467 Desktop.addInternalFrame(tp, title, w, h);
\r
2468 addTreeMenuItem(tp, title);
\r
2471 catch (Exception ex)
\r
2473 ex.printStackTrace();
\r
2484 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2485 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2486 printJob.setPrintable(alignPanel, pf);
\r
2488 if (printJob.printDialog())
\r
2494 catch (Exception PrintException)
\r
2496 PrintException.printStackTrace();
\r
2503 * Generates menu items and listener event actions for web service clients
\r
2506 public void BuildWebServiceMenu()
\r
2508 if ( (Discoverer.services != null)
\r
2509 && (Discoverer.services.size() > 0))
\r
2511 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2512 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2513 Vector wsmenu = new Vector();
\r
2514 if (msaws != null)
\r
2516 // Add any Multiple Sequence Alignment Services
\r
2517 final JMenu msawsmenu = new JMenu("Alignment");
\r
2518 final AlignFrame af = this;
\r
2519 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2521 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2523 final JMenuItem method = new JMenuItem(sh.getName());
\r
2524 method.addActionListener(new ActionListener()
\r
2526 public void actionPerformed(ActionEvent e)
\r
2528 SequenceI[] msa = gatherSequencesForAlignment();
\r
2529 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2530 false, true, viewport.getAlignment().getDataset(), af);
\r
2535 msawsmenu.add(method);
\r
2536 // Deal with services that we know accept partial alignments.
\r
2537 if (sh.getName().indexOf("lustal") > -1)
\r
2539 // We know that ClustalWS can accept partial alignments for refinement.
\r
2540 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2541 methodR.addActionListener(new ActionListener()
\r
2543 public void actionPerformed(ActionEvent e)
\r
2545 SequenceI[] msa = gatherSequencesForAlignment();
\r
2546 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2547 true, true, viewport.getAlignment().getDataset(), af);
\r
2552 msawsmenu.add(methodR);
\r
2556 wsmenu.add(msawsmenu);
\r
2558 if (secstrpr != null)
\r
2560 // Add any secondary structure prediction services
\r
2561 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2562 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2564 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2566 final JMenuItem method = new JMenuItem(sh.getName());
\r
2567 method.addActionListener(new ActionListener()
\r
2569 public void actionPerformed(ActionEvent e)
\r
2571 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2572 if (msa.length == 1)
\r
2574 // Single Sequence prediction
\r
2575 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2579 if (msa.length > 1)
\r
2581 // Single Sequence prediction
\r
2582 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2588 secstrmenu.add(method);
\r
2590 wsmenu.add(secstrmenu);
\r
2592 this.webService.removeAll();
\r
2593 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2595 webService.add( (JMenu) wsmenu.get(i));
\r
2600 this.webService.removeAll();
\r
2601 this.webService.add(this.webServiceNoServices);
\r
2603 // TODO: add in rediscovery function
\r
2604 // TODO: reduce code redundancy.
\r
2605 // TODO: group services by location as well as function.
\r
2608 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2610 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2611 getProperty("LAST_DIRECTORY"));
\r
2613 chooser.setFileView(new JalviewFileView());
\r
2614 chooser.setDialogTitle("Export to Vamsas file");
\r
2615 chooser.setToolTipText("Export");
\r
2617 int value = chooser.showSaveDialog(this);
\r
2619 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2621 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2622 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2623 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2630 public void showTranslation_actionPerformed(ActionEvent e)
\r
2632 SequenceI [] selection = viewport.getSelectionAsNewSequence();
\r
2633 String [] seqstring = viewport.getViewAsString(true);
\r
2635 int s, sSize = selection.length;
\r
2636 SequenceI [] newSeq = new SequenceI[sSize];
\r
2639 StringBuffer protein;
\r
2641 for(s=0; s<sSize; s++)
\r
2643 protein = new StringBuffer();
\r
2644 seq = AlignSeq.extractGaps("-. ", seqstring[s]);
\r
2645 resSize = seq.length();
\r
2646 resSize -= resSize%3;
\r
2648 for(res = 0; res < resSize; res+=3)
\r
2650 String codon = seq.substring(res, res+3);
\r
2651 codon = codon.replace('U', 'T');
\r
2652 String aa = ResidueProperties.codonTranslate(codon);
\r
2654 protein.append(viewport.getGapCharacter());
\r
2655 else if(aa.equals("STOP"))
\r
2656 protein.append("X");
\r
2658 protein.append( aa );
\r
2660 newSeq[s] = new Sequence(selection[s].getName(),
\r
2661 protein.toString());
\r
2665 AlignmentI al = new Alignment(newSeq);
\r
2666 al.setDataset(null);
\r
2669 ////////////////////////////////
\r
2670 // Copy annotations across
\r
2671 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2672 = viewport.alignment.getAlignmentAnnotation();
\r
2674 if(annotations!=null)
\r
2676 for (int i = 0; i < annotations.length; i++)
\r
2678 if (annotations[i].label.equals("Quality") ||
\r
2679 annotations[i].label.equals("Conservation") ||
\r
2680 annotations[i].label.equals("Consensus"))
\r
2685 aSize = viewport.alignment.getWidth() / 3;
\r
2686 jalview.datamodel.Annotation[] anots =
\r
2687 new jalview.datamodel.Annotation[aSize];
\r
2689 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2691 if (annotations[i].annotations[a] == null
\r
2692 || annotations[i].annotations[a] == null)
\r
2695 anots[a / 3] = new Annotation(
\r
2696 annotations[i].annotations[a].displayCharacter,
\r
2697 annotations[i].annotations[a].description,
\r
2698 annotations[i].annotations[a].secondaryStructure,
\r
2699 annotations[i].annotations[a].value,
\r
2700 annotations[i].annotations[a].colour);
\r
2703 jalview.datamodel.AlignmentAnnotation aa
\r
2704 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2705 annotations[i].description, anots);
\r
2706 al.addAnnotation(aa);
\r
2710 AlignFrame af = new AlignFrame(al);
\r
2711 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2713 NEW_WINDOW_HEIGHT);
\r
2716 // AlignViewport newViewport = new AlignViewport(al);
\r
2717 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2718 // tabbedPane.add("Protein", ap);
\r
2719 // viewports.add(newViewport);
\r
2720 // alignPanels.add(ap);
\r
2723 /////////////////////////
\r
2725 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2726 // ds.setDataset(true);
\r
2727 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2728 // tabbedPane.add("Dataset", dap);
\r
2729 // viewports.add(ds);
\r
2730 // alignPanels.add(dap);
\r
2731 /////////////////////////
\r
2736 /*public void tabSelected()
\r
2738 int index = tabbedPane.getSelectedIndex();
\r
2739 viewport = (AlignViewport)viewports.elementAt(index);
\r
2740 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2746 * @param String DOCUMENT ME!
\r
2748 public boolean parseFeaturesFile(String file, String type)
\r
2750 boolean featuresFile = false;
\r
2752 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment.getDataset(),
\r
2753 alignPanel.seqPanel.seqCanvas.
\r
2754 getFeatureRenderer().featureColours,
\r
2757 catch(Exception ex)
\r
2759 ex.printStackTrace();
\r
2764 viewport.showSequenceFeatures = true;
\r
2765 showSeqFeatures.setSelected(true);
\r
2766 alignPanel.repaint();
\r
2769 return featuresFile;
\r
2772 public void dragEnter(DropTargetDragEvent evt)
\r
2775 public void dragExit(DropTargetEvent evt)
\r
2778 public void dragOver(DropTargetDragEvent evt)
\r
2781 public void dropActionChanged(DropTargetDragEvent evt)
\r
2784 public void drop(DropTargetDropEvent evt)
\r
2786 Transferable t = evt.getTransferable();
\r
2787 java.util.List files = null;
\r
2791 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2792 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2794 //Works on Windows and MacOSX
\r
2795 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2796 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2798 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2800 // This is used by Unix drag system
\r
2801 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2802 String data = (String) t.getTransferData(uriListFlavor);
\r
2803 files = new java.util.ArrayList(1);
\r
2804 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2807 st.hasMoreTokens(); )
\r
2809 String s = st.nextToken();
\r
2810 if (s.startsWith("#"))
\r
2812 // the line is a comment (as per the RFC 2483)
\r
2816 java.net.URI uri = new java.net.URI(s);
\r
2817 java.io.File file = new java.io.File(uri);
\r
2822 catch (Exception e)
\r
2824 e.printStackTrace();
\r
2826 if (files != null)
\r
2831 for (int i = 0; i < files.size(); i++)
\r
2833 loadJalviewDataFile(files.get(i).toString());
\r
2836 catch (Exception ex)
\r
2838 ex.printStackTrace();
\r
2843 // This method will attempt to load a "dropped" file first by testing
\r
2844 // whether its and Annotation file, then features file. If both are
\r
2845 // false then the user may have dropped an alignment file onto this
\r
2847 public void loadJalviewDataFile(String file)
\r
2850 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
\r
2853 if (!isAnnotation)
\r
2855 boolean isGroupsFile = parseFeaturesFile(file,
\r
2856 AppletFormatAdapter.FILE);
\r
2857 if (!isGroupsFile)
\r
2859 String format = new IdentifyFile().Identify(file, FormatAdapter.FILE);
\r
2860 new FileLoader().LoadFile(viewport, file, FormatAdapter.FILE, format);
\r
2866 alignPanel.adjustAnnotationHeight();
\r
2869 }catch(Exception ex)
\r
2871 ex.printStackTrace();
\r