X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=be46dfa4fc6c2630ed6db8c97e74e49a533b1310;hb=8c0e6138df69c25d3411cb23a03554bb0cbdd53f;hp=9d2cf0f481a661ec73d9b1b339822b50b4db101d;hpb=a9ef2d2b865889e9f75faf8e14597c8f508d0ce1;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 9d2cf0f..be46dfa 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -1,2791 +1,3340 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer - * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Softwarechang - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ -package jalview.gui; - -import java.beans.*; -import java.io.*; -import java.util.*; - -import java.awt.*; -import java.awt.datatransfer.*; -import java.awt.event.*; -import java.awt.print.*; -import javax.swing.*; - -import jalview.analysis.*; -import jalview.datamodel.*; -import jalview.io.*; -import jalview.jbgui.*; -import jalview.schemes.*; -import jalview.ws.*; -import java.awt.dnd.*; - - -/** - * DOCUMENT ME! - * - * @author $author$ - * @version $Revision$ - */ -public class AlignFrame - extends GAlignFrame implements ClipboardOwner, DropTargetListener -{ - /** DOCUMENT ME!! */ - public static final int NEW_WINDOW_WIDTH = 700; - - /** DOCUMENT ME!! */ - public static final int NEW_WINDOW_HEIGHT = 500; - AlignmentPanel alignPanel; - AlignViewport viewport; - - Vector viewports = new Vector(); - Vector alignPanels = new Vector(); - - /** DOCUMENT ME!! */ - public String currentFileFormat = null; - Stack historyList = new Stack(); - Stack redoList = new Stack(); - private int treeCount = 0; - - - /** - * Creates a new AlignFrame object. - * - * @param al DOCUMENT ME! - */ - public AlignFrame(AlignmentI al) - { - viewport = new AlignViewport(al); - viewports.add(viewport); - - this.setDropTarget(new java.awt.dnd.DropTarget(this, this)); - - if(viewport.vconsensus==null) - { - //Out of memory calculating consensus. - BLOSUM62Colour.setEnabled(false); - PIDColour.setEnabled(false); - conservationMenuItem.setEnabled(false); - modifyConservation.setEnabled(false); - abovePIDThreshold.setEnabled(false); - modifyPID.setEnabled(false); - } - - alignPanel = new AlignmentPanel(this, viewport); - alignPanels.add(alignPanel); - - String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort"); - - if(sortby.equals("Id")) - sortIDMenuItem_actionPerformed(null); - else if(sortby.equals("Pairwise Identity")) - sortPairwiseMenuItem_actionPerformed(null); - - // remove(tabbedPane); - getContentPane().add(alignPanel, BorderLayout.CENTER); - - - - // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel); - - ///Dataset tab - ///////////////////////// - if(al.getDataset()==null) - { - al.setDataset(null); - } - // AlignViewport ds = new AlignViewport(al.getDataset(), true); - // AlignmentPanel dap = new AlignmentPanel(this, ds); - // tabbedPane.add("Dataset", dap); - // viewports.add(ds); - // alignPanels.add(dap); - ///////////////////////// - - - viewport.addPropertyChangeListener(new PropertyChangeListener() - { - public void propertyChange(PropertyChangeEvent evt) - { - if (evt.getPropertyName().equals("alignment")) - { - alignmentChanged(); - } - } - }); - - - if (Desktop.desktop != null) - { - addServiceListeners(); - setGUINucleotide(al.isNucleotide()); - } - } - - /* Set up intrinsic listeners for dynamically generated GUI bits. */ - private void addServiceListeners() - { - final java.beans.PropertyChangeListener thisListener; - // Do this once to get current state - BuildWebServiceMenu(); - Desktop.discoverer.addPropertyChangeListener( - thisListener = new java.beans.PropertyChangeListener() - { - public void propertyChange(PropertyChangeEvent evt) - { - // System.out.println("Discoverer property change."); - if (evt.getPropertyName().equals("services")) - { - // System.out.println("Rebuilding web service menu"); - BuildWebServiceMenu(); - } - } - }); - addInternalFrameListener(new javax.swing.event. - InternalFrameAdapter() - { - public void internalFrameClosed( - javax.swing.event.InternalFrameEvent evt) - { - // System.out.println("deregistering discoverer listener"); - Desktop.discoverer.removePropertyChangeListener(thisListener); - closeMenuItem_actionPerformed(null); - } - ; - }); - - } - - public void setGUINucleotide(boolean nucleotide) - { - showTranslation.setVisible( nucleotide ); - //sequenceFeatures.setVisible(!nucleotide ); - //featureSettings.setVisible( !nucleotide ); - conservationMenuItem.setVisible( !nucleotide ); - modifyConservation.setVisible( !nucleotide ); - - //Remember AlignFrame always starts as protein - if(!nucleotide) - { - calculateMenu.remove(calculateMenu.getItemCount()-2); - } - } - - - /* - Added so Castor Mapping file can obtain Jalview Version - */ - public String getVersion() - { - return jalview.bin.Cache.getProperty("VERSION"); - } - - - public void fetchSequence_actionPerformed(ActionEvent e) - { - new SequenceFetcher(this); - } - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void saveAlignmentMenu_actionPerformed(ActionEvent e) - { - JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache. - getProperty( - "LAST_DIRECTORY"), - new String[] - { - "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc", - "jar" - }, - new String[] - { - "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview" - }, currentFileFormat); - - chooser.setAcceptAllFileFilterUsed(false); - chooser.setFileView(new JalviewFileView()); - chooser.setDialogTitle("Save Alignment to file"); - chooser.setToolTipText("Save"); - - int value = chooser.showSaveDialog(this); - - if (value == JalviewFileChooser.APPROVE_OPTION) - { - currentFileFormat = chooser.getSelectedFormat(); - - if (currentFileFormat == null) - { - JOptionPane.showInternalMessageDialog(Desktop.desktop, - "You must select a file format before saving!", - "File format not specified", - JOptionPane.WARNING_MESSAGE); - value = chooser.showSaveDialog(this); - return; - } - - jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT", - currentFileFormat); - - String choice = chooser.getSelectedFile().getPath(); - jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice); - - saveAlignment(choice, currentFileFormat); - } - } - - public boolean saveAlignment(String file, String format) - { - if (format.equalsIgnoreCase("Jalview")) - { - String shortName = title; - - if (shortName.indexOf(java.io.File.separatorChar) > -1) - { - shortName = shortName.substring(shortName.lastIndexOf( - java.io.File.separatorChar) + 1); - } - - new Jalview2XML().SaveAlignment(this, file, shortName); - - // USE Jalview2XML to save this file - return true; - } - else - { - String output = new FormatAdapter().formatSequences(format, - viewport.getAlignment(). - getSequences()); - if (output == null) - { - return false; - } - - try - { - java.io.PrintWriter out = new java.io.PrintWriter( - new java.io.FileWriter(file)); - - out.print(output); - out.close(); - return true; - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } - return false; - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - protected void outputText_actionPerformed(ActionEvent e) - { - CutAndPasteTransfer cap = new CutAndPasteTransfer(); - Desktop.addInternalFrame(cap, - "Alignment output - " + e.getActionCommand(), 600, - 500); - cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(), - viewport.getAlignment(). - getSequences())); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - protected void htmlMenuItem_actionPerformed(ActionEvent e) - { - new HTMLOutput(viewport, - alignPanel.seqPanel.seqCanvas.getSequenceRenderer(), - alignPanel.seqPanel.seqCanvas.getFeatureRenderer()); - } - - public void createImageMap(File file, String image) - { - alignPanel.makePNGImageMap(file, image); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void createPNG(File f) - { - alignPanel.makePNG(f); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void createEPS(File f) - { - alignPanel.makeEPS(f); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void printMenuItem_actionPerformed(ActionEvent e) - { - //Putting in a thread avoids Swing painting problems - PrintThread thread = new PrintThread(); - thread.start(); - } - - public void associatedData_actionPerformed(ActionEvent e) - { - // Pick the tree file - JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache. - getProperty( - "LAST_DIRECTORY")); - chooser.setFileView(new JalviewFileView()); - chooser.setDialogTitle("Load Jalview Annotations or Features File"); - chooser.setToolTipText("Load Jalview Annotations / Features file"); - - int value = chooser.showOpenDialog(null); - - if (value == JalviewFileChooser.APPROVE_OPTION) - { - String choice = chooser.getSelectedFile().getPath(); - jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice); - loadJalviewDataFile(choice); - } - - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void closeMenuItem_actionPerformed(ActionEvent e) - { - try - { - PaintRefresher.components.remove(viewport.alignment); - this.setClosed(true); - } - catch (Exception ex) - { - } - } - - /** - * DOCUMENT ME! - */ - void updateEditMenuBar() - { - if (historyList.size() > 0) - { - undoMenuItem.setEnabled(true); - - HistoryItem hi = (HistoryItem) historyList.peek(); - undoMenuItem.setText("Undo " + hi.getDescription()); - } - else - { - undoMenuItem.setEnabled(false); - undoMenuItem.setText("Undo"); - } - - if (redoList.size() > 0) - { - redoMenuItem.setEnabled(true); - - HistoryItem hi = (HistoryItem) redoList.peek(); - redoMenuItem.setText("Redo " + hi.getDescription()); - } - else - { - redoMenuItem.setEnabled(false); - redoMenuItem.setText("Redo"); - } - } - - /** - * DOCUMENT ME! - * - * @param hi DOCUMENT ME! - */ - public void addHistoryItem(HistoryItem hi) - { - historyList.push(hi); - updateEditMenuBar(); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - protected void undoMenuItem_actionPerformed(ActionEvent e) - { - HistoryItem hi = (HistoryItem) historyList.pop(); - redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment, - HistoryItem.HIDE)); - restoreHistoryItem(hi); - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - protected void redoMenuItem_actionPerformed(ActionEvent e) - { - HistoryItem hi = (HistoryItem) redoList.pop(); - restoreHistoryItem(hi); - updateEditMenuBar(); - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - } - - // used by undo and redo - void restoreHistoryItem(HistoryItem hi) - { - - hi.restore(); - - updateEditMenuBar(); - - viewport.firePropertyChange("alignment", null, - viewport.getAlignment().getSequences()); - } - - /** - * DOCUMENT ME! - * - * @param up DOCUMENT ME! - */ - public void moveSelectedSequences(boolean up) - { - SequenceGroup sg = viewport.getSelectionGroup(); - - if (sg == null) - { - return; - } - - if (up) - { - for (int i = 1; i < viewport.alignment.getHeight(); i++) - { - SequenceI seq = viewport.alignment.getSequenceAt(i); - - if (!sg.sequences.contains(seq)) - { - continue; - } - - SequenceI temp = viewport.alignment.getSequenceAt(i - 1); - - if (sg.sequences.contains(temp)) - { - continue; - } - - viewport.alignment.getSequences().setElementAt(temp, i); - viewport.alignment.getSequences().setElementAt(seq, i - 1); - } - } - else - { - for (int i = viewport.alignment.getHeight() - 2; i > -1; i--) - { - SequenceI seq = viewport.alignment.getSequenceAt(i); - - if (!sg.sequences.contains(seq)) - { - continue; - } - - SequenceI temp = viewport.alignment.getSequenceAt(i + 1); - - if (sg.sequences.contains(temp)) - { - continue; - } - - viewport.alignment.getSequences().setElementAt(temp, i); - viewport.alignment.getSequences().setElementAt(seq, i + 1); - } - } - - alignPanel.repaint(); - } - - public void lostOwnership(Clipboard clipboard, Transferable contents) - { - Desktop.jalviewClipboard = null; - } - - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - protected void copy_actionPerformed(ActionEvent e) - { - if (viewport.getSelectionGroup() == null) - { - return; - } - - SequenceGroup sg = viewport.getSelectionGroup(); - - Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard(); - - Hashtable orderedSeqs = new Hashtable(); - SequenceI[] seqs = new SequenceI[sg.getSize()]; - - for (int i = 0; i < sg.getSize(); i++) - { - SequenceI seq = sg.getSequenceAt(i); - int index = viewport.alignment.findIndex(seq); - orderedSeqs.put(index + "", seq); - } - - int index = 0, startRes, endRes; - char ch; - - for (int i = 0; i < sg.getSize(); i++) - { - SequenceI seq = null; - - while (seq == null) - { - if (orderedSeqs.containsKey(index + "")) - { - seq = (SequenceI) orderedSeqs.get(index + ""); - index++; - - break; - } - else - { - index++; - } - } - - //FIND START RES - //Returns residue following index if gap - startRes = seq.findPosition(sg.getStartRes()); - - //FIND END RES - //Need to find the residue preceeding index if gap - endRes = 0; - - for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++) - { - ch = seq.getCharAt(j); - if (!jalview.util.Comparison.isGap( (ch))) - { - endRes++; - } - } - - if (endRes > 0) - { - endRes += seq.getStart() - 1; - } - - seqs[i] = new Sequence(seq.getName(), - seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1), - startRes, - endRes); - seqs[i].setDescription(seq.getDescription()); - seqs[i].setDBRef(seq.getDBRef()); - seqs[i].setSequenceFeatures(seq.getSequenceFeatures()); - seqs[i].setDatasetSequence(seq.getDatasetSequence()); - - } - - FastaFile ff = new FastaFile(); - ff.addJVSuffix( viewport.showJVSuffix ); - c.setContents(new StringSelection( ff.print(seqs)), this); - Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()}; - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - protected void pasteNew_actionPerformed(ActionEvent e) - { - paste(true); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - protected void pasteThis_actionPerformed(ActionEvent e) - { - addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment, - HistoryItem.PASTE)); - paste(false); - } - - /** - * DOCUMENT ME! - * - * @param newAlignment DOCUMENT ME! - */ - void paste(boolean newAlignment) - { - try - { - Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard(); - Transferable contents = c.getContents(this); - - if (contents == null) - { - return; - } - - String str = (String) contents.getTransferData(DataFlavor.stringFlavor); - if(str.length()<1) - return; - - String format = new IdentifyFile().Identify(str, "Paste"); - SequenceI[] sequences; - - if(Desktop.jalviewClipboard!=null) - { - // The clipboard was filled from within Jalview, we must use the sequences - // And dataset from the copied alignment - sequences = (SequenceI[])Desktop.jalviewClipboard[0]; - } - else - { - sequences = new FormatAdapter().readFile(str, "Paste", format); - } - - if (newAlignment) - { - - Alignment alignment = new Alignment(sequences); - - if(Desktop.jalviewClipboard!=null) - alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] ); - else - alignment.setDataset( null ); - - - AlignFrame af = new AlignFrame(alignment); - String newtitle = new String("Copied sequences"); - - //>>>This is a fix for the moment, until a better solution is found!!<<< - FeatureRenderer fr = af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer(); - fr.featureColours = alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureColours; - - if (title.startsWith("Copied sequences")) - { - newtitle = title; - } - else - { - newtitle = newtitle.concat("- from " + title); - } - - Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH, - NEW_WINDOW_HEIGHT); - } - else - { - //!newAlignment - for (int i = 0; i < sequences.length; i++) - { - Sequence newseq = new Sequence(sequences[i].getName(), - sequences[i].getSequence(), sequences[i].getStart(), - sequences[i].getEnd()); - viewport.alignment.addSequence(newseq); - if(sequences[i].getDatasetSequence()==null) - { - //////////////////////////// - //Datset needs extension; - ///////////////////////////// - Sequence ds = new Sequence(sequences[i].getName(), - AlignSeq.extractGaps("-. ", sequences[i].getSequence()), - sequences[i].getStart(), - sequences[i].getEnd()); - newseq.setDatasetSequence(ds); - viewport.alignment.getDataset().addSequence(ds); - } - else - { - newseq.setDatasetSequence(sequences[i].getDatasetSequence()); - if(sequences[i].getDatasetSequence().getAnnotation()!=null) - { - for(int aa=0; aa 0) - { - addHistoryItem(new HistoryItem("Remove Left", viewport.alignment, - HistoryItem.HIDE)); - - int min = colSel.getMin(); - viewport.getAlignment().trimLeft(min); - colSel.compensateForEdit(0, min); - - if (viewport.getSelectionGroup() != null) - { - viewport.getSelectionGroup().adjustForRemoveLeft(min); - } - - Vector groups = viewport.alignment.getGroups(); - - for (int i = 0; i < groups.size(); i++) - { - SequenceGroup sg = (SequenceGroup) groups.get(i); - - if (!sg.adjustForRemoveLeft(min)) - { - viewport.alignment.deleteGroup(sg); - } - } - - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - } - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void remove2RightMenuItem_actionPerformed(ActionEvent e) - { - ColumnSelection colSel = viewport.getColumnSelection(); - - if (colSel.size() > 0) - { - addHistoryItem(new HistoryItem("Remove Right", viewport.alignment, - HistoryItem.HIDE)); - - int max = colSel.getMax(); - viewport.getAlignment().trimRight(max); - - if (viewport.getSelectionGroup() != null) - { - viewport.getSelectionGroup().adjustForRemoveRight(max); - } - - Vector groups = viewport.alignment.getGroups(); - - for (int i = 0; i < groups.size(); i++) - { - SequenceGroup sg = (SequenceGroup) groups.get(i); - - if (!sg.adjustForRemoveRight(max)) - { - viewport.alignment.deleteGroup(sg); - } - } - - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - } - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e) - { - addHistoryItem(new HistoryItem("Remove Gapped Columns", - viewport.alignment, HistoryItem.HIDE)); - - //This is to maintain viewport position on first residue - //of first sequence - SequenceI seq = viewport.alignment.getSequenceAt(0); - int startRes = seq.findPosition(viewport.startRes); - - viewport.getAlignment().removeGaps(); - - viewport.setStartRes(seq.findIndex(startRes)-1); - - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void removeAllGapsMenuItem_actionPerformed(ActionEvent e) - { - addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment, - HistoryItem.HIDE)); - - //This is to maintain viewport position on first residue - //of first sequence - SequenceI seq = viewport.alignment.getSequenceAt(0); - int startRes = seq.findPosition(viewport.startRes); - - - SequenceI current; - int jSize; - - Vector seqs = null; - - int start = 0; - int end = viewport.alignment.getWidth(); - - if (viewport.getSelectionGroup() != null - && viewport.getSelectionGroup().sequences != null - && viewport.getSelectionGroup().sequences.size() > 0) - { - seqs = viewport.getSelectionGroup().sequences; - start = viewport.getSelectionGroup().getStartRes(); - end = viewport.getSelectionGroup().getEndRes()+1; - } - else - { - seqs = viewport.alignment.getSequences(); - } - - for (int i = 0; i < seqs.size(); i++) - { - current = (SequenceI) seqs.elementAt(i); - jSize = current.getLength(); - - // Removing a range is much quicker than removing gaps - // one by one for long sequences - int j = start; - int rangeStart=-1, rangeEnd=-1; - - do - { - if (jalview.util.Comparison.isGap(current.getCharAt(j))) - { - if(rangeStart==-1) - { - rangeStart = j; - rangeEnd = j+1; - } - else - { - rangeEnd++; - } - j++; - } - else - { - if(rangeStart>-1) - { - current.deleteChars(rangeStart, rangeEnd); - j-=rangeEnd-rangeStart; - jSize-=rangeEnd-rangeStart; - rangeStart = -1; - rangeEnd = -1; - } - else - j++; - } - } - while (j < end && j < jSize); - if(rangeStart>-1) - { - current.deleteChars(rangeStart, rangeEnd); - } - } - - viewport.setStartRes(seq.findIndex(startRes)-1); - - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - } - - public void alignmentChanged() - { - if(viewport.padGaps) - viewport.getAlignment().padGaps(); - - if(viewport.vconsensus!=null && viewport.autoCalculateConsensus) - { - viewport.updateConsensus(); - viewport.updateConservation(); - } - resetAllColourSchemes(); - if(alignPanel.overviewPanel!=null) - alignPanel.overviewPanel.updateOverviewImage(); - - viewport.alignment.adjustSequenceAnnotations(); - - alignPanel.repaint(); - } - - void resetAllColourSchemes() - { - ColourSchemeI cs = viewport.globalColourScheme; - if(cs!=null) - { - if (cs instanceof ClustalxColourScheme) - { - ( (ClustalxColourScheme) viewport.getGlobalColourScheme()). - resetClustalX(viewport.alignment.getSequences(), - viewport.alignment.getWidth()); - } - - cs.setConsensus(viewport.vconsensus); - if (cs.conservationApplied()) - { - Alignment al = (Alignment) viewport.alignment; - Conservation c = new Conservation("All", - ResidueProperties.propHash, 3, - al.getSequences(), 0, - al.getWidth() - 1); - c.calculate(); - c.verdict(false, viewport.ConsPercGaps); - - cs.setConservation(c); - } - } - - int s, sSize = viewport.alignment.getGroups().size(); - for(s=0; s 0)) || - (viewport.getAlignment().getHeight() < 4)) - { - JOptionPane.showInternalMessageDialog(this, - "Principal component analysis must take\n" + - "at least 4 input sequences.", - "Sequence selection insufficient", - JOptionPane.WARNING_MESSAGE); - - return; - } - - new PCAPanel(viewport); - } - - - public void autoCalculate_actionPerformed(ActionEvent e) - { - viewport.autoCalculateConsensus = autoCalculate.isSelected(); - } - - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e) - { - NewTreePanel("AV", "PID", "Average distance tree using PID"); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void neighbourTreeMenuItem_actionPerformed(ActionEvent e) - { - NewTreePanel("NJ", "PID", "Neighbour joining tree using PID"); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e) - { - NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62"); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e) - { - NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62"); - } - - /** - * DOCUMENT ME! - * - * @param type DOCUMENT ME! - * @param pwType DOCUMENT ME! - * @param title DOCUMENT ME! - */ - void NewTreePanel(String type, String pwType, String title) - { - TreePanel tp; - - if ( (viewport.getSelectionGroup() != null) && - (viewport.getSelectionGroup().getSize() > 3)) - { - int s = 0; - SequenceGroup sg = viewport.getSelectionGroup(); - - /* Decide if the selection is a column region */ - while (s < sg.sequences.size()) - { - if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() < - sg.getEndRes()) - { - JOptionPane.showMessageDialog(Desktop.desktop, - "The selected region to create a tree may\nonly contain residues or gaps.\n" + - "Try using the Pad function in the edit menu,\n" + - "or one of the multiple sequence alignment web services.", - "Sequences in selection are not aligned", - JOptionPane.WARNING_MESSAGE); - - return; - } - } - - title = title + " on region"; - tp = new TreePanel(viewport, - viewport.getSelectionGroup().sequences, type, pwType, - sg.getStartRes(), sg.getEndRes()); - } - else - { - //are the sequences aligned? - if (!viewport.alignment.isAligned()) - { - JOptionPane.showMessageDialog(Desktop.desktop, - "The sequences must be aligned before creating a tree.\n" + - "Try using the Pad function in the edit menu,\n" + - "or one of the multiple sequence alignment web services.", - "Sequences not aligned", - JOptionPane.WARNING_MESSAGE); - - return; - } - - tp = new TreePanel(viewport, - viewport.getAlignment().getSequences(), type, pwType, - 0, - viewport.alignment.getWidth()); - } - - addTreeMenuItem(tp, title); - - Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500); - } - - /** - * DOCUMENT ME! - * - * @param title DOCUMENT ME! - * @param order DOCUMENT ME! - */ - public void addSortByOrderMenuItem(String title, final AlignmentOrder order) - { - final JMenuItem item = new JMenuItem("by " + title); - sort.add(item); - item.addActionListener(new java.awt.event.ActionListener() - { - public void actionPerformed(ActionEvent e) - { - addHistoryItem(new HistoryItem("Sort", viewport.alignment, - HistoryItem.SORT)); - - // TODO: JBPNote - have to map order entries to curent SequenceI pointers - AlignmentSorter.sortBy(viewport.getAlignment(), order); - alignPanel.repaint(); - } - }); - } - - /** - * Maintain the Order by->Displayed Tree menu. - * Creates a new menu item for a TreePanel with an appropriate - * jalview.analysis.AlignmentSorter call. Listeners are added - * to remove the menu item when the treePanel is closed, and adjust - * the tree leaf to sequence mapping when the alignment is modified. - * @param treePanel Displayed tree window. - * @param title SortBy menu item title. - */ - void addTreeMenuItem(final TreePanel treePanel, String title) - { - final JMenuItem item = new JMenuItem(title); - - treeCount++; - - if (treeCount == 1) - { - sort.add(sortByTreeMenu); - } - - sortByTreeMenu.add(item); - item.addActionListener(new java.awt.event.ActionListener() - { - public void actionPerformed(ActionEvent e) - { - addHistoryItem(new HistoryItem("Tree Sort", - viewport.alignment, HistoryItem.SORT)); - AlignmentSorter.sortByTree(viewport.getAlignment(), - treePanel.getTree()); - alignPanel.repaint(); - } - }); - - treePanel.addInternalFrameListener(new javax.swing.event. - InternalFrameAdapter() - { - public void internalFrameClosed( - javax.swing.event.InternalFrameEvent evt) - { - treeCount--; - sortByTreeMenu.remove(item); - - if (treeCount == 0) - { - sort.remove(sortByTreeMenu); - } - } - ; - }); - } - - /** - * Work out whether the whole set of sequences - * or just the selected set will be submitted for multiple alignment. - * - */ - private SequenceI[] gatherSequencesForAlignment() - { - // Now, check we have enough sequences - SequenceI[] msa = null; - - if ( (viewport.getSelectionGroup() != null) && - (viewport.getSelectionGroup().getSize() > 1)) - { - // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface! - SequenceGroup seqs = viewport.getSelectionGroup(); - int sz; - msa = new SequenceI[sz = seqs.getSize()]; - - for (int i = 0; i < sz; i++) - { - msa[i] = (SequenceI) seqs.getSequenceAt(i); - } - } - else - { - Vector seqs = viewport.getAlignment().getSequences(); - - if (seqs.size() > 1) - { - msa = new SequenceI[seqs.size()]; - - for (int i = 0; i < seqs.size(); i++) - { - msa[i] = (SequenceI) seqs.elementAt(i); - } - } - } - return msa; - } - - /** - * Decides what is submitted to a secondary structure prediction service, - * the currently selected sequence, or the currently selected alignment - * (where the first sequence in the set is the one that the prediction - * will be for). - */ - SequenceI[] gatherSeqOrMsaForSecStrPrediction() - { - SequenceI seq = null; - SequenceI[] msa = null; - - if ( (viewport.getSelectionGroup() != null) && - (viewport.getSelectionGroup().getSize() > 0)) - { - // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface! - SequenceGroup seqs = viewport.getSelectionGroup(); - - if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned()) - { - seq = (SequenceI) seqs.getSequenceAt(0); - } - else - { - int sz; - msa = new SequenceI[sz = seqs.getSize()]; - - for (int i = 0; i < sz; i++) - { - msa[i] = (SequenceI) seqs.getSequenceAt(i); - } - } - } - else - { - Vector seqs = viewport.getAlignment().getSequences(); - - if ( (seqs.size() == 1) || !viewport.alignment.isAligned()) - { - seq = (SequenceI) seqs.elementAt(0); - } - else - { - msa = new SequenceI[seqs.size()]; - - for (int i = 0; i < seqs.size(); i++) - { - msa[i] = (SequenceI) seqs.elementAt(i); - } - } - } - if (msa != null) - { - return msa; - } - else - { - if (seq != null) - { - return new SequenceI[] - { - seq}; - } - } - return null; - } - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) - { - // Pick the tree file - JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache. - getProperty( - "LAST_DIRECTORY")); - chooser.setFileView(new JalviewFileView()); - chooser.setDialogTitle("Select a newick-like tree file"); - chooser.setToolTipText("Load a tree file"); - - int value = chooser.showOpenDialog(null); - - if (value == JalviewFileChooser.APPROVE_OPTION) - { - String choice = chooser.getSelectedFile().getPath(); - jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice); - - try - { - jalview.io.NewickFile fin = new jalview.io.NewickFile(choice, - "File"); - viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree()); - } - catch (Exception ex) - { - JOptionPane.showMessageDialog(Desktop.desktop, - "Problem reading tree file", - ex.getMessage(), - JOptionPane.WARNING_MESSAGE); - ex.printStackTrace(); - } - } - } - - - public TreePanel ShowNewickTree(NewickFile nf, String title) - { - return ShowNewickTree(nf,title,600,500,4,5); - } - /** - * DOCUMENT ME! - * - * @param nf DOCUMENT ME! - * @param title DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y) - { - TreePanel tp = null; - - try - { - nf.parse(); - - if (nf.getTree() != null) - { - tp = new TreePanel(viewport, - viewport.getAlignment().getSequences(), nf, - "FromFile", - title); - - tp.setSize(w,h); - - if(x>0 && y>0) - tp.setLocation(x,y); - - - Desktop.addInternalFrame(tp, title, w, h); - addTreeMenuItem(tp, title); - } - } - catch (Exception ex) - { - ex.printStackTrace(); - } - - return tp; - } - - class PrintThread - extends Thread - { - public void run() - { - PrinterJob printJob = PrinterJob.getPrinterJob(); - PageFormat pf = printJob.pageDialog(printJob.defaultPage()); - printJob.setPrintable(alignPanel, pf); - - if (printJob.printDialog()) - { - try - { - printJob.print(); - } - catch (Exception PrintException) - { - PrintException.printStackTrace(); - } - } - } - } - - /** - * Generates menu items and listener event actions for web service clients - * - */ - public void BuildWebServiceMenu() - { - if ( (Discoverer.services != null) - && (Discoverer.services.size() > 0)) - { - Vector msaws = (Vector) Discoverer.services.get("MsaWS"); - Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred"); - Vector wsmenu = new Vector(); - if (msaws != null) - { - // Add any Multiple Sequence Alignment Services - final JMenu msawsmenu = new JMenu("Alignment"); - for (int i = 0, j = msaws.size(); i < j; i++) - { - final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws. - get(i); - final JMenuItem method = new JMenuItem(sh.getName()); - method.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - SequenceI[] msa = gatherSequencesForAlignment(); - new jalview.ws.MsaWSClient(sh, title, msa, - false, true, viewport.getAlignment().getDataset()); - - } - - }); - msawsmenu.add(method); - // Deal with services that we know accept partial alignments. - if (sh.getName().indexOf("lustal") > -1) - { - // We know that ClustalWS can accept partial alignments for refinement. - final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign"); - methodR.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - SequenceI[] msa = gatherSequencesForAlignment(); - new jalview.ws.MsaWSClient(sh, title, msa, - true, true, viewport.getAlignment().getDataset()); - - } - - }); - msawsmenu.add(methodR); - - } - } - wsmenu.add(msawsmenu); - } - if (secstrpr != null) - { - // Add any secondary structure prediction services - final JMenu secstrmenu = new JMenu("Secondary Structure Prediction"); - for (int i = 0, j = secstrpr.size(); i < j; i++) - { - final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) - secstrpr.get(i); - final JMenuItem method = new JMenuItem(sh.getName()); - method.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction(); - if (msa.length == 1) - { - // Single Sequence prediction - new jalview.ws.JPredClient(sh,title, msa[0]); - } - else - { - if (msa.length > 1) - { - // Single Sequence prediction - jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh, - title, msa); - } - } - } - }); - secstrmenu.add(method); - } - wsmenu.add(secstrmenu); - } - this.webService.removeAll(); - for (int i = 0, j = wsmenu.size(); i < j; i++) - { - webService.add( (JMenu) wsmenu.get(i)); - } - } - else - { - this.webService.removeAll(); - this.webService.add(this.webServiceNoServices); - } - // TODO: add in rediscovery function - // TODO: reduce code redundancy. - // TODO: group services by location as well as function. - } - - /* public void vamsasStore_actionPerformed(ActionEvent e) - { - JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache. - getProperty("LAST_DIRECTORY")); - - chooser.setFileView(new JalviewFileView()); - chooser.setDialogTitle("Export to Vamsas file"); - chooser.setToolTipText("Export"); - - int value = chooser.showSaveDialog(this); - - if (value == JalviewFileChooser.APPROVE_OPTION) - { - jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport); - //vs.store(chooser.getSelectedFile().getAbsolutePath() ); - vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this); - } - }*/ - - - - - -public void showTranslation_actionPerformed(ActionEvent e) -{ - int s, sSize = viewport.alignment.getHeight(); - SequenceI [] newSeq = new SequenceI[sSize]; - - int res, resSize; - StringBuffer protein; - String seq; - for(s=0; s