2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Softwarechang
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
19 package jalview.gui;
\r
21 import java.beans.*;
\r
26 import java.awt.datatransfer.*;
\r
27 import java.awt.event.*;
\r
28 import java.awt.print.*;
\r
29 import javax.swing.*;
\r
31 import jalview.analysis.*;
\r
32 import jalview.datamodel.*;
\r
33 import jalview.io.*;
\r
34 import jalview.jbgui.*;
\r
35 import jalview.schemes.*;
\r
36 import jalview.ws.*;
\r
37 import java.awt.dnd.*;
\r
44 * @version $Revision$
\r
46 public class AlignFrame
\r
47 extends GAlignFrame implements ClipboardOwner, DropTargetListener
\r
49 /** DOCUMENT ME!! */
\r
50 public static final int NEW_WINDOW_WIDTH = 700;
\r
52 /** DOCUMENT ME!! */
\r
53 public static final int NEW_WINDOW_HEIGHT = 500;
\r
54 AlignmentPanel alignPanel;
\r
55 AlignViewport viewport;
\r
57 Vector viewports = new Vector();
\r
58 Vector alignPanels = new Vector();
\r
60 /** DOCUMENT ME!! */
\r
61 public String currentFileFormat = null;
\r
62 Stack historyList = new Stack();
\r
63 Stack redoList = new Stack();
\r
64 private int treeCount = 0;
\r
68 * Creates a new AlignFrame object.
\r
70 * @param al DOCUMENT ME!
\r
72 public AlignFrame(AlignmentI al)
\r
74 viewport = new AlignViewport(al);
\r
75 viewports.add(viewport);
\r
77 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
\r
79 if(viewport.vconsensus==null)
\r
81 //Out of memory calculating consensus.
\r
82 BLOSUM62Colour.setEnabled(false);
\r
83 PIDColour.setEnabled(false);
\r
84 conservationMenuItem.setEnabled(false);
\r
85 modifyConservation.setEnabled(false);
\r
86 abovePIDThreshold.setEnabled(false);
\r
87 modifyPID.setEnabled(false);
\r
90 alignPanel = new AlignmentPanel(this, viewport);
\r
91 alignPanels.add(alignPanel);
\r
93 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
\r
95 if(sortby.equals("Id"))
\r
96 sortIDMenuItem_actionPerformed(null);
\r
97 else if(sortby.equals("Pairwise Identity"))
\r
98 sortPairwiseMenuItem_actionPerformed(null);
\r
100 // remove(tabbedPane);
\r
101 getContentPane().add(alignPanel, BorderLayout.CENTER);
\r
105 // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
\r
108 /////////////////////////
\r
109 if(al.getDataset()==null)
\r
111 al.setDataset(null);
\r
113 // AlignViewport ds = new AlignViewport(al.getDataset(), true);
\r
114 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
115 // tabbedPane.add("Dataset", dap);
\r
116 // viewports.add(ds);
\r
117 // alignPanels.add(dap);
\r
118 /////////////////////////
\r
121 viewport.addPropertyChangeListener(new PropertyChangeListener()
\r
123 public void propertyChange(PropertyChangeEvent evt)
\r
125 if (evt.getPropertyName().equals("alignment"))
\r
127 alignmentChanged();
\r
133 if (Desktop.desktop != null)
\r
135 addServiceListeners();
\r
136 setGUINucleotide(al.isNucleotide());
\r
140 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
141 private void addServiceListeners()
\r
143 final java.beans.PropertyChangeListener thisListener;
\r
144 // Do this once to get current state
\r
145 BuildWebServiceMenu();
\r
146 Desktop.discoverer.addPropertyChangeListener(
\r
147 thisListener = new java.beans.PropertyChangeListener()
\r
149 public void propertyChange(PropertyChangeEvent evt)
\r
151 // System.out.println("Discoverer property change.");
\r
152 if (evt.getPropertyName().equals("services"))
\r
154 // System.out.println("Rebuilding web service menu");
\r
155 BuildWebServiceMenu();
\r
159 addInternalFrameListener(new javax.swing.event.
\r
160 InternalFrameAdapter()
\r
162 public void internalFrameClosed(
\r
163 javax.swing.event.InternalFrameEvent evt)
\r
165 // System.out.println("deregistering discoverer listener");
\r
166 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
167 closeMenuItem_actionPerformed(null);
\r
174 public void setGUINucleotide(boolean nucleotide)
\r
176 showTranslation.setVisible( nucleotide );
\r
177 //sequenceFeatures.setVisible(!nucleotide );
\r
178 //featureSettings.setVisible( !nucleotide );
\r
179 conservationMenuItem.setVisible( !nucleotide );
\r
180 modifyConservation.setVisible( !nucleotide );
\r
182 //Remember AlignFrame always starts as protein
\r
185 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
191 Added so Castor Mapping file can obtain Jalview Version
\r
193 public String getVersion()
\r
195 return jalview.bin.Cache.getProperty("VERSION");
\r
199 public void fetchSequence_actionPerformed(ActionEvent e)
\r
201 new SequenceFetcher(this);
\r
206 * @param e DOCUMENT ME!
\r
208 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
210 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
215 "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",
\r
220 "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"
\r
221 }, currentFileFormat);
\r
223 chooser.setAcceptAllFileFilterUsed(false);
\r
224 chooser.setFileView(new JalviewFileView());
\r
225 chooser.setDialogTitle("Save Alignment to file");
\r
226 chooser.setToolTipText("Save");
\r
228 int value = chooser.showSaveDialog(this);
\r
230 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
232 currentFileFormat = chooser.getSelectedFormat();
\r
234 if (currentFileFormat == null)
\r
236 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
237 "You must select a file format before saving!",
\r
238 "File format not specified",
\r
239 JOptionPane.WARNING_MESSAGE);
\r
240 value = chooser.showSaveDialog(this);
\r
244 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
245 currentFileFormat);
\r
247 String choice = chooser.getSelectedFile().getPath();
\r
248 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
250 saveAlignment(choice, currentFileFormat);
\r
254 public boolean saveAlignment(String file, String format)
\r
256 if (format.equalsIgnoreCase("Jalview"))
\r
258 String shortName = title;
\r
260 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
262 shortName = shortName.substring(shortName.lastIndexOf(
\r
263 java.io.File.separatorChar) + 1);
\r
266 Jalview2XML.SaveAlignment(this, file, shortName);
\r
268 // USE Jalview2XML to save this file
\r
273 String output = new FormatAdapter().formatSequences(format,
\r
274 viewport.getAlignment().
\r
276 if (output == null)
\r
283 java.io.PrintWriter out = new java.io.PrintWriter(
\r
284 new java.io.FileWriter(file));
\r
290 catch (Exception ex)
\r
292 ex.printStackTrace();
\r
301 * @param e DOCUMENT ME!
\r
303 protected void outputText_actionPerformed(ActionEvent e)
\r
305 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
306 Desktop.addInternalFrame(cap,
\r
307 "Alignment output - " + e.getActionCommand(), 600,
\r
309 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
310 viewport.getAlignment().
\r
317 * @param e DOCUMENT ME!
\r
319 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
321 new HTMLOutput(viewport,
\r
322 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
323 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
326 public void createImageMap(File file, String image)
\r
328 alignPanel.makePNGImageMap(file, image);
\r
334 * @param e DOCUMENT ME!
\r
336 public void createPNG(File f)
\r
338 alignPanel.makePNG(f);
\r
344 * @param e DOCUMENT ME!
\r
346 public void createEPS(File f)
\r
348 alignPanel.makeEPS(f);
\r
354 * @param e DOCUMENT ME!
\r
356 public void printMenuItem_actionPerformed(ActionEvent e)
\r
358 //Putting in a thread avoids Swing painting problems
\r
359 PrintThread thread = new PrintThread();
\r
366 * @param e DOCUMENT ME!
\r
368 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
372 PaintRefresher.components.remove(viewport.alignment);
\r
373 this.setClosed(true);
\r
375 catch (Exception ex)
\r
383 void updateEditMenuBar()
\r
385 if (historyList.size() > 0)
\r
387 undoMenuItem.setEnabled(true);
\r
389 HistoryItem hi = (HistoryItem) historyList.peek();
\r
390 undoMenuItem.setText("Undo " + hi.getDescription());
\r
394 undoMenuItem.setEnabled(false);
\r
395 undoMenuItem.setText("Undo");
\r
398 if (redoList.size() > 0)
\r
400 redoMenuItem.setEnabled(true);
\r
402 HistoryItem hi = (HistoryItem) redoList.peek();
\r
403 redoMenuItem.setText("Redo " + hi.getDescription());
\r
407 redoMenuItem.setEnabled(false);
\r
408 redoMenuItem.setText("Redo");
\r
415 * @param hi DOCUMENT ME!
\r
417 public void addHistoryItem(HistoryItem hi)
\r
419 historyList.push(hi);
\r
420 updateEditMenuBar();
\r
426 * @param e DOCUMENT ME!
\r
428 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
430 HistoryItem hi = (HistoryItem) historyList.pop();
\r
431 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
432 HistoryItem.HIDE));
\r
433 restoreHistoryItem(hi);
\r
434 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
440 * @param e DOCUMENT ME!
\r
442 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
444 HistoryItem hi = (HistoryItem) redoList.pop();
\r
445 restoreHistoryItem(hi);
\r
446 updateEditMenuBar();
\r
447 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
450 // used by undo and redo
\r
451 void restoreHistoryItem(HistoryItem hi)
\r
453 if (hi.getType() == HistoryItem.SORT)
\r
455 for (int i = 0; i < hi.getSequences().size(); i++)
\r
457 viewport.alignment.getSequences().setElementAt(hi.getSequences()
\r
464 for (int i = 0; i < hi.getSequences().size(); i++)
\r
466 SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);
\r
468 if (restore.getLength() == 0)
\r
470 restore.setSequence(hi.getHidden().elementAt(i).toString());
\r
471 viewport.alignment.getSequences().insertElementAt(restore,
\r
472 hi.getAlignIndex(i));
\r
476 restore.setSequence(hi.getHidden().elementAt(i).toString());
\r
480 if (hi.getType() == HistoryItem.PASTE)
\r
482 for (int i = viewport.alignment.getHeight() - 1;
\r
483 i > (hi.getSequences().size() - 1); i--)
\r
485 viewport.alignment.deleteSequence(i);
\r
490 updateEditMenuBar();
\r
492 viewport.firePropertyChange("alignment", null,
\r
493 viewport.getAlignment().getSequences());
\r
499 * @param up DOCUMENT ME!
\r
501 public void moveSelectedSequences(boolean up)
\r
503 SequenceGroup sg = viewport.getSelectionGroup();
\r
512 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
514 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
516 if (!sg.sequences.contains(seq))
\r
521 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
523 if (sg.sequences.contains(temp))
\r
528 viewport.alignment.getSequences().setElementAt(temp, i);
\r
529 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
534 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
536 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
538 if (!sg.sequences.contains(seq))
\r
543 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
545 if (sg.sequences.contains(temp))
\r
550 viewport.alignment.getSequences().setElementAt(temp, i);
\r
551 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
555 alignPanel.repaint();
\r
558 public void lostOwnership(Clipboard clipboard, Transferable contents)
\r
560 Desktop.jalviewClipboard = null;
\r
567 * @param e DOCUMENT ME!
\r
569 protected void copy_actionPerformed(ActionEvent e)
\r
571 if (viewport.getSelectionGroup() == null)
\r
576 SequenceGroup sg = viewport.getSelectionGroup();
\r
578 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
580 Hashtable orderedSeqs = new Hashtable();
\r
581 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
583 for (int i = 0; i < sg.getSize(); i++)
\r
585 SequenceI seq = sg.getSequenceAt(i);
\r
586 int index = viewport.alignment.findIndex(seq);
\r
587 orderedSeqs.put(index + "", seq);
\r
590 int index = 0, startRes, endRes;
\r
593 for (int i = 0; i < sg.getSize(); i++)
\r
595 SequenceI seq = null;
\r
597 while (seq == null)
\r
599 if (orderedSeqs.containsKey(index + ""))
\r
601 seq = (SequenceI) orderedSeqs.get(index + "");
\r
613 //Returns residue following index if gap
\r
614 startRes = seq.findPosition(sg.getStartRes());
\r
617 //Need to find the residue preceeding index if gap
\r
620 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
622 ch = seq.getCharAt(j);
\r
623 if (!jalview.util.Comparison.isGap( (ch)))
\r
631 endRes += seq.getStart() - 1;
\r
634 seqs[i] = new Sequence(seq.getName(),
\r
635 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
638 seqs[i].setDescription(seq.getDescription());
\r
639 seqs[i].setDBRef(seq.getDBRef());
\r
640 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
641 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
645 FastaFile ff = new FastaFile();
\r
646 ff.addJVSuffix( viewport.showJVSuffix );
\r
647 c.setContents(new StringSelection( ff.print(seqs)), this);
\r
648 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
654 * @param e DOCUMENT ME!
\r
656 protected void pasteNew_actionPerformed(ActionEvent e)
\r
664 * @param e DOCUMENT ME!
\r
666 protected void pasteThis_actionPerformed(ActionEvent e)
\r
668 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
669 HistoryItem.PASTE));
\r
676 * @param newAlignment DOCUMENT ME!
\r
678 void paste(boolean newAlignment)
\r
682 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
683 Transferable contents = c.getContents(this);
\r
685 if (contents == null)
\r
690 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
694 String format = IdentifyFile.Identify(str, "Paste");
\r
695 SequenceI[] sequences;
\r
697 if(Desktop.jalviewClipboard!=null)
\r
699 // The clipboard was filled from within Jalview, we must use the sequences
\r
700 // And dataset from the copied alignment
\r
701 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
705 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
711 Alignment alignment = new Alignment(sequences);
\r
713 if(Desktop.jalviewClipboard!=null)
\r
714 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
716 alignment.setDataset( null );
\r
719 AlignFrame af = new AlignFrame(alignment);
\r
720 String newtitle = new String("Copied sequences");
\r
722 if (title.startsWith("Copied sequences"))
\r
728 newtitle = newtitle.concat("- from " + title);
\r
731 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
732 NEW_WINDOW_HEIGHT);
\r
737 for (int i = 0; i < sequences.length; i++)
\r
739 Sequence newseq = new Sequence(sequences[i].getName(),
\r
740 sequences[i].getSequence(), sequences[i].getStart(),
\r
741 sequences[i].getEnd());
\r
742 viewport.alignment.addSequence(newseq);
\r
743 if(sequences[i].getDatasetSequence()==null)
\r
745 ////////////////////////////
\r
746 //Datset needs extension;
\r
747 /////////////////////////////
\r
748 Sequence ds = new Sequence(sequences[i].getName(),
\r
749 AlignSeq.extractGaps("-. ", sequences[i].getSequence()),
\r
750 sequences[i].getStart(),
\r
751 sequences[i].getEnd());
\r
752 newseq.setDatasetSequence(ds);
\r
753 viewport.alignment.getDataset().addSequence(ds);
\r
757 newseq.setDatasetSequence(sequences[i].getDatasetSequence());
\r
758 if(sequences[i].getDatasetSequence().getAnnotation()!=null)
\r
760 for(int aa=0; aa<sequences[i].getDatasetSequence().getAnnotation().length; aa++)
\r
762 viewport.alignment.addAnnotation(sequences[i].getDatasetSequence().getAnnotation()[aa]);
\r
767 viewport.setEndSeq(viewport.alignment.getHeight());
\r
768 viewport.alignment.getWidth();
\r
769 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
772 catch (Exception ex)
\r
774 ex.printStackTrace();
\r
775 System.out.println("Exception whilst pasting: "+ex);
\r
776 // could be anything being pasted in here
\r
785 * @param e DOCUMENT ME!
\r
787 protected void cut_actionPerformed(ActionEvent e)
\r
789 copy_actionPerformed(null);
\r
790 delete_actionPerformed(null);
\r
796 * @param e DOCUMENT ME!
\r
798 protected void delete_actionPerformed(ActionEvent e)
\r
801 if (viewport.getSelectionGroup() == null)
\r
806 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
807 HistoryItem.HIDE));
\r
809 SequenceGroup sg = viewport.getSelectionGroup();
\r
810 boolean allSequences = false;
\r
811 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
813 allSequences = true;
\r
816 for (int i = 0; i < sg.sequences.size(); i++)
\r
818 SequenceI seq = sg.getSequenceAt(i);
\r
819 int index = viewport.getAlignment().findIndex(seq);
\r
820 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
822 // If the cut affects all sequences, remove highlighted columns
\r
825 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
826 sg.getEndRes() + 1);
\r
829 if (seq.getSequence().length() < 1)
\r
831 viewport.getAlignment().deleteSequence(seq);
\r
835 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
839 viewport.setSelectionGroup(null);
\r
840 viewport.alignment.deleteGroup(sg);
\r
842 viewport.firePropertyChange("alignment", null,
\r
843 viewport.getAlignment().getSequences());
\r
847 if (viewport.getAlignment().getHeight() < 1)
\r
851 this.setClosed(true);
\r
853 catch (Exception ex)
\r
862 * @param e DOCUMENT ME!
\r
864 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
866 viewport.alignment.deleteAllGroups();
\r
867 viewport.setSelectionGroup(null);
\r
868 alignPanel.repaint();
\r
874 * @param e DOCUMENT ME!
\r
876 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
878 SequenceGroup sg = new SequenceGroup();
\r
880 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
883 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
886 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
887 viewport.setSelectionGroup(sg);
\r
888 PaintRefresher.Refresh(null, viewport.alignment);
\r
894 * @param e DOCUMENT ME!
\r
896 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
898 viewport.setSelectionGroup(null);
\r
899 viewport.getColumnSelection().clear();
\r
900 viewport.setSelectionGroup(null);
\r
901 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
902 alignPanel.idPanel.idCanvas.searchResults = null;
\r
903 alignPanel.annotationPanel.activeRes = null;
\r
904 PaintRefresher.Refresh(null, viewport.alignment);
\r
910 * @param e DOCUMENT ME!
\r
912 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
914 SequenceGroup sg = viewport.getSelectionGroup();
\r
918 selectAllSequenceMenuItem_actionPerformed(null);
\r
923 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
926 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
929 PaintRefresher.Refresh(null, viewport.alignment);
\r
935 * @param e DOCUMENT ME!
\r
937 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
939 ColumnSelection colSel = viewport.getColumnSelection();
\r
941 if (colSel.size() > 0)
\r
943 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
944 HistoryItem.HIDE));
\r
946 int min = colSel.getMin();
\r
947 viewport.getAlignment().trimLeft(min);
\r
948 colSel.compensateForEdit(0, min);
\r
950 if (viewport.getSelectionGroup() != null)
\r
952 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
955 Vector groups = viewport.alignment.getGroups();
\r
957 for (int i = 0; i < groups.size(); i++)
\r
959 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
961 if (!sg.adjustForRemoveLeft(min))
\r
963 viewport.alignment.deleteGroup(sg);
\r
967 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
974 * @param e DOCUMENT ME!
\r
976 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
978 ColumnSelection colSel = viewport.getColumnSelection();
\r
980 if (colSel.size() > 0)
\r
982 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
983 HistoryItem.HIDE));
\r
985 int max = colSel.getMax();
\r
986 viewport.getAlignment().trimRight(max);
\r
988 if (viewport.getSelectionGroup() != null)
\r
990 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
993 Vector groups = viewport.alignment.getGroups();
\r
995 for (int i = 0; i < groups.size(); i++)
\r
997 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
999 if (!sg.adjustForRemoveRight(max))
\r
1001 viewport.alignment.deleteGroup(sg);
\r
1005 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1012 * @param e DOCUMENT ME!
\r
1014 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1016 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1017 viewport.alignment, HistoryItem.HIDE));
\r
1019 //This is to maintain viewport position on first residue
\r
1020 //of first sequence
\r
1021 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1022 int startRes = seq.findPosition(viewport.startRes);
\r
1024 viewport.getAlignment().removeGaps();
\r
1026 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1028 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1034 * @param e DOCUMENT ME!
\r
1036 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1038 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1039 HistoryItem.HIDE));
\r
1041 //This is to maintain viewport position on first residue
\r
1042 //of first sequence
\r
1043 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1044 int startRes = seq.findPosition(viewport.startRes);
\r
1047 SequenceI current;
\r
1050 Vector seqs = null;
\r
1053 int end = viewport.alignment.getWidth();
\r
1055 if (viewport.getSelectionGroup() != null
\r
1056 && viewport.getSelectionGroup().sequences != null
\r
1057 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1059 seqs = viewport.getSelectionGroup().sequences;
\r
1060 start = viewport.getSelectionGroup().getStartRes();
\r
1061 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1065 seqs = viewport.alignment.getSequences();
\r
1068 for (int i = 0; i < seqs.size(); i++)
\r
1070 current = (SequenceI) seqs.elementAt(i);
\r
1071 jSize = current.getLength();
\r
1073 // Removing a range is much quicker than removing gaps
\r
1074 // one by one for long sequences
\r
1076 int rangeStart=-1, rangeEnd=-1;
\r
1080 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1082 if(rangeStart==-1)
\r
1097 current.deleteChars(rangeStart, rangeEnd);
\r
1098 j-=rangeEnd-rangeStart;
\r
1099 jSize-=rangeEnd-rangeStart;
\r
1107 while (j < end && j < jSize);
\r
1110 current.deleteChars(rangeStart, rangeEnd);
\r
1114 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1116 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1119 public void alignmentChanged()
\r
1121 if(viewport.vconsensus!=null)
\r
1123 viewport.updateConsensus();
\r
1124 viewport.updateConservation();
\r
1126 resetAllColourSchemes();
\r
1127 if(alignPanel.overviewPanel!=null)
\r
1128 alignPanel.overviewPanel.updateOverviewImage();
\r
1130 viewport.alignment.adjustSequenceAnnotations();
\r
1132 alignPanel.repaint();
\r
1135 void resetAllColourSchemes()
\r
1137 ColourSchemeI cs = viewport.globalColourScheme;
\r
1140 if (cs instanceof ClustalxColourScheme)
\r
1142 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1143 resetClustalX(viewport.alignment.getSequences(),
\r
1144 viewport.alignment.getWidth());
\r
1147 cs.setConsensus(viewport.vconsensus);
\r
1148 if (cs.conservationApplied())
\r
1150 Alignment al = (Alignment) viewport.alignment;
\r
1151 Conservation c = new Conservation("All",
\r
1152 ResidueProperties.propHash, 3,
\r
1153 al.getSequences(), 0,
\r
1154 al.getWidth() - 1);
\r
1156 c.verdict(false, viewport.ConsPercGaps);
\r
1158 cs.setConservation(c);
\r
1162 int s, sSize = viewport.alignment.getGroups().size();
\r
1163 for(s=0; s<sSize; s++)
\r
1165 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1166 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1168 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1170 sg.recalcConservation();
\r
1177 * @param e DOCUMENT ME!
\r
1179 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1181 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1182 HistoryItem.HIDE));
\r
1183 if (viewport.getAlignment().padGaps())
\r
1184 alignmentChanged();
\r
1190 * @param e DOCUMENT ME!
\r
1192 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1194 JInternalFrame frame = new JInternalFrame();
\r
1195 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1196 frame.setContentPane(finder);
\r
1197 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1198 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1204 * @param e DOCUMENT ME!
\r
1206 public void font_actionPerformed(ActionEvent e)
\r
1208 new FontChooser(alignPanel);
\r
1211 public void smoothFont_actionPerformed(ActionEvent e)
\r
1213 viewport.antiAlias = smoothFont.isSelected();
\r
1214 alignPanel.annotationPanel.image = null;
\r
1215 alignPanel.repaint();
\r
1222 * @param e DOCUMENT ME!
\r
1224 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1226 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1228 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1229 alignPanel.repaint();
\r
1236 * @param e DOCUMENT ME!
\r
1238 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1240 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1241 alignPanel.repaint();
\r
1247 * @param e DOCUMENT ME!
\r
1249 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1251 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1252 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1253 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1254 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1255 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1256 alignPanel.repaint();
\r
1262 * @param e DOCUMENT ME!
\r
1264 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1266 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1267 alignPanel.repaint();
\r
1273 * @param e DOCUMENT ME!
\r
1275 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1277 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1278 alignPanel.repaint();
\r
1284 * @param e DOCUMENT ME!
\r
1286 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1288 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1289 alignPanel.repaint();
\r
1295 * @param e DOCUMENT ME!
\r
1297 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1299 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1300 alignPanel.repaint();
\r
1306 * @param e DOCUMENT ME!
\r
1308 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1310 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1311 alignPanel.repaint();
\r
1317 * @param e DOCUMENT ME!
\r
1319 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1321 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1322 alignPanel.repaint();
\r
1325 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1327 if (!viewport.alignment.isNucleotide())
\r
1329 new SequenceFeatureFetcher(viewport.
\r
1332 viewport.showSequenceFeatures(true);
\r
1333 showSeqFeatures.setSelected(true);
\r
1338 public void featureSettings_actionPerformed(ActionEvent e)
\r
1340 new FeatureSettings(viewport, alignPanel);
\r
1346 * @param evt DOCUMENT ME!
\r
1348 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1350 viewport.showSequenceFeatures(showSeqFeatures.isSelected());
\r
1351 alignPanel.repaint();
\r
1357 * @param e DOCUMENT ME!
\r
1359 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1361 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1362 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1368 * @param e DOCUMENT ME!
\r
1370 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1372 if (alignPanel.overviewPanel != null)
\r
1377 JInternalFrame frame = new JInternalFrame();
\r
1378 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1379 frame.setContentPane(overview);
\r
1380 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1381 frame.getWidth(), frame.getHeight());
\r
1383 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1384 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1386 public void internalFrameClosed(
\r
1387 javax.swing.event.InternalFrameEvent evt)
\r
1389 alignPanel.setOverviewPanel(null);
\r
1394 alignPanel.setOverviewPanel(overview);
\r
1400 * @param e DOCUMENT ME!
\r
1402 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1404 changeColour(null);
\r
1410 * @param e DOCUMENT ME!
\r
1412 public void clustalColour_actionPerformed(ActionEvent e)
\r
1414 changeColour(new ClustalxColourScheme(
\r
1415 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1421 * @param e DOCUMENT ME!
\r
1423 public void zappoColour_actionPerformed(ActionEvent e)
\r
1425 changeColour(new ZappoColourScheme());
\r
1431 * @param e DOCUMENT ME!
\r
1433 public void taylorColour_actionPerformed(ActionEvent e)
\r
1435 changeColour(new TaylorColourScheme());
\r
1441 * @param e DOCUMENT ME!
\r
1443 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1445 changeColour(new HydrophobicColourScheme());
\r
1451 * @param e DOCUMENT ME!
\r
1453 public void helixColour_actionPerformed(ActionEvent e)
\r
1455 changeColour(new HelixColourScheme());
\r
1461 * @param e DOCUMENT ME!
\r
1463 public void strandColour_actionPerformed(ActionEvent e)
\r
1465 changeColour(new StrandColourScheme());
\r
1471 * @param e DOCUMENT ME!
\r
1473 public void turnColour_actionPerformed(ActionEvent e)
\r
1475 changeColour(new TurnColourScheme());
\r
1481 * @param e DOCUMENT ME!
\r
1483 public void buriedColour_actionPerformed(ActionEvent e)
\r
1485 changeColour(new BuriedColourScheme());
\r
1491 * @param e DOCUMENT ME!
\r
1493 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1495 changeColour(new NucleotideColourScheme());
\r
1498 public void annotationColour_actionPerformed(ActionEvent e)
\r
1500 new AnnotationColourChooser(viewport, alignPanel);
\r
1507 * @param e DOCUMENT ME!
\r
1509 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1511 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1517 * @param cs DOCUMENT ME!
\r
1519 void changeColour(ColourSchemeI cs)
\r
1521 int threshold = 0;
\r
1525 if (viewport.getAbovePIDThreshold())
\r
1527 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1530 cs.setThreshold(threshold,
\r
1531 viewport.getIgnoreGapsConsensus());
\r
1533 viewport.setGlobalColourScheme(cs);
\r
1537 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1540 if (viewport.getConservationSelected())
\r
1543 Alignment al = (Alignment) viewport.alignment;
\r
1544 Conservation c = new Conservation("All",
\r
1545 ResidueProperties.propHash, 3,
\r
1546 al.getSequences(), 0,
\r
1547 al.getWidth() - 1);
\r
1550 c.verdict(false, viewport.ConsPercGaps);
\r
1552 cs.setConservation(c);
\r
1554 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1559 cs.setConservation(null);
\r
1562 cs.setConsensus(viewport.vconsensus);
\r
1565 viewport.setGlobalColourScheme(cs);
\r
1567 if (viewport.getColourAppliesToAllGroups())
\r
1569 Vector groups = viewport.alignment.getGroups();
\r
1571 for (int i = 0; i < groups.size(); i++)
\r
1573 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1581 if (cs instanceof ClustalxColourScheme)
\r
1583 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1585 else if (cs instanceof UserColourScheme)
\r
1587 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1593 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1595 catch (Exception ex)
\r
1600 if (viewport.getAbovePIDThreshold()
\r
1601 || cs instanceof PIDColourScheme
\r
1602 || cs instanceof Blosum62ColourScheme)
\r
1604 sg.cs.setThreshold(threshold,
\r
1605 viewport.getIgnoreGapsConsensus());
\r
1607 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1611 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1614 if (viewport.getConservationSelected())
\r
1616 Conservation c = new Conservation("Group",
\r
1617 ResidueProperties.propHash, 3,
\r
1619 viewport.alignment.getWidth() - 1);
\r
1621 c.verdict(false, viewport.ConsPercGaps);
\r
1622 sg.cs.setConservation(c);
\r
1625 sg.cs.setConservation(null);
\r
1629 if (alignPanel.getOverviewPanel() != null)
\r
1631 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1634 alignPanel.repaint();
\r
1640 * @param e DOCUMENT ME!
\r
1642 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1644 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1646 SliderPanel.setPIDSliderSource(alignPanel,
\r
1647 viewport.getGlobalColourScheme(),
\r
1649 SliderPanel.showPIDSlider();
\r
1656 * @param e DOCUMENT ME!
\r
1658 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1660 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1662 SliderPanel.setConservationSlider(alignPanel,
\r
1663 viewport.globalColourScheme,
\r
1665 SliderPanel.showConservationSlider();
\r
1672 * @param e DOCUMENT ME!
\r
1674 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1676 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1678 viewport.setAbovePIDThreshold(false);
\r
1679 abovePIDThreshold.setSelected(false);
\r
1681 changeColour(viewport.getGlobalColourScheme());
\r
1683 modifyConservation_actionPerformed(null);
\r
1689 * @param e DOCUMENT ME!
\r
1691 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1693 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1695 conservationMenuItem.setSelected(false);
\r
1696 viewport.setConservationSelected(false);
\r
1698 changeColour(viewport.getGlobalColourScheme());
\r
1700 modifyPID_actionPerformed(null);
\r
1706 * @param e DOCUMENT ME!
\r
1708 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1710 if (e.getActionCommand().equals("User Defined..."))
\r
1712 new UserDefinedColours(alignPanel, null);
\r
1716 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1717 getUserColourSchemes().get(e.getActionCommand());
\r
1719 changeColour(udc);
\r
1723 public void updateUserColourMenu()
\r
1726 Component[] menuItems = colourMenu.getMenuComponents();
\r
1727 int i, iSize = menuItems.length;
\r
1728 for (i = 0; i < iSize; i++)
\r
1730 if (menuItems[i].getName() != null &&
\r
1731 menuItems[i].getName().equals("USER_DEFINED"))
\r
1733 colourMenu.remove(menuItems[i]);
\r
1737 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1739 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1740 getUserColourSchemes().keys();
\r
1742 while (userColours.hasMoreElements())
\r
1744 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1745 nextElement().toString());
\r
1746 radioItem.setName("USER_DEFINED");
\r
1747 radioItem.addMouseListener(new MouseAdapter()
\r
1749 public void mousePressed(MouseEvent evt)
\r
1751 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1753 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1755 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1756 "Remove from default list?",
\r
1757 "Remove user defined colour",
\r
1758 JOptionPane.YES_NO_OPTION);
\r
1759 if(option == JOptionPane.YES_OPTION)
\r
1761 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1762 colourMenu.remove(radioItem);
\r
1765 radioItem.addActionListener(new ActionListener()
\r
1767 public void actionPerformed(ActionEvent evt)
\r
1769 userDefinedColour_actionPerformed(evt);
\r
1775 radioItem.addActionListener(new ActionListener()
\r
1777 public void actionPerformed(ActionEvent evt)
\r
1779 userDefinedColour_actionPerformed(evt);
\r
1783 colourMenu.insert(radioItem, 15);
\r
1784 colours.add(radioItem);
\r
1792 * @param e DOCUMENT ME!
\r
1794 public void PIDColour_actionPerformed(ActionEvent e)
\r
1796 changeColour(new PIDColourScheme());
\r
1802 * @param e DOCUMENT ME!
\r
1804 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1806 changeColour(new Blosum62ColourScheme());
\r
1812 * @param e DOCUMENT ME!
\r
1814 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1816 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1817 HistoryItem.SORT));
\r
1818 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1819 viewport.getAlignment().getSequenceAt(0));
\r
1820 alignPanel.repaint();
\r
1826 * @param e DOCUMENT ME!
\r
1828 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1830 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1831 HistoryItem.SORT));
\r
1832 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1833 alignPanel.repaint();
\r
1839 * @param e DOCUMENT ME!
\r
1841 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1843 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1844 HistoryItem.SORT));
\r
1846 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1847 alignPanel.repaint();
\r
1853 * @param e DOCUMENT ME!
\r
1855 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1857 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1858 JInternalFrame frame = new JInternalFrame();
\r
1859 frame.setContentPane(sp);
\r
1860 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1867 * @param e DOCUMENT ME!
\r
1869 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1871 if ( (viewport.getSelectionGroup() == null) ||
\r
1872 (viewport.getSelectionGroup().getSize() < 2))
\r
1874 JOptionPane.showInternalMessageDialog(this,
\r
1875 "You must select at least 2 sequences.",
\r
1876 "Invalid Selection",
\r
1877 JOptionPane.WARNING_MESSAGE);
\r
1881 JInternalFrame frame = new JInternalFrame();
\r
1882 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1883 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1890 * @param e DOCUMENT ME!
\r
1892 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1894 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1895 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1896 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1897 (viewport.getAlignment().getHeight() < 4))
\r
1899 JOptionPane.showInternalMessageDialog(this,
\r
1900 "Principal component analysis must take\n" +
\r
1901 "at least 4 input sequences.",
\r
1902 "Sequence selection insufficient",
\r
1903 JOptionPane.WARNING_MESSAGE);
\r
1908 new PCAPanel(viewport);
\r
1914 * @param e DOCUMENT ME!
\r
1916 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1918 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1924 * @param e DOCUMENT ME!
\r
1926 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1928 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1934 * @param e DOCUMENT ME!
\r
1936 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1938 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1944 * @param e DOCUMENT ME!
\r
1946 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1948 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1954 * @param type DOCUMENT ME!
\r
1955 * @param pwType DOCUMENT ME!
\r
1956 * @param title DOCUMENT ME!
\r
1958 void NewTreePanel(String type, String pwType, String title)
\r
1960 final TreePanel tp;
\r
1962 if ( (viewport.getSelectionGroup() != null) &&
\r
1963 (viewport.getSelectionGroup().getSize() > 3))
\r
1966 SequenceGroup sg = viewport.getSelectionGroup();
\r
1968 /* Decide if the selection is a column region */
\r
1969 while (s < sg.sequences.size())
\r
1971 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
1974 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1975 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
1976 "Try using the Pad function in the edit menu,\n" +
\r
1977 "or one of the multiple sequence alignment web services.",
\r
1978 "Sequences in selection are not aligned",
\r
1979 JOptionPane.WARNING_MESSAGE);
\r
1985 title = title + " on region";
\r
1986 tp = new TreePanel(viewport,
\r
1987 viewport.getSelectionGroup().sequences, type, pwType,
\r
1988 sg.getStartRes(), sg.getEndRes());
\r
1992 //are the sequences aligned?
\r
1993 if (!viewport.alignment.isAligned())
\r
1995 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1996 "The sequences must be aligned before creating a tree.\n" +
\r
1997 "Try using the Pad function in the edit menu,\n" +
\r
1998 "or one of the multiple sequence alignment web services.",
\r
1999 "Sequences not aligned",
\r
2000 JOptionPane.WARNING_MESSAGE);
\r
2005 tp = new TreePanel(viewport,
\r
2006 viewport.getAlignment().getSequences(), type, pwType,
\r
2008 viewport.alignment.getWidth());
\r
2011 addTreeMenuItem(tp, title);
\r
2012 viewport.setCurrentTree(tp.getTree());
\r
2014 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2020 * @param title DOCUMENT ME!
\r
2021 * @param order DOCUMENT ME!
\r
2023 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2025 final JMenuItem item = new JMenuItem("by " + title);
\r
2027 item.addActionListener(new java.awt.event.ActionListener()
\r
2029 public void actionPerformed(ActionEvent e)
\r
2031 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2032 HistoryItem.SORT));
\r
2034 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2035 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2036 alignPanel.repaint();
\r
2042 * Maintain the Order by->Displayed Tree menu.
\r
2043 * Creates a new menu item for a TreePanel with an appropriate
\r
2044 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2045 * to remove the menu item when the treePanel is closed, and adjust
\r
2046 * the tree leaf to sequence mapping when the alignment is modified.
\r
2047 * @param treePanel Displayed tree window.
\r
2048 * @param title SortBy menu item title.
\r
2050 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2052 final JMenuItem item = new JMenuItem(title);
\r
2056 if (treeCount == 1)
\r
2058 sort.add(sortByTreeMenu);
\r
2061 sortByTreeMenu.add(item);
\r
2062 item.addActionListener(new java.awt.event.ActionListener()
\r
2064 public void actionPerformed(ActionEvent e)
\r
2066 addHistoryItem(new HistoryItem("Tree Sort",
\r
2067 viewport.alignment, HistoryItem.SORT));
\r
2068 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2069 treePanel.getTree());
\r
2070 alignPanel.repaint();
\r
2074 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2075 InternalFrameAdapter()
\r
2077 public void internalFrameClosed(
\r
2078 javax.swing.event.InternalFrameEvent evt)
\r
2081 sortByTreeMenu.remove(item);
\r
2083 if (treeCount == 0)
\r
2085 sort.remove(sortByTreeMenu);
\r
2093 * Work out whether the whole set of sequences
\r
2094 * or just the selected set will be submitted for multiple alignment.
\r
2097 private SequenceI[] gatherSequencesForAlignment()
\r
2099 // Now, check we have enough sequences
\r
2100 SequenceI[] msa = null;
\r
2102 if ( (viewport.getSelectionGroup() != null) &&
\r
2103 (viewport.getSelectionGroup().getSize() > 1))
\r
2105 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2106 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2108 msa = new SequenceI[sz = seqs.getSize()];
\r
2110 for (int i = 0; i < sz; i++)
\r
2112 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2117 Vector seqs = viewport.getAlignment().getSequences();
\r
2119 if (seqs.size() > 1)
\r
2121 msa = new SequenceI[seqs.size()];
\r
2123 for (int i = 0; i < seqs.size(); i++)
\r
2125 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2133 * Decides what is submitted to a secondary structure prediction service,
\r
2134 * the currently selected sequence, or the currently selected alignment
\r
2135 * (where the first sequence in the set is the one that the prediction
\r
2138 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2140 SequenceI seq = null;
\r
2141 SequenceI[] msa = null;
\r
2143 if ( (viewport.getSelectionGroup() != null) &&
\r
2144 (viewport.getSelectionGroup().getSize() > 0))
\r
2146 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2147 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2149 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2151 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2156 msa = new SequenceI[sz = seqs.getSize()];
\r
2158 for (int i = 0; i < sz; i++)
\r
2160 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2166 Vector seqs = viewport.getAlignment().getSequences();
\r
2168 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2170 seq = (SequenceI) seqs.elementAt(0);
\r
2174 msa = new SequenceI[seqs.size()];
\r
2176 for (int i = 0; i < seqs.size(); i++)
\r
2178 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2190 return new SequenceI[]
\r
2200 * @param e DOCUMENT ME!
\r
2202 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2204 // Pick the tree file
\r
2205 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2207 "LAST_DIRECTORY"));
\r
2208 chooser.setFileView(new JalviewFileView());
\r
2209 chooser.setDialogTitle("Select a newick-like tree file");
\r
2210 chooser.setToolTipText("Load a tree file");
\r
2212 int value = chooser.showOpenDialog(null);
\r
2214 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2216 String choice = chooser.getSelectedFile().getPath();
\r
2217 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2221 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2223 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2225 catch (Exception ex)
\r
2227 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2228 "Problem reading tree file",
\r
2230 JOptionPane.WARNING_MESSAGE);
\r
2231 ex.printStackTrace();
\r
2237 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2239 return ShowNewickTree(nf,title,600,500,4,5);
\r
2244 * @param nf DOCUMENT ME!
\r
2245 * @param title DOCUMENT ME!
\r
2247 * @return DOCUMENT ME!
\r
2249 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2251 TreePanel tp = null;
\r
2257 if (nf.getTree() != null)
\r
2259 tp = new TreePanel(viewport,
\r
2260 viewport.getAlignment().getSequences(), nf,
\r
2267 tp.setLocation(x,y);
\r
2270 Desktop.addInternalFrame(tp, title, w, h);
\r
2271 addTreeMenuItem(tp, title);
\r
2274 catch (Exception ex)
\r
2276 ex.printStackTrace();
\r
2287 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2288 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2289 printJob.setPrintable(alignPanel, pf);
\r
2291 if (printJob.printDialog())
\r
2297 catch (Exception PrintException)
\r
2299 PrintException.printStackTrace();
\r
2306 * Generates menu items and listener event actions for web service clients
\r
2309 public void BuildWebServiceMenu()
\r
2311 if ( (Discoverer.services != null)
\r
2312 && (Discoverer.services.size() > 0))
\r
2314 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2315 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2316 Vector wsmenu = new Vector();
\r
2317 if (msaws != null)
\r
2319 // Add any Multiple Sequence Alignment Services
\r
2320 final JMenu msawsmenu = new JMenu("Alignment");
\r
2321 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2323 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2325 final JMenuItem method = new JMenuItem(sh.getName());
\r
2326 method.addActionListener(new ActionListener()
\r
2328 public void actionPerformed(ActionEvent e)
\r
2330 SequenceI[] msa = gatherSequencesForAlignment();
\r
2331 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2332 false, true, viewport.getAlignment().getDataset());
\r
2337 msawsmenu.add(method);
\r
2338 // Deal with services that we know accept partial alignments.
\r
2339 if (sh.getName().indexOf("lustal") > -1)
\r
2341 // We know that ClustalWS can accept partial alignments for refinement.
\r
2342 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2343 methodR.addActionListener(new ActionListener()
\r
2345 public void actionPerformed(ActionEvent e)
\r
2347 SequenceI[] msa = gatherSequencesForAlignment();
\r
2348 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2349 true, true, viewport.getAlignment().getDataset());
\r
2354 msawsmenu.add(methodR);
\r
2358 wsmenu.add(msawsmenu);
\r
2360 if (secstrpr != null)
\r
2362 // Add any secondary structure prediction services
\r
2363 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2364 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2366 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2368 final JMenuItem method = new JMenuItem(sh.getName());
\r
2369 method.addActionListener(new ActionListener()
\r
2371 public void actionPerformed(ActionEvent e)
\r
2373 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2374 if (msa.length == 1)
\r
2376 // Single Sequence prediction
\r
2377 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2381 if (msa.length > 1)
\r
2383 // Single Sequence prediction
\r
2384 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2390 secstrmenu.add(method);
\r
2392 wsmenu.add(secstrmenu);
\r
2394 this.webService.removeAll();
\r
2395 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2397 webService.add( (JMenu) wsmenu.get(i));
\r
2402 this.webService.removeAll();
\r
2403 this.webService.add(this.webServiceNoServices);
\r
2405 // TODO: add in rediscovery function
\r
2406 // TODO: reduce code redundancy.
\r
2407 // TODO: group services by location as well as function.
\r
2410 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2412 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2413 getProperty("LAST_DIRECTORY"));
\r
2415 chooser.setFileView(new JalviewFileView());
\r
2416 chooser.setDialogTitle("Export to Vamsas file");
\r
2417 chooser.setToolTipText("Export");
\r
2419 int value = chooser.showSaveDialog(this);
\r
2421 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2423 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2424 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2425 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2433 public void showTranslation_actionPerformed(ActionEvent e)
\r
2435 int s, sSize = viewport.alignment.getHeight();
\r
2436 SequenceI [] newSeq = new SequenceI[sSize];
\r
2439 StringBuffer protein;
\r
2441 for(s=0; s<sSize; s++)
\r
2443 protein = new StringBuffer();
\r
2444 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2445 resSize = seq.length();
\r
2446 resSize -= resSize%3;
\r
2448 for(res = 0; res < resSize; res+=3)
\r
2450 String codon = seq.substring(res, res+3);
\r
2451 codon = codon.replace('U', 'T');
\r
2452 String aa = ResidueProperties.codonTranslate(codon);
\r
2454 protein.append(viewport.getGapCharacter());
\r
2455 else if(aa.equals("STOP"))
\r
2456 protein.append("X");
\r
2458 protein.append( aa );
\r
2460 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2464 AlignmentI al = new Alignment(newSeq);
\r
2465 al.setDataset(null);
\r
2468 ////////////////////////////////
\r
2469 // Copy annotations across
\r
2470 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2471 = viewport.alignment.getAlignmentAnnotation();
\r
2473 for (int i = 0; i < annotations.length; i++)
\r
2476 if (annotations[i].label.equals("Quality") ||
\r
2477 annotations[i].label.equals("Conservation") ||
\r
2478 annotations[i].label.equals("Consensus"))
\r
2484 aSize = viewport.alignment.getWidth()/3;
\r
2485 jalview.datamodel.Annotation [] anots =
\r
2486 new jalview.datamodel.Annotation[aSize];
\r
2488 for(a=0; a<viewport.alignment.getWidth(); a++)
\r
2490 if( annotations[i].annotations[a]==null
\r
2491 || annotations[i].annotations[a]==null)
\r
2494 anots[a/3] = new Annotation(
\r
2495 annotations[i].annotations[a].displayCharacter,
\r
2496 annotations[i].annotations[a].description,
\r
2497 annotations[i].annotations[a].secondaryStructure,
\r
2498 annotations[i].annotations[a].value,
\r
2499 annotations[i].annotations[a].colour);
\r
2502 jalview.datamodel.AlignmentAnnotation aa
\r
2503 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2504 annotations[i].description, anots );
\r
2505 al.addAnnotation(aa);
\r
2509 AlignFrame af = new AlignFrame(al);
\r
2510 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2512 NEW_WINDOW_HEIGHT);
\r
2515 // AlignViewport newViewport = new AlignViewport(al);
\r
2516 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2517 // tabbedPane.add("Protein", ap);
\r
2518 // viewports.add(newViewport);
\r
2519 // alignPanels.add(ap);
\r
2522 /////////////////////////
\r
2524 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2525 // ds.setDataset(true);
\r
2526 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2527 // tabbedPane.add("Dataset", dap);
\r
2528 // viewports.add(ds);
\r
2529 // alignPanels.add(dap);
\r
2530 /////////////////////////
\r
2535 /*public void tabSelected()
\r
2537 int index = tabbedPane.getSelectedIndex();
\r
2538 viewport = (AlignViewport)viewports.elementAt(index);
\r
2539 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2545 * @param String DOCUMENT ME!
\r
2547 public boolean parseGroupsFile(String file)
\r
2551 BufferedReader in = new BufferedReader(new FileReader(file));
\r
2552 SequenceI seq = null;
\r
2553 String line, type, desc, token;
\r
2555 int index, start, end;
\r
2556 StringTokenizer st;
\r
2557 SequenceFeature sf;
\r
2559 String featureGroup = null;
\r
2560 while ( (line = in.readLine()) != null)
\r
2563 st = new StringTokenizer(line, "\t");
\r
2564 if (st.countTokens() == 2)
\r
2566 type = st.nextToken();
\r
2567 if (type.equalsIgnoreCase("startgroup"))
\r
2569 featureGroup = st.nextToken();
\r
2571 else if (type.equalsIgnoreCase("endgroup"))
\r
2573 //We should check whether this is the current group,
\r
2574 //but at present theres no way of showing more than 1 group
\r
2576 featureGroup = null;
\r
2580 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2581 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type,
\r
2582 ucs.findColour("A"));
\r
2587 while (st.hasMoreElements())
\r
2589 desc = st.nextToken();
\r
2590 token = st.nextToken();
\r
2591 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2593 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2598 index = Integer.parseInt(st.nextToken());
\r
2601 start = Integer.parseInt(st.nextToken());
\r
2602 end = Integer.parseInt(st.nextToken());
\r
2604 seq = viewport.alignment.getSequenceAt(index);
\r
2606 type = st.nextToken();
\r
2608 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2610 // Probably the old style groups file
\r
2611 UserColourScheme ucs = new UserColourScheme(type);
\r
2612 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2615 sf = new SequenceFeature(type, desc, "", start, end);
\r
2616 sf.setFeatureGroup(featureGroup);
\r
2618 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2622 catch (Exception ex)
\r
2624 ex.printStackTrace();
\r
2625 System.out.println("Error parsing groups file: " + ex);
\r
2629 viewport.showSequenceFeatures = true;
\r
2630 alignPanel.repaint();
\r
2634 public void dragEnter(DropTargetDragEvent evt)
\r
2637 public void dragExit(DropTargetEvent evt)
\r
2640 public void dragOver(DropTargetDragEvent evt)
\r
2643 public void dropActionChanged(DropTargetDragEvent evt)
\r
2646 public void drop(DropTargetDropEvent evt)
\r
2648 Transferable t = evt.getTransferable();
\r
2649 java.util.List files = null;
\r
2653 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2654 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2656 //Works on Windows and MacOSX
\r
2657 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2658 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2660 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2662 // This is used by Unix drag system
\r
2663 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2664 String data = (String) t.getTransferData(uriListFlavor);
\r
2665 files = new java.util.ArrayList(1);
\r
2666 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2669 st.hasMoreTokens(); )
\r
2671 String s = st.nextToken();
\r
2672 if (s.startsWith("#"))
\r
2674 // the line is a comment (as per the RFC 2483)
\r
2678 java.net.URI uri = new java.net.URI(s);
\r
2679 java.io.File file = new java.io.File(uri);
\r
2684 catch (Exception e)
\r
2686 e.printStackTrace();
\r
2689 if (files != null)
\r
2693 boolean isAnnotation = false;
\r
2695 for (int i = 0; i < files.size(); i++)
\r
2697 String file = files.get(i).toString();
\r
2699 isAnnotation = new AnnotationReader().readAnnotationFile(viewport.alignment, file);
\r
2701 if( !isAnnotation )
\r
2703 boolean isGroupsFile = parseGroupsFile(file);
\r
2704 if (!isGroupsFile)
\r
2706 String protocol = "File";
\r
2707 String format = jalview.io.IdentifyFile.Identify(file, protocol);
\r
2708 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol, format);
\r
2710 FastaFile ff = new FastaFile();
\r
2711 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2712 c.setContents(new StringSelection(ff.print(sequences)), this);
\r
2714 this.paste(false);
\r
2722 int height = alignPanel.annotationPanel.adjustPanelHeight();
\r
2723 alignPanel.annotationScroller.setPreferredSize(
\r
2724 new Dimension(alignPanel.annotationScroller.getWidth(),
\r
2727 alignPanel.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
\r
2728 alignPanel.annotationSpaceFillerHolder.getWidth(),
\r
2731 alignPanel.addNotify();
\r
2734 catch (Exception ex)
\r
2736 ex.printStackTrace();
\r