Edited wiki page Archaeopteryx through web user interface.
[jalview.git] / forester / java / src / org / forester / archaeopteryx / TreePanel.java
index 7c40d10..79dfca7 100644 (file)
@@ -5,7 +5,7 @@
 // Copyright (C) 2008-2009 Christian M. Zmasek
 // Copyright (C) 2008-2009 Burnham Institute for Medical Research
 // All rights reserved
 // Copyright (C) 2008-2009 Christian M. Zmasek
 // Copyright (C) 2008-2009 Burnham Institute for Medical Research
 // All rights reserved
-// 
+//
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
@@ -15,7 +15,7 @@
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 // Lesser General Public License for more details.
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 // Lesser General Public License for more details.
-// 
+//
 // You should have received a copy of the GNU Lesser General Public
 // License along with this library; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
 // You should have received a copy of the GNU Lesser General Public
 // License along with this library; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
@@ -95,6 +95,8 @@ import org.forester.archaeopteryx.Options.NODE_LABEL_DIRECTION;
 import org.forester.archaeopteryx.Options.PHYLOGENY_GRAPHICS_TYPE;
 import org.forester.archaeopteryx.phylogeny.data.RenderableDomainArchitecture;
 import org.forester.archaeopteryx.phylogeny.data.RenderableVector;
 import org.forester.archaeopteryx.Options.PHYLOGENY_GRAPHICS_TYPE;
 import org.forester.archaeopteryx.phylogeny.data.RenderableDomainArchitecture;
 import org.forester.archaeopteryx.phylogeny.data.RenderableVector;
+import org.forester.archaeopteryx.tools.Blast;
+import org.forester.archaeopteryx.tools.ImageLoader;
 import org.forester.io.parsers.phyloxml.PhyloXmlUtil;
 import org.forester.phylogeny.Phylogeny;
 import org.forester.phylogeny.PhylogenyMethods;
 import org.forester.io.parsers.phyloxml.PhyloXmlUtil;
 import org.forester.phylogeny.Phylogeny;
 import org.forester.phylogeny.PhylogenyMethods;
@@ -103,7 +105,11 @@ import org.forester.phylogeny.data.Annotation;
 import org.forester.phylogeny.data.BranchColor;
 import org.forester.phylogeny.data.Confidence;
 import org.forester.phylogeny.data.Event;
 import org.forester.phylogeny.data.BranchColor;
 import org.forester.phylogeny.data.Confidence;
 import org.forester.phylogeny.data.Event;
+import org.forester.phylogeny.data.NodeVisualization;
+import org.forester.phylogeny.data.NodeVisualization.NodeFill;
+import org.forester.phylogeny.data.NodeVisualization.NodeShape;
 import org.forester.phylogeny.data.PhylogenyData;
 import org.forester.phylogeny.data.PhylogenyData;
+import org.forester.phylogeny.data.PhylogenyDataUtil;
 import org.forester.phylogeny.data.PropertiesMap;
 import org.forester.phylogeny.data.Property;
 import org.forester.phylogeny.data.Sequence;
 import org.forester.phylogeny.data.PropertiesMap;
 import org.forester.phylogeny.data.Property;
 import org.forester.phylogeny.data.Sequence;
@@ -125,30 +131,23 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     private static final float              HALF_PI                           = ( float ) ( Math.PI / 2.0 );
     private static final float              ANGLE_ROTATION_UNIT               = ( float ) ( Math.PI / 32 );
     private static final short              OV_BORDER                         = 10;
     private static final float              HALF_PI                           = ( float ) ( Math.PI / 2.0 );
     private static final float              ANGLE_ROTATION_UNIT               = ( float ) ( Math.PI / 32 );
     private static final short              OV_BORDER                         = 10;
-    final static Cursor                     CUT_CURSOR                        = Cursor
-                                                                                      .getPredefinedCursor( Cursor.CROSSHAIR_CURSOR );
-    final static Cursor                     MOVE_CURSOR                       = Cursor
-                                                                                      .getPredefinedCursor( Cursor.MOVE_CURSOR );
-    final static Cursor                     ARROW_CURSOR                      = Cursor
-                                                                                      .getPredefinedCursor( Cursor.DEFAULT_CURSOR );
-    final static Cursor                     HAND_CURSOR                       = Cursor
-                                                                                      .getPredefinedCursor( Cursor.HAND_CURSOR );
-    final static Cursor                     WAIT_CURSOR                       = Cursor
-                                                                                      .getPredefinedCursor( Cursor.WAIT_CURSOR );
+    final static Cursor                     CUT_CURSOR                        = Cursor.getPredefinedCursor( Cursor.CROSSHAIR_CURSOR );
+    final static Cursor                     MOVE_CURSOR                       = Cursor.getPredefinedCursor( Cursor.MOVE_CURSOR );
+    final static Cursor                     ARROW_CURSOR                      = Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR );
+    final static Cursor                     HAND_CURSOR                       = Cursor.getPredefinedCursor( Cursor.HAND_CURSOR );
+    final static Cursor                     WAIT_CURSOR                       = Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR );
     private final static long               serialVersionUID                  = -978349745916505029L;
     private final static int                EURO_D                            = 10;
     private final static String             NODE_POPMENU_NODE_CLIENT_PROPERTY = "node";
     private final static int                MIN_ROOT_LENGTH                   = 3;
     private final static long               serialVersionUID                  = -978349745916505029L;
     private final static int                EURO_D                            = 10;
     private final static String             NODE_POPMENU_NODE_CLIENT_PROPERTY = "node";
     private final static int                MIN_ROOT_LENGTH                   = 3;
-    private final static int                BOX_SIZE                          = 4;
-    private final static int                HALF_BOX_SIZE                     = TreePanel.BOX_SIZE / 2;
     private final static int                MAX_SUBTREES                      = 100;
     private final static int                MAX_NODE_FRAMES                   = 10;
     private final static int                MOVE                              = 20;
     private final static NumberFormat       FORMATTER_CONFIDENCE;
     private final static NumberFormat       FORMATTER_BRANCH_LENGTH;
     private final static int                WIGGLE                            = 2;
     private final static int                MAX_SUBTREES                      = 100;
     private final static int                MAX_NODE_FRAMES                   = 10;
     private final static int                MOVE                              = 20;
     private final static NumberFormat       FORMATTER_CONFIDENCE;
     private final static NumberFormat       FORMATTER_BRANCH_LENGTH;
     private final static int                WIGGLE                            = 2;
-    private final static int                HALF_BOX_SIZE_PLUS_WIGGLE         = HALF_BOX_SIZE + WIGGLE;
     private final static int                LIMIT_FOR_HQ_RENDERING            = 1000;
     private final static int                LIMIT_FOR_HQ_RENDERING            = 1000;
+    private final static int                CONFIDENCE_LEFT_MARGIN            = 4;
     // TODO "rendering_hints" was static before. Need to make sure everything is OK with it not
     // being static anymore (02/20/2009).
     private final RenderingHints            _rendering_hints                  = new RenderingHints( RenderingHints.KEY_RENDERING,
     // TODO "rendering_hints" was static before. Need to make sure everything is OK with it not
     // being static anymore (02/20/2009).
     private final RenderingHints            _rendering_hints                  = new RenderingHints( RenderingHints.KEY_RENDERING,
@@ -208,11 +207,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     final private static double             _180_OVER_PI                      = 180.0 / Math.PI;
     private static final float              ROUNDED_D                         = 8;
     private int                             _circ_max_depth;
     final private static double             _180_OVER_PI                      = 180.0 / Math.PI;
     private static final float              ROUNDED_D                         = 8;
     private int                             _circ_max_depth;
-    private int                             _circ_num_ext_nodes;
     private PhylogenyNode                   _root;
     final private Arc2D                     _arc                              = new Arc2D.Double();
     final private HashMap<Integer, Double>  _urt_nodeid_angle_map             = new HashMap<Integer, Double>();
     final private HashMap<Integer, Integer> _urt_nodeid_index_map             = new HashMap<Integer, Integer>();
     private PhylogenyNode                   _root;
     final private Arc2D                     _arc                              = new Arc2D.Double();
     final private HashMap<Integer, Double>  _urt_nodeid_angle_map             = new HashMap<Integer, Double>();
     final private HashMap<Integer, Integer> _urt_nodeid_index_map             = new HashMap<Integer, Integer>();
+    final private Set<Integer>              _collapsed_external_nodeid_set    = new HashSet<Integer>();
     HashMap<Integer, Short>                 _nodeid_dist_to_leaf              = new HashMap<Integer, Short>();
     private AffineTransform                 _at;
     private double                          _max_distance_to_root             = -1;
     HashMap<Integer, Short>                 _nodeid_dist_to_leaf              = new HashMap<Integer, Short>();
     private AffineTransform                 _at;
     private double                          _max_distance_to_root             = -1;
@@ -220,10 +219,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     private boolean                         _edited                           = false;
     private Popup                           _node_desc_popup;
     private JTextArea                       _rollover_popup;
     private boolean                         _edited                           = false;
     private Popup                           _node_desc_popup;
     private JTextArea                       _rollover_popup;
+    // private final int                       _box_size;
+    // private final int                       _half_box_size;
     //private final short                     _skip_counter                     = 0;
     private final StringBuffer              _popup_buffer                     = new StringBuffer();
     //private final short                     _skip_counter                     = 0;
     private final StringBuffer              _popup_buffer                     = new StringBuffer();
-    final private static Font               POPUP_FONT                        = new Font( Configuration
-                                                                                                  .getDefaultFontFamilyName(),
+    final private static Font               POPUP_FONT                        = new Font( Configuration.getDefaultFontFamilyName(),
                                                                                           Font.PLAIN,
                                                                                           12 );
     private static final boolean            DRAW_MEAN_COUNTS                  = true;                                                     //TODO remove me later
                                                                                           Font.PLAIN,
                                                                                           12 );
     private static final boolean            DRAW_MEAN_COUNTS                  = true;                                                     //TODO remove me later
@@ -233,6 +233,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                                                                                        false );
     // expression values menu:
     private DescriptiveStatistics           _statistics_for_vector_data;
                                                                                                        false );
     // expression values menu:
     private DescriptiveStatistics           _statistics_for_vector_data;
+    private PhylogenyNode[]                 _nodes_in_preorder                = null;
     //  private Image                           offscreenImage;
     //  private Graphics                        offscreenGraphics;
     //  private Dimension                       offscreenDimension;
     //  private Image                           offscreenImage;
     //  private Graphics                        offscreenGraphics;
     //  private Dimension                       offscreenDimension;
@@ -267,7 +268,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         _main_panel = tjp;
         _configuration = configuration;
         _phylogeny = t;
         _main_panel = tjp;
         _configuration = configuration;
         _phylogeny = t;
-        _phy_has_branch_lengths = ForesterUtil.isHasAtLeastOneBranchLengthLargerThanZero( _phylogeny );
+        _phy_has_branch_lengths = AptxUtil.isHasAtLeastOneBranchLengthLargerThanZero( _phylogeny );
         init();
         // if ( !_phylogeny.isEmpty() ) {
         _phylogeny.recalculateNumberOfExternalDescendants( true );
         init();
         // if ( !_phylogeny.isEmpty() ) {
         _phylogeny.recalculateNumberOfExternalDescendants( true );
@@ -408,6 +409,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         else {
             phy.addAsChild( node );
         }
         else {
             phy.addAsChild( node );
         }
+        setNodeInPreorderToNull();
         _phylogeny.externalNodesHaveChanged();
         _phylogeny.hashIDs();
         _phylogeny.recalculateNumberOfExternalDescendants( true );
         _phylogeny.externalNodesHaveChanged();
         _phylogeny.hashIDs();
         _phylogeny.recalculateNumberOfExternalDescendants( true );
@@ -444,12 +446,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
     }
 
         }
     }
 
-    final void assignGraphicsForNodeBoxWithColorForParentBranch( final PhylogenyNode node, final Graphics g ) {
+    final Color getGraphicsForNodeBoxWithColorForParentBranch( final PhylogenyNode node ) {
         if ( getControlPanel().isColorBranches() && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) {
         if ( getControlPanel().isColorBranches() && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) {
-            g.setColor( PhylogenyMethods.getBranchColorValue( node ) );
+            return ( PhylogenyMethods.getBranchColorValue( node ) );
         }
         else {
         }
         else {
-            g.setColor( getTreeColorSet().getBranchColor() );
+            return ( getTreeColorSet().getBranchColor() );
         }
     }
 
         }
     }
 
@@ -574,6 +576,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                     sum += getTreeFontSet()._fm_large_italic.stringWidth( tax.getCommonName() + " ()" );
                 }
             }
                     sum += getTreeFontSet()._fm_large_italic.stringWidth( tax.getCommonName() + " ()" );
                 }
             }
