X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FTreePanel.java;h=9e88db2c2b772bd782aebcdcb8fd04f1ce67f86b;hb=28cf1afacf61a15e72411b1e58c3694f78d6d0dd;hp=ab1a7536e26389736fd5f461942959b0b1a040a8;hpb=4e20c9132065232b26afd38e8ce371b353a2686d;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index ab1a753..9e88db2 100644 --- a/forester/java/src/org/forester/archaeopteryx/TreePanel.java +++ b/forester/java/src/org/forester/archaeopteryx/TreePanel.java @@ -98,6 +98,7 @@ import org.forester.archaeopteryx.Options.CLADOGRAM_TYPE; 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; @@ -135,6 +136,7 @@ import org.forester.util.TaxonomyUtil; 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 ); @@ -163,6 +165,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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 ); @@ -172,6 +175,7 @@ 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 static final String SHOW_ONLY_THIS_CONF_TYPE = "posterior probability"; //TODO remove me HashMap _nodeid_dist_to_leaf = new HashMap(); final private Arc2D _arc = new Arc2D.Double(); private AffineTransform _at; @@ -251,7 +255,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee private float _x_correction_factor = 0.0f; private float _x_distance = 0.0f; private float _y_distance = 0.0f; - + private int _length_of_longest_text; + private int _longest_domain; // private Image offscreenImage; // private Graphics offscreenGraphics; // private Dimension offscreenDimension; @@ -520,6 +525,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } } + _length_of_longest_text = calcLengthOfLongestText(); } int ext_nodes = _phylogeny.getRoot().getNumberOfExternalNodes(); final int max_depth = PhylogenyMethods.calculateMaxDepth( _phylogeny ); @@ -601,6 +607,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } int longest = 30; int longest_txt = 0; + _longest_domain = 0; PhylogenyNode longest_txt_node = _phylogeny.getFirstExternalNode(); for( final PhylogenyNode node : _phylogeny.getExternalNodes() ) { int sum = 0; @@ -648,6 +655,15 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final DomainArchitecture d = node.getNodeData().getSequence().getDomainArchitecture(); sum += ( ( _domain_structure_width / ( ( RenderableDomainArchitecture ) d ).getOriginalSize() .getWidth() ) * d.getTotalLength() ) + 10; + if ( d.getTotalLength() > _longest_domain ) { + _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; @@ -731,11 +747,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } if ( c == null ) { if ( !ForesterUtil.isEmpty( tax.getTaxonomyCode() ) ) { - c = TreePanelUtil.calculateColorFromString( tax.getTaxonomyCode(), true ); + c = AptxUtil.calculateColorFromString( tax.getTaxonomyCode(), true ); getControlPanel().getSpeciesColors().put( tax.getTaxonomyCode(), c ); } else { - c = TreePanelUtil.calculateColorFromString( tax.getScientificName(), true ); + c = AptxUtil.calculateColorFromString( tax.getScientificName(), true ); getControlPanel().getSpeciesColors().put( tax.getScientificName(), c ); } } @@ -751,7 +767,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final String seq_name = seq.getName(); c = getControlPanel().getSequenceColors().get( seq_name ); if ( c == null ) { - c = TreePanelUtil.calculateColorFromString( seq_name, false ); + c = AptxUtil.calculateColorFromString( seq_name, false ); getControlPanel().getSequenceColors().put( seq_name, c ); } return c; @@ -883,6 +899,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _control_panel.getColorAccSpeciesCb().setSelected( false ); } _options.setColorLabelsSameAsParentBranch( true ); + if ( getMainPanel().getMainFrame()._color_labels_same_as_parent_branch != null ) { + getMainPanel().getMainFrame()._color_labels_same_as_parent_branch.setSelected( true ); + } _control_panel.repaint(); } setArrowCursor(); @@ -1028,7 +1047,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } 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 @@ -1043,10 +1062,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return getTreeColorSet().getSequenceColor(); } - /** - * @return pointer to colorset for tree drawing - */ - final TreeColorSet getTreeColorSet() { + public final TreeColorSet getTreeColorSet() { return getMainPanel().getTreeColorSet(); } @@ -1082,8 +1098,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { RenderableDomainArchitecture rds = null; if ( !( node.getNodeData().getSequence().getDomainArchitecture() instanceof RenderableDomainArchitecture ) ) { - rds = new RenderableDomainArchitecture( node.getNodeData().getSequence().getDomainArchitecture(), - getConfiguration() ); + 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 { @@ -1098,7 +1120,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } 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 ) ) { @@ -1616,14 +1638,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _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 ) ) { @@ -1967,16 +1995,13 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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(); @@ -2382,7 +2407,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( !ForesterUtil.isEmpty( ann_str ) ) { c = getControlPanel().getAnnotationColors().get( ann_str ); if ( c == null ) { - c = TreePanelUtil.calculateColorFromString( ann_str, false ); + c = AptxUtil.calculateColorFromString( ann_str, false ); getControlPanel().getAnnotationColors().put( ann_str, c ); } if ( c == null ) { @@ -2427,13 +2452,23 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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(); - } + List nodes = new ArrayList(); + 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() ); @@ -2455,9 +2490,37 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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 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 additional_nodes ) { @@ -2498,20 +2561,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee repaint(); } - private void colorNodeFont( final PhylogenyNode node ) { - _color_chooser.setPreviewPanel( new JPanel() ); - NodeColorizationActionListener al; - if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { - final List 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, @@ -2531,6 +2580,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final JDialog dialog = JColorChooser .createDialog( this, "Subtree colorization", true, _color_chooser, al, null ); + setEdited( true ); dialog.setVisible( true ); } @@ -2842,13 +2892,19 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final List additional_nodes = new ArrayList(); 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 ); + } } } } @@ -3421,48 +3477,53 @@ 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 ( 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() ); + sb.append( propertiesToString( node ) ); } } - 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 ) { @@ -4025,26 +4086,30 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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( ")" ); + } } } } @@ -4130,6 +4195,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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 ) @@ -4295,7 +4363,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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 ) ) { @@ -4666,7 +4734,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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() ) ) { @@ -4692,10 +4761,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } 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 ) { - // System.out.println( dynamic_hiding_factor ); if ( dynamic_hiding_factor > 4000 ) { min_dist = 4; } @@ -4735,7 +4802,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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, @@ -4773,9 +4840,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( ( !getControlPanel().isShowInternalData() && !node.isExternal() ) ) { return; } - int length_of_longest_text = -1; if ( getControlPanel().isShowDomainArchitectures() && node.getNodeData().isHasSequence() - && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { + && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) + && ( node.getNodeData().getSequence().getDomainArchitecture() instanceof RenderableDomainArchitecture ) ) { RenderableDomainArchitecture rds = null; try { rds = ( RenderableDomainArchitecture ) node.getNodeData().getSequence().getDomainArchitecture(); @@ -4784,27 +4851,57 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee cce.printStackTrace(); } if ( rds != null ) { - rds.setRenderingHeight( 6 ); + 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; + rds.setRenderingHeight( h > 1 ? h : 2 ); if ( getControlPanel().isDrawPhylogram() ) { - rds.render( node.getXcoord() + x, node.getYcoord() - 3, g, this, to_pdf ); + if ( getOptions().isLineUpRendarableNodeData() ) { + if ( getOptions().isRightLineUpDomains() ) { + 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( ( 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.0f ), g, this, to_pdf ); + } } else { - length_of_longest_text = calcLengthOfLongestText(); - rds.render( getPhylogeny().getFirstExternalNode().getXcoord() + length_of_longest_text, - node.getYcoord() - 3, - g, - this, - to_pdf ); + if ( getOptions().isRightLineUpDomains() ) { + rds.render( ( ( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text ) - 20 ) + + ( ( _longest_domain - rds.getTotalLength() ) * rds + .getRenderingFactorWidth() ), + node.getYcoord() - ( h / 2.0f ), + g, + this, + to_pdf ); + } + else { + rds.render( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text, + node.getYcoord() - ( h / 2.0f ), + g, + this, + to_pdf ); + } } } } - if ( getControlPanel().isShowVectorData() && ( node.getNodeData().getVector() != null ) && ( node.getNodeData().getVector().size() > 0 ) && ( getStatisticsForExpressionValues() != null ) ) { final RenderableVector rv = RenderableVector.createInstance( node.getNodeData().getVector(), getStatisticsForExpressionValues(), getConfiguration() ); - if ( rv != null ) { double domain_add = 0; if ( getControlPanel().isShowDomainArchitectures() && node.getNodeData().isHasSequence() @@ -4812,29 +4909,57 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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 { - if ( length_of_longest_text < 0 ) { - length_of_longest_text = calcLengthOfLongestText(); - } - rv.render( getPhylogeny().getFirstExternalNode().getXcoord() + length_of_longest_text + domain_add, - node.getYcoord() - 3, - g, - this, - to_pdf ); + rv.render( ( float ) ( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text + domain_add ), + node.getYcoord() - 3, + g, + this, + to_pdf ); + } + } + } + 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 ); } } } } - private int calcLengthOfLongestText() { + 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() + " " ); + return getFontMetricsForLargeDefaultFont().stringWidth( sb.toString() ); } final private void paintOvRectangle( final Graphics2D g ) { @@ -5319,6 +5444,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } private final void setupStroke( final Graphics2D g ) { + if ( getYdistance() < 0.0001 ) { + g.setStroke( STROKE_0025 ); + } if ( getYdistance() < 0.001 ) { g.setStroke( STROKE_005 ); } @@ -5334,7 +5462,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else if ( getYdistance() < 2 ) { g.setStroke( STROKE_075 ); } - else if ( getYdistance() < 20 ) { + else if ( ( getYdistance() < 20 ) || !getConfiguration().isAllowThickStrokes() ) { g.setStroke( STROKE_1 ); } else {