/*
* 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.*;
import org.biojava.dasobert.eventmodel.*;
/**
* DOCUMENT ME!
*
* @author $author$
* @version $Revision$
*/
public class AlignFrame
extends GAlignFrame implements DropTargetListener, FeatureListener
{
/** DOCUMENT ME!! */
public static final int NEW_WINDOW_WIDTH = 700;
/** DOCUMENT ME!! */
public static final int NEW_WINDOW_HEIGHT = 500;
AlignmentPanel alignPanel;
AlignViewport viewport;
/** 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);
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);
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());
}
if (jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false))
{
wrapMenuItem.setSelected(true);
wrapMenuItem_actionPerformed(null);
}
}
public AlignViewport getViewport()
{
return viewport;
}
/* 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);
}
}
public void comeBackLater(FeatureEvent evt)
{}
public void newFeatures(FeatureEvent evt)
{
if (evt.getFeatures().length > 0)
{
alignPanel.seqPanel.seqCanvas.fr.featuresAdded();
alignPanel.repaint();
if(featureSettings!=null)
featureSettings.setTableData();
}
}
Hashtable progressBars;
public void setProgressBar(String message, long id)
{
if(progressBars == null)
progressBars = new Hashtable();
JPanel progressPanel;
GridLayout layout = (GridLayout) statusPanel.getLayout();
if(progressBars.get( new Long(id) )!=null)
{
progressPanel = (JPanel)progressBars.get( new Long(id) );
statusPanel.remove(progressPanel);
progressBars.remove( progressPanel );
progressPanel = null;
if(message!=null)
statusBar.setText(message);
layout.setRows(layout.getRows() - 1);
}
else
{
progressPanel = new JPanel(new BorderLayout(10, 5));
JProgressBar progressBar = new JProgressBar();
progressBar.setIndeterminate(true);
progressPanel.add(new JLabel(message), BorderLayout.WEST);
progressPanel.add(progressBar, BorderLayout.CENTER);
layout.setRows(layout.getRows() + 1);
statusPanel.add(progressPanel);
progressBars.put(new Long(id), progressPanel);
}
validate();
}
/*
Added so Castor Mapping file can obtain Jalview Version
*/
public String getVersion()
{
return jalview.bin.Cache.getProperty("VERSION");
}
public FeatureRenderer getFeatureRenderer()
{
return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
}
public void fetchSequence_actionPerformed(ActionEvent e)
{
new SequenceFetcher(this);
}
public void addFromFile_actionPerformed(ActionEvent e)
{
Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
}
public void addFromText_actionPerformed(ActionEvent e)
{
Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
}
public void addFromURL_actionPerformed(ActionEvent e)
{
Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
}
/**
* 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,
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[] omitHidden = null;
if (viewport.hasHiddenColumns)
{
System.out.println("PROMPT USER HERE");
omitHidden = viewport.getSelectionAsString();
}
String output = new FormatAdapter().formatSequences(
format,
viewport.getSelectionAsNewSequence(),
omitHidden) ;
if (output == null)
{
return false;
}
try
{
java.io.PrintWriter out = new java.io.PrintWriter(
new java.io.FileWriter(file));
out.print(output);
out.close();
this.setTitle(file);
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();
String [] omitHidden = null;
if(viewport.hasHiddenColumns)
{
System.out.println("PROMPT USER HERE");
omitHidden = viewport.getSelectionAsString();
}
cap.setText(new FormatAdapter().formatSequences(
e.getActionCommand(),
viewport.getSelectionAsNewSequence(),
omitHidden));
}
/**
* 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 exportFeatures_actionPerformed(ActionEvent e)
{
new AnnotationExporter().exportFeatures(alignPanel);
}
public void exportAnnotations_actionPerformed(ActionEvent e)
{
new AnnotationExporter().exportAnnotations(
alignPanel,
viewport.alignment.getAlignmentAnnotation()
);
}
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.getSequences(false).contains(seq))
{
continue;
}
SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
if (sg.getSequences(false).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.getSequences(false).contains(seq))
{
continue;
}
SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
if (sg.getSequences(false).contains(temp))
{
continue;
}
viewport.alignment.getSequences().setElementAt(temp, i);
viewport.alignment.getSequences().setElementAt(seq, i + 1);
}
}
alignPanel.repaint();
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
protected void copy_actionPerformed(ActionEvent e)
{
if (viewport.getSelectionGroup() == null)
{
return;
}
SequenceI [] seqs = viewport.getSelectionAsNewSequence();
Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
FastaFile ff = new FastaFile();
ff.addJVSuffix( viewport.showJVSuffix );
c.setContents(new StringSelection(ff.print(seqs)), Desktop.instance);
Vector hiddenColumns = null;
if(viewport.hasHiddenColumns && viewport.getSelectionGroup()!=null)
{
hiddenColumns =new Vector();
int hiddenOffset = viewport.getSelectionGroup().getStartRes();
for(int i=0; i>>This is a fix for the moment, until a better solution is found!!<<<
af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
if (title.startsWith("Copied sequences"))
{
newtitle = title;
}
else
{
newtitle = newtitle.concat("- from " + title);
}
Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
NEW_WINDOW_HEIGHT);
}
}
catch (Exception ex)
{
ex.printStackTrace();
System.out.println("Exception whilst pasting: "+ex);
// could be anything being pasted in here
}
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
protected void cut_actionPerformed(ActionEvent e)
{
copy_actionPerformed(null);
delete_actionPerformed(null);
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
protected void delete_actionPerformed(ActionEvent e)
{
if (viewport.getSelectionGroup() == null)
{
return;
}
SequenceGroup sg = viewport.getSelectionGroup();
//Jalview no longer allows deletion of residues.
//Check here whether any residues are in selection area
/* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
{
for (int i = 0; i < sg.sequences.size(); i++)
{
SequenceI seq = sg.getSequenceAt(i);
int j = sg.getStartRes();
do
{
if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
{
JOptionPane.showInternalMessageDialog(
Desktop.desktop, "Cannot delete residues from alignment!\n"
+ "Try hiding columns instead.",
"Deletion of residues not permitted",
JOptionPane.WARNING_MESSAGE);
return;
}
j++;
}while(j<=sg.getEndRes());
}
}*/
addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
HistoryItem.HIDE));
for (int i = 0; i < sg.getSize(false); i++)
{
SequenceI seq = sg.getSequenceAt(i);
int index = viewport.getAlignment().findIndex(seq);
seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
// If the cut affects all sequences, remove highlighted columns
if (sg.getSize(false) == viewport.alignment.getHeight())
{
viewport.getColumnSelection().removeElements(sg.getStartRes(),
sg.getEndRes() + 1);
}
if (seq.getSequence().length() < 1)
{
viewport.getAlignment().deleteSequence(seq);
}
else
{
viewport.getAlignment().getSequences().setElementAt(seq, index);
}
}
viewport.setSelectionGroup(null);
viewport.alignment.deleteGroup(sg);
viewport.firePropertyChange("alignment", null,
viewport.getAlignment().getSequences());
if (viewport.getAlignment().getHeight() < 1)
{
try
{
this.setClosed(true);
}
catch (Exception ex)
{
}
}
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
protected void deleteGroups_actionPerformed(ActionEvent e)
{
viewport.alignment.deleteAllGroups();
viewport.setSelectionGroup(null);
alignPanel.repaint();
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
{
SequenceGroup sg = new SequenceGroup();
for (int i = 0; i < viewport.getAlignment().getSequences().size();
i++)
{
sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
}
sg.setEndRes(viewport.alignment.getWidth() - 1);
viewport.setSelectionGroup(sg);
PaintRefresher.Refresh(null, viewport.alignment);
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
{
if(viewport.cursorMode)
{
alignPanel.seqPanel.keyboardNo1 = null;
alignPanel.seqPanel.keyboardNo2 = null;
}
viewport.setSelectionGroup(null);
viewport.getColumnSelection().clear();
viewport.setSelectionGroup(null);
alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
alignPanel.idPanel.idCanvas.searchResults = null;
alignPanel.repaint();
PaintRefresher.Refresh(null, viewport.alignment);
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
{
SequenceGroup sg = viewport.getSelectionGroup();
if (sg == null)
{
selectAllSequenceMenuItem_actionPerformed(null);
return;
}
for (int i = 0; i < viewport.getAlignment().getSequences().size();
i++)
{
sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
}
PaintRefresher.Refresh(null, viewport.alignment);
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
{
ColumnSelection colSel = viewport.getColumnSelection();
if (colSel.size() > 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().getSequences(true) != null
&& viewport.getSelectionGroup().getSize(true) > 0)
{
seqs = viewport.getSelectionGroup().getSequences(true);
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();
if(viewport.autoCalculateConsensus)
{
alignmentChanged();
}
}
/**
* 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(false) > 3))
{
int s = 0;
SequenceGroup sg = viewport.getSelectionGroup();
/* Decide if the selection is a column region */
while (s < sg.getSize(false))
{
if ( ( (SequenceI) sg.getSequences(false).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, type, pwType);
}
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, type, pwType);
}
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(false) > 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(false)];
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(false) > 0))
{
// JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
SequenceGroup seqs = viewport.getSelectionGroup();
if ( (seqs.getSize(false) == 1) || !viewport.alignment.isAligned())
{
seq = (SequenceI) seqs.getSequenceAt(0);
}
else
{
int sz;
msa = new SequenceI[sz = seqs.getSize(false)];
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,
"FromFile",
title,
nf);
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");
final AlignFrame af = this;
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(), af);
}
});
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(), af);
}
});
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