+            if ( getControlPanel().isShowProperties() && node.getNodeData().isHasProperties() ) {
+                sum += getTreeFontSet()._fm_large.stringWidth( propertiesToString( node ).toString() );
+            }
             if ( getControlPanel().isShowBinaryCharacters() && node.getNodeData().isHasBinaryCharacters() ) {
                 sum += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getBinaryCharacters()
                         .getGainedCharactersAsStringBuffer().toString() );
             if ( getControlPanel().isShowBinaryCharacters() && node.getNodeData().isHasBinaryCharacters() ) {
                 sum += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getBinaryCharacters()
                         .getGainedCharactersAsStringBuffer().toString() );
@@ -660,7 +665,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         // Look in species hash
         Color c = getControlPanel().getSpeciesColors().get( species );
         if ( c == null ) {
         // Look in species hash
         Color c = getControlPanel().getSpeciesColors().get( species );
         if ( c == null ) {
-            c = Util.calculateColorFromString( species );
+            c = AptxUtil.calculateColorFromString( species );
             getControlPanel().getSpeciesColors().put( species, c );
         }
         return c;
             getControlPanel().getSpeciesColors().put( species, c );
         }
         return c;
@@ -689,10 +694,13 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
         if ( !node.isExternal() && !node.isRoot() ) {
             final boolean collapse = !node.isCollapse();
         }
         if ( !node.isExternal() && !node.isRoot() ) {
             final boolean collapse = !node.isCollapse();
-            Util.collapseSubtree( node, collapse );
+            AptxUtil.collapseSubtree( node, collapse );
+            updateSetOfCollapsedExternalNodes( _phylogeny );
             _phylogeny.recalculateNumberOfExternalDescendants( true );
             resetNodeIdToDistToLeafMap();
             calculateLongestExtNodeInfo();
             _phylogeny.recalculateNumberOfExternalDescendants( true );
             resetNodeIdToDistToLeafMap();
             calculateLongestExtNodeInfo();
+            setNodeInPreorderToNull();
+            _control_panel.displayedPhylogenyMightHaveChanged( true );
             resetPreferredSize();
             updateOvSizes();
             _main_panel.adjustJScrollPane();
             resetPreferredSize();
             updateOvSizes();
             _main_panel.adjustJScrollPane();
@@ -705,10 +713,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             return;
         }
         setWaitCursor();
             return;
         }
         setWaitCursor();
-        Util.collapseSpeciesSpecificSubtrees( _phylogeny );
+        AptxUtil.collapseSpeciesSpecificSubtrees( _phylogeny );
+        updateSetOfCollapsedExternalNodes( _phylogeny );
         _phylogeny.recalculateNumberOfExternalDescendants( true );
         resetNodeIdToDistToLeafMap();
         calculateLongestExtNodeInfo();
         _phylogeny.recalculateNumberOfExternalDescendants( true );
         resetNodeIdToDistToLeafMap();
         calculateLongestExtNodeInfo();
+        setNodeInPreorderToNull();
         resetPreferredSize();
         _main_panel.adjustJScrollPane();
         setArrowCursor();
         resetPreferredSize();
         _main_panel.adjustJScrollPane();
         setArrowCursor();
@@ -759,7 +769,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             return;
         }
         setWaitCursor();
             return;
         }
         setWaitCursor();
-        Util.colorPhylogenyAccordingToConfidenceValues( _phylogeny, this );
+        AptxUtil.removeBranchColors( _phylogeny );
+        AptxUtil.colorPhylogenyAccordingToConfidenceValues( _phylogeny, this );
         _control_panel.setColorBranches( true );
         if ( _control_panel.getColorBranchesCb() != null ) {
             _control_panel.getColorBranchesCb().setSelected( true );
         _control_panel.setColorBranches( true );
         if ( _control_panel.getColorBranchesCb() != null ) {
             _control_panel.getColorBranchesCb().setSelected( true );
@@ -768,11 +779,57 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         repaint();
     }
 
         repaint();
     }
 
+    final void colorRank( final String rank ) {
+        if ( ( _phylogeny == null ) || ( _phylogeny.getNumberOfExternalNodes() < 2 ) ) {
+            return;
+        }
+        setWaitCursor();
+        AptxUtil.removeBranchColors( _phylogeny );
+        final int colorizations = AptxUtil.colorPhylogenyAccordingToRanks( _phylogeny, rank, this );
+        if ( colorizations > 0 ) {
+            _control_panel.setColorBranches( true );
+            if ( _control_panel.getColorBranchesCb() != null ) {
+                _control_panel.getColorBranchesCb().setSelected( true );
+            }
+            if ( _control_panel.getColorAccSpeciesCb() != null ) {
+                _control_panel.getColorAccSpeciesCb().setSelected( false );
+            }
+            _options.setColorLabelsSameAsParentBranch( true );
+            _control_panel.repaint();
+        }
+        setArrowCursor();
+        repaint();
+        if ( colorizations > 0 ) {
+            String msg = "Taxonomy colorization via " + rank + " completed:\n";
+            if ( colorizations > 1 ) {
+                msg += "colorized " + colorizations + " subtrees";
+            }
+            else {
+                msg += "colorized one subtree";
+            }
+            JOptionPane.showMessageDialog( this,
+                                           msg,
+                                           "Taxonomy Colorization Completed (" + rank + ")",
+                                           JOptionPane.INFORMATION_MESSAGE );
+        }
+        else {
+            String msg = "Could not taxonomy colorize any subtree via " + rank + ".\n";
+            msg += "Possible solutions (given that suitable taxonomic information is present):\n";
+            msg += "select a different rank (e.g. phylum, genus, ...)\n";
+            msg += "  and/or\n";
+            msg += "execute:\n";
+            msg += "1. \"" + MainFrameApplication.OBTAIN_DETAILED_TAXONOMIC_INFORMATION + "\" (Tools)\n";
+            msg += "2. \"" + MainFrameApplication.INFER_ANCESTOR_TAXONOMIES + "\" (Analysis)";
+            JOptionPane.showMessageDialog( this, msg, "Taxonomy Colorization Failed", JOptionPane.WARNING_MESSAGE );
+        }
+    }
+
     final private void copySubtree( final PhylogenyNode node ) {
         if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) {
             errorMessageNoCutCopyPasteInUnrootedDisplay();
             return;
         }
     final private void copySubtree( final PhylogenyNode node ) {
         if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) {
             errorMessageNoCutCopyPasteInUnrootedDisplay();
             return;
         }
+        setNodeInPreorderToNull();
         setCutOrCopiedTree( _phylogeny.copy( node ) );
         final List<PhylogenyNode> nodes = PhylogenyMethods.getAllDescendants( node );
         final Set<Integer> node_ids = new HashSet<Integer>( nodes.size() );
         setCutOrCopiedTree( _phylogeny.copy( node ) );
         final List<PhylogenyNode> nodes = PhylogenyMethods.getAllDescendants( node );
         final Set<Integer> node_ids = new HashSet<Integer>( nodes.size() );
@@ -804,6 +861,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         if ( r != JOptionPane.OK_OPTION ) {
             return;
         }
         if ( r != JOptionPane.OK_OPTION ) {
             return;
         }
+        setNodeInPreorderToNull();
         setCopiedAndPastedNodes( null );
         setCutOrCopiedTree( _phylogeny.copy( node ) );
         _phylogeny.deleteSubtree( node, true );
         setCopiedAndPastedNodes( null );
         setCutOrCopiedTree( _phylogeny.copy( node ) );
         _phylogeny.deleteSubtree( node, true );
@@ -858,6 +916,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                                     null,
                                                     options,
                                                     options[ 2 ] );
                                                     null,
                                                     options,
                                                     options[ 2 ] );
+        setNodeInPreorderToNull();
         boolean node_only = true;
         if ( r == 1 ) {
             node_only = false;
         boolean node_only = true;
         if ( r == 1 ) {
             node_only = false;
@@ -936,6 +995,52 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         g.fill( _rectangle );
     }
 
         g.fill( _rectangle );
     }
 
+    final private void drawRectGradient( final double x,
+                                         final double y,
+                                         final double width,
+                                         final double heigth,
+                                         final Graphics2D g,
+                                         final Color color_1,
+                                         final Color color_2,
+                                         final Color color_border ) {
+        _rectangle.setFrame( x, y, width, heigth );
+        g.setPaint( new GradientPaint( ( float ) x,
+                                       ( float ) y,
+                                       color_1,
+                                       ( float ) ( x + width ),
+                                       ( float ) ( y + heigth ),
+                                       color_2,
+                                       false ) );
+        g.fill( _rectangle );
+        if ( color_border != null ) {
+            g.setPaint( color_border );
+            g.draw( _rectangle );
+        }
+    }
+
+    final private void drawOvalGradient( final double x,
+                                         final double y,
+                                         final double width,
+                                         final double heigth,
+                                         final Graphics2D g,
+                                         final Color color_1,
+                                         final Color color_2,
+                                         final Color color_border ) {
+        _ellipse.setFrame( x, y, width, heigth );
+        g.setPaint( new GradientPaint( ( float ) x,
+                                       ( float ) y,
+                                       color_1,
+                                       ( float ) ( x + width ),
+                                       ( float ) ( y + heigth ),
+                                       color_2,
+                                       false ) );
+        g.fill( _ellipse );
+        if ( color_border != null ) {
+            g.setPaint( color_border );
+            g.draw( _ellipse );
+        }
+    }
+
     final private void errorMessageNoCutCopyPasteInUnrootedDisplay() {
         JOptionPane.showMessageDialog( this,
                                        "Cannot cut, copy, paste, add, or delete subtrees/nodes in unrooted display",
     final private void errorMessageNoCutCopyPasteInUnrootedDisplay() {
         JOptionPane.showMessageDialog( this,
                                        "Cannot cut, copy, paste, add, or delete subtrees/nodes in unrooted display",
@@ -954,13 +1059,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         if ( ( _phylogeny == null ) || _phylogeny.isEmpty() ) {
             return null;
         }
         if ( ( _phylogeny == null ) || _phylogeny.isEmpty() ) {
             return null;
         }
+        final int half_box_size_plus_wiggle = getOptions().getDefaultNodeShapeSize() / 2 + WIGGLE;
         for( final PhylogenyNodeIterator iter = _phylogeny.iteratorPostorder(); iter.hasNext(); ) {
             final PhylogenyNode node = iter.next();
             if ( ( _phylogeny.isRooted() || !node.isRoot() || ( node.getNumberOfDescendants() > 2 ) )
         for( final PhylogenyNodeIterator iter = _phylogeny.iteratorPostorder(); iter.hasNext(); ) {
             final PhylogenyNode node = iter.next();
             if ( ( _phylogeny.isRooted() || !node.isRoot() || ( node.getNumberOfDescendants() > 2 ) )
-                    && ( ( node.getXcoord() - HALF_BOX_SIZE_PLUS_WIGGLE ) <= x )
-                    && ( ( node.getXcoord() + HALF_BOX_SIZE_PLUS_WIGGLE ) >= x )
-                    && ( ( node.getYcoord() - HALF_BOX_SIZE_PLUS_WIGGLE ) <= y )
-                    && ( ( node.getYcoord() + HALF_BOX_SIZE_PLUS_WIGGLE ) >= y ) ) {
+                    && ( ( node.getXcoord() - half_box_size_plus_wiggle ) <= x )
+                    && ( ( node.getXcoord() + half_box_size_plus_wiggle ) >= x )
+                    && ( ( node.getYcoord() - half_box_size_plus_wiggle ) <= y )
+                    && ( ( node.getYcoord() + half_box_size_plus_wiggle ) >= y ) ) {
                 return node;
             }
         }
                 return node;
             }
         }
@@ -1095,7 +1201,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
      * 
      * @return a pointer to the phylogeny
      */
      * 
      * @return a pointer to the phylogeny
      */
-    final Phylogeny getPhylogeny() {
+    public final Phylogeny getPhylogeny() {
         return _phylogeny;
     }
 
         return _phylogeny;
     }
 
@@ -1238,7 +1344,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             return;
         }
         setWaitCursor();
             return;
         }
         setWaitCursor();
-        Util.inferCommonPartOfScientificNames( _phylogeny );
+        AptxUtil.inferCommonPartOfScientificNames( _phylogeny );
         setArrowCursor();
         repaint();
     }
         setArrowCursor();
         repaint();
     }
@@ -1700,6 +1806,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                            JOptionPane.WARNING_MESSAGE );
             return;
         }
                                            JOptionPane.WARNING_MESSAGE );
             return;
         }
+        setNodeInPreorderToNull();
         setWaitCursor();
         PhylogenyMethods.midpointRoot( _phylogeny );
         resetNodeIdToDistToLeafMap();
         setWaitCursor();
         PhylogenyMethods.midpointRoot( _phylogeny );
         resetNodeIdToDistToLeafMap();
