X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FTreePanel.java;h=6ce838e058b818da8046d9d5b9b3eae3e01fa68f;hb=cc09a4de53fe2c95d71a0c93d6f894db2c845491;hp=c91616a9c6d0f636ec8284a99b69695b399caa49;hpb=14957af9a5402acadbd477347006e2b392491403;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index c91616a..6ce838e 100644 --- a/forester/java/src/org/forester/archaeopteryx/TreePanel.java +++ b/forester/java/src/org/forester/archaeopteryx/TreePanel.java @@ -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 image_map ) { + public synchronized void setImageMap( final Hashtable image_map ) { getMainPanel().setImageMap( image_map ); } - synchronized Hashtable getImageMap() { + public synchronized Hashtable getImageMap() { return getMainPanel().getImageMap(); } }