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
211 * @param e DOCUMENT ME!
\r
213 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
215 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
220 "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",
\r
225 "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"
\r
226 }, currentFileFormat);
\r
228 chooser.setAcceptAllFileFilterUsed(false);
\r
229 chooser.setFileView(new JalviewFileView());
\r
230 chooser.setDialogTitle("Save Alignment to file");
\r
231 chooser.setToolTipText("Save");
\r
233 int value = chooser.showSaveDialog(this);
\r
235 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
237 currentFileFormat = chooser.getSelectedFormat();
\r
239 if (currentFileFormat == null)
\r
241 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
242 "You must select a file format before saving!",
\r
243 "File format not specified",
\r
244 JOptionPane.WARNING_MESSAGE);
\r
245 value = chooser.showSaveDialog(this);
\r
249 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
250 currentFileFormat);
\r
252 String choice = chooser.getSelectedFile().getPath();
\r
253 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
255 saveAlignment(choice, currentFileFormat);
\r
259 public boolean saveAlignment(String file, String format)
\r
261 if (format.equalsIgnoreCase("Jalview"))
\r
263 String shortName = title;
\r
265 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
267 shortName = shortName.substring(shortName.lastIndexOf(
\r
268 java.io.File.separatorChar) + 1);
\r
271 Jalview2XML.SaveAlignment(this, file, shortName);
\r
273 // USE Jalview2XML to save this file
\r
278 String output = new FormatAdapter().formatSequences(format,
\r
279 viewport.getAlignment().
\r
281 if (output == null)
\r
288 java.io.PrintWriter out = new java.io.PrintWriter(
\r
289 new java.io.FileWriter(file));
\r
295 catch (Exception ex)
\r
297 ex.printStackTrace();
\r
306 * @param e DOCUMENT ME!
\r
308 protected void outputText_actionPerformed(ActionEvent e)
\r
310 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
311 Desktop.addInternalFrame(cap,
\r
312 "Alignment output - " + e.getActionCommand(), 600,
\r
314 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
315 viewport.getAlignment().
\r
322 * @param e DOCUMENT ME!
\r
324 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
326 new HTMLOutput(viewport,
\r
327 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
328 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
331 public void createImageMap(File file, String image)
\r
333 alignPanel.makePNGImageMap(file, image);
\r
339 * @param e DOCUMENT ME!
\r
341 public void createPNG(File f)
\r
343 alignPanel.makePNG(f);
\r
349 * @param e DOCUMENT ME!
\r
351 public void createEPS(File f)
\r
353 alignPanel.makeEPS(f);
\r
359 * @param e DOCUMENT ME!
\r
361 public void printMenuItem_actionPerformed(ActionEvent e)
\r
363 //Putting in a thread avoids Swing painting problems
\r
364 PrintThread thread = new PrintThread();
\r
371 * @param e DOCUMENT ME!
\r
373 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
377 PaintRefresher.components.remove(viewport.alignment);
\r
378 this.setClosed(true);
\r
380 catch (Exception ex)
\r
388 void updateEditMenuBar()
\r
390 if (historyList.size() > 0)
\r
392 undoMenuItem.setEnabled(true);
\r
394 HistoryItem hi = (HistoryItem) historyList.peek();
\r
395 undoMenuItem.setText("Undo " + hi.getDescription());
\r
399 undoMenuItem.setEnabled(false);
\r
400 undoMenuItem.setText("Undo");
\r
403 if (redoList.size() > 0)
\r
405 redoMenuItem.setEnabled(true);
\r
407 HistoryItem hi = (HistoryItem) redoList.peek();
\r
408 redoMenuItem.setText("Redo " + hi.getDescription());
\r
412 redoMenuItem.setEnabled(false);
\r
413 redoMenuItem.setText("Redo");
\r
420 * @param hi DOCUMENT ME!
\r
422 public void addHistoryItem(HistoryItem hi)
\r
424 historyList.push(hi);
\r
425 updateEditMenuBar();
\r
431 * @param e DOCUMENT ME!
\r
433 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
435 HistoryItem hi = (HistoryItem) historyList.pop();
\r
436 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
437 HistoryItem.HIDE));
\r
438 restoreHistoryItem(hi);
\r
439 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
445 * @param e DOCUMENT ME!
\r
447 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
449 HistoryItem hi = (HistoryItem) redoList.pop();
\r
450 restoreHistoryItem(hi);
\r
451 updateEditMenuBar();
\r
452 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
455 // used by undo and redo
\r
456 void restoreHistoryItem(HistoryItem hi)
\r
458 if (hi.getType() == HistoryItem.SORT)
\r
460 for (int i = 0; i < hi.getSequences().size(); i++)
\r
462 viewport.alignment.getSequences().setElementAt(hi.getSequences()
\r
469 for (int i = 0; i < hi.getSequences().size(); i++)
\r
471 SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);
\r
473 if (restore.getLength() == 0)
\r
475 restore.setSequence(hi.getHidden().elementAt(i).toString());
\r
476 viewport.alignment.getSequences().insertElementAt(restore,
\r
477 hi.getAlignIndex(i));
\r
481 restore.setSequence(hi.getHidden().elementAt(i).toString());
\r
485 if (hi.getType() == HistoryItem.PASTE)
\r
487 for (int i = viewport.alignment.getHeight() - 1;
\r
488 i > (hi.getSequences().size() - 1); i--)
\r
490 viewport.alignment.deleteSequence(i);
\r
495 updateEditMenuBar();
\r
497 viewport.firePropertyChange("alignment", null,
\r
498 viewport.getAlignment().getSequences());
\r
504 * @param up DOCUMENT ME!
\r
506 public void moveSelectedSequences(boolean up)
\r
508 SequenceGroup sg = viewport.getSelectionGroup();
\r
517 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
519 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
521 if (!sg.sequences.contains(seq))
\r
526 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
528 if (sg.sequences.contains(temp))
\r
533 viewport.alignment.getSequences().setElementAt(temp, i);
\r
534 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
539 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
541 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
543 if (!sg.sequences.contains(seq))
\r
548 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
550 if (sg.sequences.contains(temp))
\r
555 viewport.alignment.getSequences().setElementAt(temp, i);
\r
556 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
560 alignPanel.repaint();
\r
563 public void lostOwnership(Clipboard clipboard, Transferable contents)
\r
565 Desktop.jalviewClipboard = null;
\r
572 * @param e DOCUMENT ME!
\r
574 protected void copy_actionPerformed(ActionEvent e)
\r
576 if (viewport.getSelectionGroup() == null)
\r
581 SequenceGroup sg = viewport.getSelectionGroup();
\r
583 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
585 Hashtable orderedSeqs = new Hashtable();
\r
586 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
588 for (int i = 0; i < sg.getSize(); i++)
\r
590 SequenceI seq = sg.getSequenceAt(i);
\r
591 int index = viewport.alignment.findIndex(seq);
\r
592 orderedSeqs.put(index + "", seq);
\r
595 int index = 0, startRes, endRes;
\r
598 for (int i = 0; i < sg.getSize(); i++)
\r
600 SequenceI seq = null;
\r
602 while (seq == null)
\r
604 if (orderedSeqs.containsKey(index + ""))
\r
606 seq = (SequenceI) orderedSeqs.get(index + "");
\r
618 //Returns residue following index if gap
\r
619 startRes = seq.findPosition(sg.getStartRes());
\r
622 //Need to find the residue preceeding index if gap
\r
625 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
627 ch = seq.getCharAt(j);
\r
628 if (!jalview.util.Comparison.isGap( (ch)))
\r
636 endRes += seq.getStart() - 1;
\r
639 seqs[i] = new Sequence(seq.getName(),
\r
640 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
643 seqs[i].setDescription(seq.getDescription());
\r
644 seqs[i].setDBRef(seq.getDBRef());
\r
645 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
646 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
650 FastaFile ff = new FastaFile();
\r
651 ff.addJVSuffix( viewport.showJVSuffix );
\r
652 c.setContents(new StringSelection( ff.print(seqs)), this);
\r
653 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
659 * @param e DOCUMENT ME!
\r
661 protected void pasteNew_actionPerformed(ActionEvent e)
\r
669 * @param e DOCUMENT ME!
\r
671 protected void pasteThis_actionPerformed(ActionEvent e)
\r
673 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
674 HistoryItem.PASTE));
\r
681 * @param newAlignment DOCUMENT ME!
\r
683 void paste(boolean newAlignment)
\r
687 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
688 Transferable contents = c.getContents(this);
\r
690 if (contents == null)
\r
695 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
699 String format = IdentifyFile.Identify(str, "Paste");
\r
700 SequenceI[] sequences;
\r
702 if(Desktop.jalviewClipboard!=null)
\r
704 // The clipboard was filled from within Jalview, we must use the sequences
\r
705 // And dataset from the copied alignment
\r
706 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
710 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
716 Alignment alignment = new Alignment(sequences);
\r
718 if(Desktop.jalviewClipboard!=null)
\r
719 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
721 alignment.setDataset( null );
\r
724 AlignFrame af = new AlignFrame(alignment);
\r
725 String newtitle = new String("Copied sequences");
\r
727 if (title.startsWith("Copied sequences"))
\r
733 newtitle = newtitle.concat("- from " + title);
\r
736 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
737 NEW_WINDOW_HEIGHT);
\r
742 for (int i = 0; i < sequences.length; i++)
\r
744 Sequence newseq = new Sequence(sequences[i].getName(),
\r
745 sequences[i].getSequence(), sequences[i].getStart(),
\r
746 sequences[i].getEnd());
\r
747 viewport.alignment.addSequence(newseq);
\r
748 if(sequences[i].getDatasetSequence()==null)
\r
750 ////////////////////////////
\r
751 //Datset needs extension;
\r
752 /////////////////////////////
\r
753 Sequence ds = new Sequence(sequences[i].getName(),
\r
754 AlignSeq.extractGaps("-. ", sequences[i].getSequence()),
\r
755 sequences[i].getStart(),
\r
756 sequences[i].getEnd());
\r
757 newseq.setDatasetSequence(ds);
\r
758 viewport.alignment.getDataset().addSequence(ds);
\r
762 newseq.setDatasetSequence(sequences[i].getDatasetSequence());
\r
763 if(sequences[i].getDatasetSequence().getAnnotation()!=null)
\r
765 for(int aa=0; aa<sequences[i].getDatasetSequence().getAnnotation().length; aa++)
\r
767 viewport.alignment.addAnnotation(sequences[i].getDatasetSequence().getAnnotation()[aa]);
\r
772 viewport.setEndSeq(viewport.alignment.getHeight());
\r
773 viewport.alignment.getWidth();
\r
774 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
777 catch (Exception ex)
\r
779 ex.printStackTrace();
\r
780 System.out.println("Exception whilst pasting: "+ex);
\r
781 // could be anything being pasted in here
\r
790 * @param e DOCUMENT ME!
\r
792 protected void cut_actionPerformed(ActionEvent e)
\r
794 copy_actionPerformed(null);
\r
795 delete_actionPerformed(null);
\r
801 * @param e DOCUMENT ME!
\r
803 protected void delete_actionPerformed(ActionEvent e)
\r
806 if (viewport.getSelectionGroup() == null)
\r
811 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
812 HistoryItem.HIDE));
\r
814 SequenceGroup sg = viewport.getSelectionGroup();
\r
815 boolean allSequences = false;
\r
816 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
818 allSequences = true;
\r
821 for (int i = 0; i < sg.sequences.size(); i++)
\r
823 SequenceI seq = sg.getSequenceAt(i);
\r
824 int index = viewport.getAlignment().findIndex(seq);
\r
825 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
827 // If the cut affects all sequences, remove highlighted columns
\r
830 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
831 sg.getEndRes() + 1);
\r
834 if (seq.getSequence().length() < 1)
\r
836 viewport.getAlignment().deleteSequence(seq);
\r
840 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
844 viewport.setSelectionGroup(null);
\r
845 viewport.alignment.deleteGroup(sg);
\r
847 viewport.firePropertyChange("alignment", null,
\r
848 viewport.getAlignment().getSequences());
\r
852 if (viewport.getAlignment().getHeight() < 1)
\r
856 this.setClosed(true);
\r
858 catch (Exception ex)
\r
867 * @param e DOCUMENT ME!
\r
869 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
871 viewport.alignment.deleteAllGroups();
\r
872 viewport.setSelectionGroup(null);
\r
873 alignPanel.repaint();
\r
879 * @param e DOCUMENT ME!
\r
881 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
883 SequenceGroup sg = new SequenceGroup();
\r
885 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
888 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
891 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
892 viewport.setSelectionGroup(sg);
\r
893 PaintRefresher.Refresh(null, viewport.alignment);
\r
899 * @param e DOCUMENT ME!
\r
901 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
903 viewport.setSelectionGroup(null);
\r
904 viewport.getColumnSelection().clear();
\r
905 viewport.setSelectionGroup(null);
\r
906 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
907 alignPanel.idPanel.idCanvas.searchResults = null;
\r
908 alignPanel.annotationPanel.activeRes = null;
\r
909 PaintRefresher.Refresh(null, viewport.alignment);
\r
915 * @param e DOCUMENT ME!
\r
917 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
919 SequenceGroup sg = viewport.getSelectionGroup();
\r
923 selectAllSequenceMenuItem_actionPerformed(null);
\r
928 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
931 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
934 PaintRefresher.Refresh(null, viewport.alignment);
\r
940 * @param e DOCUMENT ME!
\r
942 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
944 ColumnSelection colSel = viewport.getColumnSelection();
\r
946 if (colSel.size() > 0)
\r
948 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
949 HistoryItem.HIDE));
\r
951 int min = colSel.getMin();
\r
952 viewport.getAlignment().trimLeft(min);
\r
953 colSel.compensateForEdit(0, min);
\r
955 if (viewport.getSelectionGroup() != null)
\r
957 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
960 Vector groups = viewport.alignment.getGroups();
\r
962 for (int i = 0; i < groups.size(); i++)
\r
964 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
966 if (!sg.adjustForRemoveLeft(min))
\r
968 viewport.alignment.deleteGroup(sg);
\r
972 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
979 * @param e DOCUMENT ME!
\r
981 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
983 ColumnSelection colSel = viewport.getColumnSelection();
\r
985 if (colSel.size() > 0)
\r
987 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
988 HistoryItem.HIDE));
\r
990 int max = colSel.getMax();
\r
991 viewport.getAlignment().trimRight(max);
\r
993 if (viewport.getSelectionGroup() != null)
\r
995 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
998 Vector groups = viewport.alignment.getGroups();
\r
1000 for (int i = 0; i < groups.size(); i++)
\r
1002 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1004 if (!sg.adjustForRemoveRight(max))
\r
1006 viewport.alignment.deleteGroup(sg);
\r
1010 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1017 * @param e DOCUMENT ME!
\r
1019 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1021 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1022 viewport.alignment, HistoryItem.HIDE));
\r
1024 //This is to maintain viewport position on first residue
\r
1025 //of first sequence
\r
1026 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1027 int startRes = seq.findPosition(viewport.startRes);
\r
1029 viewport.getAlignment().removeGaps();
\r
1031 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1033 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1039 * @param e DOCUMENT ME!
\r
1041 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1043 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1044 HistoryItem.HIDE));
\r
1046 //This is to maintain viewport position on first residue
\r
1047 //of first sequence
\r
1048 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1049 int startRes = seq.findPosition(viewport.startRes);
\r
1052 SequenceI current;
\r
1055 Vector seqs = null;
\r
1058 int end = viewport.alignment.getWidth();
\r
1060 if (viewport.getSelectionGroup() != null
\r
1061 && viewport.getSelectionGroup().sequences != null
\r
1062 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1064 seqs = viewport.getSelectionGroup().sequences;
\r
1065 start = viewport.getSelectionGroup().getStartRes();
\r
1066 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1070 seqs = viewport.alignment.getSequences();
\r
1073 for (int i = 0; i < seqs.size(); i++)
\r
1075 current = (SequenceI) seqs.elementAt(i);
\r
1076 jSize = current.getLength();
\r
1078 // Removing a range is much quicker than removing gaps
\r
1079 // one by one for long sequences
\r
1081 int rangeStart=-1, rangeEnd=-1;
\r
1085 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1087 if(rangeStart==-1)
\r
1102 current.deleteChars(rangeStart, rangeEnd);
\r
1103 j-=rangeEnd-rangeStart;
\r
1104 jSize-=rangeEnd-rangeStart;
\r
1112 while (j < end && j < jSize);
\r
1115 current.deleteChars(rangeStart, rangeEnd);
\r
1119 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1121 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1124 public void alignmentChanged()
\r
1126 if(viewport.vconsensus!=null)
\r
1128 viewport.updateConsensus();
\r
1129 viewport.updateConservation();
\r
1131 resetAllColourSchemes();
\r
1132 if(alignPanel.overviewPanel!=null)
\r
1133 alignPanel.overviewPanel.updateOverviewImage();
\r
1135 viewport.alignment.adjustSequenceAnnotations();
\r
1137 alignPanel.repaint();
\r
1140 void resetAllColourSchemes()
\r
1142 ColourSchemeI cs = viewport.globalColourScheme;
\r
1145 if (cs instanceof ClustalxColourScheme)
\r
1147 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1148 resetClustalX(viewport.alignment.getSequences(),
\r
1149 viewport.alignment.getWidth());
\r
1152 cs.setConsensus(viewport.vconsensus);
\r
1153 if (cs.conservationApplied())
\r
1155 Alignment al = (Alignment) viewport.alignment;
\r
1156 Conservation c = new Conservation("All",
\r
1157 ResidueProperties.propHash, 3,
\r
1158 al.getSequences(), 0,
\r
1159 al.getWidth() - 1);
\r
1161 c.verdict(false, viewport.ConsPercGaps);
\r
1163 cs.setConservation(c);
\r
1167 int s, sSize = viewport.alignment.getGroups().size();
\r
1168 for(s=0; s<sSize; s++)
\r
1170 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1171 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1173 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1175 sg.recalcConservation();
\r
1182 * @param e DOCUMENT ME!
\r
1184 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1186 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1187 HistoryItem.HIDE));
\r
1188 if (viewport.getAlignment().padGaps())
\r
1189 alignmentChanged();
\r
1195 * @param e DOCUMENT ME!
\r
1197 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1199 JInternalFrame frame = new JInternalFrame();
\r
1200 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1201 frame.setContentPane(finder);
\r
1202 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1203 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1209 * @param e DOCUMENT ME!
\r
1211 public void font_actionPerformed(ActionEvent e)
\r
1213 new FontChooser(alignPanel);
\r
1216 public void smoothFont_actionPerformed(ActionEvent e)
\r
1218 viewport.antiAlias = smoothFont.isSelected();
\r
1219 alignPanel.annotationPanel.image = null;
\r
1220 alignPanel.repaint();
\r
1227 * @param e DOCUMENT ME!
\r
1229 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1231 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1233 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1234 alignPanel.repaint();
\r
1241 * @param e DOCUMENT ME!
\r
1243 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1245 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1246 alignPanel.repaint();
\r
1252 * @param e DOCUMENT ME!
\r
1254 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1256 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1257 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1258 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1259 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1260 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1261 alignPanel.repaint();
\r
1267 * @param e DOCUMENT ME!
\r
1269 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1271 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1272 alignPanel.repaint();
\r
1278 * @param e DOCUMENT ME!
\r
1280 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1282 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1283 alignPanel.repaint();
\r
1289 * @param e DOCUMENT ME!
\r
1291 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1293 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1294 alignPanel.repaint();
\r
1300 * @param e DOCUMENT ME!
\r
1302 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1304 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1305 alignPanel.repaint();
\r
1311 * @param e DOCUMENT ME!
\r
1313 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1315 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1316 alignPanel.repaint();
\r
1322 * @param e DOCUMENT ME!
\r
1324 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1326 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1327 alignPanel.repaint();
\r
1330 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1332 if (!viewport.alignment.isNucleotide())
\r
1334 new SequenceFeatureFetcher(viewport.
\r
1337 viewport.showSequenceFeatures(true);
\r
1338 showSeqFeatures.setSelected(true);
\r
1343 public void featureSettings_actionPerformed(ActionEvent e)
\r
1345 new FeatureSettings(viewport, alignPanel);
\r
1351 * @param evt DOCUMENT ME!
\r
1353 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1355 viewport.showSequenceFeatures(showSeqFeatures.isSelected());
\r
1356 alignPanel.repaint();
\r
1362 * @param e DOCUMENT ME!
\r
1364 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1366 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1367 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1373 * @param e DOCUMENT ME!
\r
1375 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1377 if (alignPanel.overviewPanel != null)
\r
1382 JInternalFrame frame = new JInternalFrame();
\r
1383 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1384 frame.setContentPane(overview);
\r
1385 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1386 frame.getWidth(), frame.getHeight());
\r
1388 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1389 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1391 public void internalFrameClosed(
\r
1392 javax.swing.event.InternalFrameEvent evt)
\r
1394 alignPanel.setOverviewPanel(null);
\r
1399 alignPanel.setOverviewPanel(overview);
\r
1405 * @param e DOCUMENT ME!
\r
1407 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1409 changeColour(null);
\r
1415 * @param e DOCUMENT ME!
\r
1417 public void clustalColour_actionPerformed(ActionEvent e)
\r
1419 changeColour(new ClustalxColourScheme(
\r
1420 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1426 * @param e DOCUMENT ME!
\r
1428 public void zappoColour_actionPerformed(ActionEvent e)
\r
1430 changeColour(new ZappoColourScheme());
\r
1436 * @param e DOCUMENT ME!
\r
1438 public void taylorColour_actionPerformed(ActionEvent e)
\r
1440 changeColour(new TaylorColourScheme());
\r
1446 * @param e DOCUMENT ME!
\r
1448 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1450 changeColour(new HydrophobicColourScheme());
\r
1456 * @param e DOCUMENT ME!
\r
1458 public void helixColour_actionPerformed(ActionEvent e)
\r
1460 changeColour(new HelixColourScheme());
\r
1466 * @param e DOCUMENT ME!
\r
1468 public void strandColour_actionPerformed(ActionEvent e)
\r
1470 changeColour(new StrandColourScheme());
\r
1476 * @param e DOCUMENT ME!
\r
1478 public void turnColour_actionPerformed(ActionEvent e)
\r
1480 changeColour(new TurnColourScheme());
\r
1486 * @param e DOCUMENT ME!
\r
1488 public void buriedColour_actionPerformed(ActionEvent e)
\r
1490 changeColour(new BuriedColourScheme());
\r
1496 * @param e DOCUMENT ME!
\r
1498 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1500 changeColour(new NucleotideColourScheme());
\r
1503 public void annotationColour_actionPerformed(ActionEvent e)
\r
1505 new AnnotationColourChooser(viewport, alignPanel);
\r
1512 * @param e DOCUMENT ME!
\r
1514 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1516 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1522 * @param cs DOCUMENT ME!
\r
1524 void changeColour(ColourSchemeI cs)
\r
1526 int threshold = 0;
\r
1530 if (viewport.getAbovePIDThreshold())
\r
1532 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1535 cs.setThreshold(threshold,
\r
1536 viewport.getIgnoreGapsConsensus());
\r
1538 viewport.setGlobalColourScheme(cs);
\r
1542 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1545 if (viewport.getConservationSelected())
\r
1548 Alignment al = (Alignment) viewport.alignment;
\r
1549 Conservation c = new Conservation("All",
\r
1550 ResidueProperties.propHash, 3,
\r
1551 al.getSequences(), 0,
\r
1552 al.getWidth() - 1);
\r
1555 c.verdict(false, viewport.ConsPercGaps);
\r
1557 cs.setConservation(c);
\r
1559 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1564 cs.setConservation(null);
\r
1567 cs.setConsensus(viewport.vconsensus);
\r
1570 viewport.setGlobalColourScheme(cs);
\r
1572 if (viewport.getColourAppliesToAllGroups())
\r
1574 Vector groups = viewport.alignment.getGroups();
\r
1576 for (int i = 0; i < groups.size(); i++)
\r
1578 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1586 if (cs instanceof ClustalxColourScheme)
\r
1588 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1590 else if (cs instanceof UserColourScheme)
\r
1592 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1598 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1600 catch (Exception ex)
\r
1605 if (viewport.getAbovePIDThreshold()
\r
1606 || cs instanceof PIDColourScheme
\r
1607 || cs instanceof Blosum62ColourScheme)
\r
1609 sg.cs.setThreshold(threshold,
\r
1610 viewport.getIgnoreGapsConsensus());
\r
1612 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1616 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1619 if (viewport.getConservationSelected())
\r
1621 Conservation c = new Conservation("Group",
\r
1622 ResidueProperties.propHash, 3,
\r
1624 viewport.alignment.getWidth() - 1);
\r
1626 c.verdict(false, viewport.ConsPercGaps);
\r
1627 sg.cs.setConservation(c);
\r
1630 sg.cs.setConservation(null);
\r
1634 if (alignPanel.getOverviewPanel() != null)
\r
1636 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1639 alignPanel.repaint();
\r
1645 * @param e DOCUMENT ME!
\r
1647 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1649 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1651 SliderPanel.setPIDSliderSource(alignPanel,
\r
1652 viewport.getGlobalColourScheme(),
\r
1654 SliderPanel.showPIDSlider();
\r
1661 * @param e DOCUMENT ME!
\r
1663 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1665 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1667 SliderPanel.setConservationSlider(alignPanel,
\r
1668 viewport.globalColourScheme,
\r
1670 SliderPanel.showConservationSlider();
\r
1677 * @param e DOCUMENT ME!
\r
1679 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1681 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1683 viewport.setAbovePIDThreshold(false);
\r
1684 abovePIDThreshold.setSelected(false);
\r
1686 changeColour(viewport.getGlobalColourScheme());
\r
1688 modifyConservation_actionPerformed(null);
\r
1694 * @param e DOCUMENT ME!
\r
1696 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1698 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1700 conservationMenuItem.setSelected(false);
\r
1701 viewport.setConservationSelected(false);
\r
1703 changeColour(viewport.getGlobalColourScheme());
\r
1705 modifyPID_actionPerformed(null);
\r
1711 * @param e DOCUMENT ME!
\r
1713 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1715 if (e.getActionCommand().equals("User Defined..."))
\r
1717 new UserDefinedColours(alignPanel, null);
\r
1721 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1722 getUserColourSchemes().get(e.getActionCommand());
\r
1724 changeColour(udc);
\r
1728 public void updateUserColourMenu()
\r
1731 Component[] menuItems = colourMenu.getMenuComponents();
\r
1732 int i, iSize = menuItems.length;
\r
1733 for (i = 0; i < iSize; i++)
\r
1735 if (menuItems[i].getName() != null &&
\r
1736 menuItems[i].getName().equals("USER_DEFINED"))
\r
1738 colourMenu.remove(menuItems[i]);
\r
1742 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1744 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1745 getUserColourSchemes().keys();
\r
1747 while (userColours.hasMoreElements())
\r
1749 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1750 nextElement().toString());
\r
1751 radioItem.setName("USER_DEFINED");
\r
1752 radioItem.addMouseListener(new MouseAdapter()
\r
1754 public void mousePressed(MouseEvent evt)
\r
1756 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1758 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1760 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1761 "Remove from default list?",
\r
1762 "Remove user defined colour",
\r
1763 JOptionPane.YES_NO_OPTION);
\r
1764 if(option == JOptionPane.YES_OPTION)
\r
1766 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1767 colourMenu.remove(radioItem);
\r
1770 radioItem.addActionListener(new ActionListener()
\r
1772 public void actionPerformed(ActionEvent evt)
\r
1774 userDefinedColour_actionPerformed(evt);
\r
1780 radioItem.addActionListener(new ActionListener()
\r
1782 public void actionPerformed(ActionEvent evt)
\r
1784 userDefinedColour_actionPerformed(evt);
\r
1788 colourMenu.insert(radioItem, 15);
\r
1789 colours.add(radioItem);
\r
1797 * @param e DOCUMENT ME!
\r
1799 public void PIDColour_actionPerformed(ActionEvent e)
\r
1801 changeColour(new PIDColourScheme());
\r
1807 * @param e DOCUMENT ME!
\r
1809 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1811 changeColour(new Blosum62ColourScheme());
\r
1817 * @param e DOCUMENT ME!
\r
1819 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1821 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1822 HistoryItem.SORT));
\r
1823 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1824 viewport.getAlignment().getSequenceAt(0));
\r
1825 alignPanel.repaint();
\r
1831 * @param e DOCUMENT ME!
\r
1833 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1835 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1836 HistoryItem.SORT));
\r
1837 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1838 alignPanel.repaint();
\r
1844 * @param e DOCUMENT ME!
\r
1846 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1848 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1849 HistoryItem.SORT));
\r
1851 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1852 alignPanel.repaint();
\r
1858 * @param e DOCUMENT ME!
\r
1860 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1862 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1863 JInternalFrame frame = new JInternalFrame();
\r
1864 frame.setContentPane(sp);
\r
1865 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1872 * @param e DOCUMENT ME!
\r
1874 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1876 if ( (viewport.getSelectionGroup() == null) ||
\r
1877 (viewport.getSelectionGroup().getSize() < 2))
\r
1879 JOptionPane.showInternalMessageDialog(this,
\r
1880 "You must select at least 2 sequences.",
\r
1881 "Invalid Selection",
\r
1882 JOptionPane.WARNING_MESSAGE);
\r
1886 JInternalFrame frame = new JInternalFrame();
\r
1887 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1888 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1895 * @param e DOCUMENT ME!
\r
1897 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1899 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1900 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1901 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1902 (viewport.getAlignment().getHeight() < 4))
\r
1904 JOptionPane.showInternalMessageDialog(this,
\r
1905 "Principal component analysis must take\n" +
\r
1906 "at least 4 input sequences.",
\r
1907 "Sequence selection insufficient",
\r
1908 JOptionPane.WARNING_MESSAGE);
\r
1913 new PCAPanel(viewport);
\r
1919 * @param e DOCUMENT ME!
\r
1921 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1923 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1929 * @param e DOCUMENT ME!
\r
1931 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1933 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1939 * @param e DOCUMENT ME!
\r
1941 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1943 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1949 * @param e DOCUMENT ME!
\r
1951 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1953 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1959 * @param type DOCUMENT ME!
\r
1960 * @param pwType DOCUMENT ME!
\r
1961 * @param title DOCUMENT ME!
\r
1963 void NewTreePanel(String type, String pwType, String title)
\r
1965 final TreePanel tp;
\r
1967 if ( (viewport.getSelectionGroup() != null) &&
\r
1968 (viewport.getSelectionGroup().getSize() > 3))
\r
1971 SequenceGroup sg = viewport.getSelectionGroup();
\r
1973 /* Decide if the selection is a column region */
\r
1974 while (s < sg.sequences.size())
\r
1976 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
1979 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1980 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
1981 "Try using the Pad function in the edit menu,\n" +
\r
1982 "or one of the multiple sequence alignment web services.",
\r
1983 "Sequences in selection are not aligned",
\r
1984 JOptionPane.WARNING_MESSAGE);
\r
1990 title = title + " on region";
\r
1991 tp = new TreePanel(viewport,
\r
1992 viewport.getSelectionGroup().sequences, type, pwType,
\r
1993 sg.getStartRes(), sg.getEndRes());
\r
1997 //are the sequences aligned?
\r
1998 if (!viewport.alignment.isAligned())
\r
2000 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2001 "The sequences must be aligned before creating a tree.\n" +
\r
2002 "Try using the Pad function in the edit menu,\n" +
\r
2003 "or one of the multiple sequence alignment web services.",
\r
2004 "Sequences not aligned",
\r
2005 JOptionPane.WARNING_MESSAGE);
\r
2010 tp = new TreePanel(viewport,
\r
2011 viewport.getAlignment().getSequences(), type, pwType,
\r
2013 viewport.alignment.getWidth());
\r
2016 addTreeMenuItem(tp, title);
\r
2017 viewport.setCurrentTree(tp.getTree());
\r
2019 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2025 * @param title DOCUMENT ME!
\r
2026 * @param order DOCUMENT ME!
\r
2028 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2030 final JMenuItem item = new JMenuItem("by " + title);
\r
2032 item.addActionListener(new java.awt.event.ActionListener()
\r
2034 public void actionPerformed(ActionEvent e)
\r
2036 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2037 HistoryItem.SORT));
\r
2039 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2040 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2041 alignPanel.repaint();
\r
2047 * Maintain the Order by->Displayed Tree menu.
\r
2048 * Creates a new menu item for a TreePanel with an appropriate
\r
2049 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2050 * to remove the menu item when the treePanel is closed, and adjust
\r
2051 * the tree leaf to sequence mapping when the alignment is modified.
\r
2052 * @param treePanel Displayed tree window.
\r
2053 * @param title SortBy menu item title.
\r
2055 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2057 final JMenuItem item = new JMenuItem(title);
\r
2061 if (treeCount == 1)
\r
2063 sort.add(sortByTreeMenu);
\r
2066 sortByTreeMenu.add(item);
\r
2067 item.addActionListener(new java.awt.event.ActionListener()
\r
2069 public void actionPerformed(ActionEvent e)
\r
2071 addHistoryItem(new HistoryItem("Tree Sort",
\r
2072 viewport.alignment, HistoryItem.SORT));
\r
2073 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2074 treePanel.getTree());
\r
2075 alignPanel.repaint();
\r
2079 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2080 InternalFrameAdapter()
\r
2082 public void internalFrameClosed(
\r
2083 javax.swing.event.InternalFrameEvent evt)
\r
2086 sortByTreeMenu.remove(item);
\r
2088 if (treeCount == 0)
\r
2090 sort.remove(sortByTreeMenu);
\r
2098 * Work out whether the whole set of sequences
\r
2099 * or just the selected set will be submitted for multiple alignment.
\r
2102 private SequenceI[] gatherSequencesForAlignment()
\r
2104 // Now, check we have enough sequences
\r
2105 SequenceI[] msa = null;
\r
2107 if ( (viewport.getSelectionGroup() != null) &&
\r
2108 (viewport.getSelectionGroup().getSize() > 1))
\r
2110 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2111 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2113 msa = new SequenceI[sz = seqs.getSize()];
\r
2115 for (int i = 0; i < sz; i++)
\r
2117 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2122 Vector seqs = viewport.getAlignment().getSequences();
\r
2124 if (seqs.size() > 1)
\r
2126 msa = new SequenceI[seqs.size()];
\r
2128 for (int i = 0; i < seqs.size(); i++)
\r
2130 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2138 * Decides what is submitted to a secondary structure prediction service,
\r
2139 * the currently selected sequence, or the currently selected alignment
\r
2140 * (where the first sequence in the set is the one that the prediction
\r
2143 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2145 SequenceI seq = null;
\r
2146 SequenceI[] msa = null;
\r
2148 if ( (viewport.getSelectionGroup() != null) &&
\r
2149 (viewport.getSelectionGroup().getSize() > 0))
\r
2151 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2152 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2154 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2156 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2161 msa = new SequenceI[sz = seqs.getSize()];
\r
2163 for (int i = 0; i < sz; i++)
\r
2165 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2171 Vector seqs = viewport.getAlignment().getSequences();
\r
2173 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2175 seq = (SequenceI) seqs.elementAt(0);
\r
2179 msa = new SequenceI[seqs.size()];
\r
2181 for (int i = 0; i < seqs.size(); i++)
\r
2183 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2195 return new SequenceI[]
\r
2205 * @param e DOCUMENT ME!
\r
2207 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2209 // Pick the tree file
\r
2210 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2212 "LAST_DIRECTORY"));
\r
2213 chooser.setFileView(new JalviewFileView());
\r
2214 chooser.setDialogTitle("Select a newick-like tree file");
\r
2215 chooser.setToolTipText("Load a tree file");
\r
2217 int value = chooser.showOpenDialog(null);
\r
2219 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2221 String choice = chooser.getSelectedFile().getPath();
\r
2222 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2226 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2228 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2230 catch (Exception ex)
\r
2232 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2233 "Problem reading tree file",
\r
2235 JOptionPane.WARNING_MESSAGE);
\r
2236 ex.printStackTrace();
\r
2242 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2244 return ShowNewickTree(nf,title,600,500,4,5);
\r
2249 * @param nf DOCUMENT ME!
\r
2250 * @param title DOCUMENT ME!
\r
2252 * @return DOCUMENT ME!
\r
2254 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2256 TreePanel tp = null;
\r
2262 if (nf.getTree() != null)
\r
2264 tp = new TreePanel(viewport,
\r
2265 viewport.getAlignment().getSequences(), nf,
\r
2272 tp.setLocation(x,y);
\r
2275 Desktop.addInternalFrame(tp, title, w, h);
\r
2276 addTreeMenuItem(tp, title);
\r
2279 catch (Exception ex)
\r
2281 ex.printStackTrace();
\r
2292 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2293 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2294 printJob.setPrintable(alignPanel, pf);
\r
2296 if (printJob.printDialog())
\r
2302 catch (Exception PrintException)
\r
2304 PrintException.printStackTrace();
\r
2311 * Generates menu items and listener event actions for web service clients
\r
2314 public void BuildWebServiceMenu()
\r
2316 if ( (Discoverer.services != null)
\r
2317 && (Discoverer.services.size() > 0))
\r
2319 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2320 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2321 Vector wsmenu = new Vector();
\r
2322 if (msaws != null)
\r
2324 // Add any Multiple Sequence Alignment Services
\r
2325 final JMenu msawsmenu = new JMenu("Alignment");
\r
2326 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2328 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2330 final JMenuItem method = new JMenuItem(sh.getName());
\r
2331 method.addActionListener(new ActionListener()
\r
2333 public void actionPerformed(ActionEvent e)
\r
2335 SequenceI[] msa = gatherSequencesForAlignment();
\r
2336 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2337 false, true, viewport.getAlignment().getDataset());
\r
2342 msawsmenu.add(method);
\r
2343 // Deal with services that we know accept partial alignments.
\r
2344 if (sh.getName().indexOf("lustal") > -1)
\r
2346 // We know that ClustalWS can accept partial alignments for refinement.
\r
2347 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2348 methodR.addActionListener(new ActionListener()
\r
2350 public void actionPerformed(ActionEvent e)
\r
2352 SequenceI[] msa = gatherSequencesForAlignment();
\r
2353 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2354 true, true, viewport.getAlignment().getDataset());
\r
2359 msawsmenu.add(methodR);
\r
2363 wsmenu.add(msawsmenu);
\r
2365 if (secstrpr != null)
\r
2367 // Add any secondary structure prediction services
\r
2368 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2369 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2371 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2373 final JMenuItem method = new JMenuItem(sh.getName());
\r
2374 method.addActionListener(new ActionListener()
\r
2376 public void actionPerformed(ActionEvent e)
\r
2378 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2379 if (msa.length == 1)
\r
2381 // Single Sequence prediction
\r
2382 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2386 if (msa.length > 1)
\r
2388 // Single Sequence prediction
\r
2389 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2395 secstrmenu.add(method);
\r
2397 wsmenu.add(secstrmenu);
\r
2399 this.webService.removeAll();
\r
2400 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2402 webService.add( (JMenu) wsmenu.get(i));
\r
2407 this.webService.removeAll();
\r
2408 this.webService.add(this.webServiceNoServices);
\r
2410 // TODO: add in rediscovery function
\r
2411 // TODO: reduce code redundancy.
\r
2412 // TODO: group services by location as well as function.
\r
2415 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2417 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2418 getProperty("LAST_DIRECTORY"));
\r
2420 chooser.setFileView(new JalviewFileView());
\r
2421 chooser.setDialogTitle("Export to Vamsas file");
\r
2422 chooser.setToolTipText("Export");
\r
2424 int value = chooser.showSaveDialog(this);
\r
2426 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2428 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2429 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2430 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2438 public void showTranslation_actionPerformed(ActionEvent e)
\r
2440 int s, sSize = viewport.alignment.getHeight();
\r
2441 SequenceI [] newSeq = new SequenceI[sSize];
\r
2444 StringBuffer protein;
\r
2446 for(s=0; s<sSize; s++)
\r
2448 protein = new StringBuffer();
\r
2449 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2450 resSize = seq.length();
\r
2451 for(res = 0; res < resSize; res+=3)
\r
2453 String codon = seq.substring(res, res+3);
\r
2454 codon = codon.replace('U', 'T');
\r
2455 String aa = ResidueProperties.codonTranslate(codon);
\r
2457 protein.append(viewport.getGapCharacter());
\r
2458 else if(aa.equals("STOP"))
\r
2459 protein.append("X");
\r
2461 protein.append( aa );
\r
2463 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2467 AlignmentI al = new Alignment(newSeq);
\r
2468 al.setDataset(null);
\r
2471 ////////////////////////////////
\r
2472 // Copy annotations across
\r
2473 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2474 = viewport.alignment.getAlignmentAnnotation();
\r
2476 for (int i = 0; i < annotations.length; i++)
\r
2479 if (annotations[i].label.equals("Quality") ||
\r
2480 annotations[i].label.equals("Conservation") ||
\r
2481 annotations[i].label.equals("Consensus"))
\r
2487 aSize = viewport.alignment.getWidth()/3;
\r
2488 jalview.datamodel.Annotation [] anots =
\r
2489 new jalview.datamodel.Annotation[aSize];
\r
2491 for(a=0; a<viewport.alignment.getWidth(); a++)
\r
2493 if( annotations[i].annotations[a]==null
\r
2494 || annotations[i].annotations[a]==null)
\r
2497 anots[a/3] = new Annotation(
\r
2498 annotations[i].annotations[a].displayCharacter,
\r
2499 annotations[i].annotations[a].description,
\r
2500 annotations[i].annotations[a].secondaryStructure,
\r
2501 annotations[i].annotations[a].value,
\r
2502 annotations[i].annotations[a].colour);
\r
2505 jalview.datamodel.AlignmentAnnotation aa
\r
2506 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2507 annotations[i].description, anots );
\r
2508 al.addAnnotation(aa);
\r
2512 AlignFrame af = new AlignFrame(al);
\r
2513 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2515 NEW_WINDOW_HEIGHT);
\r
2518 // AlignViewport newViewport = new AlignViewport(al);
\r
2519 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2520 // tabbedPane.add("Protein", ap);
\r
2521 // viewports.add(newViewport);
\r
2522 // alignPanels.add(ap);
\r
2525 /////////////////////////
\r
2527 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2528 // ds.setDataset(true);
\r
2529 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2530 // tabbedPane.add("Dataset", dap);
\r
2531 // viewports.add(ds);
\r
2532 // alignPanels.add(dap);
\r
2533 /////////////////////////
\r
2538 /*public void tabSelected()
\r
2540 int index = tabbedPane.getSelectedIndex();
\r
2541 viewport = (AlignViewport)viewports.elementAt(index);
\r
2542 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2548 * @param String DOCUMENT ME!
\r
2550 public boolean parseGroupsFile(String file)
\r
2554 BufferedReader in = new BufferedReader(new FileReader(file));
\r
2555 SequenceI seq = null;
\r
2556 String line, type, desc, token;
\r
2558 int index, start, end;
\r
2559 StringTokenizer st;
\r
2560 SequenceFeature sf;
\r
2562 String featureGroup = null;
\r
2563 while ( (line = in.readLine()) != null)
\r
2566 st = new StringTokenizer(line, "\t");
\r
2567 if (st.countTokens() == 2)
\r
2569 type = st.nextToken();
\r
2570 if (type.equalsIgnoreCase("startgroup"))
\r
2572 featureGroup = st.nextToken();
\r
2574 else if (type.equalsIgnoreCase("endgroup"))
\r
2576 //We should check whether this is the current group,
\r
2577 //but at present theres no way of showing more than 1 group
\r
2579 featureGroup = null;
\r
2583 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2584 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type,
\r
2585 ucs.findColour("A"));
\r
2590 while (st.hasMoreElements())
\r
2592 desc = st.nextToken();
\r
2593 token = st.nextToken();
\r
2594 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2596 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2601 index = Integer.parseInt(st.nextToken());
\r
2604 start = Integer.parseInt(st.nextToken());
\r
2605 end = Integer.parseInt(st.nextToken());
\r
2607 seq = viewport.alignment.getSequenceAt(index);
\r
2609 type = st.nextToken();
\r
2611 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2613 // Probably the old style groups file
\r
2614 UserColourScheme ucs = new UserColourScheme(type);
\r
2615 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2618 sf = new SequenceFeature(type, desc, "", start, end);
\r
2619 sf.setFeatureGroup(featureGroup);
\r
2621 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2625 catch (Exception ex)
\r
2627 ex.printStackTrace();
\r
2628 System.out.println("Error parsing groups file: " + ex);
\r
2632 viewport.showSequenceFeatures = true;
\r
2633 alignPanel.repaint();
\r
2637 public void dragEnter(DropTargetDragEvent evt)
\r
2640 public void dragExit(DropTargetEvent evt)
\r
2643 public void dragOver(DropTargetDragEvent evt)
\r
2646 public void dropActionChanged(DropTargetDragEvent evt)
\r
2649 public void drop(DropTargetDropEvent evt)
\r
2651 Transferable t = evt.getTransferable();
\r
2652 java.util.List files = null;
\r
2656 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2657 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2659 //Works on Windows and MacOSX
\r
2660 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2661 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2663 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2665 // This is used by Unix drag system
\r
2666 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2667 String data = (String) t.getTransferData(uriListFlavor);
\r
2668 files = new java.util.ArrayList(1);
\r
2669 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2672 st.hasMoreTokens(); )
\r
2674 String s = st.nextToken();
\r
2675 if (s.startsWith("#"))
\r
2677 // the line is a comment (as per the RFC 2483)
\r
2681 java.net.URI uri = new java.net.URI(s);
\r
2682 java.io.File file = new java.io.File(uri);
\r
2687 catch (Exception e)
\r
2689 e.printStackTrace();
\r
2692 if (files != null)
\r
2696 boolean isAnnotation = false;
\r
2698 for (int i = 0; i < files.size(); i++)
\r
2700 String file = files.get(i).toString();
\r
2702 isAnnotation = new AnnotationReader().readAnnotationFile(viewport.alignment, file);
\r
2704 if( !isAnnotation )
\r
2706 boolean isGroupsFile = parseGroupsFile(file);
\r
2707 if (!isGroupsFile)
\r
2709 String protocol = "File";
\r
2710 String format = jalview.io.IdentifyFile.Identify(file, protocol);
\r
2711 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol, format);
\r
2713 FastaFile ff = new FastaFile();
\r
2714 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2715 c.setContents(new StringSelection(ff.print(sequences)), this);
\r
2717 this.paste(false);
\r
2725 int height = alignPanel.annotationPanel.adjustPanelHeight();
\r
2726 alignPanel.annotationScroller.setPreferredSize(
\r
2727 new Dimension(alignPanel.annotationScroller.getWidth(),
\r
2730 alignPanel.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
\r
2731 alignPanel.annotationSpaceFillerHolder.getWidth(),
\r
2734 alignPanel.addNotify();
\r
2737 catch (Exception ex)
\r
2739 ex.printStackTrace();
\r