@@ -2012,7 +2119,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             uri_str = url + URLEncoder.encode( seq.getAccession().getValue(), ForesterConstants.UTF8 );
         }
         catch ( final UnsupportedEncodingException e ) {
             uri_str = url + URLEncoder.encode( seq.getAccession().getValue(), ForesterConstants.UTF8 );
         }
         catch ( final UnsupportedEncodingException e ) {
-            Util.showErrorMessage( this, e.toString() );
+            AptxUtil.showErrorMessage( this, e.toString() );
             e.printStackTrace();
         }
         if ( !ForesterUtil.isEmpty( uri_str ) ) {
             e.printStackTrace();
         }
         if ( !ForesterUtil.isEmpty( uri_str ) ) {
@@ -2021,14 +2128,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 if ( isApplet() ) {
                     applet = obtainApplet();
                 }
                 if ( isApplet() ) {
                     applet = obtainApplet();
                 }
-                Util.launchWebBrowser( new URI( uri_str ), isApplet(), applet, "_aptx_seq" );
+                AptxUtil.launchWebBrowser( new URI( uri_str ), isApplet(), applet, "_aptx_seq" );
             }
             catch ( final IOException e ) {
             }
             catch ( final IOException e ) {
-                Util.showErrorMessage( this, e.toString() );
+                AptxUtil.showErrorMessage( this, e.toString() );
                 e.printStackTrace();
             }
             catch ( final URISyntaxException e ) {
                 e.printStackTrace();
             }
             catch ( final URISyntaxException e ) {
-                Util.showErrorMessage( this, e.toString() );
+                AptxUtil.showErrorMessage( this, e.toString() );
                 e.printStackTrace();
             }
         }
                 e.printStackTrace();
             }
         }
@@ -2052,7 +2159,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 uri_str = weblink.getUrl() + URLEncoder.encode( tax.getIdentifier().getValue(), ForesterConstants.UTF8 );
             }
             catch ( final UnsupportedEncodingException e ) {
                 uri_str = weblink.getUrl() + URLEncoder.encode( tax.getIdentifier().getValue(), ForesterConstants.UTF8 );
             }
             catch ( final UnsupportedEncodingException e ) {
-                Util.showErrorMessage( this, e.toString() );
+                AptxUtil.showErrorMessage( this, e.toString() );
                 e.printStackTrace();
             }
         }
                 e.printStackTrace();
             }
         }
@@ -2062,7 +2169,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 uri_str = new URI( tax.getIdentifier().getValue() ).toString();
             }
             catch ( final URISyntaxException e ) {
                 uri_str = new URI( tax.getIdentifier().getValue() ).toString();
             }
             catch ( final URISyntaxException e ) {
-                Util.showErrorMessage( this, e.toString() );
+                AptxUtil.showErrorMessage( this, e.toString() );
                 uri_str = null;
                 e.printStackTrace();
             }
                 uri_str = null;
                 e.printStackTrace();
             }
@@ -2073,7 +2180,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                         + URLEncoder.encode( tax.getScientificName(), ForesterConstants.UTF8 );
             }
             catch ( final UnsupportedEncodingException e ) {
                         + URLEncoder.encode( tax.getScientificName(), ForesterConstants.UTF8 );
             }
             catch ( final UnsupportedEncodingException e ) {
-                Util.showErrorMessage( this, e.toString() );
+                AptxUtil.showErrorMessage( this, e.toString() );
                 e.printStackTrace();
             }
         }
                 e.printStackTrace();
             }
         }
@@ -2083,7 +2190,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                         + URLEncoder.encode( tax.getTaxonomyCode(), ForesterConstants.UTF8 );
             }
             catch ( final UnsupportedEncodingException e ) {
                         + URLEncoder.encode( tax.getTaxonomyCode(), ForesterConstants.UTF8 );
             }
             catch ( final UnsupportedEncodingException e ) {
-                Util.showErrorMessage( this, e.toString() );
+                AptxUtil.showErrorMessage( this, e.toString() );
                 e.printStackTrace();
             }
         }
                 e.printStackTrace();
             }
         }
@@ -2093,7 +2200,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                         + URLEncoder.encode( tax.getCommonName(), ForesterConstants.UTF8 );
             }
             catch ( final UnsupportedEncodingException e ) {
                         + URLEncoder.encode( tax.getCommonName(), ForesterConstants.UTF8 );
             }
             catch ( final UnsupportedEncodingException e ) {
-                Util.showErrorMessage( this, e.toString() );
+                AptxUtil.showErrorMessage( this, e.toString() );
                 e.printStackTrace();
             }
         }
                 e.printStackTrace();
             }
         }
@@ -2103,14 +2210,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 if ( isApplet() ) {
                     applet = obtainApplet();
                 }
                 if ( isApplet() ) {
                     applet = obtainApplet();
                 }
-                Util.launchWebBrowser( new URI( uri_str ), isApplet(), applet, "_aptx_tax" );
+                AptxUtil.launchWebBrowser( new URI( uri_str ), isApplet(), applet, "_aptx_tax" );
             }
             catch ( final IOException e ) {
             }
             catch ( final IOException e ) {
-                Util.showErrorMessage( this, e.toString() );
+                AptxUtil.showErrorMessage( this, e.toString() );
                 e.printStackTrace();
             }
             catch ( final URISyntaxException e ) {
                 e.printStackTrace();
             }
             catch ( final URISyntaxException e ) {
-                Util.showErrorMessage( this, e.toString() );
+                AptxUtil.showErrorMessage( this, e.toString() );
                 e.printStackTrace();
             }
         }
                 e.printStackTrace();
             }
         }
@@ -2138,8 +2245,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             final double r2 = 2.0 * parent_radius;
             drawArc( root_x - parent_radius, root_y - parent_radius, r2, r2, ( -angle - arc ), arc, g );
         }
             final double r2 = 2.0 * parent_radius;
             drawArc( root_x - parent_radius, root_y - parent_radius, r2, r2, ( -angle - arc ), arc, g );
         }
-        drawLine( c.getXcoord(), c.getYcoord(), root_x + ( Math.cos( angle ) * parent_radius ), root_y
-                + ( Math.sin( angle ) * parent_radius ), g );
+        drawLine( c.getXcoord(),
+                  c.getYcoord(),
+                  root_x + ( Math.cos( angle ) * parent_radius ),
+                  root_y + ( Math.sin( angle ) * parent_radius ),
+                  g );
         paintNodeBox( c.getXcoord(), c.getYcoord(), c, g, to_pdf, to_graphics_file, isInFoundNodes( c ) );
         if ( c.isExternal() ) {
             final boolean is_in_found_nodes = isInFoundNodes( c );
         paintNodeBox( c.getXcoord(), c.getYcoord(), c, g, to_pdf, to_graphics_file, isInFoundNodes( c ) );
         if ( c.isExternal() ) {
             final boolean is_in_found_nodes = isInFoundNodes( c );
@@ -2164,8 +2274,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             final double r2 = 2.0 * parent_radius;
             drawArc( root_x - parent_radius, root_y - parent_radius, r2, r2, ( -angle - arc ), arc, g );
         }
             final double r2 = 2.0 * parent_radius;
             drawArc( root_x - parent_radius, root_y - parent_radius, r2, r2, ( -angle - arc ), arc, g );
         }
-        drawLine( c.getXSecondary(), c.getYSecondary(), root_x + ( Math.cos( angle ) * parent_radius ), root_y
-                + ( Math.sin( angle ) * parent_radius ), g );
+        drawLine( c.getXSecondary(),
+                  c.getYSecondary(),
+                  root_x + ( Math.cos( angle ) * parent_radius ),
+                  root_y + ( Math.sin( angle ) * parent_radius ),
+                  g );
         if ( isInFoundNodes( c ) ) {
             g.setColor( getTreeColorSet().getFoundColor() );
             drawRectFilled( c.getXSecondary() - 1, c.getYSecondary() - 1, 3, 3, g );
         if ( isInFoundNodes( c ) ) {
             g.setColor( getTreeColorSet().getFoundColor() );
             drawRectFilled( c.getXSecondary() - 1, c.getYSecondary() - 1, 3, 3, g );
@@ -2186,13 +2299,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         if ( !node.isRoot() ) {
             if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) {
                 TreePanel.drawString( FORMATTER_BRANCH_LENGTH.format( node.getDistanceToParent() ), node.getParent()
         if ( !node.isRoot() ) {
             if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) {
                 TreePanel.drawString( FORMATTER_BRANCH_LENGTH.format( node.getDistanceToParent() ), node.getParent()
-                        .getXcoord()
-                        + EURO_D, node.getYcoord() - getTreeFontSet()._small_max_descent, g );
+                        .getXcoord() + EURO_D, node.getYcoord() - getTreeFontSet()._small_max_descent, g );
             }
             else if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) {
                 TreePanel.drawString( FORMATTER_BRANCH_LENGTH.format( node.getDistanceToParent() ), node.getParent()
             }
             else if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) {
                 TreePanel.drawString( FORMATTER_BRANCH_LENGTH.format( node.getDistanceToParent() ), node.getParent()
-                        .getXcoord()
-                        + ROUNDED_D, node.getYcoord() - getTreeFontSet()._small_max_descent, g );
+                        .getXcoord() + ROUNDED_D, node.getYcoord() - getTreeFontSet()._small_max_descent, g );
             }
             else {
                 TreePanel.drawString( FORMATTER_BRANCH_LENGTH.format( node.getDistanceToParent() ), node.getParent()
             }
             else {
                 TreePanel.drawString( FORMATTER_BRANCH_LENGTH.format( node.getDistanceToParent() ), node.getParent()
@@ -2245,7 +2356,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     final private void paintBranchRectangular( final Graphics2D g,
                                                final float x1,
                                                final float x2,
     final private void paintBranchRectangular( final Graphics2D g,
                                                final float x1,
                                                final float x2,
-                                               float y1,
+                                               final float y1,
                                                final float y2,
                                                final PhylogenyNode node,
                                                final boolean to_pdf,
                                                final float y2,
                                                final PhylogenyNode node,
                                                final boolean to_pdf,
@@ -2266,88 +2377,45 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             g.draw( _cubic_curve );
         }
         else {
             g.draw( _cubic_curve );
         }
         else {
-            float x2a = x2;
-            float x1a = x1;
-            // draw the vertical line
-            boolean draw_horizontal = true;
+            final float x2a = x2;
+            final float x1a = x1;
             float y2_r = 0;
             if ( node.isFirstChildNode() || node.isLastChildNode()
                     || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE )
                     || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) ) {
             float y2_r = 0;
             if ( node.isFirstChildNode() || node.isLastChildNode()
                     || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE )
                     || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) ) {
-                boolean draw_vertical = true;
-                final PhylogenyNode parent = node.getParent();
-                if ( ( ( getOptions().isShowNodeBoxes() && !to_pdf && !to_graphics_file ) || ( ( getControlPanel()
-                        .isEvents() )
-                        && ( parent != null ) && parent.isHasAssignedEvent() ) )
-                        && ( _phylogeny.isRooted() || !( ( parent != null ) && parent.isRoot() ) )
-                        && !( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() && !parent
-                                .isDuplication() ) ) {
-                    if ( ( getPhylogenyGraphicsType() != PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE )
-                            && ( getPhylogenyGraphicsType() != PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) ) {
-                        if ( Math.abs( y2 - y1 ) <= TreePanel.HALF_BOX_SIZE ) {
-                            draw_vertical = false;
-                        }
-                        else {
-                            if ( y1 < y2 ) {
-                                y1 += TreePanel.HALF_BOX_SIZE;
-                            }
-                            else {
-                                if ( !to_pdf ) {
-                                    y1 -= TreePanel.HALF_BOX_SIZE + 1;
-                                }
-                                else {
-                                    y1 -= TreePanel.HALF_BOX_SIZE;
-                                }
-                            }
-                        }
-                    }
-                    if ( ( x2 - x1 ) <= TreePanel.HALF_BOX_SIZE ) {
-                        draw_horizontal = false;
-                    }
-                    else if ( !draw_vertical ) {
-                        x1a += TreePanel.HALF_BOX_SIZE;
-                    }
-                    if ( ( ( x2 - x1a ) > TreePanel.HALF_BOX_SIZE )
-                            && !( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() && !node
-                                    .isDuplication() ) ) {
-                        x2a -= TreePanel.HALF_BOX_SIZE;
-                    }
+                if ( !to_graphics_file
+                        && !to_pdf
+                        && ( ( ( y2 < getVisibleRect().getMinY() - 20 ) && ( y1 < getVisibleRect().getMinY() - 20 ) ) || ( ( y2 > getVisibleRect()
+                                .getMaxY() + 20 ) && ( y1 > getVisibleRect().getMaxY() + 20 ) ) ) ) {
+                    // Do nothing.
                 }
                 }
-                if ( draw_vertical ) {
-                    if ( !to_graphics_file
-                            && !to_pdf
-                            && ( ( ( y2 < getVisibleRect().getMinY() - 20 ) && ( y1 < getVisibleRect().getMinY() - 20 ) ) || ( ( y2 > getVisibleRect()
-                                    .getMaxY() + 20 ) && ( y1 > getVisibleRect().getMaxY() + 20 ) ) ) ) {
-                        // Do nothing.
-                    }
-                    else {
-                        if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) {
-                            float x2c = x1 + EURO_D;
-                            if ( x2c > x2a ) {
-                                x2c = x2a;
-                            }
-                            drawLine( x1, y1, x2c, y2, g );
+                else {
+                    if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) {
+                        float x2c = x1 + EURO_D;
+                        if ( x2c > x2a ) {
+                            x2c = x2a;
                         }
                         }
-                        else if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) {
-                            if ( y2 > y1 ) {
-                                y2_r = y2 - ROUNDED_D;
-                                if ( y2_r < y1 ) {
-                                    y2_r = y1;
-                                }
-                                drawLine( x1, y1, x1, y2_r, g );
-                            }
-                            else {
-                                y2_r = y2 + ROUNDED_D;
-                                if ( y2_r > y1 ) {
-                                    y2_r = y1;
-                                }
-                                drawLine( x1, y1, x1, y2_r, g );
+                        drawLine( x1, y1, x2c, y2, g );
+                    }
+                    else if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) {
+                        if ( y2 > y1 ) {
+                            y2_r = y2 - ROUNDED_D;
+                            if ( y2_r < y1 ) {
+                                y2_r = y1;
                             }
                             }
+                            drawLine( x1, y1, x1, y2_r, g );
                         }
                         else {
                         }
                         else {
-                            drawLine( x1, y1, x1, y2, g );
+                            y2_r = y2 + ROUNDED_D;
+                            if ( y2_r > y1 ) {
+                                y2_r = y1;
+                            }
+                            drawLine( x1, y1, x1, y2_r, g );
                         }
                     }
                         }
                     }
+                    else {
+                        drawLine( x1, y1, x1, y2, g );
+                    }
                 }
             }
             // draw the horizontal line
                 }
             }
             // draw the horizontal line
