HistoryItem replaced by CommandI
authoramwaterhouse <Andrew Waterhouse>
Tue, 24 Oct 2006 11:24:39 +0000 (11:24 +0000)
committeramwaterhouse <Andrew Waterhouse>
Tue, 24 Oct 2006 11:24:39 +0000 (11:24 +0000)
src/jalview/gui/AlignFrame.java

index 73872d0..260085d 100755 (executable)
@@ -34,9 +34,9 @@ import jalview.io.*;
 import jalview.jbgui.*;
 import jalview.schemes.*;
 import jalview.util.ShiftList;
+import jalview.commands.*;
 import jalview.ws.*;
 import java.awt.dnd.*;
-import org.biojava.dasobert.eventmodel.*;
 
 /**
  * DOCUMENT ME!
@@ -824,12 +824,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
    */
   void updateEditMenuBar()
   {
-  /*  if (historyList.size() > 0)
+    if (historyList.size() > 0)
     {
       undoMenuItem.setEnabled(true);
 
-      HistoryItem hi = (HistoryItem) historyList.peek();
-      undoMenuItem.setText("Undo " + hi.getDescription());
+      CommandI command = (CommandI) historyList.peek();
+      undoMenuItem.setText("Undo " + command.getDescription());
     }
     else
     {
@@ -841,28 +841,26 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
     {
       redoMenuItem.setEnabled(true);
 
-      HistoryItem hi = (HistoryItem) redoList.peek();
-      redoMenuItem.setText("Redo " + hi.getDescription());
+      CommandI command = (CommandI) redoList.peek();
+      redoMenuItem.setText("Redo " + command.getDescription());
     }
     else
     {
       redoMenuItem.setEnabled(false);
       redoMenuItem.setText("Redo");
-    }*/
+    }
   }
 
-  /**
-   * DOCUMENT ME!
-   *
-   * @param hi DOCUMENT ME!
-   */
-  public void addHistoryItem(HistoryItem hi)
+
+  public void addHistoryItem(CommandI command)
   {
-    historyList.push(hi);
+    historyList.push(command);
     redoList.clear();
     updateEditMenuBar();
   }
 
+
+
   /**
    * DOCUMENT ME!
    *
@@ -870,12 +868,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
    */
   protected void undoMenuItem_actionPerformed(ActionEvent e)
   {
-    HistoryItem nh,hi = (HistoryItem) historyList.pop();
-    redoList.push(nh=new HistoryItem(hi.getDescription(), viewport.alignment,
-                                  HistoryItem.HIDE));
-    if (hi.alColumnChanges!=null)
-      nh.alColumnChanges = hi.alColumnChanges.getInverse();
-    restoreHistoryItem(hi);
+    CommandI command = (CommandI)historyList.pop();
+    redoList.push(command);
+    command.undoCommand();
+
+   // HistoryItem nh,hi = (HistoryItem) historyList.pop();
+   // redoList.push(nh=new HistoryItem(hi.getDescription(), viewport.alignment,
+   //                               HistoryItem.HIDE));
+   // if (hi.alColumnChanges!=null)
+   //   nh.alColumnChanges = hi.alColumnChanges.getInverse();
+   // restoreHistoryItem(hi);
+   updateEditMenuBar();
     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
   }
 
@@ -886,27 +889,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
    */
   protected void redoMenuItem_actionPerformed(ActionEvent e)
   {
-    HistoryItem nh,hi = (HistoryItem) redoList.pop();
-    historyList.push(nh=new HistoryItem(hi.getDescription(), viewport.alignment,
-        HistoryItem.HIDE));
-    if (hi.alColumnChanges!=null)
-      nh.alColumnChanges=hi.alColumnChanges.getInverse();
-    restoreHistoryItem(hi);
+    CommandI command = (CommandI) redoList.pop();
+    historyList.push(command);
+    command.doCommand();
+
+   // HistoryItem nh,hi = (HistoryItem) redoList.pop();
+  //  historyList.push(nh=new HistoryItem(hi.getDescription(), viewport.alignment,
+  //      HistoryItem.HIDE));
+  //  if (hi.alColumnChanges!=null)
+  //    nh.alColumnChanges=hi.alColumnChanges.getInverse();
+  //  restoreHistoryItem(hi);
     updateEditMenuBar();
     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
   }
 
-  // used by undo and redo
-  void restoreHistoryItem(HistoryItem hi)
-  {
-
-    hi.restore(viewport.getColumnSelection());
-
-    updateEditMenuBar();
-
-    viewport.firePropertyChange("alignment", null,
-                                viewport.getAlignment().getSequences());
-  }
 
   /**
    * DOCUMENT ME!
@@ -1069,8 +1065,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
    */
   protected void pasteThis_actionPerformed(ActionEvent e)
   {
-    addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
-                                   HistoryItem.PASTE));
     paste(false);
   }
 
