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
198 public FeatureRenderer getFeatureRenderer()
\r
200 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
\r
204 public void fetchSequence_actionPerformed(ActionEvent e)
\r
206 new SequenceFetcher(this);
\r
211 * @param e DOCUMENT ME!
\r
213 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
215 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
220 "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",
\r
225 "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"
\r
226 }, currentFileFormat);
\r
228 chooser.setAcceptAllFileFilterUsed(false);
\r
229 chooser.setFileView(new JalviewFileView());
\r
230 chooser.setDialogTitle("Save Alignment to file");
\r
231 chooser.setToolTipText("Save");
\r
233 int value = chooser.showSaveDialog(this);
\r
235 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
237 currentFileFormat = chooser.getSelectedFormat();
\r
239 if (currentFileFormat == null)
\r
241 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
242 "You must select a file format before saving!",
\r
243 "File format not specified",
\r
244 JOptionPane.WARNING_MESSAGE);
\r
245 value = chooser.showSaveDialog(this);
\r
249 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
250 currentFileFormat);
\r
252 String choice = chooser.getSelectedFile().getPath();
\r
253 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
255 saveAlignment(choice, currentFileFormat);
\r
259 public boolean saveAlignment(String file, String format)
\r
261 if (format.equalsIgnoreCase("Jalview"))
\r
263 String shortName = title;
\r
265 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
267 shortName = shortName.substring(shortName.lastIndexOf(
\r
268 java.io.File.separatorChar) + 1);
\r
271 new Jalview2XML().SaveAlignment(this, file, shortName);
\r
273 // USE Jalview2XML to save this file
\r
278 String output = new FormatAdapter().formatSequences(format,
\r
279 viewport.getAlignment().
\r
281 if (output == null)
\r
288 java.io.PrintWriter out = new java.io.PrintWriter(
\r
289 new java.io.FileWriter(file));
\r
295 catch (Exception ex)
\r
297 ex.printStackTrace();
\r
306 * @param e DOCUMENT ME!
\r
308 protected void outputText_actionPerformed(ActionEvent e)
\r
310 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
311 Desktop.addInternalFrame(cap,
\r
312 "Alignment output - " + e.getActionCommand(), 600,
\r
314 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
315 viewport.getAlignment().
\r
322 * @param e DOCUMENT ME!
\r
324 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
326 new HTMLOutput(viewport,
\r
327 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
328 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
331 public void createImageMap(File file, String image)
\r
333 alignPanel.makePNGImageMap(file, image);
\r
339 * @param e DOCUMENT ME!
\r
341 public void createPNG(File f)
\r
343 alignPanel.makePNG(f);
\r
349 * @param e DOCUMENT ME!
\r
351 public void createEPS(File f)
\r
353 alignPanel.makeEPS(f);
\r
359 * @param e DOCUMENT ME!
\r
361 public void printMenuItem_actionPerformed(ActionEvent e)
\r
363 //Putting in a thread avoids Swing painting problems
\r
364 PrintThread thread = new PrintThread();
\r
368 public void associatedData_actionPerformed(ActionEvent e)
\r
370 // Pick the tree file
\r
371 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
373 "LAST_DIRECTORY"));
\r
374 chooser.setFileView(new JalviewFileView());
\r
375 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
376 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
378 int value = chooser.showOpenDialog(null);
\r
380 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
382 String choice = chooser.getSelectedFile().getPath();
\r
383 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
384 loadJalviewDataFile(choice);
\r
392 * @param e DOCUMENT ME!
\r
394 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
398 PaintRefresher.components.remove(viewport.alignment);
\r
399 this.setClosed(true);
\r
401 catch (Exception ex)
\r
409 void updateEditMenuBar()
\r
411 if (historyList.size() > 0)
\r
413 undoMenuItem.setEnabled(true);
\r
415 HistoryItem hi = (HistoryItem) historyList.peek();
\r
416 undoMenuItem.setText("Undo " + hi.getDescription());
\r
420 undoMenuItem.setEnabled(false);
\r
421 undoMenuItem.setText("Undo");
\r
424 if (redoList.size() > 0)
\r
426 redoMenuItem.setEnabled(true);
\r
428 HistoryItem hi = (HistoryItem) redoList.peek();
\r
429 redoMenuItem.setText("Redo " + hi.getDescription());
\r
433 redoMenuItem.setEnabled(false);
\r
434 redoMenuItem.setText("Redo");
\r
441 * @param hi DOCUMENT ME!
\r
443 public void addHistoryItem(HistoryItem hi)
\r
445 historyList.push(hi);
\r
446 updateEditMenuBar();
\r
452 * @param e DOCUMENT ME!
\r
454 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
456 HistoryItem hi = (HistoryItem) historyList.pop();
\r
457 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
458 HistoryItem.HIDE));
\r
459 restoreHistoryItem(hi);
\r
460 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
466 * @param e DOCUMENT ME!
\r
468 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
470 HistoryItem hi = (HistoryItem) redoList.pop();
\r
471 restoreHistoryItem(hi);
\r
472 updateEditMenuBar();
\r
473 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
476 // used by undo and redo
\r
477 void restoreHistoryItem(HistoryItem hi)
\r
482 updateEditMenuBar();
\r
484 viewport.firePropertyChange("alignment", null,
\r
485 viewport.getAlignment().getSequences());
\r
491 * @param up DOCUMENT ME!
\r
493 public void moveSelectedSequences(boolean up)
\r
495 SequenceGroup sg = viewport.getSelectionGroup();
\r
504 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
506 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
508 if (!sg.sequences.contains(seq))
\r
513 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
515 if (sg.sequences.contains(temp))
\r
520 viewport.alignment.getSequences().setElementAt(temp, i);
\r
521 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
526 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
528 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
530 if (!sg.sequences.contains(seq))
\r
535 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
537 if (sg.sequences.contains(temp))
\r
542 viewport.alignment.getSequences().setElementAt(temp, i);
\r
543 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
547 alignPanel.repaint();
\r
550 public void lostOwnership(Clipboard clipboard, Transferable contents)
\r
552 Desktop.jalviewClipboard = null;
\r
559 * @param e DOCUMENT ME!
\r
561 protected void copy_actionPerformed(ActionEvent e)
\r
563 if (viewport.getSelectionGroup() == null)
\r
568 SequenceGroup sg = viewport.getSelectionGroup();
\r
570 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
572 Hashtable orderedSeqs = new Hashtable();
\r
573 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
575 for (int i = 0; i < sg.getSize(); i++)
\r
577 SequenceI seq = sg.getSequenceAt(i);
\r
578 int index = viewport.alignment.findIndex(seq);
\r
579 orderedSeqs.put(index + "", seq);
\r
582 int index = 0, startRes, endRes;
\r
585 for (int i = 0; i < sg.getSize(); i++)
\r
587 SequenceI seq = null;
\r
589 while (seq == null)
\r
591 if (orderedSeqs.containsKey(index + ""))
\r
593 seq = (SequenceI) orderedSeqs.get(index + "");
\r
605 //Returns residue following index if gap
\r
606 startRes = seq.findPosition(sg.getStartRes());
\r
609 //Need to find the residue preceeding index if gap
\r
612 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
614 ch = seq.getCharAt(j);
\r
615 if (!jalview.util.Comparison.isGap( (ch)))
\r
623 endRes += seq.getStart() - 1;
\r
626 seqs[i] = new Sequence(seq.getName(),
\r
627 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
630 seqs[i].setDescription(seq.getDescription());
\r
631 seqs[i].setDBRef(seq.getDBRef());
\r
632 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
633 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
637 FastaFile ff = new FastaFile();
\r
638 ff.addJVSuffix( viewport.showJVSuffix );
\r
639 c.setContents(new StringSelection( ff.print(seqs)), this);
\r
640 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
646 * @param e DOCUMENT ME!
\r
648 protected void pasteNew_actionPerformed(ActionEvent e)
\r
656 * @param e DOCUMENT ME!
\r
658 protected void pasteThis_actionPerformed(ActionEvent e)
\r
660 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
661 HistoryItem.PASTE));
\r
668 * @param newAlignment DOCUMENT ME!
\r
670 void paste(boolean newAlignment)
\r
674 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
675 Transferable contents = c.getContents(this);
\r
677 if (contents == null)
\r
682 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
686 String format = new IdentifyFile().Identify(str, "Paste");
\r
687 SequenceI[] sequences;
\r
689 if(Desktop.jalviewClipboard!=null)
\r
691 // The clipboard was filled from within Jalview, we must use the sequences
\r
692 // And dataset from the copied alignment
\r
693 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
697 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
703 Alignment alignment = new Alignment(sequences);
\r
705 if(Desktop.jalviewClipboard!=null)
\r
706 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
708 alignment.setDataset( null );
\r
711 AlignFrame af = new AlignFrame(alignment);
\r
712 String newtitle = new String("Copied sequences");
\r
714 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
715 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
716 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
719 if (title.startsWith("Copied sequences"))
\r
725 newtitle = newtitle.concat("- from " + title);
\r
728 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
729 NEW_WINDOW_HEIGHT);
\r
734 for (int i = 0; i < sequences.length; i++)
\r
736 Sequence newseq = new Sequence(sequences[i].getName(),
\r
737 sequences[i].getSequence(), sequences[i].getStart(),
\r
738 sequences[i].getEnd());
\r
739 viewport.alignment.addSequence(newseq);
\r
740 if(sequences[i].getDatasetSequence()==null)
\r
742 ////////////////////////////
\r
743 //Datset needs extension;
\r
744 /////////////////////////////
\r
745 Sequence ds = new Sequence(sequences[i].getName(),
\r
746 AlignSeq.extractGaps("-. ", sequences[i].getSequence()),
\r
747 sequences[i].getStart(),
\r
748 sequences[i].getEnd());
\r
749 newseq.setDatasetSequence(ds);
\r
750 viewport.alignment.getDataset().addSequence(ds);
\r
754 newseq.setDatasetSequence(sequences[i].getDatasetSequence());
\r
755 if(sequences[i].getDatasetSequence().getAnnotation()!=null)
\r
757 for(int aa=0; aa<sequences[i].getDatasetSequence().getAnnotation().length; aa++)
\r
759 viewport.alignment.addAnnotation(sequences[i].getDatasetSequence().getAnnotation()[aa]);
\r
764 viewport.setEndSeq(viewport.alignment.getHeight());
\r
765 viewport.alignment.getWidth();
\r
766 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
769 catch (Exception ex)
\r
771 ex.printStackTrace();
\r
772 System.out.println("Exception whilst pasting: "+ex);
\r
773 // could be anything being pasted in here
\r
782 * @param e DOCUMENT ME!
\r
784 protected void cut_actionPerformed(ActionEvent e)
\r
786 copy_actionPerformed(null);
\r
787 delete_actionPerformed(null);
\r
793 * @param e DOCUMENT ME!
\r
795 protected void delete_actionPerformed(ActionEvent e)
\r
798 if (viewport.getSelectionGroup() == null)
\r
804 SequenceGroup sg = viewport.getSelectionGroup();
\r
808 //Jalview no longer allows deletion of residues.
\r
809 //Check here whether any residues are in selection area
\r
810 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
812 for (int i = 0; i < sg.sequences.size(); i++)
\r
814 SequenceI seq = sg.getSequenceAt(i);
\r
815 int j = sg.getStartRes();
\r
818 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
820 JOptionPane.showInternalMessageDialog(
\r
821 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
822 + "Try hiding columns instead.",
\r
823 "Deletion of residues not permitted",
\r
824 JOptionPane.WARNING_MESSAGE);
\r
829 }while(j<=sg.getEndRes());
\r
834 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
835 HistoryItem.HIDE));
\r
838 for (int i = 0; i < sg.sequences.size(); i++)
\r
840 SequenceI seq = sg.getSequenceAt(i);
\r
841 int index = viewport.getAlignment().findIndex(seq);
\r
843 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
845 // If the cut affects all sequences, remove highlighted columns
\r
846 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
848 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
849 sg.getEndRes() + 1);
\r
852 if (seq.getSequence().length() < 1)
\r
854 viewport.getAlignment().deleteSequence(seq);
\r
858 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
862 viewport.setSelectionGroup(null);
\r
863 viewport.alignment.deleteGroup(sg);
\r
865 viewport.firePropertyChange("alignment", null,
\r
866 viewport.getAlignment().getSequences());
\r
870 if (viewport.getAlignment().getHeight() < 1)
\r
874 this.setClosed(true);
\r
876 catch (Exception ex)
\r
885 * @param e DOCUMENT ME!
\r
887 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
889 viewport.alignment.deleteAllGroups();
\r
890 viewport.setSelectionGroup(null);
\r
891 alignPanel.repaint();
\r
897 * @param e DOCUMENT ME!
\r
899 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
901 SequenceGroup sg = new SequenceGroup();
\r
903 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
906 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
909 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
910 viewport.setSelectionGroup(sg);
\r
911 PaintRefresher.Refresh(null, viewport.alignment);
\r
917 * @param e DOCUMENT ME!
\r
919 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
921 if(viewport.cursorMode)
\r
923 alignPanel.seqPanel.keyboardNo1 = null;
\r
924 alignPanel.seqPanel.keyboardNo2 = null;
\r
926 viewport.setSelectionGroup(null);
\r
927 viewport.getColumnSelection().clear();
\r
928 viewport.setSelectionGroup(null);
\r
929 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
930 alignPanel.idPanel.idCanvas.searchResults = null;
\r
931 PaintRefresher.Refresh(null, viewport.alignment);
\r
937 * @param e DOCUMENT ME!
\r
939 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
941 SequenceGroup sg = viewport.getSelectionGroup();
\r
945 selectAllSequenceMenuItem_actionPerformed(null);
\r
950 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
953 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
956 PaintRefresher.Refresh(null, viewport.alignment);
\r
962 * @param e DOCUMENT ME!
\r
964 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
966 ColumnSelection colSel = viewport.getColumnSelection();
\r
968 if (colSel.size() > 0)
\r
970 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
971 HistoryItem.HIDE));
\r
973 int min = colSel.getMin();
\r
974 viewport.getAlignment().trimLeft(min);
\r
975 colSel.compensateForEdit(0, min);
\r
977 if (viewport.getSelectionGroup() != null)
\r
979 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
982 Vector groups = viewport.alignment.getGroups();
\r
984 for (int i = 0; i < groups.size(); i++)
\r
986 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
988 if (!sg.adjustForRemoveLeft(min))
\r
990 viewport.alignment.deleteGroup(sg);
\r
994 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1001 * @param e DOCUMENT ME!
\r
1003 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1005 ColumnSelection colSel = viewport.getColumnSelection();
\r
1007 if (colSel.size() > 0)
\r
1009 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1010 HistoryItem.HIDE));
\r
1012 int max = colSel.getMax();
\r
1013 viewport.getAlignment().trimRight(max);
\r
1015 if (viewport.getSelectionGroup() != null)
\r
1017 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1020 Vector groups = viewport.alignment.getGroups();
\r
1022 for (int i = 0; i < groups.size(); i++)
\r
1024 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1026 if (!sg.adjustForRemoveRight(max))
\r
1028 viewport.alignment.deleteGroup(sg);
\r
1032 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1039 * @param e DOCUMENT ME!
\r
1041 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1043 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1044 viewport.alignment, HistoryItem.HIDE));
\r
1046 //This is to maintain viewport position on first residue
\r
1047 //of first sequence
\r
1048 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1049 int startRes = seq.findPosition(viewport.startRes);
\r
1051 viewport.getAlignment().removeGaps();
\r
1053 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1055 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1061 * @param e DOCUMENT ME!
\r
1063 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1065 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1066 HistoryItem.HIDE));
\r
1068 //This is to maintain viewport position on first residue
\r
1069 //of first sequence
\r
1070 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1071 int startRes = seq.findPosition(viewport.startRes);
\r
1074 SequenceI current;
\r
1077 Vector seqs = null;
\r
1080 int end = viewport.alignment.getWidth();
\r
1082 if (viewport.getSelectionGroup() != null
\r
1083 && viewport.getSelectionGroup().sequences != null
\r
1084 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1086 seqs = viewport.getSelectionGroup().sequences;
\r
1087 start = viewport.getSelectionGroup().getStartRes();
\r
1088 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1092 seqs = viewport.alignment.getSequences();
\r
1095 for (int i = 0; i < seqs.size(); i++)
\r
1097 current = (SequenceI) seqs.elementAt(i);
\r
1098 jSize = current.getLength();
\r
1100 // Removing a range is much quicker than removing gaps
\r
1101 // one by one for long sequences
\r
1103 int rangeStart=-1, rangeEnd=-1;
\r
1107 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1109 if(rangeStart==-1)
\r
1124 current.deleteChars(rangeStart, rangeEnd);
\r
1125 j-=rangeEnd-rangeStart;
\r
1126 jSize-=rangeEnd-rangeStart;
\r
1134 while (j < end && j < jSize);
\r
1137 current.deleteChars(rangeStart, rangeEnd);
\r
1141 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1143 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1146 public void alignmentChanged()
\r
1148 if(viewport.padGaps)
\r
1149 viewport.getAlignment().padGaps();
\r
1151 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1153 viewport.updateConsensus();
\r
1154 viewport.updateConservation();
\r
1156 resetAllColourSchemes();
\r
1157 if(alignPanel.overviewPanel!=null)
\r
1158 alignPanel.overviewPanel.updateOverviewImage();
\r
1160 viewport.alignment.adjustSequenceAnnotations();
\r
1162 alignPanel.repaint();
\r
1165 void resetAllColourSchemes()
\r
1167 ColourSchemeI cs = viewport.globalColourScheme;
\r
1170 if (cs instanceof ClustalxColourScheme)
\r
1172 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1173 resetClustalX(viewport.alignment.getSequences(),
\r
1174 viewport.alignment.getWidth());
\r
1177 cs.setConsensus(viewport.vconsensus);
\r
1178 if (cs.conservationApplied())
\r
1180 Alignment al = (Alignment) viewport.alignment;
\r
1181 Conservation c = new Conservation("All",
\r
1182 ResidueProperties.propHash, 3,
\r
1183 al.getSequences(), 0,
\r
1184 al.getWidth() - 1);
\r
1186 c.verdict(false, viewport.ConsPercGaps);
\r
1188 cs.setConservation(c);
\r
1192 int s, sSize = viewport.alignment.getGroups().size();
\r
1193 for(s=0; s<sSize; s++)
\r
1195 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1196 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1198 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1200 sg.recalcConservation();
\r
1207 * @param e DOCUMENT ME!
\r
1209 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1211 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1212 HistoryItem.HIDE));
\r
1214 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1216 // if (viewport.padGaps)
\r
1217 alignmentChanged();
\r
1223 * @param e DOCUMENT ME!
\r
1225 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1227 JInternalFrame frame = new JInternalFrame();
\r
1228 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1229 frame.setContentPane(finder);
\r
1230 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1231 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1237 * @param e DOCUMENT ME!
\r
1239 public void font_actionPerformed(ActionEvent e)
\r
1241 new FontChooser(alignPanel);
\r
1244 public void smoothFont_actionPerformed(ActionEvent e)
\r
1246 viewport.antiAlias = smoothFont.isSelected();
\r
1247 alignPanel.annotationPanel.image = null;
\r
1248 alignPanel.repaint();
\r
1255 * @param e DOCUMENT ME!
\r
1257 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1259 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1261 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1262 alignPanel.repaint();
\r
1269 * @param e DOCUMENT ME!
\r
1271 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1273 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1274 alignPanel.repaint();
\r
1280 * @param e DOCUMENT ME!
\r
1282 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1284 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1285 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1286 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1287 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1288 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1289 alignPanel.repaint();
\r
1295 * @param e DOCUMENT ME!
\r
1297 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1299 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1300 alignPanel.repaint();
\r
1306 * @param e DOCUMENT ME!
\r
1308 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1310 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1311 alignPanel.repaint();
\r
1317 * @param e DOCUMENT ME!
\r
1319 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1321 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1322 alignPanel.repaint();
\r
1328 * @param e DOCUMENT ME!
\r
1330 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1332 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1333 alignPanel.repaint();
\r
1339 * @param e DOCUMENT ME!
\r
1341 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1343 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1344 alignPanel.repaint();
\r
1350 * @param e DOCUMENT ME!
\r
1352 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1354 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1355 alignPanel.repaint();
\r
1358 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1360 if (!viewport.alignment.isNucleotide())
\r
1362 new SequenceFeatureFetcher(viewport.
\r
1365 viewport.setShowSequenceFeatures(true);
\r
1366 showSeqFeatures.setSelected(true);
\r
1371 public void featureSettings_actionPerformed(ActionEvent e)
\r
1373 new FeatureSettings(viewport, alignPanel);
\r
1379 * @param evt DOCUMENT ME!
\r
1381 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1383 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1384 alignPanel.repaint();
\r
1385 if (alignPanel.getOverviewPanel() != null)
\r
1387 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1394 * @param e DOCUMENT ME!
\r
1396 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1398 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1399 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1405 * @param e DOCUMENT ME!
\r
1407 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1409 if (alignPanel.overviewPanel != null)
\r
1414 JInternalFrame frame = new JInternalFrame();
\r
1415 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1416 frame.setContentPane(overview);
\r
1417 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1418 frame.getWidth(), frame.getHeight());
\r
1420 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1421 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1423 public void internalFrameClosed(
\r
1424 javax.swing.event.InternalFrameEvent evt)
\r
1426 alignPanel.setOverviewPanel(null);
\r
1431 alignPanel.setOverviewPanel(overview);
\r
1437 * @param e DOCUMENT ME!
\r
1439 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1441 changeColour(null);
\r
1447 * @param e DOCUMENT ME!
\r
1449 public void clustalColour_actionPerformed(ActionEvent e)
\r
1451 changeColour(new ClustalxColourScheme(
\r
1452 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1458 * @param e DOCUMENT ME!
\r
1460 public void zappoColour_actionPerformed(ActionEvent e)
\r
1462 changeColour(new ZappoColourScheme());
\r
1468 * @param e DOCUMENT ME!
\r
1470 public void taylorColour_actionPerformed(ActionEvent e)
\r
1472 changeColour(new TaylorColourScheme());
\r
1478 * @param e DOCUMENT ME!
\r
1480 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1482 changeColour(new HydrophobicColourScheme());
\r
1488 * @param e DOCUMENT ME!
\r
1490 public void helixColour_actionPerformed(ActionEvent e)
\r
1492 changeColour(new HelixColourScheme());
\r
1498 * @param e DOCUMENT ME!
\r
1500 public void strandColour_actionPerformed(ActionEvent e)
\r
1502 changeColour(new StrandColourScheme());
\r
1508 * @param e DOCUMENT ME!
\r
1510 public void turnColour_actionPerformed(ActionEvent e)
\r
1512 changeColour(new TurnColourScheme());
\r
1518 * @param e DOCUMENT ME!
\r
1520 public void buriedColour_actionPerformed(ActionEvent e)
\r
1522 changeColour(new BuriedColourScheme());
\r
1528 * @param e DOCUMENT ME!
\r
1530 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1532 changeColour(new NucleotideColourScheme());
\r
1535 public void annotationColour_actionPerformed(ActionEvent e)
\r
1537 new AnnotationColourChooser(viewport, alignPanel);
\r
1544 * @param e DOCUMENT ME!
\r
1546 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1548 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1554 * @param cs DOCUMENT ME!
\r
1556 void changeColour(ColourSchemeI cs)
\r
1558 int threshold = 0;
\r
1562 if (viewport.getAbovePIDThreshold())
\r
1564 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1567 cs.setThreshold(threshold,
\r
1568 viewport.getIgnoreGapsConsensus());
\r
1570 viewport.setGlobalColourScheme(cs);
\r
1574 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1577 if (viewport.getConservationSelected())
\r
1580 Alignment al = (Alignment) viewport.alignment;
\r
1581 Conservation c = new Conservation("All",
\r
1582 ResidueProperties.propHash, 3,
\r
1583 al.getSequences(), 0,
\r
1584 al.getWidth() - 1);
\r
1587 c.verdict(false, viewport.ConsPercGaps);
\r
1589 cs.setConservation(c);
\r
1591 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1596 cs.setConservation(null);
\r
1599 cs.setConsensus(viewport.vconsensus);
\r
1602 viewport.setGlobalColourScheme(cs);
\r
1604 if (viewport.getColourAppliesToAllGroups())
\r
1606 Vector groups = viewport.alignment.getGroups();
\r
1608 for (int i = 0; i < groups.size(); i++)
\r
1610 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1618 if (cs instanceof ClustalxColourScheme)
\r
1620 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1622 else if (cs instanceof UserColourScheme)
\r
1624 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1630 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1632 catch (Exception ex)
\r
1637 if (viewport.getAbovePIDThreshold()
\r
1638 || cs instanceof PIDColourScheme
\r
1639 || cs instanceof Blosum62ColourScheme)
\r
1641 sg.cs.setThreshold(threshold,
\r
1642 viewport.getIgnoreGapsConsensus());
\r
1644 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1648 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1651 if (viewport.getConservationSelected())
\r
1653 Conservation c = new Conservation("Group",
\r
1654 ResidueProperties.propHash, 3,
\r
1656 viewport.alignment.getWidth() - 1);
\r
1658 c.verdict(false, viewport.ConsPercGaps);
\r
1659 sg.cs.setConservation(c);
\r
1662 sg.cs.setConservation(null);
\r
1666 if (alignPanel.getOverviewPanel() != null)
\r
1668 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1671 alignPanel.repaint();
\r
1677 * @param e DOCUMENT ME!
\r
1679 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1681 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1683 SliderPanel.setPIDSliderSource(alignPanel,
\r
1684 viewport.getGlobalColourScheme(),
\r
1686 SliderPanel.showPIDSlider();
\r
1693 * @param e DOCUMENT ME!
\r
1695 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1697 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1699 SliderPanel.setConservationSlider(alignPanel,
\r
1700 viewport.globalColourScheme,
\r
1702 SliderPanel.showConservationSlider();
\r
1709 * @param e DOCUMENT ME!
\r
1711 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1713 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1715 viewport.setAbovePIDThreshold(false);
\r
1716 abovePIDThreshold.setSelected(false);
\r
1718 changeColour(viewport.getGlobalColourScheme());
\r
1720 modifyConservation_actionPerformed(null);
\r
1726 * @param e DOCUMENT ME!
\r
1728 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1730 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1732 conservationMenuItem.setSelected(false);
\r
1733 viewport.setConservationSelected(false);
\r
1735 changeColour(viewport.getGlobalColourScheme());
\r
1737 modifyPID_actionPerformed(null);
\r
1743 * @param e DOCUMENT ME!
\r
1745 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1747 if (e.getActionCommand().equals("User Defined..."))
\r
1749 new UserDefinedColours(alignPanel, null);
\r
1753 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1754 getUserColourSchemes().get(e.getActionCommand());
\r
1756 changeColour(udc);
\r
1760 public void updateUserColourMenu()
\r
1763 Component[] menuItems = colourMenu.getMenuComponents();
\r
1764 int i, iSize = menuItems.length;
\r
1765 for (i = 0; i < iSize; i++)
\r
1767 if (menuItems[i].getName() != null &&
\r
1768 menuItems[i].getName().equals("USER_DEFINED"))
\r
1770 colourMenu.remove(menuItems[i]);
\r
1774 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1776 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1777 getUserColourSchemes().keys();
\r
1779 while (userColours.hasMoreElements())
\r
1781 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1782 nextElement().toString());
\r
1783 radioItem.setName("USER_DEFINED");
\r
1784 radioItem.addMouseListener(new MouseAdapter()
\r
1786 public void mousePressed(MouseEvent evt)
\r
1788 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1790 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1792 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1793 "Remove from default list?",
\r
1794 "Remove user defined colour",
\r
1795 JOptionPane.YES_NO_OPTION);
\r
1796 if(option == JOptionPane.YES_OPTION)
\r
1798 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1799 colourMenu.remove(radioItem);
\r
1802 radioItem.addActionListener(new ActionListener()
\r
1804 public void actionPerformed(ActionEvent evt)
\r
1806 userDefinedColour_actionPerformed(evt);
\r
1812 radioItem.addActionListener(new ActionListener()
\r
1814 public void actionPerformed(ActionEvent evt)
\r
1816 userDefinedColour_actionPerformed(evt);
\r
1820 colourMenu.insert(radioItem, 15);
\r
1821 colours.add(radioItem);
\r
1829 * @param e DOCUMENT ME!
\r
1831 public void PIDColour_actionPerformed(ActionEvent e)
\r
1833 changeColour(new PIDColourScheme());
\r
1839 * @param e DOCUMENT ME!
\r
1841 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1843 changeColour(new Blosum62ColourScheme());
\r
1849 * @param e DOCUMENT ME!
\r
1851 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1853 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1854 HistoryItem.SORT));
\r
1855 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1856 viewport.getAlignment().getSequenceAt(0));
\r
1857 alignPanel.repaint();
\r
1863 * @param e DOCUMENT ME!
\r
1865 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1867 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1868 HistoryItem.SORT));
\r
1869 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1870 alignPanel.repaint();
\r
1876 * @param e DOCUMENT ME!
\r
1878 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1880 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1881 HistoryItem.SORT));
\r
1883 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1884 alignPanel.repaint();
\r
1890 * @param e DOCUMENT ME!
\r
1892 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1894 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1895 JInternalFrame frame = new JInternalFrame();
\r
1896 frame.setContentPane(sp);
\r
1897 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1904 * @param e DOCUMENT ME!
\r
1906 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1908 if ( (viewport.getSelectionGroup() == null) ||
\r
1909 (viewport.getSelectionGroup().getSize() < 2))
\r
1911 JOptionPane.showInternalMessageDialog(this,
\r
1912 "You must select at least 2 sequences.",
\r
1913 "Invalid Selection",
\r
1914 JOptionPane.WARNING_MESSAGE);
\r
1918 JInternalFrame frame = new JInternalFrame();
\r
1919 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1920 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1927 * @param e DOCUMENT ME!
\r
1929 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1931 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1932 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1933 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1934 (viewport.getAlignment().getHeight() < 4))
\r
1936 JOptionPane.showInternalMessageDialog(this,
\r
1937 "Principal component analysis must take\n" +
\r
1938 "at least 4 input sequences.",
\r
1939 "Sequence selection insufficient",
\r
1940 JOptionPane.WARNING_MESSAGE);
\r
1945 new PCAPanel(viewport);
\r
1949 public void autoCalculate_actionPerformed(ActionEvent e)
\r
1951 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
1958 * @param e DOCUMENT ME!
\r
1960 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1962 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
1968 * @param e DOCUMENT ME!
\r
1970 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
1972 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
1978 * @param e DOCUMENT ME!
\r
1980 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1982 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
1988 * @param e DOCUMENT ME!
\r
1990 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
1992 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
1998 * @param type DOCUMENT ME!
\r
1999 * @param pwType DOCUMENT ME!
\r
2000 * @param title DOCUMENT ME!
\r
2002 void NewTreePanel(String type, String pwType, String title)
\r
2006 if ( (viewport.getSelectionGroup() != null) &&
\r
2007 (viewport.getSelectionGroup().getSize() > 3))
\r
2010 SequenceGroup sg = viewport.getSelectionGroup();
\r
2012 /* Decide if the selection is a column region */
\r
2013 while (s < sg.sequences.size())
\r
2015 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
2018 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2019 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2020 "Try using the Pad function in the edit menu,\n" +
\r
2021 "or one of the multiple sequence alignment web services.",
\r
2022 "Sequences in selection are not aligned",
\r
2023 JOptionPane.WARNING_MESSAGE);
\r
2029 title = title + " on region";
\r
2030 tp = new TreePanel(viewport,
\r
2031 viewport.getSelectionGroup().sequences, type, pwType,
\r
2032 sg.getStartRes(), sg.getEndRes());
\r
2036 //are the sequences aligned?
\r
2037 if (!viewport.alignment.isAligned())
\r
2039 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2040 "The sequences must be aligned before creating a tree.\n" +
\r
2041 "Try using the Pad function in the edit menu,\n" +
\r
2042 "or one of the multiple sequence alignment web services.",
\r
2043 "Sequences not aligned",
\r
2044 JOptionPane.WARNING_MESSAGE);
\r
2049 tp = new TreePanel(viewport,
\r
2050 viewport.getAlignment().getSequences(), type, pwType,
\r
2052 viewport.alignment.getWidth());
\r
2055 addTreeMenuItem(tp, title);
\r
2057 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2063 * @param title DOCUMENT ME!
\r
2064 * @param order DOCUMENT ME!
\r
2066 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2068 final JMenuItem item = new JMenuItem("by " + title);
\r
2070 item.addActionListener(new java.awt.event.ActionListener()
\r
2072 public void actionPerformed(ActionEvent e)
\r
2074 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2075 HistoryItem.SORT));
\r
2077 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2078 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2079 alignPanel.repaint();
\r
2085 * Maintain the Order by->Displayed Tree menu.
\r
2086 * Creates a new menu item for a TreePanel with an appropriate
\r
2087 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2088 * to remove the menu item when the treePanel is closed, and adjust
\r
2089 * the tree leaf to sequence mapping when the alignment is modified.
\r
2090 * @param treePanel Displayed tree window.
\r
2091 * @param title SortBy menu item title.
\r
2093 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2095 final JMenuItem item = new JMenuItem(title);
\r
2099 if (treeCount == 1)
\r
2101 sort.add(sortByTreeMenu);
\r
2104 sortByTreeMenu.add(item);
\r
2105 item.addActionListener(new java.awt.event.ActionListener()
\r
2107 public void actionPerformed(ActionEvent e)
\r
2109 addHistoryItem(new HistoryItem("Tree Sort",
\r
2110 viewport.alignment, HistoryItem.SORT));
\r
2111 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2112 treePanel.getTree());
\r
2113 alignPanel.repaint();
\r
2117 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2118 InternalFrameAdapter()
\r
2120 public void internalFrameClosed(
\r
2121 javax.swing.event.InternalFrameEvent evt)
\r
2124 sortByTreeMenu.remove(item);
\r
2126 if (treeCount == 0)
\r
2128 sort.remove(sortByTreeMenu);
\r
2136 * Work out whether the whole set of sequences
\r
2137 * or just the selected set will be submitted for multiple alignment.
\r
2140 private SequenceI[] gatherSequencesForAlignment()
\r
2142 // Now, check we have enough sequences
\r
2143 SequenceI[] msa = null;
\r
2145 if ( (viewport.getSelectionGroup() != null) &&
\r
2146 (viewport.getSelectionGroup().getSize() > 1))
\r
2148 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2149 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2151 msa = new SequenceI[sz = seqs.getSize()];
\r
2153 for (int i = 0; i < sz; i++)
\r
2155 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2160 Vector seqs = viewport.getAlignment().getSequences();
\r
2162 if (seqs.size() > 1)
\r
2164 msa = new SequenceI[seqs.size()];
\r
2166 for (int i = 0; i < seqs.size(); i++)
\r
2168 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2176 * Decides what is submitted to a secondary structure prediction service,
\r
2177 * the currently selected sequence, or the currently selected alignment
\r
2178 * (where the first sequence in the set is the one that the prediction
\r
2181 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2183 SequenceI seq = null;
\r
2184 SequenceI[] msa = null;
\r
2186 if ( (viewport.getSelectionGroup() != null) &&
\r
2187 (viewport.getSelectionGroup().getSize() > 0))
\r
2189 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2190 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2192 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2194 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2199 msa = new SequenceI[sz = seqs.getSize()];
\r
2201 for (int i = 0; i < sz; i++)
\r
2203 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2209 Vector seqs = viewport.getAlignment().getSequences();
\r
2211 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2213 seq = (SequenceI) seqs.elementAt(0);
\r
2217 msa = new SequenceI[seqs.size()];
\r
2219 for (int i = 0; i < seqs.size(); i++)
\r
2221 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2233 return new SequenceI[]
\r
2243 * @param e DOCUMENT ME!
\r
2245 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2247 // Pick the tree file
\r
2248 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2250 "LAST_DIRECTORY"));
\r
2251 chooser.setFileView(new JalviewFileView());
\r
2252 chooser.setDialogTitle("Select a newick-like tree file");
\r
2253 chooser.setToolTipText("Load a tree file");
\r
2255 int value = chooser.showOpenDialog(null);
\r
2257 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2259 String choice = chooser.getSelectedFile().getPath();
\r
2260 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2264 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2266 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2268 catch (Exception ex)
\r
2270 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2271 "Problem reading tree file",
\r
2273 JOptionPane.WARNING_MESSAGE);
\r
2274 ex.printStackTrace();
\r
2280 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2282 return ShowNewickTree(nf,title,600,500,4,5);
\r
2287 * @param nf DOCUMENT ME!
\r
2288 * @param title DOCUMENT ME!
\r
2290 * @return DOCUMENT ME!
\r
2292 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2294 TreePanel tp = null;
\r
2300 if (nf.getTree() != null)
\r
2302 tp = new TreePanel(viewport,
\r
2303 viewport.getAlignment().getSequences(), nf,
\r
2310 tp.setLocation(x,y);
\r
2313 Desktop.addInternalFrame(tp, title, w, h);
\r
2314 addTreeMenuItem(tp, title);
\r
2317 catch (Exception ex)
\r
2319 ex.printStackTrace();
\r
2330 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2331 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2332 printJob.setPrintable(alignPanel, pf);
\r
2334 if (printJob.printDialog())
\r
2340 catch (Exception PrintException)
\r
2342 PrintException.printStackTrace();
\r
2349 * Generates menu items and listener event actions for web service clients
\r
2352 public void BuildWebServiceMenu()
\r
2354 if ( (Discoverer.services != null)
\r
2355 && (Discoverer.services.size() > 0))
\r
2357 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2358 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2359 Vector wsmenu = new Vector();
\r
2360 if (msaws != null)
\r
2362 // Add any Multiple Sequence Alignment Services
\r
2363 final JMenu msawsmenu = new JMenu("Alignment");
\r
2364 final AlignFrame af = this;
\r
2365 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2367 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2369 final JMenuItem method = new JMenuItem(sh.getName());
\r
2370 method.addActionListener(new ActionListener()
\r
2372 public void actionPerformed(ActionEvent e)
\r
2374 SequenceI[] msa = gatherSequencesForAlignment();
\r
2375 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2376 false, true, viewport.getAlignment().getDataset(), af);
\r
2381 msawsmenu.add(method);
\r
2382 // Deal with services that we know accept partial alignments.
\r
2383 if (sh.getName().indexOf("lustal") > -1)
\r
2385 // We know that ClustalWS can accept partial alignments for refinement.
\r
2386 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2387 methodR.addActionListener(new ActionListener()
\r
2389 public void actionPerformed(ActionEvent e)
\r
2391 SequenceI[] msa = gatherSequencesForAlignment();
\r
2392 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2393 true, true, viewport.getAlignment().getDataset(), af);
\r
2398 msawsmenu.add(methodR);
\r
2402 wsmenu.add(msawsmenu);
\r
2404 if (secstrpr != null)
\r
2406 // Add any secondary structure prediction services
\r
2407 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2408 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2410 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2412 final JMenuItem method = new JMenuItem(sh.getName());
\r
2413 method.addActionListener(new ActionListener()
\r
2415 public void actionPerformed(ActionEvent e)
\r
2417 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2418 if (msa.length == 1)
\r
2420 // Single Sequence prediction
\r
2421 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2425 if (msa.length > 1)
\r
2427 // Single Sequence prediction
\r
2428 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2434 secstrmenu.add(method);
\r
2436 wsmenu.add(secstrmenu);
\r
2438 this.webService.removeAll();
\r
2439 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2441 webService.add( (JMenu) wsmenu.get(i));
\r
2446 this.webService.removeAll();
\r
2447 this.webService.add(this.webServiceNoServices);
\r
2449 // TODO: add in rediscovery function
\r
2450 // TODO: reduce code redundancy.
\r
2451 // TODO: group services by location as well as function.
\r
2454 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2456 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2457 getProperty("LAST_DIRECTORY"));
\r
2459 chooser.setFileView(new JalviewFileView());
\r
2460 chooser.setDialogTitle("Export to Vamsas file");
\r
2461 chooser.setToolTipText("Export");
\r
2463 int value = chooser.showSaveDialog(this);
\r
2465 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2467 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2468 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2469 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2477 public void showTranslation_actionPerformed(ActionEvent e)
\r
2479 int s, sSize = viewport.alignment.getHeight();
\r
2480 SequenceI [] newSeq = new SequenceI[sSize];
\r
2483 StringBuffer protein;
\r
2485 for(s=0; s<sSize; s++)
\r
2487 protein = new StringBuffer();
\r
2488 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2489 resSize = seq.length();
\r
2490 resSize -= resSize%3;
\r
2492 for(res = 0; res < resSize; res+=3)
\r
2494 String codon = seq.substring(res, res+3);
\r
2495 codon = codon.replace('U', 'T');
\r
2496 String aa = ResidueProperties.codonTranslate(codon);
\r
2498 protein.append(viewport.getGapCharacter());
\r
2499 else if(aa.equals("STOP"))
\r
2500 protein.append("X");
\r
2502 protein.append( aa );
\r
2504 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2508 AlignmentI al = new Alignment(newSeq);
\r
2509 al.setDataset(null);
\r
2512 ////////////////////////////////
\r
2513 // Copy annotations across
\r
2514 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2515 = viewport.alignment.getAlignmentAnnotation();
\r
2517 for (int i = 0; i < annotations.length; i++)
\r
2520 if (annotations[i].label.equals("Quality") ||
\r
2521 annotations[i].label.equals("Conservation") ||
\r
2522 annotations[i].label.equals("Consensus"))
\r
2528 aSize = viewport.alignment.getWidth()/3;
\r
2529 jalview.datamodel.Annotation [] anots =
\r
2530 new jalview.datamodel.Annotation[aSize];
\r
2532 for(a=0; a<viewport.alignment.getWidth(); a++)
\r
2534 if( annotations[i].annotations[a]==null
\r
2535 || annotations[i].annotations[a]==null)
\r
2538 anots[a/3] = new Annotation(
\r
2539 annotations[i].annotations[a].displayCharacter,
\r
2540 annotations[i].annotations[a].description,
\r
2541 annotations[i].annotations[a].secondaryStructure,
\r
2542 annotations[i].annotations[a].value,
\r
2543 annotations[i].annotations[a].colour);
\r
2546 jalview.datamodel.AlignmentAnnotation aa
\r
2547 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2548 annotations[i].description, anots );
\r
2549 al.addAnnotation(aa);
\r
2553 AlignFrame af = new AlignFrame(al);
\r
2554 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2556 NEW_WINDOW_HEIGHT);
\r
2559 // AlignViewport newViewport = new AlignViewport(al);
\r
2560 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2561 // tabbedPane.add("Protein", ap);
\r
2562 // viewports.add(newViewport);
\r
2563 // alignPanels.add(ap);
\r
2566 /////////////////////////
\r
2568 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2569 // ds.setDataset(true);
\r
2570 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2571 // tabbedPane.add("Dataset", dap);
\r
2572 // viewports.add(ds);
\r
2573 // alignPanels.add(dap);
\r
2574 /////////////////////////
\r
2579 /*public void tabSelected()
\r
2581 int index = tabbedPane.getSelectedIndex();
\r
2582 viewport = (AlignViewport)viewports.elementAt(index);
\r
2583 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2589 * @param String DOCUMENT ME!
\r
2591 public boolean parseGroupsFile(String file)
\r
2593 String line = null;
\r
2596 BufferedReader in = new BufferedReader(new FileReader(file));
\r
2597 SequenceI seq = null;
\r
2598 String type, desc, token;
\r
2600 int index, start, end;
\r
2601 StringTokenizer st;
\r
2602 SequenceFeature sf;
\r
2604 String featureGroup = null;
\r
2605 while ( (line = in.readLine()) != null)
\r
2608 st = new StringTokenizer(line, "\t");
\r
2609 if (st.countTokens() == 2)
\r
2611 type = st.nextToken();
\r
2612 if (type.equalsIgnoreCase("startgroup"))
\r
2614 featureGroup = st.nextToken();
\r
2616 else if (type.equalsIgnoreCase("endgroup"))
\r
2618 //We should check whether this is the current group,
\r
2619 //but at present theres no way of showing more than 1 group
\r
2621 featureGroup = null;
\r
2625 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2626 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type,
\r
2627 ucs.findColour("A"));
\r
2632 while (st.hasMoreElements())
\r
2634 desc = st.nextToken();
\r
2635 token = st.nextToken();
\r
2636 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2638 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2643 index = Integer.parseInt(st.nextToken());
\r
2646 start = Integer.parseInt(st.nextToken());
\r
2647 end = Integer.parseInt(st.nextToken());
\r
2649 seq = viewport.alignment.getSequenceAt(index);
\r
2651 type = st.nextToken();
\r
2653 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2655 // Probably the old style groups file
\r
2656 UserColourScheme ucs = new UserColourScheme(type);
\r
2657 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2660 sf = new SequenceFeature(type, desc, "", start, end, featureGroup);
\r
2662 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2666 catch (Exception ex)
\r
2668 System.out.println(line);
\r
2669 ex.printStackTrace();
\r
2670 System.out.println("Error parsing groups file: " + ex +"\n"+line);
\r
2674 viewport.showSequenceFeatures = true;
\r
2675 showSeqFeatures.setSelected(true);
\r
2676 alignPanel.repaint();
\r
2680 public void dragEnter(DropTargetDragEvent evt)
\r
2683 public void dragExit(DropTargetEvent evt)
\r
2686 public void dragOver(DropTargetDragEvent evt)
\r
2689 public void dropActionChanged(DropTargetDragEvent evt)
\r
2692 public void drop(DropTargetDropEvent evt)
\r
2694 Transferable t = evt.getTransferable();
\r
2695 java.util.List files = null;
\r
2699 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2700 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2702 //Works on Windows and MacOSX
\r
2703 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2704 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2706 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2708 // This is used by Unix drag system
\r
2709 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2710 String data = (String) t.getTransferData(uriListFlavor);
\r
2711 files = new java.util.ArrayList(1);
\r
2712 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2715 st.hasMoreTokens(); )
\r
2717 String s = st.nextToken();
\r
2718 if (s.startsWith("#"))
\r
2720 // the line is a comment (as per the RFC 2483)
\r
2724 java.net.URI uri = new java.net.URI(s);
\r
2725 java.io.File file = new java.io.File(uri);
\r
2730 catch (Exception e)
\r
2732 e.printStackTrace();
\r
2734 if (files != null)
\r
2739 for (int i = 0; i < files.size(); i++)
\r
2741 loadJalviewDataFile(files.get(i).toString());
\r
2744 catch (Exception ex)
\r
2746 ex.printStackTrace();
\r
2751 // This method will attempt to load a "dropped" file first by testing
\r
2752 // whether its and Annotation file, then features file. If both are
\r
2753 // false then the user may have dropped an alignment file onto this
\r
2755 public void loadJalviewDataFile(String file)
\r
2758 boolean isAnnotation = new AnnotationReader().readAnnotationFile(viewport.
\r
2761 if (!isAnnotation)
\r
2763 boolean isGroupsFile = parseGroupsFile(file);
\r
2764 if (!isGroupsFile)
\r
2766 String protocol = "File";
\r
2767 String format = new IdentifyFile().Identify(file, protocol);
\r
2768 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2771 FastaFile ff = new FastaFile();
\r
2772 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2773 c.setContents(new StringSelection(ff.print(sequences)), this);
\r
2775 this.paste(false);
\r
2781 int height = alignPanel.annotationPanel.adjustPanelHeight();
\r
2782 alignPanel.annotationScroller.setPreferredSize(
\r
2783 new Dimension(alignPanel.annotationScroller.getWidth(),
\r
2786 alignPanel.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
\r
2787 alignPanel.annotationSpaceFillerHolder.getWidth(),
\r
2790 alignPanel.addNotify();
\r
2793 }catch(Exception ex)
\r
2795 ex.printStackTrace();
\r