JAL-468 JAL-936 sort alignment by tree and autosort for new tree
[jalview.git] / src / jalview / gui / TreePanel.java
index ea0b791..3b7cb14 100755 (executable)
@@ -29,6 +29,7 @@ import javax.swing.*;
 
 import org.jibble.epsgraphics.*;
 import jalview.analysis.*;
+import jalview.commands.CommandI;
 import jalview.commands.OrderCommand;
 import jalview.datamodel.*;
 import jalview.io.*;
@@ -508,17 +509,72 @@ public class TreePanel extends GTreePanel
    */
   public void sortByTree_actionPerformed(ActionEvent e)
   {
-    AlignmentPanel ap = av.getAlignPanel();
-    SequenceI[] oldOrder = av.getAlignment().getSequencesArray();
-    AlignmentSorter.sortByTree(av.getAlignment(), tree);
-
-    ap.alignFrame.addHistoryItem(new OrderCommand("Tree Sort", oldOrder,
-            av.alignment));
+    
+    if (treeCanvas.applyToAllViews)
+    {
+      final ArrayList<CommandI> commands = new ArrayList<CommandI>();
+      for (AlignmentPanel ap: PaintRefresher.getAssociatedPanels(av
+              .getSequenceSetId()))
+      {
+        commands.add(sortAlignmentIn(ap.av.getAlignPanel()));
+      }
+      av.getAlignPanel().alignFrame.addHistoryItem(new CommandI()
+      {
+        
+        @Override
+        public void undoCommand(AlignmentI[] views)
+        {
+          for (CommandI tsort:commands)
+          {
+            tsort.undoCommand(views);
+          }          
+        }
+        
+        @Override
+        public int getSize()
+        {
+          return commands.size();
+        }
+        
+        @Override
+        public String getDescription()
+        {
+          return "Tree Sort (many views)";
+        }
+        
+        @Override
+        public void doCommand(AlignmentI[] views)
+        {
 
-    ap.paintAlignment(true);
+          for (CommandI tsort:commands)
+          {
+            tsort.doCommand(views);
+          }          
+        }
+      });
+      for (AlignmentPanel ap: PaintRefresher.getAssociatedPanels(av
+              .getSequenceSetId()))
+      {
+        // ensure all the alignFrames refresh their GI after adding an undo item
+        ap.alignFrame.updateEditMenuBar();
+      }
+    } else {
+      treeCanvas.ap.alignFrame.addHistoryItem(sortAlignmentIn(treeCanvas.ap));
+    }
 
   }
+  public CommandI sortAlignmentIn(AlignmentPanel ap)
+  {
+    AlignViewport av = ap.av;
+    SequenceI[] oldOrder = av.getAlignment().getSequencesArray();
+    AlignmentSorter.sortByTree(av.getAlignment(), tree);
+    CommandI undo;
+    undo=new OrderCommand("Tree Sort", oldOrder,
+          av.alignment);
 
+    ap.paintAlignment(true);    
+    return undo;
+  }
   /**
    * DOCUMENT ME!
    *