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
764 newseq.setDatasetSequence(sequences[i].getDatasetSequence());
\r
765 if(sequences[i].getDatasetSequence().getAnnotation()!=null)
\r
767 for(int aa=0; aa<sequences[i].getDatasetSequence().getAnnotation().length; aa++)
\r
769 viewport.alignment.addAnnotation(sequences[i].getDatasetSequence().getAnnotation()[aa]);
\r
774 viewport.setEndSeq(viewport.alignment.getHeight());
\r
775 viewport.alignment.getWidth();
\r
776 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
779 catch (Exception ex)
\r
781 ex.printStackTrace();
\r
782 System.out.println("Exception whilst pasting: "+ex);
\r
783 // could be anything being pasted in here
\r
792 * @param e DOCUMENT ME!
\r
794 protected void cut_actionPerformed(ActionEvent e)
\r
796 copy_actionPerformed(null);
\r
797 delete_actionPerformed(null);
\r
803 * @param e DOCUMENT ME!
\r
805 protected void delete_actionPerformed(ActionEvent e)
\r
808 if (viewport.getSelectionGroup() == null)
\r
813 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
814 HistoryItem.HIDE));
\r
816 SequenceGroup sg = viewport.getSelectionGroup();
\r
817 boolean allSequences = false;
\r
818 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
820 allSequences = true;
\r
823 for (int i = 0; i < sg.sequences.size(); i++)
\r
825 SequenceI seq = sg.getSequenceAt(i);
\r
826 int index = viewport.getAlignment().findIndex(seq);
\r
827 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
829 // If the cut affects all sequences, remove highlighted columns
\r
832 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
833 sg.getEndRes() + 1);
\r
836 if (seq.getSequence().length() < 1)
\r
838 viewport.getAlignment().deleteSequence(seq);
\r
842 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
846 viewport.setSelectionGroup(null);
\r
847 viewport.alignment.deleteGroup(sg);
\r
849 viewport.firePropertyChange("alignment", null,
\r
850 viewport.getAlignment().getSequences());
\r
854 if (viewport.getAlignment().getHeight() < 1)
\r
858 this.setClosed(true);
\r
860 catch (Exception ex)
\r
869 * @param e DOCUMENT ME!
\r
871 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
873 viewport.alignment.deleteAllGroups();
\r
874 viewport.setSelectionGroup(null);
\r
875 alignPanel.repaint();
\r
881 * @param e DOCUMENT ME!
\r
883 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
885 SequenceGroup sg = new SequenceGroup();
\r
887 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
890 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
893 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
894 viewport.setSelectionGroup(sg);
\r
895 PaintRefresher.Refresh(null, viewport.alignment);
\r
901 * @param e DOCUMENT ME!
\r
903 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
905 viewport.setSelectionGroup(null);
\r
906 viewport.getColumnSelection().clear();
\r
907 viewport.setSelectionGroup(null);
\r
908 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
909 alignPanel.annotationPanel.activeRes = null;
\r
910 PaintRefresher.Refresh(null, viewport.alignment);
\r
916 * @param e DOCUMENT ME!
\r
918 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
920 SequenceGroup sg = viewport.getSelectionGroup();
\r
924 selectAllSequenceMenuItem_actionPerformed(null);
\r
929 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
932 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
935 PaintRefresher.Refresh(null, viewport.alignment);
\r
941 * @param e DOCUMENT ME!
\r
943 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
945 ColumnSelection colSel = viewport.getColumnSelection();
\r
947 if (colSel.size() > 0)
\r
949 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
950 HistoryItem.HIDE));
\r
952 int min = colSel.getMin();
\r
953 viewport.getAlignment().trimLeft(min);
\r
954 colSel.compensateForEdit(0, min);
\r
956 if (viewport.getSelectionGroup() != null)
\r
958 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
961 Vector groups = viewport.alignment.getGroups();
\r
963 for (int i = 0; i < groups.size(); i++)
\r
965 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
967 if (!sg.adjustForRemoveLeft(min))
\r
969 viewport.alignment.deleteGroup(sg);
\r
973 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
980 * @param e DOCUMENT ME!
\r
982 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
984 ColumnSelection colSel = viewport.getColumnSelection();
\r
986 if (colSel.size() > 0)
\r
988 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
989 HistoryItem.HIDE));
\r
991 int max = colSel.getMax();
\r
992 viewport.getAlignment().trimRight(max);
\r
994 if (viewport.getSelectionGroup() != null)
\r
996 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
999 Vector groups = viewport.alignment.getGroups();
\r
1001 for (int i = 0; i < groups.size(); i++)
\r
1003 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1005 if (!sg.adjustForRemoveRight(max))
\r
1007 viewport.alignment.deleteGroup(sg);
\r
1011 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1018 * @param e DOCUMENT ME!
\r
1020 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1022 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1023 viewport.alignment, HistoryItem.HIDE));
\r
1025 //This is to maintain viewport position on first residue
\r
1026 //of first sequence
\r
1027 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1028 int startRes = seq.findPosition(viewport.startRes);
\r
1030 viewport.getAlignment().removeGaps();
\r
1032 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1034 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1040 * @param e DOCUMENT ME!
\r
1042 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1044 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1045 HistoryItem.HIDE));
\r
1047 //This is to maintain viewport position on first residue
\r
1048 //of first sequence
\r
1049 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1050 int startRes = seq.findPosition(viewport.startRes);
\r
1053 SequenceI current;
\r
1056 Vector seqs = null;
\r
1059 int end = viewport.alignment.getWidth();
\r
1061 if (viewport.getSelectionGroup() != null
\r
1062 && viewport.getSelectionGroup().sequences != null
\r
1063 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1065 seqs = viewport.getSelectionGroup().sequences;
\r
1066 start = viewport.getSelectionGroup().getStartRes();
\r
1067 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1071 seqs = viewport.alignment.getSequences();
\r
1074 for (int i = 0; i < seqs.size(); i++)
\r
1076 current = (SequenceI) seqs.elementAt(i);
\r
1077 jSize = current.getLength();
\r
1079 // Removing a range is much quicker than removing gaps
\r
1080 // one by one for long sequences
\r
1082 int rangeStart=-1, rangeEnd=-1;
\r
1086 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1088 if(rangeStart==-1)
\r
1103 current.deleteChars(rangeStart, rangeEnd);
\r
1104 j-=rangeEnd-rangeStart;
\r
1105 jSize-=rangeEnd-rangeStart;
\r
1113 while (j < end && j < jSize);
\r
1116 current.deleteChars(rangeStart, rangeEnd);
\r
1120 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1122 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1125 public void alignmentChanged()
\r
1127 if(viewport.vconsensus!=null)
\r
1129 viewport.updateConsensus();
\r
1130 viewport.updateConservation();
\r
1132 resetAllColourSchemes();
\r
1133 if(alignPanel.overviewPanel!=null)
\r
1134 alignPanel.overviewPanel.updateOverviewImage();
\r
1136 viewport.alignment.adjustSequenceAnnotations();
\r
1138 alignPanel.repaint();
\r
1141 void resetAllColourSchemes()
\r
1143 ColourSchemeI cs = viewport.globalColourScheme;
\r
1146 if (cs instanceof ClustalxColourScheme)
\r
1148 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1149 resetClustalX(viewport.alignment.getSequences(),
\r
1150 viewport.alignment.getWidth());
\r
1153 cs.setConsensus(viewport.vconsensus);
\r
1154 if (cs.conservationApplied())
\r
1156 Alignment al = (Alignment) viewport.alignment;
\r
1157 Conservation c = new Conservation("All",
\r
1158 ResidueProperties.propHash, 3,
\r
1159 al.getSequences(), 0,
\r
1160 al.getWidth() - 1);
\r
1162 c.verdict(false, viewport.ConsPercGaps);
\r
1164 cs.setConservation(c);
\r
1168 int s, sSize = viewport.alignment.getGroups().size();
\r
1169 for(s=0; s<sSize; s++)
\r
1171 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1172 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1174 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1176 sg.recalcConservation();
\r
1183 * @param e DOCUMENT ME!
\r
1185 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1187 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1188 HistoryItem.HIDE));
\r
1189 if (viewport.getAlignment().padGaps())
\r
1190 alignmentChanged();
\r
1196 * @param e DOCUMENT ME!
\r
1198 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1200 JInternalFrame frame = new JInternalFrame();
\r
1201 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1202 frame.setContentPane(finder);
\r
1203 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1204 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1210 * @param e DOCUMENT ME!
\r
1212 public void font_actionPerformed(ActionEvent e)
\r
1214 new FontChooser(alignPanel);
\r
1217 public void smoothFont_actionPerformed(ActionEvent e)
\r
1219 viewport.antiAlias = smoothFont.isSelected();
\r
1220 alignPanel.annotationPanel.image = null;
\r
1221 alignPanel.repaint();
\r
1228 * @param e DOCUMENT ME!
\r
1230 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1232 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1234 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1235 alignPanel.repaint();
\r
1242 * @param e DOCUMENT ME!
\r
1244 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1246 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1247 alignPanel.repaint();
\r
1253 * @param e DOCUMENT ME!
\r
1255 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1257 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1258 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1259 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1260 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1261 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1262 alignPanel.repaint();
\r
1268 * @param e DOCUMENT ME!
\r
1270 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1272 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1273 alignPanel.repaint();
\r
1279 * @param e DOCUMENT ME!
\r
1281 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1283 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1284 alignPanel.repaint();
\r
1290 * @param e DOCUMENT ME!
\r
1292 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1294 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1295 alignPanel.repaint();
\r
1301 * @param e DOCUMENT ME!
\r
1303 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1305 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1306 alignPanel.repaint();
\r
1312 * @param e DOCUMENT ME!
\r
1314 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1316 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1317 alignPanel.repaint();
\r
1323 * @param e DOCUMENT ME!
\r
1325 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1327 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1328 alignPanel.repaint();
\r
1334 * @param evt DOCUMENT ME!
\r
1336 public void sequenceFeatures_actionPerformed(ActionEvent evt)
\r
1338 viewport.showSequenceFeatures(sequenceFeatures.isSelected());
\r
1340 if (viewport.showSequenceFeatures)
\r
1342 new SequenceFeatureFetcher(viewport.
\r
1347 featureSettings.setEnabled(true);
\r
1349 alignPanel.repaint();
\r
1355 * @param e DOCUMENT ME!
\r
1357 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1359 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1360 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1366 * @param e DOCUMENT ME!
\r
1368 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1370 if (alignPanel.overviewPanel != null)
\r
1375 JInternalFrame frame = new JInternalFrame();
\r
1376 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1377 frame.setContentPane(overview);
\r
1378 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1379 frame.getWidth(), frame.getHeight());
\r
1381 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1382 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1384 public void internalFrameClosed(
\r
1385 javax.swing.event.InternalFrameEvent evt)
\r
1387 alignPanel.setOverviewPanel(null);
\r
1392 alignPanel.setOverviewPanel(overview);
\r
1398 * @param e DOCUMENT ME!
\r
1400 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1402 changeColour(null);
\r
1408 * @param e DOCUMENT ME!
\r
1410 public void clustalColour_actionPerformed(ActionEvent e)
\r
1412 changeColour(new ClustalxColourScheme(
\r
1413 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1419 * @param e DOCUMENT ME!
\r
1421 public void zappoColour_actionPerformed(ActionEvent e)
\r
1423 changeColour(new ZappoColourScheme());
\r
1429 * @param e DOCUMENT ME!
\r
1431 public void taylorColour_actionPerformed(ActionEvent e)
\r
1433 changeColour(new TaylorColourScheme());
\r
1439 * @param e DOCUMENT ME!
\r
1441 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1443 changeColour(new HydrophobicColourScheme());
\r
1449 * @param e DOCUMENT ME!
\r
1451 public void helixColour_actionPerformed(ActionEvent e)
\r
1453 changeColour(new HelixColourScheme());
\r
1459 * @param e DOCUMENT ME!
\r
1461 public void strandColour_actionPerformed(ActionEvent e)
\r
1463 changeColour(new StrandColourScheme());
\r
1469 * @param e DOCUMENT ME!
\r
1471 public void turnColour_actionPerformed(ActionEvent e)
\r
1473 changeColour(new TurnColourScheme());
\r
1479 * @param e DOCUMENT ME!
\r
1481 public void buriedColour_actionPerformed(ActionEvent e)
\r
1483 changeColour(new BuriedColourScheme());
\r
1489 * @param e DOCUMENT ME!
\r
1491 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1493 changeColour(new NucleotideColourScheme());
\r
1496 public void annotationColour_actionPerformed(ActionEvent e)
\r
1498 new AnnotationColourChooser(viewport, alignPanel);
\r
1505 * @param e DOCUMENT ME!
\r
1507 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1509 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1515 * @param cs DOCUMENT ME!
\r
1517 void changeColour(ColourSchemeI cs)
\r
1519 int threshold = 0;
\r
1523 if (viewport.getAbovePIDThreshold())
\r
1525 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1528 cs.setThreshold(threshold,
\r
1529 viewport.getIgnoreGapsConsensus());
\r
1531 viewport.setGlobalColourScheme(cs);
\r
1535 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1538 if (viewport.getConservationSelected())
\r
1541 Alignment al = (Alignment) viewport.alignment;
\r
1542 Conservation c = new Conservation("All",
\r
1543 ResidueProperties.propHash, 3,
\r
1544 al.getSequences(), 0,
\r
1545 al.getWidth() - 1);
\r
1548 c.verdict(false, viewport.ConsPercGaps);
\r
1550 cs.setConservation(c);
\r
1552 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1557 cs.setConservation(null);
\r
1560 cs.setConsensus(viewport.vconsensus);
\r
1563 viewport.setGlobalColourScheme(cs);
\r
1565 if (viewport.getColourAppliesToAllGroups())
\r
1567 Vector groups = viewport.alignment.getGroups();
\r
1569 for (int i = 0; i < groups.size(); i++)
\r
1571 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1579 if (cs instanceof ClustalxColourScheme)
\r
1581 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1583 else if (cs instanceof UserColourScheme)
\r
1585 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1591 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1593 catch (Exception ex)
\r
1598 if (viewport.getAbovePIDThreshold()
\r
1599 || cs instanceof PIDColourScheme
\r
1600 || cs instanceof Blosum62ColourScheme)
\r
1602 sg.cs.setThreshold(threshold,
\r
1603 viewport.getIgnoreGapsConsensus());
\r
1605 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1609 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1612 if (viewport.getConservationSelected())
\r
1614 Conservation c = new Conservation("Group",
\r
1615 ResidueProperties.propHash, 3,
\r
1617 viewport.alignment.getWidth() - 1);
\r
1619 c.verdict(false, viewport.ConsPercGaps);
\r
1620 sg.cs.setConservation(c);
\r
1623 sg.cs.setConservation(null);
\r
1627 if (alignPanel.getOverviewPanel() != null)
\r
1629 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1632 alignPanel.repaint();
\r
1638 * @param e DOCUMENT ME!
\r
1640 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1642 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1644 SliderPanel.setPIDSliderSource(alignPanel,
\r
1645 viewport.getGlobalColourScheme(),
\r
1647 SliderPanel.showPIDSlider();
\r
1654 * @param e DOCUMENT ME!
\r
1656 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1658 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1660 SliderPanel.setConservationSlider(alignPanel,
\r
1661 viewport.globalColourScheme,
\r
1663 SliderPanel.showConservationSlider();
\r
1670 * @param e DOCUMENT ME!
\r
1672 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1674 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1676 viewport.setAbovePIDThreshold(false);
\r
1677 abovePIDThreshold.setSelected(false);
\r
1679 changeColour(viewport.getGlobalColourScheme());
\r
1681 modifyConservation_actionPerformed(null);
\r
1687 * @param e DOCUMENT ME!
\r
1689 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1691 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1693 conservationMenuItem.setSelected(false);
\r
1694 viewport.setConservationSelected(false);
\r
1696 changeColour(viewport.getGlobalColourScheme());
\r
1698 modifyPID_actionPerformed(null);
\r
1704 * @param e DOCUMENT ME!
\r
1706 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1708 if (e.getActionCommand().equals("User Defined..."))
\r
1710 new UserDefinedColours(alignPanel, null);
\r
1714 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1715 getUserColourSchemes().get(e.getActionCommand());
\r
1717 changeColour(udc);
\r
1721 public void updateUserColourMenu()
\r
1724 Component[] menuItems = colourMenu.getMenuComponents();
\r
1725 int i, iSize = menuItems.length;
\r
1726 for (i = 0; i < iSize; i++)
\r
1728 if (menuItems[i].getName() != null &&
\r
1729 menuItems[i].getName().equals("USER_DEFINED"))
\r
1731 colourMenu.remove(menuItems[i]);
\r
1735 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1737 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1738 getUserColourSchemes().keys();
\r
1740 while (userColours.hasMoreElements())
\r
1742 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1743 nextElement().toString());
\r
1744 radioItem.setName("USER_DEFINED");
\r
1745 radioItem.addMouseListener(new MouseAdapter()
\r
1747 public void mousePressed(MouseEvent evt)
\r
1749 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1751 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1753 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1754 "Remove from default list?",
\r
1755 "Remove user defined colour",
\r
1756 JOptionPane.YES_NO_OPTION);
\r
1757 if(option == JOptionPane.YES_OPTION)
\r
1759 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1760 colourMenu.remove(radioItem);
\r
1763 radioItem.addActionListener(new ActionListener()
\r
1765 public void actionPerformed(ActionEvent evt)
\r
1767 userDefinedColour_actionPerformed(evt);
\r
1773 radioItem.addActionListener(new ActionListener()
\r
1775 public void actionPerformed(ActionEvent evt)
\r
1777 userDefinedColour_actionPerformed(evt);
\r
1781 colourMenu.insert(radioItem, 15);
\r
1782 colours.add(radioItem);
\r
1790 * @param e DOCUMENT ME!
\r
1792 public void PIDColour_actionPerformed(ActionEvent e)
\r
1794 changeColour(new PIDColourScheme());
\r
1800 * @param e DOCUMENT ME!
\r
1802 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1804 changeColour(new Blosum62ColourScheme());
\r
1810 * @param e DOCUMENT ME!
\r
1812 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1814 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1815 HistoryItem.SORT));
\r
1816 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1817 viewport.getAlignment().getSequenceAt(0));
\r
1818 alignPanel.repaint();
\r
1824 * @param e DOCUMENT ME!
\r
1826 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1828 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1829 HistoryItem.SORT));
\r
1830 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1831 alignPanel.repaint();
\r
1837 * @param e DOCUMENT ME!
\r
1839 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1841 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1842 HistoryItem.SORT));
\r
1844 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1845 alignPanel.repaint();
\r
1851 * @param e DOCUMENT ME!
\r
1853 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1855 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1856 JInternalFrame frame = new JInternalFrame();
\r
1857 frame.setContentPane(sp);
\r
1858 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1865 * @param e DOCUMENT ME!
\r
1867 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1869 if ( (viewport.getSelectionGroup() == null) ||
\r
1870 (viewport.getSelectionGroup().getSize() < 2))
\r
1872 JOptionPane.showInternalMessageDialog(this,
\r
1873 "You must select at least 2 sequences.",
\r
1874 "Invalid Selection",
\r
1875 JOptionPane.WARNING_MESSAGE);
\r
1879 JInternalFrame frame = new JInternalFrame();
\r
1880 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1881 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1888 * @param e DOCUMENT ME!
\r
1890 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1892 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1893 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1894 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1895 (viewport.getAlignment().getHeight() < 4))
\r
1897 JOptionPane.showInternalMessageDialog(this,
\r
1898 "Principal component analysis must take\n" +
\r
1899 "at least 4 input sequences.",
\r
1900 "Sequence selection insufficient",
\r
1901 JOptionPane.WARNING_MESSAGE);
\r
1906 new PCAPanel(viewport);
\r
1912 * @param e DOCUMENT ME!
\r
1914 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1916 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1922 * @param e DOCUMENT ME!
\r
1924 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1926 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1932 * @param e DOCUMENT ME!
\r
1934 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1936 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1942 * @param e DOCUMENT ME!
\r
1944 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1946 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1952 * @param type DOCUMENT ME!
\r
1953 * @param pwType DOCUMENT ME!
\r
1954 * @param title DOCUMENT ME!
\r
1956 void NewTreePanel(String type, String pwType, String title)
\r
1958 final TreePanel tp;
\r
1960 if ( (viewport.getSelectionGroup() != null) &&
\r
1961 (viewport.getSelectionGroup().getSize() > 3))
\r
1964 SequenceGroup sg = viewport.getSelectionGroup();
\r
1966 /* Decide if the selection is a column region */
\r
1967 while (s < sg.sequences.size())
\r
1969 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
1972 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1973 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
1974 "Try using the Pad function in the edit menu,\n" +
\r
1975 "or one of the multiple sequence alignment web services.",
\r
1976 "Sequences in selection are not aligned",
\r
1977 JOptionPane.WARNING_MESSAGE);
\r
1983 title = title + " on region";
\r
1984 tp = new TreePanel(viewport,
\r
1985 viewport.getSelectionGroup().sequences, type, pwType,
\r
1986 sg.getStartRes(), sg.getEndRes());
\r
1990 //are the sequences aligned?
\r
1991 if (!viewport.alignment.isAligned())
\r
1993 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1994 "The sequences must be aligned before creating a tree.\n" +
\r
1995 "Try using the Pad function in the edit menu,\n" +
\r
1996 "or one of the multiple sequence alignment web services.",
\r
1997 "Sequences not aligned",
\r
1998 JOptionPane.WARNING_MESSAGE);
\r
2003 tp = new TreePanel(viewport,
\r
2004 viewport.getAlignment().getSequences(), type, pwType,
\r
2006 viewport.alignment.getWidth());
\r
2009 addTreeMenuItem(tp, title);
\r
2010 viewport.setCurrentTree(tp.getTree());
\r
2012 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2018 * @param title DOCUMENT ME!
\r
2019 * @param order DOCUMENT ME!
\r
2021 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2023 final JMenuItem item = new JMenuItem("by " + title);
\r
2025 item.addActionListener(new java.awt.event.ActionListener()
\r
2027 public void actionPerformed(ActionEvent e)
\r
2029 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2030 HistoryItem.SORT));
\r
2032 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2033 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2034 alignPanel.repaint();
\r
2040 * Maintain the Order by->Displayed Tree menu.
\r
2041 * Creates a new menu item for a TreePanel with an appropriate
\r
2042 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2043 * to remove the menu item when the treePanel is closed, and adjust
\r
2044 * the tree leaf to sequence mapping when the alignment is modified.
\r
2045 * @param treePanel Displayed tree window.
\r
2046 * @param title SortBy menu item title.
\r
2048 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2050 final JMenuItem item = new JMenuItem(title);
\r
2054 if (treeCount == 1)
\r
2056 sort.add(sortByTreeMenu);
\r
2059 sortByTreeMenu.add(item);
\r
2060 item.addActionListener(new java.awt.event.ActionListener()
\r
2062 public void actionPerformed(ActionEvent e)
\r
2064 addHistoryItem(new HistoryItem("Tree Sort",
\r
2065 viewport.alignment, HistoryItem.SORT));
\r
2066 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2067 treePanel.getTree());
\r
2068 alignPanel.repaint();
\r
2072 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2073 InternalFrameAdapter()
\r
2075 public void internalFrameClosed(
\r
2076 javax.swing.event.InternalFrameEvent evt)
\r
2079 sortByTreeMenu.remove(item);
\r
2081 if (treeCount == 0)
\r
2083 sort.remove(sortByTreeMenu);
\r
2091 * Work out whether the whole set of sequences
\r
2092 * or just the selected set will be submitted for multiple alignment.
\r
2095 private SequenceI[] gatherSequencesForAlignment()
\r
2097 // Now, check we have enough sequences
\r
2098 SequenceI[] msa = null;
\r
2100 if ( (viewport.getSelectionGroup() != null) &&
\r
2101 (viewport.getSelectionGroup().getSize() > 1))
\r
2103 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2104 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2106 msa = new SequenceI[sz = seqs.getSize()];
\r
2108 for (int i = 0; i < sz; i++)
\r
2110 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2115 Vector seqs = viewport.getAlignment().getSequences();
\r
2117 if (seqs.size() > 1)
\r
2119 msa = new SequenceI[seqs.size()];
\r
2121 for (int i = 0; i < seqs.size(); i++)
\r
2123 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2131 * Decides what is submitted to a secondary structure prediction service,
\r
2132 * the currently selected sequence, or the currently selected alignment
\r
2133 * (where the first sequence in the set is the one that the prediction
\r
2136 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2138 SequenceI seq = null;
\r
2139 SequenceI[] msa = null;
\r
2141 if ( (viewport.getSelectionGroup() != null) &&
\r
2142 (viewport.getSelectionGroup().getSize() > 0))
\r
2144 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2145 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2147 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2149 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2154 msa = new SequenceI[sz = seqs.getSize()];
\r
2156 for (int i = 0; i < sz; i++)
\r
2158 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2164 Vector seqs = viewport.getAlignment().getSequences();
\r
2166 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2168 seq = (SequenceI) seqs.elementAt(0);
\r
2172 msa = new SequenceI[seqs.size()];
\r
2174 for (int i = 0; i < seqs.size(); i++)
\r
2176 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2188 return new SequenceI[]
\r
2198 * @param e DOCUMENT ME!
\r
2200 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2202 // Pick the tree file
\r
2203 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2205 "LAST_DIRECTORY"));
\r
2206 chooser.setFileView(new JalviewFileView());
\r
2207 chooser.setDialogTitle("Select a newick-like tree file");
\r
2208 chooser.setToolTipText("Load a tree file");
\r
2210 int value = chooser.showOpenDialog(null);
\r
2212 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2214 String choice = chooser.getSelectedFile().getPath();
\r
2215 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2219 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2221 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2223 catch (Exception ex)
\r
2225 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2226 "Problem reading tree file",
\r
2228 JOptionPane.WARNING_MESSAGE);
\r
2229 ex.printStackTrace();
\r
2235 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2237 return ShowNewickTree(nf,title,600,500,4,5);
\r
2242 * @param nf DOCUMENT ME!
\r
2243 * @param title DOCUMENT ME!
\r
2245 * @return DOCUMENT ME!
\r
2247 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2249 TreePanel tp = null;
\r
2255 if (nf.getTree() != null)
\r
2257 tp = new TreePanel(viewport,
\r
2258 viewport.getAlignment().getSequences(), nf,
\r
2265 tp.setLocation(x,y);
\r
2268 Desktop.addInternalFrame(tp, title, w, h);
\r
2269 addTreeMenuItem(tp, title);
\r
2272 catch (Exception ex)
\r
2274 ex.printStackTrace();
\r
2285 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2286 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2287 printJob.setPrintable(alignPanel, pf);
\r
2289 if (printJob.printDialog())
\r
2295 catch (Exception PrintException)
\r
2297 PrintException.printStackTrace();
\r
2304 * Generates menu items and listener event actions for web service clients
\r
2307 public void BuildWebServiceMenu()
\r
2309 if ( (Discoverer.services != null)
\r
2310 && (Discoverer.services.size() > 0))
\r
2312 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2313 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2314 Vector wsmenu = new Vector();
\r
2315 if (msaws != null)
\r
2317 // Add any Multiple Sequence Alignment Services
\r
2318 final JMenu msawsmenu = new JMenu("Alignment");
\r
2319 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2321 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2323 final JMenuItem method = new JMenuItem(sh.getName());
\r
2324 method.addActionListener(new ActionListener()
\r
2326 public void actionPerformed(ActionEvent e)
\r
2328 SequenceI[] msa = gatherSequencesForAlignment();
\r
2329 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2330 false, true, viewport.getAlignment().getDataset());
\r
2335 msawsmenu.add(method);
\r
2336 // Deal with services that we know accept partial alignments.
\r
2337 if (sh.getName().indexOf("lustal") > -1)
\r
2339 // We know that ClustalWS can accept partial alignments for refinement.
\r
2340 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2341 methodR.addActionListener(new ActionListener()
\r
2343 public void actionPerformed(ActionEvent e)
\r
2345 SequenceI[] msa = gatherSequencesForAlignment();
\r
2346 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2347 true, true, viewport.getAlignment().getDataset());
\r
2352 msawsmenu.add(methodR);
\r
2356 wsmenu.add(msawsmenu);
\r
2358 if (secstrpr != null)
\r
2360 // Add any secondary structure prediction services
\r
2361 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2362 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2364 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2366 final JMenuItem method = new JMenuItem(sh.getName());
\r
2367 method.addActionListener(new ActionListener()
\r
2369 public void actionPerformed(ActionEvent e)
\r
2371 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2372 if (msa.length == 1)
\r
2374 // Single Sequence prediction
\r
2375 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2379 if (msa.length > 1)
\r
2381 // Single Sequence prediction
\r
2382 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2388 secstrmenu.add(method);
\r
2390 wsmenu.add(secstrmenu);
\r
2392 this.webService.removeAll();
\r
2393 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2395 webService.add( (JMenu) wsmenu.get(i));
\r
2400 this.webService.removeAll();
\r
2401 this.webService.add(this.webServiceNoServices);
\r
2403 // TODO: add in rediscovery function
\r
2404 // TODO: reduce code redundancy.
\r
2405 // TODO: group services by location as well as function.
\r
2408 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2410 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2411 getProperty("LAST_DIRECTORY"));
\r
2413 chooser.setFileView(new JalviewFileView());
\r
2414 chooser.setDialogTitle("Export to Vamsas file");
\r
2415 chooser.setToolTipText("Export");
\r
2417 int value = chooser.showSaveDialog(this);
\r
2419 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2421 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2422 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2423 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2427 public void featureSettings_actionPerformed(ActionEvent e)
\r
2429 new FeatureSettings(viewport, alignPanel);
\r
2434 public void showTranslation_actionPerformed(ActionEvent e)
\r
2436 int s, sSize = viewport.alignment.getHeight();
\r
2437 SequenceI [] newSeq = new SequenceI[sSize];
\r
2440 StringBuffer protein;
\r
2442 for(s=0; s<sSize; s++)
\r
2444 protein = new StringBuffer();
\r
2445 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2446 resSize = seq.length();
\r
2447 for(res = 0; res < resSize; res+=3)
\r
2449 String codon = seq.substring(res, res+3);
\r
2450 codon = codon.replace('U', 'T');
\r
2451 String aa = ResidueProperties.codonTranslate(codon);
\r
2453 protein.append(viewport.getGapCharacter());
\r
2454 else if(aa.equals("STOP"))
\r
2455 protein.append("X");
\r
2457 protein.append( aa );
\r
2459 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2463 AlignmentI al = new Alignment(newSeq);
\r
2464 al.setDataset(null);
\r
2467 ////////////////////////////////
\r
2468 // Copy annotations across
\r
2469 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2470 = viewport.alignment.getAlignmentAnnotation();
\r
2472 for (int i = 0; i < annotations.length; i++)
\r
2475 if (annotations[i].label.equals("Quality") ||
\r
2476 annotations[i].label.equals("Conservation") ||
\r
2477 annotations[i].label.equals("Consensus"))
\r
2483 aSize = viewport.alignment.getWidth()/3;
\r
2484 jalview.datamodel.Annotation [] anots =
\r
2485 new jalview.datamodel.Annotation[aSize];
\r
2487 for(a=0; a<viewport.alignment.getWidth(); a++)
\r
2489 if( annotations[i].annotations[a]==null
\r
2490 || annotations[i].annotations[a]==null)
\r
2493 anots[a/3] = new Annotation(
\r
2494 annotations[i].annotations[a].displayCharacter,
\r
2495 annotations[i].annotations[a].description,
\r
2496 annotations[i].annotations[a].secondaryStructure,
\r
2497 annotations[i].annotations[a].value,
\r
2498 annotations[i].annotations[a].colour);
\r
2501 jalview.datamodel.AlignmentAnnotation aa
\r
2502 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2503 annotations[i].description, anots );
\r
2504 al.addAnnotation(aa);
\r
2508 AlignFrame af = new AlignFrame(al);
\r
2509 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2511 NEW_WINDOW_HEIGHT);
\r
2514 // AlignViewport newViewport = new AlignViewport(al);
\r
2515 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2516 // tabbedPane.add("Protein", ap);
\r
2517 // viewports.add(newViewport);
\r
2518 // alignPanels.add(ap);
\r
2521 /////////////////////////
\r
2523 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2524 // ds.setDataset(true);
\r
2525 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2526 // tabbedPane.add("Dataset", dap);
\r
2527 // viewports.add(ds);
\r
2528 // alignPanels.add(dap);
\r
2529 /////////////////////////
\r
2534 /*public void tabSelected()
\r
2536 int index = tabbedPane.getSelectedIndex();
\r
2537 viewport = (AlignViewport)viewports.elementAt(index);
\r
2538 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2544 * @param String DOCUMENT ME!
\r
2546 public boolean parseGroupsFile(String file)
\r
2550 BufferedReader in = new BufferedReader(new FileReader(file));
\r
2551 SequenceI seq = null;
\r
2552 String line, type, desc, token;
\r
2554 int index, start, end;
\r
2555 StringTokenizer st;
\r
2556 SequenceFeature sf;
\r
2558 while ( (line = in.readLine()) != null)
\r
2561 st = new StringTokenizer(line, "\t");
\r
2562 if (st.countTokens() == 2)
\r
2564 type = st.nextToken();
\r
2565 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2566 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2570 while (st.hasMoreElements())
\r
2572 desc = st.nextToken();
\r
2573 token = st.nextToken();
\r
2574 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2576 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2581 index = Integer.parseInt(st.nextToken());
\r
2584 start = Integer.parseInt(st.nextToken());
\r
2585 end = Integer.parseInt(st.nextToken());
\r
2587 seq = viewport.alignment.getSequenceAt(index);
\r
2588 start = seq.findIndex(start) - 1;
\r
2589 end = seq.findIndex(end) - 1;
\r
2591 type = st.nextToken();
\r
2593 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2595 // Probably the old style groups file
\r
2596 UserColourScheme ucs = new UserColourScheme(type);
\r
2597 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2600 sf = new SequenceFeature(type, desc, "", start, end);
\r
2602 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2606 catch (Exception ex)
\r
2608 System.out.println("Error parsing groups file: " + ex);
\r
2612 viewport.showSequenceFeatures = true;
\r
2613 alignPanel.repaint();
\r
2617 public void dragEnter(DropTargetDragEvent evt)
\r
2620 public void dragExit(DropTargetEvent evt)
\r
2623 public void dragOver(DropTargetDragEvent evt)
\r
2626 public void dropActionChanged(DropTargetDragEvent evt)
\r
2629 public void drop(DropTargetDropEvent evt)
\r
2631 Transferable t = evt.getTransferable();
\r
2632 java.util.List files = null;
\r
2636 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2637 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2639 //Works on Windows and MacOSX
\r
2640 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2641 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2643 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2645 // This is used by Unix drag system
\r
2646 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2647 String data = (String) t.getTransferData(uriListFlavor);
\r
2648 files = new java.util.ArrayList(1);
\r
2649 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2652 st.hasMoreTokens(); )
\r
2654 String s = st.nextToken();
\r
2655 if (s.startsWith("#"))
\r
2657 // the line is a comment (as per the RFC 2483)
\r
2661 java.net.URI uri = new java.net.URI(s);
\r
2662 java.io.File file = new java.io.File(uri);
\r
2667 catch (Exception e)
\r
2669 e.printStackTrace();
\r
2672 if (files != null)
\r
2676 boolean isAnnotation = false;
\r
2678 for (int i = 0; i < files.size(); i++)
\r
2680 String file = files.get(i).toString();
\r
2682 isAnnotation = new AnnotationReader().readAnnotationFile(viewport.alignment, file);
\r
2684 if( !isAnnotation )
\r
2686 boolean isGroupsFile = parseGroupsFile(file);
\r
2687 if (!isGroupsFile)
\r
2689 String protocol = "File";
\r
2690 String format = jalview.io.IdentifyFile.Identify(file, protocol);
\r
2691 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol, format);
\r
2693 FastaFile ff = new FastaFile();
\r
2694 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2695 c.setContents(new StringSelection(ff.print(sequences)), this);
\r
2697 this.paste(false);
\r
2705 int height = alignPanel.annotationPanel.adjustPanelHeight();
\r
2706 alignPanel.annotationScroller.setPreferredSize(
\r
2707 new Dimension(alignPanel.annotationScroller.getWidth(),
\r
2710 alignPanel.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
\r
2711 alignPanel.annotationSpaceFillerHolder.getWidth(),
\r
2714 alignPanel.addNotify();
\r
2717 catch (Exception ex)
\r
2719 ex.printStackTrace();
\r