cleanup
[jalview.git] / forester / java / src / org / forester / archaeopteryx / TreePanel.java
index c020b28..6ce838e 100644 (file)
@@ -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.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;
@@ -134,16 +136,15 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     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                HALF_BOX_SIZE_PLUS_WIGGLE         = HALF_BOX_SIZE + WIGGLE;
+    private final int                       _half_box_size_plus_wiggle;
     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,
@@ -215,6 +216,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     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();
     final private static Font               POPUP_FONT                        = new Font( Configuration.getDefaultFontFamilyName(),
@@ -227,6 +230,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                                                                                        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;
@@ -262,6 +266,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         _configuration = configuration;
         _phylogeny = t;
         _phy_has_branch_lengths = ForesterUtil.isHasAtLeastOneBranchLengthLargerThanZero( _phylogeny );
+        _box_size = tjp.getOptions().getDefaultNodeBoxSize();
+        _half_box_size = tjp.getOptions().getDefaultNodeBoxSize() / 2;
+        _half_box_size_plus_wiggle = _half_box_size + WIGGLE;
         init();
         // if ( !_phylogeny.isEmpty() ) {
         _phylogeny.recalculateNumberOfExternalDescendants( true );
@@ -402,6 +409,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         else {
             phy.addAsChild( node );
         }
+        _nodes_in_preorder = null;
         _phylogeny.externalNodesHaveChanged();
         _phylogeny.hashIDs();
         _phylogeny.recalculateNumberOfExternalDescendants( true );
@@ -687,6 +695,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             _phylogeny.recalculateNumberOfExternalDescendants( true );
             resetNodeIdToDistToLeafMap();
             calculateLongestExtNodeInfo();
+            _nodes_in_preorder = null;
             resetPreferredSize();
             updateOvSizes();
             _main_panel.adjustJScrollPane();
@@ -703,6 +712,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         _phylogeny.recalculateNumberOfExternalDescendants( true );
         resetNodeIdToDistToLeafMap();
         calculateLongestExtNodeInfo();
+        _nodes_in_preorder = null;
         resetPreferredSize();
         _main_panel.adjustJScrollPane();
         setArrowCursor();
@@ -767,6 +777,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             errorMessageNoCutCopyPasteInUnrootedDisplay();
             return;
         }
+        _nodes_in_preorder = null;
         setCutOrCopiedTree( _phylogeny.copy( node ) );
         final List<PhylogenyNode> nodes = PhylogenyMethods.getAllDescendants( node );
         final Set<Integer> node_ids = new HashSet<Integer>( nodes.size() );
@@ -798,6 +809,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         if ( r != JOptionPane.OK_OPTION ) {
             return;
         }
+        _nodes_in_preorder = null;
         setCopiedAndPastedNodes( null );
         setCutOrCopiedTree( _phylogeny.copy( node ) );
         _phylogeny.deleteSubtree( node, true );
@@ -852,6 +864,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                                     null,
                                                     options,
                                                     options[ 2 ] );
+        _nodes_in_preorder = null;
         boolean node_only = true;
         if ( r == 1 ) {
             node_only = false;
@@ -930,6 +943,54 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         g.fill( _rectangle );
     }
 
+    //TODO FIXME
+    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 );
+        }
+    }
+
+    //TODO FIXME
+    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",
@@ -951,10 +1012,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         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;
             }
         }
@@ -1089,7 +1150,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
      * 
      * @return a pointer to the phylogeny
      */
-    final Phylogeny getPhylogeny() {
+    public final Phylogeny getPhylogeny() {
         return _phylogeny;
     }
 
@@ -1694,6 +1755,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                            JOptionPane.WARNING_MESSAGE );
             return;
         }
+        _nodes_in_preorder = null;
         setWaitCursor();
         PhylogenyMethods.midpointRoot( _phylogeny );
         resetNodeIdToDistToLeafMap();
