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 //Deal with separators
\r
183 //Remember AlignFrame always starts as protein
\r
186 viewMenu.remove(viewMenu.getItemCount()-2);
\r
190 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
196 Added so Castor Mapping file can obtain Jalview Version
\r
198 public String getVersion()
\r
200 return jalview.bin.Cache.getProperty("VERSION");
\r
204 public void fetchSequence_actionPerformed(ActionEvent e)
\r
206 new SequenceFetcher(this);
\r
213 * @param e DOCUMENT ME!
\r
215 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
217 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
222 "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",
\r
227 "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"
\r
228 }, currentFileFormat);
\r
230 chooser.setAcceptAllFileFilterUsed(false);
\r
231 chooser.setFileView(new JalviewFileView());
\r
232 chooser.setDialogTitle("Save Alignment to file");
\r
233 chooser.setToolTipText("Save");
\r
235 int value = chooser.showSaveDialog(this);
\r
237 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
239 currentFileFormat = chooser.getSelectedFormat();
\r
241 if (currentFileFormat == null)
\r
243 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
244 "You must select a file format before saving!",
\r
245 "File format not specified",
\r
246 JOptionPane.WARNING_MESSAGE);
\r
247 value = chooser.showSaveDialog(this);
\r
251 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
252 currentFileFormat);
\r
254 String choice = chooser.getSelectedFile().getPath();
\r
255 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
257 saveAlignment(choice, currentFileFormat);
\r
261 public boolean saveAlignment(String file, String format)
\r
263 if (format.equalsIgnoreCase("Jalview"))
\r
265 String shortName = title;
\r
267 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
269 shortName = shortName.substring(shortName.lastIndexOf(
\r
270 java.io.File.separatorChar) + 1);
\r
273 Jalview2XML.SaveAlignment(this, file, shortName);
\r
275 // USE Jalview2XML to save this file
\r
280 String output = new FormatAdapter().formatSequences(format,
\r
281 viewport.getAlignment().
\r
283 if (output == null)
\r
290 java.io.PrintWriter out = new java.io.PrintWriter(
\r
291 new java.io.FileWriter(file));
\r
297 catch (Exception ex)
\r
299 ex.printStackTrace();
\r
308 * @param e DOCUMENT ME!
\r
310 protected void outputText_actionPerformed(ActionEvent e)
\r
312 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
313 Desktop.addInternalFrame(cap,
\r
314 "Alignment output - " + e.getActionCommand(), 600,
\r
316 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
317 viewport.getAlignment().
\r
324 * @param e DOCUMENT ME!
\r
326 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
328 new HTMLOutput(viewport,
\r
329 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
330 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
333 public void createImageMap(File file, String image)
\r
335 alignPanel.makePNGImageMap(file, image);
\r
341 * @param e DOCUMENT ME!
\r
343 public void createPNG(File f)
\r
345 alignPanel.makePNG(f);
\r
351 * @param e DOCUMENT ME!
\r
353 public void createEPS(File f)
\r
355 alignPanel.makeEPS(f);
\r
361 * @param e DOCUMENT ME!
\r
363 public void printMenuItem_actionPerformed(ActionEvent e)
\r
365 //Putting in a thread avoids Swing painting problems
\r
366 PrintThread thread = new PrintThread();
\r
373 * @param e DOCUMENT ME!
\r
375 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
379 PaintRefresher.components.remove(viewport.alignment);
\r
380 this.setClosed(true);
\r
382 catch (Exception ex)
\r
390 void updateEditMenuBar()
\r
392 if (historyList.size() > 0)
\r
394 undoMenuItem.setEnabled(true);
\r
396 HistoryItem hi = (HistoryItem) historyList.peek();
\r
397 undoMenuItem.setText("Undo " + hi.getDescription());
\r
401 undoMenuItem.setEnabled(false);
\r
402 undoMenuItem.setText("Undo");
\r
405 if (redoList.size() > 0)
\r
407 redoMenuItem.setEnabled(true);
\r
409 HistoryItem hi = (HistoryItem) redoList.peek();
\r
410 redoMenuItem.setText("Redo " + hi.getDescription());
\r
414 redoMenuItem.setEnabled(false);
\r
415 redoMenuItem.setText("Redo");
\r
422 * @param hi DOCUMENT ME!
\r
424 public void addHistoryItem(HistoryItem hi)
\r
426 historyList.push(hi);
\r
427 updateEditMenuBar();
\r
433 * @param e DOCUMENT ME!
\r
435 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
437 HistoryItem hi = (HistoryItem) historyList.pop();
\r
438 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
439 HistoryItem.HIDE));
\r
440 restoreHistoryItem(hi);
\r
441 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
447 * @param e DOCUMENT ME!
\r
449 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
451 HistoryItem hi = (HistoryItem) redoList.pop();
\r
452 restoreHistoryItem(hi);
\r
453 updateEditMenuBar();
\r
454 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
457 // used by undo and redo
\r
458 void restoreHistoryItem(HistoryItem hi)
\r
460 if (hi.getType() == HistoryItem.SORT)
\r
462 for (int i = 0; i < hi.getSequences().size(); i++)
\r
464 viewport.alignment.getSequences().setElementAt(hi.getSequences()
\r
471 for (int i = 0; i < hi.getSequences().size(); i++)
\r
473 SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);
\r
475 if (restore.getLength() == 0)
\r
477 restore.setSequence(hi.getHidden().elementAt(i).toString());
\r
478 viewport.alignment.getSequences().insertElementAt(restore,
\r
479 hi.getAlignIndex(i));
\r
483 restore.setSequence(hi.getHidden().elementAt(i).toString());
\r
487 if (hi.getType() == HistoryItem.PASTE)
\r
489 for (int i = viewport.alignment.getHeight() - 1;
\r
490 i > (hi.getSequences().size() - 1); i--)
\r
492 viewport.alignment.deleteSequence(i);
\r
497 updateEditMenuBar();
\r
499 viewport.firePropertyChange("alignment", null,
\r
500 viewport.getAlignment().getSequences());
\r
506 * @param up DOCUMENT ME!
\r
508 public void moveSelectedSequences(boolean up)
\r
510 SequenceGroup sg = viewport.getSelectionGroup();
\r
519 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
521 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
523 if (!sg.sequences.contains(seq))
\r
528 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
530 if (sg.sequences.contains(temp))
\r
535 viewport.alignment.getSequences().setElementAt(temp, i);
\r
536 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
541 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
543 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
545 if (!sg.sequences.contains(seq))
\r
550 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
552 if (sg.sequences.contains(temp))
\r
557 viewport.alignment.getSequences().setElementAt(temp, i);
\r
558 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
562 alignPanel.repaint();
\r
565 public void lostOwnership(Clipboard clipboard, Transferable contents)
\r
567 Desktop.jalviewClipboard = null;
\r
574 * @param e DOCUMENT ME!
\r
576 protected void copy_actionPerformed(ActionEvent e)
\r
578 if (viewport.getSelectionGroup() == null)
\r
583 SequenceGroup sg = viewport.getSelectionGroup();
\r
585 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
587 Hashtable orderedSeqs = new Hashtable();
\r
588 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
590 for (int i = 0; i < sg.getSize(); i++)
\r
592 SequenceI seq = sg.getSequenceAt(i);
\r
593 int index = viewport.alignment.findIndex(seq);
\r
594 orderedSeqs.put(index + "", seq);
\r
597 int index = 0, startRes, endRes;
\r
600 for (int i = 0; i < sg.getSize(); i++)
\r
602 SequenceI seq = null;
\r
604 while (seq == null)
\r
606 if (orderedSeqs.containsKey(index + ""))
\r
608 seq = (SequenceI) orderedSeqs.get(index + "");
\r
620 //Returns residue following index if gap
\r
621 startRes = seq.findPosition(sg.getStartRes());
\r
624 //Need to find the residue preceeding index if gap
\r
627 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
629 ch = seq.getCharAt(j);
\r
630 if (!jalview.util.Comparison.isGap( (ch)))
\r
638 endRes += seq.getStart() - 1;
\r
641 seqs[i] = new Sequence(seq.getName(),
\r
642 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
645 seqs[i].setDescription(seq.getDescription());
\r
646 seqs[i].setDBRef(seq.getDBRef());
\r
647 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
648 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
652 FastaFile ff = new FastaFile();
\r
653 ff.addJVSuffix( viewport.showJVSuffix );
\r
654 c.setContents(new StringSelection( ff.print(seqs)), this);
\r
655 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
661 * @param e DOCUMENT ME!
\r
663 protected void pasteNew_actionPerformed(ActionEvent e)
\r
671 * @param e DOCUMENT ME!
\r
673 protected void pasteThis_actionPerformed(ActionEvent e)
\r
675 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
676 HistoryItem.PASTE));
\r
683 * @param newAlignment DOCUMENT ME!
\r
685 void paste(boolean newAlignment)
\r
689 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
690 Transferable contents = c.getContents(this);
\r
692 if (contents == null)
\r
697 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
701 String format = IdentifyFile.Identify(str, "Paste");
\r
702 SequenceI[] sequences;
\r
704 if(Desktop.jalviewClipboard!=null)
\r
706 // The clipboard was filled from within Jalview, we must use the sequences
\r
707 // And dataset from the copied alignment
\r
708 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
712 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
718 Alignment alignment = new Alignment(sequences);
\r
720 if(Desktop.jalviewClipboard!=null)
\r
721 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
723 alignment.setDataset( null );
\r
726 AlignFrame af = new AlignFrame(alignment);
\r
727 String newtitle = new String("Copied sequences");
\r
729 if (title.startsWith("Copied sequences"))
\r
735 newtitle = newtitle.concat("- from " + title);
\r
738 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
739 NEW_WINDOW_HEIGHT);
\r
744 for (int i = 0; i < sequences.length; i++)
\r
746 Sequence newseq = new Sequence(sequences[i].getName(),
\r
747 sequences[i].getSequence(), sequences[i].getStart(),
\r
748 sequences[i].getEnd());
\r
749 viewport.alignment.addSequence(newseq);
\r
750 if(sequences[i].getDatasetSequence()==null)
\r
752 ////////////////////////////
\r
753 //Datset needs extension;
\r
754 /////////////////////////////
\r
755 Sequence ds = new Sequence(sequences[i].getName(),
\r
756 AlignSeq.extractGaps("-. ", sequences[i].getSequence()),
\r
757 sequences[i].getStart(),
\r
758 sequences[i].getEnd());
\r
759 newseq.setDatasetSequence(ds);
\r
760 viewport.alignment.getDataset().addSequence(ds);
\r
763 newseq.setDatasetSequence(sequences[i].getDatasetSequence());
\r
766 viewport.setEndSeq(viewport.alignment.getHeight());
\r
767 viewport.alignment.getWidth();
\r
768 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
771 catch (Exception ex)
\r
773 ex.printStackTrace();
\r
774 System.out.println("Exception whilst pasting: "+ex);
\r
775 // could be anything being pasted in here
\r
784 * @param e DOCUMENT ME!
\r
786 protected void cut_actionPerformed(ActionEvent e)
\r
788 copy_actionPerformed(null);
\r
789 delete_actionPerformed(null);
\r
795 * @param e DOCUMENT ME!
\r
797 protected void delete_actionPerformed(ActionEvent e)
\r
800 if (viewport.getSelectionGroup() == null)
\r
805 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
806 HistoryItem.HIDE));
\r
808 SequenceGroup sg = viewport.getSelectionGroup();
\r
809 boolean allSequences = false;
\r
810 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
812 allSequences = true;
\r
815 for (int i = 0; i < sg.sequences.size(); i++)
\r
817 SequenceI seq = sg.getSequenceAt(i);
\r
818 int index = viewport.getAlignment().findIndex(seq);
\r
819 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
821 // If the cut affects all sequences, remove highlighted columns
\r
824 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
825 sg.getEndRes() + 1);
\r
828 if (seq.getSequence().length() < 1)
\r
830 viewport.getAlignment().deleteSequence(seq);
\r
834 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
838 viewport.setSelectionGroup(null);
\r
839 viewport.alignment.deleteGroup(sg);
\r
841 viewport.firePropertyChange("alignment", null,
\r
842 viewport.getAlignment().getSequences());
\r
846 if (viewport.getAlignment().getHeight() < 1)
\r
850 this.setClosed(true);
\r
852 catch (Exception ex)
\r
861 * @param e DOCUMENT ME!
\r
863 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
865 viewport.alignment.deleteAllGroups();
\r
866 viewport.setSelectionGroup(null);
\r
867 alignPanel.repaint();
\r
873 * @param e DOCUMENT ME!
\r
875 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
877 SequenceGroup sg = new SequenceGroup();
\r
879 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
882 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
885 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
886 viewport.setSelectionGroup(sg);
\r
887 PaintRefresher.Refresh(null, viewport.alignment);
\r
893 * @param e DOCUMENT ME!
\r
895 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
897 viewport.setSelectionGroup(null);
\r
898 viewport.getColumnSelection().clear();
\r
899 viewport.setSelectionGroup(null);
\r
900 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
901 alignPanel.annotationPanel.activeRes = null;
\r
902 PaintRefresher.Refresh(null, viewport.alignment);
\r
908 * @param e DOCUMENT ME!
\r
910 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
912 SequenceGroup sg = viewport.getSelectionGroup();
\r
916 selectAllSequenceMenuItem_actionPerformed(null);
\r
921 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
924 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
927 PaintRefresher.Refresh(null, viewport.alignment);
\r
933 * @param e DOCUMENT ME!
\r
935 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
937 ColumnSelection colSel = viewport.getColumnSelection();
\r
939 if (colSel.size() > 0)
\r
941 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
942 HistoryItem.HIDE));
\r
944 int min = colSel.getMin();
\r
945 viewport.getAlignment().trimLeft(min);
\r
946 colSel.compensateForEdit(0, min);
\r
948 if (viewport.getSelectionGroup() != null)
\r
950 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
953 Vector groups = viewport.alignment.getGroups();
\r
955 for (int i = 0; i < groups.size(); i++)
\r
957 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
959 if (!sg.adjustForRemoveLeft(min))
\r
961 viewport.alignment.deleteGroup(sg);
\r
965 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
972 * @param e DOCUMENT ME!
\r
974 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
976 ColumnSelection colSel = viewport.getColumnSelection();
\r
978 if (colSel.size() > 0)
\r
980 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
981 HistoryItem.HIDE));
\r
983 int max = colSel.getMax();
\r
984 viewport.getAlignment().trimRight(max);
\r
986 if (viewport.getSelectionGroup() != null)
\r
988 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
991 Vector groups = viewport.alignment.getGroups();
\r
993 for (int i = 0; i < groups.size(); i++)
\r
995 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
997 if (!sg.adjustForRemoveRight(max))
\r
999 viewport.alignment.deleteGroup(sg);
\r
1003 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1010 * @param e DOCUMENT ME!
\r
1012 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1014 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1015 viewport.alignment, HistoryItem.HIDE));
\r
1017 //This is to maintain viewport position on first residue
\r
1018 //of first sequence
\r
1019 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1020 int startRes = seq.findPosition(viewport.startRes);
\r
1022 viewport.getAlignment().removeGaps();
\r
1024 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1026 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1032 * @param e DOCUMENT ME!
\r
1034 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1036 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1037 HistoryItem.HIDE));
\r
1039 //This is to maintain viewport position on first residue
\r
1040 //of first sequence
\r
1041 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1042 int startRes = seq.findPosition(viewport.startRes);
\r
1045 SequenceI current;
\r
1048 Vector seqs = null;
\r
1051 int end = viewport.alignment.getWidth();
\r
1053 if (viewport.getSelectionGroup() != null
\r
1054 && viewport.getSelectionGroup().sequences != null
\r
1055 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1057 seqs = viewport.getSelectionGroup().sequences;
\r
1058 start = viewport.getSelectionGroup().getStartRes();
\r
1059 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1063 seqs = viewport.alignment.getSequences();
\r
1066 for (int i = 0; i < seqs.size(); i++)
\r
1068 current = (SequenceI) seqs.elementAt(i);
\r
1069 jSize = current.getLength();
\r
1071 // Removing a range is much quicker than removing gaps
\r
1072 // one by one for long sequences
\r
1074 int rangeStart=-1, rangeEnd=-1;
\r
1078 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1080 if(rangeStart==-1)
\r
1095 current.deleteChars(rangeStart, rangeEnd);
\r
1096 j-=rangeEnd-rangeStart;
\r
1097 jSize-=rangeEnd-rangeStart;
\r
1105 while (j < end && j < jSize);
\r
1108 current.deleteChars(rangeStart, rangeEnd);
\r
1112 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1114 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1117 public void alignmentChanged()
\r
1119 if(viewport.vconsensus!=null)
\r
1121 viewport.updateConsensus();
\r
1122 viewport.updateConservation();
\r
1124 resetAllColourSchemes();
\r
1125 if(alignPanel.overviewPanel!=null)
\r
1126 alignPanel.overviewPanel.updateOverviewImage();
\r
1128 viewport.alignment.adjustSequenceAnnotations();
\r
1130 alignPanel.repaint();
\r
1133 void resetAllColourSchemes()
\r
1135 ColourSchemeI cs = viewport.globalColourScheme;
\r
1138 if (cs instanceof ClustalxColourScheme)
\r
1140 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1141 resetClustalX(viewport.alignment.getSequences(),
\r
1142 viewport.alignment.getWidth());
\r
1145 cs.setConsensus(viewport.vconsensus);
\r
1146 if (cs.conservationApplied())
\r
1148 Alignment al = (Alignment) viewport.alignment;
\r
1149 Conservation c = new Conservation("All",
\r
1150 ResidueProperties.propHash, 3,
\r
1151 al.getSequences(), 0,
\r
1152 al.getWidth() - 1);
\r
1154 c.verdict(false, viewport.ConsPercGaps);
\r
1156 cs.setConservation(c);
\r
1160 int s, sSize = viewport.alignment.getGroups().size();
\r
1161 for(s=0; s<sSize; s++)
\r
1163 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1164 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1166 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1168 sg.recalcConservation();
\r
1175 * @param e DOCUMENT ME!
\r
1177 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1179 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1180 HistoryItem.HIDE));
\r
1181 if (viewport.getAlignment().padGaps())
\r
1182 alignmentChanged();
\r
1188 * @param e DOCUMENT ME!
\r
1190 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1192 JInternalFrame frame = new JInternalFrame();
\r
1193 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1194 frame.setContentPane(finder);
\r
1195 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1196 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1202 * @param e DOCUMENT ME!
\r
1204 public void font_actionPerformed(ActionEvent e)
\r
1206 new FontChooser(alignPanel);
\r
1209 public void smoothFont_actionPerformed(ActionEvent e)
\r
1211 viewport.antiAlias = smoothFont.isSelected();
\r
1212 alignPanel.annotationPanel.image = null;
\r
1213 alignPanel.repaint();
\r
1220 * @param e DOCUMENT ME!
\r
1222 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1224 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1226 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1227 alignPanel.repaint();
\r
1234 * @param e DOCUMENT ME!
\r
1236 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1238 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1239 alignPanel.repaint();
\r
1245 * @param e DOCUMENT ME!
\r
1247 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1249 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1250 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1251 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1252 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1253 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1254 alignPanel.repaint();
\r
1260 * @param e DOCUMENT ME!
\r
1262 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1264 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1265 alignPanel.repaint();
\r
1271 * @param e DOCUMENT ME!
\r
1273 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1275 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1276 alignPanel.repaint();
\r
1282 * @param e DOCUMENT ME!
\r
1284 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1286 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1287 alignPanel.repaint();
\r
1293 * @param e DOCUMENT ME!
\r
1295 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1297 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1298 alignPanel.repaint();
\r
1304 * @param e DOCUMENT ME!
\r
1306 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1308 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1309 alignPanel.repaint();
\r
1315 * @param e DOCUMENT ME!
\r
1317 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1319 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1320 alignPanel.repaint();
\r
1326 * @param evt DOCUMENT ME!
\r
1328 public void sequenceFeatures_actionPerformed(ActionEvent evt)
\r
1330 viewport.showSequenceFeatures(sequenceFeatures.isSelected());
\r
1332 if (viewport.showSequenceFeatures)
\r
1334 new SequenceFeatureFetcher(viewport.
\r
1339 featureSettings.setEnabled(true);
\r
1341 alignPanel.repaint();
\r
1347 * @param e DOCUMENT ME!
\r
1349 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1351 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1352 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1358 * @param e DOCUMENT ME!
\r
1360 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1362 if (alignPanel.overviewPanel != null)
\r
1367 JInternalFrame frame = new JInternalFrame();
\r
1368 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1369 frame.setContentPane(overview);
\r
1370 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1371 frame.getWidth(), frame.getHeight());
\r
1373 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1374 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1376 public void internalFrameClosed(
\r
1377 javax.swing.event.InternalFrameEvent evt)
\r
1379 alignPanel.setOverviewPanel(null);
\r
1384 alignPanel.setOverviewPanel(overview);
\r
1390 * @param e DOCUMENT ME!
\r
1392 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1394 changeColour(null);
\r
1400 * @param e DOCUMENT ME!
\r
1402 public void clustalColour_actionPerformed(ActionEvent e)
\r
1404 changeColour(new ClustalxColourScheme(
\r
1405 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1411 * @param e DOCUMENT ME!
\r
1413 public void zappoColour_actionPerformed(ActionEvent e)
\r
1415 changeColour(new ZappoColourScheme());
\r
1421 * @param e DOCUMENT ME!
\r
1423 public void taylorColour_actionPerformed(ActionEvent e)
\r
1425 changeColour(new TaylorColourScheme());
\r
1431 * @param e DOCUMENT ME!
\r
1433 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1435 changeColour(new HydrophobicColourScheme());
\r
1441 * @param e DOCUMENT ME!
\r
1443 public void helixColour_actionPerformed(ActionEvent e)
\r
1445 changeColour(new HelixColourScheme());
\r
1451 * @param e DOCUMENT ME!
\r
1453 public void strandColour_actionPerformed(ActionEvent e)
\r
1455 changeColour(new StrandColourScheme());
\r
1461 * @param e DOCUMENT ME!
\r
1463 public void turnColour_actionPerformed(ActionEvent e)
\r
1465 changeColour(new TurnColourScheme());
\r
1471 * @param e DOCUMENT ME!
\r
1473 public void buriedColour_actionPerformed(ActionEvent e)
\r
1475 changeColour(new BuriedColourScheme());
\r
1481 * @param e DOCUMENT ME!
\r
1483 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1485 changeColour(new NucleotideColourScheme());
\r
1488 public void annotationColour_actionPerformed(ActionEvent e)
\r
1490 new AnnotationColourChooser(viewport, alignPanel);
\r
1497 * @param e DOCUMENT ME!
\r
1499 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1501 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1507 * @param cs DOCUMENT ME!
\r
1509 void changeColour(ColourSchemeI cs)
\r
1511 int threshold = 0;
\r
1515 if (viewport.getAbovePIDThreshold())
\r
1517 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1520 cs.setThreshold(threshold,
\r
1521 viewport.getIgnoreGapsConsensus());
\r
1523 viewport.setGlobalColourScheme(cs);
\r
1527 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1530 if (viewport.getConservationSelected())
\r
1533 Alignment al = (Alignment) viewport.alignment;
\r
1534 Conservation c = new Conservation("All",
\r
1535 ResidueProperties.propHash, 3,
\r
1536 al.getSequences(), 0,
\r
1537 al.getWidth() - 1);
\r
1540 c.verdict(false, viewport.ConsPercGaps);
\r
1542 cs.setConservation(c);
\r
1544 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1549 cs.setConservation(null);
\r
1552 cs.setConsensus(viewport.vconsensus);
\r
1555 viewport.setGlobalColourScheme(cs);
\r
1557 if (viewport.getColourAppliesToAllGroups())
\r
1559 Vector groups = viewport.alignment.getGroups();
\r
1561 for (int i = 0; i < groups.size(); i++)
\r
1563 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1571 if (cs instanceof ClustalxColourScheme)
\r
1573 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1575 else if (cs instanceof UserColourScheme)
\r
1577 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1583 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1585 catch (Exception ex)
\r
1590 if (viewport.getAbovePIDThreshold()
\r
1591 || cs instanceof PIDColourScheme
\r
1592 || cs instanceof Blosum62ColourScheme)
\r
1594 sg.cs.setThreshold(threshold,
\r
1595 viewport.getIgnoreGapsConsensus());
\r
1597 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1601 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1604 if (viewport.getConservationSelected())
\r
1606 Conservation c = new Conservation("Group",
\r
1607 ResidueProperties.propHash, 3,
\r
1609 viewport.alignment.getWidth() - 1);
\r
1611 c.verdict(false, viewport.ConsPercGaps);
\r
1612 sg.cs.setConservation(c);
\r
1615 sg.cs.setConservation(null);
\r
1619 if (alignPanel.getOverviewPanel() != null)
\r
1621 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1624 alignPanel.repaint();
\r
1630 * @param e DOCUMENT ME!
\r
1632 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1634 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1636 SliderPanel.setPIDSliderSource(alignPanel,
\r
1637 viewport.getGlobalColourScheme(),
\r
1639 SliderPanel.showPIDSlider();
\r
1646 * @param e DOCUMENT ME!
\r
1648 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1650 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1652 SliderPanel.setConservationSlider(alignPanel,
\r
1653 viewport.globalColourScheme,
\r
1655 SliderPanel.showConservationSlider();
\r
1662 * @param e DOCUMENT ME!
\r
1664 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1666 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1668 viewport.setAbovePIDThreshold(false);
\r
1669 abovePIDThreshold.setSelected(false);
\r
1671 changeColour(viewport.getGlobalColourScheme());
\r
1673 modifyConservation_actionPerformed(null);
\r
1679 * @param e DOCUMENT ME!
\r
1681 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1683 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1685 conservationMenuItem.setSelected(false);
\r
1686 viewport.setConservationSelected(false);
\r
1688 changeColour(viewport.getGlobalColourScheme());
\r
1690 modifyPID_actionPerformed(null);
\r
1696 * @param e DOCUMENT ME!
\r
1698 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1700 if (e.getActionCommand().equals("User Defined..."))
\r
1702 new UserDefinedColours(alignPanel, null);
\r
1706 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1707 getUserColourSchemes().get(e.getActionCommand());
\r
1709 changeColour(udc);
\r
1713 public void updateUserColourMenu()
\r
1716 Component[] menuItems = colourMenu.getMenuComponents();
\r
1717 int i, iSize = menuItems.length;
\r
1718 for (i = 0; i < iSize; i++)
\r
1720 if (menuItems[i].getName() != null &&
\r
1721 menuItems[i].getName().equals("USER_DEFINED"))
\r
1723 colourMenu.remove(menuItems[i]);
\r
1727 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1729 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1730 getUserColourSchemes().keys();
\r
1732 while (userColours.hasMoreElements())
\r
1734 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1735 nextElement().toString());
\r
1736 radioItem.setName("USER_DEFINED");
\r
1737 radioItem.addMouseListener(new MouseAdapter()
\r
1739 public void mousePressed(MouseEvent evt)
\r
1741 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1743 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1745 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1746 "Remove from default list?",
\r
1747 "Remove user defined colour",
\r
1748 JOptionPane.YES_NO_OPTION);
\r
1749 if(option == JOptionPane.YES_OPTION)
\r
1751 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1752 colourMenu.remove(radioItem);
\r
1755 radioItem.addActionListener(new ActionListener()
\r
1757 public void actionPerformed(ActionEvent evt)
\r
1759 userDefinedColour_actionPerformed(evt);
\r
1765 radioItem.addActionListener(new ActionListener()
\r
1767 public void actionPerformed(ActionEvent evt)
\r
1769 userDefinedColour_actionPerformed(evt);
\r
1773 colourMenu.insert(radioItem, 15);
\r
1774 colours.add(radioItem);
\r
1782 * @param e DOCUMENT ME!
\r
1784 public void PIDColour_actionPerformed(ActionEvent e)
\r
1786 changeColour(new PIDColourScheme());
\r
1792 * @param e DOCUMENT ME!
\r
1794 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1796 changeColour(new Blosum62ColourScheme());
\r
1802 * @param e DOCUMENT ME!
\r
1804 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1806 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1807 HistoryItem.SORT));
\r
1808 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1809 viewport.getAlignment().getSequenceAt(0));
\r
1810 alignPanel.repaint();
\r
1816 * @param e DOCUMENT ME!
\r
1818 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1820 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1821 HistoryItem.SORT));
\r
1822 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1823 alignPanel.repaint();
\r
1829 * @param e DOCUMENT ME!
\r
1831 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1833 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1834 HistoryItem.SORT));
\r
1836 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1837 alignPanel.repaint();
\r
1843 * @param e DOCUMENT ME!
\r
1845 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1847 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1848 JInternalFrame frame = new JInternalFrame();
\r
1849 frame.setContentPane(sp);
\r
1850 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1857 * @param e DOCUMENT ME!
\r
1859 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1861 if ( (viewport.getSelectionGroup() == null) ||
\r
1862 (viewport.getSelectionGroup().getSize() < 2))
\r
1864 JOptionPane.showInternalMessageDialog(this,
\r
1865 "You must select at least 2 sequences.",
\r
1866 "Invalid Selection",
\r
1867 JOptionPane.WARNING_MESSAGE);
\r
1871 JInternalFrame frame = new JInternalFrame();
\r
1872 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1873 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1880 * @param e DOCUMENT ME!
\r
1882 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1884 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1885 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1886 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1887 (viewport.getAlignment().getHeight() < 4))
\r
1889 JOptionPane.showInternalMessageDialog(this,
\r
1890 "Principal component analysis must take\n" +
\r
1891 "at least 4 input sequences.",
\r
1892 "Sequence selection insufficient",
\r
1893 JOptionPane.WARNING_MESSAGE);
\r
1898 new PCAPanel(viewport);
\r
1904 * @param e DOCUMENT ME!
\r
1906 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1908 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1914 * @param e DOCUMENT ME!
\r
1916 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1918 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1924 * @param e DOCUMENT ME!
\r
1926 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1928 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1934 * @param e DOCUMENT ME!
\r
1936 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1938 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1944 * @param type DOCUMENT ME!
\r
1945 * @param pwType DOCUMENT ME!
\r
1946 * @param title DOCUMENT ME!
\r
1948 void NewTreePanel(String type, String pwType, String title)
\r
1950 final TreePanel tp;
\r
1952 if ( (viewport.getSelectionGroup() != null) &&
\r
1953 (viewport.getSelectionGroup().getSize() > 3))
\r
1956 SequenceGroup sg = viewport.getSelectionGroup();
\r
1958 /* Decide if the selection is a column region */
\r
1959 while (s < sg.sequences.size())
\r
1961 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
1964 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1965 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
1966 "Try using the Pad function in the edit menu,\n" +
\r
1967 "or one of the multiple sequence alignment web services.",
\r
1968 "Sequences in selection are not aligned",
\r
1969 JOptionPane.WARNING_MESSAGE);
\r
1975 title = title + " on region";
\r
1976 tp = new TreePanel(viewport,
\r
1977 viewport.getSelectionGroup().sequences, type, pwType,
\r
1978 sg.getStartRes(), sg.getEndRes());
\r
1982 //are the sequences aligned?
\r
1983 if (!viewport.alignment.isAligned())
\r
1985 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1986 "The sequences must be aligned before creating a tree.\n" +
\r
1987 "Try using the Pad function in the edit menu,\n" +
\r
1988 "or one of the multiple sequence alignment web services.",
\r
1989 "Sequences not aligned",
\r
1990 JOptionPane.WARNING_MESSAGE);
\r
1995 tp = new TreePanel(viewport,
\r
1996 viewport.getAlignment().getSequences(), type, pwType,
\r
1998 viewport.alignment.getWidth());
\r
2001 addTreeMenuItem(tp, title);
\r
2002 viewport.setCurrentTree(tp.getTree());
\r
2004 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2010 * @param title DOCUMENT ME!
\r
2011 * @param order DOCUMENT ME!
\r
2013 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2015 final JMenuItem item = new JMenuItem("by " + title);
\r
2017 item.addActionListener(new java.awt.event.ActionListener()
\r
2019 public void actionPerformed(ActionEvent e)
\r
2021 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2022 HistoryItem.SORT));
\r
2024 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2025 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2026 alignPanel.repaint();
\r
2032 * Maintain the Order by->Displayed Tree menu.
\r
2033 * Creates a new menu item for a TreePanel with an appropriate
\r
2034 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2035 * to remove the menu item when the treePanel is closed, and adjust
\r
2036 * the tree leaf to sequence mapping when the alignment is modified.
\r
2037 * @param treePanel Displayed tree window.
\r
2038 * @param title SortBy menu item title.
\r
2040 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2042 final JMenuItem item = new JMenuItem(title);
\r
2046 if (treeCount == 1)
\r
2048 sort.add(sortByTreeMenu);
\r
2051 sortByTreeMenu.add(item);
\r
2052 item.addActionListener(new java.awt.event.ActionListener()
\r
2054 public void actionPerformed(ActionEvent e)
\r
2056 addHistoryItem(new HistoryItem("Tree Sort",
\r
2057 viewport.alignment, HistoryItem.SORT));
\r
2058 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2059 treePanel.getTree());
\r
2060 alignPanel.repaint();
\r
2064 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2065 InternalFrameAdapter()
\r
2067 public void internalFrameClosed(
\r
2068 javax.swing.event.InternalFrameEvent evt)
\r
2071 sortByTreeMenu.remove(item);
\r
2073 if (treeCount == 0)
\r
2075 sort.remove(sortByTreeMenu);
\r
2083 * Work out whether the whole set of sequences
\r
2084 * or just the selected set will be submitted for multiple alignment.
\r
2087 private SequenceI[] gatherSequencesForAlignment()
\r
2089 // Now, check we have enough sequences
\r
2090 SequenceI[] msa = null;
\r
2092 if ( (viewport.getSelectionGroup() != null) &&
\r
2093 (viewport.getSelectionGroup().getSize() > 1))
\r
2095 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2096 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2098 msa = new SequenceI[sz = seqs.getSize()];
\r
2100 for (int i = 0; i < sz; i++)
\r
2102 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2107 Vector seqs = viewport.getAlignment().getSequences();
\r
2109 if (seqs.size() > 1)
\r
2111 msa = new SequenceI[seqs.size()];
\r
2113 for (int i = 0; i < seqs.size(); i++)
\r
2115 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2123 * Decides what is submitted to a secondary structure prediction service,
\r
2124 * the currently selected sequence, or the currently selected alignment
\r
2125 * (where the first sequence in the set is the one that the prediction
\r
2128 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2130 SequenceI seq = null;
\r
2131 SequenceI[] msa = null;
\r
2133 if ( (viewport.getSelectionGroup() != null) &&
\r
2134 (viewport.getSelectionGroup().getSize() > 0))
\r
2136 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2137 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2139 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2141 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2146 msa = new SequenceI[sz = seqs.getSize()];
\r
2148 for (int i = 0; i < sz; i++)
\r
2150 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2156 Vector seqs = viewport.getAlignment().getSequences();
\r
2158 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2160 seq = (SequenceI) seqs.elementAt(0);
\r
2164 msa = new SequenceI[seqs.size()];
\r
2166 for (int i = 0; i < seqs.size(); i++)
\r
2168 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2180 return new SequenceI[]
\r
2190 * @param e DOCUMENT ME!
\r
2192 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2194 // Pick the tree file
\r
2195 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2197 "LAST_DIRECTORY"));
\r
2198 chooser.setFileView(new JalviewFileView());
\r
2199 chooser.setDialogTitle("Select a newick-like tree file");
\r
2200 chooser.setToolTipText("Load a tree file");
\r
2202 int value = chooser.showOpenDialog(null);
\r
2204 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2206 String choice = chooser.getSelectedFile().getPath();
\r
2207 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2211 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2213 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2215 catch (Exception ex)
\r
2217 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2218 "Problem reading tree file",
\r
2220 JOptionPane.WARNING_MESSAGE);
\r
2221 ex.printStackTrace();
\r
2227 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2229 return ShowNewickTree(nf,title,600,500,4,5);
\r
2234 * @param nf DOCUMENT ME!
\r
2235 * @param title DOCUMENT ME!
\r
2237 * @return DOCUMENT ME!
\r
2239 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2241 TreePanel tp = null;
\r
2247 if (nf.getTree() != null)
\r
2249 tp = new TreePanel(viewport,
\r
2250 viewport.getAlignment().getSequences(), nf,
\r
2257 tp.setLocation(x,y);
\r
2260 Desktop.addInternalFrame(tp, title, w, h);
\r
2261 addTreeMenuItem(tp, title);
\r
2264 catch (Exception ex)
\r
2266 ex.printStackTrace();
\r
2277 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2278 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2279 printJob.setPrintable(alignPanel, pf);
\r
2281 if (printJob.printDialog())
\r
2287 catch (Exception PrintException)
\r
2289 PrintException.printStackTrace();
\r
2296 * Generates menu items and listener event actions for web service clients
\r
2299 public void BuildWebServiceMenu()
\r
2301 if ( (Discoverer.services != null)
\r
2302 && (Discoverer.services.size() > 0))
\r
2304 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2305 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2306 Vector wsmenu = new Vector();
\r
2307 if (msaws != null)
\r
2309 // Add any Multiple Sequence Alignment Services
\r
2310 final JMenu msawsmenu = new JMenu("Alignment");
\r
2311 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2313 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2315 final JMenuItem method = new JMenuItem(sh.getName());
\r
2316 method.addActionListener(new ActionListener()
\r
2318 public void actionPerformed(ActionEvent e)
\r
2320 SequenceI[] msa = gatherSequencesForAlignment();
\r
2321 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2322 false, true, viewport.getAlignment().getDataset());
\r
2327 msawsmenu.add(method);
\r
2328 // Deal with services that we know accept partial alignments.
\r
2329 if (sh.getName().indexOf("lustal") > -1)
\r
2331 // We know that ClustalWS can accept partial alignments for refinement.
\r
2332 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2333 methodR.addActionListener(new ActionListener()
\r
2335 public void actionPerformed(ActionEvent e)
\r
2337 SequenceI[] msa = gatherSequencesForAlignment();
\r
2338 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2339 true, true, viewport.getAlignment().getDataset());
\r
2344 msawsmenu.add(methodR);
\r
2348 wsmenu.add(msawsmenu);
\r
2350 if (secstrpr != null)
\r
2352 // Add any secondary structure prediction services
\r
2353 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2354 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2356 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2358 final JMenuItem method = new JMenuItem(sh.getName());
\r
2359 method.addActionListener(new ActionListener()
\r
2361 public void actionPerformed(ActionEvent e)
\r
2363 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2364 if (msa.length == 1)
\r
2366 // Single Sequence prediction
\r
2367 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2371 if (msa.length > 1)
\r
2373 // Single Sequence prediction
\r
2374 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2380 secstrmenu.add(method);
\r
2382 wsmenu.add(secstrmenu);
\r
2384 this.webService.removeAll();
\r
2385 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2387 webService.add( (JMenu) wsmenu.get(i));
\r
2392 this.webService.removeAll();
\r
2393 this.webService.add(this.webServiceNoServices);
\r
2395 // TODO: add in rediscovery function
\r
2396 // TODO: reduce code redundancy.
\r
2397 // TODO: group services by location as well as function.
\r
2400 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2402 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2403 getProperty("LAST_DIRECTORY"));
\r
2405 chooser.setFileView(new JalviewFileView());
\r
2406 chooser.setDialogTitle("Export to Vamsas file");
\r
2407 chooser.setToolTipText("Export");
\r
2409 int value = chooser.showSaveDialog(this);
\r
2411 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2413 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2414 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2415 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2419 public void featureSettings_actionPerformed(ActionEvent e)
\r
2421 new FeatureSettings(viewport, alignPanel);
\r
2426 public void showTranslation_actionPerformed(ActionEvent e)
\r
2428 int s, sSize = viewport.alignment.getHeight();
\r
2429 SequenceI [] newSeq = new SequenceI[sSize];
\r
2432 StringBuffer protein;
\r
2434 for(s=0; s<sSize; s++)
\r
2436 protein = new StringBuffer();
\r
2437 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2438 resSize = seq.length();
\r
2439 for(res = 0; res < resSize; res+=3)
\r
2441 String codon = seq.substring(res, res+3);
\r
2442 codon = codon.replace('U', 'T');
\r
2443 String aa = ResidueProperties.codonTranslate(codon);
\r
2445 protein.append(viewport.getGapCharacter());
\r
2446 else if(aa.equals("STOP"))
\r
2447 protein.append("X");
\r
2449 protein.append( aa );
\r
2451 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2455 AlignmentI al = new Alignment(newSeq);
\r
2456 al.setDataset(null);
\r
2459 ////////////////////////////////
\r
2460 // Copy annotations across
\r
2461 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2462 = viewport.alignment.getAlignmentAnnotation();
\r
2464 for (int i = 0; i < annotations.length; i++)
\r
2467 if (annotations[i].label.equals("Quality") ||
\r
2468 annotations[i].label.equals("Conservation") ||
\r
2469 annotations[i].label.equals("Consensus"))
\r
2475 aSize = viewport.alignment.getWidth()/3;
\r
2476 jalview.datamodel.Annotation [] anots =
\r
2477 new jalview.datamodel.Annotation[aSize];
\r
2479 for(a=0; a<viewport.alignment.getWidth(); a++)
\r
2481 if( annotations[i].annotations[a]==null
\r
2482 || annotations[i].annotations[a]==null)
\r
2485 anots[a/3] = new Annotation(
\r
2486 annotations[i].annotations[a].displayCharacter,
\r
2487 annotations[i].annotations[a].description,
\r
2488 annotations[i].annotations[a].secondaryStructure,
\r
2489 annotations[i].annotations[a].value,
\r
2490 annotations[i].annotations[a].colour);
\r
2493 jalview.datamodel.AlignmentAnnotation aa
\r
2494 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2495 annotations[i].description, anots );
\r
2496 al.addAnnotation(aa);
\r
2500 AlignFrame af = new AlignFrame(al);
\r
2501 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2503 NEW_WINDOW_HEIGHT);
\r
2506 // AlignViewport newViewport = new AlignViewport(al);
\r
2507 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2508 // tabbedPane.add("Protein", ap);
\r
2509 // viewports.add(newViewport);
\r
2510 // alignPanels.add(ap);
\r
2513 /////////////////////////
\r
2515 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2516 // ds.setDataset(true);
\r
2517 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2518 // tabbedPane.add("Dataset", dap);
\r
2519 // viewports.add(ds);
\r
2520 // alignPanels.add(dap);
\r
2521 /////////////////////////
\r
2526 /*public void tabSelected()
\r
2528 int index = tabbedPane.getSelectedIndex();
\r
2529 viewport = (AlignViewport)viewports.elementAt(index);
\r
2530 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2536 * @param String DOCUMENT ME!
\r
2538 public boolean parseGroupsFile(String file)
\r
2542 BufferedReader in = new BufferedReader(new FileReader(file));
\r
2543 SequenceI seq = null;
\r
2544 String line, type, desc, token;
\r
2546 int index, start, end;
\r
2547 StringTokenizer st;
\r
2548 SequenceFeature sf;
\r
2550 while ( (line = in.readLine()) != null)
\r
2553 st = new StringTokenizer(line, "\t");
\r
2554 if (st.countTokens() == 2)
\r
2556 type = st.nextToken();
\r
2557 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2558 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2562 while (st.hasMoreElements())
\r
2564 desc = st.nextToken();
\r
2565 token = st.nextToken();
\r
2566 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2568 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2573 index = Integer.parseInt(st.nextToken());
\r
2576 start = Integer.parseInt(st.nextToken());
\r
2577 end = Integer.parseInt(st.nextToken());
\r
2579 seq = viewport.alignment.getSequenceAt(index);
\r
2580 start = seq.findIndex(start) - 1;
\r
2581 end = seq.findIndex(end) - 1;
\r
2583 type = st.nextToken();
\r
2585 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2587 // Probably the old style groups file
\r
2588 UserColourScheme ucs = new UserColourScheme(type);
\r
2589 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2592 sf = new SequenceFeature(type, desc, "", start, end);
\r
2594 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2598 catch (Exception ex)
\r
2600 System.out.println("Error parsing groups file: " + ex);
\r
2604 viewport.showSequenceFeatures = true;
\r
2605 alignPanel.repaint();
\r
2609 public void dragEnter(DropTargetDragEvent evt)
\r
2612 public void dragExit(DropTargetEvent evt)
\r
2615 public void dragOver(DropTargetDragEvent evt)
\r
2618 public void dropActionChanged(DropTargetDragEvent evt)
\r
2621 public void drop(DropTargetDropEvent evt)
\r
2623 Transferable t = evt.getTransferable();
\r
2624 java.util.List files = null;
\r
2628 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2629 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2631 //Works on Windows and MacOSX
\r
2632 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2633 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2635 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2637 // This is used by Unix drag system
\r
2638 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2639 String data = (String) t.getTransferData(uriListFlavor);
\r
2640 files = new java.util.ArrayList(1);
\r
2641 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2644 st.hasMoreTokens(); )
\r
2646 String s = st.nextToken();
\r
2647 if (s.startsWith("#"))
\r
2649 // the line is a comment (as per the RFC 2483)
\r
2653 java.net.URI uri = new java.net.URI(s);
\r
2654 java.io.File file = new java.io.File(uri);
\r
2659 catch (Exception e)
\r
2661 e.printStackTrace();
\r
2664 if (files != null)
\r
2668 boolean isAnnotation = false;
\r
2670 for (int i = 0; i < files.size(); i++)
\r
2672 String file = files.get(i).toString();
\r
2674 isAnnotation = new AnnotationReader().readAnnotationFile(viewport.alignment, file);
\r
2676 if( !isAnnotation )
\r
2678 boolean isGroupsFile = parseGroupsFile(file);
\r
2679 if (!isGroupsFile)
\r
2681 String protocol = "File";
\r
2682 String format = jalview.io.IdentifyFile.Identify(file, protocol);
\r
2683 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol, format);
\r
2685 FastaFile ff = new FastaFile();
\r
2686 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2687 c.setContents(new StringSelection(ff.print(sequences)), this);
\r
2689 this.paste(false);
\r
2697 int height = alignPanel.annotationPanel.adjustPanelHeight();
\r
2698 alignPanel.annotationScroller.setPreferredSize(
\r
2699 new Dimension(alignPanel.annotationScroller.getWidth(),
\r
2702 alignPanel.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
\r
2703 alignPanel.annotationSpaceFillerHolder.getWidth(),
\r
2706 alignPanel.addNotify();
\r
2709 catch (Exception ex)
\r
2711 ex.printStackTrace();
\r