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
44 * @version $Revision$
\r
46 public class AlignFrame
\r
47 extends GAlignFrame implements ClipboardOwner, DropTargetListener
\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 Vector viewports = new Vector();
\r
58 Vector alignPanels = new Vector();
\r
60 /** DOCUMENT ME!! */
\r
61 public String currentFileFormat = null;
\r
62 Stack historyList = new Stack();
\r
63 Stack redoList = new Stack();
\r
64 private int treeCount = 0;
\r
68 * Creates a new AlignFrame object.
\r
70 * @param al DOCUMENT ME!
\r
72 public AlignFrame(AlignmentI al)
\r
74 viewport = new AlignViewport(al);
\r
75 viewports.add(viewport);
\r
77 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
\r
79 if(viewport.vconsensus==null)
\r
81 //Out of memory calculating consensus.
\r
82 BLOSUM62Colour.setEnabled(false);
\r
83 PIDColour.setEnabled(false);
\r
84 conservationMenuItem.setEnabled(false);
\r
85 modifyConservation.setEnabled(false);
\r
86 abovePIDThreshold.setEnabled(false);
\r
87 modifyPID.setEnabled(false);
\r
90 alignPanel = new AlignmentPanel(this, viewport);
\r
91 alignPanels.add(alignPanel);
\r
93 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
\r
95 if(sortby.equals("Id"))
\r
96 sortIDMenuItem_actionPerformed(null);
\r
97 else if(sortby.equals("Pairwise Identity"))
\r
98 sortPairwiseMenuItem_actionPerformed(null);
\r
100 // remove(tabbedPane);
\r
101 getContentPane().add(alignPanel, BorderLayout.CENTER);
\r
105 // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
\r
108 /////////////////////////
\r
109 if(al.getDataset()==null)
\r
111 al.setDataset(null);
\r
113 // AlignViewport ds = new AlignViewport(al.getDataset(), true);
\r
114 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
115 // tabbedPane.add("Dataset", dap);
\r
116 // viewports.add(ds);
\r
117 // alignPanels.add(dap);
\r
118 /////////////////////////
\r
121 viewport.addPropertyChangeListener(new PropertyChangeListener()
\r
123 public void propertyChange(PropertyChangeEvent evt)
\r
125 if (evt.getPropertyName().equals("alignment"))
\r
127 alignmentChanged();
\r
133 if (Desktop.desktop != null)
\r
135 addServiceListeners();
\r
136 setGUINucleotide(al.isNucleotide());
\r
140 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
141 private void addServiceListeners()
\r
143 final java.beans.PropertyChangeListener thisListener;
\r
144 // Do this once to get current state
\r
145 BuildWebServiceMenu();
\r
146 Desktop.discoverer.addPropertyChangeListener(
\r
147 thisListener = new java.beans.PropertyChangeListener()
\r
149 public void propertyChange(PropertyChangeEvent evt)
\r
151 // System.out.println("Discoverer property change.");
\r
152 if (evt.getPropertyName().equals("services"))
\r
154 // System.out.println("Rebuilding web service menu");
\r
155 BuildWebServiceMenu();
\r
159 addInternalFrameListener(new javax.swing.event.
\r
160 InternalFrameAdapter()
\r
162 public void internalFrameClosed(
\r
163 javax.swing.event.InternalFrameEvent evt)
\r
165 // System.out.println("deregistering discoverer listener");
\r
166 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
167 closeMenuItem_actionPerformed(null);
\r
174 public void setGUINucleotide(boolean nucleotide)
\r
176 showTranslation.setVisible( nucleotide );
\r
177 //sequenceFeatures.setVisible(!nucleotide );
\r
178 //featureSettings.setVisible( !nucleotide );
\r
179 conservationMenuItem.setVisible( !nucleotide );
\r
180 modifyConservation.setVisible( !nucleotide );
\r
182 //Remember AlignFrame always starts as protein
\r
185 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
191 Added so Castor Mapping file can obtain Jalview Version
\r
193 public String getVersion()
\r
195 return jalview.bin.Cache.getProperty("VERSION");
\r
199 public void fetchSequence_actionPerformed(ActionEvent e)
\r
201 new SequenceFetcher(this);
\r
206 * @param e DOCUMENT ME!
\r
208 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
210 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
215 "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",
\r
220 "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"
\r
221 }, currentFileFormat);
\r
223 chooser.setAcceptAllFileFilterUsed(false);
\r
224 chooser.setFileView(new JalviewFileView());
\r
225 chooser.setDialogTitle("Save Alignment to file");
\r
226 chooser.setToolTipText("Save");
\r
228 int value = chooser.showSaveDialog(this);
\r
230 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
232 currentFileFormat = chooser.getSelectedFormat();
\r
234 if (currentFileFormat == null)
\r
236 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
237 "You must select a file format before saving!",
\r
238 "File format not specified",
\r
239 JOptionPane.WARNING_MESSAGE);
\r
240 value = chooser.showSaveDialog(this);
\r
244 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
245 currentFileFormat);
\r
247 String choice = chooser.getSelectedFile().getPath();
\r
248 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
250 saveAlignment(choice, currentFileFormat);
\r
254 public boolean saveAlignment(String file, String format)
\r
256 if (format.equalsIgnoreCase("Jalview"))
\r
258 String shortName = title;
\r
260 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
262 shortName = shortName.substring(shortName.lastIndexOf(
\r
263 java.io.File.separatorChar) + 1);
\r
266 Jalview2XML.SaveAlignment(this, file, shortName);
\r
268 // USE Jalview2XML to save this file
\r
273 String output = new FormatAdapter().formatSequences(format,
\r
274 viewport.getAlignment().
\r
276 if (output == null)
\r
283 java.io.PrintWriter out = new java.io.PrintWriter(
\r
284 new java.io.FileWriter(file));
\r
290 catch (Exception ex)
\r
292 ex.printStackTrace();
\r
301 * @param e DOCUMENT ME!
\r
303 protected void outputText_actionPerformed(ActionEvent e)
\r
305 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
306 Desktop.addInternalFrame(cap,
\r
307 "Alignment output - " + e.getActionCommand(), 600,
\r
309 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
310 viewport.getAlignment().
\r
317 * @param e DOCUMENT ME!
\r
319 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
321 new HTMLOutput(viewport,
\r
322 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
323 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
326 public void createImageMap(File file, String image)
\r
328 alignPanel.makePNGImageMap(file, image);
\r
334 * @param e DOCUMENT ME!
\r
336 public void createPNG(File f)
\r
338 alignPanel.makePNG(f);
\r
344 * @param e DOCUMENT ME!
\r
346 public void createEPS(File f)
\r
348 alignPanel.makeEPS(f);
\r
354 * @param e DOCUMENT ME!
\r
356 public void printMenuItem_actionPerformed(ActionEvent e)
\r
358 //Putting in a thread avoids Swing painting problems
\r
359 PrintThread thread = new PrintThread();
\r
366 * @param e DOCUMENT ME!
\r
368 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
372 PaintRefresher.components.remove(viewport.alignment);
\r
373 this.setClosed(true);
\r
375 catch (Exception ex)
\r
383 void updateEditMenuBar()
\r
385 if (historyList.size() > 0)
\r
387 undoMenuItem.setEnabled(true);
\r
389 HistoryItem hi = (HistoryItem) historyList.peek();
\r
390 undoMenuItem.setText("Undo " + hi.getDescription());
\r
394 undoMenuItem.setEnabled(false);
\r
395 undoMenuItem.setText("Undo");
\r
398 if (redoList.size() > 0)
\r
400 redoMenuItem.setEnabled(true);
\r
402 HistoryItem hi = (HistoryItem) redoList.peek();
\r
403 redoMenuItem.setText("Redo " + hi.getDescription());
\r
407 redoMenuItem.setEnabled(false);
\r
408 redoMenuItem.setText("Redo");
\r
415 * @param hi DOCUMENT ME!
\r
417 public void addHistoryItem(HistoryItem hi)
\r
419 historyList.push(hi);
\r
420 updateEditMenuBar();
\r
426 * @param e DOCUMENT ME!
\r
428 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
430 HistoryItem hi = (HistoryItem) historyList.pop();
\r
431 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
432 HistoryItem.HIDE));
\r
433 restoreHistoryItem(hi);
\r
434 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
440 * @param e DOCUMENT ME!
\r
442 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
444 HistoryItem hi = (HistoryItem) redoList.pop();
\r
445 restoreHistoryItem(hi);
\r
446 updateEditMenuBar();
\r
447 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
450 // used by undo and redo
\r
451 void restoreHistoryItem(HistoryItem hi)
\r
456 updateEditMenuBar();
\r
458 viewport.firePropertyChange("alignment", null,
\r
459 viewport.getAlignment().getSequences());
\r
465 * @param up DOCUMENT ME!
\r
467 public void moveSelectedSequences(boolean up)
\r
469 SequenceGroup sg = viewport.getSelectionGroup();
\r
478 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
480 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
482 if (!sg.sequences.contains(seq))
\r
487 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
489 if (sg.sequences.contains(temp))
\r
494 viewport.alignment.getSequences().setElementAt(temp, i);
\r
495 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
500 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
502 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
504 if (!sg.sequences.contains(seq))
\r
509 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
511 if (sg.sequences.contains(temp))
\r
516 viewport.alignment.getSequences().setElementAt(temp, i);
\r
517 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
521 alignPanel.repaint();
\r
524 public void lostOwnership(Clipboard clipboard, Transferable contents)
\r
526 Desktop.jalviewClipboard = null;
\r
533 * @param e DOCUMENT ME!
\r
535 protected void copy_actionPerformed(ActionEvent e)
\r
537 if (viewport.getSelectionGroup() == null)
\r
542 SequenceGroup sg = viewport.getSelectionGroup();
\r
544 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
546 Hashtable orderedSeqs = new Hashtable();
\r
547 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
549 for (int i = 0; i < sg.getSize(); i++)
\r
551 SequenceI seq = sg.getSequenceAt(i);
\r
552 int index = viewport.alignment.findIndex(seq);
\r
553 orderedSeqs.put(index + "", seq);
\r
556 int index = 0, startRes, endRes;
\r
559 for (int i = 0; i < sg.getSize(); i++)
\r
561 SequenceI seq = null;
\r
563 while (seq == null)
\r
565 if (orderedSeqs.containsKey(index + ""))
\r
567 seq = (SequenceI) orderedSeqs.get(index + "");
\r
579 //Returns residue following index if gap
\r
580 startRes = seq.findPosition(sg.getStartRes());
\r
583 //Need to find the residue preceeding index if gap
\r
586 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
588 ch = seq.getCharAt(j);
\r
589 if (!jalview.util.Comparison.isGap( (ch)))
\r
597 endRes += seq.getStart() - 1;
\r
600 seqs[i] = new Sequence(seq.getName(),
\r
601 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
604 seqs[i].setDescription(seq.getDescription());
\r
605 seqs[i].setDBRef(seq.getDBRef());
\r
606 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
607 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
611 FastaFile ff = new FastaFile();
\r
612 ff.addJVSuffix( viewport.showJVSuffix );
\r
613 c.setContents(new StringSelection( ff.print(seqs)), this);
\r
614 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
620 * @param e DOCUMENT ME!
\r
622 protected void pasteNew_actionPerformed(ActionEvent e)
\r
630 * @param e DOCUMENT ME!
\r
632 protected void pasteThis_actionPerformed(ActionEvent e)
\r
634 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
635 HistoryItem.PASTE));
\r
642 * @param newAlignment DOCUMENT ME!
\r
644 void paste(boolean newAlignment)
\r
648 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
649 Transferable contents = c.getContents(this);
\r
651 if (contents == null)
\r
656 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
660 String format = new IdentifyFile().Identify(str, "Paste");
\r
661 SequenceI[] sequences;
\r
663 if(Desktop.jalviewClipboard!=null)
\r
665 // The clipboard was filled from within Jalview, we must use the sequences
\r
666 // And dataset from the copied alignment
\r
667 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
671 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
677 Alignment alignment = new Alignment(sequences);
\r
679 if(Desktop.jalviewClipboard!=null)
\r
680 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
682 alignment.setDataset( null );
\r
685 AlignFrame af = new AlignFrame(alignment);
\r
686 String newtitle = new String("Copied sequences");
\r
688 if (title.startsWith("Copied sequences"))
\r
694 newtitle = newtitle.concat("- from " + title);
\r
697 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
698 NEW_WINDOW_HEIGHT);
\r
703 for (int i = 0; i < sequences.length; i++)
\r
705 Sequence newseq = new Sequence(sequences[i].getName(),
\r
706 sequences[i].getSequence(), sequences[i].getStart(),
\r
707 sequences[i].getEnd());
\r
708 viewport.alignment.addSequence(newseq);
\r
709 if(sequences[i].getDatasetSequence()==null)
\r
711 ////////////////////////////
\r
712 //Datset needs extension;
\r
713 /////////////////////////////
\r
714 Sequence ds = new Sequence(sequences[i].getName(),
\r
715 AlignSeq.extractGaps("-. ", sequences[i].getSequence()),
\r
716 sequences[i].getStart(),
\r
717 sequences[i].getEnd());
\r
718 newseq.setDatasetSequence(ds);
\r
719 viewport.alignment.getDataset().addSequence(ds);
\r
723 newseq.setDatasetSequence(sequences[i].getDatasetSequence());
\r
724 if(sequences[i].getDatasetSequence().getAnnotation()!=null)
\r
726 for(int aa=0; aa<sequences[i].getDatasetSequence().getAnnotation().length; aa++)
\r
728 viewport.alignment.addAnnotation(sequences[i].getDatasetSequence().getAnnotation()[aa]);
\r
733 viewport.setEndSeq(viewport.alignment.getHeight());
\r
734 viewport.alignment.getWidth();
\r
735 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
738 catch (Exception ex)
\r
740 ex.printStackTrace();
\r
741 System.out.println("Exception whilst pasting: "+ex);
\r
742 // could be anything being pasted in here
\r
751 * @param e DOCUMENT ME!
\r
753 protected void cut_actionPerformed(ActionEvent e)
\r
755 copy_actionPerformed(null);
\r
756 delete_actionPerformed(null);
\r
762 * @param e DOCUMENT ME!
\r
764 protected void delete_actionPerformed(ActionEvent e)
\r
767 if (viewport.getSelectionGroup() == null)
\r
773 SequenceGroup sg = viewport.getSelectionGroup();
\r
777 //Jalview no longer allows deletion of residues.
\r
778 //Check here whether any residues are in selection area
\r
779 if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
781 for (int i = 0; i < sg.sequences.size(); i++)
\r
783 SequenceI seq = sg.getSequenceAt(i);
\r
784 int j = sg.getStartRes();
\r
787 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
789 JOptionPane.showInternalMessageDialog(
\r
790 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
791 + "Try hiding columns instead.",
\r
792 "Deletion of residues not permitted",
\r
793 JOptionPane.WARNING_MESSAGE);
\r
798 }while(j<=sg.getEndRes());
\r
803 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
804 HistoryItem.HIDE));
\r
807 for (int i = 0; i < sg.sequences.size(); i++)
\r
809 SequenceI seq = sg.getSequenceAt(i);
\r
810 int index = viewport.getAlignment().findIndex(seq);
\r
812 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
814 // If the cut affects all sequences, remove highlighted columns
\r
815 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
817 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
818 sg.getEndRes() + 1);
\r
821 if (seq.getSequence().length() < 1)
\r
823 viewport.getAlignment().deleteSequence(seq);
\r
827 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
831 viewport.setSelectionGroup(null);
\r
832 viewport.alignment.deleteGroup(sg);
\r
834 viewport.firePropertyChange("alignment", null,
\r
835 viewport.getAlignment().getSequences());
\r
839 if (viewport.getAlignment().getHeight() < 1)
\r
843 this.setClosed(true);
\r
845 catch (Exception ex)
\r
854 * @param e DOCUMENT ME!
\r
856 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
858 viewport.alignment.deleteAllGroups();
\r
859 viewport.setSelectionGroup(null);
\r
860 alignPanel.repaint();
\r
866 * @param e DOCUMENT ME!
\r
868 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
870 SequenceGroup sg = new SequenceGroup();
\r
872 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
875 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
878 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
879 viewport.setSelectionGroup(sg);
\r
880 PaintRefresher.Refresh(null, viewport.alignment);
\r
886 * @param e DOCUMENT ME!
\r
888 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
890 viewport.setSelectionGroup(null);
\r
891 viewport.getColumnSelection().clear();
\r
892 viewport.setSelectionGroup(null);
\r
893 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
894 alignPanel.idPanel.idCanvas.searchResults = null;
\r
895 PaintRefresher.Refresh(null, viewport.alignment);
\r
901 * @param e DOCUMENT ME!
\r
903 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
905 SequenceGroup sg = viewport.getSelectionGroup();
\r
909 selectAllSequenceMenuItem_actionPerformed(null);
\r
914 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
917 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
920 PaintRefresher.Refresh(null, viewport.alignment);
\r
926 * @param e DOCUMENT ME!
\r
928 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
930 ColumnSelection colSel = viewport.getColumnSelection();
\r
932 if (colSel.size() > 0)
\r
934 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
935 HistoryItem.HIDE));
\r
937 int min = colSel.getMin();
\r
938 viewport.getAlignment().trimLeft(min);
\r
939 colSel.compensateForEdit(0, min);
\r
941 if (viewport.getSelectionGroup() != null)
\r
943 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
946 Vector groups = viewport.alignment.getGroups();
\r
948 for (int i = 0; i < groups.size(); i++)
\r
950 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
952 if (!sg.adjustForRemoveLeft(min))
\r
954 viewport.alignment.deleteGroup(sg);
\r
958 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
965 * @param e DOCUMENT ME!
\r
967 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
969 ColumnSelection colSel = viewport.getColumnSelection();
\r
971 if (colSel.size() > 0)
\r
973 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
974 HistoryItem.HIDE));
\r
976 int max = colSel.getMax();
\r
977 viewport.getAlignment().trimRight(max);
\r
979 if (viewport.getSelectionGroup() != null)
\r
981 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
984 Vector groups = viewport.alignment.getGroups();
\r
986 for (int i = 0; i < groups.size(); i++)
\r
988 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
990 if (!sg.adjustForRemoveRight(max))
\r
992 viewport.alignment.deleteGroup(sg);
\r
996 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1003 * @param e DOCUMENT ME!
\r
1005 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1007 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1008 viewport.alignment, HistoryItem.HIDE));
\r
1010 //This is to maintain viewport position on first residue
\r
1011 //of first sequence
\r
1012 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1013 int startRes = seq.findPosition(viewport.startRes);
\r
1015 viewport.getAlignment().removeGaps();
\r
1017 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1019 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1025 * @param e DOCUMENT ME!
\r
1027 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1029 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1030 HistoryItem.HIDE));
\r
1032 //This is to maintain viewport position on first residue
\r
1033 //of first sequence
\r
1034 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1035 int startRes = seq.findPosition(viewport.startRes);
\r
1038 SequenceI current;
\r
1041 Vector seqs = null;
\r
1044 int end = viewport.alignment.getWidth();
\r
1046 if (viewport.getSelectionGroup() != null
\r
1047 && viewport.getSelectionGroup().sequences != null
\r
1048 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1050 seqs = viewport.getSelectionGroup().sequences;
\r
1051 start = viewport.getSelectionGroup().getStartRes();
\r
1052 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1056 seqs = viewport.alignment.getSequences();
\r
1059 for (int i = 0; i < seqs.size(); i++)
\r
1061 current = (SequenceI) seqs.elementAt(i);
\r
1062 jSize = current.getLength();
\r
1064 // Removing a range is much quicker than removing gaps
\r
1065 // one by one for long sequences
\r
1067 int rangeStart=-1, rangeEnd=-1;
\r
1071 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1073 if(rangeStart==-1)
\r
1088 current.deleteChars(rangeStart, rangeEnd);
\r
1089 j-=rangeEnd-rangeStart;
\r
1090 jSize-=rangeEnd-rangeStart;
\r
1098 while (j < end && j < jSize);
\r
1101 current.deleteChars(rangeStart, rangeEnd);
\r
1105 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1107 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1110 public void alignmentChanged()
\r
1112 if(viewport.vconsensus!=null)
\r
1114 viewport.updateConsensus();
\r
1115 viewport.updateConservation();
\r
1117 resetAllColourSchemes();
\r
1118 if(alignPanel.overviewPanel!=null)
\r
1119 alignPanel.overviewPanel.updateOverviewImage();
\r
1121 viewport.alignment.adjustSequenceAnnotations();
\r
1123 alignPanel.repaint();
\r
1126 void resetAllColourSchemes()
\r
1128 ColourSchemeI cs = viewport.globalColourScheme;
\r
1131 if (cs instanceof ClustalxColourScheme)
\r
1133 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1134 resetClustalX(viewport.alignment.getSequences(),
\r
1135 viewport.alignment.getWidth());
\r
1138 cs.setConsensus(viewport.vconsensus);
\r
1139 if (cs.conservationApplied())
\r
1141 Alignment al = (Alignment) viewport.alignment;
\r
1142 Conservation c = new Conservation("All",
\r
1143 ResidueProperties.propHash, 3,
\r
1144 al.getSequences(), 0,
\r
1145 al.getWidth() - 1);
\r
1147 c.verdict(false, viewport.ConsPercGaps);
\r
1149 cs.setConservation(c);
\r
1153 int s, sSize = viewport.alignment.getGroups().size();
\r
1154 for(s=0; s<sSize; s++)
\r
1156 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1157 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1159 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1161 sg.recalcConservation();
\r
1168 * @param e DOCUMENT ME!
\r
1170 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1172 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1173 HistoryItem.HIDE));
\r
1174 if (viewport.getAlignment().padGaps())
\r
1175 alignmentChanged();
\r
1181 * @param e DOCUMENT ME!
\r
1183 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1185 JInternalFrame frame = new JInternalFrame();
\r
1186 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1187 frame.setContentPane(finder);
\r
1188 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1189 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1195 * @param e DOCUMENT ME!
\r
1197 public void font_actionPerformed(ActionEvent e)
\r
1199 new FontChooser(alignPanel);
\r
1202 public void smoothFont_actionPerformed(ActionEvent e)
\r
1204 viewport.antiAlias = smoothFont.isSelected();
\r
1205 alignPanel.annotationPanel.image = null;
\r
1206 alignPanel.repaint();
\r
1213 * @param e DOCUMENT ME!
\r
1215 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1217 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1219 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1220 alignPanel.repaint();
\r
1227 * @param e DOCUMENT ME!
\r
1229 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1231 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1232 alignPanel.repaint();
\r
1238 * @param e DOCUMENT ME!
\r
1240 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1242 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1243 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1244 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1245 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1246 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1247 alignPanel.repaint();
\r
1253 * @param e DOCUMENT ME!
\r
1255 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1257 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1258 alignPanel.repaint();
\r
1264 * @param e DOCUMENT ME!
\r
1266 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1268 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1269 alignPanel.repaint();
\r
1275 * @param e DOCUMENT ME!
\r
1277 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1279 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1280 alignPanel.repaint();
\r
1286 * @param e DOCUMENT ME!
\r
1288 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1290 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1291 alignPanel.repaint();
\r
1297 * @param e DOCUMENT ME!
\r
1299 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1301 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1302 alignPanel.repaint();
\r
1308 * @param e DOCUMENT ME!
\r
1310 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1312 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1313 alignPanel.repaint();
\r
1316 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1318 if (!viewport.alignment.isNucleotide())
\r
1320 new SequenceFeatureFetcher(viewport.
\r
1323 viewport.setShowSequenceFeatures(true);
\r
1324 showSeqFeatures.setSelected(true);
\r
1329 public void featureSettings_actionPerformed(ActionEvent e)
\r
1331 new FeatureSettings(viewport, alignPanel);
\r
1337 * @param evt DOCUMENT ME!
\r
1339 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1341 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1342 alignPanel.repaint();
\r
1343 if (alignPanel.getOverviewPanel() != null)
\r
1345 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1352 * @param e DOCUMENT ME!
\r
1354 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1356 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1357 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1363 * @param e DOCUMENT ME!
\r
1365 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1367 if (alignPanel.overviewPanel != null)
\r
1372 JInternalFrame frame = new JInternalFrame();
\r
1373 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1374 frame.setContentPane(overview);
\r
1375 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1376 frame.getWidth(), frame.getHeight());
\r
1378 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1379 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1381 public void internalFrameClosed(
\r
1382 javax.swing.event.InternalFrameEvent evt)
\r
1384 alignPanel.setOverviewPanel(null);
\r
1389 alignPanel.setOverviewPanel(overview);
\r
1395 * @param e DOCUMENT ME!
\r
1397 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1399 changeColour(null);
\r
1405 * @param e DOCUMENT ME!
\r
1407 public void clustalColour_actionPerformed(ActionEvent e)
\r
1409 changeColour(new ClustalxColourScheme(
\r
1410 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1416 * @param e DOCUMENT ME!
\r
1418 public void zappoColour_actionPerformed(ActionEvent e)
\r
1420 changeColour(new ZappoColourScheme());
\r
1426 * @param e DOCUMENT ME!
\r
1428 public void taylorColour_actionPerformed(ActionEvent e)
\r
1430 changeColour(new TaylorColourScheme());
\r
1436 * @param e DOCUMENT ME!
\r
1438 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1440 changeColour(new HydrophobicColourScheme());
\r
1446 * @param e DOCUMENT ME!
\r
1448 public void helixColour_actionPerformed(ActionEvent e)
\r
1450 changeColour(new HelixColourScheme());
\r
1456 * @param e DOCUMENT ME!
\r
1458 public void strandColour_actionPerformed(ActionEvent e)
\r
1460 changeColour(new StrandColourScheme());
\r
1466 * @param e DOCUMENT ME!
\r
1468 public void turnColour_actionPerformed(ActionEvent e)
\r
1470 changeColour(new TurnColourScheme());
\r
1476 * @param e DOCUMENT ME!
\r
1478 public void buriedColour_actionPerformed(ActionEvent e)
\r
1480 changeColour(new BuriedColourScheme());
\r
1486 * @param e DOCUMENT ME!
\r
1488 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1490 changeColour(new NucleotideColourScheme());
\r
1493 public void annotationColour_actionPerformed(ActionEvent e)
\r
1495 new AnnotationColourChooser(viewport, alignPanel);
\r
1502 * @param e DOCUMENT ME!
\r
1504 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1506 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1512 * @param cs DOCUMENT ME!
\r
1514 void changeColour(ColourSchemeI cs)
\r
1516 int threshold = 0;
\r
1520 if (viewport.getAbovePIDThreshold())
\r
1522 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1525 cs.setThreshold(threshold,
\r
1526 viewport.getIgnoreGapsConsensus());
\r
1528 viewport.setGlobalColourScheme(cs);
\r
1532 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1535 if (viewport.getConservationSelected())
\r
1538 Alignment al = (Alignment) viewport.alignment;
\r
1539 Conservation c = new Conservation("All",
\r
1540 ResidueProperties.propHash, 3,
\r
1541 al.getSequences(), 0,
\r
1542 al.getWidth() - 1);
\r
1545 c.verdict(false, viewport.ConsPercGaps);
\r
1547 cs.setConservation(c);
\r
1549 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1554 cs.setConservation(null);
\r
1557 cs.setConsensus(viewport.vconsensus);
\r
1560 viewport.setGlobalColourScheme(cs);
\r
1562 if (viewport.getColourAppliesToAllGroups())
\r
1564 Vector groups = viewport.alignment.getGroups();
\r
1566 for (int i = 0; i < groups.size(); i++)
\r
1568 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1576 if (cs instanceof ClustalxColourScheme)
\r
1578 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1580 else if (cs instanceof UserColourScheme)
\r
1582 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1588 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1590 catch (Exception ex)
\r
1595 if (viewport.getAbovePIDThreshold()
\r
1596 || cs instanceof PIDColourScheme
\r
1597 || cs instanceof Blosum62ColourScheme)
\r
1599 sg.cs.setThreshold(threshold,
\r
1600 viewport.getIgnoreGapsConsensus());
\r
1602 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1606 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1609 if (viewport.getConservationSelected())
\r
1611 Conservation c = new Conservation("Group",
\r
1612 ResidueProperties.propHash, 3,
\r
1614 viewport.alignment.getWidth() - 1);
\r
1616 c.verdict(false, viewport.ConsPercGaps);
\r
1617 sg.cs.setConservation(c);
\r
1620 sg.cs.setConservation(null);
\r
1624 if (alignPanel.getOverviewPanel() != null)
\r
1626 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1629 alignPanel.repaint();
\r
1635 * @param e DOCUMENT ME!
\r
1637 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1639 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1641 SliderPanel.setPIDSliderSource(alignPanel,
\r
1642 viewport.getGlobalColourScheme(),
\r
1644 SliderPanel.showPIDSlider();
\r
1651 * @param e DOCUMENT ME!
\r
1653 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1655 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1657 SliderPanel.setConservationSlider(alignPanel,
\r
1658 viewport.globalColourScheme,
\r
1660 SliderPanel.showConservationSlider();
\r
1667 * @param e DOCUMENT ME!
\r
1669 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1671 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1673 viewport.setAbovePIDThreshold(false);
\r
1674 abovePIDThreshold.setSelected(false);
\r
1676 changeColour(viewport.getGlobalColourScheme());
\r
1678 modifyConservation_actionPerformed(null);
\r
1684 * @param e DOCUMENT ME!
\r
1686 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1688 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1690 conservationMenuItem.setSelected(false);
\r
1691 viewport.setConservationSelected(false);
\r
1693 changeColour(viewport.getGlobalColourScheme());
\r
1695 modifyPID_actionPerformed(null);
\r
1701 * @param e DOCUMENT ME!
\r
1703 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1705 if (e.getActionCommand().equals("User Defined..."))
\r
1707 new UserDefinedColours(alignPanel, null);
\r
1711 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1712 getUserColourSchemes().get(e.getActionCommand());
\r
1714 changeColour(udc);
\r
1718 public void updateUserColourMenu()
\r
1721 Component[] menuItems = colourMenu.getMenuComponents();
\r
1722 int i, iSize = menuItems.length;
\r
1723 for (i = 0; i < iSize; i++)
\r
1725 if (menuItems[i].getName() != null &&
\r
1726 menuItems[i].getName().equals("USER_DEFINED"))
\r
1728 colourMenu.remove(menuItems[i]);
\r
1732 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1734 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1735 getUserColourSchemes().keys();
\r
1737 while (userColours.hasMoreElements())
\r
1739 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1740 nextElement().toString());
\r
1741 radioItem.setName("USER_DEFINED");
\r
1742 radioItem.addMouseListener(new MouseAdapter()
\r
1744 public void mousePressed(MouseEvent evt)
\r
1746 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1748 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1750 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1751 "Remove from default list?",
\r
1752 "Remove user defined colour",
\r
1753 JOptionPane.YES_NO_OPTION);
\r
1754 if(option == JOptionPane.YES_OPTION)
\r
1756 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1757 colourMenu.remove(radioItem);
\r
1760 radioItem.addActionListener(new ActionListener()
\r
1762 public void actionPerformed(ActionEvent evt)
\r
1764 userDefinedColour_actionPerformed(evt);
\r
1770 radioItem.addActionListener(new ActionListener()
\r
1772 public void actionPerformed(ActionEvent evt)
\r
1774 userDefinedColour_actionPerformed(evt);
\r
1778 colourMenu.insert(radioItem, 15);
\r
1779 colours.add(radioItem);
\r
1787 * @param e DOCUMENT ME!
\r
1789 public void PIDColour_actionPerformed(ActionEvent e)
\r
1791 changeColour(new PIDColourScheme());
\r
1797 * @param e DOCUMENT ME!
\r
1799 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1801 changeColour(new Blosum62ColourScheme());
\r
1807 * @param e DOCUMENT ME!
\r
1809 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1811 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1812 HistoryItem.SORT));
\r
1813 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1814 viewport.getAlignment().getSequenceAt(0));
\r
1815 alignPanel.repaint();
\r
1821 * @param e DOCUMENT ME!
\r
1823 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1825 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1826 HistoryItem.SORT));
\r
1827 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1828 alignPanel.repaint();
\r
1834 * @param e DOCUMENT ME!
\r
1836 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1838 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1839 HistoryItem.SORT));
\r
1841 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1842 alignPanel.repaint();
\r
1848 * @param e DOCUMENT ME!
\r
1850 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1852 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1853 JInternalFrame frame = new JInternalFrame();
\r
1854 frame.setContentPane(sp);
\r
1855 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1862 * @param e DOCUMENT ME!
\r
1864 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1866 if ( (viewport.getSelectionGroup() == null) ||
\r
1867 (viewport.getSelectionGroup().getSize() < 2))
\r
1869 JOptionPane.showInternalMessageDialog(this,
\r
1870 "You must select at least 2 sequences.",
\r
1871 "Invalid Selection",
\r
1872 JOptionPane.WARNING_MESSAGE);
\r
1876 JInternalFrame frame = new JInternalFrame();
\r
1877 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1878 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1885 * @param e DOCUMENT ME!
\r
1887 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1889 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1890 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1891 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1892 (viewport.getAlignment().getHeight() < 4))
\r
1894 JOptionPane.showInternalMessageDialog(this,
\r
1895 "Principal component analysis must take\n" +
\r
1896 "at least 4 input sequences.",
\r
1897 "Sequence selection insufficient",
\r
1898 JOptionPane.WARNING_MESSAGE);
\r
1903 new PCAPanel(viewport);
\r
1909 * @param e DOCUMENT ME!
\r
1911 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1913 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1919 * @param e DOCUMENT ME!
\r
1921 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1923 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1929 * @param e DOCUMENT ME!
\r
1931 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1933 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1939 * @param e DOCUMENT ME!
\r
1941 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1943 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1949 * @param type DOCUMENT ME!
\r
1950 * @param pwType DOCUMENT ME!
\r
1951 * @param title DOCUMENT ME!
\r
1953 void NewTreePanel(String type, String pwType, String title)
\r
1955 final TreePanel tp;
\r
1957 if ( (viewport.getSelectionGroup() != null) &&
\r
1958 (viewport.getSelectionGroup().getSize() > 3))
\r
1961 SequenceGroup sg = viewport.getSelectionGroup();
\r
1963 /* Decide if the selection is a column region */
\r
1964 while (s < sg.sequences.size())
\r
1966 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
1969 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1970 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
1971 "Try using the Pad function in the edit menu,\n" +
\r
1972 "or one of the multiple sequence alignment web services.",
\r
1973 "Sequences in selection are not aligned",
\r
1974 JOptionPane.WARNING_MESSAGE);
\r
1980 title = title + " on region";
\r
1981 tp = new TreePanel(viewport,
\r
1982 viewport.getSelectionGroup().sequences, type, pwType,
\r
1983 sg.getStartRes(), sg.getEndRes());
\r
1987 //are the sequences aligned?
\r
1988 if (!viewport.alignment.isAligned())
\r
1990 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1991 "The sequences must be aligned before creating a tree.\n" +
\r
1992 "Try using the Pad function in the edit menu,\n" +
\r
1993 "or one of the multiple sequence alignment web services.",
\r
1994 "Sequences not aligned",
\r
1995 JOptionPane.WARNING_MESSAGE);
\r
2000 tp = new TreePanel(viewport,
\r
2001 viewport.getAlignment().getSequences(), type, pwType,
\r
2003 viewport.alignment.getWidth());
\r
2006 addTreeMenuItem(tp, title);
\r
2007 viewport.setCurrentTree(tp.getTree());
\r
2009 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2015 * @param title DOCUMENT ME!
\r
2016 * @param order DOCUMENT ME!
\r
2018 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2020 final JMenuItem item = new JMenuItem("by " + title);
\r
2022 item.addActionListener(new java.awt.event.ActionListener()
\r
2024 public void actionPerformed(ActionEvent e)
\r
2026 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2027 HistoryItem.SORT));
\r
2029 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2030 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2031 alignPanel.repaint();
\r
2037 * Maintain the Order by->Displayed Tree menu.
\r
2038 * Creates a new menu item for a TreePanel with an appropriate
\r
2039 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2040 * to remove the menu item when the treePanel is closed, and adjust
\r
2041 * the tree leaf to sequence mapping when the alignment is modified.
\r
2042 * @param treePanel Displayed tree window.
\r
2043 * @param title SortBy menu item title.
\r
2045 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2047 final JMenuItem item = new JMenuItem(title);
\r
2051 if (treeCount == 1)
\r
2053 sort.add(sortByTreeMenu);
\r
2056 sortByTreeMenu.add(item);
\r
2057 item.addActionListener(new java.awt.event.ActionListener()
\r
2059 public void actionPerformed(ActionEvent e)
\r
2061 addHistoryItem(new HistoryItem("Tree Sort",
\r
2062 viewport.alignment, HistoryItem.SORT));
\r
2063 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2064 treePanel.getTree());
\r
2065 alignPanel.repaint();
\r
2069 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2070 InternalFrameAdapter()
\r
2072 public void internalFrameClosed(
\r
2073 javax.swing.event.InternalFrameEvent evt)
\r
2076 sortByTreeMenu.remove(item);
\r
2078 if (treeCount == 0)
\r
2080 sort.remove(sortByTreeMenu);
\r
2088 * Work out whether the whole set of sequences
\r
2089 * or just the selected set will be submitted for multiple alignment.
\r
2092 private SequenceI[] gatherSequencesForAlignment()
\r
2094 // Now, check we have enough sequences
\r
2095 SequenceI[] msa = null;
\r
2097 if ( (viewport.getSelectionGroup() != null) &&
\r
2098 (viewport.getSelectionGroup().getSize() > 1))
\r
2100 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2101 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2103 msa = new SequenceI[sz = seqs.getSize()];
\r
2105 for (int i = 0; i < sz; i++)
\r
2107 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2112 Vector seqs = viewport.getAlignment().getSequences();
\r
2114 if (seqs.size() > 1)
\r
2116 msa = new SequenceI[seqs.size()];
\r
2118 for (int i = 0; i < seqs.size(); i++)
\r
2120 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2128 * Decides what is submitted to a secondary structure prediction service,
\r
2129 * the currently selected sequence, or the currently selected alignment
\r
2130 * (where the first sequence in the set is the one that the prediction
\r
2133 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2135 SequenceI seq = null;
\r
2136 SequenceI[] msa = null;
\r
2138 if ( (viewport.getSelectionGroup() != null) &&
\r
2139 (viewport.getSelectionGroup().getSize() > 0))
\r
2141 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2142 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2144 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2146 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2151 msa = new SequenceI[sz = seqs.getSize()];
\r
2153 for (int i = 0; i < sz; i++)
\r
2155 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2161 Vector seqs = viewport.getAlignment().getSequences();
\r
2163 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2165 seq = (SequenceI) seqs.elementAt(0);
\r
2169 msa = new SequenceI[seqs.size()];
\r
2171 for (int i = 0; i < seqs.size(); i++)
\r
2173 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2185 return new SequenceI[]
\r
2195 * @param e DOCUMENT ME!
\r
2197 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2199 // Pick the tree file
\r
2200 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2202 "LAST_DIRECTORY"));
\r
2203 chooser.setFileView(new JalviewFileView());
\r
2204 chooser.setDialogTitle("Select a newick-like tree file");
\r
2205 chooser.setToolTipText("Load a tree file");
\r
2207 int value = chooser.showOpenDialog(null);
\r
2209 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2211 String choice = chooser.getSelectedFile().getPath();
\r
2212 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2216 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2218 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2220 catch (Exception ex)
\r
2222 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2223 "Problem reading tree file",
\r
2225 JOptionPane.WARNING_MESSAGE);
\r
2226 ex.printStackTrace();
\r
2232 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2234 return ShowNewickTree(nf,title,600,500,4,5);
\r
2239 * @param nf DOCUMENT ME!
\r
2240 * @param title DOCUMENT ME!
\r
2242 * @return DOCUMENT ME!
\r
2244 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2246 TreePanel tp = null;
\r
2252 if (nf.getTree() != null)
\r
2254 tp = new TreePanel(viewport,
\r
2255 viewport.getAlignment().getSequences(), nf,
\r
2262 tp.setLocation(x,y);
\r
2265 Desktop.addInternalFrame(tp, title, w, h);
\r
2266 addTreeMenuItem(tp, title);
\r
2269 catch (Exception ex)
\r
2271 ex.printStackTrace();
\r
2282 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2283 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2284 printJob.setPrintable(alignPanel, pf);
\r
2286 if (printJob.printDialog())
\r
2292 catch (Exception PrintException)
\r
2294 PrintException.printStackTrace();
\r
2301 * Generates menu items and listener event actions for web service clients
\r
2304 public void BuildWebServiceMenu()
\r
2306 if ( (Discoverer.services != null)
\r
2307 && (Discoverer.services.size() > 0))
\r
2309 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2310 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2311 Vector wsmenu = new Vector();
\r
2312 if (msaws != null)
\r
2314 // Add any Multiple Sequence Alignment Services
\r
2315 final JMenu msawsmenu = new JMenu("Alignment");
\r
2316 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2318 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2320 final JMenuItem method = new JMenuItem(sh.getName());
\r
2321 method.addActionListener(new ActionListener()
\r
2323 public void actionPerformed(ActionEvent e)
\r
2325 SequenceI[] msa = gatherSequencesForAlignment();
\r
2326 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2327 false, true, viewport.getAlignment().getDataset());
\r
2332 msawsmenu.add(method);
\r
2333 // Deal with services that we know accept partial alignments.
\r
2334 if (sh.getName().indexOf("lustal") > -1)
\r
2336 // We know that ClustalWS can accept partial alignments for refinement.
\r
2337 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2338 methodR.addActionListener(new ActionListener()
\r
2340 public void actionPerformed(ActionEvent e)
\r
2342 SequenceI[] msa = gatherSequencesForAlignment();
\r
2343 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2344 true, true, viewport.getAlignment().getDataset());
\r
2349 msawsmenu.add(methodR);
\r
2353 wsmenu.add(msawsmenu);
\r
2355 if (secstrpr != null)
\r
2357 // Add any secondary structure prediction services
\r
2358 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2359 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2361 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2363 final JMenuItem method = new JMenuItem(sh.getName());
\r
2364 method.addActionListener(new ActionListener()
\r
2366 public void actionPerformed(ActionEvent e)
\r
2368 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2369 if (msa.length == 1)
\r
2371 // Single Sequence prediction
\r
2372 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2376 if (msa.length > 1)
\r
2378 // Single Sequence prediction
\r
2379 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2385 secstrmenu.add(method);
\r
2387 wsmenu.add(secstrmenu);
\r
2389 this.webService.removeAll();
\r
2390 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2392 webService.add( (JMenu) wsmenu.get(i));
\r
2397 this.webService.removeAll();
\r
2398 this.webService.add(this.webServiceNoServices);
\r
2400 // TODO: add in rediscovery function
\r
2401 // TODO: reduce code redundancy.
\r
2402 // TODO: group services by location as well as function.
\r
2405 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2407 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2408 getProperty("LAST_DIRECTORY"));
\r
2410 chooser.setFileView(new JalviewFileView());
\r
2411 chooser.setDialogTitle("Export to Vamsas file");
\r
2412 chooser.setToolTipText("Export");
\r
2414 int value = chooser.showSaveDialog(this);
\r
2416 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2418 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2419 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2420 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2428 public void showTranslation_actionPerformed(ActionEvent e)
\r
2430 int s, sSize = viewport.alignment.getHeight();
\r
2431 SequenceI [] newSeq = new SequenceI[sSize];
\r
2434 StringBuffer protein;
\r
2436 for(s=0; s<sSize; s++)
\r
2438 protein = new StringBuffer();
\r
2439 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2440 resSize = seq.length();
\r
2441 resSize -= resSize%3;
\r
2443 for(res = 0; res < resSize; res+=3)
\r
2445 String codon = seq.substring(res, res+3);
\r
2446 codon = codon.replace('U', 'T');
\r
2447 String aa = ResidueProperties.codonTranslate(codon);
\r
2449 protein.append(viewport.getGapCharacter());
\r
2450 else if(aa.equals("STOP"))
\r
2451 protein.append("X");
\r
2453 protein.append( aa );
\r
2455 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2459 AlignmentI al = new Alignment(newSeq);
\r
2460 al.setDataset(null);
\r
2463 ////////////////////////////////
\r
2464 // Copy annotations across
\r
2465 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2466 = viewport.alignment.getAlignmentAnnotation();
\r
2468 for (int i = 0; i < annotations.length; i++)
\r
2471 if (annotations[i].label.equals("Quality") ||
\r
2472 annotations[i].label.equals("Conservation") ||
\r
2473 annotations[i].label.equals("Consensus"))
\r
2479 aSize = viewport.alignment.getWidth()/3;
\r
2480 jalview.datamodel.Annotation [] anots =
\r
2481 new jalview.datamodel.Annotation[aSize];
\r
2483 for(a=0; a<viewport.alignment.getWidth(); a++)
\r
2485 if( annotations[i].annotations[a]==null
\r
2486 || annotations[i].annotations[a]==null)
\r
2489 anots[a/3] = new Annotation(
\r
2490 annotations[i].annotations[a].displayCharacter,
\r
2491 annotations[i].annotations[a].description,
\r
2492 annotations[i].annotations[a].secondaryStructure,
\r
2493 annotations[i].annotations[a].value,
\r
2494 annotations[i].annotations[a].colour);
\r
2497 jalview.datamodel.AlignmentAnnotation aa
\r
2498 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2499 annotations[i].description, anots );
\r
2500 al.addAnnotation(aa);
\r
2504 AlignFrame af = new AlignFrame(al);
\r
2505 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2507 NEW_WINDOW_HEIGHT);
\r
2510 // AlignViewport newViewport = new AlignViewport(al);
\r
2511 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2512 // tabbedPane.add("Protein", ap);
\r
2513 // viewports.add(newViewport);
\r
2514 // alignPanels.add(ap);
\r
2517 /////////////////////////
\r
2519 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2520 // ds.setDataset(true);
\r
2521 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2522 // tabbedPane.add("Dataset", dap);
\r
2523 // viewports.add(ds);
\r
2524 // alignPanels.add(dap);
\r
2525 /////////////////////////
\r
2530 /*public void tabSelected()
\r
2532 int index = tabbedPane.getSelectedIndex();
\r
2533 viewport = (AlignViewport)viewports.elementAt(index);
\r
2534 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2540 * @param String DOCUMENT ME!
\r
2542 public boolean parseGroupsFile(String file)
\r
2544 String line = null;
\r
2547 BufferedReader in = new BufferedReader(new FileReader(file));
\r
2548 SequenceI seq = null;
\r
2549 String type, desc, token;
\r
2551 int index, start, end;
\r
2552 StringTokenizer st;
\r
2553 SequenceFeature sf;
\r
2555 String featureGroup = null;
\r
2556 while ( (line = in.readLine()) != null)
\r
2559 st = new StringTokenizer(line, "\t");
\r
2560 if (st.countTokens() == 2)
\r
2562 type = st.nextToken();
\r
2563 if (type.equalsIgnoreCase("startgroup"))
\r
2565 featureGroup = st.nextToken();
\r
2567 else if (type.equalsIgnoreCase("endgroup"))
\r
2569 //We should check whether this is the current group,
\r
2570 //but at present theres no way of showing more than 1 group
\r
2572 featureGroup = null;
\r
2576 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2577 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type,
\r
2578 ucs.findColour("A"));
\r
2583 while (st.hasMoreElements())
\r
2585 desc = st.nextToken();
\r
2586 token = st.nextToken();
\r
2587 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2589 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2594 index = Integer.parseInt(st.nextToken());
\r
2597 start = Integer.parseInt(st.nextToken());
\r
2598 end = Integer.parseInt(st.nextToken());
\r
2600 seq = viewport.alignment.getSequenceAt(index);
\r
2602 type = st.nextToken();
\r
2604 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2606 // Probably the old style groups file
\r
2607 UserColourScheme ucs = new UserColourScheme(type);
\r
2608 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2611 sf = new SequenceFeature(type, desc, "", start, end);
\r
2612 sf.setFeatureGroup(featureGroup);
\r
2614 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2618 catch (Exception ex)
\r
2620 System.out.println(line);
\r
2621 ex.printStackTrace();
\r
2622 System.out.println("Error parsing groups file: " + ex +"\n"+line);
\r
2626 viewport.showSequenceFeatures = true;
\r
2627 showSeqFeatures.setSelected(true);
\r
2628 alignPanel.repaint();
\r
2632 public void dragEnter(DropTargetDragEvent evt)
\r
2635 public void dragExit(DropTargetEvent evt)
\r
2638 public void dragOver(DropTargetDragEvent evt)
\r
2641 public void dropActionChanged(DropTargetDragEvent evt)
\r
2644 public void drop(DropTargetDropEvent evt)
\r
2646 Transferable t = evt.getTransferable();
\r
2647 java.util.List files = null;
\r
2651 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2652 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2654 //Works on Windows and MacOSX
\r
2655 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2656 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2658 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2660 // This is used by Unix drag system
\r
2661 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2662 String data = (String) t.getTransferData(uriListFlavor);
\r
2663 files = new java.util.ArrayList(1);
\r
2664 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2667 st.hasMoreTokens(); )
\r
2669 String s = st.nextToken();
\r
2670 if (s.startsWith("#"))
\r
2672 // the line is a comment (as per the RFC 2483)
\r
2676 java.net.URI uri = new java.net.URI(s);
\r
2677 java.io.File file = new java.io.File(uri);
\r
2682 catch (Exception e)
\r
2684 e.printStackTrace();
\r
2687 if (files != null)
\r
2691 boolean isAnnotation = false;
\r
2693 for (int i = 0; i < files.size(); i++)
\r
2695 String file = files.get(i).toString();
\r
2697 isAnnotation = new AnnotationReader().readAnnotationFile(viewport.alignment, file);
\r
2699 if( !isAnnotation )
\r
2701 boolean isGroupsFile = parseGroupsFile(file);
\r
2702 if (!isGroupsFile)
\r
2704 String protocol = "File";
\r
2705 String format = new IdentifyFile().Identify(file, protocol);
\r
2706 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol, format);
\r
2708 FastaFile ff = new FastaFile();
\r
2709 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2710 c.setContents(new StringSelection(ff.print(sequences)), this);
\r
2712 this.paste(false);
\r
2720 int height = alignPanel.annotationPanel.adjustPanelHeight();
\r
2721 alignPanel.annotationScroller.setPreferredSize(
\r
2722 new Dimension(alignPanel.annotationScroller.getWidth(),
\r
2725 alignPanel.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
\r
2726 alignPanel.annotationSpaceFillerHolder.getWidth(),
\r
2729 alignPanel.addNotify();
\r
2732 catch (Exception ex)
\r
2734 ex.printStackTrace();
\r