2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Softwarechang
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
19 package jalview.gui;
\r
21 import java.beans.*;
\r
26 import java.awt.datatransfer.*;
\r
27 import java.awt.event.*;
\r
28 import java.awt.print.*;
\r
29 import javax.swing.*;
\r
31 import jalview.analysis.*;
\r
32 import jalview.datamodel.*;
\r
33 import jalview.io.*;
\r
34 import jalview.jbgui.*;
\r
35 import jalview.schemes.*;
\r
36 import jalview.ws.*;
\r
37 import java.awt.dnd.*;
\r
44 * @version $Revision$
\r
46 public class AlignFrame
\r
47 extends GAlignFrame implements ClipboardOwner, DropTargetListener
\r
49 /** DOCUMENT ME!! */
\r
50 public static final int NEW_WINDOW_WIDTH = 700;
\r
52 /** DOCUMENT ME!! */
\r
53 public static final int NEW_WINDOW_HEIGHT = 500;
\r
54 AlignmentPanel alignPanel;
\r
55 AlignViewport viewport;
\r
57 Vector viewports = new Vector();
\r
58 Vector alignPanels = new Vector();
\r
60 /** DOCUMENT ME!! */
\r
61 public String currentFileFormat = null;
\r
62 Stack historyList = new Stack();
\r
63 Stack redoList = new Stack();
\r
64 private int treeCount = 0;
\r
68 * Creates a new AlignFrame object.
\r
70 * @param al DOCUMENT ME!
\r
72 public AlignFrame(AlignmentI al)
\r
74 viewport = new AlignViewport(al);
\r
75 viewports.add(viewport);
\r
77 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
\r
79 if(viewport.vconsensus==null)
\r
81 //Out of memory calculating consensus.
\r
82 BLOSUM62Colour.setEnabled(false);
\r
83 PIDColour.setEnabled(false);
\r
84 conservationMenuItem.setEnabled(false);
\r
85 modifyConservation.setEnabled(false);
\r
86 abovePIDThreshold.setEnabled(false);
\r
87 modifyPID.setEnabled(false);
\r
90 alignPanel = new AlignmentPanel(this, viewport);
\r
91 alignPanels.add(alignPanel);
\r
93 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
\r
95 if(sortby.equals("Id"))
\r
96 sortIDMenuItem_actionPerformed(null);
\r
97 else if(sortby.equals("Pairwise Identity"))
\r
98 sortPairwiseMenuItem_actionPerformed(null);
\r
100 // remove(tabbedPane);
\r
101 getContentPane().add(alignPanel, BorderLayout.CENTER);
\r
105 // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
\r
108 /////////////////////////
\r
109 if(al.getDataset()==null)
\r
111 al.setDataset(null);
\r
113 // AlignViewport ds = new AlignViewport(al.getDataset(), true);
\r
114 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
115 // tabbedPane.add("Dataset", dap);
\r
116 // viewports.add(ds);
\r
117 // alignPanels.add(dap);
\r
118 /////////////////////////
\r
121 viewport.addPropertyChangeListener(new PropertyChangeListener()
\r
123 public void propertyChange(PropertyChangeEvent evt)
\r
125 if (evt.getPropertyName().equals("alignment"))
\r
127 alignmentChanged();
\r
133 if (Desktop.desktop != null)
\r
135 addServiceListeners();
\r
136 setGUINucleotide(al.isNucleotide());
\r
140 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
141 private void addServiceListeners()
\r
143 final java.beans.PropertyChangeListener thisListener;
\r
144 // Do this once to get current state
\r
145 BuildWebServiceMenu();
\r
146 Desktop.discoverer.addPropertyChangeListener(
\r
147 thisListener = new java.beans.PropertyChangeListener()
\r
149 public void propertyChange(PropertyChangeEvent evt)
\r
151 // System.out.println("Discoverer property change.");
\r
152 if (evt.getPropertyName().equals("services"))
\r
154 // System.out.println("Rebuilding web service menu");
\r
155 BuildWebServiceMenu();
\r
159 addInternalFrameListener(new javax.swing.event.
\r
160 InternalFrameAdapter()
\r
162 public void internalFrameClosed(
\r
163 javax.swing.event.InternalFrameEvent evt)
\r
165 // System.out.println("deregistering discoverer listener");
\r
166 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
167 closeMenuItem_actionPerformed(null);
\r
174 public void setGUINucleotide(boolean nucleotide)
\r
176 showTranslation.setVisible( nucleotide );
\r
177 sequenceFeatures.setVisible(!nucleotide );
\r
178 featureSettings.setVisible( !nucleotide );
\r
179 conservationMenuItem.setVisible( !nucleotide );
\r
180 modifyConservation.setVisible( !nucleotide );
\r
182 //Deal with separators
\r
183 //Remember AlignFrame always starts as protein
\r
186 viewMenu.remove(viewMenu.getItemCount()-2);
\r
190 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
196 Added so Castor Mapping file can obtain Jalview Version
\r
198 public String getVersion()
\r
200 return jalview.bin.Cache.getProperty("VERSION");
\r
204 public void fetchSequence_actionPerformed(ActionEvent e)
\r
206 new SequenceFetcher(this);
\r
213 * @param e DOCUMENT ME!
\r
215 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
217 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
222 "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",
\r
227 "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"
\r
228 }, currentFileFormat);
\r
230 chooser.setAcceptAllFileFilterUsed(false);
\r
231 chooser.setFileView(new JalviewFileView());
\r
232 chooser.setDialogTitle("Save Alignment to file");
\r
233 chooser.setToolTipText("Save");
\r
235 int value = chooser.showSaveDialog(this);
\r
237 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
239 currentFileFormat = chooser.getSelectedFormat();
\r
241 if (currentFileFormat == null)
\r
243 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
244 "You must select a file format before saving!",
\r
245 "File format not specified",
\r
246 JOptionPane.WARNING_MESSAGE);
\r
247 value = chooser.showSaveDialog(this);
\r
251 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
252 currentFileFormat);
\r
254 String choice = chooser.getSelectedFile().getPath();
\r
255 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
257 saveAlignment(choice, currentFileFormat);
\r
261 public boolean saveAlignment(String file, String format)
\r
263 if (format.equalsIgnoreCase("Jalview"))
\r
265 String shortName = title;
\r
267 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
269 shortName = shortName.substring(shortName.lastIndexOf(
\r
270 java.io.File.separatorChar) + 1);
\r
273 Jalview2XML.SaveAlignment(this, file, shortName);
\r
275 // USE Jalview2XML to save this file
\r
280 String output = new FormatAdapter().formatSequences(format,
\r
281 viewport.getAlignment().
\r
283 if (output == null)
\r
290 java.io.PrintWriter out = new java.io.PrintWriter(
\r
291 new java.io.FileWriter(file));
\r
297 catch (Exception ex)
\r
299 ex.printStackTrace();
\r
308 * @param e DOCUMENT ME!
\r
310 protected void outputText_actionPerformed(ActionEvent e)
\r
312 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
313 Desktop.addInternalFrame(cap,
\r
314 "Alignment output - " + e.getActionCommand(), 600,
\r
316 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
317 viewport.getAlignment().
\r
324 * @param e DOCUMENT ME!
\r
326 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
328 new HTMLOutput(viewport,
\r
329 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
330 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
333 public void createImageMap(File file, String image)
\r
335 alignPanel.makePNGImageMap(file, image);
\r
341 * @param e DOCUMENT ME!
\r
343 public void createPNG(File f)
\r
345 alignPanel.makePNG(f);
\r
351 * @param e DOCUMENT ME!
\r
353 public void createEPS(File f)
\r
355 alignPanel.makeEPS(f);
\r
361 * @param e DOCUMENT ME!
\r
363 public void printMenuItem_actionPerformed(ActionEvent e)
\r
365 //Putting in a thread avoids Swing painting problems
\r
366 PrintThread thread = new PrintThread();
\r
373 * @param e DOCUMENT ME!
\r
375 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
379 PaintRefresher.components.remove(viewport.alignment);
\r
380 this.setClosed(true);
\r
382 catch (Exception ex)
\r
390 void updateEditMenuBar()
\r
392 if (historyList.size() > 0)
\r
394 undoMenuItem.setEnabled(true);
\r
396 HistoryItem hi = (HistoryItem) historyList.peek();
\r
397 undoMenuItem.setText("Undo " + hi.getDescription());
\r
401 undoMenuItem.setEnabled(false);
\r
402 undoMenuItem.setText("Undo");
\r
405 if (redoList.size() > 0)
\r
407 redoMenuItem.setEnabled(true);
\r
409 HistoryItem hi = (HistoryItem) redoList.peek();
\r
410 redoMenuItem.setText("Redo " + hi.getDescription());
\r
414 redoMenuItem.setEnabled(false);
\r
415 redoMenuItem.setText("Redo");
\r
422 * @param hi DOCUMENT ME!
\r
424 public void addHistoryItem(HistoryItem hi)
\r
426 historyList.push(hi);
\r
427 updateEditMenuBar();
\r
433 * @param e DOCUMENT ME!
\r
435 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
437 HistoryItem hi = (HistoryItem) historyList.pop();
\r
438 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
439 HistoryItem.HIDE));
\r
440 restoreHistoryItem(hi);
\r
441 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
447 * @param e DOCUMENT ME!
\r
449 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
451 HistoryItem hi = (HistoryItem) redoList.pop();
\r
452 restoreHistoryItem(hi);
\r
453 updateEditMenuBar();
\r
454 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
457 // used by undo and redo
\r
458 void restoreHistoryItem(HistoryItem hi)
\r
460 if (hi.getType() == HistoryItem.SORT)
\r
462 for (int i = 0; i < hi.getSequences().size(); i++)
\r
464 viewport.alignment.getSequences().setElementAt(hi.getSequences()
\r
471 for (int i = 0; i < hi.getSequences().size(); i++)
\r
473 SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);
\r
475 if (restore.getLength() == 0)
\r
477 restore.setSequence(hi.getHidden().elementAt(i).toString());
\r
478 viewport.alignment.getSequences().insertElementAt(restore,
\r
479 hi.getAlignIndex(i));
\r
483 restore.setSequence(hi.getHidden().elementAt(i).toString());
\r
487 if (hi.getType() == HistoryItem.PASTE)
\r
489 for (int i = viewport.alignment.getHeight() - 1;
\r
490 i > (hi.getSequences().size() - 1); i--)
\r
492 viewport.alignment.deleteSequence(i);
\r
497 updateEditMenuBar();
\r
499 viewport.firePropertyChange("alignment", null,
\r
500 viewport.getAlignment().getSequences());
\r
506 * @param up DOCUMENT ME!
\r
508 public void moveSelectedSequences(boolean up)
\r
510 SequenceGroup sg = viewport.getSelectionGroup();
\r
519 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
521 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
523 if (!sg.sequences.contains(seq))
\r
528 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
530 if (sg.sequences.contains(temp))
\r
535 viewport.alignment.getSequences().setElementAt(temp, i);
\r
536 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
541 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
543 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
545 if (!sg.sequences.contains(seq))
\r
550 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
552 if (sg.sequences.contains(temp))
\r
557 viewport.alignment.getSequences().setElementAt(temp, i);
\r
558 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
562 alignPanel.repaint();
\r
565 public void lostOwnership(Clipboard clipboard, Transferable contents)
\r
567 Desktop.jalviewClipboard = null;
\r
574 * @param e DOCUMENT ME!
\r
576 protected void copy_actionPerformed(ActionEvent e)
\r
578 if (viewport.getSelectionGroup() == null)
\r
583 SequenceGroup sg = viewport.getSelectionGroup();
\r
585 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
587 Hashtable orderedSeqs = new Hashtable();
\r
588 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
590 for (int i = 0; i < sg.getSize(); i++)
\r
592 SequenceI seq = sg.getSequenceAt(i);
\r
593 int index = viewport.alignment.findIndex(seq);
\r
594 orderedSeqs.put(index + "", seq);
\r
597 int index = 0, startRes, endRes;
\r
600 for (int i = 0; i < sg.getSize(); i++)
\r
602 SequenceI seq = null;
\r
604 while (seq == null)
\r
606 if (orderedSeqs.containsKey(index + ""))
\r
608 seq = (SequenceI) orderedSeqs.get(index + "");
\r
620 //Returns residue following index if gap
\r
621 startRes = seq.findPosition(sg.getStartRes());
\r
624 //Need to find the residue preceeding index if gap
\r
627 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
629 ch = seq.getCharAt(j);
\r
630 if (!jalview.util.Comparison.isGap( (ch)))
\r
638 endRes += seq.getStart() - 1;
\r
641 seqs[i] = new Sequence(seq.getName(),
\r
642 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
645 seqs[i].setDescription(seq.getDescription());
\r
646 seqs[i].setDBRef(seq.getDBRef());
\r
647 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
648 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
652 FastaFile ff = new FastaFile();
\r
653 ff.addJVSuffix( viewport.showJVSuffix );
\r
654 c.setContents(new StringSelection( ff.print(seqs)), this);
\r
655 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
661 * @param e DOCUMENT ME!
\r
663 protected void pasteNew_actionPerformed(ActionEvent e)
\r
671 * @param e DOCUMENT ME!
\r
673 protected void pasteThis_actionPerformed(ActionEvent e)
\r
675 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
676 HistoryItem.PASTE));
\r
683 * @param newAlignment DOCUMENT ME!
\r
685 void paste(boolean newAlignment)
\r
689 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
690 Transferable contents = c.getContents(this);
\r
692 if (contents == null)
\r
697 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
701 String format = IdentifyFile.Identify(str, "Paste");
\r
702 SequenceI[] sequences;
\r
704 if(Desktop.jalviewClipboard!=null)
\r
706 // The clipboard was filled from within Jalview, we must use the sequences
\r
707 // And dataset from the copied alignment
\r
708 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
712 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
718 Alignment alignment = new Alignment(sequences);
\r
720 if(Desktop.jalviewClipboard!=null)
\r
721 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
723 alignment.setDataset( null );
\r
726 AlignFrame af = new AlignFrame(alignment);
\r
727 String newtitle = new String("Copied sequences");
\r
729 if (title.startsWith("Copied sequences"))
\r
735 newtitle = newtitle.concat("- from " + title);
\r
738 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
739 NEW_WINDOW_HEIGHT);
\r
744 for (int i = 0; i < sequences.length; i++)
\r
746 Sequence newseq = new Sequence(sequences[i].getName(),
\r
747 sequences[i].getSequence(), sequences[i].getStart(),
\r
748 sequences[i].getEnd());
\r
749 viewport.alignment.addSequence(newseq);
\r
750 if(sequences[i].getDatasetSequence()==null)
\r
752 ////////////////////////////
\r
753 //Datset needs extension;
\r
754 /////////////////////////////
\r
755 Sequence ds = new Sequence(sequences[i].getName(),
\r
756 AlignSeq.extractGaps("-. ", sequences[i].getSequence()),
\r
757 sequences[i].getStart(),
\r
758 sequences[i].getEnd());
\r
759 newseq.setDatasetSequence(ds);
\r
760 viewport.alignment.getDataset().addSequence(ds);
\r
764 newseq.setDatasetSequence(sequences[i].getDatasetSequence());
\r
765 if(sequences[i].getDatasetSequence().getAnnotation()!=null)
\r
767 for(int aa=0; aa<sequences[i].getDatasetSequence().getAnnotation().length; aa++)
\r
769 viewport.alignment.addAnnotation(sequences[i].getDatasetSequence().getAnnotation()[aa]);
\r
774 viewport.setEndSeq(viewport.alignment.getHeight());
\r
775 viewport.alignment.getWidth();
\r
776 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
779 catch (Exception ex)
\r
781 ex.printStackTrace();
\r
782 System.out.println("Exception whilst pasting: "+ex);
\r
783 // could be anything being pasted in here
\r
792 * @param e DOCUMENT ME!
\r
794 protected void cut_actionPerformed(ActionEvent e)
\r
796 copy_actionPerformed(null);
\r
797 delete_actionPerformed(null);
\r
803 * @param e DOCUMENT ME!
\r
805 protected void delete_actionPerformed(ActionEvent e)
\r
808 if (viewport.getSelectionGroup() == null)
\r
813 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
814 HistoryItem.HIDE));
\r
816 SequenceGroup sg = viewport.getSelectionGroup();
\r
817 boolean allSequences = false;
\r
818 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
820 allSequences = true;
\r
823 for (int i = 0; i < sg.sequences.size(); i++)
\r
825 SequenceI seq = sg.getSequenceAt(i);
\r
826 int index = viewport.getAlignment().findIndex(seq);
\r
827 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
829 // If the cut affects all sequences, remove highlighted columns
\r
832 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
833 sg.getEndRes() + 1);
\r
836 if (seq.getSequence().length() < 1)
\r
838 viewport.getAlignment().deleteSequence(seq);
\r
842 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
846 viewport.setSelectionGroup(null);
\r
847 viewport.alignment.deleteGroup(sg);
\r
849 viewport.firePropertyChange("alignment", null,
\r
850 viewport.getAlignment().getSequences());
\r
854 if (viewport.getAlignment().getHeight() < 1)
\r
858 this.setClosed(true);
\r
860 catch (Exception ex)
\r
869 * @param e DOCUMENT ME!
\r
871 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
873 viewport.alignment.deleteAllGroups();
\r
874 viewport.setSelectionGroup(null);
\r
875 alignPanel.repaint();
\r
881 * @param e DOCUMENT ME!
\r
883 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
885 SequenceGroup sg = new SequenceGroup();
\r
887 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
890 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
893 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
894 viewport.setSelectionGroup(sg);
\r
895 PaintRefresher.Refresh(null, viewport.alignment);
\r
901 * @param e DOCUMENT ME!
\r
903 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
905 viewport.setSelectionGroup(null);
\r
906 viewport.getColumnSelection().clear();
\r
907 viewport.setSelectionGroup(null);
\r
908 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
909 alignPanel.idPanel.idCanvas.searchResults = null;
\r
910 alignPanel.annotationPanel.activeRes = null;
\r
911 PaintRefresher.Refresh(null, viewport.alignment);
\r
917 * @param e DOCUMENT ME!
\r
919 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
921 SequenceGroup sg = viewport.getSelectionGroup();
\r
925 selectAllSequenceMenuItem_actionPerformed(null);
\r
930 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
933 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
936 PaintRefresher.Refresh(null, viewport.alignment);
\r
942 * @param e DOCUMENT ME!
\r
944 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
946 ColumnSelection colSel = viewport.getColumnSelection();
\r
948 if (colSel.size() > 0)
\r
950 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
951 HistoryItem.HIDE));
\r
953 int min = colSel.getMin();
\r
954 viewport.getAlignment().trimLeft(min);
\r
955 colSel.compensateForEdit(0, min);
\r
957 if (viewport.getSelectionGroup() != null)
\r
959 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
962 Vector groups = viewport.alignment.getGroups();
\r
964 for (int i = 0; i < groups.size(); i++)
\r
966 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
968 if (!sg.adjustForRemoveLeft(min))
\r
970 viewport.alignment.deleteGroup(sg);
\r
974 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
981 * @param e DOCUMENT ME!
\r
983 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
985 ColumnSelection colSel = viewport.getColumnSelection();
\r
987 if (colSel.size() > 0)
\r
989 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
990 HistoryItem.HIDE));
\r
992 int max = colSel.getMax();
\r
993 viewport.getAlignment().trimRight(max);
\r
995 if (viewport.getSelectionGroup() != null)
\r
997 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1000 Vector groups = viewport.alignment.getGroups();
\r
1002 for (int i = 0; i < groups.size(); i++)
\r
1004 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1006 if (!sg.adjustForRemoveRight(max))
\r
1008 viewport.alignment.deleteGroup(sg);
\r
1012 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1019 * @param e DOCUMENT ME!
\r
1021 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1023 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1024 viewport.alignment, HistoryItem.HIDE));
\r
1026 //This is to maintain viewport position on first residue
\r
1027 //of first sequence
\r
1028 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1029 int startRes = seq.findPosition(viewport.startRes);
\r
1031 viewport.getAlignment().removeGaps();
\r
1033 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1035 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1041 * @param e DOCUMENT ME!
\r
1043 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1045 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1046 HistoryItem.HIDE));
\r
1048 //This is to maintain viewport position on first residue
\r
1049 //of first sequence
\r
1050 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1051 int startRes = seq.findPosition(viewport.startRes);
\r
1054 SequenceI current;
\r
1057 Vector seqs = null;
\r
1060 int end = viewport.alignment.getWidth();
\r
1062 if (viewport.getSelectionGroup() != null
\r
1063 && viewport.getSelectionGroup().sequences != null
\r
1064 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1066 seqs = viewport.getSelectionGroup().sequences;
\r
1067 start = viewport.getSelectionGroup().getStartRes();
\r
1068 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1072 seqs = viewport.alignment.getSequences();
\r
1075 for (int i = 0; i < seqs.size(); i++)
\r
1077 current = (SequenceI) seqs.elementAt(i);
\r
1078 jSize = current.getLength();
\r
1080 // Removing a range is much quicker than removing gaps
\r
1081 // one by one for long sequences
\r
1083 int rangeStart=-1, rangeEnd=-1;
\r
1087 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1089 if(rangeStart==-1)
\r
1104 current.deleteChars(rangeStart, rangeEnd);
\r
1105 j-=rangeEnd-rangeStart;
\r
1106 jSize-=rangeEnd-rangeStart;
\r
1114 while (j < end && j < jSize);
\r
1117 current.deleteChars(rangeStart, rangeEnd);
\r
1121 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1123 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1126 public void alignmentChanged()
\r
1128 if(viewport.vconsensus!=null)
\r
1130 viewport.updateConsensus();
\r
1131 viewport.updateConservation();
\r
1133 resetAllColourSchemes();
\r
1134 if(alignPanel.overviewPanel!=null)
\r
1135 alignPanel.overviewPanel.updateOverviewImage();
\r
1137 viewport.alignment.adjustSequenceAnnotations();
\r
1139 alignPanel.repaint();
\r
1142 void resetAllColourSchemes()
\r
1144 ColourSchemeI cs = viewport.globalColourScheme;
\r
1147 if (cs instanceof ClustalxColourScheme)
\r
1149 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1150 resetClustalX(viewport.alignment.getSequences(),
\r
1151 viewport.alignment.getWidth());
\r
1154 cs.setConsensus(viewport.vconsensus);
\r
1155 if (cs.conservationApplied())
\r
1157 Alignment al = (Alignment) viewport.alignment;
\r
1158 Conservation c = new Conservation("All",
\r
1159 ResidueProperties.propHash, 3,
\r
1160 al.getSequences(), 0,
\r
1161 al.getWidth() - 1);
\r
1163 c.verdict(false, viewport.ConsPercGaps);
\r
1165 cs.setConservation(c);
\r
1169 int s, sSize = viewport.alignment.getGroups().size();
\r
1170 for(s=0; s<sSize; s++)
\r
1172 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1173 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1175 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1177 sg.recalcConservation();
\r
1184 * @param e DOCUMENT ME!
\r
1186 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1188 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1189 HistoryItem.HIDE));
\r
1190 if (viewport.getAlignment().padGaps())
\r
1191 alignmentChanged();
\r
1197 * @param e DOCUMENT ME!
\r
1199 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1201 JInternalFrame frame = new JInternalFrame();
\r
1202 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1203 frame.setContentPane(finder);
\r
1204 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1205 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1211 * @param e DOCUMENT ME!
\r
1213 public void font_actionPerformed(ActionEvent e)
\r
1215 new FontChooser(alignPanel);
\r
1218 public void smoothFont_actionPerformed(ActionEvent e)
\r
1220 viewport.antiAlias = smoothFont.isSelected();
\r
1221 alignPanel.annotationPanel.image = null;
\r
1222 alignPanel.repaint();
\r
1229 * @param e DOCUMENT ME!
\r
1231 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1233 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1235 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1236 alignPanel.repaint();
\r
1243 * @param e DOCUMENT ME!
\r
1245 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1247 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1248 alignPanel.repaint();
\r
1254 * @param e DOCUMENT ME!
\r
1256 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1258 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1259 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1260 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1261 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1262 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1263 alignPanel.repaint();
\r
1269 * @param e DOCUMENT ME!
\r
1271 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1273 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1274 alignPanel.repaint();
\r
1280 * @param e DOCUMENT ME!
\r
1282 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1284 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1285 alignPanel.repaint();
\r
1291 * @param e DOCUMENT ME!
\r
1293 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1295 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1296 alignPanel.repaint();
\r
1302 * @param e DOCUMENT ME!
\r
1304 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1306 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1307 alignPanel.repaint();
\r
1313 * @param e DOCUMENT ME!
\r
1315 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1317 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1318 alignPanel.repaint();
\r
1324 * @param e DOCUMENT ME!
\r
1326 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1328 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1329 alignPanel.repaint();
\r
1335 * @param evt DOCUMENT ME!
\r
1337 public void sequenceFeatures_actionPerformed(ActionEvent evt)
\r
1339 viewport.showSequenceFeatures(sequenceFeatures.isSelected());
\r
1341 if (viewport.showSequenceFeatures)
\r
1343 new SequenceFeatureFetcher(viewport.
\r
1348 featureSettings.setEnabled(true);
\r
1350 alignPanel.repaint();
\r
1356 * @param e DOCUMENT ME!
\r
1358 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1360 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1361 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1367 * @param e DOCUMENT ME!
\r
1369 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1371 if (alignPanel.overviewPanel != null)
\r
1376 JInternalFrame frame = new JInternalFrame();
\r
1377 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1378 frame.setContentPane(overview);
\r
1379 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1380 frame.getWidth(), frame.getHeight());
\r
1382 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1383 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1385 public void internalFrameClosed(
\r
1386 javax.swing.event.InternalFrameEvent evt)
\r
1388 alignPanel.setOverviewPanel(null);
\r
1393 alignPanel.setOverviewPanel(overview);
\r
1399 * @param e DOCUMENT ME!
\r
1401 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1403 changeColour(null);
\r
1409 * @param e DOCUMENT ME!
\r
1411 public void clustalColour_actionPerformed(ActionEvent e)
\r
1413 changeColour(new ClustalxColourScheme(
\r
1414 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1420 * @param e DOCUMENT ME!
\r
1422 public void zappoColour_actionPerformed(ActionEvent e)
\r
1424 changeColour(new ZappoColourScheme());
\r
1430 * @param e DOCUMENT ME!
\r
1432 public void taylorColour_actionPerformed(ActionEvent e)
\r
1434 changeColour(new TaylorColourScheme());
\r
1440 * @param e DOCUMENT ME!
\r
1442 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1444 changeColour(new HydrophobicColourScheme());
\r
1450 * @param e DOCUMENT ME!
\r
1452 public void helixColour_actionPerformed(ActionEvent e)
\r
1454 changeColour(new HelixColourScheme());
\r
1460 * @param e DOCUMENT ME!
\r
1462 public void strandColour_actionPerformed(ActionEvent e)
\r
1464 changeColour(new StrandColourScheme());
\r
1470 * @param e DOCUMENT ME!
\r
1472 public void turnColour_actionPerformed(ActionEvent e)
\r
1474 changeColour(new TurnColourScheme());
\r
1480 * @param e DOCUMENT ME!
\r
1482 public void buriedColour_actionPerformed(ActionEvent e)
\r
1484 changeColour(new BuriedColourScheme());
\r
1490 * @param e DOCUMENT ME!
\r
1492 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1494 changeColour(new NucleotideColourScheme());
\r
1497 public void annotationColour_actionPerformed(ActionEvent e)
\r
1499 new AnnotationColourChooser(viewport, alignPanel);
\r
1506 * @param e DOCUMENT ME!
\r
1508 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1510 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1516 * @param cs DOCUMENT ME!
\r
1518 void changeColour(ColourSchemeI cs)
\r
1520 int threshold = 0;
\r
1524 if (viewport.getAbovePIDThreshold())
\r
1526 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1529 cs.setThreshold(threshold,
\r
1530 viewport.getIgnoreGapsConsensus());
\r
1532 viewport.setGlobalColourScheme(cs);
\r
1536 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1539 if (viewport.getConservationSelected())
\r
1542 Alignment al = (Alignment) viewport.alignment;
\r
1543 Conservation c = new Conservation("All",
\r
1544 ResidueProperties.propHash, 3,
\r
1545 al.getSequences(), 0,
\r
1546 al.getWidth() - 1);
\r
1549 c.verdict(false, viewport.ConsPercGaps);
\r
1551 cs.setConservation(c);
\r
1553 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1558 cs.setConservation(null);
\r
1561 cs.setConsensus(viewport.vconsensus);
\r
1564 viewport.setGlobalColourScheme(cs);
\r
1566 if (viewport.getColourAppliesToAllGroups())
\r
1568 Vector groups = viewport.alignment.getGroups();
\r
1570 for (int i = 0; i < groups.size(); i++)
\r
1572 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1580 if (cs instanceof ClustalxColourScheme)
\r
1582 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1584 else if (cs instanceof UserColourScheme)
\r
1586 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1592 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1594 catch (Exception ex)
\r
1599 if (viewport.getAbovePIDThreshold()
\r
1600 || cs instanceof PIDColourScheme
\r
1601 || cs instanceof Blosum62ColourScheme)
\r
1603 sg.cs.setThreshold(threshold,
\r
1604 viewport.getIgnoreGapsConsensus());
\r
1606 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1610 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1613 if (viewport.getConservationSelected())
\r
1615 Conservation c = new Conservation("Group",
\r
1616 ResidueProperties.propHash, 3,
\r
1618 viewport.alignment.getWidth() - 1);
\r
1620 c.verdict(false, viewport.ConsPercGaps);
\r
1621 sg.cs.setConservation(c);
\r
1624 sg.cs.setConservation(null);
\r
1628 if (alignPanel.getOverviewPanel() != null)
\r
1630 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1633 alignPanel.repaint();
\r
1639 * @param e DOCUMENT ME!
\r
1641 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1643 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1645 SliderPanel.setPIDSliderSource(alignPanel,
\r
1646 viewport.getGlobalColourScheme(),
\r
1648 SliderPanel.showPIDSlider();
\r
1655 * @param e DOCUMENT ME!
\r
1657 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1659 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1661 SliderPanel.setConservationSlider(alignPanel,
\r
1662 viewport.globalColourScheme,
\r
1664 SliderPanel.showConservationSlider();
\r
1671 * @param e DOCUMENT ME!
\r
1673 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1675 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1677 viewport.setAbovePIDThreshold(false);
\r
1678 abovePIDThreshold.setSelected(false);
\r
1680 changeColour(viewport.getGlobalColourScheme());
\r
1682 modifyConservation_actionPerformed(null);
\r
1688 * @param e DOCUMENT ME!
\r
1690 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1692 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1694 conservationMenuItem.setSelected(false);
\r
1695 viewport.setConservationSelected(false);
\r
1697 changeColour(viewport.getGlobalColourScheme());
\r
1699 modifyPID_actionPerformed(null);
\r
1705 * @param e DOCUMENT ME!
\r
1707 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1709 if (e.getActionCommand().equals("User Defined..."))
\r
1711 new UserDefinedColours(alignPanel, null);
\r
1715 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1716 getUserColourSchemes().get(e.getActionCommand());
\r
1718 changeColour(udc);
\r
1722 public void updateUserColourMenu()
\r
1725 Component[] menuItems = colourMenu.getMenuComponents();
\r
1726 int i, iSize = menuItems.length;
\r
1727 for (i = 0; i < iSize; i++)
\r
1729 if (menuItems[i].getName() != null &&
\r
1730 menuItems[i].getName().equals("USER_DEFINED"))
\r
1732 colourMenu.remove(menuItems[i]);
\r
1736 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1738 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1739 getUserColourSchemes().keys();
\r
1741 while (userColours.hasMoreElements())
\r
1743 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1744 nextElement().toString());
\r
1745 radioItem.setName("USER_DEFINED");
\r
1746 radioItem.addMouseListener(new MouseAdapter()
\r
1748 public void mousePressed(MouseEvent evt)
\r
1750 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1752 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1754 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1755 "Remove from default list?",
\r
1756 "Remove user defined colour",
\r
1757 JOptionPane.YES_NO_OPTION);
\r
1758 if(option == JOptionPane.YES_OPTION)
\r
1760 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1761 colourMenu.remove(radioItem);
\r
1764 radioItem.addActionListener(new ActionListener()
\r
1766 public void actionPerformed(ActionEvent evt)
\r
1768 userDefinedColour_actionPerformed(evt);
\r
1774 radioItem.addActionListener(new ActionListener()
\r
1776 public void actionPerformed(ActionEvent evt)
\r
1778 userDefinedColour_actionPerformed(evt);
\r
1782 colourMenu.insert(radioItem, 15);
\r
1783 colours.add(radioItem);
\r
1791 * @param e DOCUMENT ME!
\r
1793 public void PIDColour_actionPerformed(ActionEvent e)
\r
1795 changeColour(new PIDColourScheme());
\r
1801 * @param e DOCUMENT ME!
\r
1803 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1805 changeColour(new Blosum62ColourScheme());
\r
1811 * @param e DOCUMENT ME!
\r
1813 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1815 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1816 HistoryItem.SORT));
\r
1817 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1818 viewport.getAlignment().getSequenceAt(0));
\r
1819 alignPanel.repaint();
\r
1825 * @param e DOCUMENT ME!
\r
1827 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1829 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1830 HistoryItem.SORT));
\r
1831 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1832 alignPanel.repaint();
\r
1838 * @param e DOCUMENT ME!
\r
1840 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1842 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1843 HistoryItem.SORT));
\r
1845 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1846 alignPanel.repaint();
\r
1852 * @param e DOCUMENT ME!
\r
1854 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1856 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1857 JInternalFrame frame = new JInternalFrame();
\r
1858 frame.setContentPane(sp);
\r
1859 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1866 * @param e DOCUMENT ME!
\r
1868 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1870 if ( (viewport.getSelectionGroup() == null) ||
\r
1871 (viewport.getSelectionGroup().getSize() < 2))
\r
1873 JOptionPane.showInternalMessageDialog(this,
\r
1874 "You must select at least 2 sequences.",
\r
1875 "Invalid Selection",
\r
1876 JOptionPane.WARNING_MESSAGE);
\r
1880 JInternalFrame frame = new JInternalFrame();
\r
1881 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1882 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1889 * @param e DOCUMENT ME!
\r
1891 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1893 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1894 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1895 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1896 (viewport.getAlignment().getHeight() < 4))
\r
1898 JOptionPane.showInternalMessageDialog(this,
\r
1899 "Principal component analysis must take\n" +
\r
1900 "at least 4 input sequences.",
\r
1901 "Sequence selection insufficient",
\r
1902 JOptionPane.WARNING_MESSAGE);
\r
1907 new PCAPanel(viewport);
\r
1913 * @param e DOCUMENT ME!
\r
1915 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1917 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1923 * @param e DOCUMENT ME!
\r
1925 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1927 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1933 * @param e DOCUMENT ME!
\r
1935 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1937 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1943 * @param e DOCUMENT ME!
\r
1945 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1947 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1953 * @param type DOCUMENT ME!
\r
1954 * @param pwType DOCUMENT ME!
\r
1955 * @param title DOCUMENT ME!
\r
1957 void NewTreePanel(String type, String pwType, String title)
\r
1959 final TreePanel tp;
\r
1961 if ( (viewport.getSelectionGroup() != null) &&
\r
1962 (viewport.getSelectionGroup().getSize() > 3))
\r
1965 SequenceGroup sg = viewport.getSelectionGroup();
\r
1967 /* Decide if the selection is a column region */
\r
1968 while (s < sg.sequences.size())
\r
1970 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
1973 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1974 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
1975 "Try using the Pad function in the edit menu,\n" +
\r
1976 "or one of the multiple sequence alignment web services.",
\r
1977 "Sequences in selection are not aligned",
\r
1978 JOptionPane.WARNING_MESSAGE);
\r
1984 title = title + " on region";
\r
1985 tp = new TreePanel(viewport,
\r
1986 viewport.getSelectionGroup().sequences, type, pwType,
\r
1987 sg.getStartRes(), sg.getEndRes());
\r
1991 //are the sequences aligned?
\r
1992 if (!viewport.alignment.isAligned())
\r
1994 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1995 "The sequences must be aligned before creating a tree.\n" +
\r
1996 "Try using the Pad function in the edit menu,\n" +
\r
1997 "or one of the multiple sequence alignment web services.",
\r
1998 "Sequences not aligned",
\r
1999 JOptionPane.WARNING_MESSAGE);
\r
2004 tp = new TreePanel(viewport,
\r
2005 viewport.getAlignment().getSequences(), type, pwType,
\r
2007 viewport.alignment.getWidth());
\r
2010 addTreeMenuItem(tp, title);
\r
2011 viewport.setCurrentTree(tp.getTree());
\r
2013 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2019 * @param title DOCUMENT ME!
\r
2020 * @param order DOCUMENT ME!
\r
2022 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2024 final JMenuItem item = new JMenuItem("by " + title);
\r
2026 item.addActionListener(new java.awt.event.ActionListener()
\r
2028 public void actionPerformed(ActionEvent e)
\r
2030 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2031 HistoryItem.SORT));
\r
2033 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2034 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2035 alignPanel.repaint();
\r
2041 * Maintain the Order by->Displayed Tree menu.
\r
2042 * Creates a new menu item for a TreePanel with an appropriate
\r
2043 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2044 * to remove the menu item when the treePanel is closed, and adjust
\r
2045 * the tree leaf to sequence mapping when the alignment is modified.
\r
2046 * @param treePanel Displayed tree window.
\r
2047 * @param title SortBy menu item title.
\r
2049 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2051 final JMenuItem item = new JMenuItem(title);
\r
2055 if (treeCount == 1)
\r
2057 sort.add(sortByTreeMenu);
\r
2060 sortByTreeMenu.add(item);
\r
2061 item.addActionListener(new java.awt.event.ActionListener()
\r
2063 public void actionPerformed(ActionEvent e)
\r
2065 addHistoryItem(new HistoryItem("Tree Sort",
\r
2066 viewport.alignment, HistoryItem.SORT));
\r
2067 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2068 treePanel.getTree());
\r
2069 alignPanel.repaint();
\r
2073 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2074 InternalFrameAdapter()
\r
2076 public void internalFrameClosed(
\r
2077 javax.swing.event.InternalFrameEvent evt)
\r
2080 sortByTreeMenu.remove(item);
\r
2082 if (treeCount == 0)
\r
2084 sort.remove(sortByTreeMenu);
\r
2092 * Work out whether the whole set of sequences
\r
2093 * or just the selected set will be submitted for multiple alignment.
\r
2096 private SequenceI[] gatherSequencesForAlignment()
\r
2098 // Now, check we have enough sequences
\r
2099 SequenceI[] msa = null;
\r
2101 if ( (viewport.getSelectionGroup() != null) &&
\r
2102 (viewport.getSelectionGroup().getSize() > 1))
\r
2104 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2105 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2107 msa = new SequenceI[sz = seqs.getSize()];
\r
2109 for (int i = 0; i < sz; i++)
\r
2111 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2116 Vector seqs = viewport.getAlignment().getSequences();
\r
2118 if (seqs.size() > 1)
\r
2120 msa = new SequenceI[seqs.size()];
\r
2122 for (int i = 0; i < seqs.size(); i++)
\r
2124 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2132 * Decides what is submitted to a secondary structure prediction service,
\r
2133 * the currently selected sequence, or the currently selected alignment
\r
2134 * (where the first sequence in the set is the one that the prediction
\r
2137 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2139 SequenceI seq = null;
\r
2140 SequenceI[] msa = null;
\r
2142 if ( (viewport.getSelectionGroup() != null) &&
\r
2143 (viewport.getSelectionGroup().getSize() > 0))
\r
2145 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2146 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2148 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2150 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2155 msa = new SequenceI[sz = seqs.getSize()];
\r
2157 for (int i = 0; i < sz; i++)
\r
2159 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2165 Vector seqs = viewport.getAlignment().getSequences();
\r
2167 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2169 seq = (SequenceI) seqs.elementAt(0);
\r
2173 msa = new SequenceI[seqs.size()];
\r
2175 for (int i = 0; i < seqs.size(); i++)
\r
2177 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2189 return new SequenceI[]
\r
2199 * @param e DOCUMENT ME!
\r
2201 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2203 // Pick the tree file
\r
2204 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2206 "LAST_DIRECTORY"));
\r
2207 chooser.setFileView(new JalviewFileView());
\r
2208 chooser.setDialogTitle("Select a newick-like tree file");
\r
2209 chooser.setToolTipText("Load a tree file");
\r
2211 int value = chooser.showOpenDialog(null);
\r
2213 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2215 String choice = chooser.getSelectedFile().getPath();
\r
2216 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2220 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2222 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2224 catch (Exception ex)
\r
2226 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2227 "Problem reading tree file",
\r
2229 JOptionPane.WARNING_MESSAGE);
\r
2230 ex.printStackTrace();
\r
2236 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2238 return ShowNewickTree(nf,title,600,500,4,5);
\r
2243 * @param nf DOCUMENT ME!
\r
2244 * @param title DOCUMENT ME!
\r
2246 * @return DOCUMENT ME!
\r
2248 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2250 TreePanel tp = null;
\r
2256 if (nf.getTree() != null)
\r
2258 tp = new TreePanel(viewport,
\r
2259 viewport.getAlignment().getSequences(), nf,
\r
2266 tp.setLocation(x,y);
\r
2269 Desktop.addInternalFrame(tp, title, w, h);
\r
2270 addTreeMenuItem(tp, title);
\r
2273 catch (Exception ex)
\r
2275 ex.printStackTrace();
\r
2286 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2287 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2288 printJob.setPrintable(alignPanel, pf);
\r
2290 if (printJob.printDialog())
\r
2296 catch (Exception PrintException)
\r
2298 PrintException.printStackTrace();
\r
2305 * Generates menu items and listener event actions for web service clients
\r
2308 public void BuildWebServiceMenu()
\r
2310 if ( (Discoverer.services != null)
\r
2311 && (Discoverer.services.size() > 0))
\r
2313 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2314 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2315 Vector wsmenu = new Vector();
\r
2316 if (msaws != null)
\r
2318 // Add any Multiple Sequence Alignment Services
\r
2319 final JMenu msawsmenu = new JMenu("Alignment");
\r
2320 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2322 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2324 final JMenuItem method = new JMenuItem(sh.getName());
\r
2325 method.addActionListener(new ActionListener()
\r
2327 public void actionPerformed(ActionEvent e)
\r
2329 SequenceI[] msa = gatherSequencesForAlignment();
\r
2330 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2331 false, true, viewport.getAlignment().getDataset());
\r
2336 msawsmenu.add(method);
\r
2337 // Deal with services that we know accept partial alignments.
\r
2338 if (sh.getName().indexOf("lustal") > -1)
\r
2340 // We know that ClustalWS can accept partial alignments for refinement.
\r
2341 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2342 methodR.addActionListener(new ActionListener()
\r
2344 public void actionPerformed(ActionEvent e)
\r
2346 SequenceI[] msa = gatherSequencesForAlignment();
\r
2347 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2348 true, true, viewport.getAlignment().getDataset());
\r
2353 msawsmenu.add(methodR);
\r
2357 wsmenu.add(msawsmenu);
\r
2359 if (secstrpr != null)
\r
2361 // Add any secondary structure prediction services
\r
2362 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2363 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2365 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2367 final JMenuItem method = new JMenuItem(sh.getName());
\r
2368 method.addActionListener(new ActionListener()
\r
2370 public void actionPerformed(ActionEvent e)
\r
2372 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2373 if (msa.length == 1)
\r
2375 // Single Sequence prediction
\r
2376 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2380 if (msa.length > 1)
\r
2382 // Single Sequence prediction
\r
2383 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2389 secstrmenu.add(method);
\r
2391 wsmenu.add(secstrmenu);
\r
2393 this.webService.removeAll();
\r
2394 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2396 webService.add( (JMenu) wsmenu.get(i));
\r
2401 this.webService.removeAll();
\r
2402 this.webService.add(this.webServiceNoServices);
\r
2404 // TODO: add in rediscovery function
\r
2405 // TODO: reduce code redundancy.
\r
2406 // TODO: group services by location as well as function.
\r
2409 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2411 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2412 getProperty("LAST_DIRECTORY"));
\r
2414 chooser.setFileView(new JalviewFileView());
\r
2415 chooser.setDialogTitle("Export to Vamsas file");
\r
2416 chooser.setToolTipText("Export");
\r
2418 int value = chooser.showSaveDialog(this);
\r
2420 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2422 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2423 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2424 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2428 public void featureSettings_actionPerformed(ActionEvent e)
\r
2430 new FeatureSettings(viewport, alignPanel);
\r
2435 public void showTranslation_actionPerformed(ActionEvent e)
\r
2437 int s, sSize = viewport.alignment.getHeight();
\r
2438 SequenceI [] newSeq = new SequenceI[sSize];
\r
2441 StringBuffer protein;
\r
2443 for(s=0; s<sSize; s++)
\r
2445 protein = new StringBuffer();
\r
2446 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2447 resSize = seq.length();
\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 while ( (line = in.readLine()) != null)
\r
2562 st = new StringTokenizer(line, "\t");
\r
2563 if (st.countTokens() == 2)
\r
2565 type = st.nextToken();
\r
2566 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2567 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2571 while (st.hasMoreElements())
\r
2573 desc = st.nextToken();
\r
2574 token = st.nextToken();
\r
2575 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2577 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2582 index = Integer.parseInt(st.nextToken());
\r
2585 start = Integer.parseInt(st.nextToken());
\r
2586 end = Integer.parseInt(st.nextToken());
\r
2588 seq = viewport.alignment.getSequenceAt(index);
\r
2590 type = st.nextToken();
\r
2592 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2594 // Probably the old style groups file
\r
2595 UserColourScheme ucs = new UserColourScheme(type);
\r
2596 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2599 sf = new SequenceFeature(type, desc, "", start, end);
\r
2601 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2605 catch (Exception ex)
\r
2607 ex.printStackTrace();
\r
2608 System.out.println("Error parsing groups file: " + ex);
\r
2612 viewport.showSequenceFeatures = true;
\r
2613 alignPanel.repaint();
\r
2617 public void dragEnter(DropTargetDragEvent evt)
\r
2620 public void dragExit(DropTargetEvent evt)
\r
2623 public void dragOver(DropTargetDragEvent evt)
\r
2626 public void dropActionChanged(DropTargetDragEvent evt)
\r
2629 public void drop(DropTargetDropEvent evt)
\r
2631 Transferable t = evt.getTransferable();
\r
2632 java.util.List files = null;
\r
2636 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2637 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2639 //Works on Windows and MacOSX
\r
2640 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2641 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2643 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2645 // This is used by Unix drag system
\r
2646 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2647 String data = (String) t.getTransferData(uriListFlavor);
\r
2648 files = new java.util.ArrayList(1);
\r
2649 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2652 st.hasMoreTokens(); )
\r
2654 String s = st.nextToken();
\r
2655 if (s.startsWith("#"))
\r
2657 // the line is a comment (as per the RFC 2483)
\r
2661 java.net.URI uri = new java.net.URI(s);
\r
2662 java.io.File file = new java.io.File(uri);
\r
2667 catch (Exception e)
\r
2669 e.printStackTrace();
\r
2672 if (files != null)
\r
2676 boolean isAnnotation = false;
\r
2678 for (int i = 0; i < files.size(); i++)
\r
2680 String file = files.get(i).toString();
\r
2682 isAnnotation = new AnnotationReader().readAnnotationFile(viewport.alignment, file);
\r
2684 if( !isAnnotation )
\r
2686 boolean isGroupsFile = parseGroupsFile(file);
\r
2687 if (!isGroupsFile)
\r
2689 String protocol = "File";
\r
2690 String format = jalview.io.IdentifyFile.Identify(file, protocol);
\r
2691 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol, format);
\r
2693 FastaFile ff = new FastaFile();
\r
2694 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2695 c.setContents(new StringSelection(ff.print(sequences)), this);
\r
2697 this.paste(false);
\r
2705 int height = alignPanel.annotationPanel.adjustPanelHeight();
\r
2706 alignPanel.annotationScroller.setPreferredSize(
\r
2707 new Dimension(alignPanel.annotationScroller.getWidth(),
\r
2710 alignPanel.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
\r
2711 alignPanel.annotationSpaceFillerHolder.getWidth(),
\r
2714 alignPanel.addNotify();
\r
2717 catch (Exception ex)
\r
2719 ex.printStackTrace();
\r