@@ -1150,19 +1144,33 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
         alignment = viewport.getAlignment();
 
         //!newAlignment
+        SequenceI [] newseqs = new SequenceI[sequences.length];
         for (int i = 0; i < sequences.length; i++)
         {
-          Sequence newseq = new Sequence(sequences[i].getName(),
+          newseqs[i] = new Sequence(sequences[i].getName(),
               sequences[i].getSequence(), sequences[i].getStart(),
               sequences[i].getEnd());
 
-          alignment.addSequence(newseq);
+          alignment.addSequence(newseqs[i]);
           PaintRefresher.Refresh(alignPanel,
                                  alignPanel.av.getSequenceSetId(),
-                                 null,newseq);
+                                 null,newseqs[i]);
         }
 
 
+        /*
+         //ADD HISTORY ITEM
+         */
+        addHistoryItem(new EditCommand(
+            "Add sequences",
+            EditCommand.PASTE,
+            newseqs,
+            0,
+            alignment.getWidth(),
+            alignment)
+            );
+
+
         viewport.setEndSeq(alignment.getHeight());
         alignment.getWidth();
         viewport.firePropertyChange("alignment", null, alignment.getSequences());
@@ -1265,37 +1273,48 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
   protected void delete_actionPerformed(ActionEvent e)
   {
 
-    if (viewport.getSelectionGroup() == null)
+    SequenceGroup sg = viewport.getSelectionGroup();
+    if (sg == null)
     {
       return;
     }
 
+    Vector seqs = new Vector();
+    int cutLength = sg.getEndRes()-sg.getStartRes()+1;
+    SequenceI seq;
+    for (int i = 0; i < sg.getSize(false); i++)
+    {
+      seq = sg.getSequenceAt(i);
+      seqs.addElement(seq);
+      if(seq.getLength()<=cutLength)
+        PaintRefresher.Refresh(alignPanel,
+                       alignPanel.av.getSequenceSetId(),
+                       seq,
+                       null);
+    }
 
-    SequenceGroup sg = viewport.getSelectionGroup();
-
-
-    addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
-                                   HistoryItem.HIDE));
+   // If the cut affects all sequences, remove highlighted columns
+   if (sg.getSize(false) == viewport.alignment.getHeight())
+   {
+     viewport.getColumnSelection().removeElements(sg.getStartRes(),
+         sg.getEndRes() + 1);
+   }
 
 
-    for (int i = 0; i < sg.getSize(false); i++)
-    {
-      SequenceI seq = sg.getSequenceAt(i);
-      seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
+    SequenceI [] cut = new SequenceI[seqs.size()];
+    for(int i=0; i<seqs.size(); i++)
+      cut[i] = (SequenceI)seqs.elementAt(i);
 
-      // 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);
-        PaintRefresher.Refresh(alignPanel,alignPanel.av.getSequenceSetId(),seq,null);
-      }
-    }
+    /*
+    //ADD HISTORY ITEM
+    */
+    addHistoryItem(new EditCommand("Cut Sequences",
+                                      EditCommand.CUT,
+                                      cut,
+                                      sg.getStartRes(),
+                                      sg.getEndRes()-sg.getStartRes()+1,
+                                      viewport.alignment));
 
     viewport.setSelectionGroup(null);
     viewport.alignment.deleteGroup(sg);
@@ -1303,8 +1322,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
     viewport.firePropertyChange("alignment", null,
                                   viewport.getAlignment().getSequences());
 