@@ -2274,40 +2336,40 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                     || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) ) {
                 boolean draw_vertical = true;
                 final PhylogenyNode parent = node.getParent();
-                if ( ( ( getOptions().isShowNodeBoxes() && !to_pdf && !to_graphics_file ) || ( ( getControlPanel()
+                if ( ( ( ( getOptions().getDefaultNodeShape() != Options.NodeShape.NONE ) && !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 ) {
+                        if ( Math.abs( y2 - y1 ) <= _half_box_size ) {
                             draw_vertical = false;
                         }
                         else {
                             if ( y1 < y2 ) {
-                                y1 += TreePanel.HALF_BOX_SIZE;
+                                y1 += _half_box_size;
                             }
                             else {
                                 if ( !to_pdf ) {
-                                    y1 -= TreePanel.HALF_BOX_SIZE + 1;
+                                    y1 -= _half_box_size + 1;
                                 }
                                 else {
-                                    y1 -= TreePanel.HALF_BOX_SIZE;
+                                    y1 -= _half_box_size;
                                 }
                             }
                         }
                     }
-                    if ( ( x2 - x1 ) <= TreePanel.HALF_BOX_SIZE ) {
+                    if ( ( x2 - x1 ) <= _half_box_size ) {
                         draw_horizontal = false;
                     }
                     else if ( !draw_vertical ) {
-                        x1a += TreePanel.HALF_BOX_SIZE;
+                        x1a += _half_box_size;
                     }
-                    if ( ( ( x2 - x1a ) > TreePanel.HALF_BOX_SIZE )
+                    if ( ( ( x2 - x1a ) > _half_box_size )
                             && !( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() && !node
                                     .isDuplication() ) ) {
-                        x2a -= TreePanel.HALF_BOX_SIZE;
+                        x2a -= _half_box_size;
                     }
                 }
                 if ( draw_vertical ) {
@@ -2404,7 +2466,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 g.draw( _arc );
             }
         }
-        paintNodeBox( x2, y2, node, g, to_pdf, to_graphics_file, isInFoundNodes( node ) );
+        //TODO new *****
+        if ( node.isExternal() ) {
+            //TODO new *****
+            paintNodeBox( x2, y2, node, g, to_pdf, to_graphics_file, isInFoundNodes( node ) );
+        }
     }
 
     final void paintCircular( final Phylogeny phy,
@@ -2419,7 +2485,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         _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;
@@ -2432,6 +2497,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             current_angle += ( TWO_PI / _circ_num_ext_nodes );
         }
         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 ) );
     }
 
     final void paintCircularLite( final Phylogeny phy,
@@ -2466,7 +2532,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                          final boolean to_graphics_file ) {
         if ( n.isExternal() ) {
             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() );
         }
@@ -2554,15 +2620,15 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         else {
             d = ( Math.log10( d ) * _y_distance ) / 2.5;
         }
-        if ( d < BOX_SIZE ) {
-            d = BOX_SIZE;
+        if ( d < _box_size ) {
+            d = _box_size;
         }
         _polygon.reset();
-        _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() - TreePanel.BOX_SIZE ),
+        _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() - _box_size ),
                            ForesterUtil.roundToInt( node.getYcoord() ) );
-        _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() + TreePanel.BOX_SIZE ),
+        _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() + _box_size ),
                            ForesterUtil.roundToInt( node.getYcoord() - d ) );
-        _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() + TreePanel.BOX_SIZE ),
+        _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() + _box_size ),
                            ForesterUtil.roundToInt( node.getYcoord() + d ) );
         g.fillPolygon( _polygon );
         paintNodeData( g, node, to_graphics_file, to_pdf, is_in_found_nodes );
@@ -2656,7 +2722,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
 
     final private void paintFoundNode( final int x, final int y, final Graphics2D g ) {
         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,
@@ -2731,15 +2797,33 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             else {
                 assignGraphicsForNodeBoxWithColorForParentBranch( node, g );
             }
-            if ( ( getOptions().isShowNodeBoxes() && !to_pdf && !to_graphics_file )
+            if ( ( ( getOptions().getDefaultNodeShape() != Options.NodeShape.NONE ) && !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 );
+                        //TODO FIXME
+                        //drawOvalFilled( x - _half_box_size, y - _half_box_size, _box_size, _box_size, g );
+                        drawOvalGradient( x - _half_box_size,
+                                          y - _half_box_size,
+                                          _box_size,
+                                          _box_size,
+                                          g,
+                                          Color.BLACK,
+                                          g.getColor(),
+                                          g.getColor() );
                     }
                 }
                 else {
-                    drawRectFilled( x - HALF_BOX_SIZE, y - HALF_BOX_SIZE, BOX_SIZE, BOX_SIZE, g );
+                    //TODO FIXME
+                    //drawRectFilled( x - HALF_BOX_SIZE, y - HALF_BOX_SIZE, BOX_SIZE, BOX_SIZE, g );
+                    drawOvalGradient( x - _half_box_size,
+                                      y - _half_box_size,
+                                      _box_size,
+                                      _box_size,
+                                      g,
+                                      Color.BLACK,
+                                      g.getColor(),
+                                      g.getColor() );
                 }
             }
         }
@@ -2769,7 +2853,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 && 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()
                 .isShowTaxonomyCommonNames() ) && node.getNodeData().isHasTaxonomy() ) {
@@ -2838,21 +2922,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         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 ______________
-        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 ( 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
-                    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() );
                 }
             }
@@ -2864,20 +2947,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
-                        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 ) {
-                            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();
-                                TreePanel.drawString( sConfidence, confidenceX, posY, g );
+                                TreePanel.drawString( sConfidence, confidenceX, pos_y, g );
                                 x += CONFIDENCE_LEFT_MARGIN + confidenceWidth;
                             }
                         }
@@ -2889,16 +2972,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                             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;
                         }
                     }
                 }
             }
         }
-        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 _______________
@@ -2922,7 +3005,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 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 );
@@ -2943,7 +3026,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 }
                 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()
@@ -2962,12 +3045,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                         }
                         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 {
                         TreePanel.drawString( " " + node.getNodeData().getBinaryCharacters().getPresentCount(),
-                                              node.getXcoord() + x + 4 + TreePanel.HALF_BOX_SIZE,
+                                              node.getXcoord() + x + 4 + _half_box_size,
                                               node.getYcoord()
                                                       + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ),
                                               g );
