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 = new 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 PaintRefresher.Refresh(null, viewport.alignment);
\r
935 * @param e DOCUMENT ME!
\r
937 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
939 SequenceGroup sg = viewport.getSelectionGroup();
\r
943 selectAllSequenceMenuItem_actionPerformed(null);
\r
948 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
951 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
954 PaintRefresher.Refresh(null, viewport.alignment);
\r
960 * @param e DOCUMENT ME!
\r
962 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
964 ColumnSelection colSel = viewport.getColumnSelection();
\r
966 if (colSel.size() > 0)
\r
968 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
969 HistoryItem.HIDE));
\r
971 int min = colSel.getMin();
\r
972 viewport.getAlignment().trimLeft(min);
\r
973 colSel.compensateForEdit(0, min);
\r
975 if (viewport.getSelectionGroup() != null)
\r
977 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
980 Vector groups = viewport.alignment.getGroups();
\r
982 for (int i = 0; i < groups.size(); i++)
\r
984 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
986 if (!sg.adjustForRemoveLeft(min))
\r
988 viewport.alignment.deleteGroup(sg);
\r
992 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
999 * @param e DOCUMENT ME!
\r
1001 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1003 ColumnSelection colSel = viewport.getColumnSelection();
\r
1005 if (colSel.size() > 0)
\r
1007 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1008 HistoryItem.HIDE));
\r
1010 int max = colSel.getMax();
\r
1011 viewport.getAlignment().trimRight(max);
\r
1013 if (viewport.getSelectionGroup() != null)
\r
1015 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1018 Vector groups = viewport.alignment.getGroups();
\r
1020 for (int i = 0; i < groups.size(); i++)
\r
1022 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1024 if (!sg.adjustForRemoveRight(max))
\r
1026 viewport.alignment.deleteGroup(sg);
\r
1030 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1037 * @param e DOCUMENT ME!
\r
1039 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1041 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1042 viewport.alignment, HistoryItem.HIDE));
\r
1044 //This is to maintain viewport position on first residue
\r
1045 //of first sequence
\r
1046 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1047 int startRes = seq.findPosition(viewport.startRes);
\r
1049 viewport.getAlignment().removeGaps();
\r
1051 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1053 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1059 * @param e DOCUMENT ME!
\r
1061 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1063 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1064 HistoryItem.HIDE));
\r
1066 //This is to maintain viewport position on first residue
\r
1067 //of first sequence
\r
1068 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1069 int startRes = seq.findPosition(viewport.startRes);
\r
1072 SequenceI current;
\r
1075 Vector seqs = null;
\r
1078 int end = viewport.alignment.getWidth();
\r
1080 if (viewport.getSelectionGroup() != null
\r
1081 && viewport.getSelectionGroup().sequences != null
\r
1082 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1084 seqs = viewport.getSelectionGroup().sequences;
\r
1085 start = viewport.getSelectionGroup().getStartRes();
\r
1086 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1090 seqs = viewport.alignment.getSequences();
\r
1093 for (int i = 0; i < seqs.size(); i++)
\r
1095 current = (SequenceI) seqs.elementAt(i);
\r
1096 jSize = current.getLength();
\r
1098 // Removing a range is much quicker than removing gaps
\r
1099 // one by one for long sequences
\r
1101 int rangeStart=-1, rangeEnd=-1;
\r
1105 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1107 if(rangeStart==-1)
\r
1122 current.deleteChars(rangeStart, rangeEnd);
\r
1123 j-=rangeEnd-rangeStart;
\r
1124 jSize-=rangeEnd-rangeStart;
\r
1132 while (j < end && j < jSize);
\r
1135 current.deleteChars(rangeStart, rangeEnd);
\r
1139 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1141 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1144 public void alignmentChanged()
\r
1146 if(viewport.vconsensus!=null)
\r
1148 viewport.updateConsensus();
\r
1149 viewport.updateConservation();
\r
1151 resetAllColourSchemes();
\r
1152 if(alignPanel.overviewPanel!=null)
\r
1153 alignPanel.overviewPanel.updateOverviewImage();
\r
1155 viewport.alignment.adjustSequenceAnnotations();
\r
1157 alignPanel.repaint();
\r
1160 void resetAllColourSchemes()
\r
1162 ColourSchemeI cs = viewport.globalColourScheme;
\r
1165 if (cs instanceof ClustalxColourScheme)
\r
1167 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1168 resetClustalX(viewport.alignment.getSequences(),
\r
1169 viewport.alignment.getWidth());
\r
1172 cs.setConsensus(viewport.vconsensus);
\r
1173 if (cs.conservationApplied())
\r
1175 Alignment al = (Alignment) viewport.alignment;
\r
1176 Conservation c = new Conservation("All",
\r
1177 ResidueProperties.propHash, 3,
\r
1178 al.getSequences(), 0,
\r
1179 al.getWidth() - 1);
\r
1181 c.verdict(false, viewport.ConsPercGaps);
\r
1183 cs.setConservation(c);
\r
1187 int s, sSize = viewport.alignment.getGroups().size();
\r
1188 for(s=0; s<sSize; s++)
\r
1190 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1191 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1193 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1195 sg.recalcConservation();
\r
1202 * @param e DOCUMENT ME!
\r
1204 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1206 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1207 HistoryItem.HIDE));
\r
1208 if (viewport.getAlignment().padGaps())
\r
1209 alignmentChanged();
\r
1215 * @param e DOCUMENT ME!
\r
1217 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1219 JInternalFrame frame = new JInternalFrame();
\r
1220 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1221 frame.setContentPane(finder);
\r
1222 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1223 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1229 * @param e DOCUMENT ME!
\r
1231 public void font_actionPerformed(ActionEvent e)
\r
1233 new FontChooser(alignPanel);
\r
1236 public void smoothFont_actionPerformed(ActionEvent e)
\r
1238 viewport.antiAlias = smoothFont.isSelected();
\r
1239 alignPanel.annotationPanel.image = null;
\r
1240 alignPanel.repaint();
\r
1247 * @param e DOCUMENT ME!
\r
1249 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1251 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1253 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1254 alignPanel.repaint();
\r
1261 * @param e DOCUMENT ME!
\r
1263 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1265 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1266 alignPanel.repaint();
\r
1272 * @param e DOCUMENT ME!
\r
1274 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1276 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1277 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1278 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1279 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1280 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1281 alignPanel.repaint();
\r
1287 * @param e DOCUMENT ME!
\r
1289 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1291 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1292 alignPanel.repaint();
\r
1298 * @param e DOCUMENT ME!
\r
1300 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1302 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1303 alignPanel.repaint();
\r
1309 * @param e DOCUMENT ME!
\r
1311 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1313 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1314 alignPanel.repaint();
\r
1320 * @param e DOCUMENT ME!
\r
1322 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1324 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1325 alignPanel.repaint();
\r
1331 * @param e DOCUMENT ME!
\r
1333 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1335 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1336 alignPanel.repaint();
\r
1342 * @param e DOCUMENT ME!
\r
1344 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1346 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1347 alignPanel.repaint();
\r
1350 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1352 if (!viewport.alignment.isNucleotide())
\r
1354 new SequenceFeatureFetcher(viewport.
\r
1357 viewport.setShowSequenceFeatures(true);
\r
1358 showSeqFeatures.setSelected(true);
\r
1363 public void featureSettings_actionPerformed(ActionEvent e)
\r
1365 new FeatureSettings(viewport, alignPanel);
\r
1371 * @param evt DOCUMENT ME!
\r
1373 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1375 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1376 alignPanel.repaint();
\r
1377 if (alignPanel.getOverviewPanel() != null)
\r
1379 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1386 * @param e DOCUMENT ME!
\r
1388 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1390 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1391 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1397 * @param e DOCUMENT ME!
\r
1399 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1401 if (alignPanel.overviewPanel != null)
\r
1406 JInternalFrame frame = new JInternalFrame();
\r
1407 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1408 frame.setContentPane(overview);
\r
1409 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1410 frame.getWidth(), frame.getHeight());
\r
1412 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1413 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1415 public void internalFrameClosed(
\r
1416 javax.swing.event.InternalFrameEvent evt)
\r
1418 alignPanel.setOverviewPanel(null);
\r
1423 alignPanel.setOverviewPanel(overview);
\r
1429 * @param e DOCUMENT ME!
\r
1431 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1433 changeColour(null);
\r
1439 * @param e DOCUMENT ME!
\r
1441 public void clustalColour_actionPerformed(ActionEvent e)
\r
1443 changeColour(new ClustalxColourScheme(
\r
1444 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1450 * @param e DOCUMENT ME!
\r
1452 public void zappoColour_actionPerformed(ActionEvent e)
\r
1454 changeColour(new ZappoColourScheme());
\r
1460 * @param e DOCUMENT ME!
\r
1462 public void taylorColour_actionPerformed(ActionEvent e)
\r
1464 changeColour(new TaylorColourScheme());
\r
1470 * @param e DOCUMENT ME!
\r
1472 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1474 changeColour(new HydrophobicColourScheme());
\r
1480 * @param e DOCUMENT ME!
\r
1482 public void helixColour_actionPerformed(ActionEvent e)
\r
1484 changeColour(new HelixColourScheme());
\r
1490 * @param e DOCUMENT ME!
\r
1492 public void strandColour_actionPerformed(ActionEvent e)
\r
1494 changeColour(new StrandColourScheme());
\r
1500 * @param e DOCUMENT ME!
\r
1502 public void turnColour_actionPerformed(ActionEvent e)
\r
1504 changeColour(new TurnColourScheme());
\r
1510 * @param e DOCUMENT ME!
\r
1512 public void buriedColour_actionPerformed(ActionEvent e)
\r
1514 changeColour(new BuriedColourScheme());
\r
1520 * @param e DOCUMENT ME!
\r
1522 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1524 changeColour(new NucleotideColourScheme());
\r
1527 public void annotationColour_actionPerformed(ActionEvent e)
\r
1529 new AnnotationColourChooser(viewport, alignPanel);
\r
1536 * @param e DOCUMENT ME!
\r
1538 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1540 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1546 * @param cs DOCUMENT ME!
\r
1548 void changeColour(ColourSchemeI cs)
\r
1550 int threshold = 0;
\r
1554 if (viewport.getAbovePIDThreshold())
\r
1556 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1559 cs.setThreshold(threshold,
\r
1560 viewport.getIgnoreGapsConsensus());
\r
1562 viewport.setGlobalColourScheme(cs);
\r
1566 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1569 if (viewport.getConservationSelected())
\r
1572 Alignment al = (Alignment) viewport.alignment;
\r
1573 Conservation c = new Conservation("All",
\r
1574 ResidueProperties.propHash, 3,
\r
1575 al.getSequences(), 0,
\r
1576 al.getWidth() - 1);
\r
1579 c.verdict(false, viewport.ConsPercGaps);
\r
1581 cs.setConservation(c);
\r
1583 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1588 cs.setConservation(null);
\r
1591 cs.setConsensus(viewport.vconsensus);
\r
1594 viewport.setGlobalColourScheme(cs);
\r
1596 if (viewport.getColourAppliesToAllGroups())
\r
1598 Vector groups = viewport.alignment.getGroups();
\r
1600 for (int i = 0; i < groups.size(); i++)
\r
1602 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1610 if (cs instanceof ClustalxColourScheme)
\r
1612 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1614 else if (cs instanceof UserColourScheme)
\r
1616 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1622 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1624 catch (Exception ex)
\r
1629 if (viewport.getAbovePIDThreshold()
\r
1630 || cs instanceof PIDColourScheme
\r
1631 || cs instanceof Blosum62ColourScheme)
\r
1633 sg.cs.setThreshold(threshold,
\r
1634 viewport.getIgnoreGapsConsensus());
\r
1636 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1640 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1643 if (viewport.getConservationSelected())
\r
1645 Conservation c = new Conservation("Group",
\r
1646 ResidueProperties.propHash, 3,
\r
1648 viewport.alignment.getWidth() - 1);
\r
1650 c.verdict(false, viewport.ConsPercGaps);
\r
1651 sg.cs.setConservation(c);
\r
1654 sg.cs.setConservation(null);
\r
1658 if (alignPanel.getOverviewPanel() != null)
\r
1660 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1663 alignPanel.repaint();
\r
1669 * @param e DOCUMENT ME!
\r
1671 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1673 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1675 SliderPanel.setPIDSliderSource(alignPanel,
\r
1676 viewport.getGlobalColourScheme(),
\r
1678 SliderPanel.showPIDSlider();
\r
1685 * @param e DOCUMENT ME!
\r
1687 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1689 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1691 SliderPanel.setConservationSlider(alignPanel,
\r
1692 viewport.globalColourScheme,
\r
1694 SliderPanel.showConservationSlider();
\r
1701 * @param e DOCUMENT ME!
\r
1703 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1705 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1707 viewport.setAbovePIDThreshold(false);
\r
1708 abovePIDThreshold.setSelected(false);
\r
1710 changeColour(viewport.getGlobalColourScheme());
\r
1712 modifyConservation_actionPerformed(null);
\r
1718 * @param e DOCUMENT ME!
\r
1720 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1722 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1724 conservationMenuItem.setSelected(false);
\r
1725 viewport.setConservationSelected(false);
\r
1727 changeColour(viewport.getGlobalColourScheme());
\r
1729 modifyPID_actionPerformed(null);
\r
1735 * @param e DOCUMENT ME!
\r
1737 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1739 if (e.getActionCommand().equals("User Defined..."))
\r
1741 new UserDefinedColours(alignPanel, null);
\r
1745 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1746 getUserColourSchemes().get(e.getActionCommand());
\r
1748 changeColour(udc);
\r
1752 public void updateUserColourMenu()
\r
1755 Component[] menuItems = colourMenu.getMenuComponents();
\r
1756 int i, iSize = menuItems.length;
\r
1757 for (i = 0; i < iSize; i++)
\r
1759 if (menuItems[i].getName() != null &&
\r
1760 menuItems[i].getName().equals("USER_DEFINED"))
\r
1762 colourMenu.remove(menuItems[i]);
\r
1766 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1768 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1769 getUserColourSchemes().keys();
\r
1771 while (userColours.hasMoreElements())
\r
1773 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1774 nextElement().toString());
\r
1775 radioItem.setName("USER_DEFINED");
\r
1776 radioItem.addMouseListener(new MouseAdapter()
\r
1778 public void mousePressed(MouseEvent evt)
\r
1780 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1782 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1784 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1785 "Remove from default list?",
\r
1786 "Remove user defined colour",
\r
1787 JOptionPane.YES_NO_OPTION);
\r
1788 if(option == JOptionPane.YES_OPTION)
\r
1790 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1791 colourMenu.remove(radioItem);
\r
1794 radioItem.addActionListener(new ActionListener()
\r
1796 public void actionPerformed(ActionEvent evt)
\r
1798 userDefinedColour_actionPerformed(evt);
\r
1804 radioItem.addActionListener(new ActionListener()
\r
1806 public void actionPerformed(ActionEvent evt)
\r
1808 userDefinedColour_actionPerformed(evt);
\r
1812 colourMenu.insert(radioItem, 15);
\r
1813 colours.add(radioItem);
\r
1821 * @param e DOCUMENT ME!
\r
1823 public void PIDColour_actionPerformed(ActionEvent e)
\r
1825 changeColour(new PIDColourScheme());
\r
1831 * @param e DOCUMENT ME!
\r
1833 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1835 changeColour(new Blosum62ColourScheme());
\r
1841 * @param e DOCUMENT ME!
\r
1843 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1845 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1846 HistoryItem.SORT));
\r
1847 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1848 viewport.getAlignment().getSequenceAt(0));
\r
1849 alignPanel.repaint();
\r
1855 * @param e DOCUMENT ME!
\r
1857 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1859 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1860 HistoryItem.SORT));
\r
1861 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1862 alignPanel.repaint();
\r
1868 * @param e DOCUMENT ME!
\r
1870 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1872 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1873 HistoryItem.SORT));
\r
1875 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1876 alignPanel.repaint();
\r
1882 * @param e DOCUMENT ME!
\r
1884 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1886 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1887 JInternalFrame frame = new JInternalFrame();
\r
1888 frame.setContentPane(sp);
\r
1889 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1896 * @param e DOCUMENT ME!
\r
1898 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1900 if ( (viewport.getSelectionGroup() == null) ||
\r
1901 (viewport.getSelectionGroup().getSize() < 2))
\r
1903 JOptionPane.showInternalMessageDialog(this,
\r
1904 "You must select at least 2 sequences.",
\r
1905 "Invalid Selection",
\r
1906 JOptionPane.WARNING_MESSAGE);
\r
1910 JInternalFrame frame = new JInternalFrame();
\r
1911 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1912 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1919 * @param e DOCUMENT ME!
\r
1921 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1923 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1924 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1925 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1926 (viewport.getAlignment().getHeight() < 4))
\r
1928 JOptionPane.showInternalMessageDialog(this,
\r
1929 "Principal component analysis must take\n" +
\r
1930 "at least 4 input sequences.",
\r
1931 "Sequence selection insufficient",
\r
1932 JOptionPane.WARNING_MESSAGE);
\r
1937 new PCAPanel(viewport);
\r
1943 * @param e DOCUMENT ME!
\r
1945 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1947 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1953 * @param e DOCUMENT ME!
\r
1955 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1957 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1963 * @param e DOCUMENT ME!
\r
1965 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1967 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1973 * @param e DOCUMENT ME!
\r
1975 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1977 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1983 * @param type DOCUMENT ME!
\r
1984 * @param pwType DOCUMENT ME!
\r
1985 * @param title DOCUMENT ME!
\r
1987 void NewTreePanel(String type, String pwType, String title)
\r
1989 final TreePanel tp;
\r
1991 if ( (viewport.getSelectionGroup() != null) &&
\r
1992 (viewport.getSelectionGroup().getSize() > 3))
\r
1995 SequenceGroup sg = viewport.getSelectionGroup();
\r
1997 /* Decide if the selection is a column region */
\r
1998 while (s < sg.sequences.size())
\r
2000 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
2003 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2004 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2005 "Try using the Pad function in the edit menu,\n" +
\r
2006 "or one of the multiple sequence alignment web services.",
\r
2007 "Sequences in selection are not aligned",
\r
2008 JOptionPane.WARNING_MESSAGE);
\r
2014 title = title + " on region";
\r
2015 tp = new TreePanel(viewport,
\r
2016 viewport.getSelectionGroup().sequences, type, pwType,
\r
2017 sg.getStartRes(), sg.getEndRes());
\r
2021 //are the sequences aligned?
\r
2022 if (!viewport.alignment.isAligned())
\r
2024 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2025 "The sequences must be aligned before creating a tree.\n" +
\r
2026 "Try using the Pad function in the edit menu,\n" +
\r
2027 "or one of the multiple sequence alignment web services.",
\r
2028 "Sequences not aligned",
\r
2029 JOptionPane.WARNING_MESSAGE);
\r
2034 tp = new TreePanel(viewport,
\r
2035 viewport.getAlignment().getSequences(), type, pwType,
\r
2037 viewport.alignment.getWidth());
\r
2040 addTreeMenuItem(tp, title);
\r
2041 viewport.setCurrentTree(tp.getTree());
\r
2043 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2049 * @param title DOCUMENT ME!
\r
2050 * @param order DOCUMENT ME!
\r
2052 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2054 final JMenuItem item = new JMenuItem("by " + title);
\r
2056 item.addActionListener(new java.awt.event.ActionListener()
\r
2058 public void actionPerformed(ActionEvent e)
\r
2060 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2061 HistoryItem.SORT));
\r
2063 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2064 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2065 alignPanel.repaint();
\r
2071 * Maintain the Order by->Displayed Tree menu.
\r
2072 * Creates a new menu item for a TreePanel with an appropriate
\r
2073 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2074 * to remove the menu item when the treePanel is closed, and adjust
\r
2075 * the tree leaf to sequence mapping when the alignment is modified.
\r
2076 * @param treePanel Displayed tree window.
\r
2077 * @param title SortBy menu item title.
\r
2079 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2081 final JMenuItem item = new JMenuItem(title);
\r
2085 if (treeCount == 1)
\r
2087 sort.add(sortByTreeMenu);
\r
2090 sortByTreeMenu.add(item);
\r
2091 item.addActionListener(new java.awt.event.ActionListener()
\r
2093 public void actionPerformed(ActionEvent e)
\r
2095 addHistoryItem(new HistoryItem("Tree Sort",
\r
2096 viewport.alignment, HistoryItem.SORT));
\r
2097 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2098 treePanel.getTree());
\r
2099 alignPanel.repaint();
\r
2103 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2104 InternalFrameAdapter()
\r
2106 public void internalFrameClosed(
\r
2107 javax.swing.event.InternalFrameEvent evt)
\r
2110 sortByTreeMenu.remove(item);
\r
2112 if (treeCount == 0)
\r
2114 sort.remove(sortByTreeMenu);
\r
2122 * Work out whether the whole set of sequences
\r
2123 * or just the selected set will be submitted for multiple alignment.
\r
2126 private SequenceI[] gatherSequencesForAlignment()
\r
2128 // Now, check we have enough sequences
\r
2129 SequenceI[] msa = null;
\r
2131 if ( (viewport.getSelectionGroup() != null) &&
\r
2132 (viewport.getSelectionGroup().getSize() > 1))
\r
2134 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2135 SequenceGroup seqs = viewport.getSelectionGroup();
\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
2146 Vector seqs = viewport.getAlignment().getSequences();
\r
2148 if (seqs.size() > 1)
\r
2150 msa = new SequenceI[seqs.size()];
\r
2152 for (int i = 0; i < seqs.size(); i++)
\r
2154 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2162 * Decides what is submitted to a secondary structure prediction service,
\r
2163 * the currently selected sequence, or the currently selected alignment
\r
2164 * (where the first sequence in the set is the one that the prediction
\r
2167 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2169 SequenceI seq = null;
\r
2170 SequenceI[] msa = null;
\r
2172 if ( (viewport.getSelectionGroup() != null) &&
\r
2173 (viewport.getSelectionGroup().getSize() > 0))
\r
2175 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2176 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2178 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2180 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2185 msa = new SequenceI[sz = seqs.getSize()];
\r
2187 for (int i = 0; i < sz; i++)
\r
2189 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2195 Vector seqs = viewport.getAlignment().getSequences();
\r
2197 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2199 seq = (SequenceI) seqs.elementAt(0);
\r
2203 msa = new SequenceI[seqs.size()];
\r
2205 for (int i = 0; i < seqs.size(); i++)
\r
2207 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2219 return new SequenceI[]
\r
2229 * @param e DOCUMENT ME!
\r
2231 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2233 // Pick the tree file
\r
2234 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2236 "LAST_DIRECTORY"));
\r
2237 chooser.setFileView(new JalviewFileView());
\r
2238 chooser.setDialogTitle("Select a newick-like tree file");
\r
2239 chooser.setToolTipText("Load a tree file");
\r
2241 int value = chooser.showOpenDialog(null);
\r
2243 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2245 String choice = chooser.getSelectedFile().getPath();
\r
2246 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2250 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2252 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2254 catch (Exception ex)
\r
2256 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2257 "Problem reading tree file",
\r
2259 JOptionPane.WARNING_MESSAGE);
\r
2260 ex.printStackTrace();
\r
2266 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2268 return ShowNewickTree(nf,title,600,500,4,5);
\r
2273 * @param nf DOCUMENT ME!
\r
2274 * @param title DOCUMENT ME!
\r
2276 * @return DOCUMENT ME!
\r
2278 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2280 TreePanel tp = null;
\r
2286 if (nf.getTree() != null)
\r
2288 tp = new TreePanel(viewport,
\r
2289 viewport.getAlignment().getSequences(), nf,
\r
2296 tp.setLocation(x,y);
\r
2299 Desktop.addInternalFrame(tp, title, w, h);
\r
2300 addTreeMenuItem(tp, title);
\r
2303 catch (Exception ex)
\r
2305 ex.printStackTrace();
\r
2316 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2317 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2318 printJob.setPrintable(alignPanel, pf);
\r
2320 if (printJob.printDialog())
\r
2326 catch (Exception PrintException)
\r
2328 PrintException.printStackTrace();
\r
2335 * Generates menu items and listener event actions for web service clients
\r
2338 public void BuildWebServiceMenu()
\r
2340 if ( (Discoverer.services != null)
\r
2341 && (Discoverer.services.size() > 0))
\r
2343 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2344 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2345 Vector wsmenu = new Vector();
\r
2346 if (msaws != null)
\r
2348 // Add any Multiple Sequence Alignment Services
\r
2349 final JMenu msawsmenu = new JMenu("Alignment");
\r
2350 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2352 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2354 final JMenuItem method = new JMenuItem(sh.getName());
\r
2355 method.addActionListener(new ActionListener()
\r
2357 public void actionPerformed(ActionEvent e)
\r
2359 SequenceI[] msa = gatherSequencesForAlignment();
\r
2360 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2361 false, true, viewport.getAlignment().getDataset());
\r
2366 msawsmenu.add(method);
\r
2367 // Deal with services that we know accept partial alignments.
\r
2368 if (sh.getName().indexOf("lustal") > -1)
\r
2370 // We know that ClustalWS can accept partial alignments for refinement.
\r
2371 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2372 methodR.addActionListener(new ActionListener()
\r
2374 public void actionPerformed(ActionEvent e)
\r
2376 SequenceI[] msa = gatherSequencesForAlignment();
\r
2377 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2378 true, true, viewport.getAlignment().getDataset());
\r
2383 msawsmenu.add(methodR);
\r
2387 wsmenu.add(msawsmenu);
\r
2389 if (secstrpr != null)
\r
2391 // Add any secondary structure prediction services
\r
2392 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2393 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2395 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2397 final JMenuItem method = new JMenuItem(sh.getName());
\r
2398 method.addActionListener(new ActionListener()
\r
2400 public void actionPerformed(ActionEvent e)
\r
2402 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2403 if (msa.length == 1)
\r
2405 // Single Sequence prediction
\r
2406 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2410 if (msa.length > 1)
\r
2412 // Single Sequence prediction
\r
2413 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2419 secstrmenu.add(method);
\r
2421 wsmenu.add(secstrmenu);
\r
2423 this.webService.removeAll();
\r
2424 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2426 webService.add( (JMenu) wsmenu.get(i));
\r
2431 this.webService.removeAll();
\r
2432 this.webService.add(this.webServiceNoServices);
\r
2434 // TODO: add in rediscovery function
\r
2435 // TODO: reduce code redundancy.
\r
2436 // TODO: group services by location as well as function.
\r
2439 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2441 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2442 getProperty("LAST_DIRECTORY"));
\r
2444 chooser.setFileView(new JalviewFileView());
\r
2445 chooser.setDialogTitle("Export to Vamsas file");
\r
2446 chooser.setToolTipText("Export");
\r
2448 int value = chooser.showSaveDialog(this);
\r
2450 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2452 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2453 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2454 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2462 public void showTranslation_actionPerformed(ActionEvent e)
\r
2464 int s, sSize = viewport.alignment.getHeight();
\r
2465 SequenceI [] newSeq = new SequenceI[sSize];
\r
2468 StringBuffer protein;
\r
2470 for(s=0; s<sSize; s++)
\r
2472 protein = new StringBuffer();
\r
2473 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2474 resSize = seq.length();
\r
2475 resSize -= resSize%3;
\r
2477 for(res = 0; res < resSize; res+=3)
\r
2479 String codon = seq.substring(res, res+3);
\r
2480 codon = codon.replace('U', 'T');
\r
2481 String aa = ResidueProperties.codonTranslate(codon);
\r
2483 protein.append(viewport.getGapCharacter());
\r
2484 else if(aa.equals("STOP"))
\r
2485 protein.append("X");
\r
2487 protein.append( aa );
\r
2489 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2493 AlignmentI al = new Alignment(newSeq);
\r
2494 al.setDataset(null);
\r
2497 ////////////////////////////////
\r
2498 // Copy annotations across
\r
2499 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2500 = viewport.alignment.getAlignmentAnnotation();
\r
2502 for (int i = 0; i < annotations.length; i++)
\r
2505 if (annotations[i].label.equals("Quality") ||
\r
2506 annotations[i].label.equals("Conservation") ||
\r
2507 annotations[i].label.equals("Consensus"))
\r
2513 aSize = viewport.alignment.getWidth()/3;
\r
2514 jalview.datamodel.Annotation [] anots =
\r
2515 new jalview.datamodel.Annotation[aSize];
\r
2517 for(a=0; a<viewport.alignment.getWidth(); a++)
\r
2519 if( annotations[i].annotations[a]==null
\r
2520 || annotations[i].annotations[a]==null)
\r
2523 anots[a/3] = new Annotation(
\r
2524 annotations[i].annotations[a].displayCharacter,
\r
2525 annotations[i].annotations[a].description,
\r
2526 annotations[i].annotations[a].secondaryStructure,
\r
2527 annotations[i].annotations[a].value,
\r
2528 annotations[i].annotations[a].colour);
\r
2531 jalview.datamodel.AlignmentAnnotation aa
\r
2532 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2533 annotations[i].description, anots );
\r
2534 al.addAnnotation(aa);
\r
2538 AlignFrame af = new AlignFrame(al);
\r
2539 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2541 NEW_WINDOW_HEIGHT);
\r
2544 // AlignViewport newViewport = new AlignViewport(al);
\r
2545 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2546 // tabbedPane.add("Protein", ap);
\r
2547 // viewports.add(newViewport);
\r
2548 // alignPanels.add(ap);
\r
2551 /////////////////////////
\r
2553 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2554 // ds.setDataset(true);
\r
2555 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2556 // tabbedPane.add("Dataset", dap);
\r
2557 // viewports.add(ds);
\r
2558 // alignPanels.add(dap);
\r
2559 /////////////////////////
\r
2564 /*public void tabSelected()
\r
2566 int index = tabbedPane.getSelectedIndex();
\r
2567 viewport = (AlignViewport)viewports.elementAt(index);
\r
2568 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2574 * @param String DOCUMENT ME!
\r
2576 public boolean parseGroupsFile(String file)
\r
2580 BufferedReader in = new BufferedReader(new FileReader(file));
\r
2581 SequenceI seq = null;
\r
2582 String line, type, desc, token;
\r
2584 int index, start, end;
\r
2585 StringTokenizer st;
\r
2586 SequenceFeature sf;
\r
2588 String featureGroup = null;
\r
2589 while ( (line = in.readLine()) != null)
\r
2592 st = new StringTokenizer(line, "\t");
\r
2593 if (st.countTokens() == 2)
\r
2595 type = st.nextToken();
\r
2596 if (type.equalsIgnoreCase("startgroup"))
\r
2598 featureGroup = st.nextToken();
\r
2600 else if (type.equalsIgnoreCase("endgroup"))
\r
2602 //We should check whether this is the current group,
\r
2603 //but at present theres no way of showing more than 1 group
\r
2605 featureGroup = null;
\r
2609 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2610 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type,
\r
2611 ucs.findColour("A"));
\r
2616 while (st.hasMoreElements())
\r
2618 desc = st.nextToken();
\r
2619 token = st.nextToken();
\r
2620 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2622 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2627 index = Integer.parseInt(st.nextToken());
\r
2630 start = Integer.parseInt(st.nextToken());
\r
2631 end = Integer.parseInt(st.nextToken());
\r
2633 seq = viewport.alignment.getSequenceAt(index);
\r
2635 type = st.nextToken();
\r
2637 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2639 // Probably the old style groups file
\r
2640 UserColourScheme ucs = new UserColourScheme(type);
\r
2641 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2644 sf = new SequenceFeature(type, desc, "", start, end);
\r
2645 sf.setFeatureGroup(featureGroup);
\r
2647 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2651 catch (Exception ex)
\r
2653 ex.printStackTrace();
\r
2654 System.out.println("Error parsing groups file: " + ex);
\r
2658 viewport.showSequenceFeatures = true;
\r
2659 showSeqFeatures.setSelected(true);
\r
2660 alignPanel.repaint();
\r
2664 public void dragEnter(DropTargetDragEvent evt)
\r
2667 public void dragExit(DropTargetEvent evt)
\r
2670 public void dragOver(DropTargetDragEvent evt)
\r
2673 public void dropActionChanged(DropTargetDragEvent evt)
\r
2676 public void drop(DropTargetDropEvent evt)
\r
2678 Transferable t = evt.getTransferable();
\r
2679 java.util.List files = null;
\r
2683 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2684 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2686 //Works on Windows and MacOSX
\r
2687 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2688 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2690 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2692 // This is used by Unix drag system
\r
2693 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2694 String data = (String) t.getTransferData(uriListFlavor);
\r
2695 files = new java.util.ArrayList(1);
\r
2696 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2699 st.hasMoreTokens(); )
\r
2701 String s = st.nextToken();
\r
2702 if (s.startsWith("#"))
\r
2704 // the line is a comment (as per the RFC 2483)
\r
2708 java.net.URI uri = new java.net.URI(s);
\r
2709 java.io.File file = new java.io.File(uri);
\r
2714 catch (Exception e)
\r
2716 e.printStackTrace();
\r
2719 if (files != null)
\r
2723 boolean isAnnotation = false;
\r
2725 for (int i = 0; i < files.size(); i++)
\r
2727 String file = files.get(i).toString();
\r
2729 isAnnotation = new AnnotationReader().readAnnotationFile(viewport.alignment, file);
\r
2731 if( !isAnnotation )
\r
2733 boolean isGroupsFile = parseGroupsFile(file);
\r
2734 if (!isGroupsFile)
\r
2736 String protocol = "File";
\r
2737 String format = new IdentifyFile().Identify(file, protocol);
\r
2738 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol, format);
\r
2740 FastaFile ff = new FastaFile();
\r
2741 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2742 c.setContents(new StringSelection(ff.print(sequences)), this);
\r
2744 this.paste(false);
\r
2752 int height = alignPanel.annotationPanel.adjustPanelHeight();
\r
2753 alignPanel.annotationScroller.setPreferredSize(
\r
2754 new Dimension(alignPanel.annotationScroller.getWidth(),
\r
2757 alignPanel.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
\r
2758 alignPanel.annotationSpaceFillerHolder.getWidth(),
\r
2761 alignPanel.addNotify();
\r
2764 catch (Exception ex)
\r
2766 ex.printStackTrace();
\r