-
-
     if (viewport.getAlignment().getHeight() < 1)
     {
       try
@@ -1411,37 +1428,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
    */
   public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
   {
-    ColumnSelection colSel = viewport.getColumnSelection();
-
-    if (colSel.size() > 0)
-    {
-      HistoryItem edit;
-      addHistoryItem(edit=new HistoryItem("Remove Left", viewport.alignment,
-                                     HistoryItem.HIDE));
-
-      int min = colSel.getMin();
-      viewport.getAlignment().trimLeft(min);
-      colSel.compensateForEdit(0, min);
-      edit.addShift(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());
-    }
+    trimAlignment(true);
   }
 
   /**
@@ -1451,21 +1438,64 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
    */
   public void remove2RightMenuItem_actionPerformed(ActionEvent e)
   {
+      trimAlignment(false);
+  }
+
+  void trimAlignment(boolean trimLeft)
+  {
     ColumnSelection colSel = viewport.getColumnSelection();
+    int column;
 
     if (colSel.size() > 0)
     {
-      addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
-                                     HistoryItem.HIDE));
+      if(trimLeft)
+        column = colSel.getMin();
+      else
+        column = colSel.getMax();
 
-      int max = colSel.getMax();
-      viewport.getAlignment().trimRight(max);
-      // TODO: delete hidden column entries in colSel to right of max
-      // TODO: record hidden columns in history for undo.
-      if (viewport.getSelectionGroup() != null)
+      SequenceI [] seqs;
+      if(viewport.getSelectionGroup()!=null)
+        seqs = viewport.getSelectionGroup().getSequencesAsArray(true);
+      else
+        seqs = viewport.alignment.getSequencesArray();
+
+
+      TrimRegionCommand trimRegion;
+
+      if(trimLeft)
       {
-        viewport.getSelectionGroup().adjustForRemoveRight(max);
+        trimRegion = new TrimRegionCommand("Remove Left",
+                                    TrimRegionCommand.TRIM_LEFT,
+                                    seqs,
+                                    column,
+                                    viewport.alignment,
+                                    viewport.colSel);
+
+        colSel.compensateForEdit(0, column);
+
+        //AW edit.addShift(0,min);
+        if (viewport.getSelectionGroup() != null)
+        {
+          viewport.getSelectionGroup().adjustForRemoveLeft(column);
+        }
       }
+     else
+     {
+       trimRegion = new TrimRegionCommand("Remove Left",
+                                   TrimRegionCommand.TRIM_RIGHT,
+                                   seqs,
+                                   column,
+                                   viewport.alignment,
+                                   viewport.colSel);
+       // TODO: delete hidden column entries in colSel to right of max
+       // TODO: record hidden columns in history for undo.
+       if (viewport.getSelectionGroup() != null)
+       {
+         viewport.getSelectionGroup().adjustForRemoveRight(column);
+       }
+     }
+
+      addHistoryItem(trimRegion);
 
       Vector groups = viewport.alignment.getGroups();
 
@@ -1473,7 +1503,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
       {
         SequenceGroup sg = (SequenceGroup) groups.get(i);
 
-        if (!sg.adjustForRemoveRight(max))
+        if ( (trimLeft && !sg.adjustForRemoveLeft(column))
+            || (!trimLeft && !sg.adjustForRemoveRight(column)))
         {
           viewport.alignment.deleteGroup(sg);
         }
@@ -1490,20 +1521,34 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
    */
   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
   {
-    HistoryItem edit;
-    addHistoryItem(edit=new HistoryItem("Remove Gapped Columns",
-                                   viewport.alignment, HistoryItem.HIDE));
+    int start = 0, end = viewport.alignment.getWidth();
+
+    SequenceI[] seqs;
+    if (viewport.getSelectionGroup() != null)
+    {
+      seqs = viewport.getSelectionGroup().getSequencesAsArray(true);
+      start = viewport.getSelectionGroup().getStartRes();
+      end = viewport.getSelectionGroup().getEndRes();
+    }
+    else
+      seqs = viewport.alignment.getSequencesArray();
+
+
+    addHistoryItem(new RemoveGapColCommand("Remove Gapped Columns",
+                                           seqs,
+                                           start, end,
+                   viewport.getGapCharacter()));
 
     //This is to maintain viewport position on first residue
     //of first sequence
     SequenceI seq = viewport.alignment.getSequenceAt(0);
     int startRes = seq.findPosition(viewport.startRes);
-    ShiftList shifts;
-    viewport.getAlignment().removeGaps(shifts=new ShiftList());
-    edit.alColumnChanges=shifts.getInverse();
-    if (viewport.hasHiddenColumns)
-      viewport.getColumnSelection().compensateForEdits(shifts);
-    viewport.setStartRes(seq.findIndex(startRes)-1);
+   // ShiftList shifts;
+   // viewport.getAlignment().removeGaps(shifts=new ShiftList());
+   // edit.alColumnChanges=shifts.getInverse();
+   // if (viewport.hasHiddenColumns)
+   //   viewport.getColumnSelection().compensateForEdits(shifts);
+   viewport.setStartRes(seq.findIndex(startRes)-1);
    viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
 
   }
@@ -1515,71 +1560,27 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
    */
   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
   {
-    // TODO: hidden regions should not be touched by removeAllGaps - a minimal number of gaps will remain in alignment segments containing uneven length subsequences
-    // TODO: columnSelection.compensateforedits should be called (and passed to history item)
-    addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
-                                   HistoryItem.HIDE));
+    int start = 0, end = viewport.alignment.getWidth();
+
+    SequenceI[] seqs;
+    if (viewport.getSelectionGroup() != null)
+    {
+      seqs = viewport.getSelectionGroup().getSequencesAsArray(true);
+      start = viewport.getSelectionGroup().getStartRes();
+      end = viewport.getSelectionGroup().getEndRes();
+    }
+    else
+      seqs = viewport.alignment.getSequencesArray();
 
     //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;
-
-    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();
-    }
-    /* Commented out regions below are partial implementation of todo above.
-       * divide start,end into visible chunks, and for each:
-      int diff=end-start+1;
-      int diffmax=0;
-      int dr[] = new int[seqs.size()];
-      */
-     for (int i = 0; i < seqs.size(); i++)
-     {
-       current = (SequenceI) seqs.elementAt(i);
-       //dr[i]=
-       current.removeGaps(start, end);
-       /*if (d<diff) // can only shift
-         diff=d;
-       if (diffmax<d)
-         diffmax=d;
-         */
-     }
-     /* // after the end of each chunk -
-      * if (diff>0) {
-      // record shift for history.
-       editgaps.addShift(start, diff);
-       if (viewport.hasHiddenColumns && diffmax>diff) {
-       // pad sequence
-        StringBuffer gaps=new StringBuffer(diffmax);
-        for (int i=0,j=diffmax-diff; i<j; i++)
-        gaps.append(viewport.getGapCharacter());
-        for (int i=0, j=seqs.size(); i<j; i++) {
-        current = (SequenceI) seqs.elementAt(i);
-        if (dr[i]-diff>0) {
-        String sq = current.getSequence();
-        current.setSequence(sq.substring(0, hcend-dr[i])+gaps.substring(0, dr[i]-diff)+sq.substring());
-        }
-        }
-       }
-       }*/
+    addHistoryItem(new RemoveGapsCommand("Remove Gaps",
+                                           seqs,
+                                           start, end,
+                     viewport.getGapCharacter()));
 
     viewport.setStartRes(seq.findIndex(startRes)-1);
 
