cleanup
[jalview.git] / forester / java / src / org / forester / archaeopteryx / TreePanel.java
index c91616a..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,15 +136,13 @@ 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
@@ -216,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(),
@@ -264,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 );
@@ -859,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;
@@ -937,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",
@@ -958,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;
             }
         }
@@ -1096,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;
     }
 
@@ -1701,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();
@@ -2281,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 ) {
@@ -2411,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,
@@ -2426,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;
@@ -2439,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,
@@ -2473,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() );
         }
@@ -2561,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 );
@@ -2663,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,
@@ -2738,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() );
                 }
             }
         }
@@ -2776,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() ) {
@@ -2845,7 +2922,7 @@ 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 + TreePanel.HALF_BOX_SIZE;
+        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 ______________
@@ -2870,7 +2947,7 @@ 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()
                                 + ")";
@@ -2928,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 );
@@ -2949,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()
@@ -2968,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 );
@@ -3304,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
@@ -3342,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() + " " );
                 }
@@ -3702,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 );
@@ -3801,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,
@@ -3854,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 ) );
         }
     }
 
@@ -4095,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();
     }
@@ -4112,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;
     }
 
@@ -4310,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;
     }
 
@@ -4344,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();
     }
@@ -4600,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;
@@ -4636,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 );
@@ -4649,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();
     }
@@ -4862,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();
     }
 }