2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Softwarechang
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
19 package jalview.gui;
\r
21 import java.beans.*;
\r
26 import java.awt.datatransfer.*;
\r
27 import java.awt.event.*;
\r
28 import java.awt.print.*;
\r
29 import javax.swing.*;
\r
31 import jalview.analysis.*;
\r
32 import jalview.datamodel.*;
\r
33 import jalview.io.*;
\r
34 import jalview.jbgui.*;
\r
35 import jalview.schemes.*;
\r
36 import jalview.ws.*;
\r
37 import java.awt.dnd.*;
\r
44 * @version $Revision$
\r
46 public class AlignFrame
\r
47 extends GAlignFrame implements ClipboardOwner, DropTargetListener
\r
49 /** DOCUMENT ME!! */
\r
50 public static final int NEW_WINDOW_WIDTH = 700;
\r
52 /** DOCUMENT ME!! */
\r
53 public static final int NEW_WINDOW_HEIGHT = 500;
\r
54 AlignmentPanel alignPanel;
\r
55 AlignViewport viewport;
\r
57 Vector viewports = new Vector();
\r
58 Vector alignPanels = new Vector();
\r
60 /** DOCUMENT ME!! */
\r
61 public String currentFileFormat = null;
\r
62 Stack historyList = new Stack();
\r
63 Stack redoList = new Stack();
\r
64 private int treeCount = 0;
\r
68 * Creates a new AlignFrame object.
\r
70 * @param al DOCUMENT ME!
\r
72 public AlignFrame(AlignmentI al)
\r
74 viewport = new AlignViewport(al);
\r
75 viewports.add(viewport);
\r
77 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
\r
79 if(viewport.vconsensus==null)
\r
81 //Out of memory calculating consensus.
\r
82 BLOSUM62Colour.setEnabled(false);
\r
83 PIDColour.setEnabled(false);
\r
84 conservationMenuItem.setEnabled(false);
\r
85 modifyConservation.setEnabled(false);
\r
86 abovePIDThreshold.setEnabled(false);
\r
87 modifyPID.setEnabled(false);
\r
90 alignPanel = new AlignmentPanel(this, viewport);
\r
91 alignPanels.add(alignPanel);
\r
93 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
\r
95 if(sortby.equals("Id"))
\r
96 sortIDMenuItem_actionPerformed(null);
\r
97 else if(sortby.equals("Pairwise Identity"))
\r
98 sortPairwiseMenuItem_actionPerformed(null);
\r
100 // remove(tabbedPane);
\r
101 getContentPane().add(alignPanel, BorderLayout.CENTER);
\r
105 // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
\r
108 /////////////////////////
\r
109 if(al.getDataset()==null)
\r
111 al.setDataset(null);
\r
113 // AlignViewport ds = new AlignViewport(al.getDataset(), true);
\r
114 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
115 // tabbedPane.add("Dataset", dap);
\r
116 // viewports.add(ds);
\r
117 // alignPanels.add(dap);
\r
118 /////////////////////////
\r
121 viewport.addPropertyChangeListener(new PropertyChangeListener()
\r
123 public void propertyChange(PropertyChangeEvent evt)
\r
125 if (evt.getPropertyName().equals("alignment"))
\r
127 alignmentChanged();
\r
133 if (Desktop.desktop != null)
\r
135 addServiceListeners();
\r
136 setGUINucleotide(al.isNucleotide());
\r
140 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
141 private void addServiceListeners()
\r
143 final java.beans.PropertyChangeListener thisListener;
\r
144 // Do this once to get current state
\r
145 BuildWebServiceMenu();
\r
146 Desktop.discoverer.addPropertyChangeListener(
\r
147 thisListener = new java.beans.PropertyChangeListener()
\r
149 public void propertyChange(PropertyChangeEvent evt)
\r
151 // System.out.println("Discoverer property change.");
\r
152 if (evt.getPropertyName().equals("services"))
\r
154 // System.out.println("Rebuilding web service menu");
\r
155 BuildWebServiceMenu();
\r
159 addInternalFrameListener(new javax.swing.event.
\r
160 InternalFrameAdapter()
\r
162 public void internalFrameClosed(
\r
163 javax.swing.event.InternalFrameEvent evt)
\r
165 // System.out.println("deregistering discoverer listener");
\r
166 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
167 closeMenuItem_actionPerformed(null);
\r
174 public void setGUINucleotide(boolean nucleotide)
\r
176 showTranslation.setVisible( nucleotide );
\r
177 //sequenceFeatures.setVisible(!nucleotide );
\r
178 //featureSettings.setVisible( !nucleotide );
\r
179 conservationMenuItem.setVisible( !nucleotide );
\r
180 modifyConservation.setVisible( !nucleotide );
\r
182 //Remember AlignFrame always starts as protein
\r
185 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
191 Added so Castor Mapping file can obtain Jalview Version
\r
193 public String getVersion()
\r
195 return jalview.bin.Cache.getProperty("VERSION");
\r
199 public void fetchSequence_actionPerformed(ActionEvent e)
\r
201 new SequenceFetcher(this);
\r
206 * @param e DOCUMENT ME!
\r
208 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
210 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
215 "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",
\r
220 "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"
\r
221 }, currentFileFormat);
\r
223 chooser.setAcceptAllFileFilterUsed(false);
\r
224 chooser.setFileView(new JalviewFileView());
\r
225 chooser.setDialogTitle("Save Alignment to file");
\r
226 chooser.setToolTipText("Save");
\r
228 int value = chooser.showSaveDialog(this);
\r
230 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
232 currentFileFormat = chooser.getSelectedFormat();
\r
234 if (currentFileFormat == null)
\r
236 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
237 "You must select a file format before saving!",
\r
238 "File format not specified",
\r
239 JOptionPane.WARNING_MESSAGE);
\r
240 value = chooser.showSaveDialog(this);
\r
244 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
245 currentFileFormat);
\r
247 String choice = chooser.getSelectedFile().getPath();
\r
248 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
250 saveAlignment(choice, currentFileFormat);
\r
254 public boolean saveAlignment(String file, String format)
\r
256 if (format.equalsIgnoreCase("Jalview"))
\r
258 String shortName = title;
\r
260 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
262 shortName = shortName.substring(shortName.lastIndexOf(
\r
263 java.io.File.separatorChar) + 1);
\r
266 Jalview2XML.SaveAlignment(this, file, shortName);
\r
268 // USE Jalview2XML to save this file
\r
273 String output = new FormatAdapter().formatSequences(format,
\r
274 viewport.getAlignment().
\r
276 if (output == null)
\r
283 java.io.PrintWriter out = new java.io.PrintWriter(
\r
284 new java.io.FileWriter(file));
\r
290 catch (Exception ex)
\r
292 ex.printStackTrace();
\r
301 * @param e DOCUMENT ME!
\r
303 protected void outputText_actionPerformed(ActionEvent e)
\r
305 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
306 Desktop.addInternalFrame(cap,
\r
307 "Alignment output - " + e.getActionCommand(), 600,
\r
309 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
310 viewport.getAlignment().
\r
317 * @param e DOCUMENT ME!
\r
319 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
321 new HTMLOutput(viewport,
\r
322 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
323 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
326 public void createImageMap(File file, String image)
\r
328 alignPanel.makePNGImageMap(file, image);
\r
334 * @param e DOCUMENT ME!
\r
336 public void createPNG(File f)
\r
338 alignPanel.makePNG(f);
\r
344 * @param e DOCUMENT ME!
\r
346 public void createEPS(File f)
\r
348 alignPanel.makeEPS(f);
\r
354 * @param e DOCUMENT ME!
\r
356 public void printMenuItem_actionPerformed(ActionEvent e)
\r
358 //Putting in a thread avoids Swing painting problems
\r
359 PrintThread thread = new PrintThread();
\r
366 * @param e DOCUMENT ME!
\r
368 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
372 PaintRefresher.components.remove(viewport.alignment);
\r
373 this.setClosed(true);
\r
375 catch (Exception ex)
\r
383 void updateEditMenuBar()
\r
385 if (historyList.size() > 0)
\r
387 undoMenuItem.setEnabled(true);
\r
389 HistoryItem hi = (HistoryItem) historyList.peek();
\r
390 undoMenuItem.setText("Undo " + hi.getDescription());
\r
394 undoMenuItem.setEnabled(false);
\r
395 undoMenuItem.setText("Undo");
\r
398 if (redoList.size() > 0)
\r
400 redoMenuItem.setEnabled(true);
\r
402 HistoryItem hi = (HistoryItem) redoList.peek();
\r
403 redoMenuItem.setText("Redo " + hi.getDescription());
\r
407 redoMenuItem.setEnabled(false);
\r
408 redoMenuItem.setText("Redo");
\r
415 * @param hi DOCUMENT ME!
\r
417 public void addHistoryItem(HistoryItem hi)
\r
419 historyList.push(hi);
\r
420 updateEditMenuBar();
\r
426 * @param e DOCUMENT ME!
\r
428 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
430 HistoryItem hi = (HistoryItem) historyList.pop();
\r
431 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
432 HistoryItem.HIDE));
\r
433 restoreHistoryItem(hi);
\r
434 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
440 * @param e DOCUMENT ME!
\r
442 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
444 HistoryItem hi = (HistoryItem) redoList.pop();
\r
445 restoreHistoryItem(hi);
\r
446 updateEditMenuBar();
\r
447 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
450 // used by undo and redo
\r
451 void restoreHistoryItem(HistoryItem hi)
\r
453 if (hi.getType() == HistoryItem.SORT)
\r
455 for (int i = 0; i < hi.getSequences().size(); i++)
\r
457 viewport.alignment.getSequences().setElementAt(hi.getSequences()
\r
464 for (int i = 0; i < hi.getSequences().size(); i++)
\r
466 SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);
\r
468 if (restore.getLength() == 0)
\r
470 restore.setSequence(hi.getHidden().elementAt(i).toString());
\r
471 viewport.alignment.getSequences().insertElementAt(restore,
\r
472 hi.getAlignIndex(i));
\r
476 restore.setSequence(hi.getHidden().elementAt(i).toString());
\r
480 if (hi.getType() == HistoryItem.PASTE)
\r
482 for (int i = viewport.alignment.getHeight() - 1;
\r
483 i > (hi.getSequences().size() - 1); i--)
\r
485 viewport.alignment.deleteSequence(i);
\r
490 updateEditMenuBar();
\r
492 viewport.firePropertyChange("alignment", null,
\r
493 viewport.getAlignment().getSequences());
\r
499 * @param up DOCUMENT ME!
\r
501 public void moveSelectedSequences(boolean up)
\r
503 SequenceGroup sg = viewport.getSelectionGroup();
\r
512 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
514 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
516 if (!sg.sequences.contains(seq))
\r
521 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
523 if (sg.sequences.contains(temp))
\r
528 viewport.alignment.getSequences().setElementAt(temp, i);
\r
529 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
534 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
536 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
538 if (!sg.sequences.contains(seq))
\r
543 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
545 if (sg.sequences.contains(temp))
\r
550 viewport.alignment.getSequences().setElementAt(temp, i);
\r
551 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
555 alignPanel.repaint();
\r
558 public void lostOwnership(Clipboard clipboard, Transferable contents)
\r
560 Desktop.jalviewClipboard = null;
\r
567 * @param e DOCUMENT ME!
\r
569 protected void copy_actionPerformed(ActionEvent e)
\r
571 if (viewport.getSelectionGroup() == null)
\r
576 SequenceGroup sg = viewport.getSelectionGroup();
\r
578 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
580 Hashtable orderedSeqs = new Hashtable();
\r
581 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
583 for (int i = 0; i < sg.getSize(); i++)
\r
585 SequenceI seq = sg.getSequenceAt(i);
\r
586 int index = viewport.alignment.findIndex(seq);
\r
587 orderedSeqs.put(index + "", seq);
\r
590 int index = 0, startRes, endRes;
\r
593 for (int i = 0; i < sg.getSize(); i++)
\r
595 SequenceI seq = null;
\r
597 while (seq == null)
\r
599 if (orderedSeqs.containsKey(index + ""))
\r
601 seq = (SequenceI) orderedSeqs.get(index + "");
\r
613 //Returns residue following index if gap
\r
614 startRes = seq.findPosition(sg.getStartRes());
\r
617 //Need to find the residue preceeding index if gap
\r
620 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
622 ch = seq.getCharAt(j);
\r
623 if (!jalview.util.Comparison.isGap( (ch)))
\r
631 endRes += seq.getStart() - 1;
\r
634 seqs[i] = new Sequence(seq.getName(),
\r
635 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
638 seqs[i].setDescription(seq.getDescription());
\r
639 seqs[i].setDBRef(seq.getDBRef());
\r
640 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
641 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
645 FastaFile ff = new FastaFile();
\r
646 ff.addJVSuffix( viewport.showJVSuffix );
\r
647 c.setContents(new StringSelection( ff.print(seqs)), this);
\r
648 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
654 * @param e DOCUMENT ME!
\r
656 protected void pasteNew_actionPerformed(ActionEvent e)
\r
664 * @param e DOCUMENT ME!
\r
666 protected void pasteThis_actionPerformed(ActionEvent e)
\r
668 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
669 HistoryItem.PASTE));
\r
676 * @param newAlignment DOCUMENT ME!
\r
678 void paste(boolean newAlignment)
\r
682 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
683 Transferable contents = c.getContents(this);
\r
685 if (contents == null)
\r
690 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
694 String format = IdentifyFile.Identify(str, "Paste");
\r
695 SequenceI[] sequences;
\r
697 if(Desktop.jalviewClipboard!=null)
\r
699 // The clipboard was filled from within Jalview, we must use the sequences
\r
700 // And dataset from the copied alignment
\r
701 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
705 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
711 Alignment alignment = new Alignment(sequences);
\r
713 if(Desktop.jalviewClipboard!=null)
\r
714 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
716 alignment.setDataset( null );
\r
719 AlignFrame af = new AlignFrame(alignment);
\r
720 String newtitle = new String("Copied sequences");
\r
722 if (title.startsWith("Copied sequences"))
\r
728 newtitle = newtitle.concat("- from " + title);
\r
731 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
732 NEW_WINDOW_HEIGHT);
\r
737 for (int i = 0; i < sequences.length; i++)
\r
739 Sequence newseq = new Sequence(sequences[i].getName(),
\r
740 sequences[i].getSequence(), sequences[i].getStart(),
\r
741 sequences[i].getEnd());
\r
742 viewport.alignment.addSequence(newseq);
\r
743 if(sequences[i].getDatasetSequence()==null)
\r
745 ////////////////////////////
\r
746 //Datset needs extension;
\r
747 /////////////////////////////
\r
748 Sequence ds = new Sequence(sequences[i].getName(),
\r
749 AlignSeq.extractGaps("-. ", sequences[i].getSequence()),
\r
750 sequences[i].getStart(),
\r
751 sequences[i].getEnd());
\r
752 newseq.setDatasetSequence(ds);
\r
753 viewport.alignment.getDataset().addSequence(ds);
\r
757 newseq.setDatasetSequence(sequences[i].getDatasetSequence());
\r
758 if(sequences[i].getDatasetSequence().getAnnotation()!=null)
\r
760 for(int aa=0; aa<sequences[i].getDatasetSequence().getAnnotation().length; aa++)
\r
762 viewport.alignment.addAnnotation(sequences[i].getDatasetSequence().getAnnotation()[aa]);
\r
767 viewport.setEndSeq(viewport.alignment.getHeight());
\r
768 viewport.alignment.getWidth();
\r
769 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
772 catch (Exception ex)
\r
774 ex.printStackTrace();
\r
775 System.out.println("Exception whilst pasting: "+ex);
\r
776 // could be anything being pasted in here
\r
785 * @param e DOCUMENT ME!
\r
787 protected void cut_actionPerformed(ActionEvent e)
\r
789 copy_actionPerformed(null);
\r
790 delete_actionPerformed(null);
\r
796 * @param e DOCUMENT ME!
\r
798 protected void delete_actionPerformed(ActionEvent e)
\r
801 if (viewport.getSelectionGroup() == null)
\r
807 SequenceGroup sg = viewport.getSelectionGroup();
\r
811 //Jalview no longer allows deletion of residues.
\r
812 //Check here whether any residues are in selection area
\r
813 if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
815 for (int i = 0; i < sg.sequences.size(); i++)
\r
817 SequenceI seq = sg.getSequenceAt(i);
\r
818 int j = sg.getStartRes();
\r
821 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
823 JOptionPane.showInternalMessageDialog(
\r
824 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
825 + "Try hiding columns instead.",
\r
826 "Deletion of residues not permitted",
\r
827 JOptionPane.WARNING_MESSAGE);
\r
832 }while(j<=sg.getEndRes());
\r
837 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
838 HistoryItem.HIDE));
\r
841 for (int i = 0; i < sg.sequences.size(); i++)
\r
843 SequenceI seq = sg.getSequenceAt(i);
\r
844 int index = viewport.getAlignment().findIndex(seq);
\r
846 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
848 // If the cut affects all sequences, remove highlighted columns
\r
849 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
851 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
852 sg.getEndRes() + 1);
\r
855 if (seq.getSequence().length() < 1)
\r
857 viewport.getAlignment().deleteSequence(seq);
\r
861 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
865 viewport.setSelectionGroup(null);
\r
866 viewport.alignment.deleteGroup(sg);
\r
868 viewport.firePropertyChange("alignment", null,
\r
869 viewport.getAlignment().getSequences());
\r
873 if (viewport.getAlignment().getHeight() < 1)
\r
877 this.setClosed(true);
\r
879 catch (Exception ex)
\r
888 * @param e DOCUMENT ME!
\r
890 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
892 viewport.alignment.deleteAllGroups();
\r
893 viewport.setSelectionGroup(null);
\r
894 alignPanel.repaint();
\r
900 * @param e DOCUMENT ME!
\r
902 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
904 SequenceGroup sg = new SequenceGroup();
\r
906 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
909 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
912 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
913 viewport.setSelectionGroup(sg);
\r
914 PaintRefresher.Refresh(null, viewport.alignment);
\r
920 * @param e DOCUMENT ME!
\r
922 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
924 viewport.setSelectionGroup(null);
\r
925 viewport.getColumnSelection().clear();
\r
926 viewport.setSelectionGroup(null);
\r
927 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
928 alignPanel.idPanel.idCanvas.searchResults = null;
\r
929 alignPanel.annotationPanel.activeRes = null;
\r
930 PaintRefresher.Refresh(null, viewport.alignment);
\r
936 * @param e DOCUMENT ME!
\r
938 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
940 SequenceGroup sg = viewport.getSelectionGroup();
\r
944 selectAllSequenceMenuItem_actionPerformed(null);
\r
949 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
952 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
955 PaintRefresher.Refresh(null, viewport.alignment);
\r
961 * @param e DOCUMENT ME!
\r
963 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
965 ColumnSelection colSel = viewport.getColumnSelection();
\r
967 if (colSel.size() > 0)
\r
969 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
970 HistoryItem.HIDE));
\r
972 int min = colSel.getMin();
\r
973 viewport.getAlignment().trimLeft(min);
\r
974 colSel.compensateForEdit(0, min);
\r
976 if (viewport.getSelectionGroup() != null)
\r
978 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
981 Vector groups = viewport.alignment.getGroups();
\r
983 for (int i = 0; i < groups.size(); i++)
\r
985 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
987 if (!sg.adjustForRemoveLeft(min))
\r
989 viewport.alignment.deleteGroup(sg);
\r
993 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1000 * @param e DOCUMENT ME!
\r
1002 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1004 ColumnSelection colSel = viewport.getColumnSelection();
\r
1006 if (colSel.size() > 0)
\r
1008 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1009 HistoryItem.HIDE));
\r
1011 int max = colSel.getMax();
\r
1012 viewport.getAlignment().trimRight(max);
\r
1014 if (viewport.getSelectionGroup() != null)
\r
1016 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1019 Vector groups = viewport.alignment.getGroups();
\r
1021 for (int i = 0; i < groups.size(); i++)
\r
1023 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1025 if (!sg.adjustForRemoveRight(max))
\r
1027 viewport.alignment.deleteGroup(sg);
\r
1031 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1038 * @param e DOCUMENT ME!
\r
1040 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1042 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1043 viewport.alignment, HistoryItem.HIDE));
\r
1045 //This is to maintain viewport position on first residue
\r
1046 //of first sequence
\r
1047 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1048 int startRes = seq.findPosition(viewport.startRes);
\r
1050 viewport.getAlignment().removeGaps();
\r
1052 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1054 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1060 * @param e DOCUMENT ME!
\r
1062 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1064 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1065 HistoryItem.HIDE));
\r
1067 //This is to maintain viewport position on first residue
\r
1068 //of first sequence
\r
1069 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1070 int startRes = seq.findPosition(viewport.startRes);
\r
1073 SequenceI current;
\r
1076 Vector seqs = null;
\r
1079 int end = viewport.alignment.getWidth();
\r
1081 if (viewport.getSelectionGroup() != null
\r
1082 && viewport.getSelectionGroup().sequences != null
\r
1083 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1085 seqs = viewport.getSelectionGroup().sequences;
\r
1086 start = viewport.getSelectionGroup().getStartRes();
\r
1087 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1091 seqs = viewport.alignment.getSequences();
\r
1094 for (int i = 0; i < seqs.size(); i++)
\r
1096 current = (SequenceI) seqs.elementAt(i);
\r
1097 jSize = current.getLength();
\r
1099 // Removing a range is much quicker than removing gaps
\r
1100 // one by one for long sequences
\r
1102 int rangeStart=-1, rangeEnd=-1;
\r
1106 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1108 if(rangeStart==-1)
\r
1123 current.deleteChars(rangeStart, rangeEnd);
\r
1124 j-=rangeEnd-rangeStart;
\r
1125 jSize-=rangeEnd-rangeStart;
\r
1133 while (j < end && j < jSize);
\r
1136 current.deleteChars(rangeStart, rangeEnd);
\r
1140 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1142 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1145 public void alignmentChanged()
\r
1147 if(viewport.vconsensus!=null)
\r
1149 viewport.updateConsensus();
\r
1150 viewport.updateConservation();
\r
1152 resetAllColourSchemes();
\r
1153 if(alignPanel.overviewPanel!=null)
\r
1154 alignPanel.overviewPanel.updateOverviewImage();
\r
1156 viewport.alignment.adjustSequenceAnnotations();
\r
1158 alignPanel.repaint();
\r
1161 void resetAllColourSchemes()
\r
1163 ColourSchemeI cs = viewport.globalColourScheme;
\r
1166 if (cs instanceof ClustalxColourScheme)
\r
1168 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1169 resetClustalX(viewport.alignment.getSequences(),
\r
1170 viewport.alignment.getWidth());
\r
1173 cs.setConsensus(viewport.vconsensus);
\r
1174 if (cs.conservationApplied())
\r
1176 Alignment al = (Alignment) viewport.alignment;
\r
1177 Conservation c = new Conservation("All",
\r
1178 ResidueProperties.propHash, 3,
\r
1179 al.getSequences(), 0,
\r
1180 al.getWidth() - 1);
\r
1182 c.verdict(false, viewport.ConsPercGaps);
\r
1184 cs.setConservation(c);
\r
1188 int s, sSize = viewport.alignment.getGroups().size();
\r
1189 for(s=0; s<sSize; s++)
\r
1191 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1192 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1194 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1196 sg.recalcConservation();
\r
1203 * @param e DOCUMENT ME!
\r
1205 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1207 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1208 HistoryItem.HIDE));
\r
1209 if (viewport.getAlignment().padGaps())
\r
1210 alignmentChanged();
\r
1216 * @param e DOCUMENT ME!
\r
1218 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1220 JInternalFrame frame = new JInternalFrame();
\r
1221 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1222 frame.setContentPane(finder);
\r
1223 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1224 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1230 * @param e DOCUMENT ME!
\r
1232 public void font_actionPerformed(ActionEvent e)
\r
1234 new FontChooser(alignPanel);
\r
1237 public void smoothFont_actionPerformed(ActionEvent e)
\r
1239 viewport.antiAlias = smoothFont.isSelected();
\r
1240 alignPanel.annotationPanel.image = null;
\r
1241 alignPanel.repaint();
\r
1248 * @param e DOCUMENT ME!
\r
1250 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1252 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1254 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1255 alignPanel.repaint();
\r
1262 * @param e DOCUMENT ME!
\r
1264 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1266 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1267 alignPanel.repaint();
\r
1273 * @param e DOCUMENT ME!
\r
1275 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1277 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1278 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1279 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1280 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1281 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1282 alignPanel.repaint();
\r
1288 * @param e DOCUMENT ME!
\r
1290 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1292 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1293 alignPanel.repaint();
\r
1299 * @param e DOCUMENT ME!
\r
1301 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1303 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1304 alignPanel.repaint();
\r
1310 * @param e DOCUMENT ME!
\r
1312 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1314 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1315 alignPanel.repaint();
\r
1321 * @param e DOCUMENT ME!
\r
1323 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1325 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1326 alignPanel.repaint();
\r
1332 * @param e DOCUMENT ME!
\r
1334 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1336 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1337 alignPanel.repaint();
\r
1343 * @param e DOCUMENT ME!
\r
1345 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1347 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1348 alignPanel.repaint();
\r
1351 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1353 if (!viewport.alignment.isNucleotide())
\r
1355 new SequenceFeatureFetcher(viewport.
\r
1358 viewport.setShowSequenceFeatures(true);
\r
1359 showSeqFeatures.setSelected(true);
\r
1364 public void featureSettings_actionPerformed(ActionEvent e)
\r
1366 new FeatureSettings(viewport, alignPanel);
\r
1372 * @param evt DOCUMENT ME!
\r
1374 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1376 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1377 alignPanel.repaint();
\r
1378 if (alignPanel.getOverviewPanel() != null)
\r
1380 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1387 * @param e DOCUMENT ME!
\r
1389 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1391 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1392 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1398 * @param e DOCUMENT ME!
\r
1400 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1402 if (alignPanel.overviewPanel != null)
\r
1407 JInternalFrame frame = new JInternalFrame();
\r
1408 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1409 frame.setContentPane(overview);
\r
1410 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1411 frame.getWidth(), frame.getHeight());
\r
1413 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1414 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1416 public void internalFrameClosed(
\r
1417 javax.swing.event.InternalFrameEvent evt)
\r
1419 alignPanel.setOverviewPanel(null);
\r
1424 alignPanel.setOverviewPanel(overview);
\r
1430 * @param e DOCUMENT ME!
\r
1432 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1434 changeColour(null);
\r
1440 * @param e DOCUMENT ME!
\r
1442 public void clustalColour_actionPerformed(ActionEvent e)
\r
1444 changeColour(new ClustalxColourScheme(
\r
1445 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1451 * @param e DOCUMENT ME!
\r
1453 public void zappoColour_actionPerformed(ActionEvent e)
\r
1455 changeColour(new ZappoColourScheme());
\r
1461 * @param e DOCUMENT ME!
\r
1463 public void taylorColour_actionPerformed(ActionEvent e)
\r
1465 changeColour(new TaylorColourScheme());
\r
1471 * @param e DOCUMENT ME!
\r
1473 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1475 changeColour(new HydrophobicColourScheme());
\r
1481 * @param e DOCUMENT ME!
\r
1483 public void helixColour_actionPerformed(ActionEvent e)
\r
1485 changeColour(new HelixColourScheme());
\r
1491 * @param e DOCUMENT ME!
\r
1493 public void strandColour_actionPerformed(ActionEvent e)
\r
1495 changeColour(new StrandColourScheme());
\r
1501 * @param e DOCUMENT ME!
\r
1503 public void turnColour_actionPerformed(ActionEvent e)
\r
1505 changeColour(new TurnColourScheme());
\r
1511 * @param e DOCUMENT ME!
\r
1513 public void buriedColour_actionPerformed(ActionEvent e)
\r
1515 changeColour(new BuriedColourScheme());
\r
1521 * @param e DOCUMENT ME!
\r
1523 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1525 changeColour(new NucleotideColourScheme());
\r
1528 public void annotationColour_actionPerformed(ActionEvent e)
\r
1530 new AnnotationColourChooser(viewport, alignPanel);
\r
1537 * @param e DOCUMENT ME!
\r
1539 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1541 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1547 * @param cs DOCUMENT ME!
\r
1549 void changeColour(ColourSchemeI cs)
\r
1551 int threshold = 0;
\r
1555 if (viewport.getAbovePIDThreshold())
\r
1557 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1560 cs.setThreshold(threshold,
\r
1561 viewport.getIgnoreGapsConsensus());
\r
1563 viewport.setGlobalColourScheme(cs);
\r
1567 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1570 if (viewport.getConservationSelected())
\r
1573 Alignment al = (Alignment) viewport.alignment;
\r
1574 Conservation c = new Conservation("All",
\r
1575 ResidueProperties.propHash, 3,
\r
1576 al.getSequences(), 0,
\r
1577 al.getWidth() - 1);
\r
1580 c.verdict(false, viewport.ConsPercGaps);
\r
1582 cs.setConservation(c);
\r
1584 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1589 cs.setConservation(null);
\r
1592 cs.setConsensus(viewport.vconsensus);
\r
1595 viewport.setGlobalColourScheme(cs);
\r
1597 if (viewport.getColourAppliesToAllGroups())
\r
1599 Vector groups = viewport.alignment.getGroups();
\r
1601 for (int i = 0; i < groups.size(); i++)
\r
1603 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1611 if (cs instanceof ClustalxColourScheme)
\r
1613 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1615 else if (cs instanceof UserColourScheme)
\r
1617 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1623 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1625 catch (Exception ex)
\r
1630 if (viewport.getAbovePIDThreshold()
\r
1631 || cs instanceof PIDColourScheme
\r
1632 || cs instanceof Blosum62ColourScheme)
\r
1634 sg.cs.setThreshold(threshold,
\r
1635 viewport.getIgnoreGapsConsensus());
\r
1637 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1641 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1644 if (viewport.getConservationSelected())
\r
1646 Conservation c = new Conservation("Group",
\r
1647 ResidueProperties.propHash, 3,
\r
1649 viewport.alignment.getWidth() - 1);
\r
1651 c.verdict(false, viewport.ConsPercGaps);
\r
1652 sg.cs.setConservation(c);
\r
1655 sg.cs.setConservation(null);
\r
1659 if (alignPanel.getOverviewPanel() != null)
\r
1661 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1664 alignPanel.repaint();
\r
1670 * @param e DOCUMENT ME!
\r
1672 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1674 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1676 SliderPanel.setPIDSliderSource(alignPanel,
\r
1677 viewport.getGlobalColourScheme(),
\r
1679 SliderPanel.showPIDSlider();
\r
1686 * @param e DOCUMENT ME!
\r
1688 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1690 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1692 SliderPanel.setConservationSlider(alignPanel,
\r
1693 viewport.globalColourScheme,
\r
1695 SliderPanel.showConservationSlider();
\r
1702 * @param e DOCUMENT ME!
\r
1704 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1706 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1708 viewport.setAbovePIDThreshold(false);
\r
1709 abovePIDThreshold.setSelected(false);
\r
1711 changeColour(viewport.getGlobalColourScheme());
\r
1713 modifyConservation_actionPerformed(null);
\r
1719 * @param e DOCUMENT ME!
\r
1721 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1723 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1725 conservationMenuItem.setSelected(false);
\r
1726 viewport.setConservationSelected(false);
\r
1728 changeColour(viewport.getGlobalColourScheme());
\r
1730 modifyPID_actionPerformed(null);
\r
1736 * @param e DOCUMENT ME!
\r
1738 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1740 if (e.getActionCommand().equals("User Defined..."))
\r
1742 new UserDefinedColours(alignPanel, null);
\r
1746 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1747 getUserColourSchemes().get(e.getActionCommand());
\r
1749 changeColour(udc);
\r
1753 public void updateUserColourMenu()
\r
1756 Component[] menuItems = colourMenu.getMenuComponents();
\r
1757 int i, iSize = menuItems.length;
\r
1758 for (i = 0; i < iSize; i++)
\r
1760 if (menuItems[i].getName() != null &&
\r
1761 menuItems[i].getName().equals("USER_DEFINED"))
\r
1763 colourMenu.remove(menuItems[i]);
\r
1767 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1769 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1770 getUserColourSchemes().keys();
\r
1772 while (userColours.hasMoreElements())
\r
1774 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1775 nextElement().toString());
\r
1776 radioItem.setName("USER_DEFINED");
\r
1777 radioItem.addMouseListener(new MouseAdapter()
\r
1779 public void mousePressed(MouseEvent evt)
\r
1781 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1783 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1785 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1786 "Remove from default list?",
\r
1787 "Remove user defined colour",
\r
1788 JOptionPane.YES_NO_OPTION);
\r
1789 if(option == JOptionPane.YES_OPTION)
\r
1791 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1792 colourMenu.remove(radioItem);
\r
1795 radioItem.addActionListener(new ActionListener()
\r
1797 public void actionPerformed(ActionEvent evt)
\r
1799 userDefinedColour_actionPerformed(evt);
\r
1805 radioItem.addActionListener(new ActionListener()
\r
1807 public void actionPerformed(ActionEvent evt)
\r
1809 userDefinedColour_actionPerformed(evt);
\r
1813 colourMenu.insert(radioItem, 15);
\r
1814 colours.add(radioItem);
\r
1822 * @param e DOCUMENT ME!
\r
1824 public void PIDColour_actionPerformed(ActionEvent e)
\r
1826 changeColour(new PIDColourScheme());
\r
1832 * @param e DOCUMENT ME!
\r
1834 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1836 changeColour(new Blosum62ColourScheme());
\r
1842 * @param e DOCUMENT ME!
\r
1844 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1846 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1847 HistoryItem.SORT));
\r
1848 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1849 viewport.getAlignment().getSequenceAt(0));
\r
1850 alignPanel.repaint();
\r
1856 * @param e DOCUMENT ME!
\r
1858 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1860 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1861 HistoryItem.SORT));
\r
1862 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1863 alignPanel.repaint();
\r
1869 * @param e DOCUMENT ME!
\r
1871 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1873 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1874 HistoryItem.SORT));
\r
1876 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1877 alignPanel.repaint();
\r
1883 * @param e DOCUMENT ME!
\r
1885 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1887 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1888 JInternalFrame frame = new JInternalFrame();
\r
1889 frame.setContentPane(sp);
\r
1890 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1897 * @param e DOCUMENT ME!
\r
1899 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1901 if ( (viewport.getSelectionGroup() == null) ||
\r
1902 (viewport.getSelectionGroup().getSize() < 2))
\r
1904 JOptionPane.showInternalMessageDialog(this,
\r
1905 "You must select at least 2 sequences.",
\r
1906 "Invalid Selection",
\r
1907 JOptionPane.WARNING_MESSAGE);
\r
1911 JInternalFrame frame = new JInternalFrame();
\r
1912 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1913 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1920 * @param e DOCUMENT ME!
\r
1922 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1924 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1925 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1926 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1927 (viewport.getAlignment().getHeight() < 4))
\r
1929 JOptionPane.showInternalMessageDialog(this,
\r
1930 "Principal component analysis must take\n" +
\r
1931 "at least 4 input sequences.",
\r
1932 "Sequence selection insufficient",
\r
1933 JOptionPane.WARNING_MESSAGE);
\r
1938 new PCAPanel(viewport);
\r
1944 * @param e DOCUMENT ME!
\r
1946 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1948 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1954 * @param e DOCUMENT ME!
\r
1956 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1958 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1964 * @param e DOCUMENT ME!
\r
1966 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1968 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1974 * @param e DOCUMENT ME!
\r
1976 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1978 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1984 * @param type DOCUMENT ME!
\r
1985 * @param pwType DOCUMENT ME!
\r
1986 * @param title DOCUMENT ME!
\r
1988 void NewTreePanel(String type, String pwType, String title)
\r
1990 final TreePanel tp;
\r
1992 if ( (viewport.getSelectionGroup() != null) &&
\r
1993 (viewport.getSelectionGroup().getSize() > 3))
\r
1996 SequenceGroup sg = viewport.getSelectionGroup();
\r
1998 /* Decide if the selection is a column region */
\r
1999 while (s < sg.sequences.size())
\r
2001 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
2004 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2005 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2006 "Try using the Pad function in the edit menu,\n" +
\r
2007 "or one of the multiple sequence alignment web services.",
\r
2008 "Sequences in selection are not aligned",
\r
2009 JOptionPane.WARNING_MESSAGE);
\r
2015 title = title + " on region";
\r
2016 tp = new TreePanel(viewport,
\r
2017 viewport.getSelectionGroup().sequences, type, pwType,
\r
2018 sg.getStartRes(), sg.getEndRes());
\r
2022 //are the sequences aligned?
\r
2023 if (!viewport.alignment.isAligned())
\r
2025 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2026 "The sequences must be aligned before creating a tree.\n" +
\r
2027 "Try using the Pad function in the edit menu,\n" +
\r
2028 "or one of the multiple sequence alignment web services.",
\r
2029 "Sequences not aligned",
\r
2030 JOptionPane.WARNING_MESSAGE);
\r
2035 tp = new TreePanel(viewport,
\r
2036 viewport.getAlignment().getSequences(), type, pwType,
\r
2038 viewport.alignment.getWidth());
\r
2041 addTreeMenuItem(tp, title);
\r
2042 viewport.setCurrentTree(tp.getTree());
\r
2044 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2050 * @param title DOCUMENT ME!
\r
2051 * @param order DOCUMENT ME!
\r
2053 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2055 final JMenuItem item = new JMenuItem("by " + title);
\r
2057 item.addActionListener(new java.awt.event.ActionListener()
\r
2059 public void actionPerformed(ActionEvent e)
\r
2061 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2062 HistoryItem.SORT));
\r
2064 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2065 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2066 alignPanel.repaint();
\r
2072 * Maintain the Order by->Displayed Tree menu.
\r
2073 * Creates a new menu item for a TreePanel with an appropriate
\r
2074 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2075 * to remove the menu item when the treePanel is closed, and adjust
\r
2076 * the tree leaf to sequence mapping when the alignment is modified.
\r
2077 * @param treePanel Displayed tree window.
\r
2078 * @param title SortBy menu item title.
\r
2080 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2082 final JMenuItem item = new JMenuItem(title);
\r
2086 if (treeCount == 1)
\r
2088 sort.add(sortByTreeMenu);
\r
2091 sortByTreeMenu.add(item);
\r
2092 item.addActionListener(new java.awt.event.ActionListener()
\r
2094 public void actionPerformed(ActionEvent e)
\r
2096 addHistoryItem(new HistoryItem("Tree Sort",
\r
2097 viewport.alignment, HistoryItem.SORT));
\r
2098 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2099 treePanel.getTree());
\r
2100 alignPanel.repaint();
\r
2104 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2105 InternalFrameAdapter()
\r
2107 public void internalFrameClosed(
\r
2108 javax.swing.event.InternalFrameEvent evt)
\r
2111 sortByTreeMenu.remove(item);
\r
2113 if (treeCount == 0)
\r
2115 sort.remove(sortByTreeMenu);
\r
2123 * Work out whether the whole set of sequences
\r
2124 * or just the selected set will be submitted for multiple alignment.
\r
2127 private SequenceI[] gatherSequencesForAlignment()
\r
2129 // Now, check we have enough sequences
\r
2130 SequenceI[] msa = null;
\r
2132 if ( (viewport.getSelectionGroup() != null) &&
\r
2133 (viewport.getSelectionGroup().getSize() > 1))
\r
2135 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2136 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2138 msa = new SequenceI[sz = seqs.getSize()];
\r
2140 for (int i = 0; i < sz; i++)
\r
2142 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2147 Vector seqs = viewport.getAlignment().getSequences();
\r
2149 if (seqs.size() > 1)
\r
2151 msa = new SequenceI[seqs.size()];
\r
2153 for (int i = 0; i < seqs.size(); i++)
\r
2155 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2163 * Decides what is submitted to a secondary structure prediction service,
\r
2164 * the currently selected sequence, or the currently selected alignment
\r
2165 * (where the first sequence in the set is the one that the prediction
\r
2168 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2170 SequenceI seq = null;
\r
2171 SequenceI[] msa = null;
\r
2173 if ( (viewport.getSelectionGroup() != null) &&
\r
2174 (viewport.getSelectionGroup().getSize() > 0))
\r
2176 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2177 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2179 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2181 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2186 msa = new SequenceI[sz = seqs.getSize()];
\r
2188 for (int i = 0; i < sz; i++)
\r
2190 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2196 Vector seqs = viewport.getAlignment().getSequences();
\r
2198 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2200 seq = (SequenceI) seqs.elementAt(0);
\r
2204 msa = new SequenceI[seqs.size()];
\r
2206 for (int i = 0; i < seqs.size(); i++)
\r
2208 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2220 return new SequenceI[]
\r
2230 * @param e DOCUMENT ME!
\r
2232 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2234 // Pick the tree file
\r
2235 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2237 "LAST_DIRECTORY"));
\r
2238 chooser.setFileView(new JalviewFileView());
\r
2239 chooser.setDialogTitle("Select a newick-like tree file");
\r
2240 chooser.setToolTipText("Load a tree file");
\r
2242 int value = chooser.showOpenDialog(null);
\r
2244 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2246 String choice = chooser.getSelectedFile().getPath();
\r
2247 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2251 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2253 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2255 catch (Exception ex)
\r
2257 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2258 "Problem reading tree file",
\r
2260 JOptionPane.WARNING_MESSAGE);
\r
2261 ex.printStackTrace();
\r
2267 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2269 return ShowNewickTree(nf,title,600,500,4,5);
\r
2274 * @param nf DOCUMENT ME!
\r
2275 * @param title DOCUMENT ME!
\r
2277 * @return DOCUMENT ME!
\r
2279 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2281 TreePanel tp = null;
\r
2287 if (nf.getTree() != null)
\r
2289 tp = new TreePanel(viewport,
\r
2290 viewport.getAlignment().getSequences(), nf,
\r
2297 tp.setLocation(x,y);
\r
2300 Desktop.addInternalFrame(tp, title, w, h);
\r
2301 addTreeMenuItem(tp, title);
\r
2304 catch (Exception ex)
\r
2306 ex.printStackTrace();
\r
2317 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2318 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2319 printJob.setPrintable(alignPanel, pf);
\r
2321 if (printJob.printDialog())
\r
2327 catch (Exception PrintException)
\r
2329 PrintException.printStackTrace();
\r
2336 * Generates menu items and listener event actions for web service clients
\r
2339 public void BuildWebServiceMenu()
\r
2341 if ( (Discoverer.services != null)
\r
2342 && (Discoverer.services.size() > 0))
\r
2344 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2345 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2346 Vector wsmenu = new Vector();
\r
2347 if (msaws != null)
\r
2349 // Add any Multiple Sequence Alignment Services
\r
2350 final JMenu msawsmenu = new JMenu("Alignment");
\r
2351 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2353 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2355 final JMenuItem method = new JMenuItem(sh.getName());
\r
2356 method.addActionListener(new ActionListener()
\r
2358 public void actionPerformed(ActionEvent e)
\r
2360 SequenceI[] msa = gatherSequencesForAlignment();
\r
2361 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2362 false, true, viewport.getAlignment().getDataset());
\r
2367 msawsmenu.add(method);
\r
2368 // Deal with services that we know accept partial alignments.
\r
2369 if (sh.getName().indexOf("lustal") > -1)
\r
2371 // We know that ClustalWS can accept partial alignments for refinement.
\r
2372 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2373 methodR.addActionListener(new ActionListener()
\r
2375 public void actionPerformed(ActionEvent e)
\r
2377 SequenceI[] msa = gatherSequencesForAlignment();
\r
2378 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2379 true, true, viewport.getAlignment().getDataset());
\r
2384 msawsmenu.add(methodR);
\r
2388 wsmenu.add(msawsmenu);
\r
2390 if (secstrpr != null)
\r
2392 // Add any secondary structure prediction services
\r
2393 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2394 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2396 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2398 final JMenuItem method = new JMenuItem(sh.getName());
\r
2399 method.addActionListener(new ActionListener()
\r
2401 public void actionPerformed(ActionEvent e)
\r
2403 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2404 if (msa.length == 1)
\r
2406 // Single Sequence prediction
\r
2407 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2411 if (msa.length > 1)
\r
2413 // Single Sequence prediction
\r
2414 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2420 secstrmenu.add(method);
\r
2422 wsmenu.add(secstrmenu);
\r
2424 this.webService.removeAll();
\r
2425 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2427 webService.add( (JMenu) wsmenu.get(i));
\r
2432 this.webService.removeAll();
\r
2433 this.webService.add(this.webServiceNoServices);
\r
2435 // TODO: add in rediscovery function
\r
2436 // TODO: reduce code redundancy.
\r
2437 // TODO: group services by location as well as function.
\r
2440 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2442 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2443 getProperty("LAST_DIRECTORY"));
\r
2445 chooser.setFileView(new JalviewFileView());
\r
2446 chooser.setDialogTitle("Export to Vamsas file");
\r
2447 chooser.setToolTipText("Export");
\r
2449 int value = chooser.showSaveDialog(this);
\r
2451 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2453 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2454 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2455 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2463 public void showTranslation_actionPerformed(ActionEvent e)
\r
2465 int s, sSize = viewport.alignment.getHeight();
\r
2466 SequenceI [] newSeq = new SequenceI[sSize];
\r
2469 StringBuffer protein;
\r
2471 for(s=0; s<sSize; s++)
\r
2473 protein = new StringBuffer();
\r
2474 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2475 resSize = seq.length();
\r
2476 resSize -= resSize%3;
\r
2478 for(res = 0; res < resSize; res+=3)
\r
2480 String codon = seq.substring(res, res+3);
\r
2481 codon = codon.replace('U', 'T');
\r
2482 String aa = ResidueProperties.codonTranslate(codon);
\r
2484 protein.append(viewport.getGapCharacter());
\r
2485 else if(aa.equals("STOP"))
\r
2486 protein.append("X");
\r
2488 protein.append( aa );
\r
2490 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2494 AlignmentI al = new Alignment(newSeq);
\r
2495 al.setDataset(null);
\r
2498 ////////////////////////////////
\r
2499 // Copy annotations across
\r
2500 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2501 = viewport.alignment.getAlignmentAnnotation();
\r
2503 for (int i = 0; i < annotations.length; i++)
\r
2506 if (annotations[i].label.equals("Quality") ||
\r
2507 annotations[i].label.equals("Conservation") ||
\r
2508 annotations[i].label.equals("Consensus"))
\r
2514 aSize = viewport.alignment.getWidth()/3;
\r
2515 jalview.datamodel.Annotation [] anots =
\r
2516 new jalview.datamodel.Annotation[aSize];
\r
2518 for(a=0; a<viewport.alignment.getWidth(); a++)
\r
2520 if( annotations[i].annotations[a]==null
\r
2521 || annotations[i].annotations[a]==null)
\r
2524 anots[a/3] = new Annotation(
\r
2525 annotations[i].annotations[a].displayCharacter,
\r
2526 annotations[i].annotations[a].description,
\r
2527 annotations[i].annotations[a].secondaryStructure,
\r
2528 annotations[i].annotations[a].value,
\r
2529 annotations[i].annotations[a].colour);
\r
2532 jalview.datamodel.AlignmentAnnotation aa
\r
2533 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2534 annotations[i].description, anots );
\r
2535 al.addAnnotation(aa);
\r
2539 AlignFrame af = new AlignFrame(al);
\r
2540 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2542 NEW_WINDOW_HEIGHT);
\r
2545 // AlignViewport newViewport = new AlignViewport(al);
\r
2546 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2547 // tabbedPane.add("Protein", ap);
\r
2548 // viewports.add(newViewport);
\r
2549 // alignPanels.add(ap);
\r
2552 /////////////////////////
\r
2554 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2555 // ds.setDataset(true);
\r
2556 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2557 // tabbedPane.add("Dataset", dap);
\r
2558 // viewports.add(ds);
\r
2559 // alignPanels.add(dap);
\r
2560 /////////////////////////
\r
2565 /*public void tabSelected()
\r
2567 int index = tabbedPane.getSelectedIndex();
\r
2568 viewport = (AlignViewport)viewports.elementAt(index);
\r
2569 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2575 * @param String DOCUMENT ME!
\r
2577 public boolean parseGroupsFile(String file)
\r
2581 BufferedReader in = new BufferedReader(new FileReader(file));
\r
2582 SequenceI seq = null;
\r
2583 String line, type, desc, token;
\r
2585 int index, start, end;
\r
2586 StringTokenizer st;
\r
2587 SequenceFeature sf;
\r
2589 String featureGroup = null;
\r
2590 while ( (line = in.readLine()) != null)
\r
2593 st = new StringTokenizer(line, "\t");
\r
2594 if (st.countTokens() == 2)
\r
2596 type = st.nextToken();
\r
2597 if (type.equalsIgnoreCase("startgroup"))
\r
2599 featureGroup = st.nextToken();
\r
2601 else if (type.equalsIgnoreCase("endgroup"))
\r
2603 //We should check whether this is the current group,
\r
2604 //but at present theres no way of showing more than 1 group
\r
2606 featureGroup = null;
\r
2610 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2611 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type,
\r
2612 ucs.findColour("A"));
\r
2617 while (st.hasMoreElements())
\r
2619 desc = st.nextToken();
\r
2620 token = st.nextToken();
\r
2621 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2623 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2628 index = Integer.parseInt(st.nextToken());
\r
2631 start = Integer.parseInt(st.nextToken());
\r
2632 end = Integer.parseInt(st.nextToken());
\r
2634 seq = viewport.alignment.getSequenceAt(index);
\r
2636 type = st.nextToken();
\r
2638 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2640 // Probably the old style groups file
\r
2641 UserColourScheme ucs = new UserColourScheme(type);
\r
2642 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2645 sf = new SequenceFeature(type, desc, "", start, end);
\r
2646 sf.setFeatureGroup(featureGroup);
\r
2648 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2652 catch (Exception ex)
\r
2654 ex.printStackTrace();
\r
2655 System.out.println("Error parsing groups file: " + ex);
\r
2659 viewport.showSequenceFeatures = true;
\r
2660 showSeqFeatures.setSelected(true);
\r
2661 alignPanel.repaint();
\r
2665 public void dragEnter(DropTargetDragEvent evt)
\r
2668 public void dragExit(DropTargetEvent evt)
\r
2671 public void dragOver(DropTargetDragEvent evt)
\r
2674 public void dropActionChanged(DropTargetDragEvent evt)
\r
2677 public void drop(DropTargetDropEvent evt)
\r
2679 Transferable t = evt.getTransferable();
\r
2680 java.util.List files = null;
\r
2684 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2685 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2687 //Works on Windows and MacOSX
\r
2688 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2689 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2691 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2693 // This is used by Unix drag system
\r
2694 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2695 String data = (String) t.getTransferData(uriListFlavor);
\r
2696 files = new java.util.ArrayList(1);
\r
2697 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2700 st.hasMoreTokens(); )
\r
2702 String s = st.nextToken();
\r
2703 if (s.startsWith("#"))
\r
2705 // the line is a comment (as per the RFC 2483)
\r
2709 java.net.URI uri = new java.net.URI(s);
\r
2710 java.io.File file = new java.io.File(uri);
\r
2715 catch (Exception e)
\r
2717 e.printStackTrace();
\r
2720 if (files != null)
\r
2724 boolean isAnnotation = false;
\r
2726 for (int i = 0; i < files.size(); i++)
\r
2728 String file = files.get(i).toString();
\r
2730 isAnnotation = new AnnotationReader().readAnnotationFile(viewport.alignment, file);
\r
2732 if( !isAnnotation )
\r
2734 boolean isGroupsFile = parseGroupsFile(file);
\r
2735 if (!isGroupsFile)
\r
2737 String protocol = "File";
\r
2738 String format = jalview.io.IdentifyFile.Identify(file, protocol);
\r
2739 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol, format);
\r
2741 FastaFile ff = new FastaFile();
\r
2742 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2743 c.setContents(new StringSelection(ff.print(sequences)), this);
\r
2745 this.paste(false);
\r
2753 int height = alignPanel.annotationPanel.adjustPanelHeight();
\r
2754 alignPanel.annotationScroller.setPreferredSize(
\r
2755 new Dimension(alignPanel.annotationScroller.getWidth(),
\r
2758 alignPanel.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
\r
2759 alignPanel.annotationSpaceFillerHolder.getWidth(),
\r
2762 alignPanel.addNotify();
\r
2765 catch (Exception ex)
\r
2767 ex.printStackTrace();
\r