package jalview.gui;
-import jalview.jbgui.GAlignFrame;
-import jalview.schemes.*;
-import jalview.datamodel.*;
-import jalview.analysis.*;
-import jalview.io.*;
-import jalview.ws.*;
+import java.util.*;
+
import java.awt.*;
+import java.awt.datatransfer.*;
import java.awt.event.*;
import java.awt.print.*;
import javax.swing.*;
import javax.swing.event.*;
-import java.util.*;
-import java.awt.datatransfer.*;
+import jalview.analysis.*;
+import jalview.datamodel.*;
+import jalview.io.*;
+import jalview.jbgui.*;
+import jalview.schemes.*;
+import jalview.ws.*;
+import java.beans.PropertyChangeEvent;
public class AlignFrame extends GAlignFrame
{
if(value == JalviewFileChooser.APPROVE_OPTION)
{
currentFileFormat = chooser.getSelectedFormat();
+ jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT", currentFileFormat);
if (currentFileFormat.equals("Jalview"))
{
- String shortName = title.replace('/', '_');
- title = title.replace('\\', '_');
+ String shortName = title;
+ if(shortName.indexOf(java.io.File.separatorChar)>-1)
+ shortName = shortName.substring(
+ shortName.lastIndexOf(java.io.File.separatorChar)+1);
+
String choice = chooser.getSelectedFile().getPath();
- Jalview2XML.SaveState(this, System.currentTimeMillis(), shortName,
- choice);
+ Jalview2XML.SaveState(this, choice, shortName);
// USE Jalview2XML to save this file
return;
}
protected void outputText_actionPerformed(ActionEvent e)
{
- CutAndPasteTransfer cap = new CutAndPasteTransfer(false);
- JInternalFrame frame = new JInternalFrame();
- cap.formatForOutput();
- frame.setContentPane(cap);
- Desktop.addInternalFrame(frame, "Alignment output - "+e.getActionCommand(), 600, 500);
+ CutAndPasteTransfer cap = new CutAndPasteTransfer();
+ Desktop.addInternalFrame(cap, "Alignment output - "+e.getActionCommand(), 600, 500);
cap.setText( FormatAdapter.formatSequences(e.getActionCommand(), viewport.getAlignment().getSequences()));
}
protected void htmlMenuItem_actionPerformed(ActionEvent e)
{
- HTMLOutput htmlOutput = new HTMLOutput(viewport);
- htmlOutput = null;
+ new HTMLOutput(viewport);
}
protected void createPNG_actionPerformed(ActionEvent e)
Stack historyList = new Stack();
Stack redoList = new Stack();
+ private int treeCount = 0;
void updateEditMenuBar()
- {
- if(historyList.size()>0)
+ {
+ if(historyList.size()>0)
+ {
+ undoMenuItem.setEnabled(true);
+ HistoryItem hi = (HistoryItem)historyList.peek();
+ undoMenuItem.setText("Undo "+hi.getDescription());
+ }
+ else
{
- undoMenuItem.setEnabled(true);
- Object [] history = (Object[])historyList.get(0);
- undoMenuItem.setText("Undo "+history[0]);
+ undoMenuItem.setEnabled(false);
+ undoMenuItem.setText("Undo");
}
- else
- {
- undoMenuItem.setEnabled(false);
- undoMenuItem.setText("Undo");
- }
- if(redoList.size()>0)
+ if(redoList.size()>0)
+ {
+ redoMenuItem.setEnabled(true);
+ HistoryItem hi = (HistoryItem)redoList.peek();
+ redoMenuItem.setText("Redo "+hi.getDescription());
+ }
+ else
{
- redoMenuItem.setEnabled(true);
- Object [] history = (Object[])redoList.get(0);
- redoMenuItem.setText("Redo "+history[0]);
+ redoMenuItem.setEnabled(false);
+ redoMenuItem.setText("Redo");
}
- else
- {
- redoMenuItem.setEnabled(false);
- redoMenuItem.setText("Redo");
- }
- }
-
- public void addHistoryItem(String type)
- {
- // must make sure we add new sequence objects her, not refs to the existing sequences
- redoList.clear();
+ }
- SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()];
- for(int i=0; i<viewport.getAlignment().getHeight(); i++)
- {
- seq[i] = new Sequence( viewport.getAlignment().getSequenceAt(i).getName(),
- viewport.getAlignment().getSequenceAt(i).getSequence());
- }
+ public void addHistoryItem(HistoryItem hi)
+ {
+ historyList.push(hi);
+ updateEditMenuBar();
+ }
+ protected void undoMenuItem_actionPerformed(ActionEvent e)
+ {
+ HistoryItem hi = (HistoryItem)historyList.pop();
+ redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment, HistoryItem.HIDE));
+ restoreHistoryItem(hi);
+ }
- historyList.add(0, new Object[]{type, seq} );
- updateEditMenuBar();
- }
- protected void undoMenuItem_actionPerformed(ActionEvent e)
- {
- Object [] history = (Object[])historyList.remove(0);
- // add the redo state before continuing!!
- SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()];
- for (int i = 0; i < viewport.getAlignment().getHeight(); i++)
- {
- seq[i] = new Sequence(viewport.getAlignment().getSequenceAt(i).getName(),
- viewport.getAlignment().getSequenceAt(i).
- getSequence());
- }
- /////////
+ protected void redoMenuItem_actionPerformed(ActionEvent e)
+ {
+ HistoryItem hi = (HistoryItem)redoList.pop();
+ restoreHistoryItem(hi);
+ updateEditMenuBar();
+ viewport.updateConsensus();
+ alignPanel.repaint();
+ alignPanel.repaint();
+ }
- redoList.add(0, new Object[] {history[0], seq});
- seq = (SequenceI[]) history[1];
- AlignmentAnnotation [] old = viewport.alignment.getAlignmentAnnotation();
- viewport.setAlignment( new Alignment(seq) );
- viewport.alignment.setGapCharacter( Preferences.gapSymbol );
+ // used by undo and redo
+ void restoreHistoryItem(HistoryItem hi)
+ {
+ if(hi.getType()== HistoryItem.SORT)
+ {
+ for(int i=0; i<hi.getSequences().size(); i++)
+ viewport.alignment.getSequences().setElementAt(hi.getSequences().elementAt(i), i);
+ }
+ else
+ {
+ for (int i = 0; i < hi.getSequences().size(); i++)
+ {
+ SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);
+ if(restore.getLength()==0)
+ {
+ restore.setSequence(hi.getHidden().elementAt(i).toString());
+ viewport.alignment.getSequences().insertElementAt(
+ restore,
+ hi.getAlignIndex(i));
+ }
+ else
+ restore.setSequence(hi.getHidden().elementAt(i).toString());
+ }
+ if(hi.getType()==HistoryItem.PASTE)
+ {
+ for(int i=viewport.alignment.getHeight()-1;i>hi.getSequences().size()-1; i--)
+ viewport.alignment.deleteSequence(i);
+ }
+ }
updateEditMenuBar();
- for(int i=0; i<old.length; i++)
- viewport.alignment.addAnnotation(old[i]);
+
viewport.updateConsensus();
viewport.updateConservation();
alignPanel.repaint();
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
}
public void moveSelectedSequences(boolean up)
protected void pasteThis_actionPerformed(ActionEvent e)
{
- addHistoryItem("Paste");
+ addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment, HistoryItem.PASTE));
paste(false);
}
}
else
{
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
viewport.setEndSeq(viewport.alignment.getHeight());
viewport.alignment.getWidth();
viewport.updateConservation();
protected void delete_actionPerformed(ActionEvent e)
{
- addHistoryItem("Delete");
+ boolean seqsdeleted=false;
+
if (viewport.getSelectionGroup() == null)
return;
+ addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment, HistoryItem.HIDE));
+
SequenceGroup sg = viewport.getSelectionGroup();
for (int i=0;i < sg.sequences.size(); i++)
{
SequenceI seq = sg.getSequenceAt(i);
int index = viewport.getAlignment().findIndex(seq);
- seq.deleteChars(sg.getStartRes(), sg.getEndRes()+1);
+ seq.deleteChars(sg.getStartRes(),sg.getEndRes()+1);
- if(seq.getSequence().length()<1)
- viewport.getAlignment().deleteSequence(seq);
- else
- viewport.getAlignment().getSequences().setElementAt(seq, index);
+ if(seq.getSequence().length()<1) {
+ seqsdeleted=true;
+ viewport.getAlignment().deleteSequence(seq);
+ } else {
+ viewport.getAlignment().getSequences().setElementAt(seq, index);
+ }
}
viewport.setSelectionGroup(null);
viewport.alignment.deleteGroup(sg);
+ if (seqsdeleted)
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
viewport.resetSeqLimits( alignPanel.seqPanel.seqCanvas.getHeight());
if(viewport.getAlignment().getHeight()<1)
try
}catch(Exception ex){}
viewport.updateConservation();
viewport.updateConsensus();
- alignPanel.repaint();
-
- }
-
-
-
- protected void redoMenuItem_actionPerformed(ActionEvent e)
- {
- Object [] history = (Object[])redoList.remove(0);
- SequenceI[] seq = (SequenceI[]) history[1];
- viewport.setAlignment( new Alignment(seq) );
- viewport.alignment.setGapCharacter( Preferences.gapSymbol );
- updateEditMenuBar();
- viewport.updateConsensus();
- alignPanel.repaint();
- alignPanel.repaint();
- }
+ alignPanel.repaint();
+ }
protected void deleteGroups_actionPerformed(ActionEvent e)
public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
{
- addHistoryItem("delete columns");
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);
public void remove2RightMenuItem_actionPerformed(ActionEvent e)
{
- addHistoryItem("delete columns");
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)
public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
{
- addHistoryItem("delete gapped columns");
+ addHistoryItem(new HistoryItem("Remove Gapped Columns",
+ viewport.alignment,
+ HistoryItem.HIDE));
+
viewport.getAlignment().removeGaps();
viewport.updateConservation();
viewport.updateConsensus();
public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
{
- addHistoryItem("delete all gaps");
+ addHistoryItem(new HistoryItem("Remove Gaps",
+ viewport.alignment,
+ HistoryItem.HIDE));
SequenceI current;
int jSize;
for (int i=0; i < viewport.getAlignment().getSequences().size();i++)
}
+ public void padGapsMenuitem_actionPerformed(ActionEvent e)
+ {
+ addHistoryItem(new HistoryItem("Pad Gaps",
+ viewport.alignment,
+ HistoryItem.HIDE));
+ SequenceI current;
+ int Width = viewport.getAlignment().getWidth()-1;
+ for (int i=0; i < viewport.getAlignment().getSequences().size();i++)
+ {
+ current = viewport.getAlignment().getSequenceAt(i);
+
+ if (current.getLength()<Width)
+ current.insertCharAt(Width, viewport.getGapCharacter());
+ }
+ viewport.updateConservation();
+ viewport.updateConsensus();
+ alignPanel.repaint();
+ }
+
+
public void findMenuItem_actionPerformed(ActionEvent e)
{
JInternalFrame frame = new JInternalFrame();
public void clustalColour_actionPerformed(ActionEvent e)
{
- abovePIDThreshold.setSelected(false);
changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(), viewport.alignment.getWidth()));
}
ccs.setConsensus( viewport.vconsensus );
viewport.setGlobalColourScheme(ccs);
- SliderPanel.setConservationSlider(alignPanel, ccs, "Background");
+ ccs.inc = SliderPanel.setConservationSlider(alignPanel, ccs, "Background");
}
else
{
SequenceGroup sg = (SequenceGroup)groups.elementAt(i);
- if (cs instanceof ClustalxColourScheme)
- {
+ if(cs==null)
+ sg.cs = null;
+ else if (cs instanceof ClustalxColourScheme)
sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
- }
- else if(cs!=null)
- {
+ else if (cs instanceof UserColourScheme)
+ sg.cs = new UserColourScheme( ((UserColourScheme)cs).getColours());
+ else
try{
sg.cs = (ColourSchemeI) cs.getClass().newInstance();
- }catch(Exception ex){ex.printStackTrace();}
- }
+ }catch(Exception ex){}
if(viewport.getAbovePIDThreshold())
{
public void userDefinedColour_actionPerformed(ActionEvent e)
{
- UserDefinedColours chooser = new UserDefinedColours( alignPanel, null);
+ new UserDefinedColours( alignPanel, null);
}
public void PIDColour_actionPerformed(ActionEvent e)
public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
{
- addHistoryItem("sort");
+ addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment, HistoryItem.SORT));
AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));
alignPanel.repaint();
}
public void sortIDMenuItem_actionPerformed(ActionEvent e)
{
- addHistoryItem("sort");
+ addHistoryItem(new HistoryItem("ID Sort", viewport.alignment, HistoryItem.SORT));
AlignmentSorter.sortByID( viewport.getAlignment() );
alignPanel.repaint();
}
public void sortGroupMenuItem_actionPerformed(ActionEvent e)
{
- addHistoryItem("sort");
+ addHistoryItem(new HistoryItem("Group Sort", viewport.alignment, HistoryItem.SORT));
AlignmentSorter.sortByGroup(viewport.getAlignment());
AlignmentSorter.sortGroups(viewport.getAlignment());
alignPanel.repaint();
public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
{
- RedundancyPanel sp = new RedundancyPanel(alignPanel);
+ RedundancyPanel sp = new RedundancyPanel(alignPanel,this);
JInternalFrame frame = new JInternalFrame();
frame.setContentPane(sp);
Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400, 100, false);
public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
{
- if(viewport.getSelectionGroup().getSize()<2)
+ if((viewport.getSelectionGroup()==null) ||
+ viewport.getSelectionGroup().getSize()<2)
JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);
else
{
protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
{
- NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");
+ NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
}
void NewTreePanel(String type, String pwType, String title)
{
- //are the sequences aligned?
- if(!viewport.alignment.isAligned())
- {
- JOptionPane.showMessageDialog(Desktop.desktop, "The sequences must be aligned before creating a tree.",
- "Sequences not aligned", JOptionPane.WARNING_MESSAGE);
- return;
- }
-
+ String ltitle;
final 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,
- 0, viewport.alignment.getWidth());
+ sg.getStartRes(), sg.getEndRes());
}
else
{
- tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),
- type, pwType, 0, viewport.alignment.getWidth());
- }
+
+ //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);
+ viewport.setCurrentTree(tp.getTree());
- Desktop.addInternalFrame(tp, title, 600, 500);
+ Desktop.addInternalFrame(tp, title+" from "+this.title, 600, 500);
}
public void addSortByOrderMenuItem(String title, final AlignmentOrder order) {
- final JMenuItem item = new JMenuItem(title);
- sortByTreeMenu.add(item);
+ final JMenuItem item = new JMenuItem("by "+title);
+ sort.add(item);
item.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e)
{
- addHistoryItem("sort");
+ 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();
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("sort");
+ addHistoryItem(new HistoryItem("Tree Sort", viewport.alignment,
+ HistoryItem.SORT));
AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());
alignPanel.repaint();
}
{
public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)
{
+ treeCount--;
sortByTreeMenu.remove(item);
+ if (treeCount==0)
+ sort.remove(sortByTreeMenu);
};
});
+ viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent evt)
+ {
+ if (evt.getPropertyName().equals("alignment")) {
+ treePanel.getTree().UpdatePlaceHolders( (Vector) evt.getNewValue());
+ treePanel.repaint();
+ }
+ }
+ }
+ );
}
}
if (msa!=null) {
+ jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS", title, msa, false, true);
+ }
+ }
+ public void ClustalRealign_actionPerformed(ActionEvent e)
+ {
+ // TODO:resolve which menu item was actually selected
+ // 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);
+ }
+
+ }
+
+ }
+ if (msa!=null) {
jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS", title, msa, true, true);
}
}
+
protected void jpred_actionPerformed(ActionEvent e)
{
+ SequenceI seq=null;
+ SequenceI[] msa=null;
if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>0)
{
SequenceGroup seqs = viewport.getSelectionGroup();
if (seqs.getSize() == 1 || !viewport.alignment.isAligned())
{
- JPredClient ct = new JPredClient( (SequenceI)seqs.getSequenceAt(0));
+ seq = (SequenceI)seqs.getSequenceAt(0);
}
else
{
int sz;
- SequenceI[] msa = new SequenceI[sz=seqs.getSize()];
+ msa = new SequenceI[sz=seqs.getSize()];
for (int i = 0; i < sz; i++)
{
msa[i] = (SequenceI) seqs.getSequenceAt(i);
}
-
- JPredClient ct = new JPredClient(msa);
}
-
}
else
{
if (seqs.size() == 1 || !viewport.alignment.isAligned())
{
- JPredClient ct = new JPredClient( (SequenceI)
- seqs.elementAt(0));
+ seq = (SequenceI) seqs.elementAt(0);
}
else
{
- SequenceI[] msa = new SequenceI[seqs.size()];
+ msa = new SequenceI[seqs.size()];
for (int i = 0; i < seqs.size(); i++)
{
msa[i] = (SequenceI) seqs.elementAt(i);
}
-
- JPredClient ct = new JPredClient(msa);
}
-
+ }
+ if (msa!=null) {
+ JPredClient ct = new JPredClient(title, msa);
+ } else
+ if (seq!=null) {
+ JPredClient ct = new JPredClient(title, seq);
+ } else {
+ System.err.print("JALVIEW ERROR! - Unexpected JPred selection state!\n");
}
}
protected void msaAlignMenuItem_actionPerformed(ActionEvent e)
}
if (msa!=null) {
- MsaWSClient ct = new jalview.ws.MsaWSClient("MuscleWS",title, msa, true, true);
+ MsaWSClient ct = new jalview.ws.MsaWSClient("MuscleWS",title, msa, false, true);
}
}
protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) {
}catch(Exception ex){ex.printStackTrace();}
}
-
}