@@ -2356,42 +2424,40 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 return;
             }
             float x1_r = 0;
                 return;
             }
             float x1_r = 0;
-            if ( draw_horizontal ) {
-                if ( !getControlPanel().isWidthBranches() || ( PhylogenyMethods.getBranchWidthValue( node ) == 1 ) ) {
-                    if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) {
-                        x1_r = x1a + ROUNDED_D;
-                        if ( x1_r < x2a ) {
-                            drawLine( x1_r, y2, x2a, y2, g );
-                        }
+            if ( !getControlPanel().isWidthBranches() || ( PhylogenyMethods.getBranchWidthValue( node ) == 1 ) ) {
+                if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) {
+                    x1_r = x1a + ROUNDED_D;
+                    if ( x1_r < x2a ) {
+                        drawLine( x1_r, y2, x2a, y2, g );
                     }
                     }
-                    else if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) {
-                        final float x1c = x1a + EURO_D;
-                        if ( x1c < x2a ) {
-                            drawLine( x1c, y2, x2a, y2, g );
-                        }
-                    }
-                    else {
-                        drawLine( x1a, y2, x2a, y2, g );
+                }
+                else if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) {
+                    final float x1c = x1a + EURO_D;
+                    if ( x1c < x2a ) {
+                        drawLine( x1c, y2, x2a, y2, g );
                     }
                 }
                 else {
                     }
                 }
                 else {
-                    final double w = PhylogenyMethods.getBranchWidthValue( node );
-                    if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) {
-                        x1_r = x1a + ROUNDED_D;
-                        if ( x1_r < x2a ) {
-                            drawRectFilled( x1_r, y2 - ( w / 2 ), x2a - x1_r, w, g );
-                        }
-                    }
-                    else if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) {
-                        final float x1c = x1a + EURO_D;
-                        if ( x1c < x2a ) {
-                            drawRectFilled( x1c, y2 - ( w / 2 ), x2a - x1c, w, g );
-                        }
+                    drawLine( x1a, y2, x2a, y2, g );
+                }
+            }
+            else {
+                final double w = PhylogenyMethods.getBranchWidthValue( node );
+                if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) {
+                    x1_r = x1a + ROUNDED_D;
+                    if ( x1_r < x2a ) {
+                        drawRectFilled( x1_r, y2 - ( w / 2 ), x2a - x1_r, w, g );
                     }
                     }
-                    else {
-                        drawRectFilled( x1a, y2 - ( w / 2 ), x2a - x1a, w, g );
+                }
+                else if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) {
+                    final float x1c = x1a + EURO_D;
+                    if ( x1c < x2a ) {
+                        drawRectFilled( x1c, y2 - ( w / 2 ), x2a - x1c, w, g );
                     }
                 }
                     }
                 }
+                else {
+                    drawRectFilled( x1a, y2 - ( w / 2 ), x2a - x1a, w, g );
+                }
             }
             if ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) ) {
                 if ( x1_r > x2a ) {
             }
             if ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) ) {
                 if ( x1_r > x2a ) {
@@ -2407,7 +2473,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 g.draw( _arc );
             }
         }
                 g.draw( _arc );
             }
         }
-        paintNodeBox( x2, y2, node, g, to_pdf, to_graphics_file, isInFoundNodes( node ) );
+        if ( node.isExternal() ) {
+            paintNodeBox( x2, y2, node, g, to_pdf, to_graphics_file, isInFoundNodes( node ) );
+        }
     }
 
     final void paintCircular( final Phylogeny phy,
     }
 
     final void paintCircular( final Phylogeny phy,
@@ -2418,23 +2486,45 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                               final Graphics2D g,
                               final boolean to_pdf,
                               final boolean to_graphics_file ) {
                               final Graphics2D g,
                               final boolean to_pdf,
                               final boolean to_graphics_file ) {
-        _circ_num_ext_nodes = phy.getNumberOfExternalNodes();
+        final int circ_num_ext_nodes = phy.getNumberOfExternalNodes() - _collapsed_external_nodeid_set.size();
+        System.out.println( "# collapsed external = " + _collapsed_external_nodeid_set.size() );
         _root = phy.getRoot();
         _root.setXcoord( center_x );
         _root.setYcoord( center_y );
         _root = phy.getRoot();
         _root.setXcoord( center_x );
         _root.setYcoord( center_y );
-        paintNodeBox( _root.getXcoord(), _root.getYcoord(), _root, g, to_pdf, to_graphics_file, isInFoundNodes( _root ) );
         final boolean radial_labels = getOptions().getNodeLabelDirection() == NODE_LABEL_DIRECTION.RADIAL;
         double current_angle = starting_angle;
         int i = 0;
         for( final PhylogenyNodeIterator it = phy.iteratorExternalForward(); it.hasNext(); ) {
             final PhylogenyNode n = it.next();
         final boolean radial_labels = getOptions().getNodeLabelDirection() == NODE_LABEL_DIRECTION.RADIAL;
         double current_angle = starting_angle;
         int i = 0;
         for( final PhylogenyNodeIterator it = phy.iteratorExternalForward(); it.hasNext(); ) {
             final PhylogenyNode n = it.next();
-            n.setXcoord( ( float ) ( center_x + ( radius * Math.cos( current_angle ) ) ) );
-            n.setYcoord( ( float ) ( center_y + ( radius * Math.sin( current_angle ) ) ) );
-            _urt_nodeid_angle_map.put( n.getId(), current_angle );
-            _urt_nodeid_index_map.put( n.getId(), i++ );
-            current_angle += ( TWO_PI / _circ_num_ext_nodes );
+            if ( !n.isCollapse() ) {
+                n.setXcoord( ( float ) ( center_x + ( radius * Math.cos( current_angle ) ) ) );
+                n.setYcoord( ( float ) ( center_y + ( radius * Math.sin( current_angle ) ) ) );
+                _urt_nodeid_angle_map.put( n.getId(), current_angle );
+                _urt_nodeid_index_map.put( n.getId(), i++ );
+                current_angle += ( TWO_PI / circ_num_ext_nodes );
+            }
+            else {
+                //TODO remove me
+                System.out.println( "is collapse" + n.getName() );
+            }
         }
         paintCirculars( phy.getRoot(), phy, center_x, center_y, radius, radial_labels, g, to_pdf, to_graphics_file );
         }
         paintCirculars( phy.getRoot(), phy, center_x, center_y, radius, radial_labels, g, to_pdf, to_graphics_file );
+        paintNodeBox( _root.getXcoord(), _root.getYcoord(), _root, g, to_pdf, to_graphics_file, isInFoundNodes( _root ) );
+    }
+
+    void updateSetOfCollapsedExternalNodes( final Phylogeny phy ) {
+        _collapsed_external_nodeid_set.clear();
+        E: for( final PhylogenyNodeIterator it = phy.iteratorExternalForward(); it.hasNext(); ) {
+            final PhylogenyNode ext_node = it.next();
+            PhylogenyNode n = ext_node;
+            while ( !n.isRoot() ) {
+                if ( n.isCollapse() ) {
+                    _collapsed_external_nodeid_set.add( ext_node.getId() );
+                    continue E;
+                }
+                n = n.getParent();
+            }
+        }
     }
 
     final void paintCircularLite( final Phylogeny phy,
     }
 
     final void paintCircularLite( final Phylogeny phy,
@@ -2443,7 +2533,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                   final int center_y,
                                   final int radius,
                                   final Graphics2D g ) {
                                   final int center_y,
                                   final int radius,
                                   final Graphics2D g ) {
-        _circ_num_ext_nodes = phy.getNumberOfExternalNodes();
+        final int circ_num_ext_nodes = phy.getNumberOfExternalNodes();
         _root = phy.getRoot();
         _root.setXSecondary( center_x );
         _root.setYSecondary( center_y );
         _root = phy.getRoot();
         _root.setXSecondary( center_x );
         _root.setYSecondary( center_y );
@@ -2453,7 +2543,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             n.setXSecondary( ( float ) ( center_x + radius * Math.cos( current_angle ) ) );
             n.setYSecondary( ( float ) ( center_y + radius * Math.sin( current_angle ) ) );
             _urt_nodeid_angle_map.put( n.getId(), current_angle );
             n.setXSecondary( ( float ) ( center_x + radius * Math.cos( current_angle ) ) );
             n.setYSecondary( ( float ) ( center_y + radius * Math.sin( current_angle ) ) );
             _urt_nodeid_angle_map.put( n.getId(), current_angle );
-            current_angle += ( TWO_PI / _circ_num_ext_nodes );
+            current_angle += ( TWO_PI / circ_num_ext_nodes );
         }
         paintCircularsLite( phy.getRoot(), phy, center_x, center_y, radius, g );
     }
         }
         paintCircularsLite( phy.getRoot(), phy, center_x, center_y, radius, g );
     }
