X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FTreePanel.java;h=7825bb7b108134759cec1f780e8981a95df5a989;hb=e6ea1a1dcb0a9b96cad1bc08c3b80a6f876344d2;hp=68b63761f3f1760fc498d44eb2d226f1c8124850;hpb=e6176aa35853eeaa7ab3a4f2d8a1431d9c76a290;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index 68b6376..7825bb7 100644 --- a/forester/java/src/org/forester/archaeopteryx/TreePanel.java +++ b/forester/java/src/org/forester/archaeopteryx/TreePanel.java @@ -30,6 +30,7 @@ import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; +import java.awt.FontMetrics; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; @@ -153,6 +154,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee private final static String NODE_POPMENU_NODE_CLIENT_PROPERTY = "node"; private static final float ONEHALF_PI = ( float ) ( 1.5 * Math.PI ); private static final short OV_BORDER = 10; + private final static double OVERVIEW_FOUND_NODE_BOX_SIZE = 2; + private final static double OVERVIEW_FOUND_NODE_BOX_SIZE_HALF = 1; private static final float PI = ( float ) ( Math.PI ); final private static Font POPUP_FONT = new Font( Configuration.getDefaultFontFamilyName(), Font.PLAIN, @@ -168,8 +171,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee private static final BasicStroke STROKE_2 = new BasicStroke( 2f ); private static final double TWO_PI = 2 * Math.PI; private final static int WIGGLE = 2; - private final static double OVERVIEW_FOUND_NODE_BOX_SIZE = 2; - private final static double OVERVIEW_FOUND_NODE_BOX_SIZE_HALF = 1; HashMap _nodeid_dist_to_leaf = new HashMap(); final private Arc2D _arc = new Arc2D.Double(); private AffineTransform _at; @@ -602,59 +603,24 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( node.isCollapse() ) { continue; } - if ( getControlPanel().isShowNodeNames() ) { - sum += getTreeFontSet()._fm_large.stringWidth( node.getName() + " " ); + final StringBuilder sb = new StringBuilder(); + nodeDataAsSB( node, sb ); + if ( node.getNodeData().isHasTaxonomy() ) { + nodeTaxonomyDataAsSB( node.getNodeData().getTaxonomy(), sb ); } - if ( node.getNodeData().isHasSequence() ) { - if ( getControlPanel().isShowSequenceAcc() - && ( node.getNodeData().getSequence().getAccession() != null ) ) { - sum += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getAccession() - .getValue() - + " " ); - } - if ( getControlPanel().isShowSeqNames() && ( node.getNodeData().getSequence().getName().length() > 0 ) ) { - sum += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getName() + " " ); - } - if ( getControlPanel().isShowSeqSymbols() - && ( node.getNodeData().getSequence().getSymbol().length() > 0 ) ) { - sum += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getSymbol() + " " ); - } - if ( getControlPanel().isShowGeneNames() - && ( node.getNodeData().getSequence().getGeneName().length() > 0 ) ) { - sum += getTreeFontSet()._fm_large - .stringWidth( node.getNodeData().getSequence().getGeneName() + " " ); - } - if ( getControlPanel().isShowAnnotation() - && ( node.getNodeData().getSequence().getAnnotations() != null ) - && !node.getNodeData().getSequence().getAnnotations().isEmpty() ) { - sum += getTreeFontSet()._fm_large.stringWidth( TreePanelUtil.createAnnotationString( node - .getNodeData().getSequence().getAnnotations(), getOptions().isShowAnnotationRefSource() ) - + " " ); - } - if ( getControlPanel().isShowDomainArchitectures() - && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { - sum += ( ( RenderableDomainArchitecture ) node.getNodeData().getSequence().getDomainArchitecture() ) - .getRenderingSize().getWidth(); - } + boolean use_vis = false; + final Graphics2D g = ( Graphics2D ) getGraphics(); + if ( getControlPanel().isUseVisualStyles() ) { + use_vis = setFont( g, node, false ); } - if ( node.getNodeData().isHasTaxonomy() ) { - final Taxonomy tax = node.getNodeData().getTaxonomy(); - if ( getControlPanel().isShowTaxonomyCode() && !ForesterUtil.isEmpty( tax.getTaxonomyCode() ) ) { - sum += getTreeFontSet()._fm_large_italic.stringWidth( tax.getTaxonomyCode() + " " ); - } - if ( getControlPanel().isShowTaxonomyScientificNames() - && !ForesterUtil.isEmpty( tax.getScientificName() ) ) { - sum += getTreeFontSet()._fm_large_italic.stringWidth( tax.getScientificName() + " " ); - } - if ( getControlPanel().isShowTaxonomyCommonNames() && !ForesterUtil.isEmpty( tax.getCommonName() ) ) { - sum += getTreeFontSet()._fm_large_italic.stringWidth( tax.getCommonName() + " ()" ); - } + if ( !use_vis ) { + sum = getFontMetricsForLargeDefaultFont().stringWidth( sb.toString() ); } - if ( getControlPanel().isShowProperties() && node.getNodeData().isHasProperties() ) { - sum += getTreeFontSet()._fm_large.stringWidth( propertiesToString( node ).toString() ); + else { + sum = getFontMetrics( g.getFont() ).stringWidth( sb.toString() ); } if ( getControlPanel().isShowBinaryCharacters() && node.getNodeData().isHasBinaryCharacters() ) { - sum += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getBinaryCharacters() + sum += getFontMetricsForLargeDefaultFont().stringWidth( node.getNodeData().getBinaryCharacters() .getGainedCharactersAsStringBuffer().toString() ); } if ( sum >= max_length ) { @@ -749,6 +715,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return c; } } + + final Color calculateSequenceBasedColor( final Sequence seq ) { + if ( ForesterUtil.isEmpty( seq.getName() ) ) { + return getTreeColorSet().getSequenceColor(); + } + Color c = null; + final String seq_name = seq.getName(); + c = getControlPanel().getSequenceColors().get( seq_name ); + if ( c == null ) { + c = TreePanelUtil.calculateColorFromString( seq_name, false ); + getControlPanel().getSequenceColors().put( seq_name, c ); + } + return c; + } void checkForVectorProperties( final Phylogeny phy ) { final DescriptiveStatistics stats = new BasicDescriptiveStatistics(); @@ -875,6 +855,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( _control_panel.getColorAccSpeciesCb() != null ) { _control_panel.getColorAccSpeciesCb().setSelected( false ); } + _options.setColorLabelsSameAsParentBranch( true ); _control_panel.repaint(); } @@ -1020,12 +1001,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return _statistics_for_vector_data; } - /** - * Find a color for this species name. - * - * @param species - * @return the species color - */ + final Color getTaxonomyBasedColor( final PhylogenyNode node ) { if ( node.getNodeData().isHasTaxonomy() ) { return calculateTaxonomyBasedColor( node.getNodeData().getTaxonomy() ); @@ -1033,6 +1009,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee // return non-colorized color return getTreeColorSet().getTaxonomyColor(); } + + + final Color getSequenceBasedColor( final PhylogenyNode node ) { + if ( node.getNodeData().isHasSequence() ) { + return calculateSequenceBasedColor( node.getNodeData().getSequence() ); + } + // return non-colorized color + return getTreeColorSet().getSequenceColor(); + } + /** * @return pointer to colorset for tree drawing @@ -1640,7 +1626,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final boolean radial_labels = getOptions().getNodeLabelDirection() == NODE_LABEL_DIRECTION.RADIAL; _dynamic_hiding_factor = 0; if ( getControlPanel().isDynamicallyHideData() ) { - _dynamic_hiding_factor = ( int ) ( ( getTreeFontSet()._fm_large.getHeight() * 1.5 * getPhylogeny() + _dynamic_hiding_factor = ( int ) ( ( getFontMetricsForLargeDefaultFont().getHeight() * 1.5 * getPhylogeny() .getNumberOfExternalNodes() ) / ( TWO_PI * 10 ) ); } if ( getControlPanel().getDynamicallyHideData() != null ) { @@ -1685,7 +1671,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final int d = radius + MOVE + getLongestExtNodeInfo(); _dynamic_hiding_factor = 0; if ( getControlPanel().isDynamicallyHideData() && ( radius > 0 ) ) { - _dynamic_hiding_factor = ( int ) ( ( getTreeFontSet()._fm_large.getHeight() * 1.5 * getPhylogeny() + _dynamic_hiding_factor = ( int ) ( ( getFontMetricsForLargeDefaultFont().getHeight() * 1.5 * getPhylogeny() .getNumberOfExternalNodes() ) / ( TWO_PI * radius ) ); } if ( getControlPanel().getDynamicallyHideData() != null ) { @@ -2173,14 +2159,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } - private void abbreviateScientificName( final String sn ) { + private void abbreviateScientificName( final String sn, final StringBuilder sb ) { final String[] a = sn.split( "\\s+" ); - _sb.append( a[ 0 ].substring( 0, 1 ) ); - _sb.append( a[ 1 ].substring( 0, 2 ) ); + sb.append( a[ 0 ].substring( 0, 1 ) ); + sb.append( a[ 1 ].substring( 0, 2 ) ); if ( a.length > 2 ) { for( int i = 2; i < a.length; i++ ) { - _sb.append( " " ); - _sb.append( a[ i ] ); + sb.append( " " ); + sb.append( a[ i ] ); } } } @@ -2339,7 +2325,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } private final int calcDynamicHidingFactor() { - return ( int ) ( 0.5 + ( getTreeFontSet()._fm_large.getHeight() / ( 1.5 * getYdistance() ) ) ); + return ( int ) ( 0.5 + ( getFontMetricsForLargeDefaultFont().getHeight() / ( 1.5 * getYdistance() ) ) ); } /** @@ -2385,6 +2371,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } } + return c; } @@ -2410,21 +2397,44 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee JOptionPane.WARNING_MESSAGE ); } - final private void colorizeSubtree( final Color c, - final PhylogenyNode node, - final List additional_nodes ) { - _control_panel.setColorBranches( true ); - if ( _control_panel.getUseVisualStylesCb() != null ) { - _control_panel.getUseVisualStylesCb().setSelected( true ); + private void changeNodeFont( final PhylogenyNode node ) { + final FontChooser fc = new FontChooser(); + Font f = null; + if ( ( node.getNodeData().getNodeVisualData() != null ) && !node.getNodeData().getNodeVisualData().isEmpty() ) { + f = node.getNodeData().getNodeVisualData().getFont(); } - if ( node != null ) { - for( final PreorderTreeIterator it = new PreorderTreeIterator( node ); it.hasNext(); ) { - it.next().getBranchData().setBranchColor( new BranchColor( c ) ); - } + if ( f != null ) { + fc.setFont( f ); } - if ( additional_nodes != null ) { - for( final PhylogenyNode n : additional_nodes ) { - n.getBranchData().setBranchColor( new BranchColor( c ) ); + else { + fc.setFont( getMainPanel().getTreeFontSet().getLargeFont() ); + } + fc.showDialog( this, "Select Font" ); + if ( ( fc.getFont() != null ) && !ForesterUtil.isEmpty( fc.getFont().getFamily().trim() ) ) { + List nodes = new ArrayList(); + if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { + nodes = getFoundNodesAsListOfPhylogenyNodes(); + } + nodes.add( node ); + for( final PhylogenyNode n : nodes ) { + if ( n.getNodeData().getNodeVisualData() == null ) { + n.getNodeData().setNodeVisualData( new NodeVisualData() ); + } + final NodeVisualData vd = n.getNodeData().getNodeVisualData(); + final Font ff = fc.getFont(); + vd.setFontName( ff.getFamily().trim() ); + int s = ff.getSize(); + if ( s < 0 ) { + s = 0; + } + if ( s > Byte.MAX_VALUE ) { + s = Byte.MAX_VALUE; + } + vd.setFontSize( s ); + vd.setFontStyle( ff.getStyle() ); + } + if ( _control_panel.getUseVisualStylesCb() != null ) { + getControlPanel().getUseVisualStylesCb().setSelected( true ); } } repaint(); @@ -2448,33 +2458,27 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee repaint(); } - private final static void colorizeNodesHelper( final Color c, final PhylogenyNode node ) { - if ( node.getNodeData().getNodeVisualData() == null ) { - node.getNodeData().setNodeVisualData( new NodeVisualData() ); - } - node.getNodeData().getNodeVisualData().setFontColor( new Color( c.getRed(), c.getGreen(), c.getBlue() ) ); - } - - final private void colorSubtree( final PhylogenyNode node ) { - if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) { - JOptionPane.showMessageDialog( this, - "Cannot colorize subtree in unrooted display type", - "Attempt to colorize subtree in unrooted display", - JOptionPane.WARNING_MESSAGE ); - return; + final private void colorizeSubtree( final Color c, + final PhylogenyNode node, + final List additional_nodes ) { + _control_panel.setColorBranches( true ); + if ( _control_panel.getUseVisualStylesCb() != null ) { + _control_panel.getUseVisualStylesCb().setSelected( true ); } - _color_chooser.setPreviewPanel( new JPanel() ); - SubtreeColorizationActionListener al; - if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { - final List additional_nodes = getFoundNodesAsListOfPhylogenyNodes(); - al = new SubtreeColorizationActionListener( _color_chooser, node, additional_nodes ); + if ( node != null ) { + for( final PreorderTreeIterator it = new PreorderTreeIterator( node ); it.hasNext(); ) { + it.next().getBranchData().setBranchColor( new BranchColor( c ) ); + } } - else { - al = new SubtreeColorizationActionListener( _color_chooser, node ); + if ( additional_nodes != null ) { + for( final PhylogenyNode an : additional_nodes ) { + // n.getBranchData().setBranchColor( new BranchColor( c ) ); + for( final PreorderTreeIterator it = new PreorderTreeIterator( an ); it.hasNext(); ) { + it.next().getBranchData().setBranchColor( new BranchColor( c ) ); + } + } } - final JDialog dialog = JColorChooser - .createDialog( this, "Subtree colorization", true, _color_chooser, al, null ); - dialog.setVisible( true ); + repaint(); } private void colorNodeFont( final PhylogenyNode node ) { @@ -2491,47 +2495,26 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee dialog.setVisible( true ); } - private void changeNodeFont( final PhylogenyNode node ) { - final FontChooser fc = new FontChooser(); - Font f = null; - if ( ( node.getNodeData().getNodeVisualData() != null ) && !node.getNodeData().getNodeVisualData().isEmpty() ) { - f = node.getNodeData().getNodeVisualData().getFont(); + final private void colorSubtree( final PhylogenyNode node ) { + if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) { + JOptionPane.showMessageDialog( this, + "Cannot colorize subtree in unrooted display type", + "Attempt to colorize subtree in unrooted display", + JOptionPane.WARNING_MESSAGE ); + return; } - if ( f != null ) { - fc.setFont( f ); + _color_chooser.setPreviewPanel( new JPanel() ); + SubtreeColorizationActionListener al; + if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { + final List additional_nodes = getFoundNodesAsListOfPhylogenyNodes(); + al = new SubtreeColorizationActionListener( _color_chooser, node, additional_nodes ); } else { - fc.setFont( getMainPanel().getTreeFontSet().getLargeFont() ); - } - fc.showDialog( this, "Select Font" ); - if ( ( fc.getFont() != null ) && !ForesterUtil.isEmpty( fc.getFont().getFamily().trim() ) ) { - List nodes = new ArrayList(); - if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { - nodes = getFoundNodesAsListOfPhylogenyNodes(); - } - nodes.add( node ); - for( final PhylogenyNode n : nodes ) { - if ( n.getNodeData().getNodeVisualData() == null ) { - n.getNodeData().setNodeVisualData( new NodeVisualData() ); - } - final NodeVisualData vd = n.getNodeData().getNodeVisualData(); - final Font ff = fc.getFont(); - vd.setFontName( ff.getFamily().trim() ); - int s = ff.getSize(); - if ( s < 0 ) { - s = 0; - } - if ( s > Byte.MAX_VALUE ) { - s = Byte.MAX_VALUE; - } - vd.setFontSize( s ); - vd.setFontStyle( ff.getStyle() ); - } - if ( _control_panel.getUseVisualStylesCb() != null ) { - getControlPanel().getUseVisualStylesCb().setSelected( true ); - } + al = new SubtreeColorizationActionListener( _color_chooser, node ); } - repaint(); + final JDialog dialog = JColorChooser + .createDialog( this, "Subtree colorization", true, _color_chooser, al, null ); + dialog.setVisible( true ); } final private void copySubtree( final PhylogenyNode node ) { @@ -2703,22 +2686,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee g.fill( _ellipse ); } - final private void drawOvalGradient( final double x, - final double y, - final double width, - final double heigth, + final private void drawOvalGradient( final float x, + final float y, + final float width, + final float 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.setPaint( new GradientPaint( x, y, color_1, ( x + width ), ( y + heigth ), color_2, false ) ); g.fill( _ellipse ); if ( color_border != null ) { g.setPaint( color_border ); @@ -2740,22 +2717,16 @@ 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 private void drawRectGradient( final float x, + final float y, + final float width, + final float 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.setPaint( new GradientPaint( x, y, color_1, ( x + width ), ( y + heigth ), color_2, false ) ); g.fill( _rectangle ); if ( color_border != null ) { g.setPaint( color_border ); @@ -2846,6 +2817,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return getMainPanel().getCutOrCopiedTree(); } + private FontMetrics getFontMetricsForLargeDefaultFont() { + return getTreeFontSet().getFontMetricsLarge(); + } + private List getFoundNodesAsListOfPhylogenyNodes() { final List additional_nodes = new ArrayList(); if ( getFoundNodes0() != null ) { @@ -3428,6 +3403,105 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } + private final void nodeDataAsSB( final PhylogenyNode node, final StringBuilder sb ) { + if ( getControlPanel().isShowNodeNames() && ( node.getName().length() > 0 ) ) { + if ( sb.length() > 0 ) { + sb.append( " " ); + } + sb.append( node.getName() ); + } + if ( node.getNodeData().isHasSequence() ) { + if ( getControlPanel().isShowSeqSymbols() && ( node.getNodeData().getSequence().getSymbol().length() > 0 ) ) { + if ( sb.length() > 0 ) { + sb.append( " " ); + } + sb.append( node.getNodeData().getSequence().getSymbol() ); + } + if ( getControlPanel().isShowGeneNames() && ( node.getNodeData().getSequence().getGeneName().length() > 0 ) ) { + if ( sb.length() > 0 ) { + sb.append( " " ); + } + sb.append( node.getNodeData().getSequence().getGeneName() ); + } + if ( getControlPanel().isShowSeqNames() && ( node.getNodeData().getSequence().getName().length() > 0 ) ) { + if ( sb.length() > 0 ) { + sb.append( " " ); + } + sb.append( node.getNodeData().getSequence().getName() ); + } + if ( getControlPanel().isShowSequenceAcc() && ( node.getNodeData().getSequence().getAccession() != null ) ) { + if ( sb.length() > 0 ) { + sb.append( " " ); + } + if ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getAccession().getSource() ) ) { + sb.append( node.getNodeData().getSequence().getAccession().getSource() ); + sb.append( ":" ); + } + sb.append( node.getNodeData().getSequence().getAccession().getValue() ); + } + } + if ( getControlPanel().isShowProperties() && node.getNodeData().isHasProperties() ) { + if ( sb.length() > 0 ) { + sb.append( " " ); + } + sb.append( propertiesToString( node ) ); + } + } + + private final void nodeTaxonomyDataAsSB( final Taxonomy taxonomy, final StringBuilder sb ) { + if ( _control_panel.isShowTaxonomyCode() && !ForesterUtil.isEmpty( taxonomy.getTaxonomyCode() ) ) { + sb.append( taxonomy.getTaxonomyCode() ); + sb.append( " " ); + } + if ( _control_panel.isShowTaxonomyScientificNames() && _control_panel.isShowTaxonomyCommonNames() ) { + if ( !ForesterUtil.isEmpty( taxonomy.getScientificName() ) + && !ForesterUtil.isEmpty( taxonomy.getCommonName() ) ) { + if ( getOptions().isAbbreviateScientificTaxonNames() + && ( taxonomy.getScientificName().indexOf( ' ' ) > 0 ) ) { + abbreviateScientificName( taxonomy.getScientificName(), sb ); + } + else { + sb.append( taxonomy.getScientificName() ); + } + sb.append( " (" ); + sb.append( taxonomy.getCommonName() ); + sb.append( ") " ); + } + else if ( !ForesterUtil.isEmpty( taxonomy.getScientificName() ) ) { + if ( getOptions().isAbbreviateScientificTaxonNames() + && ( taxonomy.getScientificName().indexOf( ' ' ) > 0 ) ) { + abbreviateScientificName( taxonomy.getScientificName(), sb ); + } + else { + sb.append( taxonomy.getScientificName() ); + } + sb.append( " " ); + } + else if ( !ForesterUtil.isEmpty( taxonomy.getCommonName() ) ) { + sb.append( taxonomy.getCommonName() ); + sb.append( " " ); + } + } + else if ( _control_panel.isShowTaxonomyScientificNames() ) { + if ( !ForesterUtil.isEmpty( taxonomy.getScientificName() ) ) { + if ( getOptions().isAbbreviateScientificTaxonNames() + && ( taxonomy.getScientificName().indexOf( ' ' ) > 0 ) ) { + abbreviateScientificName( taxonomy.getScientificName(), sb ); + } + else { + sb.append( taxonomy.getScientificName() ); + } + sb.append( " " ); + } + } + else if ( _control_panel.isShowTaxonomyCommonNames() ) { + if ( !ForesterUtil.isEmpty( taxonomy.getCommonName() ) ) { + sb.append( taxonomy.getCommonName() ); + sb.append( " " ); + } + } + } + private final String obtainTitleForExtDescNodeData() { switch ( getOptions().getExtDescNodeDataToReturn() ) { case NODE_NAME: @@ -3612,20 +3686,20 @@ 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().getSmallMaxDescent(), 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().getSmallMaxDescent(), g ); } else { TreePanel.drawString( FORMATTER_BRANCH_LENGTH.format( node.getDistanceToParent() ), node.getParent() - .getXcoord() + 3, node.getYcoord() - getTreeFontSet()._small_max_descent, g ); + .getXcoord() + 3, node.getYcoord() - getTreeFontSet().getSmallMaxDescent(), g ); } } else { TreePanel.drawString( FORMATTER_BRANCH_LENGTH.format( node.getDistanceToParent() ), 3, node.getYcoord() - - getTreeFontSet()._small_max_descent, g ); + - getTreeFontSet().getSmallMaxDescent(), g ); } } @@ -3874,6 +3948,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else if ( is_in_found_nodes ) { c = getColorForFoundNode( node ); } + else if ( getControlPanel().isColorAccordingToSequence() ) { + c = getSequenceBasedColor( node ); + } else if ( getControlPanel().isColorAccordingToTaxonomy() ) { c = getTaxonomyBasedColor( node ); } @@ -3956,8 +4033,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } if ( sb.length() > 0 ) { - final double parent_x = node.getParent().getXcoord(); - double x = node.getXcoord(); + final float parent_x = node.getParent().getXcoord(); + float x = node.getXcoord(); g.setFont( getTreeFontSet().getSmallFont() ); if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) { x += EURO_D; @@ -3972,12 +4049,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee g.setColor( getTreeColorSet().getConfidenceColor() ); } final String conf_str = sb.toString(); - TreePanel - .drawString( conf_str, - parent_x - + ( ( x - parent_x - getTreeFontSet()._fm_small.stringWidth( conf_str ) ) / 2 ), - ( node.getYcoord() + getTreeFontSet()._small_max_ascent ) - 1, - g ); + TreePanel.drawString( conf_str, + parent_x + + ( ( x - parent_x - getTreeFontSet().getFontMetricsSmall() + .stringWidth( conf_str ) ) / 2 ), + ( node.getYcoord() + getTreeFontSet().getSmallMaxAscent() ) - 1, + g ); } } @@ -3986,8 +4063,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final String gained, final String lost ) { if ( node.getParent() != null ) { - final double parent_x = node.getParent().getXcoord(); - final double x = node.getXcoord(); + final float parent_x = node.getParent().getXcoord(); + final float x = node.getXcoord(); g.setFont( getTreeFontSet().getLargeFont() ); g.setColor( getTreeColorSet().getGainedCharactersColor() ); if ( Constants.SPECIAL_CUSTOM ) { @@ -3995,14 +4072,17 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } TreePanel .drawString( gained, - parent_x + ( ( x - parent_x - getTreeFontSet()._fm_large.stringWidth( gained ) ) / 2 ), - ( node.getYcoord() - getTreeFontSet()._fm_large.getMaxDescent() ), + parent_x + + ( ( x - parent_x - getFontMetricsForLargeDefaultFont().stringWidth( gained ) ) / 2 ), + ( node.getYcoord() - getFontMetricsForLargeDefaultFont().getMaxDescent() ), g ); g.setColor( getTreeColorSet().getLostCharactersColor() ); - TreePanel.drawString( lost, - parent_x + ( ( x - parent_x - getTreeFontSet()._fm_large.stringWidth( lost ) ) / 2 ), - ( node.getYcoord() + getTreeFontSet()._fm_large.getMaxAscent() ), - g ); + TreePanel + .drawString( lost, + parent_x + + ( ( x - parent_x - getFontMetricsForLargeDefaultFont().stringWidth( lost ) ) / 2 ), + ( node.getYcoord() + getFontMetricsForLargeDefaultFont().getMaxAscent() ), + g ); } } @@ -4014,8 +4094,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee * @param node * @param g */ - final private void paintNodeBox( final double x, - final double y, + final private void paintNodeBox( final float x, + final float y, final PhylogenyNode node, final Graphics2D g, final boolean to_pdf, @@ -4033,12 +4113,25 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) ) || ( getOptions().isShowDefaultNodeShapesExternal() && node.isExternal() ) || ( getOptions().isShowDefaultNodeShapesInternal() && node.isInternal() ) + || ( getControlPanel().isUseVisualStyles() && ( ( node.getNodeData().getNodeVisualData() != null ) && ( ( node + .getNodeData().getNodeVisualData().getNodeColor() != null ) + || ( node.getNodeData().getNodeVisualData().getSize() != NodeVisualData.DEFAULT_SIZE ) + || ( node.getNodeData().getNodeVisualData().getFillType() != NodeFill.DEFAULT ) || ( node + .getNodeData().getNodeVisualData().getShape() != NodeShape.DEFAULT ) ) ) ) || ( getControlPanel().isEvents() && node.isHasAssignedEvent() && ( node.getNodeData().getEvent() .isDuplication() || node.getNodeData().getEvent().isSpeciation() || node.getNodeData().getEvent() .isSpeciationOrDuplication() ) ) ) { - final double box_size = getOptions().getDefaultNodeShapeSize(); - final double half_box_size = box_size / 2.0; + NodeVisualData vis = null; + if ( getControlPanel().isUseVisualStyles() && ( node.getNodeData().getNodeVisualData() != null ) + && ( !node.getNodeData().getNodeVisualData().isEmpty() ) ) { + vis = node.getNodeData().getNodeVisualData(); + } + float box_size = getOptions().getDefaultNodeShapeSize(); + if ( ( vis != null ) && ( vis.getSize() != NodeVisualData.DEFAULT_SIZE ) ) { + box_size = vis.getSize(); + } + final float half_box_size = box_size / 2.0f; Color outline_color = null; if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { outline_color = Color.BLACK; @@ -4046,6 +4139,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else if ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) ) { outline_color = getColorForFoundNode( node ); } + else if ( vis != null ) { + if ( vis.getNodeColor() != null ) { + outline_color = vis.getNodeColor(); + } + else if ( vis.getFontColor() != null ) { + outline_color = vis.getFontColor(); + } + } else if ( getControlPanel().isEvents() && TreePanelUtil.isHasAssignedEvent( node ) ) { final Event event = node.getNodeData().getEvent(); if ( event.isDuplication() ) { @@ -4058,18 +4159,62 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee outline_color = getTreeColorSet().getDuplicationOrSpeciationColor(); } } - else { + if ( outline_color == null ) { outline_color = getGraphicsForNodeBoxWithColorForParentBranch( node ); if ( to_pdf && ( outline_color == getTreeColorSet().getBranchColor() ) ) { outline_color = getTreeColorSet().getBranchColorForPdf(); } } - if ( getOptions().getDefaultNodeShape() == NodeShape.CIRCLE ) { - if ( getOptions().getDefaultNodeFill() == NodeFill.GRADIENT ) { + NodeShape shape = null; + if ( vis != null ) { + if ( vis.getShape() == NodeShape.CIRCLE ) { + shape = NodeShape.CIRCLE; + } + else if ( vis.getShape() == NodeShape.RECTANGLE ) { + shape = NodeShape.RECTANGLE; + } + } + if ( shape == null ) { + if ( getOptions().getDefaultNodeShape() == NodeShape.CIRCLE ) { + shape = NodeShape.CIRCLE; + } + else if ( getOptions().getDefaultNodeShape() == NodeShape.RECTANGLE ) { + shape = NodeShape.RECTANGLE; + } + } + NodeFill fill = null; + if ( vis != null ) { + if ( vis.getFillType() == NodeFill.SOLID ) { + fill = NodeFill.SOLID; + } + else if ( vis.getFillType() == NodeFill.NONE ) { + fill = NodeFill.NONE; + } + else if ( vis.getFillType() == NodeFill.GRADIENT ) { + fill = NodeFill.GRADIENT; + } + } + if ( fill == null ) { + if ( getOptions().getDefaultNodeFill() == NodeFill.SOLID ) { + fill = NodeFill.SOLID; + } + else if ( getOptions().getDefaultNodeFill() == NodeFill.NONE ) { + fill = NodeFill.NONE; + } + else if ( getOptions().getDefaultNodeFill() == NodeFill.GRADIENT ) { + fill = NodeFill.GRADIENT; + } + } + Color vis_fill_color = null; + if ( ( vis != null ) && ( vis.getNodeColor() != null ) ) { + vis_fill_color = vis.getNodeColor(); + } + if ( shape == NodeShape.CIRCLE ) { + if ( fill == 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 ) { + else if ( fill == NodeFill.NONE ) { Color background = getBackground(); if ( to_pdf ) { background = Color.WHITE; @@ -4083,17 +4228,22 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee background, outline_color ); } - else if ( getOptions().getDefaultNodeFill() == NodeVisualData.NodeFill.SOLID ) { - g.setColor( outline_color ); + else if ( fill == NodeVisualData.NodeFill.SOLID ) { + if ( vis_fill_color != null ) { + g.setColor( vis_fill_color ); + } + else { + g.setColor( outline_color ); + } drawOvalFilled( x - half_box_size, y - half_box_size, box_size, box_size, g ); } } - else if ( getOptions().getDefaultNodeShape() == NodeVisualData.NodeShape.RECTANGLE ) { - if ( getOptions().getDefaultNodeFill() == NodeVisualData.NodeFill.GRADIENT ) { + else if ( shape == NodeVisualData.NodeShape.RECTANGLE ) { + if ( fill == NodeVisualData.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() == NodeVisualData.NodeFill.NONE ) { + else if ( fill == NodeVisualData.NodeFill.NONE ) { Color background = getBackground(); if ( to_pdf ) { background = Color.WHITE; @@ -4107,21 +4257,26 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee background, outline_color ); } - else if ( getOptions().getDefaultNodeFill() == NodeVisualData.NodeFill.SOLID ) { - g.setColor( outline_color ); + else if ( fill == NodeVisualData.NodeFill.SOLID ) { + if ( vis_fill_color != null ) { + g.setColor( vis_fill_color ); + } + else { + g.setColor( outline_color ); + } drawRectFilled( x - half_box_size, y - half_box_size, box_size, box_size, g ); } } } } - final private void paintNodeData( final Graphics2D g, - final PhylogenyNode node, - final boolean to_graphics_file, - final boolean to_pdf, - final boolean is_in_found_nodes ) { + final private int paintNodeData( final Graphics2D g, + final PhylogenyNode node, + final boolean to_graphics_file, + final boolean to_pdf, + final boolean is_in_found_nodes ) { if ( isNodeDataInvisible( node ) && !to_graphics_file && !to_pdf ) { - return; + return 0; } if ( getOptions().isShowBranchLengthValues() && ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR ) @@ -4130,7 +4285,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee paintBranchLength( g, node, to_pdf, to_graphics_file ); } if ( !getControlPanel().isShowInternalData() && !node.isExternal() && !node.isCollapse() ) { - return; + return 0; } _sb.setLength( 0 ); int x = 0; @@ -4147,38 +4302,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee .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() ) { - g.setColor( Color.BLACK ); - } - else if ( is_in_found_nodes ) { - g.setColor( getColorForFoundNode( node ) ); - } - else if ( getControlPanel().isUseVisualStyles() && ( node.getNodeData().getNodeVisualData() != null ) - && ( node.getNodeData().getNodeVisualData().getFontColor() != null ) ) { - g.setColor( node.getNodeData().getNodeVisualData().getFontColor() ); - } - else if ( getControlPanel().isColorAccordingToTaxonomy() ) { - g.setColor( getTaxonomyBasedColor( node ) ); - } - else if ( getControlPanel().isColorAccordingToAnnotation() - && ( node.getNodeData().isHasSequence() && ( node.getNodeData().getSequence().getAnnotations() != null ) && ( !node - .getNodeData().getSequence().getAnnotations().isEmpty() ) ) ) { - g.setColor( calculateColorForAnnotation( node.getNodeData().getSequence().getAnnotations() ) ); - } - else if ( getOptions().isColorLabelsSameAsParentBranch() && getControlPanel().isUseVisualStyles() - && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { - g.setColor( PhylogenyMethods.getBranchColorValue( node ) ); - } - else if ( to_pdf ) { - g.setColor( Color.BLACK ); - } - else { - g.setColor( getTreeColorSet().getSequenceColor() ); - } + setColor( g, node, to_graphics_file, to_pdf, is_in_found_nodes, getTreeColorSet().getSequenceColor() ); if ( node.isCollapse() && ( ( !node.isRoot() && !node.getParent().isCollapse() ) || node.isRoot() ) ) { if ( _sb.length() > 0 ) { _sb.setLength( 0 ); - _sb.append( "(" ); + _sb.append( " (" ); _sb.append( node.getAllExternalDescendants().size() ); _sb.append( ")" ); } @@ -4186,64 +4314,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else { _sb.setLength( 0 ); } - if ( getControlPanel().isShowNodeNames() && ( node.getName().length() > 0 ) ) { - if ( _sb.length() > 0 ) { - _sb.append( " " ); - } - _sb.append( node.getName() ); - } - if ( node.getNodeData().isHasSequence() ) { - if ( getControlPanel().isShowSeqSymbols() && ( node.getNodeData().getSequence().getSymbol().length() > 0 ) ) { - if ( _sb.length() > 0 ) { - _sb.append( " " ); - } - _sb.append( node.getNodeData().getSequence().getSymbol() ); - } - if ( getControlPanel().isShowGeneNames() && ( node.getNodeData().getSequence().getGeneName().length() > 0 ) ) { - if ( _sb.length() > 0 ) { - _sb.append( " " ); - } - _sb.append( node.getNodeData().getSequence().getGeneName() ); - } - if ( getControlPanel().isShowSeqNames() && ( node.getNodeData().getSequence().getName().length() > 0 ) ) { - if ( _sb.length() > 0 ) { - _sb.append( " " ); - } - _sb.append( node.getNodeData().getSequence().getName() ); - } - if ( getControlPanel().isShowSequenceAcc() && ( node.getNodeData().getSequence().getAccession() != null ) ) { - if ( _sb.length() > 0 ) { - _sb.append( " " ); - } - if ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getAccession().getSource() ) ) { - _sb.append( node.getNodeData().getSequence().getAccession().getSource() ); - _sb.append( ":" ); - } - _sb.append( node.getNodeData().getSequence().getAccession().getValue() ); - } - } - if ( getControlPanel().isShowProperties() && node.getNodeData().isHasProperties() ) { - if ( _sb.length() > 0 ) { - _sb.append( " " ); - } - _sb.append( propertiesToString( node ) ); + nodeDataAsSB( node, _sb ); + final boolean using_visual_font = setFont( g, node, is_in_found_nodes ); + float down_shift_factor = 3.0f; + if ( !node.isExternal() && ( node.getNumberOfDescendants() == 1 ) ) { + down_shift_factor = 1; } - if ( getControlPanel().isUseVisualStyles() && ( node.getNodeData().getNodeVisualData() != null ) ) { - final Font f = node.getNodeData().getNodeVisualData().getFont(); - g.setFont( f != null ? f : getTreeFontSet().getLargeFont() ); + final float pos_x = node.getXcoord() + x + 2 + half_box_size; + float pos_y; + if ( !using_visual_font ) { + pos_y = ( node.getYcoord() + ( getFontMetricsForLargeDefaultFont().getAscent() / down_shift_factor ) ); } else { - g.setFont( getTreeFontSet().getLargeFont() ); - } - if ( is_in_found_nodes ) { - g.setFont( getTreeFontSet().getLargeFont().deriveFont( Font.BOLD ) ); + pos_y = ( node.getYcoord() + ( getFontMetrics( g.getFont() ).getAscent() / down_shift_factor ) ); } - double down_shift_factor = 3.0; - 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 ______________ if ( _control_panel.isShowSequenceRelations() && node.getNodeData().isHasSequence() @@ -4272,7 +4356,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee .getConfidence() == null ) ) ? null : " (" + seqRelation.getConfidence().getValue() + ")"; if ( sConfidence != null ) { - double confidenceX = pos_x; + float confidenceX = pos_x; if ( sb_str.length() > 0 ) { confidenceX += new TextLayout( sb_str, g.getFont(), _frc ).getBounds().getWidth() + CONFIDENCE_LEFT_MARGIN; @@ -4304,19 +4388,17 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee TreePanel.drawString( sb_str, pos_x, pos_y, g ); } // GUILHEM_END _____________ - // COMMENTED_OUT_BY_GUILHEM_BEG _______________ - // TODO FIXME need to check this one! - //if ( _sb.length() > 0 ) { - // TreePanel.drawString( _sb.toString(), node.getXcoord() + x + 2 + TreePanel.HALF_BOX_SIZE, node.getYcoord() - // + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), g ); - //} - // COMMENTED_OUT_BY_GUILHEM_END ________________ + if ( _sb.length() > 0 ) { + if ( !using_visual_font && !is_in_found_nodes ) { + x += getFontMetricsForLargeDefaultFont().stringWidth( _sb.toString() ) + 5; + } + else { + x += getFontMetrics( g.getFont() ).stringWidth( _sb.toString() ) + 5; + } + } if ( getControlPanel().isShowAnnotation() && node.getNodeData().isHasSequence() && ( node.getNodeData().getSequence().getAnnotations() != null ) && ( !node.getNodeData().getSequence().getAnnotations().isEmpty() ) ) { - if ( _sb.length() > 0 ) { - x += getTreeFontSet()._fm_large.stringWidth( _sb.toString() ) + 5; - } final SortedSet ann = node.getNodeData().getSequence().getAnnotations(); if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { g.setColor( Color.BLACK ); @@ -4326,18 +4408,23 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final String ann_str = TreePanelUtil.createAnnotationString( ann, getOptions().isShowAnnotationRefSource() ); TreePanel.drawString( ann_str, node.getXcoord() + x + 3 + half_box_size, node.getYcoord() - + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), g ); + + ( getFontMetricsForLargeDefaultFont().getAscent() / down_shift_factor ), g ); _sb.setLength( 0 ); _sb.append( ann_str ); + if ( _sb.length() > 0 ) { + if ( !using_visual_font && !is_in_found_nodes ) { + x += getFontMetricsForLargeDefaultFont().stringWidth( _sb.toString() ) + 5; + } + else { + x += getFontMetrics( g.getFont() ).stringWidth( _sb.toString() ) + 5; + } + } } if ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) ) { if ( ( getControlPanel().isShowBinaryCharacters() || getControlPanel().isShowBinaryCharacterCounts() ) && node.getNodeData().isHasBinaryCharacters() ) { - if ( _sb.length() > 0 ) { - x += getTreeFontSet()._fm_large.stringWidth( _sb.toString() ) + 5; - } if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { g.setColor( Color.BLACK ); } @@ -4347,23 +4434,25 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( getControlPanel().isShowBinaryCharacters() ) { TreePanel.drawString( node.getNodeData().getBinaryCharacters().getPresentCharactersAsStringBuffer() .toString(), node.getXcoord() + x + 1 + half_box_size, node.getYcoord() - + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), g ); + + ( getFontMetricsForLargeDefaultFont().getAscent() / down_shift_factor ), g ); paintGainedAndLostCharacters( g, node, node.getNodeData().getBinaryCharacters() .getGainedCharactersAsStringBuffer().toString(), node.getNodeData().getBinaryCharacters() .getLostCharactersAsStringBuffer().toString() ); } else { - TreePanel.drawString( " " + node.getNodeData().getBinaryCharacters().getPresentCount(), - node.getXcoord() + x + 4 + 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() + + ( getFontMetricsForLargeDefaultFont().getAscent() / down_shift_factor ), + g ); paintGainedAndLostCharacters( g, node, "+" + node.getNodeData().getBinaryCharacters().getGainedCount(), "-" + node.getNodeData().getBinaryCharacters().getLostCount() ); } } } + return x; } final private void paintNodeDataUnrootedCirc( final Graphics2D g, @@ -4376,23 +4465,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( isNodeDataInvisibleUnrootedCirc( node ) && !to_graphics_file && !to_pdf ) { return; } - if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { - g.setColor( Color.BLACK ); - } - else if ( is_in_found_nodes ) { - g.setColor( getColorForFoundNode( node ) ); - } - else if ( getControlPanel().isColorAccordingToTaxonomy() ) { - g.setColor( getTaxonomyBasedColor( node ) ); - } - else if ( getControlPanel().isColorAccordingToAnnotation() - && ( node.getNodeData().isHasSequence() && ( node.getNodeData().getSequence().getAnnotations() != null ) && ( !node - .getNodeData().getSequence().getAnnotations().isEmpty() ) ) ) { - g.setColor( calculateColorForAnnotation( node.getNodeData().getSequence().getAnnotations() ) ); - } - else { - g.setColor( getTreeColorSet().getSequenceColor() ); - } _sb.setLength( 0 ); _sb.append( " " ); if ( node.getNodeData().isHasTaxonomy() @@ -4462,11 +4534,13 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _sb.append( node.getNodeData().getSequence().getName() ); } } - g.setFont( getTreeFontSet().getLargeFont() ); - if ( is_in_found_nodes ) { - g.setFont( getTreeFontSet().getLargeFont().deriveFont( Font.BOLD ) ); - } + //g.setFont( getTreeFontSet().getLargeFont() ); + //if ( is_in_found_nodes ) { + // g.setFont( getTreeFontSet().getLargeFont().deriveFont( Font.BOLD ) ); + // } if ( _sb.length() > 1 ) { + setColor( g, node, to_graphics_file, to_pdf, is_in_found_nodes, getTreeColorSet().getSequenceColor() ); + final boolean using_visual_font = setFont( g, node, is_in_found_nodes ); final String sb_str = _sb.toString(); double m = 0; if ( _graphics_type == PHYLOGENY_GRAPHICS_TYPE.CIRCULAR ) { @@ -4478,7 +4552,13 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _at = g.getTransform(); boolean need_to_reset = false; final float x_coord = node.getXcoord(); - final float y_coord = node.getYcoord() + ( getTreeFontSet()._fm_large.getAscent() / 3.0f ); + float y_coord; + if ( !using_visual_font ) { + y_coord = node.getYcoord() + ( getFontMetricsForLargeDefaultFont().getAscent() / 3.0f ); + } + else { + y_coord = node.getYcoord() + ( getFontMetrics( g.getFont() ).getAscent() / 3.0f ); + } if ( radial_labels ) { need_to_reset = true; boolean left = false; @@ -4488,13 +4568,24 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } g.rotate( m, x_coord, node.getYcoord() ); if ( left ) { - g.translate( -( getTreeFontSet()._fm_large.getStringBounds( sb_str, g ).getWidth() ), 0 ); + if ( !using_visual_font ) { + g.translate( -( getFontMetricsForLargeDefaultFont().getStringBounds( sb_str, g ).getWidth() ), + 0 ); + } + else { + g.translate( -( getFontMetrics( g.getFont() ).getStringBounds( sb_str, g ).getWidth() ), 0 ); + } } } else { if ( ( m > HALF_PI ) && ( m < ONEHALF_PI ) ) { need_to_reset = true; - g.translate( -getTreeFontSet()._fm_large.getStringBounds( sb_str, g ).getWidth(), 0 ); + if ( !using_visual_font ) { + g.translate( -getFontMetricsForLargeDefaultFont().getStringBounds( sb_str, g ).getWidth(), 0 ); + } + else { + g.translate( -getFontMetrics( g.getFont() ).getStringBounds( sb_str, g ).getWidth(), 0 ); + } } } TreePanel.drawString( sb_str, x_coord, y_coord, g ); @@ -4646,15 +4737,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( dynamically_hide && !is_in_found_nodes && ( ( node.isExternal() && ( ( _external_node_index % dynamic_hiding_factor ) != 1 ) ) || ( !node - .isExternal() && ( ( new_x_min < 20 ) || ( ( _y_distance * node.getNumberOfExternalNodes() ) < getTreeFontSet()._fm_large + .isExternal() && ( ( new_x_min < 20 ) || ( ( _y_distance * node.getNumberOfExternalNodes() ) < getFontMetricsForLargeDefaultFont() .getHeight() ) ) ) ) ) { return; } - paintNodeData( g, node, to_graphics_file, to_pdf, is_in_found_nodes ); - paintNodeWithRenderableData( g, node, to_graphics_file, to_pdf ); + final int x = paintNodeData( g, node, to_graphics_file, to_pdf, is_in_found_nodes ); + paintNodeWithRenderableData( x, g, node, to_graphics_file, to_pdf ); } - final private void paintNodeWithRenderableData( final Graphics2D g, + final private void paintNodeWithRenderableData( final int x, + final Graphics2D g, final PhylogenyNode node, final boolean to_graphics_file, final boolean to_pdf ) { @@ -4676,61 +4768,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } if ( rds != null ) { rds.setRenderingHeight( 6 ); - int x = 0; - if ( node.getNodeData().isHasTaxonomy() ) { - if ( getControlPanel().isShowTaxonomyCode() - && ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getTaxonomyCode() ) ) ) { - x += getTreeFontSet()._fm_large_italic.stringWidth( node.getNodeData().getTaxonomy() - .getTaxonomyCode() - + " " ); - } - if ( getControlPanel().isShowTaxonomyScientificNames() - && ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getScientificName() ) ) ) { - x += getTreeFontSet()._fm_large_italic.stringWidth( node.getNodeData().getTaxonomy() - .getScientificName() - + " " ); - } - if ( getControlPanel().isShowTaxonomyCommonNames() - && ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getCommonName() ) ) ) { - x += getTreeFontSet()._fm_large_italic.stringWidth( node.getNodeData().getTaxonomy() - .getCommonName() - + " " ); - } - } - if ( node.getNodeData().isHasSequence() ) { - if ( getControlPanel().isShowSeqNames() - && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getName() ) ) ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getName() - + " " ); - } - if ( getControlPanel().isShowSeqSymbols() - && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getSymbol() ) ) ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getSymbol() - + " " ); - } - if ( getControlPanel().isShowGeneNames() - && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getGeneName() ) ) ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getGeneName() - + " " ); - } - if ( getControlPanel().isShowSequenceAcc() - && ( node.getNodeData().getSequence().getAccession() != null ) ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence() - .getAccession().toString() - + " " ); - } - if ( getControlPanel().isShowAnnotation() - && ( node.getNodeData().getSequence().getAnnotations() != null ) - && ( !node.getNodeData().getSequence().getAnnotations().isEmpty() ) ) { - x += getTreeFontSet()._fm_large.stringWidth( TreePanelUtil.createAnnotationString( node - .getNodeData().getSequence().getAnnotations(), getOptions() - .isShowAnnotationRefSource() ) - + " " ); - } - } - if ( getControlPanel().isShowNodeNames() && !ForesterUtil.isEmpty( node.getName() ) ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getName() + " " ); - } rds.render( node.getXcoord() + x, node.getYcoord() - 3, g, this, to_pdf ); } } @@ -4742,18 +4779,19 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee getStatisticsForExpressionValues(), getConfiguration() ); if ( rv != null ) { - int x = 0; + int xx = 0; PhylogenyNode my_node = node; if ( !getControlPanel().isDrawPhylogram() ) { my_node = getPhylogeny().getFirstExternalNode(); } if ( getControlPanel().isShowTaxonomyCode() && ( PhylogenyMethods.getSpecies( my_node ).length() > 0 ) ) { - x += getTreeFontSet()._fm_large_italic.stringWidth( PhylogenyMethods.getSpecies( my_node ) + " " ); + xx += getFontMetricsForLargeDefaultFont() + .stringWidth( PhylogenyMethods.getSpecies( my_node ) + " " ); } if ( getControlPanel().isShowNodeNames() && ( my_node.getName().length() > 0 ) ) { - x += getTreeFontSet()._fm_large.stringWidth( my_node.getName() + " " ); + xx += getFontMetricsForLargeDefaultFont().stringWidth( my_node.getName() + " " ); } - rv.render( my_node.getXcoord() + x, node.getYcoord() - 5, g, this, to_pdf ); + rv.render( my_node.getXcoord() + xx, node.getYcoord() - 5, g, this, to_pdf ); } } ////////////// @@ -4873,84 +4911,23 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final boolean is_in_found_nodes, final boolean to_pdf, final boolean to_graphics_file, - final double x_shift ) { + final float x_shift ) { final Taxonomy taxonomy = node.getNodeData().getTaxonomy(); - g.setFont( getTreeFontSet().getLargeItalicFont() ); - if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { - g.setColor( Color.BLACK ); - } - else if ( is_in_found_nodes ) { - g.setFont( getTreeFontSet().getLargeItalicFont().deriveFont( TreeFontSet.BOLD_AND_ITALIC ) ); - g.setColor( getColorForFoundNode( node ) ); - } - else if ( getControlPanel().isColorAccordingToTaxonomy() ) { - g.setColor( getTaxonomyBasedColor( node ) ); - } - else if ( getOptions().isColorLabelsSameAsParentBranch() && getControlPanel().isUseVisualStyles() - && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { - g.setColor( PhylogenyMethods.getBranchColorValue( node ) ); - } - else if ( to_pdf ) { - g.setColor( Color.BLACK ); + final boolean using_visual_font = setFont( g, node, is_in_found_nodes ); + setColor( g, node, to_graphics_file, to_pdf, is_in_found_nodes, getTreeColorSet().getTaxonomyColor() ); + final float start_x = node.getXcoord() + 3 + ( getOptions().getDefaultNodeShapeSize() / 2 ) + x_shift; + float start_y; + if ( !using_visual_font ) { + start_y = node.getYcoord() + + ( getFontMetricsForLargeDefaultFont().getAscent() / ( node.getNumberOfDescendants() == 1 ? 1 + : 3.0f ) ); } else { - g.setColor( getTreeColorSet().getTaxonomyColor() ); + start_y = node.getYcoord() + + ( getFontMetrics( g.getFont() ).getAscent() / ( node.getNumberOfDescendants() == 1 ? 1 : 3.0f ) ); } - 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 ); - if ( _control_panel.isShowTaxonomyCode() && !ForesterUtil.isEmpty( taxonomy.getTaxonomyCode() ) ) { - _sb.append( taxonomy.getTaxonomyCode() ); - _sb.append( " " ); - } - if ( _control_panel.isShowTaxonomyScientificNames() && _control_panel.isShowTaxonomyCommonNames() ) { - if ( !ForesterUtil.isEmpty( taxonomy.getScientificName() ) - && !ForesterUtil.isEmpty( taxonomy.getCommonName() ) ) { - if ( getOptions().isAbbreviateScientificTaxonNames() - && ( taxonomy.getScientificName().indexOf( ' ' ) > 0 ) ) { - abbreviateScientificName( taxonomy.getScientificName() ); - } - else { - _sb.append( taxonomy.getScientificName() ); - } - _sb.append( " (" ); - _sb.append( taxonomy.getCommonName() ); - _sb.append( ") " ); - } - else if ( !ForesterUtil.isEmpty( taxonomy.getScientificName() ) ) { - if ( getOptions().isAbbreviateScientificTaxonNames() - && ( taxonomy.getScientificName().indexOf( ' ' ) > 0 ) ) { - abbreviateScientificName( taxonomy.getScientificName() ); - } - else { - _sb.append( taxonomy.getScientificName() ); - } - _sb.append( " " ); - } - else if ( !ForesterUtil.isEmpty( taxonomy.getCommonName() ) ) { - _sb.append( taxonomy.getCommonName() ); - _sb.append( " " ); - } - } - else if ( _control_panel.isShowTaxonomyScientificNames() ) { - if ( !ForesterUtil.isEmpty( taxonomy.getScientificName() ) ) { - if ( getOptions().isAbbreviateScientificTaxonNames() - && ( taxonomy.getScientificName().indexOf( ' ' ) > 0 ) ) { - abbreviateScientificName( taxonomy.getScientificName() ); - } - else { - _sb.append( taxonomy.getScientificName() ); - } - _sb.append( " " ); - } - } - else if ( _control_panel.isShowTaxonomyCommonNames() ) { - if ( !ForesterUtil.isEmpty( taxonomy.getCommonName() ) ) { - _sb.append( taxonomy.getCommonName() ); - _sb.append( " " ); - } - } + nodeTaxonomyDataAsSB( taxonomy, _sb ); final String label = _sb.toString(); /* GUILHEM_BEG */ if ( _control_panel.isShowSequenceRelations() && ( label.length() > 0 ) @@ -4965,12 +4942,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } /* GUILHEM_END */ TreePanel.drawString( label, start_x, start_y, g ); - if ( is_in_found_nodes ) { - return getTreeFontSet()._fm_large_italic_bold.stringWidth( label ); - } - else { - return getTreeFontSet()._fm_large_italic.stringWidth( label ); + if ( !using_visual_font && !is_in_found_nodes ) { + return getFontMetricsForLargeDefaultFont().stringWidth( label ); } + return getFontMetrics( g.getFont() ).stringWidth( label ); } final private void paintUnrooted( final PhylogenyNode n, @@ -5197,6 +5172,45 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return sb; } + private void setColor( final Graphics2D g, + final PhylogenyNode node, + final boolean to_graphics_file, + final boolean to_pdf, + final boolean is_in_found_nodes, + final Color default_color ) { + if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { + g.setColor( Color.BLACK ); + } + else if ( is_in_found_nodes ) { + g.setColor( getColorForFoundNode( node ) ); + } + else if ( getControlPanel().isUseVisualStyles() && ( node.getNodeData().getNodeVisualData() != null ) + && ( node.getNodeData().getNodeVisualData().getFontColor() != null ) ) { + g.setColor( node.getNodeData().getNodeVisualData().getFontColor() ); + } + else if ( getControlPanel().isColorAccordingToSequence() ) { + g.setColor( getSequenceBasedColor( node ) ); + } + else if ( getControlPanel().isColorAccordingToTaxonomy() ) { + g.setColor( getTaxonomyBasedColor( node ) ); + } + else if ( getControlPanel().isColorAccordingToAnnotation() + && ( node.getNodeData().isHasSequence() && ( node.getNodeData().getSequence().getAnnotations() != null ) && ( !node + .getNodeData().getSequence().getAnnotations().isEmpty() ) ) ) { + g.setColor( calculateColorForAnnotation( node.getNodeData().getSequence().getAnnotations() ) ); + } + else if ( getOptions().isColorLabelsSameAsParentBranch() && getControlPanel().isUseVisualStyles() + && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { + g.setColor( PhylogenyMethods.getBranchColorValue( node ) ); + } + else if ( to_pdf ) { + g.setColor( Color.BLACK ); + } + else { + g.setColor( default_color ); + } + } + final private void setCopiedAndPastedNodes( final Set nodeIds ) { getMainPanel().setCopiedAndPastedNodes( nodeIds ); } @@ -5205,6 +5219,21 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee getMainPanel().setCutOrCopiedTree( cut_or_copied_tree ); } + private boolean setFont( final Graphics2D g, final PhylogenyNode node, final boolean is_in_found_nodes ) { + Font visual_font = null; + if ( getControlPanel().isUseVisualStyles() && ( node.getNodeData().getNodeVisualData() != null ) ) { + visual_font = node.getNodeData().getNodeVisualData().getFont(); + g.setFont( visual_font != null ? visual_font : getTreeFontSet().getLargeFont() ); + } + else { + g.setFont( getTreeFontSet().getLargeFont() ); + } + if ( is_in_found_nodes ) { + g.setFont( g.getFont().deriveFont( Font.BOLD ) ); + } + return visual_font != null; + } + final private void setInOv( final boolean in_ov ) { _in_ov = in_ov; } @@ -5690,9 +5719,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else if ( isInFoundNodes0( node ) && isInFoundNodes1( node ) ) { _rollover_popup.setForeground( getTreeColorSet().getFoundColor0and1() ); } - else if ( getControlPanel().isColorAccordingToTaxonomy() ) { - _rollover_popup.setForeground( getTaxonomyBasedColor( node ) ); - } else { _rollover_popup.setForeground( getTreeColorSet().getSequenceColor() ); } @@ -5798,8 +5824,15 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } - final private static void drawString( final String str, final double x, final double y, final Graphics2D g ) { - g.drawString( str, ( int ) ( x + 0.5 ), ( int ) ( y + 0.5 ) ); + private final static void colorizeNodesHelper( final Color c, final PhylogenyNode node ) { + if ( node.getNodeData().getNodeVisualData() == null ) { + node.getNodeData().setNodeVisualData( new NodeVisualData() ); + } + node.getNodeData().getNodeVisualData().setFontColor( new Color( c.getRed(), c.getGreen(), c.getBlue() ) ); + } + + final private static void drawString( final String str, final float x, final float y, final Graphics2D g ) { + g.drawString( str, x, y ); } final private static boolean plusPressed( final int key_code ) { @@ -5807,20 +5840,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee || ( key_code == KeyEvent.VK_EQUALS ) || ( key_code == KeyEvent.VK_SEMICOLON ) || ( key_code == KeyEvent.VK_1 ) ); } - final private class SubtreeColorizationActionListener implements ActionListener { + final private class NodeColorizationActionListener implements ActionListener { List _additional_nodes = null; JColorChooser _chooser = null; PhylogenyNode _node = null; - SubtreeColorizationActionListener( final JColorChooser chooser, final PhylogenyNode node ) { + NodeColorizationActionListener( final JColorChooser chooser, final PhylogenyNode node ) { _chooser = chooser; _node = node; } - SubtreeColorizationActionListener( final JColorChooser chooser, - final PhylogenyNode node, - final List additional_nodes ) { + NodeColorizationActionListener( final JColorChooser chooser, + final PhylogenyNode node, + final List additional_nodes ) { _chooser = chooser; _node = node; _additional_nodes = additional_nodes; @@ -5830,25 +5863,25 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee public void actionPerformed( final ActionEvent e ) { final Color c = _chooser.getColor(); if ( c != null ) { - colorizeSubtree( c, _node, _additional_nodes ); + colorizeNodes( c, _node, _additional_nodes ); } } } - final private class NodeColorizationActionListener implements ActionListener { + final private class SubtreeColorizationActionListener implements ActionListener { List _additional_nodes = null; JColorChooser _chooser = null; PhylogenyNode _node = null; - NodeColorizationActionListener( final JColorChooser chooser, final PhylogenyNode node ) { + SubtreeColorizationActionListener( final JColorChooser chooser, final PhylogenyNode node ) { _chooser = chooser; _node = node; } - NodeColorizationActionListener( final JColorChooser chooser, - final PhylogenyNode node, - final List additional_nodes ) { + SubtreeColorizationActionListener( final JColorChooser chooser, + final PhylogenyNode node, + final List additional_nodes ) { _chooser = chooser; _node = node; _additional_nodes = additional_nodes; @@ -5858,7 +5891,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee public void actionPerformed( final ActionEvent e ) { final Color c = _chooser.getColor(); if ( c != null ) { - colorizeNodes( c, _node, _additional_nodes ); + colorizeSubtree( c, _node, _additional_nodes ); } } }