X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FTreePanel.java;h=bb31d7efdf239b047fa02f14737ff3b4fe33d007;hb=06b38f91bc061d8ab1dfea3b6238c94c95a30d26;hp=d58befb076c071ed8a0b8df36f78a7582697b203;hpb=0d2af94629bb51b07bfd784220aa19ea25038784;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index d58befb..bb31d7e 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; @@ -111,6 +112,7 @@ import org.forester.phylogeny.data.Accession; import org.forester.phylogeny.data.Annotation; import org.forester.phylogeny.data.BranchColor; import org.forester.phylogeny.data.Confidence; +import org.forester.phylogeny.data.DomainArchitecture; import org.forester.phylogeny.data.Event; import org.forester.phylogeny.data.NodeData.NODE_DATA; import org.forester.phylogeny.data.NodeVisualData; @@ -134,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 ); @@ -171,6 +174,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; @@ -202,6 +206,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee private float _last_drag_point_y = 0; private final Line2D _line = new Line2D.Float(); private int _longest_ext_node_info = 0; + private PhylogenyNode _ext_node_with_longest_txt_info = null; private MainPanel _main_panel = null; private double _max_distance_to_root = -1; private Popup _node_desc_popup; @@ -236,7 +241,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee private final StringBuilder _sb = new StringBuilder(); private double _scale_distance = 0.0; private String _scale_label = null; - // expression values menu: private DescriptiveStatistics _statistics_for_vector_data; private final Phylogeny[] _sub_phylogenies = new Phylogeny[ TreePanel.MAX_SUBTREES ]; private final PhylogenyNode[] _sub_phylogenies_temp_roots = new PhylogenyNode[ TreePanel.MAX_SUBTREES ]; @@ -250,6 +254,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; @@ -501,7 +507,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee calculateLongestExtNodeInfo(); if ( getOptions().isAllowFontSizeChange() ) { if ( ( getLongestExtNodeInfo() > ( x * 0.6 ) ) - && ( getTreeFontSet().getLargeFont().getSize() > 2 + TreeFontSet.FONT_SIZE_CHANGE_STEP ) ) { + && ( getTreeFontSet().getLargeFont().getSize() > ( 2 + TreeFontSet.FONT_SIZE_CHANGE_STEP ) ) ) { while ( ( getLongestExtNodeInfo() > ( x * 0.7 ) ) && ( getTreeFontSet().getLargeFont().getSize() > 2 ) ) { getMainPanel().getTreeFontSet().decreaseFontSize( getConfiguration().getMinBaseFontSize(), @@ -511,13 +517,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } else { while ( ( getLongestExtNodeInfo() < ( x * 0.6 ) ) - && ( getTreeFontSet().getLargeFont().getSize() <= getTreeFontSet().getLargeFontMemory() - .getSize() - TreeFontSet.FONT_SIZE_CHANGE_STEP ) ) { + && ( getTreeFontSet().getLargeFont().getSize() <= ( getTreeFontSet() + .getLargeFontMemory().getSize() - TreeFontSet.FONT_SIZE_CHANGE_STEP ) ) ) { getMainPanel().getTreeFontSet().increaseFontSize(); calculateLongestExtNodeInfo(); } } } + _length_of_longest_text = calcLengthOfLongestText(); } int ext_nodes = _phylogeny.getRoot().getNumberOfExternalNodes(); final int max_depth = PhylogenyMethods.calculateMaxDepth( _phylogeny ); @@ -598,6 +605,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee max_length = 40; } 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; if ( node.isCollapse() ) { @@ -608,6 +618,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( node.getNodeData().isHasTaxonomy() ) { nodeTaxonomyDataAsSB( node.getNodeData().getTaxonomy(), sb ); } + final int txt = sb.length(); + if ( txt > longest_txt ) { + longest_txt = txt; + longest_txt_node = node; + } boolean use_vis = false; final Graphics2D g = ( Graphics2D ) getGraphics(); if ( getControlPanel().isUseVisualStyles() ) { @@ -623,24 +638,46 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee sum += getFontMetricsForLargeDefaultFont().stringWidth( node.getNodeData().getBinaryCharacters() .getGainedCharactersAsStringBuffer().toString() ); } - - if ( getControlPanel().isShowVectorData() && node.getNodeData().getVector() != null && node.getNodeData().getVector().size() > 0 ) { - sum += RenderableVector.VECTOR_DEFAULT_WIDTH + 10; + if ( getControlPanel().isShowVectorData() && ( node.getNodeData().getVector() != null ) + && ( node.getNodeData().getVector().size() > 0 ) ) { + if ( getConfiguration() != null ) { + sum += getConfiguration().getVectorDataWidth() + 10; + } + else { + sum += RenderableVector.VECTOR_DEFAULT_WIDTH + 10; + } + } + if ( getControlPanel().isShowDomainArchitectures() && node.getNodeData().isHasSequence() + && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { + // FIXME + // TODO this might need some clean up + 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 ) { - setLongestExtNodeInfo( max_length ); + _longest_ext_node_info = max_length; return; } if ( sum > longest ) { longest = sum; } } + _ext_node_with_longest_txt_info = longest_txt_node; if ( longest >= max_length ) { - setLongestExtNodeInfo( max_length ); + _longest_ext_node_info = max_length; } else { - setLongestExtNodeInfo( longest ); + _longest_ext_node_info = longest; } } @@ -709,30 +746,30 @@ 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 ); } } 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; + 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 = AptxUtil.calculateColorFromString( seq_name, false ); + getControlPanel().getSequenceColors().put( seq_name, c ); + } + return c; } void checkForVectorProperties( final Phylogeny phy ) { @@ -860,8 +897,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( _control_panel.getColorAccSpeciesCb() != null ) { _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(); @@ -1006,15 +1045,13 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return _statistics_for_vector_data; } - 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 return getTreeColorSet().getTaxonomyColor(); } - final Color getSequenceBasedColor( final PhylogenyNode node ) { if ( node.getNodeData().isHasSequence() ) { @@ -1023,12 +1060,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee // return non-colorized color return getTreeColorSet().getSequenceColor(); } - - /** - * @return pointer to colorset for tree drawing - */ - final TreeColorSet getTreeColorSet() { + public final TreeColorSet getTreeColorSet() { return getMainPanel().getTreeColorSet(); } @@ -1058,14 +1091,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( ( _phylogeny == null ) || _phylogeny.isEmpty() ) { return; } - double max_original_domain_structure_width = 0.0; + double _max_original_domain_structure_width = 0.0; for( final PhylogenyNode node : _phylogeny.getExternalNodes() ) { if ( node.getNodeData().isHasSequence() && ( 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 { @@ -1073,14 +1112,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } if ( getControlPanel().isShowDomainArchitectures() ) { final double dsw = rds.getOriginalSize().getWidth(); - if ( dsw > max_original_domain_structure_width ) { - max_original_domain_structure_width = dsw; + if ( dsw > _max_original_domain_structure_width ) { + _max_original_domain_structure_width = dsw; } } } } 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 ) ) { @@ -1870,10 +1909,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _last_drag_point_y = y; } - final void setLongestExtNodeInfo( final int i ) { - _longest_ext_node_info = i; - } - final void setMediumFonts() { getTreeFontSet().mediumFonts(); } @@ -2368,7 +2403,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 ) { @@ -2376,7 +2411,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } } - return c; } @@ -2829,13 +2863,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 ); + } } } } @@ -3408,48 +3448,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 ) { @@ -3977,7 +4022,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee d = box_size; } final float xx = node.getXcoord() - ( 2 * box_size ); - final float xxx = xx > node.getParent().getXcoord() + 1 ? xx : node.getParent().getXcoord() + 1; + final float xxx = xx > ( node.getParent().getXcoord() + 1 ) ? xx : node.getParent().getXcoord() + 1; _polygon.reset(); _polygon.moveTo( xxx, node.getYcoord() ); _polygon.lineTo( node.getXcoord() + 1, node.getYcoord() - d ); @@ -4012,26 +4057,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( ")" ); + } } } } @@ -4117,6 +4166,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 ) @@ -4282,7 +4334,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 ) ) { @@ -4682,7 +4734,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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; } @@ -4761,44 +4812,125 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return; } 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; - if ( node.getNodeData().getSequence().getDomainArchitecture() instanceof RenderableDomainArchitecture ) { - try { - rds = ( RenderableDomainArchitecture ) node.getNodeData().getSequence().getDomainArchitecture(); - } - catch ( final ClassCastException cce ) { - cce.printStackTrace(); + try { + rds = ( RenderableDomainArchitecture ) node.getNodeData().getSequence().getDomainArchitecture(); + } + catch ( final ClassCastException cce ) { + cce.printStackTrace(); + } + if ( rds != 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; + rds.setRenderingHeight( h > 1 ? h : 2 ); + if ( getControlPanel().isDrawPhylogram() ) { + 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 ); + } } - if ( rds != null ) { - rds.setRenderingHeight( 6 ); - rds.render( node.getXcoord() + x, node.getYcoord() - 3, g, this, to_pdf ); + else { + 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 ) { - int xx = 0; - PhylogenyNode my_node = node; - if ( !getControlPanel().isDrawPhylogram() ) { - my_node = getPhylogeny().getFirstExternalNode(); + double domain_add = 0; + if ( getControlPanel().isShowDomainArchitectures() && node.getNodeData().isHasSequence() + && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { + domain_add = _domain_structure_width + 10; } - if ( getControlPanel().isShowTaxonomyCode() && ( PhylogenyMethods.getSpecies( my_node ).length() > 0 ) ) { - xx += getFontMetricsForLargeDefaultFont() - .stringWidth( PhylogenyMethods.getSpecies( my_node ) + " " ); + if ( getControlPanel().isDrawPhylogram() ) { + rv.render( ( float ) ( node.getXcoord() + x + domain_add ), node.getYcoord() - 3, g, this, to_pdf ); } - if ( getControlPanel().isShowNodeNames() && ( my_node.getName().length() > 0 ) ) { - xx += getFontMetricsForLargeDefaultFont().stringWidth( my_node.getName() + " " ); + else { + 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 ); } - rv.render( my_node.getXcoord() + xx, node.getYcoord() - 5, g, this, to_pdf ); } } - ////////////// + } + + final private int calcLengthOfLongestText() { + final StringBuilder sb = new StringBuilder(); + 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() ); } final private void paintOvRectangle( final Graphics2D g ) {