@@ -2467,9 +2557,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                          final Graphics2D g,
                                          final boolean to_pdf,
                                          final boolean to_graphics_file ) {
                                          final Graphics2D g,
                                          final boolean to_pdf,
                                          final boolean to_graphics_file ) {
-        if ( n.isExternal() ) {
+        if ( n.isExternal() || n.isCollapse() ) { //~~circ collapse
             if ( !_urt_nodeid_angle_map.containsKey( n.getId() ) ) {
             if ( !_urt_nodeid_angle_map.containsKey( n.getId() ) ) {
-                System.out.println( "no " + n + ", fucker!" );//TODO
+                System.out.println( "no " + n + " =====>>>>>>> ERROR!" );//TODO
             }
             return _urt_nodeid_angle_map.get( n.getId() );
         }
             }
             return _urt_nodeid_angle_map.get( n.getId() );
         }
@@ -2534,21 +2624,22 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                            final boolean to_graphics_file,
                                            final boolean to_pdf,
                                            final boolean is_in_found_nodes ) {
                                            final boolean to_graphics_file,
                                            final boolean to_pdf,
                                            final boolean is_in_found_nodes ) {
+        Color c = null;
         if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) {
         if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) {
-            g.setColor( Color.BLACK );
+            c = Color.BLACK;
         }
         else if ( is_in_found_nodes ) {
         }
         else if ( is_in_found_nodes ) {
-            g.setColor( getTreeColorSet().getFoundColor() );
+            c = getTreeColorSet().getFoundColor();
         }
         else if ( getControlPanel().isColorAccordingToTaxonomy() ) {
         }
         else if ( getControlPanel().isColorAccordingToTaxonomy() ) {
-            g.setColor( getTaxonomyBasedColor( node ) );
+            c = getTaxonomyBasedColor( node );
         }
         else if ( getOptions().isColorLabelsSameAsParentBranch() && getControlPanel().isColorBranches()
                 && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) {
         }
         else if ( getOptions().isColorLabelsSameAsParentBranch() && getControlPanel().isColorBranches()
                 && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) {
-            g.setColor( PhylogenyMethods.getBranchColorValue( node ) );
+            c = PhylogenyMethods.getBranchColorValue( node );
         }
         else {
         }
         else {
-            g.setColor( getTreeColorSet().getCollapseFillColor() );
+            c = getTreeColorSet().getCollapseFillColor();
         }
         double d = node.getAllExternalDescendants().size();
         if ( d > 1000 ) {
         }
         double d = node.getAllExternalDescendants().size();
         if ( d > 1000 ) {
@@ -2557,17 +2648,34 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         else {
             d = ( Math.log10( d ) * _y_distance ) / 2.5;
         }
         else {
             d = ( Math.log10( d ) * _y_distance ) / 2.5;
         }
-        if ( d < BOX_SIZE ) {
-            d = BOX_SIZE;
+        final int box_size = getOptions().getDefaultNodeShapeSize();
+        if ( d < box_size ) {
+            d = box_size;
         }
         _polygon.reset();
         }
         _polygon.reset();
-        _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() - TreePanel.BOX_SIZE ), ForesterUtil
-                .roundToInt( node.getYcoord() ) );
-        _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() + TreePanel.BOX_SIZE ), ForesterUtil
-                .roundToInt( node.getYcoord() - d ) );
-        _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() + TreePanel.BOX_SIZE ), ForesterUtil
-                .roundToInt( node.getYcoord() + d ) );
-        g.fillPolygon( _polygon );
+        _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() - box_size ),
+                           ForesterUtil.roundToInt( node.getYcoord() ) );
+        _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() + box_size ),
+                           ForesterUtil.roundToInt( node.getYcoord() - d ) );
+        _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() + box_size ),
+                           ForesterUtil.roundToInt( node.getYcoord() + d ) );
+        if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.SOLID ) {
+            g.setColor( c );
+            g.fillPolygon( _polygon );
+        }
+        else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.NONE ) {
+            g.setColor( getBackground() );
+            g.fillPolygon( _polygon );
+            g.setColor( c );
+            g.drawPolygon( _polygon );
+        }
+        else if ( getOptions().getDefaultNodeFill() == NodeFill.GRADIENT ) {
+            g.setPaint( new GradientPaint( node.getXcoord() - box_size, node.getYcoord(), getBackground(), ( node
+                    .getXcoord() + box_size ), ( float ) ( node.getYcoord() - d ), c, false ) );
+            g.fill( _polygon );
+            g.setPaint( c );
+            g.draw( _polygon );
+        }
         paintNodeData( g, node, to_graphics_file, to_pdf, is_in_found_nodes );
     }
 
         paintNodeData( g, node, to_graphics_file, to_pdf, is_in_found_nodes );
     }
 
@@ -2598,36 +2706,45 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                               final PhylogenyNode node,
                                               final boolean to_pdf,
                                               final boolean to_graphics_file ) {
                                               final PhylogenyNode node,
                                               final boolean to_pdf,
                                               final boolean to_graphics_file ) {
-        String conf_str = "";
         final List<Confidence> confidences = node.getBranchData().getConfidences();
         final List<Confidence> confidences = node.getBranchData().getConfidences();
-        if ( confidences.size() == 1 ) {
-            final double value = node.getBranchData().getConfidence( 0 ).getValue();
-            if ( ( value == Confidence.CONFIDENCE_DEFAULT_VALUE ) || ( value < getOptions().getMinConfidenceValue() ) ) {
-                return;
-            }
-            conf_str = FORMATTER_CONFIDENCE.format( value );
-        }
-        else if ( confidences.size() > 1 ) {
-            boolean one_ok = false;
-            boolean not_first = false;
-            Collections.sort( confidences );
-            final StringBuilder sb = new StringBuilder();
-            for( final Confidence confidence : confidences ) {
-                final double value = confidence.getValue();
-                if ( value != Confidence.CONFIDENCE_DEFAULT_VALUE ) {
-                    if ( value >= getOptions().getMinConfidenceValue() ) {
-                        one_ok = true;
-                    }
-                    if ( not_first ) {
-                        sb.append( "/" );
-                    }
-                    else {
-                        not_first = true;
+        //        if ( confidences.size() == 1 ) {
+        //            final double value = node.getBranchData().getConfidence( 0 ).getValue();
+        //            if ( ( value == Confidence.CONFIDENCE_DEFAULT_VALUE ) || ( value < getOptions().getMinConfidenceValue() ) ) {
+        //                return;
+        //            }
+        //            conf_str = FORMATTER_CONFIDENCE.format( value );
+        //        }
+        //        else if ( confidences.size() > 1 ) {
+        boolean one_ok = false;
+        boolean not_first = false;
+        Collections.sort( confidences );
+        final StringBuilder sb = new StringBuilder();
+        String conf_str = "";
+        for( final Confidence confidence : confidences ) {
+            final double value = confidence.getValue();
+            if ( value != Confidence.CONFIDENCE_DEFAULT_VALUE ) {
+                if ( value >= getOptions().getMinConfidenceValue() ) {
+                    one_ok = true;
+                }
+                if ( not_first ) {
+                    sb.append( "/" );
+                }
+                else {
+                    not_first = true;
+                }
+                sb.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( value, getOptions()
+                        .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) );
+                if ( getOptions().isShowConfidenceStddev() ) {
+                    if ( confidence.getStandardDeviation() != Confidence.CONFIDENCE_DEFAULT_VALUE ) {
+                        sb.append( "(" );
+                        sb.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( confidence.getStandardDeviation(),
+                                                                                    getOptions()
+                                                                                            .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) );
+                        sb.append( ")" );
                     }
                     }
-                    sb.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( value, getOptions()
-                            .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) );
                 }
             }
                 }
             }
+            //}
             if ( one_ok ) {
                 conf_str = sb.toString();
             }
             if ( one_ok ) {
                 conf_str = sb.toString();
             }
@@ -2649,15 +2766,19 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 g.setColor( getTreeColorSet().getConfidenceColor() );
             }
             TreePanel
                 g.setColor( getTreeColorSet().getConfidenceColor() );
             }
             TreePanel
-                    .drawString( conf_str, parent_x
-                            + ( ( x - parent_x - getTreeFontSet()._fm_small.stringWidth( conf_str ) ) / 2 ), ( node
-                            .getYcoord() + getTreeFontSet()._small_max_ascent ) - 1, g );
+                    .drawString( conf_str,
+                                 parent_x
+                                         + ( ( x - parent_x - getTreeFontSet()._fm_small.stringWidth( conf_str ) ) / 2 ),
+                                 ( node.getYcoord() + getTreeFontSet()._small_max_ascent ) - 1,
+                                 g );
         }
     }
 
     final private void paintFoundNode( final int x, final int y, final Graphics2D g ) {
         }
     }
 
     final private void paintFoundNode( final int x, final int y, final Graphics2D g ) {
+        final int box_size = getOptions().getDefaultNodeShapeSize();
+        final int half_box_size = getOptions().getDefaultNodeShapeSize() / 2;
         g.setColor( getTreeColorSet().getFoundColor() );
         g.setColor( getTreeColorSet().getFoundColor() );
-        g.fillRect( x - TreePanel.HALF_BOX_SIZE, y - TreePanel.HALF_BOX_SIZE, TreePanel.BOX_SIZE, TreePanel.BOX_SIZE );
+        g.fillRect( x - half_box_size, y - half_box_size, box_size, box_size );
     }
 
     final private void paintGainedAndLostCharacters( final Graphics2D g,
     }
 
     final private void paintGainedAndLostCharacters( final Graphics2D g,
@@ -2673,9 +2794,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 g.setColor( Color.BLUE );
             }
             TreePanel
                 g.setColor( Color.BLUE );
             }
             TreePanel
-                    .drawString( gained, parent_x
-                            + ( ( x - parent_x - getTreeFontSet()._fm_large.stringWidth( gained ) ) / 2 ), ( node
-                            .getYcoord() - getTreeFontSet()._fm_large.getMaxDescent() ), g );
+                    .drawString( gained,
+                                 parent_x + ( ( x - parent_x - getTreeFontSet()._fm_large.stringWidth( gained ) ) / 2 ),
+                                 ( node.getYcoord() - getTreeFontSet()._fm_large.getMaxDescent() ),
+                                 g );
             g.setColor( getTreeColorSet().getLostCharactersColor() );
             TreePanel.drawString( lost,
                                   parent_x + ( ( x - parent_x - getTreeFontSet()._fm_large.stringWidth( lost ) ) / 2 ),
             g.setColor( getTreeColorSet().getLostCharactersColor() );
             TreePanel.drawString( lost,
                                   parent_x + ( ( x - parent_x - getTreeFontSet()._fm_large.stringWidth( lost ) ) / 2 ),
@@ -2713,33 +2835,93 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             paintFoundNode( ForesterUtil.roundToInt( x ), ForesterUtil.roundToInt( y ), g );
         }
         else {
             paintFoundNode( ForesterUtil.roundToInt( x ), ForesterUtil.roundToInt( y ), g );
         }
         else {
+            Color outline_color = null;
             if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) {
             if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) {
-                g.setColor( Color.BLACK );
+                outline_color = Color.BLACK;
             }
             }
-            else if ( getControlPanel().isEvents() && Util.isHasAssignedEvent( node ) ) {
+            else if ( getControlPanel().isEvents() && AptxUtil.isHasAssignedEvent( node ) ) {
                 final Event event = node.getNodeData().getEvent();
                 if ( event.isDuplication() ) {
                 final Event event = node.getNodeData().getEvent();
                 if ( event.isDuplication() ) {
-                    g.setColor( getTreeColorSet().getDuplicationBoxColor() );
+                    outline_color = getTreeColorSet().getDuplicationBoxColor();
                 }
                 else if ( event.isSpeciation() ) {
                 }
                 else if ( event.isSpeciation() ) {
-                    g.setColor( getTreeColorSet().getSpecBoxColor() );
+                    outline_color = getTreeColorSet().getSpecBoxColor();
                 }
                 else if ( event.isSpeciationOrDuplication() ) {
                 }
                 else if ( event.isSpeciationOrDuplication() ) {
-                    g.setColor( getTreeColorSet().getDuplicationOrSpeciationColor() );
+                    outline_color = getTreeColorSet().getDuplicationOrSpeciationColor();
                 }
             }
                 }
             }
-            else {
-                assignGraphicsForNodeBoxWithColorForParentBranch( node, g );
+            else if ( getOptions().isTaxonomyColorizeNodeShapes() ) {
+                outline_color = getTaxonomyBasedColor( node );
             }
             }
-            if ( ( getOptions().isShowNodeBoxes() && !to_pdf && !to_graphics_file )
-                    || ( getControlPanel().isEvents() && node.isHasAssignedEvent() ) ) {
-                if ( to_pdf || to_graphics_file ) {
-                    if ( node.isDuplication() || !getOptions().isPrintBlackAndWhite() ) {
-                        drawOvalFilled( x - HALF_BOX_SIZE, y - HALF_BOX_SIZE, BOX_SIZE, BOX_SIZE, g );
+            else {
+                outline_color = getGraphicsForNodeBoxWithColorForParentBranch( node );
+                if ( to_pdf && ( outline_color == getTreeColorSet().getBranchColor() ) ) {
+                    outline_color = getTreeColorSet().getBranchColorForPdf();
+                }
+            }
+            final int box_size = getOptions().getDefaultNodeShapeSize();
+            final int half_box_size = box_size / 2;
+            if ( getOptions().isShowDefaultNodeShapes() || ( getControlPanel().isEvents() && node.isHasAssignedEvent() ) ) {
+                if ( getOptions().getDefaultNodeShape() == NodeShape.CIRCLE ) {
+                    if ( getOptions().getDefaultNodeFill() == NodeFill.GRADIENT ) {
+                        drawOvalGradient( x - half_box_size,
+                                          y - half_box_size,
+                                          box_size,
+                                          box_size,
+                                          g,
+                                          to_pdf ? Color.WHITE : outline_color,
+                                          to_pdf ? outline_color : getBackground(),
+                                          outline_color );
+                    }
+                    else if ( getOptions().getDefaultNodeFill() == NodeFill.NONE ) {
+                        Color background = getBackground();
+                        if ( to_pdf ) {
+                            background = Color.WHITE;
+                        }
+                        drawOvalGradient( x - half_box_size,
+                                          y - half_box_size,
+                                          box_size,
+                                          box_size,
+                                          g,
+                                          background,
+                                          background,
+                                          outline_color );
+                    }
+                    else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.SOLID ) {
+                        g.setColor( outline_color );
+                        drawOvalFilled( x - half_box_size, y - half_box_size, box_size, box_size, g );
                     }
                 }
                     }
                 }
-                else {
-                    drawRectFilled( x - HALF_BOX_SIZE, y - HALF_BOX_SIZE, BOX_SIZE, BOX_SIZE, g );
+                else if ( getOptions().getDefaultNodeShape() == NodeVisualization.NodeShape.RECTANGLE ) {
+                    if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.GRADIENT ) {
+                        drawRectGradient( x - half_box_size,
+                                          y - half_box_size,
+                                          box_size,
+                                          box_size,
+                                          g,
+                                          to_pdf ? Color.WHITE : outline_color,
+                                          to_pdf ? outline_color : getBackground(),
+                                          outline_color );
+                    }
+                    else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.NONE ) {
+                        Color background = getBackground();
+                        if ( to_pdf ) {
+                            background = Color.WHITE;
+                        }
+                        drawRectGradient( x - half_box_size,
+                                          y - half_box_size,
+                                          box_size,
+                                          box_size,
+                                          g,
+                                          background,
+                                          background,
+                                          outline_color );
+                    }
+                    else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.SOLID ) {
+                        g.setColor( outline_color );
+                        drawRectFilled( x - half_box_size, y - half_box_size, box_size, box_size, g );
+                    }
                 }
             }
         }
                 }
             }
         }
