X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FTreePanel.java;h=086fb1aaac3f1695ef03ba92a17968c364505748;hb=9bb791edf52887de31d1a49ff9606f85724a09a8;hp=7c40d10eed7d712e48438b28b53cb808560c5240;hpb=ccf4c584032d16ed0ed8d0678f01305887724f96;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index 7c40d10..086fb1a 100644 --- a/forester/java/src/org/forester/archaeopteryx/TreePanel.java +++ b/forester/java/src/org/forester/archaeopteryx/TreePanel.java @@ -5,7 +5,7 @@ // 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 @@ -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. -// +// // 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.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; @@ -103,6 +105,9 @@ 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.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.PropertiesMap; import org.forester.phylogeny.data.Property; @@ -125,30 +130,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; - 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 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 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, @@ -208,11 +206,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; - private int _circ_num_ext_nodes; private PhylogenyNode _root; final private Arc2D _arc = new Arc2D.Double(); final private HashMap _urt_nodeid_angle_map = new HashMap(); final private HashMap _urt_nodeid_index_map = new HashMap(); + final private Set _collapsed_external_nodeid_set = new HashSet(); HashMap _nodeid_dist_to_leaf = new HashMap(); private AffineTransform _at; private double _max_distance_to_root = -1; @@ -220,10 +218,11 @@ 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(), + 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 @@ -233,6 +232,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; @@ -408,6 +408,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 ); @@ -444,12 +445,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 ) ) { - g.setColor( PhylogenyMethods.getBranchColorValue( node ) ); + return ( PhylogenyMethods.getBranchColorValue( node ) ); } else { - g.setColor( getTreeColorSet().getBranchColor() ); + return ( getTreeColorSet().getBranchColor() ); } } @@ -690,9 +691,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( !node.isExternal() && !node.isRoot() ) { final boolean collapse = !node.isCollapse(); Util.collapseSubtree( node, collapse ); + updateSetOfCollapsedExternalNodes( _phylogeny ); _phylogeny.recalculateNumberOfExternalDescendants( true ); resetNodeIdToDistToLeafMap(); calculateLongestExtNodeInfo(); + _nodes_in_preorder = null; resetPreferredSize(); updateOvSizes(); _main_panel.adjustJScrollPane(); @@ -706,9 +709,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } setWaitCursor(); Util.collapseSpeciesSpecificSubtrees( _phylogeny ); + updateSetOfCollapsedExternalNodes( _phylogeny ); _phylogeny.recalculateNumberOfExternalDescendants( true ); resetNodeIdToDistToLeafMap(); calculateLongestExtNodeInfo(); + _nodes_in_preorder = null; resetPreferredSize(); _main_panel.adjustJScrollPane(); setArrowCursor(); @@ -773,6 +778,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee errorMessageNoCutCopyPasteInUnrootedDisplay(); return; } + _nodes_in_preorder = null; setCutOrCopiedTree( _phylogeny.copy( node ) ); final List nodes = PhylogenyMethods.getAllDescendants( node ); final Set node_ids = new HashSet( nodes.size() ); @@ -804,6 +810,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 ); @@ -858,6 +865,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; @@ -936,6 +944,52 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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", @@ -954,13 +1008,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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 ) ) - && ( ( 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; } } @@ -1095,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; } @@ -1700,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(); @@ -2138,8 +2194,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 ); } - 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 ); @@ -2164,8 +2223,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 ); } - 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 ); @@ -2186,13 +2248,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() - .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() - .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() @@ -2245,7 +2305,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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, @@ -2266,88 +2326,45 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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 ) ) { - 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 { - 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 @@ -2356,42 +2373,40 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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 { - 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 ) { @@ -2407,7 +2422,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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, @@ -2418,23 +2435,45 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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 ); - 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(); - 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 ); + paintNodeBox( _root.getXcoord(), _root.getYcoord(), _root, g, to_pdf, to_graphics_file, isInFoundNodes( _root ) ); + } + + private 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, @@ -2443,7 +2482,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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 ); @@ -2453,7 +2492,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 ); - 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 ); } @@ -2467,9 +2506,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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() ) ) { - System.out.println( "no " + n + ", fucker!" );//TODO + System.out.println( "no " + n + " =====>>>>>>> ERROR!" );//TODO } return _urt_nodeid_angle_map.get( n.getId() ); } @@ -2534,21 +2573,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 ) { + Color c = null; if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { - g.setColor( Color.BLACK ); + c = Color.BLACK; } else if ( is_in_found_nodes ) { - g.setColor( getTreeColorSet().getFoundColor() ); + c = getTreeColorSet().getFoundColor(); } else if ( getControlPanel().isColorAccordingToTaxonomy() ) { - g.setColor( getTaxonomyBasedColor( node ) ); + c = getTaxonomyBasedColor( node ); } else if ( getOptions().isColorLabelsSameAsParentBranch() && getControlPanel().isColorBranches() && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { - g.setColor( PhylogenyMethods.getBranchColorValue( node ) ); + c = PhylogenyMethods.getBranchColorValue( node ); } else { - g.setColor( getTreeColorSet().getCollapseFillColor() ); + c = getTreeColorSet().getCollapseFillColor(); } double d = node.getAllExternalDescendants().size(); if ( d > 1000 ) { @@ -2557,17 +2597,34 @@ 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; + final int box_size = getOptions().getDefaultNodeShapeSize(); + if ( d < box_size ) { + d = box_size; } _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 ); } @@ -2649,15 +2706,19 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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 int box_size = getOptions().getDefaultNodeShapeSize(); + final int half_box_size = getOptions().getDefaultNodeShapeSize() / 2; 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, @@ -2673,9 +2734,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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 ), @@ -2713,33 +2775,93 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee paintFoundNode( ForesterUtil.roundToInt( x ), ForesterUtil.roundToInt( y ), g ); } else { + Color outline_color = null; if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { - g.setColor( Color.BLACK ); + outline_color = Color.BLACK; } else if ( getControlPanel().isEvents() && Util.isHasAssignedEvent( node ) ) { final Event event = node.getNodeData().getEvent(); if ( event.isDuplication() ) { - g.setColor( getTreeColorSet().getDuplicationBoxColor() ); + outline_color = getTreeColorSet().getDuplicationBoxColor(); } else if ( event.isSpeciation() ) { - g.setColor( getTreeColorSet().getSpecBoxColor() ); + outline_color = getTreeColorSet().getSpecBoxColor(); } 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 ); + } } } } @@ -2763,17 +2885,17 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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() ) ) { - 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() ) { + .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() ) { @@ -2839,21 +2961,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() ); } } @@ -2865,20 +2986,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; } } @@ -2890,16 +3011,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 _______________ @@ -2923,7 +3044,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 ); @@ -2944,7 +3065,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() @@ -2963,14 +3084,15 @@ 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.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(), "-" @@ -3006,8 +3128,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 ) ) { - 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 { @@ -3290,6 +3420,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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 @@ -3328,6 +3459,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() + " " ); } @@ -3395,10 +3537,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(); @@ -3461,9 +3602,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 ) ) { @@ -3584,9 +3736,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 ); } @@ -3675,7 +3830,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 + ( getOptions().getDefaultNodeShapeSize() / 2 ) + x_shift; final double start_y = node.getYcoord() + ( getTreeFontSet()._fm_large.getAscent() / ( node.getNumberOfDescendants() == 1 ? 1 : 3.0 ) ); _sb.setLength( 0 ); @@ -3732,8 +3887,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, @@ -3774,7 +3929,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, @@ -3827,11 +3981,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 ) ); } } @@ -3948,6 +4105,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 ); @@ -4023,6 +4181,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(); @@ -4066,7 +4225,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(); } @@ -4083,7 +4242,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; } @@ -4281,7 +4440,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; } @@ -4315,7 +4475,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(); } @@ -4488,9 +4648,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _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 ( _popup_buffer.length() > 0 ) { @@ -4570,6 +4731,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; @@ -4606,6 +4768,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 ); @@ -4619,6 +4782,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(); } @@ -4832,11 +4996,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(); } }