X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FTreePanel.java;h=df7306be579142f5ddf3b91b499f774cb8bbc0e2;hb=362bd0a813f302f28631d9c9447dd8aa9ee0ceda;hp=e5510daad651c6ba0ff5a238a18c65168c07c994;hpb=75868964110d90c488348f014861f48bb6ae954d;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index e5510da..df7306b 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; @@ -97,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; @@ -110,11 +112,12 @@ 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.NodeVisualization; -import org.forester.phylogeny.data.NodeVisualization.NodeFill; -import org.forester.phylogeny.data.NodeVisualization.NodeShape; +import org.forester.phylogeny.data.NodeVisualData; +import org.forester.phylogeny.data.NodeVisualData.NodeFill; +import org.forester.phylogeny.data.NodeVisualData.NodeShape; import org.forester.phylogeny.data.PhylogenyDataUtil; import org.forester.phylogeny.data.PropertiesMap; import org.forester.phylogeny.data.Property; @@ -153,6 +156,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 +173,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 final static double OVERVIEW_FOUND_NODE_BOX_SIZE = 2; - private final static double OVERVIEW_FOUND_NODE_BOX_SIZE_HALF = 1; + private static final String SHOW_ONLY_THIS_CONF_TYPE = null; //TODO remove me HashMap _nodeid_dist_to_leaf = new HashMap(); final private Arc2D _arc = new Arc2D.Double(); private AffineTransform _at; @@ -201,6 +205,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; @@ -235,7 +240,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 ]; @@ -249,6 +253,9 @@ 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; + public final static boolean SPECIAL_DOMAIN_COLORING = true; // private Image offscreenImage; // private Graphics offscreenGraphics; // private Dimension offscreenDimension; @@ -500,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(), @@ -510,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 ); @@ -597,79 +605,79 @@ 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() ) { 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(); - } + final int txt = sb.length(); + if ( txt > longest_txt ) { + longest_txt = txt; + longest_txt_node = node; } - 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() + " ()" ); - } + boolean use_vis = false; + final Graphics2D g = ( Graphics2D ) getGraphics(); + if ( getControlPanel().isUseVisualStyles() ) { + use_vis = setFont( g, node, false ); } - if ( getControlPanel().isShowProperties() && node.getNodeData().isHasProperties() ) { - sum += getTreeFontSet()._fm_large.stringWidth( propertiesToString( node ).toString() ); + if ( !use_vis ) { + sum = getFontMetricsForLargeDefaultFont().stringWidth( sb.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 ( 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; } } @@ -738,11 +746,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 ); } } @@ -750,6 +758,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } + 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 = AptxUtil.calculateColorFromString( seq_name, false ); + getControlPanel().getSequenceColors().put( seq_name, c ); + } + return c; + } + void checkForVectorProperties( final Phylogeny phy ) { final DescriptiveStatistics stats = new BasicDescriptiveStatistics(); for( final PhylogenyNodeIterator iter = phy.iteratorPreorder(); iter.hasNext(); ) { @@ -869,13 +891,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final int colorizations = TreePanelUtil.colorPhylogenyAccordingToRanks( _phylogeny, rank, this ); if ( colorizations > 0 ) { _control_panel.setColorBranches( true ); - if ( _control_panel.getColorBranchesCb() != null ) { - _control_panel.getColorBranchesCb().setSelected( true ); + if ( _control_panel.getUseVisualStylesCb() != null ) { + _control_panel.getUseVisualStylesCb().setSelected( true ); } 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(); @@ -914,8 +939,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee AptxUtil.removeBranchColors( _phylogeny ); TreePanelUtil.colorPhylogenyAccordingToConfidenceValues( _phylogeny, this ); _control_panel.setColorBranches( true ); - if ( _control_panel.getColorBranchesCb() != null ) { - _control_panel.getColorBranchesCb().setSelected( true ); + if ( _control_panel.getUseVisualStylesCb() != null ) { + _control_panel.getUseVisualStylesCb().setSelected( true ); } setArrowCursor(); repaint(); @@ -981,7 +1006,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final Color getGraphicsForNodeBoxWithColorForParentBranch( final PhylogenyNode node ) { - if ( getControlPanel().isColorBranches() && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { + if ( getControlPanel().isUseVisualStyles() && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { return ( PhylogenyMethods.getBranchColorValue( node ) ); } else { @@ -1020,24 +1045,23 @@ 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() ) { + if ( node.isExternal() && node.getNodeData().isHasTaxonomy() ) { return calculateTaxonomyBasedColor( node.getNodeData().getTaxonomy() ); } // return non-colorized color return getTreeColorSet().getTaxonomyColor(); } - /** - * @return pointer to colorset for tree drawing - */ - final TreeColorSet getTreeColorSet() { + final Color getSequenceBasedColor( final PhylogenyNode node ) { + if ( node.getNodeData().isHasSequence() ) { + return calculateSequenceBasedColor( node.getNodeData().getSequence() ); + } + // return non-colorized color + return getTreeColorSet().getSequenceColor(); + } + + public final TreeColorSet getTreeColorSet() { return getMainPanel().getTreeColorSet(); } @@ -1067,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 { @@ -1082,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 ) ) { @@ -1640,7 +1670,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 +1715,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 ) { @@ -1879,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(); } @@ -2063,8 +2089,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee setWaitCursor(); TreePanelUtil.colorPhylogenyAccordingToExternalTaxonomy( _phylogeny, this ); _control_panel.setColorBranches( true ); - if ( _control_panel.getColorBranchesCb() != null ) { - _control_panel.getColorBranchesCb().setSelected( true ); + if ( _control_panel.getUseVisualStylesCb() != null ) { + _control_panel.getUseVisualStylesCb().setSelected( true ); } setEdited( true ); setArrowCursor(); @@ -2173,14 +2199,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 ] ); } } } @@ -2263,7 +2289,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee && !to_graphics_file && getCopiedAndPastedNodes().contains( node.getId() ) ) { g.setColor( getTreeColorSet().getFoundColor0() ); } - else if ( getControlPanel().isColorBranches() && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { + else if ( getControlPanel().isUseVisualStyles() && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { g.setColor( PhylogenyMethods.getBranchColorValue( node ) ); } else if ( to_pdf ) { @@ -2339,7 +2365,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() ) ) ); } /** @@ -2377,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 ) { @@ -2410,12 +2436,73 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee JOptionPane.WARNING_MESSAGE ); } + 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 ( f != null ) { + fc.setFont( f ); + } + 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(); + } + + final private void colorizeNodes( final Color c, + final PhylogenyNode node, + final List additional_nodes ) { + _control_panel.setColorBranches( true ); + if ( _control_panel.getUseVisualStylesCb() != null ) { + _control_panel.getUseVisualStylesCb().setSelected( true ); + } + if ( node != null ) { + colorizeNodesHelper( c, node ); + } + if ( additional_nodes != null ) { + for( final PhylogenyNode n : additional_nodes ) { + colorizeNodesHelper( c, n ); + } + } + repaint(); + } + final private void colorizeSubtree( final Color c, final PhylogenyNode node, final List additional_nodes ) { _control_panel.setColorBranches( true ); - if ( _control_panel.getColorBranchesCb() != null ) { - _control_panel.getColorBranchesCb().setSelected( true ); + if ( _control_panel.getUseVisualStylesCb() != null ) { + _control_panel.getUseVisualStylesCb().setSelected( true ); } if ( node != null ) { for( final PreorderTreeIterator it = new PreorderTreeIterator( node ); it.hasNext(); ) { @@ -2423,13 +2510,29 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } if ( additional_nodes != null ) { - for( final PhylogenyNode n : additional_nodes ) { - n.getBranchData().setBranchColor( new BranchColor( c ) ); + for( final PhylogenyNode an : additional_nodes ) { + for( final PreorderTreeIterator it = new PreorderTreeIterator( an ); it.hasNext(); ) { + it.next().getBranchData().setBranchColor( new BranchColor( c ) ); + } } } 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, @@ -2440,8 +2543,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } _color_chooser.setPreviewPanel( new JPanel() ); SubtreeColorizationActionListener al; - if ( ( getFoundNodes0() != null ) && !getFoundNodes0().isEmpty() ) { - final List additional_nodes = getFoundNodes0AsListOfPhylogenyNodes(); + if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { + final List additional_nodes = getFoundNodesAsListOfPhylogenyNodes(); al = new SubtreeColorizationActionListener( _color_chooser, node, additional_nodes ); } else { @@ -2621,22 +2724,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 ); @@ -2658,22 +2755,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 ); @@ -2764,18 +2855,29 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return getMainPanel().getCutOrCopiedTree(); } - private List getFoundNodes0AsListOfPhylogenyNodes() { - final List additional_nodes = new ArrayList(); - for( final Long id : getFoundNodes0() ) { - additional_nodes.add( _phylogeny.getNode( id ) ); - } - return additional_nodes; + private FontMetrics getFontMetricsForLargeDefaultFont() { + return getTreeFontSet().getFontMetricsLarge(); } - private List getFoundNodes1AsListOfPhylogenyNodes() { + List getFoundNodesAsListOfPhylogenyNodes() { final List additional_nodes = new ArrayList(); - for( final Long id : getFoundNodes1() ) { - additional_nodes.add( _phylogeny.getNode( id ) ); + if ( getFoundNodes0() != null ) { + for( final Long id : getFoundNodes0() ) { + 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 ) ) { + final PhylogenyNode n = _phylogeny.getNode( id ); + if ( n != null ) { + additional_nodes.add( n ); + } + } + } } return additional_nodes; } @@ -2894,6 +2996,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee case COLOR_SUBTREE: colorSubtree( node ); break; + case COLOR_NODE_FONT: + colorNodeFont( node ); + break; + case CHANGE_NODE_FONT: + changeNodeFont( node ); + break; case OPEN_SEQ_WEB: openSeqWeb( node ); break; @@ -3339,6 +3447,110 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } + private final void nodeDataAsSB( final PhylogenyNode node, final StringBuilder sb ) { + if ( node != null ) { + if ( getControlPanel().isShowNodeNames() && ( !ForesterUtil.isEmpty( node.getName() ) ) ) { + 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: @@ -3523,20 +3735,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 ); } } @@ -3785,10 +3997,13 @@ 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 ); } - else if ( getOptions().isColorLabelsSameAsParentBranch() && getControlPanel().isColorBranches() + else if ( getOptions().isColorLabelsSameAsParentBranch() && getControlPanel().isUseVisualStyles() && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { c = PhylogenyMethods.getBranchColorValue( node ); } @@ -3807,17 +4022,17 @@ 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 ); _polygon.lineTo( node.getXcoord() + 1, node.getYcoord() + d ); _polygon.closePath(); - if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.SOLID ) { + if ( getOptions().getDefaultNodeFill() == NodeVisualData.NodeFill.SOLID ) { g.setColor( c ); g.fill( _polygon ); } - else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.NONE ) { + else if ( getOptions().getDefaultNodeFill() == NodeVisualData.NodeFill.NONE ) { g.setColor( getBackground() ); g.fill( _polygon ); g.setColor( c ); @@ -3842,33 +4057,37 @@ 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( ")" ); + } } } } } 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; @@ -3883,12 +4102,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 ); } } @@ -3897,8 +4116,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 ) { @@ -3906,14 +4125,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 ); } } @@ -3925,8 +4147,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, @@ -3944,12 +4166,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; @@ -3957,6 +4192,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() ) { @@ -3969,18 +4212,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; @@ -3994,17 +4281,22 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee background, outline_color ); } - else if ( getOptions().getDefaultNodeFill() == NodeVisualization.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() == NodeVisualization.NodeShape.RECTANGLE ) { - if ( getOptions().getDefaultNodeFill() == NodeVisualization.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() == NodeVisualization.NodeFill.NONE ) { + else if ( fill == NodeVisualData.NodeFill.NONE ) { Color background = getBackground(); if ( to_pdf ) { background = Color.WHITE; @@ -4018,30 +4310,35 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee background, outline_color ); } - else if ( getOptions().getDefaultNodeFill() == NodeVisualization.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() + 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 ) ) { paintBranchLength( g, node, to_pdf, to_graphics_file ); } if ( !getControlPanel().isShowInternalData() && !node.isExternal() && !node.isCollapse() ) { - return; + return 0; } _sb.setLength( 0 ); int x = 0; @@ -4058,34 +4355,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().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().isColorBranches() - && ( 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( ")" ); } @@ -4093,58 +4367,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 ) ); - } - g.setFont( getTreeFontSet().getLargeFont() ); - if ( is_in_found_nodes ) { - g.setFont( getTreeFontSet().getLargeFont().deriveFont( Font.BOLD ) ); - } - double down_shift_factor = 3.0; + 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; } - 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 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 { + pos_y = ( node.getYcoord() + ( getFontMetrics( g.getFont() ).getAscent() / down_shift_factor ) ); + } final String sb_str = _sb.toString(); // GUILHEM_BEG ______________ if ( _control_panel.isShowSequenceRelations() && node.getNodeData().isHasSequence() @@ -4173,7 +4409,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; @@ -4205,19 +4441,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 ); @@ -4227,18 +4461,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 ); } @@ -4248,23 +4487,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, @@ -4277,23 +4518,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() @@ -4363,11 +4587,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 ) { @@ -4379,7 +4605,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; @@ -4389,13 +4621,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 ); @@ -4485,10 +4728,9 @@ 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; + 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; } @@ -4547,117 +4789,145 @@ 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 ) { - if ( isNodeDataInvisible( node ) && !to_graphics_file ) { + if ( isNodeDataInvisible( node ) && !( to_graphics_file || to_pdf ) ) { return; } if ( ( !getControlPanel().isShowInternalData() && !node.isExternal() ) ) { 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(); - } - 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() - + " " ); + 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 ); } - if ( getControlPanel().isShowTaxonomyCommonNames() - && ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getCommonName() ) ) ) { - x += getTreeFontSet()._fm_large_italic.stringWidth( node.getNodeData().getTaxonomy() - .getCommonName() - + " " ); + else { + rds.render( ( float ) ( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + _length_of_longest_text ), + node.getYcoord() - ( h / 2.0f ), + g, + this, + to_pdf ); } } - 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() ) - + " " ); - } + else { + rds.render( node.getXcoord() + x, node.getYcoord() - ( h / 2.0f ), 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 ); } - if ( getControlPanel().isShowNodeNames() && !ForesterUtil.isEmpty( node.getName() ) ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getName() + " " ); + else { + rds.render( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text, + node.getYcoord() - ( h / 2.0f ), + g, + this, + to_pdf ); } - rds.render( node.getXcoord() + x, node.getYcoord() - 3, 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 x = 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().isDrawPhylogram() ) { + rv.render( ( float ) ( node.getXcoord() + x + domain_add ), node.getYcoord() - 3, g, this, to_pdf ); } - if ( getControlPanel().isShowTaxonomyCode() && ( PhylogenyMethods.getSpecies( my_node ).length() > 0 ) ) { - x += getTreeFontSet()._fm_large_italic.stringWidth( PhylogenyMethods.getSpecies( my_node ) + " " ); + 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 ); } - if ( getControlPanel().isShowNodeNames() && ( my_node.getName().length() > 0 ) ) { - x += getTreeFontSet()._fm_large.stringWidth( my_node.getName() + " " ); + else { + rs.render( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text, + node.getYcoord() - ( h / 2.0f ), + g, + this, + to_pdf ); } - rv.render( my_node.getXcoord() + x, 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 ) { @@ -4774,84 +5044,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().isColorBranches() - && ( 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 ) @@ -4866,12 +5075,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, @@ -5098,6 +5305,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 ); } @@ -5106,6 +5352,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; } @@ -5203,15 +5464,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee private void showExtDescNodeData( final PhylogenyNode node ) { final List data = new ArrayList(); final List nodes = node.getAllExternalDescendants(); - if ( ( getFoundNodes0() != null ) && !getFoundNodes0().isEmpty() ) { - for( final PhylogenyNode n : getFoundNodes0AsListOfPhylogenyNodes() ) { - if ( !nodes.contains( n ) ) { - nodes.add( n ); - } - } - } - if ( ( getFoundNodes1() != null ) && !getFoundNodes1().isEmpty() ) { - for( final PhylogenyNode n : getFoundNodes1AsListOfPhylogenyNodes() ) { + if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { + for( final PhylogenyNode n : getFoundNodesAsListOfPhylogenyNodes() ) { if ( !nodes.contains( n ) ) { nodes.add( n ); } @@ -5598,9 +5852,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() ); } @@ -5706,8 +5957,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 ) { @@ -5715,6 +5973,34 @@ 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 NodeColorizationActionListener implements ActionListener { + + List _additional_nodes = null; + JColorChooser _chooser = null; + PhylogenyNode _node = null; + + NodeColorizationActionListener( final JColorChooser chooser, final PhylogenyNode node ) { + _chooser = chooser; + _node = node; + } + + NodeColorizationActionListener( final JColorChooser chooser, + final PhylogenyNode node, + final List additional_nodes ) { + _chooser = chooser; + _node = node; + _additional_nodes = additional_nodes; + } + + @Override + public void actionPerformed( final ActionEvent e ) { + final Color c = _chooser.getColor(); + if ( c != null ) { + colorizeNodes( c, _node, _additional_nodes ); + } + } + } + final private class SubtreeColorizationActionListener implements ActionListener { List _additional_nodes = null;