X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FTreePanel.java;h=e857426f49a3288a47c79bbeaad3f48fb20657a3;hb=ecfa899d355303acc65e93601e00922aad822883;hp=6afa7a7c51dd1dac30d6daa6b6710740d039b4bd;hpb=f4fb23cb07075ba87d6b812c3b6af92bb438dc59;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index 6afa7a7..e857426 100644 --- a/forester/java/src/org/forester/archaeopteryx/TreePanel.java +++ b/forester/java/src/org/forester/archaeopteryx/TreePanel.java @@ -100,6 +100,7 @@ import org.forester.archaeopteryx.tools.ImageLoader; import org.forester.io.parsers.phyloxml.PhyloXmlUtil; import org.forester.phylogeny.Phylogeny; import org.forester.phylogeny.PhylogenyMethods; +import org.forester.phylogeny.PhylogenyMethods.DESCENDANT_SORT_PRIORITY; import org.forester.phylogeny.PhylogenyNode; import org.forester.phylogeny.data.Annotation; import org.forester.phylogeny.data.BranchColor; @@ -109,6 +110,7 @@ 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.PhylogenyData; +import org.forester.phylogeny.data.PhylogenyDataUtil; import org.forester.phylogeny.data.PropertiesMap; import org.forester.phylogeny.data.Property; import org.forester.phylogeny.data.Sequence; @@ -344,10 +346,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final public void actionPerformed( final ActionEvent e ) { - int index; boolean done = false; final JMenuItem node_popup_menu_item = ( JMenuItem ) e.getSource(); - for( index = 0; ( index < _node_popup_menu_items.length ) && !done; index++ ) { + for( int index = 0; ( index < _node_popup_menu_items.length ) && !done; index++ ) { // NOTE: index corresponds to the indices of click-to options // in the control panel. if ( node_popup_menu_item == _node_popup_menu_items[ index ] ) { @@ -408,7 +409,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else { phy.addAsChild( node ); } - _nodes_in_preorder = null; + setNodeInPreorderToNull(); _phylogeny.externalNodesHaveChanged(); _phylogeny.hashIDs(); _phylogeny.recalculateNumberOfExternalDescendants( true ); @@ -463,25 +464,37 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return; } if ( node.getNodeData().isHasSequence() ) { - String name = ""; - if ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getName() ) ) { - name = node.getNodeData().getSequence().getName(); - } - else if ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getSymbol() ) ) { - name = node.getNodeData().getSequence().getSymbol(); + final String query = Blast.obtainQueryForBlast( node ); + boolean nucleotide = false; + if ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getType() ) ) { + if ( !node.getNodeData().getSequence().getType().toLowerCase().equals( PhyloXmlUtil.SEQ_TYPE_PROTEIN ) ) { + nucleotide = true; + } } - else if ( node.getNodeData().getSequence().getAccession() != null ) { - name = node.getNodeData().getSequence().getAccession().getValue(); + else if ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) { + nucleotide = !ForesterUtil.seqIsLikelyToBeAa( node.getNodeData().getSequence().getMolecularSequence() ); } - if ( !ForesterUtil.isEmpty( name ) ) { + if ( !ForesterUtil.isEmpty( query ) ) { + JApplet applet = null; + if ( isApplet() ) { + applet = obtainApplet(); + } try { - System.out.println( "trying: " + name ); - final Blast s = new Blast(); - s.go( name ); + Blast.openNcbiBlastWeb( query, nucleotide, applet, this ); } catch ( final Exception e ) { e.printStackTrace(); } + if ( Constants.ALLOW_DDBJ_BLAST ) { + try { + System.out.println( "trying: " + query ); + final Blast s = new Blast(); + s.ddbjBlast( query ); + } + catch ( final Exception e ) { + e.printStackTrace(); + } + } } } } @@ -531,7 +544,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( ( _phylogeny == null ) || _phylogeny.isEmpty() ) { return; } - int longest = 20; + int max_length = ForesterUtil.roundToInt( ( getSize().getWidth() - MOVE ) + * Constants.EXT_NODE_INFO_LENGTH_MAX_RATIO ); + if ( max_length < 40 ) { + max_length = 40; + } + int longest = 30; for( final PhylogenyNode node : _phylogeny.getExternalNodes() ) { int sum = 0; if ( node.isCollapse() ) { @@ -561,6 +579,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee .asSimpleText() + " " ); } + if ( getControlPanel().isShowDomainArchitectures() + && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { + sum += ( ( RenderableDomainArchitecture ) node.getNodeData().getSequence().getDomainArchitecture() ) + .getRenderingSize().getWidth(); + } } if ( node.getNodeData().isHasTaxonomy() ) { final Taxonomy tax = node.getNodeData().getTaxonomy(); @@ -582,21 +605,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee sum += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getBinaryCharacters() .getGainedCharactersAsStringBuffer().toString() ); } - if ( getControlPanel().isShowDomainArchitectures() && node.getNodeData().isHasSequence() - && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { - sum += ( ( RenderableDomainArchitecture ) node.getNodeData().getSequence().getDomainArchitecture() ) - .getRenderingSize().getWidth(); - } - if ( sum >= Constants.EXT_NODE_INFO_LENGTH_MAX ) { - setLongestExtNodeInfo( Constants.EXT_NODE_INFO_LENGTH_MAX ); + if ( sum >= max_length ) { + setLongestExtNodeInfo( max_length ); return; } if ( sum > longest ) { longest = sum; } } - if ( longest >= Constants.EXT_NODE_INFO_LENGTH_MAX ) { - setLongestExtNodeInfo( Constants.EXT_NODE_INFO_LENGTH_MAX ); + if ( longest >= max_length ) { + setLongestExtNodeInfo( max_length ); } else { setLongestExtNodeInfo( longest ); @@ -694,11 +712,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( !node.isExternal() && !node.isRoot() ) { final boolean collapse = !node.isCollapse(); AptxUtil.collapseSubtree( node, collapse ); - updateSetOfCollapsedExternalNodes( _phylogeny ); + updateSetOfCollapsedExternalNodes(); _phylogeny.recalculateNumberOfExternalDescendants( true ); resetNodeIdToDistToLeafMap(); calculateLongestExtNodeInfo(); - _nodes_in_preorder = null; + setNodeInPreorderToNull(); + _control_panel.displayedPhylogenyMightHaveChanged( true ); resetPreferredSize(); updateOvSizes(); _main_panel.adjustJScrollPane(); @@ -712,11 +731,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } setWaitCursor(); AptxUtil.collapseSpeciesSpecificSubtrees( _phylogeny ); - updateSetOfCollapsedExternalNodes( _phylogeny ); + updateSetOfCollapsedExternalNodes(); _phylogeny.recalculateNumberOfExternalDescendants( true ); resetNodeIdToDistToLeafMap(); calculateLongestExtNodeInfo(); - _nodes_in_preorder = null; + setNodeInPreorderToNull(); resetPreferredSize(); _main_panel.adjustJScrollPane(); setArrowCursor(); @@ -827,7 +846,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee errorMessageNoCutCopyPasteInUnrootedDisplay(); return; } - _nodes_in_preorder = null; + setNodeInPreorderToNull(); setCutOrCopiedTree( _phylogeny.copy( node ) ); final List nodes = PhylogenyMethods.getAllDescendants( node ); final Set node_ids = new HashSet( nodes.size() ); @@ -859,7 +878,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( r != JOptionPane.OK_OPTION ) { return; } - _nodes_in_preorder = null; + setNodeInPreorderToNull(); setCopiedAndPastedNodes( null ); setCutOrCopiedTree( _phylogeny.copy( node ) ); _phylogeny.deleteSubtree( node, true ); @@ -914,7 +933,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee null, options, options[ 2 ] ); - _nodes_in_preorder = null; + setNodeInPreorderToNull(); boolean node_only = true; if ( r == 1 ) { node_only = false; @@ -1315,6 +1334,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee case EDIT_NODE_DATA: showNodeEditFrame( node ); break; + case SORT_DESCENDENTS: + sortDescendants( node ); + break; default: throw new IllegalArgumentException( "unknown action: " + action ); } @@ -1435,10 +1457,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final private boolean isCanBlast( final PhylogenyNode node ) { - return ( node.getNodeData().isHasSequence() && ( ( ( node.getNodeData().getSequence().getAccession() != null ) && !ForesterUtil - .isEmpty( node.getNodeData().getSequence().getAccession().getValue() ) ) - || !ForesterUtil.isEmpty( node.getNodeData().getSequence().getName() ) || !ForesterUtil.isEmpty( node - .getNodeData().getSequence().getSymbol() ) ) ); + return ( node.getNodeData().isHasSequence() + && ( ( ( node.getNodeData().getSequence().getAccession() != null ) && !ForesterUtil.isEmpty( node + .getNodeData().getSequence().getAccession().getValue() ) ) + || !ForesterUtil.isEmpty( node.getNodeData().getSequence().getName() ) || !ForesterUtil + .isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) && Blast + .isContainsQueryForBlast( node ) ); } final boolean isCanCollapse() { @@ -1737,9 +1761,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _node_popup_menu_items[ i ].setEnabled( isCanOpenTaxWeb( node ) ); } else if ( title.equals( Configuration.clickto_options[ Configuration.blast ][ 0 ] ) ) { - if ( Constants.__RELEASE || Constants.__SNAPSHOT_RELEASE ) { - continue; - } _node_popup_menu_items[ i ].setEnabled( isCanBlast( node ) ); } else if ( title.equals( Configuration.clickto_options[ Configuration.delete_subtree_or_node ][ 0 ] ) ) { @@ -1780,7 +1801,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _node_popup_menu_items[ i ].setEnabled( isCanReroot() ); } else if ( title.equals( Configuration.clickto_options[ Configuration.collapse_uncollapse ][ 0 ] ) ) { - _node_popup_menu_items[ i ].setEnabled( isCanCollapse() ); + _node_popup_menu_items[ i ].setEnabled( ( isCanCollapse() && !node.isExternal() ) ); } else if ( title.equals( Configuration.clickto_options[ Configuration.color_subtree ][ 0 ] ) ) { _node_popup_menu_items[ i ].setEnabled( isCanColorSubtree() ); @@ -1788,6 +1809,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else if ( title.equals( Configuration.clickto_options[ Configuration.subtree ][ 0 ] ) ) { _node_popup_menu_items[ i ].setEnabled( isCanSubtree( node ) ); } + else if ( title.equals( Configuration.clickto_options[ Configuration.swap ][ 0 ] ) ) { + _node_popup_menu_items[ i ].setEnabled( node.getNumberOfDescendants() == 2 ); + } + else if ( title.equals( Configuration.clickto_options[ Configuration.sort_descendents ][ 0 ] ) ) { + _node_popup_menu_items[ i ].setEnabled( node.getNumberOfDescendants() > 1 ); + } _node_popup_menu_items[ i ].addActionListener( this ); _node_popup_menu.add( _node_popup_menu_items[ i ] ); } @@ -1804,7 +1831,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee JOptionPane.WARNING_MESSAGE ); return; } - _nodes_in_preorder = null; + setNodeInPreorderToNull(); setWaitCursor(); PhylogenyMethods.midpointRoot( _phylogeny ); resetNodeIdToDistToLeafMap(); @@ -2510,17 +2537,21 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee paintNodeBox( _root.getXcoord(), _root.getYcoord(), _root, g, to_pdf, to_graphics_file, isInFoundNodes( _root ) ); } - private void updateSetOfCollapsedExternalNodes( final Phylogeny phy ) { + void updateSetOfCollapsedExternalNodes() { + final Phylogeny phy = getPhylogeny(); _collapsed_external_nodeid_set.clear(); - E: for( final PhylogenyNodeIterator it = phy.iteratorExternalForward(); it.hasNext(); ) { - final PhylogenyNode ext_node = it.next(); - PhylogenyNode n = ext_node; - while ( !n.isRoot() ) { - if ( n.isCollapse() ) { - _collapsed_external_nodeid_set.add( ext_node.getId() ); - continue E; + if ( phy != null ) { + E: for( final PhylogenyNodeIterator it = phy.iteratorExternalForward(); it.hasNext(); ) { + final PhylogenyNode ext_node = it.next(); + PhylogenyNode n = ext_node; + while ( !n.isRoot() ) { + if ( n.isCollapse() ) { + _collapsed_external_nodeid_set.add( ext_node.getId() ); + ext_node.setCollapse( true ); + continue E; + } + n = n.getParent(); } - n = n.getParent(); } } } @@ -2704,36 +2735,45 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final PhylogenyNode node, final boolean to_pdf, final boolean to_graphics_file ) { - String conf_str = ""; final List confidences = node.getBranchData().getConfidences(); - if ( confidences.size() == 1 ) { - final double value = node.getBranchData().getConfidence( 0 ).getValue(); - if ( ( value == Confidence.CONFIDENCE_DEFAULT_VALUE ) || ( value < getOptions().getMinConfidenceValue() ) ) { - return; - } - conf_str = FORMATTER_CONFIDENCE.format( value ); - } - else if ( confidences.size() > 1 ) { - boolean one_ok = false; - boolean not_first = false; - 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() ) { - one_ok = true; - } - if ( not_first ) { - sb.append( "/" ); - } - else { - not_first = true; + // if ( confidences.size() == 1 ) { + // final double value = node.getBranchData().getConfidence( 0 ).getValue(); + // if ( ( value == Confidence.CONFIDENCE_DEFAULT_VALUE ) || ( value < getOptions().getMinConfidenceValue() ) ) { + // return; + // } + // conf_str = FORMATTER_CONFIDENCE.format( value ); + // } + // else if ( confidences.size() > 1 ) { + boolean one_ok = false; + boolean not_first = false; + Collections.sort( confidences ); + final StringBuilder sb = new StringBuilder(); + String conf_str = ""; + for( final Confidence confidence : confidences ) { + final double value = confidence.getValue(); + if ( value != Confidence.CONFIDENCE_DEFAULT_VALUE ) { + if ( value >= getOptions().getMinConfidenceValue() ) { + one_ok = true; + } + 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( ")" ); } - sb.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( value, getOptions() - .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) ); } } + //} if ( one_ok ) { conf_str = sb.toString(); } @@ -2927,7 +2967,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( getOptions().isShowBranchLengthValues() && ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) ) - && ( !node.isRoot() ) && ( node.getDistanceToParent() != PhylogenyNode.DISTANCE_DEFAULT ) ) { + && ( !node.isRoot() ) && ( node.getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) ) { paintBranchLength( g, node, to_pdf, to_graphics_file ); } if ( !getControlPanel().isShowInternalData() && !node.isExternal() && !node.isCollapse() ) { @@ -3434,7 +3474,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee ++_external_node_index; } // Confidence values - if ( getControlPanel().isShowBootstrapValues() + if ( getControlPanel().isShowConfidenceValues() && !node.isExternal() && !node.isRoot() && ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) @@ -3537,28 +3577,34 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } catch ( final ClassCastException cce ) { cce.printStackTrace(); - return; } - rds.setRenderingHeight( 6 ); - int x = 0; - if ( getControlPanel().isShowTaxonomyCode() && ( PhylogenyMethods.getSpecies( node ).length() > 0 ) ) { - x += getTreeFontSet()._fm_large_italic.stringWidth( PhylogenyMethods.getSpecies( node ) + " " ); - } - if ( getControlPanel().isShowGeneNames() ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getName() + " " ); - } - if ( getControlPanel().isShowGeneSymbols() ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getSymbol() + " " ); - } - if ( getControlPanel().isShowSequenceAcc() ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getAccession() - .toString() - + " " ); - } - if ( getControlPanel().isShowNodeNames() && ( node.getName().length() > 0 ) ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getName() + " " ); + if ( rds != null ) { + rds.setRenderingHeight( 6 ); + int x = 0; + if ( getControlPanel().isShowTaxonomyCode() + && ( !ForesterUtil.isEmpty( PhylogenyMethods.getSpecies( node ) ) ) ) { + x += getTreeFontSet()._fm_large_italic.stringWidth( PhylogenyMethods.getSpecies( node ) + " " ); + } + if ( getControlPanel().isShowGeneNames() + && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getName() ) ) ) { + x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getName() + " " ); + } + if ( getControlPanel().isShowGeneSymbols() + && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getSymbol() ) ) ) { + x += getTreeFontSet()._fm_large + .stringWidth( node.getNodeData().getSequence().getSymbol() + " " ); + } + if ( getControlPanel().isShowSequenceAcc() + && ( node.getNodeData().getSequence().getAccession() != null ) ) { + x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getAccession() + .toString() + + " " ); + } + if ( getControlPanel().isShowNodeNames() && ( node.getName().length() > 0 ) ) { + x += getTreeFontSet()._fm_large.stringWidth( node.getName() + " " ); + } + rds.render( node.getXcoord() + x, node.getYcoord() - 3, g, this, to_pdf ); } - rds.render( node.getXcoord() + x, node.getYcoord() - 3, g, this, to_pdf ); } } ////////////// @@ -3567,18 +3613,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final RenderableVector rv = RenderableVector.createInstance( node.getNodeData().getVector(), getStatisticsForExpressionValues(), getConfiguration() ); - int x = 0; - PhylogenyNode my_node = node; - if ( !getControlPanel().isDrawPhylogram() ) { - my_node = getPhylogeny().getFirstExternalNode(); - } - if ( getControlPanel().isShowTaxonomyCode() && ( PhylogenyMethods.getSpecies( my_node ).length() > 0 ) ) { - x += getTreeFontSet()._fm_large_italic.stringWidth( PhylogenyMethods.getSpecies( my_node ) + " " ); - } - if ( getControlPanel().isShowNodeNames() && ( my_node.getName().length() > 0 ) ) { - x += getTreeFontSet()._fm_large.stringWidth( my_node.getName() + " " ); + if ( rv != null ) { + int x = 0; + PhylogenyNode my_node = node; + if ( !getControlPanel().isDrawPhylogram() ) { + my_node = getPhylogeny().getFirstExternalNode(); + } + if ( getControlPanel().isShowTaxonomyCode() && ( PhylogenyMethods.getSpecies( my_node ).length() > 0 ) ) { + x += getTreeFontSet()._fm_large_italic.stringWidth( PhylogenyMethods.getSpecies( my_node ) + " " ); + } + if ( getControlPanel().isShowNodeNames() && ( my_node.getName().length() > 0 ) ) { + x += getTreeFontSet()._fm_large.stringWidth( my_node.getName() + " " ); + } + rv.render( my_node.getXcoord() + x, node.getYcoord() - 5, g, this, to_pdf ); } - rv.render( my_node.getXcoord() + x, node.getYcoord() - 5, g, this, to_pdf ); } ////////////// } @@ -3622,6 +3670,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final int graphics_file_height, final int graphics_file_x, final int graphics_file_y ) { + if ( ( _phylogeny == null ) || _phylogeny.isEmpty() ) { + return; + } if ( _control_panel.isShowSequenceRelations() ) { _query_sequence = _control_panel.getSelectedQuerySequence(); } @@ -4190,7 +4241,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } node_ids.add( node.getId() ); getCopiedAndPastedNodes().addAll( node_ids ); - _nodes_in_preorder = null; + setNodeInPreorderToNull(); _phylogeny.externalNodesHaveChanged(); _phylogeny.hashIDs(); _phylogeny.recalculateNumberOfExternalDescendants( true ); @@ -4266,7 +4317,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee getPhylogeny().reRoot( node ); getPhylogeny().recalculateNumberOfExternalDescendants( true ); resetNodeIdToDistToLeafMap(); - _nodes_in_preorder = null; + setNodeInPreorderToNull(); resetPreferredSize(); getMainPanel().adjustJScrollPane(); repaint(); @@ -4495,7 +4546,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } if ( getMainPanel().getOptions().isAntialiasScreen() ) { - if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR ) { + if ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR ) + && !getMainPanel().getOptions().isShowDefaultNodeShapes() + && ( ( getControlPanel() != null ) && !getControlPanel().isShowDomainArchitectures() ) ) { _rendering_hints.put( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF ); } else { @@ -4526,10 +4579,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee * an instance of a Phylogeny */ public final void setTree( final Phylogeny t ) { - _nodes_in_preorder = null; + setNodeInPreorderToNull(); _phylogeny = t; } + final void setNodeInPreorderToNull() { + _nodes_in_preorder = null; + } + final void setTreeFile( final File treefile ) { _treefile = treefile; } @@ -4737,6 +4794,13 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee .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() ) ) ); + _popup_buffer.append( ")" ); + } } } if ( node.getNodeData().isHasProperties() ) { @@ -4829,7 +4893,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee JOptionPane.WARNING_MESSAGE ); return; } - _nodes_in_preorder = null; + setNodeInPreorderToNull(); if ( !node.isExternal() && !node.isRoot() && ( _subtree_index <= ( TreePanel.MAX_SUBTREES - 1 ) ) ) { _sub_phylogenies[ _subtree_index ] = _phylogeny; _sub_phylogenies_temp_roots[ _subtree_index ] = node; @@ -4866,7 +4930,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final void superTree() { - _nodes_in_preorder = null; + setNodeInPreorderToNull(); final PhylogenyNode temp_root = _sub_phylogenies_temp_roots[ _subtree_index - 1 ]; for( final PhylogenyNode n : temp_root.getDescendants() ) { n.setParent( temp_root ); @@ -4878,9 +4942,48 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final void swap( final PhylogenyNode node ) { + if ( node.isExternal() || ( node.getNumberOfDescendants() < 2 ) ) { + return; + } + if ( node.getNumberOfDescendants() > 2 ) { + JOptionPane.showMessageDialog( this, + "Cannot swap descendants of nodes with more than 2 descendants", + "Cannot swap descendants", + JOptionPane.ERROR_MESSAGE ); + return; + } if ( !node.isExternal() ) { - _phylogeny.swapChildren( node ); - _nodes_in_preorder = null; + node.swapChildren(); + setNodeInPreorderToNull(); + _phylogeny.externalNodesHaveChanged(); + _phylogeny.hashIDs(); + _phylogeny.recalculateNumberOfExternalDescendants( true ); + resetNodeIdToDistToLeafMap(); + setEdited( true ); + } + repaint(); + } + + 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().isShowGeneNames() || getControlPanel() + .isShowGeneSymbols() ) ) { + pri = DESCENDANT_SORT_PRIORITY.SEQUENCE; + } + else if ( getControlPanel().isShowNodeNames() ) { + pri = DESCENDANT_SORT_PRIORITY.NODE_NAME; + } + } + PhylogenyMethods.sortNodeDescendents( node, pri ); + setNodeInPreorderToNull(); + _phylogeny.externalNodesHaveChanged(); + _phylogeny.hashIDs(); + _phylogeny.recalculateNumberOfExternalDescendants( true ); + resetNodeIdToDistToLeafMap(); + setEdited( true ); } repaint(); }