@@ -2756,24 +2938,24 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         if ( getOptions().isShowBranchLengthValues()
                 && ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR )
                         || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) )
         if ( getOptions().isShowBranchLengthValues()
                 && ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR )
                         || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) )
-                && ( !node.isRoot() ) && ( node.getDistanceToParent() != PhylogenyNode.DISTANCE_DEFAULT ) ) {
+                && ( !node.isRoot() ) && ( node.getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) ) {
             paintBranchLength( g, node, to_pdf, to_graphics_file );
         }
         if ( !getControlPanel().isShowInternalData() && !node.isExternal() && !node.isCollapse() ) {
             return;
         }
         int x = 0;
             paintBranchLength( g, node, to_pdf, to_graphics_file );
         }
         if ( !getControlPanel().isShowInternalData() && !node.isExternal() && !node.isCollapse() ) {
             return;
         }
         int x = 0;
+        final int half_box_size = getOptions().getDefaultNodeShapeSize() / 2;
         if ( getControlPanel().isShowTaxonomyImages()
                 && ( getImageMap() != null )
                 && !getImageMap().isEmpty()
                 && node.getNodeData().isHasTaxonomy()
                 && ( ( node.getNodeData().getTaxonomy().getUris() != null ) && !node.getNodeData().getTaxonomy()
                         .getUris().isEmpty() ) ) {
         if ( getControlPanel().isShowTaxonomyImages()
                 && ( getImageMap() != null )
                 && !getImageMap().isEmpty()
                 && node.getNodeData().isHasTaxonomy()
                 && ( ( node.getNodeData().getTaxonomy().getUris() != null ) && !node.getNodeData().getTaxonomy()
                         .getUris().isEmpty() ) ) {
-            x += drawTaxonomyImage( node.getXcoord() + 2 + TreePanel.HALF_BOX_SIZE, node.getYcoord(), node, g );
+            x += drawTaxonomyImage( node.getXcoord() + 2 + half_box_size, node.getYcoord(), node, g );
         }
         if ( ( getControlPanel().isShowTaxonomyCode() || getControlPanel().isShowTaxonomyScientificNames() || getControlPanel()
         }
         if ( ( getControlPanel().isShowTaxonomyCode() || getControlPanel().isShowTaxonomyScientificNames() || getControlPanel()
-                .isShowTaxonomyCommonNames() )
-                && node.getNodeData().isHasTaxonomy() ) {
+                .isShowTaxonomyCommonNames() ) && node.getNodeData().isHasTaxonomy() ) {
             x += paintTaxonomy( g, node, is_in_found_nodes, to_pdf, to_graphics_file, x );
         }
         if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) {
             x += paintTaxonomy( g, node, is_in_found_nodes, to_pdf, to_graphics_file, x );
         }
         if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) {
@@ -2831,6 +3013,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 _sb.append( node.getNodeData().getSequence().getAccession().getValue() );
             }
         }
                 _sb.append( node.getNodeData().getSequence().getAccession().getValue() );
             }
         }
+        if ( getControlPanel().isShowProperties() && node.getNodeData().isHasProperties() ) {
+            if ( _sb.length() > 0 ) {
+                _sb.append( " " );
+            }
+            _sb.append( propertiesToString( node ) );
+        }
         g.setFont( getTreeFontSet().getLargeFont() );
         if ( is_in_found_nodes ) {
             g.setFont( getTreeFontSet().getLargeFont().deriveFont( Font.BOLD ) );
         g.setFont( getTreeFontSet().getLargeFont() );
         if ( is_in_found_nodes ) {
             g.setFont( getTreeFontSet().getLargeFont().deriveFont( Font.BOLD ) );
@@ -2839,21 +3027,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         if ( !node.isExternal() && ( node.getNumberOfDescendants() == 1 ) ) {
             down_shift_factor = 1;
         }
         if ( !node.isExternal() && ( node.getNumberOfDescendants() == 1 ) ) {
             down_shift_factor = 1;
         }
+        final double pos_x = node.getXcoord() + x + 2 + half_box_size;
+        final double pos_y = ( node.getYcoord() + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ) );
+        final String sb_str = _sb.toString();
         // GUILHEM_BEG ______________
         // GUILHEM_BEG ______________
-        final double posX = node.getXcoord() + x + 2 + TreePanel.HALF_BOX_SIZE;
-        final double posY = ( node.getYcoord() + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ) );
-        final int CONFIDENCE_LEFT_MARGIN = 4;
-        final String sNodeText = _sb.toString();
         if ( _control_panel.isShowSequenceRelations() && node.getNodeData().isHasSequence()
                 && ( _query_sequence != null ) ) {
             int nodeTextBoundsWidth = 0;
         if ( _control_panel.isShowSequenceRelations() && node.getNodeData().isHasSequence()
                 && ( _query_sequence != null ) ) {
             int nodeTextBoundsWidth = 0;
-            if ( sNodeText.length() > 0 ) {
-                final Rectangle2D node_text_bounds = new TextLayout( sNodeText, g.getFont(), _frc ).getBounds(); //would like to remove this 'new', but how...
+            if ( sb_str.length() > 0 ) {
+                final Rectangle2D node_text_bounds = new TextLayout( sb_str, g.getFont(), _frc ).getBounds(); //would like to remove this 'new', but how...
                 nodeTextBoundsWidth = ( int ) node_text_bounds.getWidth();
             }
             if ( node.getNodeData().getSequence().equals( _query_sequence ) ) {
                 if ( nodeTextBoundsWidth > 0 ) { // invert font color and background color to show that this is the query sequence
                 nodeTextBoundsWidth = ( int ) node_text_bounds.getWidth();
             }
             if ( node.getNodeData().getSequence().equals( _query_sequence ) ) {
                 if ( nodeTextBoundsWidth > 0 ) { // invert font color and background color to show that this is the query sequence
-                    g.fillRect( ( int ) posX - 1, ( int ) posY - 8, nodeTextBoundsWidth + 5, 11 );
+                    g.fillRect( ( int ) pos_x - 1, ( int ) pos_y - 8, nodeTextBoundsWidth + 5, 11 );
                     g.setColor( getTreeColorSet().getBackgroundColor() );
                 }
             }
                     g.setColor( getTreeColorSet().getBackgroundColor() );
                 }
             }
@@ -2865,20 +3052,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                             && seqRelation.getType().equals( getControlPanel().getSequenceRelationTypeBox()
                                     .getSelectedItem() );
                     if ( fGotRelationWithQuery ) { // we will underline the text to show that this sequence is ortholog to the query
                             && seqRelation.getType().equals( getControlPanel().getSequenceRelationTypeBox()
                                     .getSelectedItem() );
                     if ( fGotRelationWithQuery ) { // we will underline the text to show that this sequence is ortholog to the query
-                        final double linePosX = node.getXcoord() + 2 + TreePanel.HALF_BOX_SIZE;
+                        final double linePosX = node.getXcoord() + 2 + half_box_size;
                         final String sConfidence = ( !getControlPanel().isShowSequenceRelationConfidence() || ( seqRelation
                                 .getConfidence() == null ) ) ? null : " (" + seqRelation.getConfidence().getValue()
                                 + ")";
                         if ( sConfidence != null ) {
                         final String sConfidence = ( !getControlPanel().isShowSequenceRelationConfidence() || ( seqRelation
                                 .getConfidence() == null ) ) ? null : " (" + seqRelation.getConfidence().getValue()
                                 + ")";
                         if ( sConfidence != null ) {
-                            double confidenceX = posX;
-                            if ( sNodeText.length() > 0 ) {
-                                confidenceX += new TextLayout( sNodeText, g.getFont(), _frc ).getBounds().getWidth()
+                            double confidenceX = pos_x;
+                            if ( sb_str.length() > 0 ) {
+                                confidenceX += new TextLayout( sb_str, g.getFont(), _frc ).getBounds().getWidth()
                                         + CONFIDENCE_LEFT_MARGIN;
                             }
                             if ( confidenceX > linePosX ) { // let's only display confidence value if we are already displaying at least one of Prot/Gene Name and Taxonomy Code 
                                 final int confidenceWidth = ( int ) new TextLayout( sConfidence, g.getFont(), _frc )
                                         .getBounds().getWidth();
                                         + CONFIDENCE_LEFT_MARGIN;
                             }
                             if ( confidenceX > linePosX ) { // let's only display confidence value if we are already displaying at least one of Prot/Gene Name and Taxonomy Code 
                                 final int confidenceWidth = ( int ) new TextLayout( sConfidence, g.getFont(), _frc )
                                         .getBounds().getWidth();
-                                TreePanel.drawString( sConfidence, confidenceX, posY, g );
+                                TreePanel.drawString( sConfidence, confidenceX, pos_y, g );
                                 x += CONFIDENCE_LEFT_MARGIN + confidenceWidth;
                             }
                         }
                                 x += CONFIDENCE_LEFT_MARGIN + confidenceWidth;
                             }
                         }
@@ -2890,16 +3077,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                             else {
                                 nodeTextBoundsWidth += 2;
                             }
                             else {
                                 nodeTextBoundsWidth += 2;
                             }
-                            g.drawLine( ( int ) linePosX + 1, 3 + ( int ) posY, ( int ) linePosX + x
-                                    + nodeTextBoundsWidth, 3 + ( int ) posY );
+                            g.drawLine( ( int ) linePosX + 1, 3 + ( int ) pos_y, ( int ) linePosX + x
+                                    + nodeTextBoundsWidth, 3 + ( int ) pos_y );
                             break;
                         }
                     }
                 }
             }
         }
                             break;
                         }
                     }
                 }
             }
         }
-        if ( sNodeText.length() > 0 ) {
-            TreePanel.drawString( sNodeText, posX, posY, g );
+        if ( sb_str.length() > 0 ) {
+            TreePanel.drawString( sb_str, pos_x, pos_y, g );
         }
         // GUILHEM_END _____________
         // COMMENTED_OUT_BY_GUILHEM_BEG _______________
         }
         // GUILHEM_END _____________
         // COMMENTED_OUT_BY_GUILHEM_BEG _______________
@@ -2923,7 +3110,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 g.setColor( calculateColorForAnnotation( ann ) );
             }
             final String ann_str = ann.asSimpleText().toString();
                 g.setColor( calculateColorForAnnotation( ann ) );
             }
             final String ann_str = ann.asSimpleText().toString();
-            TreePanel.drawString( ann_str, node.getXcoord() + x + 3 + TreePanel.HALF_BOX_SIZE, node.getYcoord()
+            TreePanel.drawString( ann_str, node.getXcoord() + x + 3 + half_box_size, node.getYcoord()
                     + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), g );
             _sb.setLength( 0 );
             _sb.append( ann_str );
                     + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), g );
             _sb.setLength( 0 );
             _sb.append( ann_str );