@@ -1597,7 +1598,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
      ap = (AlignmentPanel) alignPanels.elementAt(i);
      av = ap.av;
 
-   if (av.padGaps)
+     if (av.padGaps)
        av.getAlignment().padGaps();
 
      if (av.hconsensus != null && av.autoCalculateConsensus)
@@ -1665,8 +1666,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
    */
   public void padGapsMenuitem_actionPerformed(ActionEvent e)
   {
-    addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
-                                   HistoryItem.HIDE));
+  //  addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
+   //                                HistoryItem.HIDE));
 
     viewport.padGaps = padGapsMenuitem.isSelected();
 
@@ -2332,10 +2333,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
    */
   public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
   {
-    addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
-                                   HistoryItem.SORT));
+    SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
     AlignmentSorter.sortByPID(viewport.getAlignment(),
                               viewport.getAlignment().getSequenceAt(0));
+    addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder, viewport.alignment));
     alignPanel.repaint();
   }
 
@@ -2346,9 +2347,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
    */
   public void sortIDMenuItem_actionPerformed(ActionEvent e)
   {
-    addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
-                                   HistoryItem.SORT));
+    SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
     AlignmentSorter.sortByID(viewport.getAlignment());
+    addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment));
     alignPanel.repaint();
   }
 
@@ -2359,10 +2360,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
    */
   public void sortGroupMenuItem_actionPerformed(ActionEvent e)
   {
-    addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
-                                   HistoryItem.SORT));
-
+    SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
     AlignmentSorter.sortByGroup(viewport.getAlignment());
+    addHistoryItem(new OrderCommand("Group Sort", oldOrder, viewport.alignment));
+
     alignPanel.repaint();
   }
 
@@ -2560,11 +2561,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
     {
       public void actionPerformed(ActionEvent e)
       {
-        addHistoryItem(new HistoryItem("Sort", viewport.alignment,
-                                       HistoryItem.SORT));
+        SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
 
         // TODO: JBPNote - have to map order entries to curent SequenceI pointers
         AlignmentSorter.sortBy(viewport.getAlignment(), order);
+
+        addHistoryItem(new OrderCommand(order.getName(), oldOrder, viewport.alignment));
+
         alignPanel.repaint();
       }
     });
@@ -2595,10 +2598,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener
     {
       public void actionPerformed(ActionEvent e)
       {
-        addHistoryItem(new HistoryItem("Tree Sort",
-                                       viewport.alignment, HistoryItem.SORT));
+        SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
         AlignmentSorter.sortByTree(viewport.getAlignment(),
                                    treePanel.getTree());
+
+        addHistoryItem(new OrderCommand("Tree Sort", oldOrder, viewport.alignment));
+
+
         alignPanel.repaint();
       }
     });