tidied up system.out messages and moved many to stderr.
[jalview.git] / src / jalview / gui / AlignFrame.java
index b60ee62..de2d8ef 100755 (executable)
 
 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
 {
@@ -76,14 +78,14 @@ 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 choice = chooser.getSelectedFile().getPath();
-        Jalview2XML.SaveState(this, System.currentTimeMillis(), shortName,
-                              choice);
+        Jalview2XML.SaveState(this, choice, shortName);
         // USE Jalview2XML to save this file
         return;
       }
@@ -169,73 +171,92 @@ public class AlignFrame extends GAlignFrame
 
   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);
+        }
+      }
+      viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
       updateEditMenuBar();
-      for(int i=0; i<old.length; i++)
-        viewport.alignment.addAnnotation(old[i]);
+
       viewport.updateConsensus();
       viewport.updateConservation();
       alignPanel.repaint();
@@ -335,7 +356,7 @@ public class AlignFrame extends GAlignFrame
 
   protected void pasteThis_actionPerformed(ActionEvent e)
   {
-    addHistoryItem("Paste");
+    addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment, HistoryItem.PASTE));
     paste(false);
   }
 
@@ -378,6 +399,7 @@ public class AlignFrame extends GAlignFrame
       }
       else
       {
+        viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
         viewport.setEndSeq(viewport.alignment.getHeight());
         viewport.alignment.getWidth();
         viewport.updateConservation();
@@ -398,7 +420,9 @@ public class AlignFrame extends GAlignFrame
 
   protected void delete_actionPerformed(ActionEvent e)
   {
-    addHistoryItem("Delete");
+    boolean seqsdeleted=false;
+    addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment, HistoryItem.HIDE));
+
     if (viewport.getSelectionGroup() == null)
       return;
 
@@ -407,16 +431,20 @@ public class AlignFrame extends GAlignFrame
      {
        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
@@ -425,23 +453,8 @@ public class AlignFrame extends GAlignFrame
      }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)
@@ -482,10 +495,11 @@ public class AlignFrame extends GAlignFrame
 
   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);
@@ -507,10 +521,12 @@ public class AlignFrame extends GAlignFrame
 
   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)
@@ -533,7 +549,10 @@ public class AlignFrame extends GAlignFrame
 
   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();
@@ -542,7 +561,9 @@ public class AlignFrame extends GAlignFrame
 
   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++)
@@ -563,6 +584,26 @@ public class AlignFrame extends GAlignFrame
   }
 
 
+  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();
@@ -936,21 +977,21 @@ public class AlignFrame extends GAlignFrame
 
   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();
@@ -1030,7 +1071,8 @@ public class AlignFrame extends GAlignFrame
     //are the sequences aligned?
     if(!viewport.alignment.isAligned())
     {
-      JOptionPane.showMessageDialog(Desktop.desktop, "The sequences must be aligned before creating a tree.",
+      JOptionPane.showMessageDialog(Desktop.desktop, "The sequences must be aligned before creating a tree.\n"
+                                   +"Try using the Pad function in the edit menu.",
                                     "Sequences not aligned", JOptionPane.WARNING_MESSAGE);
       return;
     }
@@ -1055,13 +1097,14 @@ public class AlignFrame extends GAlignFrame
   }
 
   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();
@@ -1072,12 +1115,19 @@ public class AlignFrame extends GAlignFrame
   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();
       }
@@ -1087,10 +1137,23 @@ public class AlignFrame extends GAlignFrame
     {
       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();
+        }
+      }
 
+    }
+    );
   }
 
 
@@ -1132,6 +1195,8 @@ public class AlignFrame extends GAlignFrame
 
   protected void jpred_actionPerformed(ActionEvent e)
 {
+    SequenceI seq=null;
+    SequenceI[] msa=null;
 
     if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>0)
     {
@@ -1139,20 +1204,17 @@ public class AlignFrame extends GAlignFrame
       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
     {
@@ -1160,20 +1222,24 @@ public class AlignFrame extends GAlignFrame
 
       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)
@@ -1256,5 +1322,4 @@ public class AlignFrame extends GAlignFrame
      }catch(Exception ex){ex.printStackTrace();}
   }
 
-
 }