X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FTreePanel.java;h=38afbce942c16853aa662c5156c9cf25005747e5;hb=046e97b211db481219195ad13875ad03ddc2225d;hp=e3585e60de88a37c0cc3342e8fdc5b6e053b1c51;hpb=d5acaad5dd6a6f088ff1edc4839a68301e378c2b;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index e3585e6..38afbce 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; @@ -113,13 +114,14 @@ 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.NodeDataField; 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; +import org.forester.phylogeny.data.ProteinDomain; import org.forester.phylogeny.data.Sequence; import org.forester.phylogeny.data.SequenceRelation; import org.forester.phylogeny.data.Taxonomy; @@ -135,6 +137,7 @@ import org.forester.util.TaxonomyUtil; public final class TreePanel extends JPanel implements ActionListener, MouseWheelListener, Printable { + public final static boolean SPECIAL_DOMAIN_COLORING = true; final static Cursor ARROW_CURSOR = Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR ); final static Cursor CUT_CURSOR = Cursor.getPredefinedCursor( Cursor.CROSSHAIR_CURSOR ); final static Cursor HAND_CURSOR = Cursor.getPredefinedCursor( Cursor.HAND_CURSOR ); @@ -163,6 +166,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 12 ); private static final float ROUNDED_D = 8; private final static long serialVersionUID = -978349745916505029L; + private static final BasicStroke STROKE_0025 = new BasicStroke( 0.025f ); private static final BasicStroke STROKE_005 = new BasicStroke( 0.05f ); private static final BasicStroke STROKE_01 = new BasicStroke( 0.1f ); private static final BasicStroke STROKE_025 = new BasicStroke( 0.25f ); @@ -172,6 +176,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 = null; //TODO remove me HashMap _nodeid_dist_to_leaf = new HashMap(); final private Arc2D _arc = new Arc2D.Double(); private AffineTransform _at; @@ -301,7 +306,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee calculateScaleDistance(); FORMATTER_CONFIDENCE.setMaximumFractionDigits( configuration.getNumberOfDigitsAfterCommaForConfidenceValues() ); FORMATTER_BRANCH_LENGTH.setMaximumFractionDigits( configuration - .getNumberOfDigitsAfterCommaForBranchLengthValues() ); + .getNumberOfDigitsAfterCommaForBranchLengthValues() ); } @Override @@ -333,8 +338,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } /** - * Get a pointer to the phylogeny - * + * Get a pointer to the phylogeny + * * @return a pointer to the phylogeny */ public final Phylogeny getPhylogeny() { @@ -467,7 +472,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee /** * Set a phylogeny tree. - * + * * @param t * an instance of a Phylogeny */ @@ -494,35 +499,29 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee /** * Set parameters for printing the displayed tree - * + * */ - final void calcParametersForPainting( final int x, final int y, final boolean recalc_longest_ext_node_info ) { + final void calcParametersForPainting( final int x, final int y ) { // updateStyle(); not needed? if ( ( _phylogeny != null ) && !_phylogeny.isEmpty() ) { initNodeData(); - if ( recalc_longest_ext_node_info ) { - calculateLongestExtNodeInfo(); - if ( getOptions().isAllowFontSizeChange() ) { - if ( ( getLongestExtNodeInfo() > ( x * 0.6 ) ) - && ( getTreeFontSet().getLargeFont().getSize() > ( 2 + TreeFontSet.FONT_SIZE_CHANGE_STEP ) ) ) { - while ( ( getLongestExtNodeInfo() > ( x * 0.7 ) ) - && ( getTreeFontSet().getLargeFont().getSize() > 2 ) ) { - getMainPanel().getTreeFontSet().decreaseFontSize( getConfiguration().getMinBaseFontSize(), - true ); - calculateLongestExtNodeInfo(); - } - } - else { - while ( ( getLongestExtNodeInfo() < ( x * 0.6 ) ) - && ( getTreeFontSet().getLargeFont().getSize() <= ( getTreeFontSet() - .getLargeFontMemory().getSize() - TreeFontSet.FONT_SIZE_CHANGE_STEP ) ) ) { - getMainPanel().getTreeFontSet().increaseFontSize(); - calculateLongestExtNodeInfo(); - } - } + calculateLongestExtNodeInfo(); + if ( ( getLongestExtNodeInfo() > ( x * 0.6 ) ) + && ( getTreeFontSet().getLargeFont().getSize() > ( 2 + TreeFontSet.FONT_SIZE_CHANGE_STEP ) ) ) { + while ( ( getLongestExtNodeInfo() > ( x * 0.7 ) ) && ( getTreeFontSet().getLargeFont().getSize() > 2 ) ) { + getMainPanel().getTreeFontSet().decreaseFontSize( getConfiguration().getMinBaseFontSize(), true ); + calculateLongestExtNodeInfo(); } - _length_of_longest_text = calcLengthOfLongestText(); } + else { + while ( ( getLongestExtNodeInfo() < ( x * 0.6 ) ) + && ( 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 ); if ( ext_nodes == 1 ) { @@ -569,24 +568,22 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _circ_max_depth = max_depth; setUpUrtFactor(); // - if ( getOptions().isAllowFontSizeChange() ) { - if ( ( getPhylogenyGraphicsType() != PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) - && ( getPhylogenyGraphicsType() != PHYLOGENY_GRAPHICS_TYPE.CIRCULAR ) ) { - // int dynamic_hiding_factor = calcDynamicHidingFactor(); - // if ( dynamic_hiding_factor > 1 ) { - // while ( dynamic_hiding_factor > 1 - // && getTreeFontSet()._fm_large.getHeight() > TreeFontSet.SMALL_FONTS_BASE ) { - // getTreeFontSet().decreaseFontSize( 1, true ); - // dynamic_hiding_factor = calcDynamicHidingFactor(); - // } - // } - // else if ( getTreeFontSet().isDecreasedSizeBySystem() ) { - // while ( dynamic_hiding_factor < 1 && getTreeFontSet()._fm_large.getHeight() < 12 ) { - // getTreeFontSet().increaseFontSize(); - // dynamic_hiding_factor = calcDynamicHidingFactor(); - // } - // } - } + if ( ( getPhylogenyGraphicsType() != PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) + && ( getPhylogenyGraphicsType() != PHYLOGENY_GRAPHICS_TYPE.CIRCULAR ) ) { + // int dynamic_hiding_factor = calcDynamicHidingFactor(); + // if ( dynamic_hiding_factor > 1 ) { + // while ( dynamic_hiding_factor > 1 + // && getTreeFontSet()._fm_large.getHeight() > TreeFontSet.SMALL_FONTS_BASE ) { + // getTreeFontSet().decreaseFontSize( 1, true ); + // dynamic_hiding_factor = calcDynamicHidingFactor(); + // } + // } + // else if ( getTreeFontSet().isDecreasedSizeBySystem() ) { + // while ( dynamic_hiding_factor < 1 && getTreeFontSet()._fm_large.getHeight() < 12 ) { + // getTreeFontSet().increaseFontSize(); + // dynamic_hiding_factor = calcDynamicHidingFactor(); + // } + // } } // } @@ -597,7 +594,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return; } int max_length = ForesterUtil.roundToInt( ( getSize().getWidth() - MOVE ) - * Constants.EXT_NODE_INFO_LENGTH_MAX_RATIO ); + * Constants.EXT_NODE_INFO_LENGTH_MAX_RATIO ); if ( max_length < 40 ) { max_length = 40; } @@ -633,7 +630,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } if ( getControlPanel().isShowBinaryCharacters() && node.getNodeData().isHasBinaryCharacters() ) { sum += getFontMetricsForLargeDefaultFont().stringWidth( node.getNodeData().getBinaryCharacters() - .getGainedCharactersAsStringBuffer().toString() ); + .getGainedCharactersAsStringBuffer().toString() ); } if ( getControlPanel().isShowVectorData() && ( node.getNodeData().getVector() != null ) && ( node.getNodeData().getVector().size() > 0 ) ) { @@ -646,7 +643,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } if ( getControlPanel().isShowDomainArchitectures() && node.getNodeData().isHasSequence() && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { - // FIXME + // FIXME // TODO this might need some clean up final DomainArchitecture d = node.getNodeData().getSequence().getDomainArchitecture(); sum += ( ( _domain_structure_width / ( ( RenderableDomainArchitecture ) d ).getOriginalSize() @@ -655,9 +652,15 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _longest_domain = d.getTotalLength(); } } + if ( getControlPanel().isShowMolSequences() && ( node.getNodeData().isHasSequence() ) + && ( node.getNodeData().getSequence().isMolecularSequenceAligned() ) + && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) ) { + // FIXME + sum += RenderableMsaSequence.DEFAULT_WIDTH + 30; + } if ( sum >= max_length ) { _longest_ext_node_info = max_length; - return; + // return; //FIXME why? } if ( sum > longest ) { longest = sum; @@ -670,6 +673,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else { _longest_ext_node_info = longest; } + _length_of_longest_text = calcLengthOfLongestText(); } final void calculateScaleDistance() { @@ -783,7 +787,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } catch ( final NumberFormatException e ) { JOptionPane.showMessageDialog( this, "Could not parse \"" + value_str - + "\" into a decimal value", "Problem with Vector Data", JOptionPane.ERROR_MESSAGE ); + + "\" into a decimal value", "Problem with Vector Data", JOptionPane.ERROR_MESSAGE ); return; } int i = -1; @@ -793,7 +797,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee catch ( final NumberFormatException e ) { JOptionPane.showMessageDialog( this, "Could not parse \"" + index_str - + "\" into index for vector data", + + "\" into index for vector data", "Problem with Vector Data", JOptionPane.ERROR_MESSAGE ); return; @@ -828,7 +832,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee /** * Collapse the tree from the given node - * + * * @param node * a PhylogenyNode */ @@ -937,7 +941,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee repaint(); } - final void decreaseDomainStructureEvalueThreshold() { + final void decreaseDomainStructureEvalueThresholdExp() { if ( _domain_structure_e_value_thr_exp > -20 ) { _domain_structure_e_value_thr_exp -= 1; } @@ -945,7 +949,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee /** * Find the node, if any, at the given location - * + * * @param x * @param y * @return pointer to the node at x,y, null if not found @@ -984,7 +988,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return _current_external_nodes_data_buffer_change_counter; } - final int getDomainStructureEvalueThreshold() { + final int getDomainStructureEvalueThresholdExp() { return _domain_structure_e_value_thr_exp; } @@ -1037,7 +1041,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final Color getTaxonomyBasedColor( final PhylogenyNode node ) { - if ( node.getNodeData().isHasTaxonomy() ) { + if ( node.isExternal() && node.getNodeData().isHasTaxonomy() ) { return calculateTaxonomyBasedColor( node.getNodeData().getTaxonomy() ); } // return non-colorized color @@ -1072,7 +1076,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return _y_distance; } - final void increaseDomainStructureEvalueThreshold() { + final void increaseDomainStructureEvalueThresholdExp() { if ( _domain_structure_e_value_thr_exp < 3 ) { _domain_structure_e_value_thr_exp += 1; } @@ -1088,7 +1092,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { RenderableDomainArchitecture rds = null; if ( !( node.getNodeData().getSequence().getDomainArchitecture() instanceof RenderableDomainArchitecture ) ) { - rds = new RenderableDomainArchitecture( node.getNodeData().getSequence().getDomainArchitecture() ); + 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 { @@ -1103,7 +1114,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } if ( getControlPanel().isShowDomainArchitectures() ) { - final double ds_factor_width = _domain_structure_width / _max_original_domain_structure_width; + final float ds_factor_width = ( float ) ( _domain_structure_width / _max_original_domain_structure_width ); for( final PhylogenyNode node : _phylogeny.getExternalNodes() ) { if ( node.getNodeData().isHasSequence() && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { @@ -1120,14 +1131,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return ( ( e.getX() > ( getVisibleRect().x + getOvXPosition() + 1 ) ) && ( e.getX() < ( ( getVisibleRect().x + getOvXPosition() + getOvMaxWidth() ) - 1 ) ) && ( e.getY() > ( getVisibleRect().y + getOvYPosition() + 1 ) ) && ( e.getY() < ( ( getVisibleRect().y - + getOvYPosition() + getOvMaxHeight() ) - 1 ) ) ); + + getOvYPosition() + getOvMaxHeight() ) - 1 ) ) ); } final boolean inOvRectangle( final MouseEvent e ) { return ( ( e.getX() >= ( getOvRectangle().getX() - 1 ) ) && ( e.getX() <= ( getOvRectangle().getX() + getOvRectangle().getWidth() + 1 ) ) && ( e.getY() >= ( getOvRectangle().getY() - 1 ) ) && ( e.getY() <= ( getOvRectangle().getY() - + getOvRectangle().getHeight() + 1 ) ) ); + + getOvRectangle().getHeight() + 1 ) ) ); } final boolean isApplet() { @@ -1232,7 +1243,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee y = max_y; } getMainPanel().getCurrentScrollPane().getViewport() - .setViewPosition( new Point( ForesterUtil.roundToInt( x ), ForesterUtil.roundToInt( y ) ) ); + .setViewPosition( new Point( ForesterUtil.roundToInt( x ), ForesterUtil.roundToInt( y ) ) ); setInOvRect( true ); repaint(); } @@ -1480,7 +1491,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( isInFoundNodes( c ) || isInCurrentExternalNodes( c ) ) { g.setColor( getColorForFoundNode( c ) ); drawRectFilled( c.getXSecondary() - OVERVIEW_FOUND_NODE_BOX_SIZE_HALF, c.getYSecondary() - - OVERVIEW_FOUND_NODE_BOX_SIZE_HALF, OVERVIEW_FOUND_NODE_BOX_SIZE, OVERVIEW_FOUND_NODE_BOX_SIZE, g ); + - OVERVIEW_FOUND_NODE_BOX_SIZE_HALF, OVERVIEW_FOUND_NODE_BOX_SIZE, OVERVIEW_FOUND_NODE_BOX_SIZE, g ); } } @@ -1570,7 +1581,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else { if ( !to_graphics_file ) { g.setPaint( new GradientPaint( r.x, r.y, getTreeColorSet().getBackgroundColor(), r.x, r.y - + r.height, getTreeColorSet().getBackgroundColorGradientBottom() ) ); + + r.height, getTreeColorSet().getBackgroundColorGradientBottom() ) ); g.fill( r ); } else { @@ -1604,7 +1615,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } // Position starting Y of tree _phylogeny.getRoot().setYcoord( ( getYdistance() * _phylogeny.getRoot().getNumberOfExternalNodes() ) - + ( TreePanel.MOVE / 2.0f ) ); + + ( TreePanel.MOVE / 2.0f ) ); final int dynamic_hiding_factor = calcDynamicHidingFactor(); if ( getControlPanel().isDynamicallyHideData() ) { if ( dynamic_hiding_factor > 1 ) { @@ -1621,14 +1632,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _nodes_in_preorder[ i++ ] = it.next(); } } - //final PhylogenyNodeIterator it; - //for( it = _phylogeny.iteratorPreorder(); it.hasNext(); ) { - // paintNodeRectangular( g, it.next(), to_pdf, getControlPanel().isDynamicallyHideData() - // && ( dynamic_hiding_factor > 1 ), dynamic_hiding_factor, to_graphics_file ); - //} + final boolean disallow_shortcutting = ( dynamic_hiding_factor < 40 ) + || getControlPanel().isUseVisualStyles() || getOptions().isShowDefaultNodeShapesForMarkedNodes() + || ( ( getFoundNodes0() != null ) && !getFoundNodes0().isEmpty() ) + || ( ( getFoundNodes1() != null ) && !getFoundNodes1().isEmpty() ) + || ( ( getCurrentExternalNodes() != null ) && !getCurrentExternalNodes().isEmpty() ) + || to_graphics_file || to_pdf; for( final PhylogenyNode element : _nodes_in_preorder ) { - paintNodeRectangular( g, element, to_pdf, getControlPanel().isDynamicallyHideData() - && ( dynamic_hiding_factor > 1 ), dynamic_hiding_factor, to_graphics_file ); + paintNodeRectangular( g, + element, + to_pdf, + getControlPanel().isDynamicallyHideData() && ( dynamic_hiding_factor > 1 ), + dynamic_hiding_factor, + to_graphics_file, + disallow_shortcutting ); } if ( getOptions().isShowScale() && getControlPanel().isDrawPhylogram() && ( getScaleDistance() > 0.0 ) ) { if ( !( to_graphics_file || to_pdf ) ) { @@ -1734,7 +1751,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee y_pos + radius_ov, ( int ) ( radius_ov - ( getLongestExtNodeInfo() / ( getVisibleRect().width / getOvRectangle() .getWidth() ) ) ), - g ); + g ); g.setTransform( _at ); paintOvRectangle( g ); } @@ -1816,20 +1833,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee x = TreePanel.MOVE + getLongestExtNodeInfo() + ForesterUtil - .roundToInt( ( getXcorrectionFactor() * getPhylogeny().getHeight() ) + getXdistance() ); + .roundToInt( ( getXcorrectionFactor() * getPhylogeny().getHeight() ) + getXdistance() ); } else { if ( !isNonLinedUpCladogram() && !isUniformBranchLengthsForCladogram() ) { x = TreePanel.MOVE + getLongestExtNodeInfo() + ForesterUtil.roundToInt( getXdistance() - * ( getPhylogeny().getRoot().getNumberOfExternalNodes() + 2 ) ); + * ( getPhylogeny().getRoot().getNumberOfExternalNodes() + 2 ) ); } else { x = TreePanel.MOVE + getLongestExtNodeInfo() + ForesterUtil.roundToInt( getXdistance() - * ( PhylogenyMethods.calculateMaxDepth( getPhylogeny() ) + 1 ) ); + * ( PhylogenyMethods.calculateMaxDepth( getPhylogeny() ) + 1 ) ); } } setPreferredSize( new Dimension( x, y ) ); @@ -1972,16 +1989,13 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final void sortDescendants( final PhylogenyNode node ) { if ( !node.isExternal() ) { - DESCENDANT_SORT_PRIORITY pri = DESCENDANT_SORT_PRIORITY.TAXONOMY; - if ( ( !getControlPanel().isShowTaxonomyScientificNames() && !getControlPanel().isShowTaxonomyCode() && !getControlPanel() - .isShowTaxonomyCommonNames() ) ) { - if ( ( getControlPanel().isShowSequenceAcc() || getControlPanel().isShowSeqNames() || getControlPanel() - .isShowSeqSymbols() ) ) { - pri = DESCENDANT_SORT_PRIORITY.SEQUENCE; - } - else if ( getControlPanel().isShowNodeNames() ) { - pri = DESCENDANT_SORT_PRIORITY.NODE_NAME; - } + DESCENDANT_SORT_PRIORITY pri = DESCENDANT_SORT_PRIORITY.NODE_NAME; + if ( getControlPanel().isShowTaxonomyScientificNames() || getControlPanel().isShowTaxonomyCode() ) { + pri = DESCENDANT_SORT_PRIORITY.TAXONOMY; + } + else if ( getControlPanel().isShowSeqNames() || getControlPanel().isShowSeqSymbols() + || getControlPanel().isShowGeneNames() ) { + pri = DESCENDANT_SORT_PRIORITY.SEQUENCE; } PhylogenyMethods.sortNodeDescendents( node, pri ); setNodeInPreorderToNull(); @@ -2355,7 +2369,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee /** * Calculate the length of the distance between the given node and its * parent. - * + * * @param node * @param ext_node_x * @factor @@ -2432,13 +2446,23 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else { fc.setFont( getMainPanel().getTreeFontSet().getLargeFont() ); } - fc.showDialog( this, "Select Font" ); - if ( ( fc.getFont() != null ) && !ForesterUtil.isEmpty( fc.getFont().getFamily().trim() ) ) { - List nodes = new ArrayList(); - if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { - nodes = getFoundNodesAsListOfPhylogenyNodes(); - } + List nodes = new ArrayList(); + if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { + nodes = getFoundNodesAsListOfPhylogenyNodes(); + } + if ( !nodes.contains( node ) ) { nodes.add( node ); + } + final int count = nodes.size(); + String title = "Change the font for "; + if ( count == 1 ) { + title += "one node"; + } + else { + title += ( count + " nodes" ); + } + fc.showDialog( this, title ); + if ( ( fc.getFont() != null ) && !ForesterUtil.isEmpty( fc.getFont().getFamily().trim() ) ) { for( final PhylogenyNode n : nodes ) { if ( n.getNodeData().getNodeVisualData() == null ) { n.getNodeData().setNodeVisualData( new NodeVisualData() ); @@ -2460,9 +2484,37 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee getControlPanel().getUseVisualStylesCb().setSelected( true ); } } + setEdited( true ); repaint(); } + private void colorNodeFont( final PhylogenyNode node ) { + _color_chooser.setPreviewPanel( new JPanel() ); + NodeColorizationActionListener al; + int count = 1; + if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { + final List additional_nodes = getFoundNodesAsListOfPhylogenyNodes(); + al = new NodeColorizationActionListener( _color_chooser, node, additional_nodes ); + count = additional_nodes.size(); + if ( !additional_nodes.contains( node ) ) { + count++; + } + } + else { + al = new NodeColorizationActionListener( _color_chooser, node ); + } + String title = "Change the (node and font) color for "; + if ( count == 1 ) { + title += "one node"; + } + else { + title += ( count + " nodes" ); + } + final JDialog dialog = JColorChooser.createDialog( this, title, true, _color_chooser, al, null ); + setEdited( true ); + dialog.setVisible( true ); + } + final private void colorizeNodes( final Color c, final PhylogenyNode node, final List additional_nodes ) { @@ -2503,20 +2555,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee repaint(); } - private void colorNodeFont( final PhylogenyNode node ) { - _color_chooser.setPreviewPanel( new JPanel() ); - NodeColorizationActionListener al; - if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { - final List additional_nodes = getFoundNodesAsListOfPhylogenyNodes(); - al = new NodeColorizationActionListener( _color_chooser, node, additional_nodes ); - } - else { - al = new NodeColorizationActionListener( _color_chooser, node ); - } - final JDialog dialog = JColorChooser.createDialog( this, "Node colorization", true, _color_chooser, al, null ); - dialog.setVisible( true ); - } - final private void colorSubtree( final PhylogenyNode node ) { if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) { JOptionPane.showMessageDialog( this, @@ -2536,6 +2574,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final JDialog dialog = JColorChooser .createDialog( this, "Subtree colorization", true, _color_chooser, al, null ); + setEdited( true ); dialog.setVisible( true ); } @@ -2847,13 +2886,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 ); + } } } } @@ -3062,7 +3107,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return ( ( x >= ( getOvVirtualRectangle().x - 1 ) ) && ( x <= ( getOvVirtualRectangle().x + getOvVirtualRectangle().width + 1 ) ) && ( y >= ( getOvVirtualRectangle().y - 1 ) ) && ( y <= ( getOvVirtualRectangle().y - + getOvVirtualRectangle().height + 1 ) ) ); + + getOvVirtualRectangle().height + 1 ) ) ); } final private boolean inOvVirtualRectangle( final MouseEvent e ) { @@ -3089,8 +3134,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee && ( ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getScientificName() ) ) || ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getTaxonomyCode() ) ) || ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getCommonName() ) ) || ( ( node - .getNodeData().getTaxonomy().getIdentifier() != null ) && !ForesterUtil.isEmpty( node - .getNodeData().getTaxonomy().getIdentifier().getValue() ) ) ) ) { + .getNodeData().getTaxonomy().getIdentifier() != null ) && !ForesterUtil.isEmpty( node + .getNodeData().getTaxonomy().getIdentifier().getValue() ) ) ) ) { return true; } else { @@ -3125,14 +3170,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } return ( ( node.getYcoord() < ( getVisibleRect().getMinY() - y_dist ) ) || ( node.getYcoord() > ( getVisibleRect().getMaxY() + y_dist ) ) || ( ( node.getParent() != null ) && ( node - .getParent().getXcoord() > getVisibleRect().getMaxX() ) ) ); + .getParent().getXcoord() > getVisibleRect().getMaxX() ) ) ); } final private boolean isNodeDataInvisibleUnrootedCirc( final PhylogenyNode node ) { return ( ( node.getYcoord() < ( getVisibleRect().getMinY() - 20 ) ) || ( node.getYcoord() > ( getVisibleRect().getMaxY() + 20 ) ) || ( node.getXcoord() < ( getVisibleRect().getMinX() - 20 ) ) || ( node.getXcoord() > ( getVisibleRect() - .getMaxX() + 20 ) ) ); + .getMaxX() + 20 ) ) ); } final private boolean isNonLinedUpCladogram() { @@ -3360,7 +3405,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else { _node_popup_menu_items[ i ].setEnabled( false ); } - // + } + else if ( title.startsWith( Configuration.clickto_options[ Configuration.get_ext_desc_data ][ 0 ] ) ) { + _node_popup_menu_items[ i ] + .setText( Configuration.clickto_options[ Configuration.get_ext_desc_data ][ 0 ] + ": " + + getOptions().getExtDescNodeDataToReturn().toString() ); } else if ( title.equals( Configuration.clickto_options[ Configuration.open_tax_web ][ 0 ] ) ) { _node_popup_menu_items[ i ].setEnabled( isCanOpenTaxWeb( node ) ); @@ -3530,33 +3579,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } private final String obtainTitleForExtDescNodeData() { - switch ( getOptions().getExtDescNodeDataToReturn() ) { - case NODE_NAME: - return "Node Names"; - case GENE_NAME: - return "Gene Names"; - case SEQUENCE_NAME: - return "Sequence Names"; - case SEQUENCE_SYMBOL: - return "Sequence Symbols"; - case SEQUENCE_MOL_SEQ: - return "Molecular Sequences"; - case SEQUENCE_MOL_SEQ_FASTA: - return "Molecular Sequences (Fasta)"; - case SEQUENCE_ACC: - return "Sequence Accessors"; - case TAXONOMY_SCIENTIFIC_NAME: - return "Scientific Names"; - case TAXONOMY_CODE: - return "Taxonomy Codes"; - case TAXONOMY_COMM0N_NAME: - return "Taxonomy Common Names"; - case UNKNOWN: - return "User Selected Data"; - default: - throw new IllegalArgumentException( "unknown data element: " - + getOptions().getExtDescNodeDataToReturn() ); - } + return getOptions().getExtDescNodeDataToReturn().toString(); } final private void openPdbWeb( final PhylogenyNode node ) { @@ -3572,7 +3595,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee AptxUtil.launchWebBrowser( new URI( uri_str ), isApplet(), isApplet() ? obtainApplet() : null, - "_aptx_seq" ); + "_aptx_seq" ); } catch ( final IOException e ) { AptxUtil.showErrorMessage( this, e.toString() ); @@ -3600,7 +3623,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee AptxUtil.launchWebBrowser( new URI( uri_str ), isApplet(), isApplet() ? obtainApplet() : null, - "_aptx_seq" ); + "_aptx_seq" ); } catch ( final IOException e ) { AptxUtil.showErrorMessage( this, e.toString() ); @@ -3683,7 +3706,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee AptxUtil.launchWebBrowser( new URI( uri_str ), isApplet(), isApplet() ? obtainApplet() : null, - "_aptx_tax" ); + "_aptx_tax" ); } catch ( final IOException e ) { AptxUtil.showErrorMessage( this, e.toString() ); @@ -3713,20 +3736,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().getSmallMaxDescent(), 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().getSmallMaxDescent(), 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().getSmallMaxDescent(), g ); + .getXcoord() + 3, node.getYcoord() - getTreeFontSet().getSmallMaxDescent(), g ); } } else { TreePanel.drawString( FORMATTER_BRANCH_LENGTH.format( node.getDistanceToParent() ), 3, node.getYcoord() - - getTreeFontSet().getSmallMaxDescent(), g ); + - getTreeFontSet().getSmallMaxDescent(), g ); } } @@ -3748,7 +3771,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final float dx = x2 - x1; final float dy = y2 - y1; _cubic_curve.setCurve( x1, y1, x1 + ( dx * 0.4f ), y1 + ( dy * 0.2f ), x1 + ( dx * 0.6f ), y1 - + ( dy * 0.8f ), x2, y2 ); + + ( dy * 0.8f ), x2, y2 ); ( g ).draw( _cubic_curve ); } else { @@ -3765,7 +3788,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee /** * Paint a branch which consists of a vertical and a horizontal bar - * @param is_ind_found_nodes + * @param is_ind_found_nodes */ final private void paintBranchRectangular( final Graphics2D g, final float x1, @@ -3787,7 +3810,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final float dx = x2 - x1; final float dy = y2 - y1; _cubic_curve.setCurve( x1, y1, x1 + ( dx * 0.4f ), y1 + ( dy * 0.2f ), x1 + ( dx * 0.6f ), y1 - + ( dy * 0.8f ), x2, y2 ); + + ( dy * 0.8f ), x2, y2 ); g.draw( _cubic_curve ); } else { @@ -4035,26 +4058,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( ")" ); + } } } } @@ -4078,10 +4105,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final String conf_str = sb.toString(); TreePanel.drawString( conf_str, parent_x - + ( ( x - parent_x - getTreeFontSet().getFontMetricsSmall() - .stringWidth( conf_str ) ) / 2 ), - ( node.getYcoord() + getTreeFontSet().getSmallMaxAscent() ) - 1, - g ); + + ( ( x - parent_x - getTreeFontSet().getFontMetricsSmall() + .stringWidth( conf_str ) ) / 2 ), + ( node.getYcoord() + getTreeFontSet().getSmallMaxAscent() ) - 1, + g ); } } @@ -4098,24 +4125,24 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee g.setColor( Color.BLUE ); } TreePanel - .drawString( gained, - parent_x - + ( ( x - parent_x - getFontMetricsForLargeDefaultFont().stringWidth( gained ) ) / 2 ), - ( node.getYcoord() - getFontMetricsForLargeDefaultFont().getMaxDescent() ), - g ); + .drawString( gained, + 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 - getFontMetricsForLargeDefaultFont().stringWidth( lost ) ) / 2 ), - ( node.getYcoord() + getFontMetricsForLargeDefaultFont().getMaxAscent() ), - g ); + .drawString( lost, + parent_x + + ( ( x - parent_x - getFontMetricsForLargeDefaultFont().stringWidth( lost ) ) / 2 ), + ( node.getYcoord() + getFontMetricsForLargeDefaultFont().getMaxAscent() ), + g ); } } /** * Draw a box at the indicated node. - * + * * @param x * @param y * @param node @@ -4140,15 +4167,18 @@ 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() ) ) ) { + || ( 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 ) + || ( 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() ) ) ) { NodeVisualData vis = null; if ( getControlPanel().isUseVisualStyles() && ( node.getNodeData().getNodeVisualData() != null ) && ( !node.getNodeData().getNodeVisualData().isEmpty() ) ) { @@ -4305,10 +4335,10 @@ 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 ) ) { + && ( !node.isRoot() ) && ( node.getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) ) { paintBranchLength( g, node, to_pdf, to_graphics_file ); } if ( !getControlPanel().isShowInternalData() && !node.isExternal() && !node.isCollapse() ) { @@ -4376,21 +4406,21 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final boolean fGotRelationWithQuery = ( seqRelation.getRef0().isEqual( _query_sequence ) || seqRelation .getRef1().isEqual( _query_sequence ) ) && seqRelation.getType().equals( getControlPanel().getSequenceRelationTypeBox() - .getSelectedItem() ); + .getSelectedItem() ); if ( fGotRelationWithQuery ) { // we will underline the text to show that this sequence is ortholog to the query final double linePosX = node.getXcoord() + 2 + half_box_size; final String sConfidence = ( !getControlPanel().isShowSequenceRelationConfidence() || ( seqRelation .getConfidence() == null ) ) ? null : " (" + seqRelation.getConfidence().getValue() - + ")"; + + ")"; if ( sConfidence != null ) { float confidenceX = pos_x; if ( sb_str.length() > 0 ) { confidenceX += new TextLayout( sb_str, g.getFont(), _frc ).getBounds().getWidth() + CONFIDENCE_LEFT_MARGIN; } - if ( confidenceX > linePosX ) { // let's only display confidence value if we are already displaying at least one of Prot/Gene Name and Taxonomy Code + if ( confidenceX > linePosX ) { // let's only display confidence value if we are already displaying at least one of Prot/Gene Name and Taxonomy Code final int confidenceWidth = ( int ) new TextLayout( sConfidence, g.getFont(), _frc ) - .getBounds().getWidth(); + .getBounds().getWidth(); TreePanel.drawString( sConfidence, confidenceX, pos_y, g ); x += CONFIDENCE_LEFT_MARGIN + confidenceWidth; } @@ -4404,7 +4434,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee nodeTextBoundsWidth += 2; } g.drawLine( ( int ) linePosX + 1, 3 + ( int ) pos_y, ( int ) linePosX + x - + nodeTextBoundsWidth, 3 + ( int ) pos_y ); + + nodeTextBoundsWidth, 3 + ( int ) pos_y ); break; } } @@ -4435,7 +4465,7 @@ 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() - + ( getFontMetricsForLargeDefaultFont().getAscent() / down_shift_factor ), g ); + + ( getFontMetricsForLargeDefaultFont().getAscent() / down_shift_factor ), g ); _sb.setLength( 0 ); _sb.append( ann_str ); if ( _sb.length() > 0 ) { @@ -4460,22 +4490,22 @@ 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() - + ( getFontMetricsForLargeDefaultFont().getAscent() / down_shift_factor ), g ); + .toString(), node.getXcoord() + x + 1 + half_box_size, node.getYcoord() + + ( getFontMetricsForLargeDefaultFont().getAscent() / down_shift_factor ), g ); paintGainedAndLostCharacters( g, node, node.getNodeData().getBinaryCharacters() - .getGainedCharactersAsStringBuffer().toString(), node.getNodeData().getBinaryCharacters() - .getLostCharactersAsStringBuffer().toString() ); + .getGainedCharactersAsStringBuffer().toString(), node.getNodeData().getBinaryCharacters() + .getLostCharactersAsStringBuffer().toString() ); } else { TreePanel - .drawString( " " + node.getNodeData().getBinaryCharacters().getPresentCount(), - node.getXcoord() + x + 4 + half_box_size, - node.getYcoord() - + ( getFontMetricsForLargeDefaultFont().getAscent() / down_shift_factor ), - g ); + .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() ); + + node.getNodeData().getBinaryCharacters().getLostCount() ); } } } @@ -4632,7 +4662,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) ) { g.setColor( getColorForFoundNode( node ) ); drawRectFilled( node.getXSecondary() - OVERVIEW_FOUND_NODE_BOX_SIZE_HALF, node.getYSecondary() - - OVERVIEW_FOUND_NODE_BOX_SIZE_HALF, OVERVIEW_FOUND_NODE_BOX_SIZE, OVERVIEW_FOUND_NODE_BOX_SIZE, g ); + - OVERVIEW_FOUND_NODE_BOX_SIZE_HALF, OVERVIEW_FOUND_NODE_BOX_SIZE, OVERVIEW_FOUND_NODE_BOX_SIZE, g ); } float new_x = 0; if ( !node.isExternal() && !node.isCollapse() ) { @@ -4676,7 +4706,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final boolean to_pdf, final boolean dynamically_hide, final int dynamic_hiding_factor, - final boolean to_graphics_file ) { + final boolean to_graphics_file, + final boolean disallow_shortcutting ) { final boolean is_in_found_nodes = isInFoundNodes( node ) || isInCurrentExternalNodes( node ); if ( node.isCollapse() ) { if ( ( !node.isRoot() && !node.getParent().isCollapse() ) ) { @@ -4693,7 +4724,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee && !node.isRoot() && ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) ) - && node.getBranchData().isHasConfidences() ) { + && node.getBranchData().isHasConfidences() ) { paintConfidenceValues( g, node, to_pdf, to_graphics_file ); } // Draw a line to root: @@ -4702,7 +4733,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } float new_x = 0; float new_x_min = Float.MAX_VALUE; - final boolean disallow_shortcutting = ( dynamic_hiding_factor < 40 ); float min_dist = 1.5f; if ( !disallow_shortcutting ) { if ( dynamic_hiding_factor > 4000 ) { @@ -4744,7 +4774,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final float diff_y = node.getYcoord() - y2; final float diff_x = node.getXcoord() - new_x; if ( disallow_shortcutting || ( diff_y > min_dist ) || ( diff_y < -min_dist ) || ( diff_x > min_dist ) - || ( diff_x < -min_dist ) || to_graphics_file || to_pdf ) { + || ( diff_x < -min_dist ) ) { paintBranchRectangular( g, node.getXcoord(), new_x, @@ -4760,11 +4790,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } paintNodeBox( node.getXcoord(), node.getYcoord(), node, g, to_pdf, to_graphics_file ); } + if ( getControlPanel().isShowMolSequences() && ( node.getNodeData().isHasSequence() ) + && ( node.getNodeData().getSequence().isMolecularSequenceAligned() ) + && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) ) { + paintMolecularSequences( g, node, to_pdf ); + } 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() ) < getFontMetricsForLargeDefaultFont() - .getHeight() ) ) ) ) ) { + .getHeight() ) ) ) ) ) { return; } final int x = paintNodeData( g, node, to_graphics_file, to_pdf, is_in_found_nodes ); @@ -4803,40 +4838,35 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( getControlPanel().isDrawPhylogram() ) { if ( getOptions().isLineUpRendarableNodeData() ) { if ( getOptions().isRightLineUpDomains() ) { - rds.render( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) - + _length_of_longest_text - + ( ( _longest_domain - rds.getTotalLength() ) * rds - .getRenderingFactorWidth() ), - node.getYcoord() - ( h / 2 ), - g, - this, - to_pdf ); + rds.render( ( float ) ( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + + _length_of_longest_text + ( ( _longest_domain - rds.getTotalLength() ) * rds + .getRenderingFactorWidth() ) ), node.getYcoord() - ( h / 2.0f ), g, this, to_pdf ); } else { - rds.render( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + _length_of_longest_text, - node.getYcoord() - ( h / 2 ), + rds.render( ( float ) ( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + _length_of_longest_text ), + node.getYcoord() - ( h / 2.0f ), g, this, to_pdf ); } } else { - rds.render( node.getXcoord() + x, node.getYcoord() - ( h / 2 ), g, this, to_pdf ); + rds.render( node.getXcoord() + x, node.getYcoord() - ( h / 2.0f ), g, this, to_pdf ); } } else { if ( getOptions().isRightLineUpDomains() ) { rds.render( ( ( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text ) - 20 ) - + ( ( _longest_domain - rds.getTotalLength() ) * rds - .getRenderingFactorWidth() ), - node.getYcoord() - ( h / 2 ), - g, - this, - to_pdf ); + + ( ( _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 ), + node.getYcoord() - ( h / 2.0f ), g, this, to_pdf ); @@ -4856,10 +4886,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee domain_add = _domain_structure_width + 10; } if ( getControlPanel().isDrawPhylogram() ) { - rv.render( node.getXcoord() + x + domain_add, node.getYcoord() - 3, g, this, to_pdf ); + rv.render( ( float ) ( node.getXcoord() + x + domain_add ), node.getYcoord() - 3, g, this, to_pdf ); } else { - rv.render( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text + domain_add, + rv.render( ( float ) ( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text + domain_add ), node.getYcoord() - 3, g, this, @@ -4867,6 +4897,39 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } } + + //if ( getControlPanel().isShowMolSequences() && ( node.getNodeData().isHasSequence() ) + // && ( node.getNodeData().getSequence().isMolecularSequenceAligned() ) + // && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) ) { + // paintMolecularSequences( g, node, to_pdf ); + //} + } + + private void paintMolecularSequences( final Graphics2D g, final PhylogenyNode node, final boolean to_pdf ) { + final RenderableMsaSequence rs = RenderableMsaSequence.createInstance( node.getNodeData().getSequence() + .getMolecularSequence(), node.getNodeData().getSequence().getType(), getConfiguration() ); + if ( rs != null ) { + final int default_height = 8; + float y = getYdistance(); + + final int h = ( y / 2) < default_height ? ForesterUtil.roundToInt( y * 2 ) : default_height; + rs.setRenderingHeight( h > 1 ? h : 1 ); + + if ( getControlPanel().isDrawPhylogram() ) { + rs.render( ( float ) ( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + _length_of_longest_text ), + node.getYcoord() - ( h / 2.0f ), + g, + this, + to_pdf ); + } + else { + rs.render( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text, + node.getYcoord() - ( h / 2.0f ), + g, + this, + to_pdf ); + } + } } final private int calcLengthOfLongestText() { @@ -4917,9 +4980,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final private void paintPhylogenyLite( final Graphics2D g ) { _phylogeny - .getRoot() - .setXSecondary( ( float ) ( getVisibleRect().x + getOvXPosition() + ( MOVE / ( getVisibleRect().width / getOvRectangle() - .getWidth() ) ) ) ); + .getRoot() + .setXSecondary( ( float ) ( getVisibleRect().x + getOvXPosition() + ( MOVE / ( getVisibleRect().width / getOvRectangle() + .getWidth() ) ) ) ); _phylogeny.getRoot().setYSecondary( ( getVisibleRect().y + getOvYStart() ) ); final Stroke s = g.getStroke(); g.setStroke( STROKE_05 ); @@ -4933,8 +4996,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee /** * Paint the root branch. (Differs from others because it will always be a * single horizontal line). - * @param to_graphics_file - * + * @param to_graphics_file + * * @return new x1 value */ final private void paintRootBranch( final Graphics2D g, @@ -5019,7 +5082,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final Rectangle2D nodeTextBounds = new TextLayout( label, g.getFont(), new FontRenderContext( null, false, false ) ) - .getBounds(); + .getBounds(); g.fillRect( ( int ) start_x - 1, ( int ) start_y - 8, ( int ) nodeTextBounds.getWidth() + 4, 11 ); g.setColor( getTreeColorSet().getBackgroundColor() ); } @@ -5362,6 +5425,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } private final void setupStroke( final Graphics2D g ) { + if ( getYdistance() < 0.0001 ) { + g.setStroke( STROKE_0025 ); + } if ( getYdistance() < 0.001 ) { g.setStroke( STROKE_005 ); } @@ -5377,7 +5443,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else if ( getYdistance() < 2 ) { g.setStroke( STROKE_075 ); } - else if ( getYdistance() < 20 ) { + else if ( ( getYdistance() < 20 ) || !getConfiguration().isAllowThickStrokes() ) { g.setStroke( STROKE_1 ); } else { @@ -5446,12 +5512,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee data.add( n.getNodeData().getSequence().getSymbol() ); } break; - case SEQUENCE_MOL_SEQ: - if ( n.getNodeData().isHasSequence() - && !ForesterUtil.isEmpty( n.getNodeData().getSequence().getMolecularSequence() ) ) { - data.add( n.getNodeData().getSequence().getMolecularSequence() ); - } - break; case SEQUENCE_MOL_SEQ_FASTA: final StringBuilder sb = new StringBuilder(); if ( n.getNodeData().isHasSequence() @@ -5501,7 +5561,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee ann_str = ann.toString(); } sb.append( SequenceWriter.toFasta( ann_str, n.getNodeData().getSequence() - .getMolecularSequence(), 60 ) ); + .getMolecularSequence(), 60 ) ); data.add( sb.toString() ); } break; @@ -5517,18 +5577,58 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee data.add( n.getNodeData().getTaxonomy().getScientificName() ); } break; - case TAXONOMY_COMM0N_NAME: - if ( n.getNodeData().isHasTaxonomy() - && !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getCommonName() ) ) { - data.add( n.getNodeData().getTaxonomy().getCommonName() ); - } - break; case TAXONOMY_CODE: if ( n.getNodeData().isHasTaxonomy() && !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getTaxonomyCode() ) ) { data.add( n.getNodeData().getTaxonomy().getTaxonomyCode() ); } break; + case DOMAINS_ALL: + case DOMAINS_COLLAPSED_PER_PROTEIN: + if ( n.getNodeData().isHasSequence() + && ( n.getNodeData().getSequence().getDomainArchitecture() != null ) ) { + final DomainArchitecture da = n.getNodeData().getSequence().getDomainArchitecture(); + final Set s = new HashSet(); + for( int i = 0; i < da.getDomains().size(); ++i ) { + final ProteinDomain d = da.getDomain( i ); + if ( d.getConfidence() <= Math.pow( 10, getDomainStructureEvalueThresholdExp() ) ) { + final String name = d.getName(); + if ( !( s.contains( name ) ) ) { + data.add( name ); + if ( getOptions().getExtDescNodeDataToReturn() == NodeDataField.DOMAINS_COLLAPSED_PER_PROTEIN ) { + s.add( name ); + } + } + } + } + } + break; + case SEQ_ANNOTATIONS: + if ( n.getNodeData().isHasSequence() ) { + if ( n.getNodeData().isHasSequence() + && ( n.getNodeData().getSequence().getAnnotations() != null ) ) { + final SortedSet a = n.getNodeData().getSequence().getAnnotations(); + for( int i = 0; i < a.size(); ++i ) { + data.add( n.getNodeData().getSequence().getAnnotation( i ).toString() ); + } + } + } + break; + case GO_TERM_IDS: + if ( n.getNodeData().isHasSequence() ) { + if ( n.getNodeData().isHasSequence() + && ( n.getNodeData().getSequence().getAnnotations() != null ) ) { + final SortedSet a = n.getNodeData().getSequence().getAnnotations(); + for( int i = 0; i < a.size(); ++i ) { + final Annotation ann = n.getNodeData().getSequence().getAnnotation( i ); + final String ref = ann.getRef(); + if ( ref.toUpperCase().startsWith( "GO:" ) ) { + data.add( ref ); + } + } + } + } + break; case UNKNOWN: TreePanelUtil.showExtDescNodeDataUserSelectedHelper( getControlPanel(), n, data ); break; @@ -5538,7 +5638,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } // for loop final StringBuilder sb = new StringBuilder(); - final int size = TreePanelUtil.makeSB( data, getOptions(), sb ); + final int size = TreePanelUtil.nodeDataIntoStringBuffer( data, getOptions(), sb ); if ( ( getConfiguration().getExtNodeDataReturnOn() == EXT_NODE_DATA_RETURN_ON.CONSOLE ) || ( getConfiguration().getExtNodeDataReturnOn() == EXT_NODE_DATA_RETURN_ON.BUFFER_ONLY ) ) { if ( getConfiguration().getExtNodeDataReturnOn() == EXT_NODE_DATA_RETURN_ON.CONSOLE ) { @@ -5554,14 +5654,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else if ( getConfiguration().getExtNodeDataReturnOn() == EXT_NODE_DATA_RETURN_ON.WINODW ) { if ( sb.length() < 1 ) { TreePanelUtil.showInformationMessage( this, "No Appropriate Data (" + obtainTitleForExtDescNodeData() - + ")", "Descendants of selected node do not contain selected data" ); + + ")", "Descendants of selected node do not contain selected data" ); clearCurrentExternalNodesDataBuffer(); } else { setCurrentExternalNodesDataBuffer( sb ); String title; if ( ( getFoundNodes0() != null ) && !getFoundNodes0().isEmpty() ) { - title = ( getOptions().getExtDescNodeDataToReturn() == NODE_DATA.UNKNOWN ? "Data" + title = ( getOptions().getExtDescNodeDataToReturn() == NodeDataField.UNKNOWN ? "Data" : obtainTitleForExtDescNodeData() ) + " for " + data.size() @@ -5569,7 +5669,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee + size; } else { - title = ( getOptions().getExtDescNodeDataToReturn() == NODE_DATA.UNKNOWN ? "Data" + title = ( getOptions().getExtDescNodeDataToReturn() == NodeDataField.UNKNOWN ? "Data" : obtainTitleForExtDescNodeData() ) + " for " + data.size() @@ -5596,10 +5696,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee try { if ( ( node.getName().length() > 0 ) || ( node.getNodeData().isHasTaxonomy() && !TreePanelUtil.isTaxonomyEmpty( node.getNodeData() - .getTaxonomy() ) ) - || ( node.getNodeData().isHasSequence() && !TreePanelUtil.isSequenceEmpty( node.getNodeData() - .getSequence() ) ) || ( node.getNodeData().isHasDate() ) - || ( node.getNodeData().isHasDistribution() ) || node.getBranchData().isHasConfidences() ) { + .getTaxonomy() ) ) + || ( node.getNodeData().isHasSequence() && !TreePanelUtil.isSequenceEmpty( node.getNodeData() + .getSequence() ) ) || ( node.getNodeData().isHasDate() ) + || ( node.getNodeData().isHasDistribution() ) || node.getBranchData().isHasConfidences() ) { _popup_buffer.setLength( 0 ); short lines = 0; if ( node.getName().length() > 0 ) { @@ -5763,14 +5863,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _popup_buffer.append( "] " ); } _popup_buffer - .append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( confidence.getValue(), - getOptions() - .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) ); + .append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( confidence.getValue(), + getOptions() + .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) ); if ( confidence.getStandardDeviation() != Confidence.CONFIDENCE_DEFAULT_VALUE ) { _popup_buffer.append( " (sd=" ); _popup_buffer.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( confidence - .getStandardDeviation(), getOptions() - .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) ); + .getStandardDeviation(), getOptions() + .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) ); _popup_buffer.append( ")" ); } } @@ -5791,7 +5891,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( _popup_buffer.length() > 0 ) { if ( !getConfiguration().isUseNativeUI() ) { _rollover_popup - .setBorder( BorderFactory.createLineBorder( getTreeColorSet().getBranchColor() ) ); + .setBorder( BorderFactory.createLineBorder( getTreeColorSet().getBranchColor() ) ); _rollover_popup.setBackground( getTreeColorSet().getBackgroundColor() ); if ( isInFoundNodes0( node ) && !isInFoundNodes1( node ) ) { _rollover_popup.setForeground( getTreeColorSet().getFoundColor0() ); @@ -5814,7 +5914,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _rollover_popup, e.getLocationOnScreen().x + 10, e.getLocationOnScreen().y - - ( lines * 20 ) ); + - ( lines * 20 ) ); _node_desc_popup.show(); } } @@ -5900,7 +6000,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( getMainPanel().getMainFrame() == null ) { // Must be "E" applet version. ( ( ArchaeopteryxE ) ( ( MainPanelApplets ) getMainPanel() ).getApplet() ) - .setSelectedTypeInTypeMenu( getPhylogenyGraphicsType() ); + .setSelectedTypeInTypeMenu( getPhylogenyGraphicsType() ); } else { getMainPanel().getMainFrame().setSelectedTypeInTypeMenu( getPhylogenyGraphicsType() );