@@ -3298,6 +3381,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 child_node.setYcoord( y2 );
                 y2 += _y_distance * child_node.getNumberOfExternalNodes();
             }
+            //TODO new *****
+            paintNodeBox( node.getXcoord(), node.getYcoord(), node, g, to_pdf, to_graphics_file, isInFoundNodes( node ) );
+            //TODO new *****
         }
         if ( dynamically_hide
                 && !is_in_found_nodes
@@ -3336,6 +3422,17 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 if ( getControlPanel().isShowTaxonomyCode() && ( PhylogenyMethods.getSpecies( node ).length() > 0 ) ) {
                     x += getTreeFontSet()._fm_large_italic.stringWidth( PhylogenyMethods.getSpecies( node ) + " " );
                 }
+                if ( getControlPanel().isShowGeneNames() ) {
+                    x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getName() + " " );
+                }
+                if ( getControlPanel().isShowGeneSymbols() ) {
+                    x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getSymbol() + " " );
+                }
+                if ( getControlPanel().isShowSequenceAcc() ) {
+                    x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getAccession()
+                            .toString()
+                            + " " );
+                }
                 if ( getControlPanel().isShowNodeNames() && ( node.getName().length() > 0 ) ) {
                     x += getTreeFontSet()._fm_large.stringWidth( node.getName() + " " );
                 }
@@ -3403,10 +3500,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 ) {
-        /* 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();
@@ -3469,9 +3565,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                     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 ) ) {
@@ -3592,9 +3699,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() ) );
-        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 );
     }
@@ -3683,7 +3793,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         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 + _half_box_size + x_shift;
         final double start_y = node.getYcoord()
                 + ( getTreeFontSet()._fm_large.getAscent() / ( node.getNumberOfDescendants() == 1 ? 1 : 3.0 ) );
         _sb.setLength( 0 );
@@ -3740,8 +3850,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
         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,
@@ -3782,7 +3892,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         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,
@@ -3835,11 +3944,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 );
-            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 );
+            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 ) );
         }
     }
 
@@ -3956,6 +4068,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
         node_ids.add( node.getId() );
         getCopiedAndPastedNodes().addAll( node_ids );
+        _nodes_in_preorder = null;
         _phylogeny.externalNodesHaveChanged();
         _phylogeny.hashIDs();
         _phylogeny.recalculateNumberOfExternalDescendants( true );
@@ -4031,6 +4144,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         getPhylogeny().reRoot( node );
         getPhylogeny().recalculateNumberOfExternalDescendants( true );
         resetNodeIdToDistToLeafMap();
+        _nodes_in_preorder = null;
         resetPreferredSize();
         getMainPanel().adjustJScrollPane();
         repaint();
@@ -4074,7 +4188,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         setPreferredSize( new Dimension( x, y ) );
     }
 
-    final void setArrowCursor() {
+    public final void setArrowCursor() {
         setCursor( ARROW_CURSOR );
         repaint();
     }
@@ -4091,7 +4205,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         getMainPanel().setCutOrCopiedTree( cut_or_copied_tree );
     }
 
-    final void setEdited( final boolean edited ) {
+    public final void setEdited( final boolean edited ) {
         _edited = edited;
     }
 
@@ -4289,7 +4403,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
      * @param t
      *            an instance of a Phylogeny
      */
-    final void setTree( final Phylogeny t ) {
+    public final void setTree( final Phylogeny t ) {
+        _nodes_in_preorder = null;
         _phylogeny = t;
     }
 
@@ -4323,7 +4438,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         _urt_factor_ov = urt_factor_ov;
     }
 
-    final void setWaitCursor() {
+    public final void setWaitCursor() {
         setCursor( WAIT_CURSOR );
         repaint();
     }
@@ -4579,6 +4694,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                            JOptionPane.WARNING_MESSAGE );
             return;
         }
+        _nodes_in_preorder = null;
         if ( !node.isExternal() && !node.isRoot() && ( _subtree_index <= ( TreePanel.MAX_SUBTREES - 1 ) ) ) {
             _sub_phylogenies[ _subtree_index ] = _phylogeny;
             _sub_phylogenies_temp_roots[ _subtree_index ] = node;
@@ -4615,6 +4731,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     }
 
     final void superTree() {
+        _nodes_in_preorder = null;
         final PhylogenyNode temp_root = _sub_phylogenies_temp_roots[ _subtree_index - 1 ];
         for( final PhylogenyNode n : temp_root.getDescendants() ) {
             n.setParent( temp_root );
@@ -4628,6 +4745,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     final void swap( final PhylogenyNode node ) {
         if ( !node.isExternal() ) {
             _phylogeny.swapChildren( node );
+            _nodes_in_preorder = null;
         }
         repaint();
     }
@@ -4841,11 +4959,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 );
     }
 
-    synchronized Hashtable<String, BufferedImage> getImageMap() {
+    public synchronized Hashtable<String, BufferedImage> getImageMap() {
         return getMainPanel().getImageMap();
     }
 }