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.RenderableMsaSequence;
import org.forester.archaeopteryx.phylogeny.data.RenderableVector;
import org.forester.archaeopteryx.tools.Blast;
import org.forester.archaeopteryx.tools.ImageLoader;
public final class TreePanel extends JPanel implements ActionListener, MouseWheelListener, Printable {
+ public final static boolean SPECIAL_DOMAIN_COLORING = true;
final static Cursor ARROW_CURSOR = Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR );
final static Cursor CUT_CURSOR = Cursor.getPredefinedCursor( Cursor.CROSSHAIR_CURSOR );
final static Cursor HAND_CURSOR = Cursor.getPredefinedCursor( Cursor.HAND_CURSOR );
12 );
private static final float ROUNDED_D = 8;
private final static long serialVersionUID = -978349745916505029L;
+ private static final BasicStroke STROKE_0025 = new BasicStroke( 0.025f );
private static final BasicStroke STROKE_005 = new BasicStroke( 0.05f );
private static final BasicStroke STROKE_01 = new BasicStroke( 0.1f );
private static final BasicStroke STROKE_025 = new BasicStroke( 0.25f );
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 static final String SHOW_ONLY_THIS_CONF_TYPE = "posterior probability"; //TODO remove me
HashMap<Long, Short> _nodeid_dist_to_leaf = new HashMap<Long, Short>();
final private Arc2D _arc = new Arc2D.Double();
private AffineTransform _at;
_longest_domain = d.getTotalLength();
}
}
+ if ( getControlPanel().isShowMolSequences() && ( node.getNodeData().isHasSequence() )
+ && ( node.getNodeData().getSequence().isMolecularSequenceAligned() )
+ && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) ) {
+ // FIXME
+ sum += RenderableMsaSequence.DEFAULT_WIDTH + 30;
+ }
if ( sum >= max_length ) {
_longest_ext_node_info = max_length;
return;
}
final Color getTaxonomyBasedColor( final PhylogenyNode node ) {
- if ( node.getNodeData().isHasTaxonomy() ) {
+ if ( node.isExternal() && node.getNodeData().isHasTaxonomy() ) {
return calculateTaxonomyBasedColor( node.getNodeData().getTaxonomy() );
}
// return non-colorized color
&& ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) {
RenderableDomainArchitecture rds = null;
if ( !( node.getNodeData().getSequence().getDomainArchitecture() instanceof RenderableDomainArchitecture ) ) {
- rds = new RenderableDomainArchitecture( node.getNodeData().getSequence().getDomainArchitecture() );
+ if ( SPECIAL_DOMAIN_COLORING ) {
+ rds = new RenderableDomainArchitecture( node.getNodeData().getSequence()
+ .getDomainArchitecture(), node.getName() );
+ }
+ else {
+ rds = new RenderableDomainArchitecture( node.getNodeData().getSequence()
+ .getDomainArchitecture() );
+ }
node.getNodeData().getSequence().setDomainArchitecture( rds );
}
else {
}
}
if ( getControlPanel().isShowDomainArchitectures() ) {
- final double ds_factor_width = _domain_structure_width / _max_original_domain_structure_width;
+ final float ds_factor_width = ( float ) ( _domain_structure_width / _max_original_domain_structure_width );
for( final PhylogenyNode node : _phylogeny.getExternalNodes() ) {
if ( node.getNodeData().isHasSequence()
&& ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) {
_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 );
- //}
+ final boolean disallow_shortcutting = ( dynamic_hiding_factor < 40 )
+ || getControlPanel().isUseVisualStyles() || getOptions().isShowDefaultNodeShapesForMarkedNodes()
+ || ( ( getFoundNodes0() != null ) && !getFoundNodes0().isEmpty() )
+ || ( ( getFoundNodes1() != null ) && !getFoundNodes1().isEmpty() )
+ || ( ( getCurrentExternalNodes() != null ) && !getCurrentExternalNodes().isEmpty() )
+ || to_graphics_file || to_pdf;
for( final PhylogenyNode element : _nodes_in_preorder ) {
- paintNodeRectangular( g, element, to_pdf, getControlPanel().isDynamicallyHideData()
- && ( dynamic_hiding_factor > 1 ), dynamic_hiding_factor, to_graphics_file );
+ paintNodeRectangular( g,
+ element,
+ to_pdf,
+ getControlPanel().isDynamicallyHideData() && ( dynamic_hiding_factor > 1 ),
+ dynamic_hiding_factor,
+ to_graphics_file,
+ disallow_shortcutting );
}
if ( getOptions().isShowScale() && getControlPanel().isDrawPhylogram() && ( getScaleDistance() > 0.0 ) ) {
if ( !( to_graphics_file || to_pdf ) ) {
final void sortDescendants( final PhylogenyNode node ) {
if ( !node.isExternal() ) {
- DESCENDANT_SORT_PRIORITY pri = DESCENDANT_SORT_PRIORITY.TAXONOMY;
- if ( ( !getControlPanel().isShowTaxonomyScientificNames() && !getControlPanel().isShowTaxonomyCode() && !getControlPanel()
- .isShowTaxonomyCommonNames() ) ) {
- if ( ( getControlPanel().isShowSequenceAcc() || getControlPanel().isShowSeqNames() || getControlPanel()
- .isShowSeqSymbols() ) ) {
- pri = DESCENDANT_SORT_PRIORITY.SEQUENCE;
- }
- else if ( getControlPanel().isShowNodeNames() ) {
- pri = DESCENDANT_SORT_PRIORITY.NODE_NAME;
- }
+ DESCENDANT_SORT_PRIORITY pri = DESCENDANT_SORT_PRIORITY.NODE_NAME;
+ if ( getControlPanel().isShowTaxonomyScientificNames() || getControlPanel().isShowTaxonomyCode() ) {
+ pri = DESCENDANT_SORT_PRIORITY.TAXONOMY;
+ }
+ else if ( getControlPanel().isShowSeqNames() || getControlPanel().isShowSeqSymbols()
+ || getControlPanel().isShowGeneNames() ) {
+ pri = DESCENDANT_SORT_PRIORITY.SEQUENCE;
}
PhylogenyMethods.sortNodeDescendents( node, pri );
setNodeInPreorderToNull();
else {
fc.setFont( getMainPanel().getTreeFontSet().getLargeFont() );
}
- fc.showDialog( this, "Select Font" );
- if ( ( fc.getFont() != null ) && !ForesterUtil.isEmpty( fc.getFont().getFamily().trim() ) ) {
- List<PhylogenyNode> nodes = new ArrayList<PhylogenyNode>();
- if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) {
- nodes = getFoundNodesAsListOfPhylogenyNodes();
- }
+ List<PhylogenyNode> nodes = new ArrayList<PhylogenyNode>();
+ if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) {
+ nodes = getFoundNodesAsListOfPhylogenyNodes();
+ }
+ if ( !nodes.contains( node ) ) {
nodes.add( node );
+ }
+ final int count = nodes.size();
+ String title = "Change the font for ";
+ if ( count == 1 ) {
+ title += "one node";
+ }
+ else {
+ title += ( count + " nodes" );
+ }
+ fc.showDialog( this, title );
+ if ( ( fc.getFont() != null ) && !ForesterUtil.isEmpty( fc.getFont().getFamily().trim() ) ) {
for( final PhylogenyNode n : nodes ) {
if ( n.getNodeData().getNodeVisualData() == null ) {
n.getNodeData().setNodeVisualData( new NodeVisualData() );
getControlPanel().getUseVisualStylesCb().setSelected( true );
}
}
+ setEdited( true );
repaint();
}
+ private void colorNodeFont( final PhylogenyNode node ) {
+ _color_chooser.setPreviewPanel( new JPanel() );
+ NodeColorizationActionListener al;
+ int count = 1;
+ if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) {
+ final List<PhylogenyNode> additional_nodes = getFoundNodesAsListOfPhylogenyNodes();
+ al = new NodeColorizationActionListener( _color_chooser, node, additional_nodes );
+ count = additional_nodes.size();
+ if ( !additional_nodes.contains( node ) ) {
+ count++;
+ }
+ }
+ else {
+ al = new NodeColorizationActionListener( _color_chooser, node );
+ }
+ String title = "Change the (node and font) color for ";
+ if ( count == 1 ) {
+ title += "one node";
+ }
+ else {
+ title += ( count + " nodes" );
+ }
+ final JDialog dialog = JColorChooser.createDialog( this, title, true, _color_chooser, al, null );
+ setEdited( true );
+ dialog.setVisible( true );
+ }
+
final private void colorizeNodes( final Color c,
final PhylogenyNode node,
final List<PhylogenyNode> additional_nodes ) {
repaint();
}
- private void colorNodeFont( final PhylogenyNode node ) {
- _color_chooser.setPreviewPanel( new JPanel() );
- NodeColorizationActionListener al;
- if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) {
- final List<PhylogenyNode> additional_nodes = getFoundNodesAsListOfPhylogenyNodes();
- al = new NodeColorizationActionListener( _color_chooser, node, additional_nodes );
- }
- else {
- al = new NodeColorizationActionListener( _color_chooser, node );
- }
- final JDialog dialog = JColorChooser.createDialog( this, "Node colorization", true, _color_chooser, al, null );
- dialog.setVisible( true );
- }
-
final private void colorSubtree( final PhylogenyNode node ) {
if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) {
JOptionPane.showMessageDialog( this,
}
final JDialog dialog = JColorChooser
.createDialog( this, "Subtree colorization", true, _color_chooser, al, null );
+ setEdited( true );
dialog.setVisible( true );
}
final List<PhylogenyNode> additional_nodes = new ArrayList<PhylogenyNode>();
if ( getFoundNodes0() != null ) {
for( final Long id : getFoundNodes0() ) {
- additional_nodes.add( _phylogeny.getNode( id ) );
+ final PhylogenyNode n = _phylogeny.getNode( id );
+ if ( n != null ) {
+ additional_nodes.add( n );
+ }
}
}
if ( getFoundNodes1() != null ) {
for( final Long id : getFoundNodes1() ) {
if ( ( getFoundNodes0() == null ) || !getFoundNodes0().contains( id ) ) {
- additional_nodes.add( _phylogeny.getNode( id ) );
+ final PhylogenyNode n = _phylogeny.getNode( id );
+ if ( n != null ) {
+ additional_nodes.add( n );
+ }
}
}
}
}
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 ( node != null ) {
+ if ( getControlPanel().isShowNodeNames() && ( !ForesterUtil.isEmpty( node.getName() ) ) ) {
if ( sb.length() > 0 ) {
sb.append( " " );
}
- sb.append( node.getNodeData().getSequence().getSymbol() );
+ sb.append( node.getName() );
}
- if ( getControlPanel().isShowGeneNames() && ( node.getNodeData().getSequence().getGeneName().length() > 0 ) ) {
- if ( sb.length() > 0 ) {
- sb.append( " " );
+ 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() );
}
- sb.append( node.getNodeData().getSequence().getGeneName() );
- }
- if ( getControlPanel().isShowSeqNames() && ( node.getNodeData().getSequence().getName().length() > 0 ) ) {
- if ( sb.length() > 0 ) {
- sb.append( " " );
+ 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() );
}
- sb.append( node.getNodeData().getSequence().getName() );
}
- if ( getControlPanel().isShowSequenceAcc() && ( node.getNodeData().getSequence().getAccession() != null ) ) {
+ if ( getControlPanel().isShowProperties() && node.getNodeData().isHasProperties() ) {
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 ) );
}
- sb.append( propertiesToString( node ) );
}
}
Collections.sort( confidences );
final StringBuilder sb = new StringBuilder();
for( final Confidence confidence : confidences ) {
- final double value = confidence.getValue();
- if ( value != Confidence.CONFIDENCE_DEFAULT_VALUE ) {
- if ( value < getOptions().getMinConfidenceValue() ) {
- return;
- }
- if ( not_first ) {
- sb.append( "/" );
- }
- else {
- not_first = true;
- }
- sb.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( value, getOptions()
- .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) );
- if ( getOptions().isShowConfidenceStddev() ) {
- if ( confidence.getStandardDeviation() != Confidence.CONFIDENCE_DEFAULT_VALUE ) {
- sb.append( "(" );
- sb.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( confidence.getStandardDeviation(),
- getOptions()
- .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) );
- sb.append( ")" );
+ if ( ForesterUtil.isEmpty( SHOW_ONLY_THIS_CONF_TYPE )
+ || ( !ForesterUtil.isEmpty( confidence.getType() ) && confidence.getType()
+ .equalsIgnoreCase( SHOW_ONLY_THIS_CONF_TYPE ) ) ) {
+ final double value = confidence.getValue();
+ if ( value != Confidence.CONFIDENCE_DEFAULT_VALUE ) {
+ if ( value < getOptions().getMinConfidenceValue() ) {
+ return;
+ }
+ if ( not_first ) {
+ sb.append( "/" );
+ }
+ else {
+ not_first = true;
+ }
+ sb.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( value, getOptions()
+ .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) );
+ if ( getOptions().isShowConfidenceStddev() ) {
+ if ( confidence.getStandardDeviation() != Confidence.CONFIDENCE_DEFAULT_VALUE ) {
+ sb.append( "(" );
+ sb.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( confidence
+ .getStandardDeviation(), getOptions()
+ .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) );
+ sb.append( ")" );
+ }
}
}
}
if ( ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) )
|| ( getOptions().isShowDefaultNodeShapesExternal() && node.isExternal() )
|| ( getOptions().isShowDefaultNodeShapesInternal() && node.isInternal() )
+ || ( getOptions().isShowDefaultNodeShapesForMarkedNodes()
+ && ( node.getNodeData().getNodeVisualData() != null ) && ( !node.getNodeData()
+ .getNodeVisualData().isEmpty() ) )
|| ( getControlPanel().isUseVisualStyles() && ( ( node.getNodeData().getNodeVisualData() != null ) && ( ( node
.getNodeData().getNodeVisualData().getNodeColor() != null )
|| ( node.getNodeData().getNodeVisualData().getSize() != NodeVisualData.DEFAULT_SIZE )
if ( isNodeDataInvisible( node ) && !to_graphics_file && !to_pdf ) {
return 0;
}
- if ( getOptions().isShowBranchLengthValues()
+ if ( getControlPanel().isWriteBranchLengthValues()
&& ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR )
|| ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) )
&& ( !node.isRoot() ) && ( node.getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) ) {
final boolean to_pdf,
final boolean dynamically_hide,
final int dynamic_hiding_factor,
- final boolean to_graphics_file ) {
+ final boolean to_graphics_file,
+ final boolean disallow_shortcutting ) {
final boolean is_in_found_nodes = isInFoundNodes( node ) || isInCurrentExternalNodes( node );
if ( node.isCollapse() ) {
if ( ( !node.isRoot() && !node.getParent().isCollapse() ) ) {
}
float new_x = 0;
float new_x_min = Float.MAX_VALUE;
- final boolean disallow_shortcutting = ( dynamic_hiding_factor < 40 );
float min_dist = 1.5f;
if ( !disallow_shortcutting ) {
if ( dynamic_hiding_factor > 4000 ) {
final float diff_y = node.getYcoord() - y2;
final float diff_x = node.getXcoord() - new_x;
if ( disallow_shortcutting || ( diff_y > min_dist ) || ( diff_y < -min_dist ) || ( diff_x > min_dist )
- || ( diff_x < -min_dist ) || to_graphics_file || to_pdf ) {
+ || ( diff_x < -min_dist ) ) {
paintBranchRectangular( g,
node.getXcoord(),
new_x,
if ( getControlPanel().isDrawPhylogram() ) {
if ( getOptions().isLineUpRendarableNodeData() ) {
if ( getOptions().isRightLineUpDomains() ) {
- rds.render( ( getMaxDistanceToRoot() * getXcorrectionFactor() )
- + _length_of_longest_text
- + ( ( _longest_domain - rds.getTotalLength() ) * rds
- .getRenderingFactorWidth() ),
- node.getYcoord() - ( h / 2 ),
- g,
- this,
- to_pdf );
+ rds.render( ( float ) ( ( getMaxDistanceToRoot() * getXcorrectionFactor() )
+ + _length_of_longest_text + ( ( _longest_domain - rds.getTotalLength() ) * rds
+ .getRenderingFactorWidth() ) ), node.getYcoord() - ( h / 2.0f ), g, this, to_pdf );
}
else {
- rds.render( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + _length_of_longest_text,
- node.getYcoord() - ( h / 2 ),
+ rds.render( ( float ) ( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + _length_of_longest_text ),
+ node.getYcoord() - ( h / 2.0f ),
g,
this,
to_pdf );
}
}
else {
- rds.render( node.getXcoord() + x, node.getYcoord() - ( h / 2 ), g, this, to_pdf );
+ rds.render( node.getXcoord() + x, node.getYcoord() - ( h / 2.0f ), g, this, to_pdf );
}
}
else {
rds.render( ( ( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text ) - 20 )
+ ( ( _longest_domain - rds.getTotalLength() ) * rds
.getRenderingFactorWidth() ),
- node.getYcoord() - ( h / 2 ),
+ node.getYcoord() - ( h / 2.0f ),
g,
this,
to_pdf );
}
else {
rds.render( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text,
- node.getYcoord() - ( h / 2 ),
+ node.getYcoord() - ( h / 2.0f ),
g,
this,
to_pdf );
domain_add = _domain_structure_width + 10;
}
if ( getControlPanel().isDrawPhylogram() ) {
- rv.render( node.getXcoord() + x + domain_add, node.getYcoord() - 3, g, this, to_pdf );
+ rv.render( ( float ) ( node.getXcoord() + x + domain_add ), node.getYcoord() - 3, g, this, to_pdf );
}
else {
- rv.render( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text + domain_add,
+ rv.render( ( float ) ( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text + domain_add ),
node.getYcoord() - 3,
g,
this,
}
}
}
+ if ( getControlPanel().isShowMolSequences() && ( node.getNodeData().isHasSequence() )
+ && ( node.getNodeData().getSequence().isMolecularSequenceAligned() )
+ && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) ) {
+ final RenderableMsaSequence rs = RenderableMsaSequence.createInstance( node.getNodeData().getSequence()
+ .getMolecularSequence(), node.getNodeData().getSequence().getType(), getConfiguration() );
+ if ( rs != null ) {
+ final int default_height = 7;
+ float y = getYdistance();
+ if ( getControlPanel().isDynamicallyHideData() ) {
+ y = getTreeFontSet().getFontMetricsLarge().getHeight();
+ }
+ final int h = y < default_height ? ForesterUtil.roundToInt( y ) : default_height;
+ rs.setRenderingHeight( h > 1 ? h : 2 );
+ if ( getControlPanel().isDrawPhylogram() ) {
+ rs.render( ( float ) ( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + _length_of_longest_text ),
+ node.getYcoord() - ( h / 2.0f ),
+ g,
+ this,
+ to_pdf );
+ }
+ else {
+ rs.render( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text,
+ node.getYcoord() - ( h / 2.0f ),
+ g,
+ this,
+ to_pdf );
+ }
+ }
+ }
}
final private int calcLengthOfLongestText() {
final StringBuilder sb = new StringBuilder();
- nodeDataAsSB( _ext_node_with_longest_txt_info, sb );
- if ( _ext_node_with_longest_txt_info.getNodeData().isHasTaxonomy() ) {
- nodeTaxonomyDataAsSB( _ext_node_with_longest_txt_info.getNodeData().getTaxonomy(), sb );
+ if ( _ext_node_with_longest_txt_info != null ) {
+ nodeDataAsSB( _ext_node_with_longest_txt_info, sb );
+ if ( _ext_node_with_longest_txt_info.getNodeData().isHasTaxonomy() ) {
+ nodeTaxonomyDataAsSB( _ext_node_with_longest_txt_info.getNodeData().getTaxonomy(), sb );
+ }
}
return getFontMetricsForLargeDefaultFont().stringWidth( sb.toString() );
}
}
private final void setupStroke( final Graphics2D g ) {
+ if ( getYdistance() < 0.0001 ) {
+ g.setStroke( STROKE_0025 );
+ }
if ( getYdistance() < 0.001 ) {
g.setStroke( STROKE_005 );
}
else if ( getYdistance() < 2 ) {
g.setStroke( STROKE_075 );
}
- else if ( getYdistance() < 20 ) {
+ else if ( ( getYdistance() < 20 ) || !getConfiguration().isAllowThickStrokes() ) {
g.setStroke( STROKE_1 );
}
else {