remove single node root
authorcmzmasek <cmzmasek@ca865154-3058-d1c3-3e42-d8f55a55bdbd>
Mon, 24 Dec 2012 19:53:37 +0000 (19:53 +0000)
committercmzmasek <cmzmasek@ca865154-3058-d1c3-3e42-d8f55a55bdbd>
Mon, 24 Dec 2012 19:53:37 +0000 (19:53 +0000)
forester/java/src/org/forester/archaeopteryx/TreePanel.java
forester/java/src/org/forester/phylogeny/Phylogeny.java
forester/java/src/org/forester/phylogeny/PhylogenyMethods.java

index 870f1c8..06520d1 100644 (file)
@@ -524,6 +524,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             initNodeData();
             if ( recalc_longest_ext_node_info ) {
                 calculateLongestExtNodeInfo();
+                while ( getLongestExtNodeInfo() > y / 2 && getTreeFontSet().getLargeFont().getSize() > 2 ) {
+                    getMainPanel().getTreeFontSet().decreaseFontSize();
+                    calculateLongestExtNodeInfo();
+                }
+                
             }
             int ext_nodes = _phylogeny.getRoot().getNumberOfExternalNodes();
             final int max_depth = PhylogenyMethods.calculateMaxDepth( _phylogeny );
@@ -2462,7 +2467,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             errorMessageNoCutCopyPasteInUnrootedDisplay();
             return;
         }
-        if ( node.isRoot() ) {
+        if ( node.isRoot() && node.getNumberOfDescendants() != 1 ) {
             JOptionPane.showMessageDialog( this,
                                            "Cannot delete entire tree",
                                            "Attempt to delete entire tree",
index 9eb8d18..b41f5fa 100644 (file)
@@ -157,6 +157,8 @@ public class Phylogeny {
     public Phylogeny copy() {
         return copy( _root );
     }
+    
+  
 
     /**
      * Returns a deep copy of this Phylogeny.
@@ -1073,7 +1075,7 @@ public class Phylogeny {
 
     public void setRoot( final PhylogenyNode n ) {
         _root = n;
-    } // setRoot( PhylogenyNode )
+    } 
 
     /**
      * Sets whether this Phylogeny is rooted or not.
index 79a374c..dab7523 100644 (file)
@@ -408,7 +408,7 @@ public class PhylogenyMethods {
         final ArrayList<PhylogenyNode> to_delete = new ArrayList<PhylogenyNode>();
         for( final PhylogenyNodeIterator iter = phy.iteratorPostorder(); iter.hasNext(); ) {
             final PhylogenyNode n = iter.next();
-            if ( !n.isExternal() && ( n.getNumberOfDescendants() == 1 ) ) {
+            if ( ( !n.isExternal() ) && ( !n.isRoot() ) && ( n.getNumberOfDescendants() == 1 ) ) {
                 to_delete.add( n );
             }
         }
@@ -913,10 +913,21 @@ public class PhylogenyMethods {
     }
 
     public static void removeNode( final PhylogenyNode remove_me, final Phylogeny phylogeny ) {
-        if ( remove_me.isRoot() ) {
-            throw new IllegalArgumentException( "ill advised attempt to remove root node" );
+        if ( remove_me.isRoot() && remove_me.getNumberOfDescendants() != 1 ) {
+            throw new IllegalArgumentException( "attempt to remove a root node with more than one descendants" );
+        }
+        
+        if ( remove_me.isRoot() && remove_me.getNumberOfDescendants() == 1 ) {
+            final PhylogenyNode desc = remove_me.getDescendants().get( 0 );
+           
+            desc.setDistanceToParent( addPhylogenyDistances( remove_me.getDistanceToParent(),
+                                                             desc.getDistanceToParent() ) );
+            desc.setParent( null );
+            phylogeny.setRoot( desc );
+            phylogeny.clearHashIdToNodeMap();
         }
-        if ( remove_me.isExternal() ) {
+        
+        else if ( remove_me.isExternal() ) {
             phylogeny.deleteSubtree( remove_me, false );
             phylogeny.clearHashIdToNodeMap();
             phylogeny.externalNodesHaveChanged();