@@ -2944,7 +3131,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 }
                 if ( getControlPanel().isShowBinaryCharacters() ) {
                     TreePanel.drawString( node.getNodeData().getBinaryCharacters().getPresentCharactersAsStringBuffer()
                 }
                 if ( getControlPanel().isShowBinaryCharacters() ) {
                     TreePanel.drawString( node.getNodeData().getBinaryCharacters().getPresentCharactersAsStringBuffer()
-                            .toString(), node.getXcoord() + x + 1 + TreePanel.HALF_BOX_SIZE, node.getYcoord()
+                            .toString(), node.getXcoord() + x + 1 + half_box_size, node.getYcoord()
                             + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), g );
                     paintGainedAndLostCharacters( g, node, node.getNodeData().getBinaryCharacters()
                             .getGainedCharactersAsStringBuffer().toString(), node.getNodeData().getBinaryCharacters()
                             + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), g );
                     paintGainedAndLostCharacters( g, node, node.getNodeData().getBinaryCharacters()
                             .getGainedCharactersAsStringBuffer().toString(), node.getNodeData().getBinaryCharacters()
@@ -2963,14 +3150,15 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                         }
                         final double mean = ForesterUtil.round( sum / count, 1 );
                         TreePanel.drawString( " " + node.getNodeData().getBinaryCharacters().getPresentCount() + " ["
                         }
                         final double mean = ForesterUtil.round( sum / count, 1 );
                         TreePanel.drawString( " " + node.getNodeData().getBinaryCharacters().getPresentCount() + " ["
-                                + mean + "]", node.getXcoord() + x + 4 + TreePanel.HALF_BOX_SIZE, node.getYcoord()
+                                + mean + "]", node.getXcoord() + x + 4 + half_box_size, node.getYcoord()
                                 + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), g );
                     }
                     else {
                                 + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), g );
                     }
                     else {
-                        TreePanel.drawString( " " + node.getNodeData().getBinaryCharacters().getPresentCount(), node
-                                .getXcoord()
-                                + x + 4 + TreePanel.HALF_BOX_SIZE, node.getYcoord()
-                                + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), g );
+                        TreePanel.drawString( " " + node.getNodeData().getBinaryCharacters().getPresentCount(),
+                                              node.getXcoord() + x + 4 + half_box_size,
+                                              node.getYcoord()
+                                                      + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ),
+                                              g );
                     }
                     paintGainedAndLostCharacters( g, node, "+"
                             + node.getNodeData().getBinaryCharacters().getGainedCount(), "-"
                     }
                     paintGainedAndLostCharacters( g, node, "+"
                             + node.getNodeData().getBinaryCharacters().getGainedCount(), "-"
@@ -2980,6 +3168,36 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
     }
 
         }
     }
 
+    private StringBuffer propertiesToString( final PhylogenyNode node ) {
+        final PropertiesMap properties = node.getNodeData().getProperties();
+        final StringBuffer sb = new StringBuffer();
+        boolean first = true;
+        for( final String ref : properties.getPropertyRefs() ) {
+            if ( first ) {
+                first = false;
+            }
+            else {
+                sb.append( " " );
+            }
+            final Property p = properties.getProperty( ref );
+            sb.append( getPartAfterColon( p.getRef() ) );
+            sb.append( "=" );
+            sb.append( p.getValue() );
+            if ( !ForesterUtil.isEmpty( p.getUnit() ) ) {
+                sb.append( getPartAfterColon( p.getUnit() ) );
+            }
+        }
+        return sb;
+    }
+
+    final private static String getPartAfterColon( final String s ) {
+        final int i = s.indexOf( ':' );
+        if ( ( i < 1 ) || ( i == ( s.length() - 1 ) ) ) {
+            return s;
+        }
+        return s.substring( i + 1, s.length() );
+    }
+
     private double drawTaxonomyImage( final double x, final double y, final PhylogenyNode node, final Graphics2D g ) {
         final List<Uri> us = new ArrayList<Uri>();
         for( final Taxonomy t : node.getNodeData().getTaxonomies() ) {
     private double drawTaxonomyImage( final double x, final double y, final PhylogenyNode node, final Graphics2D g ) {
         final List<Uri> us = new ArrayList<Uri>();
         for( final Taxonomy t : node.getNodeData().getTaxonomies() ) {
@@ -3006,8 +3224,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                         final int x_w = ( int ) ( x + ws + 0.5 );
                         final int y_h = ( int ) ( my_y + hs + 0.5 );
                         if ( ( x_w - x > 7 ) && ( y_h - my_y > 7 ) ) {
                         final int x_w = ( int ) ( x + ws + 0.5 );
                         final int y_h = ( int ) ( my_y + hs + 0.5 );
                         if ( ( x_w - x > 7 ) && ( y_h - my_y > 7 ) ) {
-                            g.drawImage( bi, ( int ) ( x + 0.5 + offset ), ( int ) ( my_y + 0.5 ), x_w, y_h, 0, 0, bi
-                                    .getWidth(), bi.getHeight(), null );
+                            g.drawImage( bi,
+                                         ( int ) ( x + 0.5 + offset ),
+                                         ( int ) ( my_y + 0.5 ),
+                                         x_w,
+                                         y_h,
+                                         0,
+                                         0,
+                                         bi.getWidth(),
+                                         bi.getHeight(),
+                                         null );
                             ws += 8;
                         }
                         else {
                             ws += 8;
                         }
                         else {
@@ -3219,7 +3445,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             ++_external_node_index;
         }
         // Confidence values
             ++_external_node_index;
         }
         // Confidence values
-        if ( getControlPanel().isShowBootstrapValues()
+        if ( getControlPanel().isShowConfidenceValues()
                 && !node.isExternal()
                 && !node.isRoot()
                 && ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED )
                 && !node.isExternal()
                 && !node.isRoot()
                 && ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED )
@@ -3290,6 +3516,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 child_node.setYcoord( y2 );
                 y2 += _y_distance * child_node.getNumberOfExternalNodes();
             }
                 child_node.setYcoord( y2 );
                 y2 += _y_distance * child_node.getNumberOfExternalNodes();
             }
+            paintNodeBox( node.getXcoord(), node.getYcoord(), node, g, to_pdf, to_graphics_file, isInFoundNodes( node ) );
         }
         if ( dynamically_hide
                 && !is_in_found_nodes
         }
         if ( dynamically_hide
                 && !is_in_found_nodes
@@ -3321,17 +3548,34 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 }
                 catch ( final ClassCastException cce ) {
                     cce.printStackTrace();
                 }
                 catch ( final ClassCastException cce ) {
                     cce.printStackTrace();
-                    return;
                 }
                 }
-                rds.setRenderingHeight( 6 );
-                int x = 0;
-                if ( getControlPanel().isShowTaxonomyCode() && ( PhylogenyMethods.getSpecies( node ).length() > 0 ) ) {
-                    x += getTreeFontSet()._fm_large_italic.stringWidth( PhylogenyMethods.getSpecies( node ) + " " );
-                }
-                if ( getControlPanel().isShowNodeNames() && ( node.getName().length() > 0 ) ) {
-                    x += getTreeFontSet()._fm_large.stringWidth( node.getName() + " " );
+                if ( rds != null ) {
+                    rds.setRenderingHeight( 6 );
+                    int x = 0;
+                    if ( getControlPanel().isShowTaxonomyCode()
+                            && ( !ForesterUtil.isEmpty( PhylogenyMethods.getSpecies( node ) ) ) ) {
+                        x += getTreeFontSet()._fm_large_italic.stringWidth( PhylogenyMethods.getSpecies( node ) + " " );
+                    }
+                    if ( getControlPanel().isShowGeneNames()
+                            && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getName() ) ) ) {
+                        x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getName() + " " );
+                    }
+                    if ( getControlPanel().isShowGeneSymbols()
+                            && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getSymbol() ) ) ) {
+                        x += getTreeFontSet()._fm_large
+                                .stringWidth( node.getNodeData().getSequence().getSymbol() + " " );
+                    }
+                    if ( getControlPanel().isShowSequenceAcc()
+                            && ( node.getNodeData().getSequence().getAccession() != null ) ) {
+                        x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getAccession()
+                                .toString()
+                                + " " );
+                    }
+                    if ( getControlPanel().isShowNodeNames() && ( node.getName().length() > 0 ) ) {
+                        x += getTreeFontSet()._fm_large.stringWidth( node.getName() + " " );
+                    }
+                    rds.render( node.getXcoord() + x, node.getYcoord() - 3, g, this, to_pdf );
                 }
                 }
-                rds.render( node.getXcoord() + x, node.getYcoord() - 3, g, this, to_pdf );
             }
         }
         //////////////
             }
         }
         //////////////
@@ -3340,18 +3584,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             final RenderableVector rv = RenderableVector.createInstance( node.getNodeData().getVector(),
                                                                          getStatisticsForExpressionValues(),
                                                                          getConfiguration() );
             final RenderableVector rv = RenderableVector.createInstance( node.getNodeData().getVector(),
                                                                          getStatisticsForExpressionValues(),
                                                                          getConfiguration() );
-            int x = 0;
-            PhylogenyNode my_node = node;
-            if ( !getControlPanel().isDrawPhylogram() ) {
-                my_node = getPhylogeny().getFirstExternalNode();
-            }
-            if ( getControlPanel().isShowTaxonomyCode() && ( PhylogenyMethods.getSpecies( my_node ).length() > 0 ) ) {
-                x += getTreeFontSet()._fm_large_italic.stringWidth( PhylogenyMethods.getSpecies( my_node ) + " " );
-            }
-            if ( getControlPanel().isShowNodeNames() && ( my_node.getName().length() > 0 ) ) {
-                x += getTreeFontSet()._fm_large.stringWidth( my_node.getName() + " " );
+            if ( rv != null ) {
+                int x = 0;
+                PhylogenyNode my_node = node;
+                if ( !getControlPanel().isDrawPhylogram() ) {
+                    my_node = getPhylogeny().getFirstExternalNode();
+                }
+                if ( getControlPanel().isShowTaxonomyCode() && ( PhylogenyMethods.getSpecies( my_node ).length() > 0 ) ) {
+                    x += getTreeFontSet()._fm_large_italic.stringWidth( PhylogenyMethods.getSpecies( my_node ) + " " );
+                }
+                if ( getControlPanel().isShowNodeNames() && ( my_node.getName().length() > 0 ) ) {
+                    x += getTreeFontSet()._fm_large.stringWidth( my_node.getName() + " " );
+                }
+                rv.render( my_node.getXcoord() + x, node.getYcoord() - 5, g, this, to_pdf );
             }
             }
-            rv.render( my_node.getXcoord() + x, node.getYcoord() - 5, g, this, to_pdf );
         }
         //////////////
     }
         }
         //////////////
     }
@@ -3395,10 +3641,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                final int graphics_file_height,
                                final int graphics_file_x,
                                final int graphics_file_y ) {
                                final int graphics_file_height,
                                final int graphics_file_x,
                                final int graphics_file_y ) {
-        /* GUILHEM_BEG */
-        // System.out.println( "p" + ( xxx++ ) );
-        _query_sequence = _control_panel.getSelectedQuerySequence();
-        /* GUILHEM_END */
+        if ( _control_panel.isShowSequenceRelations() ) {
+            _query_sequence = _control_panel.getSelectedQuerySequence();
+        }
         // Color the background
         if ( !to_pdf ) {
             final Rectangle r = getVisibleRect();
         // Color the background
         if ( !to_pdf ) {
             final Rectangle r = getVisibleRect();
@@ -3461,9 +3706,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                     getControlPanel().setDynamicHidingIsOn( false );
                 }
             }
                     getControlPanel().setDynamicHidingIsOn( false );
                 }
             }
-            final PhylogenyNodeIterator it;
-            for( it = _phylogeny.iteratorPreorder(); it.hasNext(); ) {
-                paintNodeRectangular( g, it.next(), to_pdf, getControlPanel().isDynamicallyHideData()
+            if ( _nodes_in_preorder == null ) {
+                _nodes_in_preorder = new PhylogenyNode[ _phylogeny.getNodeCount() ];
+                int i = 0;
+                for( final PhylogenyNodeIterator it = _phylogeny.iteratorPreorder(); it.hasNext(); ) {
+                    _nodes_in_preorder[ i++ ] = it.next();
+                }
+            }
+            //final PhylogenyNodeIterator it;
+            //for( it = _phylogeny.iteratorPreorder(); it.hasNext(); ) {
+            //    paintNodeRectangular( g, it.next(), to_pdf, getControlPanel().isDynamicallyHideData()
+            //            && ( dynamic_hiding_factor > 1 ), dynamic_hiding_factor, to_graphics_file );
+            //}
+            for( int i = 0; i < _nodes_in_preorder.length; ++i ) {
+                paintNodeRectangular( g, _nodes_in_preorder[ i ], to_pdf, getControlPanel().isDynamicallyHideData()
                         && ( dynamic_hiding_factor > 1 ), dynamic_hiding_factor, to_graphics_file );
             }
             if ( getOptions().isShowScale() && getControlPanel().isDrawPhylogram() && ( getScaleDistance() > 0.0 ) ) {
                         && ( dynamic_hiding_factor > 1 ), dynamic_hiding_factor, to_graphics_file );
             }
             if ( getOptions().isShowScale() && getControlPanel().isDrawPhylogram() && ( getScaleDistance() > 0.0 ) ) {
@@ -3584,9 +3840,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 .setXSecondary( ( float ) ( getVisibleRect().x + getOvXPosition() + ( MOVE / ( getVisibleRect().width / getOvRectangle()
                         .getWidth() ) ) ) );
         _phylogeny.getRoot().setYSecondary( ( getVisibleRect().y + getOvYStart() ) );
                 .setXSecondary( ( float ) ( getVisibleRect().x + getOvXPosition() + ( MOVE / ( getVisibleRect().width / getOvRectangle()
                         .getWidth() ) ) ) );
         _phylogeny.getRoot().setYSecondary( ( getVisibleRect().y + getOvYStart() ) );
-        final PhylogenyNodeIterator it;
-        for( it = _phylogeny.iteratorPreorder(); it.hasNext(); ) {
-            paintNodeLite( g, it.next() );
+        //final PhylogenyNodeIterator it;
+        //for( it = _phylogeny.iteratorPreorder(); it.hasNext(); ) {
+        //    paintNodeLite( g, it.next() );
+        //}
+        for( int i = 0; i < _nodes_in_preorder.length; ++i ) {
+            paintNodeLite( g, _nodes_in_preorder[ i ] );
         }
         paintOvRectangle( g );
     }
         }
         paintOvRectangle( g );
     }
