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
42 * @version $Revision$
\r
44 public class AlignFrame
\r
47 /** DOCUMENT ME!! */
\r
48 public static final int NEW_WINDOW_WIDTH = 700;
\r
50 /** DOCUMENT ME!! */
\r
51 public static final int NEW_WINDOW_HEIGHT = 500;
\r
52 AlignmentPanel alignPanel;
\r
53 AlignViewport viewport;
\r
55 Vector viewports = new Vector();
\r
56 Vector alignPanels = new Vector();
\r
58 /** DOCUMENT ME!! */
\r
59 public String currentFileFormat = null;
\r
60 Stack historyList = new Stack();
\r
61 Stack redoList = new Stack();
\r
62 private int treeCount = 0;
\r
65 * Creates a new AlignFrame object.
\r
67 * @param al DOCUMENT ME!
\r
69 public AlignFrame(AlignmentI al)
\r
71 viewport = new AlignViewport(al);
\r
72 viewports.add(viewport);
\r
75 if(viewport.vconsensus==null)
\r
77 //Out of memory calculating consensus.
\r
78 BLOSUM62Colour.setEnabled(false);
\r
79 PIDColour.setEnabled(false);
\r
80 conservationMenuItem.setEnabled(false);
\r
81 modifyConservation.setEnabled(false);
\r
82 abovePIDThreshold.setEnabled(false);
\r
83 modifyPID.setEnabled(false);
\r
86 alignPanel = new AlignmentPanel(this, viewport);
\r
87 alignPanels.add(alignPanel);
\r
89 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
\r
91 if(sortby.equals("Id"))
\r
92 sortIDMenuItem_actionPerformed(null);
\r
93 else if(sortby.equals("Pairwise Identity"))
\r
94 sortPairwiseMenuItem_actionPerformed(null);
\r
96 tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
\r
99 /////////////////////////
\r
101 if(al.getDataset()==null)
\r
103 al.setDataset(null);
\r
106 AlignViewport ds = new AlignViewport(al.getDataset());
\r
107 ds.setDataset(true);
\r
108 AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
109 tabbedPane.add("Dataset", dap);
\r
111 alignPanels.add(dap);
\r
112 /////////////////////////
\r
115 viewport.addPropertyChangeListener(new PropertyChangeListener()
\r
117 public void propertyChange(PropertyChangeEvent evt)
\r
119 if (evt.getPropertyName().equals("alignment"))
\r
121 alignmentChanged();
\r
127 if(Desktop.desktop!=null)
\r
128 addServiceListeners();
\r
131 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
132 private void addServiceListeners()
\r
134 final java.beans.PropertyChangeListener thisListener;
\r
135 // Do this once to get current state
\r
136 BuildWebServiceMenu();
\r
137 Desktop.discoverer.addPropertyChangeListener(
\r
138 thisListener = new java.beans.PropertyChangeListener()
\r
140 public void propertyChange(PropertyChangeEvent evt)
\r
142 // System.out.println("Discoverer property change.");
\r
143 if (evt.getPropertyName().equals("services"))
\r
145 // System.out.println("Rebuilding web service menu");
\r
146 BuildWebServiceMenu();
\r
150 addInternalFrameListener(new javax.swing.event.
\r
151 InternalFrameAdapter()
\r
153 public void internalFrameClosed(
\r
154 javax.swing.event.InternalFrameEvent evt)
\r
156 // System.out.println("deregistering discoverer listener");
\r
157 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
158 closeMenuItem_actionPerformed(null);
\r
168 * @param String DOCUMENT ME!
\r
171 public void parseGroupsFile(String file)
\r
175 BufferedReader in = new BufferedReader(new FileReader(file));
\r
176 SequenceI seq = null;
\r
177 String line, type, desc, token;
\r
179 int index, start, end;
\r
180 StringTokenizer st;
\r
181 SequenceFeature sf;
\r
182 FeatureRenderer fr = alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
\r
184 while ( (line = in.readLine()) != null)
\r
187 st = new StringTokenizer(line, "\t");
\r
188 if (st.countTokens() == 2)
\r
190 type = st.nextToken();
\r
191 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
192 fr.setColour(type, ucs.findColour("A"));
\r
196 while (st.hasMoreElements())
\r
198 desc = st.nextToken();
\r
199 token = st.nextToken();
\r
200 if (!token.equals("ID_NOT_SPECIFIED"))
\r
202 index = viewport.alignment.findIndex(viewport.alignment.findName(
\r
208 index = Integer.parseInt(st.nextToken());
\r
211 start = Integer.parseInt(st.nextToken());
\r
212 end = Integer.parseInt(st.nextToken());
\r
214 seq = viewport.alignment.getSequenceAt(index);
\r
215 start = seq.findIndex(start) - 1;
\r
216 end = seq.findIndex(end) - 1;
\r
218 type = st.nextToken();
\r
220 sf = new SequenceFeature(type, desc, "", start, end);
\r
222 seq.addSequenceFeature(sf);
\r
224 System.out.println(sf.getType()+" "+sf.getBegin());
\r
226 // sg = new SequenceGroup(text, ucs, true, true, false, start, end);
\r
227 // sg.addSequence(seq, false);
\r
229 // viewport.alignment.addGroup(sg);
\r
234 viewport.showSequenceFeatures = true;
\r
235 ((Alignment)viewport.alignment).featuresAdded = true;
\r
237 alignPanel.repaint();
\r
240 catch (Exception ex)
\r
242 System.out.println("Error parsing groups file: " + ex);
\r
249 * @param e DOCUMENT ME!
\r
251 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
253 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
258 "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",
\r
263 "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"
\r
264 }, currentFileFormat);
\r
266 chooser.setAcceptAllFileFilterUsed(false);
\r
267 chooser.setFileView(new JalviewFileView());
\r
268 chooser.setDialogTitle("Save Alignment to file");
\r
269 chooser.setToolTipText("Save");
\r
271 int value = chooser.showSaveDialog(this);
\r
273 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
275 currentFileFormat = chooser.getSelectedFormat();
\r
277 if (currentFileFormat == null)
\r
279 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
280 "You must select a file format before saving!",
\r
281 "File format not specified",
\r
282 JOptionPane.WARNING_MESSAGE);
\r
283 value = chooser.showSaveDialog(this);
\r
287 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
288 currentFileFormat);
\r
290 String choice = chooser.getSelectedFile().getPath();
\r
291 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
293 saveAlignment(choice, currentFileFormat);
\r
297 public boolean saveAlignment(String file, String format)
\r
299 if (format.equalsIgnoreCase("Jalview"))
\r
301 String shortName = title;
\r
303 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
305 shortName = shortName.substring(shortName.lastIndexOf(
\r
306 java.io.File.separatorChar) + 1);
\r
309 Jalview2XML.SaveAlignment(this, file, shortName);
\r
311 // USE Jalview2XML to save this file
\r
316 String output = new FormatAdapter().formatSequences(format,
\r
317 viewport.getAlignment().
\r
319 if (output == null)
\r
326 java.io.PrintWriter out = new java.io.PrintWriter(
\r
327 new java.io.FileWriter(file));
\r
333 catch (Exception ex)
\r
335 ex.printStackTrace();
\r
344 * @param e DOCUMENT ME!
\r
346 protected void outputText_actionPerformed(ActionEvent e)
\r
348 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
349 Desktop.addInternalFrame(cap,
\r
350 "Alignment output - " + e.getActionCommand(), 600,
\r
352 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
353 viewport.getAlignment().
\r
360 * @param e DOCUMENT ME!
\r
362 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
364 new HTMLOutput(viewport);
\r
367 public void createImageMap(File file, String image)
\r
369 alignPanel.makePNGImageMap(file, image);
\r
375 * @param e DOCUMENT ME!
\r
377 public void createPNG(File f)
\r
379 alignPanel.makePNG(f);
\r
385 * @param e DOCUMENT ME!
\r
387 public void createEPS(File f)
\r
389 alignPanel.makeEPS(f);
\r
395 * @param e DOCUMENT ME!
\r
397 public void printMenuItem_actionPerformed(ActionEvent e)
\r
399 //Putting in a thread avoids Swing painting problems
\r
400 PrintThread thread = new PrintThread();
\r
407 * @param e DOCUMENT ME!
\r
409 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
413 PaintRefresher.components.remove(viewport.alignment);
\r
414 this.setClosed(true);
\r
416 catch (Exception ex)
\r
424 void updateEditMenuBar()
\r
426 if (historyList.size() > 0)
\r
428 undoMenuItem.setEnabled(true);
\r
430 HistoryItem hi = (HistoryItem) historyList.peek();
\r
431 undoMenuItem.setText("Undo " + hi.getDescription());
\r
435 undoMenuItem.setEnabled(false);
\r
436 undoMenuItem.setText("Undo");
\r
439 if (redoList.size() > 0)
\r
441 redoMenuItem.setEnabled(true);
\r
443 HistoryItem hi = (HistoryItem) redoList.peek();
\r
444 redoMenuItem.setText("Redo " + hi.getDescription());
\r
448 redoMenuItem.setEnabled(false);
\r
449 redoMenuItem.setText("Redo");
\r
456 * @param hi DOCUMENT ME!
\r
458 public void addHistoryItem(HistoryItem hi)
\r
460 historyList.push(hi);
\r
461 updateEditMenuBar();
\r
467 * @param e DOCUMENT ME!
\r
469 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
471 HistoryItem hi = (HistoryItem) historyList.pop();
\r
472 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
473 HistoryItem.HIDE));
\r
474 restoreHistoryItem(hi);
\r
475 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
481 * @param e DOCUMENT ME!
\r
483 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
485 HistoryItem hi = (HistoryItem) redoList.pop();
\r
486 restoreHistoryItem(hi);
\r
487 updateEditMenuBar();
\r
488 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
491 // used by undo and redo
\r
492 void restoreHistoryItem(HistoryItem hi)
\r
494 if (hi.getType() == HistoryItem.SORT)
\r
496 for (int i = 0; i < hi.getSequences().size(); i++)
\r
498 viewport.alignment.getSequences().setElementAt(hi.getSequences()
\r
505 for (int i = 0; i < hi.getSequences().size(); i++)
\r
507 SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);
\r
509 if (restore.getLength() == 0)
\r
511 restore.setSequence(hi.getHidden().elementAt(i).toString());
\r
512 viewport.alignment.getSequences().insertElementAt(restore,
\r
513 hi.getAlignIndex(i));
\r
517 restore.setSequence(hi.getHidden().elementAt(i).toString());
\r
521 if (hi.getType() == HistoryItem.PASTE)
\r
523 for (int i = viewport.alignment.getHeight() - 1;
\r
524 i > (hi.getSequences().size() - 1); i--)
\r
526 viewport.alignment.deleteSequence(i);
\r
531 updateEditMenuBar();
\r
533 viewport.firePropertyChange("alignment", null,
\r
534 viewport.getAlignment().getSequences());
\r
540 * @param up DOCUMENT ME!
\r
542 public void moveSelectedSequences(boolean up)
\r
544 SequenceGroup sg = viewport.getSelectionGroup();
\r
553 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
555 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
557 if (!sg.sequences.contains(seq))
\r
562 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
564 if (sg.sequences.contains(temp))
\r
569 viewport.alignment.getSequences().setElementAt(temp, i);
\r
570 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
575 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
577 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
579 if (!sg.sequences.contains(seq))
\r
584 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
586 if (sg.sequences.contains(temp))
\r
591 viewport.alignment.getSequences().setElementAt(temp, i);
\r
592 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
596 alignPanel.repaint();
\r
602 * @param e DOCUMENT ME!
\r
604 protected void copy_actionPerformed(ActionEvent e)
\r
606 if (viewport.getSelectionGroup() == null)
\r
608 System.out.println("null here");
\r
612 SequenceGroup sg = viewport.getSelectionGroup();
\r
614 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
616 Hashtable orderedSeqs = new Hashtable();
\r
617 SequenceI [] seqs = new SequenceI[sg.getSize()];
\r
619 for (int i = 0; i < sg.getSize(); i++)
\r
621 SequenceI seq = sg.getSequenceAt(i);
\r
622 int index = viewport.alignment.findIndex(seq);
\r
623 orderedSeqs.put(index + "", seq);
\r
626 int index = 0, startRes, endRes;
\r
629 for (int i = 0; i < sg.getSize(); i++)
\r
631 SequenceI seq = null;
\r
633 while (seq == null)
\r
635 if (orderedSeqs.containsKey(index + ""))
\r
637 seq = (SequenceI) orderedSeqs.get(index + "");
\r
650 //Returns residue following index if gap
\r
651 startRes = seq.findPosition(sg.getStartRes());
\r
654 //Need to find the residue preceeding index if gap
\r
657 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
659 ch = seq.getCharAt(j);
\r
660 if (!jalview.util.Comparison.isGap( (ch)))
\r
668 endRes += seq.getStart() - 1;
\r
671 seqs[i] = new Sequence(seq.getName(),
\r
672 seq.getSequence(sg.getStartRes(), sg.getEndRes()+1),
\r
677 c.setContents(new StringSelection(new FastaFile().print(seqs)), null);
\r
683 * @param e DOCUMENT ME!
\r
685 protected void pasteNew_actionPerformed(ActionEvent e)
\r
693 * @param e DOCUMENT ME!
\r
695 protected void pasteThis_actionPerformed(ActionEvent e)
\r
697 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
698 HistoryItem.PASTE));
\r
705 * @param newAlignment DOCUMENT ME!
\r
707 void paste(boolean newAlignment)
\r
711 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
712 Transferable contents = c.getContents(this);
\r
714 if (contents == null)
\r
719 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
723 String format = IdentifyFile.Identify(str, "Paste");
\r
724 SequenceI[] sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
729 Alignment alignment = new Alignment(sequences);
\r
730 alignment.setDataset( viewport.alignment.getDataset() );
\r
731 AlignFrame af = new AlignFrame(alignment);
\r
732 String newtitle = new String("Copied sequences");
\r
734 if (title.startsWith("Copied sequences"))
\r
740 newtitle = newtitle.concat("- from " + title);
\r
743 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
744 NEW_WINDOW_HEIGHT);
\r
749 for (int i = 0; i < sequences.length; i++)
\r
750 viewport.alignment.addSequence(sequences[i]);
\r
752 viewport.setEndSeq(viewport.alignment.getHeight());
\r
753 viewport.alignment.getWidth();
\r
754 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
757 catch (Exception ex)
\r
759 // could be anything being pasted in here
\r
768 * @param e DOCUMENT ME!
\r
770 protected void cut_actionPerformed(ActionEvent e)
\r
772 copy_actionPerformed(null);
\r
773 delete_actionPerformed(null);
\r
779 * @param e DOCUMENT ME!
\r
781 protected void delete_actionPerformed(ActionEvent e)
\r
784 if (viewport.getSelectionGroup() == null)
\r
789 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
790 HistoryItem.HIDE));
\r
792 SequenceGroup sg = viewport.getSelectionGroup();
\r
793 boolean allSequences = false;
\r
794 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
796 allSequences = true;
\r
799 for (int i = 0; i < sg.sequences.size(); i++)
\r
801 SequenceI seq = sg.getSequenceAt(i);
\r
802 int index = viewport.getAlignment().findIndex(seq);
\r
803 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
805 // If the cut affects all sequences, remove highlighted columns
\r
808 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
809 sg.getEndRes() + 1);
\r
812 if (seq.getSequence().length() < 1)
\r
814 viewport.getAlignment().deleteSequence(seq);
\r
818 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
822 viewport.setSelectionGroup(null);
\r
823 viewport.alignment.deleteGroup(sg);
\r
825 viewport.firePropertyChange("alignment", null,
\r
826 viewport.getAlignment().getSequences());
\r
830 if (viewport.getAlignment().getHeight() < 1)
\r
834 this.setClosed(true);
\r
836 catch (Exception ex)
\r
845 * @param e DOCUMENT ME!
\r
847 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
849 viewport.alignment.deleteAllGroups();
\r
850 viewport.setSelectionGroup(null);
\r
851 alignPanel.repaint();
\r
857 * @param e DOCUMENT ME!
\r
859 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
861 SequenceGroup sg = new SequenceGroup();
\r
863 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
866 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
869 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
870 viewport.setSelectionGroup(sg);
\r
871 PaintRefresher.Refresh(null, viewport.alignment);
\r
877 * @param e DOCUMENT ME!
\r
879 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
881 viewport.setSelectionGroup(null);
\r
882 viewport.getColumnSelection().clear();
\r
883 viewport.setSelectionGroup(null);
\r
884 alignPanel.annotationPanel.activeRes = null;
\r
885 PaintRefresher.Refresh(null, viewport.alignment);
\r
891 * @param e DOCUMENT ME!
\r
893 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
895 SequenceGroup sg = viewport.getSelectionGroup();
\r
899 selectAllSequenceMenuItem_actionPerformed(null);
\r
904 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
907 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
910 PaintRefresher.Refresh(null, viewport.alignment);
\r
916 * @param e DOCUMENT ME!
\r
918 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
920 ColumnSelection colSel = viewport.getColumnSelection();
\r
922 if (colSel.size() > 0)
\r
924 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
925 HistoryItem.HIDE));
\r
927 int min = colSel.getMin();
\r
928 viewport.getAlignment().trimLeft(min);
\r
929 colSel.compensateForEdit(0, min);
\r
931 if (viewport.getSelectionGroup() != null)
\r
933 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
936 Vector groups = viewport.alignment.getGroups();
\r
938 for (int i = 0; i < groups.size(); i++)
\r
940 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
942 if (!sg.adjustForRemoveLeft(min))
\r
944 viewport.alignment.deleteGroup(sg);
\r
948 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
955 * @param e DOCUMENT ME!
\r
957 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
959 ColumnSelection colSel = viewport.getColumnSelection();
\r
961 if (colSel.size() > 0)
\r
963 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
964 HistoryItem.HIDE));
\r
966 int max = colSel.getMax();
\r
967 viewport.getAlignment().trimRight(max);
\r
969 if (viewport.getSelectionGroup() != null)
\r
971 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
974 Vector groups = viewport.alignment.getGroups();
\r
976 for (int i = 0; i < groups.size(); i++)
\r
978 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
980 if (!sg.adjustForRemoveRight(max))
\r
982 viewport.alignment.deleteGroup(sg);
\r
986 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
993 * @param e DOCUMENT ME!
\r
995 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
997 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
998 viewport.alignment, HistoryItem.HIDE));
\r
1000 //This is to maintain viewport position on first residue
\r
1001 //of first sequence
\r
1002 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1003 int startRes = seq.findPosition(viewport.startRes);
\r
1005 viewport.getAlignment().removeGaps();
\r
1007 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1009 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1015 * @param e DOCUMENT ME!
\r
1017 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1019 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1020 HistoryItem.HIDE));
\r
1022 //This is to maintain viewport position on first residue
\r
1023 //of first sequence
\r
1024 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1025 int startRes = seq.findPosition(viewport.startRes);
\r
1028 SequenceI current;
\r
1031 Vector seqs = null;
\r
1034 int end = viewport.alignment.getWidth();
\r
1036 if (viewport.getSelectionGroup() != null
\r
1037 && viewport.getSelectionGroup().sequences != null
\r
1038 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1040 seqs = viewport.getSelectionGroup().sequences;
\r
1041 start = viewport.getSelectionGroup().getStartRes();
\r
1042 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1046 seqs = viewport.alignment.getSequences();
\r
1049 for (int i = 0; i < seqs.size(); i++)
\r
1051 current = (SequenceI) seqs.elementAt(i);
\r
1052 jSize = current.getLength();
\r
1054 // Removing a range is much quicker than removing gaps
\r
1055 // one by one for long sequences
\r
1057 int rangeStart=-1, rangeEnd=-1;
\r
1061 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1063 if(rangeStart==-1)
\r
1078 current.deleteChars(rangeStart, rangeEnd);
\r
1079 j-=rangeEnd-rangeStart;
\r
1080 jSize-=rangeEnd-rangeStart;
\r
1088 while (j < end && j < jSize);
\r
1091 current.deleteChars(rangeStart, rangeEnd);
\r
1095 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1097 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1100 public void alignmentChanged()
\r
1102 if(viewport.vconsensus!=null)
\r
1104 viewport.updateConsensus();
\r
1105 viewport.updateConservation();
\r
1107 resetAllColourSchemes();
\r
1108 if(alignPanel.overviewPanel!=null)
\r
1109 alignPanel.overviewPanel.updateOverviewImage();
\r
1111 Provenance prov = viewport.alignment.getProvenance();
\r
1114 prov = new Provenance();
\r
1115 viewport.alignment.setProvenance(prov);
\r
1118 prov.addEntry("Me",
\r
1119 "Edited in Jalview", new java.util.Date(), "myID");
\r
1121 alignPanel.repaint();
\r
1124 void resetAllColourSchemes()
\r
1126 ColourSchemeI cs = viewport.globalColourScheme;
\r
1129 if (cs instanceof ClustalxColourScheme)
\r
1131 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1132 resetClustalX(viewport.alignment.getSequences(),
\r
1133 viewport.alignment.getWidth());
\r
1136 cs.setConsensus(viewport.vconsensus);
\r
1137 if (cs.conservationApplied())
\r
1139 Alignment al = (Alignment) viewport.alignment;
\r
1140 Conservation c = new Conservation("All",
\r
1141 ResidueProperties.propHash, 3,
\r
1142 al.getSequences(), 0,
\r
1143 al.getWidth() - 1);
\r
1145 c.verdict(false, viewport.ConsPercGaps);
\r
1147 cs.setConservation(c);
\r
1151 int s, sSize = viewport.alignment.getGroups().size();
\r
1152 for(s=0; s<sSize; s++)
\r
1154 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1155 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1157 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1159 sg.recalcConservation();
\r
1166 * @param e DOCUMENT ME!
\r
1168 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1170 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1171 HistoryItem.HIDE));
\r
1173 SequenceI current;
\r
1174 int Width = viewport.getAlignment().getWidth();
\r
1176 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
1179 current = viewport.getAlignment().getSequenceAt(i);
\r
1181 if (current.getLength() < Width)
\r
1183 current.insertCharAt(Width - 1, viewport.getGapCharacter());
\r
1187 alignmentChanged();
\r
1193 * @param e DOCUMENT ME!
\r
1195 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1197 JInternalFrame frame = new JInternalFrame();
\r
1198 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1199 frame.setContentPane(finder);
\r
1200 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1201 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1207 * @param e DOCUMENT ME!
\r
1209 public void font_actionPerformed(ActionEvent e)
\r
1211 new FontChooser(alignPanel);
\r
1217 * @param e DOCUMENT ME!
\r
1219 protected void fullSeqId_actionPerformed(ActionEvent e)
\r
1221 viewport.setShowFullId(fullSeqId.isSelected());
\r
1223 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1224 alignPanel.repaint();
\r
1230 * @param e DOCUMENT ME!
\r
1232 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1234 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1235 alignPanel.repaint();
\r
1241 * @param e DOCUMENT ME!
\r
1243 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1245 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1246 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1247 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1248 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1249 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1250 alignPanel.repaint();
\r
1256 * @param e DOCUMENT ME!
\r
1258 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1260 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1261 alignPanel.repaint();
\r
1267 * @param e DOCUMENT ME!
\r
1269 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1271 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1272 alignPanel.repaint();
\r
1278 * @param e DOCUMENT ME!
\r
1280 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1282 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1283 alignPanel.repaint();
\r
1289 * @param e DOCUMENT ME!
\r
1291 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1293 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1294 alignPanel.repaint();
\r
1300 * @param e DOCUMENT ME!
\r
1302 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1304 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1305 alignPanel.repaint();
\r
1311 * @param e DOCUMENT ME!
\r
1313 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1315 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1316 alignPanel.repaint();
\r
1322 * @param evt DOCUMENT ME!
\r
1324 public void sequenceFeatures_actionPerformed(ActionEvent evt)
\r
1326 viewport.showSequenceFeatures(sequenceFeatures.isSelected());
\r
1328 if (viewport.showSequenceFeatures &&
\r
1329 ! ( (Alignment) viewport.alignment).featuresAdded)
\r
1331 new SequenceFeatureFetcher(viewport.
\r
1336 featureSettings.setEnabled(true);
\r
1338 alignPanel.repaint();
\r
1344 * @param e DOCUMENT ME!
\r
1346 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1348 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1349 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1355 * @param e DOCUMENT ME!
\r
1357 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1359 if (alignPanel.overviewPanel != null)
\r
1364 JInternalFrame frame = new JInternalFrame();
\r
1365 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1366 frame.setContentPane(overview);
\r
1367 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1368 frame.getWidth(), frame.getHeight());
\r
1370 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1371 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1373 public void internalFrameClosed(
\r
1374 javax.swing.event.InternalFrameEvent evt)
\r
1376 alignPanel.setOverviewPanel(null);
\r
1381 alignPanel.setOverviewPanel(overview);
\r
1387 * @param e DOCUMENT ME!
\r
1389 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1391 changeColour(null);
\r
1397 * @param e DOCUMENT ME!
\r
1399 public void clustalColour_actionPerformed(ActionEvent e)
\r
1401 changeColour(new ClustalxColourScheme(
\r
1402 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1408 * @param e DOCUMENT ME!
\r
1410 public void zappoColour_actionPerformed(ActionEvent e)
\r
1412 changeColour(new ZappoColourScheme());
\r
1418 * @param e DOCUMENT ME!
\r
1420 public void taylorColour_actionPerformed(ActionEvent e)
\r
1422 changeColour(new TaylorColourScheme());
\r
1428 * @param e DOCUMENT ME!
\r
1430 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1432 changeColour(new HydrophobicColourScheme());
\r
1438 * @param e DOCUMENT ME!
\r
1440 public void helixColour_actionPerformed(ActionEvent e)
\r
1442 changeColour(new HelixColourScheme());
\r
1448 * @param e DOCUMENT ME!
\r
1450 public void strandColour_actionPerformed(ActionEvent e)
\r
1452 changeColour(new StrandColourScheme());
\r
1458 * @param e DOCUMENT ME!
\r
1460 public void turnColour_actionPerformed(ActionEvent e)
\r
1462 changeColour(new TurnColourScheme());
\r
1468 * @param e DOCUMENT ME!
\r
1470 public void buriedColour_actionPerformed(ActionEvent e)
\r
1472 changeColour(new BuriedColourScheme());
\r
1478 * @param e DOCUMENT ME!
\r
1480 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1482 changeColour(new NucleotideColourScheme());
\r
1488 * @param e DOCUMENT ME!
\r
1490 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1492 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1498 * @param cs DOCUMENT ME!
\r
1500 void changeColour(ColourSchemeI cs)
\r
1502 int threshold = 0;
\r
1506 if (viewport.getAbovePIDThreshold())
\r
1508 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1511 cs.setThreshold(threshold,
\r
1512 viewport.getIgnoreGapsConsensus());
\r
1514 viewport.setGlobalColourScheme(cs);
\r
1518 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1521 if (viewport.getConservationSelected())
\r
1524 Alignment al = (Alignment) viewport.alignment;
\r
1525 Conservation c = new Conservation("All",
\r
1526 ResidueProperties.propHash, 3,
\r
1527 al.getSequences(), 0,
\r
1528 al.getWidth() - 1);
\r
1531 c.verdict(false, viewport.ConsPercGaps);
\r
1533 cs.setConservation(c);
\r
1535 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1540 cs.setConservation(null);
\r
1543 cs.setConsensus(viewport.vconsensus);
\r
1546 viewport.setGlobalColourScheme(cs);
\r
1548 if (viewport.getColourAppliesToAllGroups())
\r
1550 Vector groups = viewport.alignment.getGroups();
\r
1552 for (int i = 0; i < groups.size(); i++)
\r
1554 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1562 if (cs instanceof ClustalxColourScheme)
\r
1564 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1566 else if (cs instanceof UserColourScheme)
\r
1568 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1574 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1576 catch (Exception ex)
\r
1581 if (viewport.getAbovePIDThreshold()
\r
1582 || cs instanceof PIDColourScheme
\r
1583 || cs instanceof Blosum62ColourScheme)
\r
1585 sg.cs.setThreshold(threshold,
\r
1586 viewport.getIgnoreGapsConsensus());
\r
1588 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1592 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1595 if (viewport.getConservationSelected())
\r
1597 Conservation c = new Conservation("Group",
\r
1598 ResidueProperties.propHash, 3,
\r
1600 viewport.alignment.getWidth() - 1);
\r
1602 c.verdict(false, viewport.ConsPercGaps);
\r
1603 sg.cs.setConservation(c);
\r
1606 sg.cs.setConservation(null);
\r
1610 if (alignPanel.getOverviewPanel() != null)
\r
1612 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1615 alignPanel.repaint();
\r
1621 * @param e DOCUMENT ME!
\r
1623 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1625 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1627 SliderPanel.setPIDSliderSource(alignPanel,
\r
1628 viewport.getGlobalColourScheme(),
\r
1630 SliderPanel.showPIDSlider();
\r
1637 * @param e DOCUMENT ME!
\r
1639 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1641 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1643 SliderPanel.setConservationSlider(alignPanel,
\r
1644 viewport.globalColourScheme,
\r
1646 SliderPanel.showConservationSlider();
\r
1653 * @param e DOCUMENT ME!
\r
1655 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1657 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1659 viewport.setAbovePIDThreshold(false);
\r
1660 abovePIDThreshold.setSelected(false);
\r
1662 changeColour(viewport.getGlobalColourScheme());
\r
1664 modifyConservation_actionPerformed(null);
\r
1670 * @param e DOCUMENT ME!
\r
1672 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1674 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1676 conservationMenuItem.setSelected(false);
\r
1677 viewport.setConservationSelected(false);
\r
1679 changeColour(viewport.getGlobalColourScheme());
\r
1681 modifyPID_actionPerformed(null);
\r
1687 * @param e DOCUMENT ME!
\r
1689 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1691 if (e.getActionCommand().equals("User Defined..."))
\r
1693 new UserDefinedColours(alignPanel, null);
\r
1697 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1698 getUserColourSchemes().get(e.getActionCommand());
\r
1700 changeColour(udc);
\r
1704 public void updateUserColourMenu()
\r
1707 Component[] menuItems = colourMenu.getMenuComponents();
\r
1708 int i, iSize = menuItems.length;
\r
1709 for (i = 0; i < iSize; i++)
\r
1711 if (menuItems[i].getName() != null &&
\r
1712 menuItems[i].getName().equals("USER_DEFINED"))
\r
1714 colourMenu.remove(menuItems[i]);
\r
1718 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1720 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1721 getUserColourSchemes().keys();
\r
1723 while (userColours.hasMoreElements())
\r
1725 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1726 nextElement().toString());
\r
1727 radioItem.setName("USER_DEFINED");
\r
1728 radioItem.addMouseListener(new MouseAdapter()
\r
1730 public void mousePressed(MouseEvent evt)
\r
1732 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1734 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1736 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1737 "Remove from default list?",
\r
1738 "Remove user defined colour",
\r
1739 JOptionPane.YES_NO_OPTION);
\r
1740 if(option == JOptionPane.YES_OPTION)
\r
1742 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1743 colourMenu.remove(radioItem);
\r
1746 radioItem.addActionListener(new ActionListener()
\r
1748 public void actionPerformed(ActionEvent evt)
\r
1750 userDefinedColour_actionPerformed(evt);
\r
1756 radioItem.addActionListener(new ActionListener()
\r
1758 public void actionPerformed(ActionEvent evt)
\r
1760 userDefinedColour_actionPerformed(evt);
\r
1764 colourMenu.insert(radioItem, 15);
\r
1765 colours.add(radioItem);
\r
1773 * @param e DOCUMENT ME!
\r
1775 public void PIDColour_actionPerformed(ActionEvent e)
\r
1777 changeColour(new PIDColourScheme());
\r
1783 * @param e DOCUMENT ME!
\r
1785 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1787 changeColour(new Blosum62ColourScheme());
\r
1793 * @param e DOCUMENT ME!
\r
1795 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1797 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1798 HistoryItem.SORT));
\r
1799 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1800 viewport.getAlignment().getSequenceAt(0));
\r
1801 alignPanel.repaint();
\r
1807 * @param e DOCUMENT ME!
\r
1809 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1811 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1812 HistoryItem.SORT));
\r
1813 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1814 alignPanel.repaint();
\r
1820 * @param e DOCUMENT ME!
\r
1822 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1824 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1825 HistoryItem.SORT));
\r
1827 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1828 alignPanel.repaint();
\r
1834 * @param e DOCUMENT ME!
\r
1836 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1838 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1839 JInternalFrame frame = new JInternalFrame();
\r
1840 frame.setContentPane(sp);
\r
1841 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1848 * @param e DOCUMENT ME!
\r
1850 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1852 if ( (viewport.getSelectionGroup() == null) ||
\r
1853 (viewport.getSelectionGroup().getSize() < 2))
\r
1855 JOptionPane.showInternalMessageDialog(this,
\r
1856 "You must select at least 2 sequences.",
\r
1857 "Invalid Selection",
\r
1858 JOptionPane.WARNING_MESSAGE);
\r
1862 JInternalFrame frame = new JInternalFrame();
\r
1863 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1864 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1871 * @param e DOCUMENT ME!
\r
1873 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1875 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1876 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1877 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1878 (viewport.getAlignment().getHeight() < 4))
\r
1880 JOptionPane.showInternalMessageDialog(this,
\r
1881 "Principal component analysis must take\n" +
\r
1882 "at least 4 input sequences.",
\r
1883 "Sequence selection insufficient",
\r
1884 JOptionPane.WARNING_MESSAGE);
\r
1889 new PCAPanel(viewport);
\r
1895 * @param e DOCUMENT ME!
\r
1897 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1899 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1905 * @param e DOCUMENT ME!
\r
1907 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1909 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1915 * @param e DOCUMENT ME!
\r
1917 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1919 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1925 * @param e DOCUMENT ME!
\r
1927 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1929 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1935 * @param type DOCUMENT ME!
\r
1936 * @param pwType DOCUMENT ME!
\r
1937 * @param title DOCUMENT ME!
\r
1939 void NewTreePanel(String type, String pwType, String title)
\r
1941 final TreePanel tp;
\r
1943 if ( (viewport.getSelectionGroup() != null) &&
\r
1944 (viewport.getSelectionGroup().getSize() > 3))
\r
1947 SequenceGroup sg = viewport.getSelectionGroup();
\r
1949 /* Decide if the selection is a column region */
\r
1950 while (s < sg.sequences.size())
\r
1952 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
1955 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1956 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
1957 "Try using the Pad function in the edit menu,\n" +
\r
1958 "or one of the multiple sequence alignment web services.",
\r
1959 "Sequences in selection are not aligned",
\r
1960 JOptionPane.WARNING_MESSAGE);
\r
1966 title = title + " on region";
\r
1967 tp = new TreePanel(viewport,
\r
1968 viewport.getSelectionGroup().sequences, type, pwType,
\r
1969 sg.getStartRes(), sg.getEndRes());
\r
1973 //are the sequences aligned?
\r
1974 if (!viewport.alignment.isAligned())
\r
1976 JOptionPane.showMessageDialog(Desktop.desktop,
\r
1977 "The sequences must be aligned before creating a tree.\n" +
\r
1978 "Try using the Pad function in the edit menu,\n" +
\r
1979 "or one of the multiple sequence alignment web services.",
\r
1980 "Sequences not aligned",
\r
1981 JOptionPane.WARNING_MESSAGE);
\r
1986 tp = new TreePanel(viewport,
\r
1987 viewport.getAlignment().getSequences(), type, pwType,
\r
1989 viewport.alignment.getWidth());
\r
1992 addTreeMenuItem(tp, title);
\r
1993 viewport.setCurrentTree(tp.getTree());
\r
1995 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2001 * @param title DOCUMENT ME!
\r
2002 * @param order DOCUMENT ME!
\r
2004 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2006 final JMenuItem item = new JMenuItem("by " + title);
\r
2008 item.addActionListener(new java.awt.event.ActionListener()
\r
2010 public void actionPerformed(ActionEvent e)
\r
2012 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2013 HistoryItem.SORT));
\r
2015 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2016 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2017 alignPanel.repaint();
\r
2023 * Maintain the Order by->Displayed Tree menu.
\r
2024 * Creates a new menu item for a TreePanel with an appropriate
\r
2025 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2026 * to remove the menu item when the treePanel is closed, and adjust
\r
2027 * the tree leaf to sequence mapping when the alignment is modified.
\r
2028 * @param treePanel Displayed tree window.
\r
2029 * @param title SortBy menu item title.
\r
2031 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2033 final JMenuItem item = new JMenuItem(title);
\r
2037 if (treeCount == 1)
\r
2039 sort.add(sortByTreeMenu);
\r
2042 sortByTreeMenu.add(item);
\r
2043 item.addActionListener(new java.awt.event.ActionListener()
\r
2045 public void actionPerformed(ActionEvent e)
\r
2047 addHistoryItem(new HistoryItem("Tree Sort",
\r
2048 viewport.alignment, HistoryItem.SORT));
\r
2049 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2050 treePanel.getTree());
\r
2051 alignPanel.repaint();
\r
2055 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2056 InternalFrameAdapter()
\r
2058 public void internalFrameClosed(
\r
2059 javax.swing.event.InternalFrameEvent evt)
\r
2062 sortByTreeMenu.remove(item);
\r
2064 if (treeCount == 0)
\r
2066 sort.remove(sortByTreeMenu);
\r
2074 * Work out whether the whole set of sequences
\r
2075 * or just the selected set will be submitted for multiple alignment.
\r
2078 private SequenceI[] gatherSequencesForAlignment()
\r
2080 // Now, check we have enough sequences
\r
2081 SequenceI[] msa = null;
\r
2083 if ( (viewport.getSelectionGroup() != null) &&
\r
2084 (viewport.getSelectionGroup().getSize() > 1))
\r
2086 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2087 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2089 msa = new SequenceI[sz = seqs.getSize()];
\r
2091 for (int i = 0; i < sz; i++)
\r
2093 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2098 Vector seqs = viewport.getAlignment().getSequences();
\r
2100 if (seqs.size() > 1)
\r
2102 msa = new SequenceI[seqs.size()];
\r
2104 for (int i = 0; i < seqs.size(); i++)
\r
2106 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2114 * Decides what is submitted to a secondary structure prediction service,
\r
2115 * the currently selected sequence, or the currently selected alignment
\r
2116 * (where the first sequence in the set is the one that the prediction
\r
2119 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2121 SequenceI seq = null;
\r
2122 SequenceI[] msa = null;
\r
2124 if ( (viewport.getSelectionGroup() != null) &&
\r
2125 (viewport.getSelectionGroup().getSize() > 0))
\r
2127 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2128 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2130 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2132 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2137 msa = new SequenceI[sz = seqs.getSize()];
\r
2139 for (int i = 0; i < sz; i++)
\r
2141 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2147 Vector seqs = viewport.getAlignment().getSequences();
\r
2149 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2151 seq = (SequenceI) seqs.elementAt(0);
\r
2155 msa = new SequenceI[seqs.size()];
\r
2157 for (int i = 0; i < seqs.size(); i++)
\r
2159 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2171 return new SequenceI[]
\r
2181 * @param e DOCUMENT ME!
\r
2183 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2185 // Pick the tree file
\r
2186 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2188 "LAST_DIRECTORY"));
\r
2189 chooser.setFileView(new JalviewFileView());
\r
2190 chooser.setDialogTitle("Select a newick-like tree file");
\r
2191 chooser.setToolTipText("Load a tree file");
\r
2193 int value = chooser.showOpenDialog(null);
\r
2195 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2197 String choice = chooser.getSelectedFile().getPath();
\r
2198 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2202 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2204 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2206 catch (Exception ex)
\r
2208 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2209 "Problem reading tree file",
\r
2211 JOptionPane.WARNING_MESSAGE);
\r
2212 ex.printStackTrace();
\r
2218 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2220 return ShowNewickTree(nf,title,600,500,4,5);
\r
2225 * @param nf DOCUMENT ME!
\r
2226 * @param title DOCUMENT ME!
\r
2228 * @return DOCUMENT ME!
\r
2230 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2232 TreePanel tp = null;
\r
2238 if (nf.getTree() != null)
\r
2240 tp = new TreePanel(viewport,
\r
2241 viewport.getAlignment().getSequences(), nf,
\r
2248 tp.setLocation(x,y);
\r
2251 Desktop.addInternalFrame(tp, title, w, h);
\r
2252 addTreeMenuItem(tp, title);
\r
2255 catch (Exception ex)
\r
2257 ex.printStackTrace();
\r
2268 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2269 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2270 printJob.setPrintable(alignPanel, pf);
\r
2272 if (printJob.printDialog())
\r
2278 catch (Exception PrintException)
\r
2280 PrintException.printStackTrace();
\r
2287 * Generates menu items and listener event actions for web service clients
\r
2290 public void BuildWebServiceMenu()
\r
2292 if ( (Discoverer.services != null)
\r
2293 && (Discoverer.services.size() > 0))
\r
2295 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2296 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2297 Vector wsmenu = new Vector();
\r
2298 if (msaws != null)
\r
2300 // Add any Multiple Sequence Alignment Services
\r
2301 final JMenu msawsmenu = new JMenu("Alignment");
\r
2302 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2304 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2306 final JMenuItem method = new JMenuItem(sh.getName());
\r
2307 method.addActionListener(new ActionListener()
\r
2309 public void actionPerformed(ActionEvent e)
\r
2311 SequenceI[] msa = gatherSequencesForAlignment();
\r
2312 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2318 msawsmenu.add(method);
\r
2319 // Deal with services that we know accept partial alignments.
\r
2320 if (sh.getName().indexOf("lustal") > -1)
\r
2322 // We know that ClustalWS can accept partial alignments for refinement.
\r
2323 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2324 methodR.addActionListener(new ActionListener()
\r
2326 public void actionPerformed(ActionEvent e)
\r
2328 SequenceI[] msa = gatherSequencesForAlignment();
\r
2329 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2335 msawsmenu.add(methodR);
\r
2339 wsmenu.add(msawsmenu);
\r
2341 if (secstrpr != null)
\r
2343 // Add any secondary structure prediction services
\r
2344 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2345 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2347 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2349 final JMenuItem method = new JMenuItem(sh.getName());
\r
2350 method.addActionListener(new ActionListener()
\r
2352 public void actionPerformed(ActionEvent e)
\r
2354 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2355 if (msa.length == 1)
\r
2357 // Single Sequence prediction
\r
2358 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2362 if (msa.length > 1)
\r
2364 // Single Sequence prediction
\r
2365 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2371 secstrmenu.add(method);
\r
2373 wsmenu.add(secstrmenu);
\r
2375 this.webService.removeAll();
\r
2376 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2378 webService.add( (JMenu) wsmenu.get(i));
\r
2383 this.webService.removeAll();
\r
2384 this.webService.add(this.webServiceNoServices);
\r
2386 // TODO: add in rediscovery function
\r
2387 // TODO: reduce code redundancy.
\r
2388 // TODO: group services by location as well as function.
\r
2391 public void vamsasStore_actionPerformed(ActionEvent e)
\r
2393 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2394 getProperty("LAST_DIRECTORY"));
\r
2396 chooser.setFileView(new JalviewFileView());
\r
2397 chooser.setDialogTitle("Export to Vamsas file");
\r
2398 chooser.setToolTipText("Export");
\r
2400 int value = chooser.showSaveDialog(this);
\r
2402 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2404 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2405 vs.store(chooser.getSelectedFile().getAbsolutePath()
\r
2410 public void featureSettings_actionPerformed(ActionEvent e)
\r
2412 new FeatureSettings(viewport, alignPanel);
\r
2417 public void showTranslation_actionPerformed(ActionEvent e)
\r
2420 if(!viewport.alignment.isNucleotide())
\r
2423 viewport.showTranslation(showTranslation.isSelected());
\r
2425 if(!viewport.alignment.isNucleotide())
\r
2428 int s, sSize = viewport.alignment.getHeight();
\r
2429 SequenceI [] newSeq = new SequenceI[sSize];
\r
2432 StringBuffer protein;
\r
2434 for(s=0; s<sSize; s++)
\r
2436 protein = new StringBuffer();
\r
2437 seq = (SequenceI)viewport.alignment.getSequenceAt(s);
\r
2438 resSize = seq.getLength();
\r
2439 for(res = 0; res < resSize; res+=3)
\r
2441 String codon = seq.getSequence(res, res+3);
\r
2442 codon = codon.replace('U', 'T');
\r
2443 String aa = ResidueProperties.codonTranslate(codon);
\r
2445 protein.append(viewport.getGapCharacter());
\r
2446 else if(aa.equals("STOP"))
\r
2447 protein.append("X");
\r
2449 protein.append( aa );
\r
2451 newSeq[s] = new Sequence(seq.getName(), protein.toString());
\r
2455 AlignmentI al = new Alignment(newSeq);
\r
2456 al.setDataset(null);
\r
2459 ////////////////////////////////
\r
2460 // Copy annotations across
\r
2461 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2462 = viewport.alignment.getAlignmentAnnotation();
\r
2464 for (int i = 0; i < annotations.length; i++)
\r
2467 if (annotations[i].label.equals("Quality") ||
\r
2468 annotations[i].label.equals("Conservation") ||
\r
2469 annotations[i].label.equals("Consensus"))
\r
2475 aSize = viewport.alignment.getWidth()/3;
\r
2476 jalview.datamodel.Annotation [] anots =
\r
2477 new jalview.datamodel.Annotation[aSize];
\r
2479 for(a=0; a<viewport.alignment.getWidth(); a++)
\r
2481 if( annotations[i].annotations[a]==null
\r
2482 || annotations[i].annotations[a]==null)
\r
2485 anots[a/3] = new Annotation(
\r
2486 annotations[i].annotations[a].displayCharacter,
\r
2487 annotations[i].annotations[a].description,
\r
2488 annotations[i].annotations[a].secondaryStructure,
\r
2489 annotations[i].annotations[a].value,
\r
2490 annotations[i].annotations[a].colour);
\r
2493 jalview.datamodel.AlignmentAnnotation aa
\r
2494 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2495 annotations[i].description, anots );
\r
2496 al.addAnnotation(aa);
\r
2500 // Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2501 // NEW_WINDOW_WIDTH,
\r
2502 // NEW_WINDOW_HEIGHT);
\r
2504 AlignViewport newViewport = new AlignViewport(al);
\r
2505 AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2506 tabbedPane.add("Protein", ap);
\r
2507 viewports.add(newViewport);
\r
2508 alignPanels.add(ap);
\r
2511 /////////////////////////
\r
2513 AlignViewport ds = new AlignViewport(al.getDataset());
\r
2514 ds.setDataset(true);
\r
2515 AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2516 tabbedPane.add("Dataset", dap);
\r
2517 viewports.add(ds);
\r
2518 alignPanels.add(dap);
\r
2519 /////////////////////////
\r
2524 public void tabSelected()
\r
2526 int index = tabbedPane.getSelectedIndex();
\r
2527 viewport = (AlignViewport)viewports.elementAt(index);
\r
2528 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r