JAL-1031 JAL-1032 if selection is non-null but empty, then calculate PCA or tree...
[jalview.git] / src / jalview / gui / TreePanel.java
index cc63ee4..60557ca 100755 (executable)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5)
- * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
+ * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
  * 
  * This file is part of Jalview.
  * 
@@ -20,6 +20,8 @@ package jalview.gui;
 import java.beans.*;
 import java.io.*;
 import java.util.*;
+import java.util.List;
+
 import javax.imageio.*;
 
 import java.awt.*;
@@ -29,6 +31,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.*;
@@ -151,7 +154,7 @@ public class TreePanel extends GTreePanel
                     .println("new alignment sequences vector value is null");
           }
 
-          tree.UpdatePlaceHolders((Vector) evt.getNewValue());
+          tree.UpdatePlaceHolders((List<SequenceI>) evt.getNewValue());
           treeCanvas.nameHash.clear(); // reset the mapping between canvas
           // rectangles and leafnodes
           repaint();
@@ -254,11 +257,11 @@ public class TreePanel extends GTreePanel
       {
         if (odata == null)
         {
-          tree = new NJTree(av.alignment.getSequencesArray(), newtree);
+          tree = new NJTree(av.getAlignment().getSequencesArray(), newtree);
         }
         else
         {
-          tree = new NJTree(av.alignment.getSequencesArray(), odata,
+          tree = new NJTree(av.getAlignment().getSequencesArray(), odata,
                   newtree);
         }
         if (!tree.hasOriginalSequenceData())
@@ -270,19 +273,21 @@ public class TreePanel extends GTreePanel
       {
         int start, end;
         SequenceI[] seqs;
-        AlignmentView seqStrings = av.getAlignmentView(av
-                .getSelectionGroup() != null);
-        if (av.getSelectionGroup() == null)
+        boolean selview=av
+                .getSelectionGroup() != null & av
+                .getSelectionGroup().getSize()>1;
+        AlignmentView seqStrings = av.getAlignmentView(selview);
+        if (!selview)
         {
           start = 0;
-          end = av.alignment.getWidth();
-          seqs = av.alignment.getSequencesArray();
+          end = av.getAlignment().getWidth();
+          seqs = av.getAlignment().getSequencesArray();
         }
         else
         {
           start = av.getSelectionGroup().getStartRes();
           end = av.getSelectionGroup().getEndRes() + 1;
-          seqs = av.getSelectionGroup().getSequencesInOrder(av.alignment);
+          seqs = av.getSelectionGroup().getSequencesInOrder(av.getAlignment());
         }
 
         tree = new NJTree(seqs, seqStrings, type, pwtype, start, end);
@@ -364,16 +369,16 @@ public class TreePanel extends GTreePanel
       buffer.append("PID");
     }
 
-
-    jalview.io.NewickFile fout = new jalview.io.NewickFile(tree
-            .getTopNode());
-    try {
+    jalview.io.NewickFile fout = new jalview.io.NewickFile(
+            tree.getTopNode());
+    try
+    {
       cap.setText(fout.print(tree.isHasBootstrap(), tree.isHasDistances(),
-            tree.isHasRootDistance()));
+              tree.isHasRootDistance()));
       Desktop.addInternalFrame(cap, buffer.toString(), 500, 100);
     } catch (OutOfMemoryError oom)
     {
-      new OOMWarning("generating newick tree file",oom);
+      new OOMWarning("generating newick tree file", oom);
       cap.dispose();
     }
 
@@ -387,8 +392,8 @@ public class TreePanel extends GTreePanel
    */
   public void saveAsNewick_actionPerformed(ActionEvent e)
   {
-    JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache
-            .getProperty("LAST_DIRECTORY"));
+    JalviewFileChooser chooser = new JalviewFileChooser(
+            jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle("Save tree as newick file");
     chooser.setToolTipText("Save");
@@ -403,10 +408,10 @@ public class TreePanel extends GTreePanel
 
       try
       {
-        jalview.io.NewickFile fout = new jalview.io.NewickFile(tree
-                .getTopNode());
-        String output = fout.print(tree.isHasBootstrap(), tree
-                .isHasDistances(), tree.isHasRootDistance());
+        jalview.io.NewickFile fout = new jalview.io.NewickFile(
+                tree.getTopNode());
+        String output = fout.print(tree.isHasBootstrap(),
+                tree.isHasDistances(), tree.isHasRootDistance());
         java.io.PrintWriter out = new java.io.PrintWriter(
                 new java.io.FileWriter(choice));
         out.println(output);
@@ -508,17 +513,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.getAlignment());
 
+    ap.paintAlignment(true);    
+    return undo;
+  }
   /**
    * DOCUMENT ME!
    * 
@@ -725,9 +785,9 @@ public class TreePanel extends GTreePanel
           if (sq != null)
           {
             // search dbrefs, features and annotation
-            DBRefEntry[] refs = jalview.util.DBRefUtils.selectRefs(sq
-                    .getDBRef(), new String[]
-            { labelClass.toUpperCase() });
+            DBRefEntry[] refs = jalview.util.DBRefUtils.selectRefs(
+                    sq.getDBRef(), new String[]
+                    { labelClass.toUpperCase() });
             if (refs != null)
             {
               for (int i = 0; i < refs.length; i++)