@@ -3675,7 +3934,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         else {
             g.setColor( getTreeColorSet().getTaxonomyColor() );
         }
         else {
             g.setColor( getTreeColorSet().getTaxonomyColor() );
         }
-        final double start_x = node.getXcoord() + 3 + TreePanel.HALF_BOX_SIZE + x_shift;
+        final double start_x = node.getXcoord() + 3 + ( getOptions().getDefaultNodeShapeSize() / 2 ) + x_shift;
         final double start_y = node.getYcoord()
                 + ( getTreeFontSet()._fm_large.getAscent() / ( node.getNumberOfDescendants() == 1 ? 1 : 3.0 ) );
         _sb.setLength( 0 );
         final double start_y = node.getYcoord()
                 + ( getTreeFontSet()._fm_large.getAscent() / ( node.getNumberOfDescendants() == 1 ? 1 : 3.0 ) );
         _sb.setLength( 0 );
@@ -3732,8 +3991,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
         final String label = _sb.toString();
         /* GUILHEM_BEG */
         }
         final String label = _sb.toString();
         /* GUILHEM_BEG */
-        if ( ( label.length() > 0 ) && ( node.getNodeData().isHasSequence() )
-                && node.getNodeData().getSequence().equals( _query_sequence ) ) {
+        if ( _control_panel.isShowSequenceRelations() && ( label.length() > 0 )
+                && ( node.getNodeData().isHasSequence() ) && node.getNodeData().getSequence().equals( _query_sequence ) ) {
             // invert font color and background color to show that this is the query sequence
             final Rectangle2D nodeTextBounds = new TextLayout( label, g.getFont(), new FontRenderContext( null,
                                                                                                           false,
             // invert font color and background color to show that this is the query sequence
             final Rectangle2D nodeTextBounds = new TextLayout( label, g.getFont(), new FontRenderContext( null,
                                                                                                           false,
@@ -3774,7 +4033,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         if ( n.isRoot() ) {
             n.setXcoord( getWidth() / 2 );
             n.setYcoord( getHeight() / 2 );
         if ( n.isRoot() ) {
             n.setXcoord( getWidth() / 2 );
             n.setYcoord( getHeight() / 2 );
-            paintNodeBox( n.getXcoord(), n.getYcoord(), n, g, to_pdf, to_graphics_file, isInFoundNodes( n ) );
         }
         if ( n.isExternal() ) {
             paintNodeDataUnrootedCirc( g,
         }
         if ( n.isExternal() ) {
             paintNodeDataUnrootedCirc( g,
@@ -3827,11 +4085,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             final float new_y = ( float ) ( y + Math.sin( mid_angle ) * length );
             desc.setXcoord( new_x );
             desc.setYcoord( new_y );
             final float new_y = ( float ) ( y + Math.sin( mid_angle ) * length );
             desc.setXcoord( new_x );
             desc.setYcoord( new_y );
-            paintNodeBox( new_x, new_y, desc, g, to_pdf, to_graphics_file, isInFoundNodes( desc ) );
             paintUnrooted( desc, current_angle, current_angle + arc_size, radial_labels, g, to_pdf, to_graphics_file );
             current_angle += arc_size;
             assignGraphicsForBranchWithColorForParentBranch( desc, false, g, to_pdf, to_graphics_file );
             drawLine( x, y, new_x, new_y, g );
             paintUnrooted( desc, current_angle, current_angle + arc_size, radial_labels, g, to_pdf, to_graphics_file );
             current_angle += arc_size;
             assignGraphicsForBranchWithColorForParentBranch( desc, false, g, to_pdf, to_graphics_file );
             drawLine( x, y, new_x, new_y, g );
+            paintNodeBox( new_x, new_y, desc, g, to_pdf, to_graphics_file, isInFoundNodes( desc ) );
+        }
+        if ( n.isRoot() ) {
+            paintNodeBox( n.getXcoord(), n.getYcoord(), n, g, to_pdf, to_graphics_file, isInFoundNodes( n ) );
         }
     }
 
         }
     }
 
@@ -3948,6 +4209,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
         node_ids.add( node.getId() );
         getCopiedAndPastedNodes().addAll( node_ids );
         }
         node_ids.add( node.getId() );
         getCopiedAndPastedNodes().addAll( node_ids );
+        setNodeInPreorderToNull();
         _phylogeny.externalNodesHaveChanged();
         _phylogeny.hashIDs();
         _phylogeny.recalculateNumberOfExternalDescendants( true );
         _phylogeny.externalNodesHaveChanged();
         _phylogeny.hashIDs();
         _phylogeny.recalculateNumberOfExternalDescendants( true );
@@ -4023,6 +4285,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         getPhylogeny().reRoot( node );
         getPhylogeny().recalculateNumberOfExternalDescendants( true );
         resetNodeIdToDistToLeafMap();
         getPhylogeny().reRoot( node );
         getPhylogeny().recalculateNumberOfExternalDescendants( true );
         resetNodeIdToDistToLeafMap();
+        setNodeInPreorderToNull();
         resetPreferredSize();
         getMainPanel().adjustJScrollPane();
         repaint();
         resetPreferredSize();
         getMainPanel().adjustJScrollPane();
         repaint();
@@ -4066,7 +4329,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         setPreferredSize( new Dimension( x, y ) );
     }
 
         setPreferredSize( new Dimension( x, y ) );
     }
 
-    final void setArrowCursor() {
+    public final void setArrowCursor() {
         setCursor( ARROW_CURSOR );
         repaint();
     }
         setCursor( ARROW_CURSOR );
         repaint();
     }
@@ -4083,7 +4346,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         getMainPanel().setCutOrCopiedTree( cut_or_copied_tree );
     }
 
         getMainPanel().setCutOrCopiedTree( cut_or_copied_tree );
     }
 
-    final void setEdited( final boolean edited ) {
+    public final void setEdited( final boolean edited ) {
         _edited = edited;
     }
 
         _edited = edited;
     }
 
@@ -4161,7 +4424,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
      * @param x
      * @param y
      */
      * @param x
      * @param y
      */
-    final void setParametersForPainting( final int x, final int y, final boolean recalc_longest_ext_node_info ) {
+    public final void setParametersForPainting( final int x, final int y, final boolean recalc_longest_ext_node_info ) {
         // updateStyle(); not needed?
         if ( ( _phylogeny != null ) && !_phylogeny.isEmpty() ) {
             initNodeData();
         // updateStyle(); not needed?
         if ( ( _phylogeny != null ) && !_phylogeny.isEmpty() ) {
             initNodeData();
@@ -4281,10 +4544,15 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
      * @param t
      *            an instance of a Phylogeny
      */
      * @param t
      *            an instance of a Phylogeny
      */
-    final void setTree( final Phylogeny t ) {
+    public final void setTree( final Phylogeny t ) {
+        setNodeInPreorderToNull();
         _phylogeny = t;
     }
 
         _phylogeny = t;
     }
 
+    final void setNodeInPreorderToNull() {
+        _nodes_in_preorder = null;
+    }
+
     final void setTreeFile( final File treefile ) {
         _treefile = treefile;
     }
     final void setTreeFile( final File treefile ) {
         _treefile = treefile;
     }
@@ -4315,7 +4583,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         _urt_factor_ov = urt_factor_ov;
     }
 
         _urt_factor_ov = urt_factor_ov;
     }
 
-    final void setWaitCursor() {
+    public final void setWaitCursor() {
         setCursor( WAIT_CURSOR );
         repaint();
     }
         setCursor( WAIT_CURSOR );
         repaint();
     }
@@ -4488,9 +4756,30 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                             _popup_buffer.append( confidence.getType() );
                             _popup_buffer.append( "] " );
                         }
                             _popup_buffer.append( confidence.getType() );
                             _popup_buffer.append( "] " );
                         }
-                        _popup_buffer.append( FORMATTER_CONFIDENCE.format( ForesterUtil
-                                .round( confidence.getValue(), getOptions()
-                                        .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) );
+                        _popup_buffer
+                                .append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( confidence.getValue(),
+                                                                                          getOptions()
+                                                                                                  .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) );
+                        if ( confidence.getStandardDeviation() != Confidence.CONFIDENCE_DEFAULT_VALUE ) {
+                            _popup_buffer.append( " (sd=" );
+                            _popup_buffer.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( confidence
+                                    .getStandardDeviation(), getOptions()
+                                    .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) );
+                            _popup_buffer.append( ")" );
+                        }
+                    }
+                }
+                if ( node.getNodeData().isHasProperties() ) {
+                    final PropertiesMap properties = node.getNodeData().getProperties();
+                    for( final String ref : properties.getPropertyRefs() ) {
+                        _popup_buffer.append( "\n" );
+                        final Property p = properties.getProperty( ref );
+                        _popup_buffer.append( getPartAfterColon( p.getRef() ) );
+                        _popup_buffer.append( "=" );
+                        _popup_buffer.append( p.getValue() );
+                        if ( !ForesterUtil.isEmpty( p.getUnit() ) ) {
+                            _popup_buffer.append( getPartAfterColon( p.getUnit() ) );
+                        }
                     }
                 }
                 if ( _popup_buffer.length() > 0 ) {
                     }
                 }
                 if ( _popup_buffer.length() > 0 ) {
@@ -4570,6 +4859,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                            JOptionPane.WARNING_MESSAGE );
             return;
         }
                                            JOptionPane.WARNING_MESSAGE );
             return;
         }
+        setNodeInPreorderToNull();
         if ( !node.isExternal() && !node.isRoot() && ( _subtree_index <= ( TreePanel.MAX_SUBTREES - 1 ) ) ) {
             _sub_phylogenies[ _subtree_index ] = _phylogeny;
             _sub_phylogenies_temp_roots[ _subtree_index ] = node;
         if ( !node.isExternal() && !node.isRoot() && ( _subtree_index <= ( TreePanel.MAX_SUBTREES - 1 ) ) ) {
             _sub_phylogenies[ _subtree_index ] = _phylogeny;
             _sub_phylogenies_temp_roots[ _subtree_index ] = node;
@@ -4606,6 +4896,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     }
 
     final void superTree() {
     }
 
     final void superTree() {
+        setNodeInPreorderToNull();
         final PhylogenyNode temp_root = _sub_phylogenies_temp_roots[ _subtree_index - 1 ];
         for( final PhylogenyNode n : temp_root.getDescendants() ) {
             n.setParent( temp_root );
         final PhylogenyNode temp_root = _sub_phylogenies_temp_roots[ _subtree_index - 1 ];
         for( final PhylogenyNode n : temp_root.getDescendants() ) {
             n.setParent( temp_root );
@@ -4619,6 +4910,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     final void swap( final PhylogenyNode node ) {
         if ( !node.isExternal() ) {
             _phylogeny.swapChildren( node );
     final void swap( final PhylogenyNode node ) {
         if ( !node.isExternal() ) {
             _phylogeny.swapChildren( node );
+            setNodeInPreorderToNull();
         }
         repaint();
     }
         }
         repaint();
     }
@@ -4689,7 +4981,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             return;
         }
         setWaitCursor();
             return;
         }
         setWaitCursor();
-        Util.colorPhylogenyAccordingToExternalTaxonomy( _phylogeny, this );
+        AptxUtil.colorPhylogenyAccordingToExternalTaxonomy( _phylogeny, this );
         _control_panel.setColorBranches( true );
         if ( _control_panel.getColorBranchesCb() != null ) {
             _control_panel.getColorBranchesCb().setSelected( true );
         _control_panel.setColorBranches( true );
         if ( _control_panel.getColorBranchesCb() != null ) {
             _control_panel.getColorBranchesCb().setSelected( true );
@@ -4832,11 +5124,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
     }
 
         }
     }
 
-    synchronized void setImageMap( final Hashtable<String, BufferedImage> image_map ) {
+    public synchronized void setImageMap( final Hashtable<String, BufferedImage> image_map ) {
         getMainPanel().setImageMap( image_map );
     }
 
         getMainPanel().setImageMap( image_map );
     }
 
-    synchronized Hashtable<String, BufferedImage> getImageMap() {
+    public synchronized Hashtable<String, BufferedImage> getImageMap() {
         return getMainPanel().getImageMap();
     }
 }
         return getMainPanel().getImageMap();
     }
 }