+ else if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) {
+ if ( getControlPanel().getDynamicallyHideData() != null ) {
+ getControlPanel().setDynamicHidingIsOn( false );
+ }
+ final double angle = getStartingAngle();
+ final boolean radial_labels = getOptions().getNodeLabelDirection() == NODE_LABEL_DIRECTION.RADIAL;
+ _dynamic_hiding_factor = 0;
+ if ( getControlPanel().isDynamicallyHideData() ) {
+ _dynamic_hiding_factor = ( int ) ( ( getFontMetricsForLargeDefaultFont().getHeight() * 1.5
+ * getPhylogeny().getNumberOfExternalNodes() ) / ( TWO_PI * 10 ) );
+ }
+ if ( getControlPanel().getDynamicallyHideData() != null ) {
+ if ( _dynamic_hiding_factor > 1 ) {
+ getControlPanel().setDynamicHidingIsOn( true );
+ }
+ else {
+ getControlPanel().setDynamicHidingIsOn( false );
+ }
+ }
+ paintUnrooted( _phylogeny.getRoot(),
+ angle,
+ ( float ) ( angle + ( 2 * Math.PI ) ),
+ radial_labels,
+ g,
+ to_pdf,
+ to_graphics_file );
+ if ( getOptions().isShowScale() ) {
+ if ( !( to_graphics_file || to_pdf ) ) {
+ paintScale( g,
+ getVisibleRect().x,
+ getVisibleRect().y + getVisibleRect().height,
+ to_pdf,
+ to_graphics_file );
+ }
+ else {
+ paintScale( g, graphics_file_x, graphics_file_y + graphics_file_height, to_pdf, to_graphics_file );
+ }
+ }
+ if ( getOptions().isShowOverview() && isOvOn() && !to_graphics_file && !to_pdf ) {
+ g.setColor( getTreeColorSet().getOvColor() );
+ paintUnrootedLite( _phylogeny.getRoot(),
+ angle,
+ angle + ( 2 * Math.PI ),
+ g,
+ ( getUrtFactorOv() / ( getVisibleRect().width / getOvMaxWidth() ) ) );
+ paintOvRectangle( g );
+ }
+ }
+ else if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.CIRCULAR ) {
+ final int radius = ( int ) ( ( Math.min( getPreferredSize().getWidth(), getPreferredSize().getHeight() )
+ / 2 ) - ( MOVE + getLongestExtNodeInfo() ) );
+ final int d = radius + MOVE + getLongestExtNodeInfo();
+ _dynamic_hiding_factor = 0;
+ if ( getControlPanel().isDynamicallyHideData() && ( radius > 0 ) ) {
+ _dynamic_hiding_factor = ( int ) ( ( getFontMetricsForLargeDefaultFont().getHeight() * 1.5
+ * getPhylogeny().getNumberOfExternalNodes() ) / ( TWO_PI * radius ) );
+ }
+ if ( getControlPanel().getDynamicallyHideData() != null ) {
+ if ( _dynamic_hiding_factor > 1 ) {
+ getControlPanel().setDynamicHidingIsOn( true );
+ }
+ else {
+ getControlPanel().setDynamicHidingIsOn( false );
+ }
+ }
+ paintCircular( _phylogeny, getStartingAngle(), d, d, radius > 0 ? radius : 0, g, to_pdf, to_graphics_file );
+ if ( getOptions().isShowOverview() && isOvOn() && !to_graphics_file && !to_pdf ) {
+ final int radius_ov = ( int ) ( getOvMaxHeight() < getOvMaxWidth() ? getOvMaxHeight() / 2
+ : getOvMaxWidth() / 2 );
+ double x_scale = 1.0;
+ double y_scale = 1.0;
+ int x_pos = getVisibleRect().x + getOvXPosition();
+ int y_pos = getVisibleRect().y + getOvYPosition();
+ if ( getWidth() > getHeight() ) {
+ x_scale = ( double ) getHeight() / getWidth();
+ x_pos = ForesterUtil.roundToInt( x_pos / x_scale );
+ }
+ else {
+ y_scale = ( double ) getWidth() / getHeight();
+ y_pos = ForesterUtil.roundToInt( y_pos / y_scale );
+ }
+ _at = g.getTransform();
+ g.scale( x_scale, y_scale );
+ paintCircularLite( _phylogeny,
+ getStartingAngle(),
+ x_pos + radius_ov,
+ y_pos + radius_ov,
+ ( int ) ( radius_ov - ( getLongestExtNodeInfo()
+ / ( getVisibleRect().width / getOvRectangle().getWidth() ) ) ),
+ g );
+ g.setTransform( _at );
+ paintOvRectangle( g );
+ }
+ }
+ }
+
+ final void recalculateMaxDistanceToRoot() {
+ _max_distance_to_root = PhylogenyMethods.calculateMaxDistanceToRoot( getPhylogeny() );
+ if ( getPhylogeny().getRoot().getDistanceToParent() > 0 ) {
+ _max_distance_to_root += getPhylogeny().getRoot().getDistanceToParent();
+ }
+ }
+
+ /**
+ * Remove all edit-node frames
+ */
+ final void removeAllEditNodeJFrames() {
+ for( int i = 0; i <= ( TreePanel.MAX_NODE_FRAMES - 1 ); i++ ) {
+ if ( _node_frames[ i ] != null ) {
+ _node_frames[ i ].dispose();
+ _node_frames[ i ] = null;
+ }
+ }
+ _node_frame_index = 0;
+ }
+
+ /**
+ * Remove a node-edit frame.
+ */
+ final void removeEditNodeFrame( final int i ) {
+ _node_frame_index--;
+ _node_frames[ i ] = null;
+ if ( i < _node_frame_index ) {
+ for( int j = 0; j < ( _node_frame_index - 1 ); j++ ) {
+ _node_frames[ j ] = _node_frames[ j + 1 ];
+ }
+ _node_frames[ _node_frame_index ] = null;
+ }
+ }
+
+ final void reRoot( final PhylogenyNode node ) {
+ if ( !getPhylogeny().isRerootable() ) {
+ JOptionPane.showMessageDialog( this,
+ "This is not rerootable",
+ "Not rerootable",
+ JOptionPane.WARNING_MESSAGE );
+ return;
+ }
+ if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) {
+ JOptionPane.showMessageDialog( this,
+ "Cannot reroot in unrooted display type",
+ "Attempt to reroot tree in unrooted display",
+ JOptionPane.WARNING_MESSAGE );
+ return;
+ }
+ getPhylogeny().reRoot( node );
+ getPhylogeny().recalculateNumberOfExternalDescendants( true );
+ resetNodeIdToDistToLeafMap();
+ setNodeInPreorderToNull();
+ resetPreferredSize();
+ getMainPanel().adjustJScrollPane();
+ setEdited( true );
+ repaint();
+ if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.CIRCULAR ) {
+ getControlPanel().showWhole();
+ }
+ }
+
+ final void resetNodeIdToDistToLeafMap() {
+ _nodeid_dist_to_leaf = new HashMap<Long, Short>();
+ }
+
+ final void resetPreferredSize() {
+ if ( ( getPhylogeny() == null ) || getPhylogeny().isEmpty() ) {
+ return;
+ }
+ int x = 0;
+ int y = 0;
+ y = TreePanel.MOVE
+ + ForesterUtil.roundToInt( getYdistance() * getPhylogeny().getRoot().getNumberOfExternalNodes() * 2 );
+ if ( getControlPanel().isDrawPhylogram() ) {
+ x = TreePanel.MOVE + getLongestExtNodeInfo()
+ + ForesterUtil.roundToInt( ( getXcorrectionFactor()
+ * getPhylogeny().calculateHeight( !_options.isCollapsedWithAverageHeigh() ) )
+ + getXdistance() );
+ }
+ else {
+ if ( !isNonLinedUpCladogram() ) {
+ x = TreePanel.MOVE + getLongestExtNodeInfo() + ForesterUtil
+ .roundToInt( getXdistance() * ( getPhylogeny().getRoot().getNumberOfExternalNodes() + 2 ) );
+ }
+ else {
+ x = TreePanel.MOVE + getLongestExtNodeInfo() + ForesterUtil
+ .roundToInt( getXdistance() * ( PhylogenyMethods.calculateMaxDepth( getPhylogeny() ) + 1 ) );
+ }
+ }
+ setPreferredSize( new Dimension( x, y ) );
+ }
+
+ final void selectNode( final PhylogenyNode node ) {
+ if ( ( getFoundNodes0() != null ) && getFoundNodes0().contains( node.getId() ) ) {
+ getFoundNodes0().remove( node.getId() );
+ getControlPanel().setSearchFoundCountsOnLabel0( getFoundNodes0().size() );
+ if ( getFoundNodes0().size() < 1 ) {
+ getControlPanel().searchReset0();
+ }
+ }
+ else {
+ getControlPanel().getSearchFoundCountsLabel0().setVisible( true );
+ getControlPanel().getSearchResetButton0().setEnabled( true );
+ getControlPanel().getSearchResetButton0().setVisible( true );
+ if ( getFoundNodes0() == null ) {
+ setFoundNodes0( new HashSet<Long>() );
+ }
+ getFoundNodes0().add( node.getId() );
+ getControlPanel().setSearchFoundCountsOnLabel0( getFoundNodes0().size() );
+ }
+ }
+
+ final void setArrowCursor() {
+ setCursor( ARROW_CURSOR );
+ repaint();
+ }
+
+ final void setControlPanel( final ControlPanel atv_control ) {
+ _control_panel = atv_control;
+ }
+
+ void setCurrentExternalNodesDataBuffer( final StringBuilder sb ) {
+ increaseCurrentExternalNodesDataBufferChangeCounter();
+ _current_external_nodes_data_buffer = sb;
+ }
+
+ public final void setFoundNodes0( final Set<Long> found_nodes ) {
+ _found_nodes_0 = found_nodes;
+ }
+
+ public final void setFoundNodes1( final Set<Long> found_nodes ) {
+ _found_nodes_1 = found_nodes;
+ }
+
+ final void setInOvRect( final boolean in_ov_rect ) {
+ _in_ov_rect = in_ov_rect;
+ }
+
+ final void setLargeFonts() {
+ getTreeFontSet().largeFonts();
+ }
+
+ final void setLastMouseDragPointX( final float x ) {
+ _last_drag_point_x = x;
+ }
+
+ final void setLastMouseDragPointY( final float y ) {
+ _last_drag_point_y = y;
+ }
+
+ final void setMediumFonts() {
+ getTreeFontSet().mediumFonts();
+ }
+
+ final void setNodeInPreorderToNull() {
+ _nodes_in_preorder = null;
+ }
+
+ final void setOvOn( final boolean ov_on ) {
+ _ov_on = ov_on;
+ }
+
+ final void setPhylogenyGraphicsType( final PHYLOGENY_GRAPHICS_TYPE graphics_type ) {
+ _graphics_type = graphics_type;
+ setTextAntialias();
+ }
+
+ final void setSmallFonts() {
+ getTreeFontSet().smallFonts();
+ }
+
+ final void setStartingAngle( final double starting_angle ) {
+ _urt_starting_angle = starting_angle;
+ }
+
+ void setStatisticsForExpressionValues( final DescriptiveStatistics statistics_for_expression_values ) {
+ _statistics_for_vector_data = statistics_for_expression_values;
+ }
+
+ final void setSuperTinyFonts() {
+ getTreeFontSet().superTinyFonts();
+ }
+
+ final void setTextAntialias() {
+ if ( ( _phylogeny != null ) && !_phylogeny.isEmpty() ) {
+ if ( _phylogeny.getNumberOfExternalNodes() <= LIMIT_FOR_HQ_RENDERING ) {
+ _rendering_hints.put( RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY );
+ }
+ else {
+ _rendering_hints.put( RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED );
+ }
+ }
+ if ( getMainPanel().getOptions().isAntialiasScreen() ) {
+ _rendering_hints.put( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
+ // try {
+ _rendering_hints.put( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB );
+ // }
+ // catch ( final Throwable e ) {
+ // _rendering_hints.put( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON );
+ //}
+ }
+ else {
+ _rendering_hints.put( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF );
+ _rendering_hints.put( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF );
+ }
+ }
+
+ final void setTinyFonts() {
+ getTreeFontSet().tinyFonts();
+ }
+
+ public final void setTreeFile( final File treefile ) {
+ _treefile = treefile;
+ }
+
+ final void setXcorrectionFactor( final float f ) {
+ _x_correction_factor = f;
+ }
+
+ final void setXdistance( final float x ) {
+ _x_distance = x;
+ }
+
+ final void setYdistance( final float y ) {
+ _y_distance = y;
+ }
+
+ final void sortDescendants( final PhylogenyNode node ) {
+ if ( !node.isExternal() ) {
+ 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();
+ _phylogeny.externalNodesHaveChanged();
+ _phylogeny.clearHashIdToNodeMap();
+ _phylogeny.recalculateNumberOfExternalDescendants( true );
+ resetNodeIdToDistToLeafMap();
+ setEdited( true );
+ }
+ repaint();
+ }
+
+ final void subTree( final PhylogenyNode node ) {
+ if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) {
+ JOptionPane.showMessageDialog( this,
+ "Cannot get a sub/super tree in unrooted display",
+ "Attempt to get sub/super tree in unrooted display",
+ JOptionPane.WARNING_MESSAGE );
+ return;
+ }
+ if ( node.isExternal() ) {
+ JOptionPane.showMessageDialog( this,
+ "Cannot get a subtree of a external node",
+ "Attempt to get subtree of external node",
+ JOptionPane.WARNING_MESSAGE );
+ return;
+ }
+ if ( node.isRoot() && !isCurrentTreeIsSubtree() ) {
+ JOptionPane.showMessageDialog( this,
+ "Cannot get a subtree of the root node",
+ "Attempt to get subtree of root node",
+ JOptionPane.WARNING_MESSAGE );
+ return;
+ }
+ setNodeInPreorderToNull();
+ if ( !node.isExternal() && !node.isRoot() && ( _subtree_index <= ( TreePanel.MAX_SUBTREES - 1 ) ) ) {
+ _sub_phylogenies[ _subtree_index ] = _phylogeny;
+ _sub_phylogenies_temp_roots[ _subtree_index ] = node;
+ ++_subtree_index;
+ _phylogeny = TreePanelUtil.subTree( node, _phylogeny );
+ if ( _phylogeny.getRoot().isCollapse() ) {
+ _phylogeny.getRoot().setCollapse( false );
+ }
+ _phylogeny.externalNodesHaveChanged();
+ _phylogeny.clearHashIdToNodeMap();
+ _phylogeny.recalculateNumberOfExternalDescendants( true );
+ updateSubSuperTreeButton();
+ getMainPanel().getControlPanel().search0();
+ getMainPanel().getControlPanel().search1();
+ resetRankCollapseRankValue();
+ resetDepthCollapseDepthValue();
+ getMainPanel().getControlPanel().updateDomainStructureEvaluethresholdDisplay();
+ getMainPanel().getControlPanel().updateDepthCollapseDepthDisplay();
+ getMainPanel().getControlPanel().updateRankCollapseRankDisplay();
+ }
+ else if ( node.isRoot() && isCurrentTreeIsSubtree() ) {
+ superTree();
+ }
+ _main_panel.getControlPanel().showWhole();
+ repaint();
+ }
+
+ final void superTree() {
+ setNodeInPreorderToNull();
+ final PhylogenyNode temp_root = _sub_phylogenies_temp_roots[ _subtree_index - 1 ];
+ for( final PhylogenyNode n : temp_root.getDescendants() ) {
+ n.setParent( temp_root );
+ }
+ _sub_phylogenies[ _subtree_index ] = null;
+ _sub_phylogenies_temp_roots[ _subtree_index ] = null;
+ _phylogeny = _sub_phylogenies[ --_subtree_index ];
+ _phylogeny.externalNodesHaveChanged();
+ _phylogeny.clearHashIdToNodeMap();
+ _phylogeny.recalculateNumberOfExternalDescendants( true );
+ getMainPanel().getControlPanel().search0();
+ getMainPanel().getControlPanel().search1();
+ resetRankCollapseRankValue();
+ resetDepthCollapseDepthValue();
+ getMainPanel().getControlPanel().updateDomainStructureEvaluethresholdDisplay();
+ getMainPanel().getControlPanel().updateDepthCollapseDepthDisplay();
+ getMainPanel().getControlPanel().updateRankCollapseRankDisplay();
+ updateSubSuperTreeButton();
+ }
+
+ final void orderSubtree( final PhylogenyNode node ) {
+ if ( node.isExternal() ) {
+ return;
+ }
+ 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;